diff --git a/vm.cpp b/vm.cpp index e6025ad..0c8b369 100644 --- a/vm.cpp +++ b/vm.cpp @@ -79,6 +79,7 @@ enum OPS { OP_IN, OP_OUT, + OP_SLEEP, }; typedef void(*t_extcall)(t_stack&); @@ -99,6 +100,7 @@ t_stack vm_callstack; unsigned short rX = 0; unsigned char rY = 0; unsigned char rZ = 0; +bool sleeping = false; static void load_rom() { @@ -133,6 +135,8 @@ void vm_init(const char* filename) { inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); } const int vm_step() { + if (sleeping) return vm_cycles; + char val, val2; switch (vm_program[vm_pc++]) { @@ -204,6 +208,7 @@ const int vm_step() { case OP_GEQ: stack_push(vm_datastack, stack_pop(vm_datastack) >= stack_pop(vm_datastack)); vm_cycles++; break; case OP_IN: stack_push(vm_datastack, in_ports[vm_program[vm_pc++]]()); vm_cycles++; break; case OP_OUT: out_ports[vm_program[vm_pc++]](stack_pop(vm_datastack)); vm_cycles++; break; + case OP_SLEEP: sleeping = true; vm_cycles++; break; } return vm_cycles; } @@ -221,6 +226,7 @@ void vm_register_out_port(const byte port, t_out_port callback) { } void vm_call_interrupt(const char num) { + sleeping = false; stack_push(vm_callstack, vm_pc); stack_push(vm_callstack, rX & 255); stack_push(vm_callstack, rX >> 8);