-void dcpu16_reset(struct dcpu16 *d) {
- if (!d) return;
-
- d->cycle = 0;
- memset(d->reg, 0, sizeof d->reg);
- d->pc = 0;
- d->sp = 0;
- d->ex = 0;
- d->ia = 0;
- d->skip_ = 0;
- memset(d->ram, 0, sizeof d->ram);
-
- acct_event_(d, DCPU16_ACCT_EV_RESET, 0);
+void dcpu16_reset(struct dcpu16 *vm) {
+ size_t i;
+
+ if (!vm)
+ return;
+
+ TRACE("%s>> reset", __func__);
+
+ vm->skip_ = 0;
+ vm->interrupts_deferred_ = 0;
+ vm->on_fire_ = 0;
+ memset(vm->interrupts_, 0, sizeof vm->interrupts_);
+ vm->interrupts_head_ = 0;
+ vm->interrupts_tail_ = 0;
+
+ /* signal attached hardware */
+ for (i = 0; i < vm->hw_table_entries_; i++) {
+ if (vm->hw_table_[i].reset)
+ vm->hw_table_[i].reset(vm, vm->hw_table_[i].data);
+ }
+
+ memset(vm->reg, 0, sizeof vm->reg);
+ memset(vm->ram, 0, sizeof vm->ram);
+ vm->cycle = 0;
+
+ acct_event_(vm, DCPU16_ACCT_EV_RESET, 0);