Implemented SLEEP opcode

This commit is contained in:
2017-01-27 14:31:13 +01:00
parent f3c115d316
commit 402286c048

6
vm.cpp
View File

@@ -79,6 +79,7 @@ enum OPS {
OP_IN, OP_IN,
OP_OUT, OP_OUT,
OP_SLEEP,
}; };
typedef void(*t_extcall)(t_stack&); typedef void(*t_extcall)(t_stack&);
@@ -99,6 +100,7 @@ t_stack vm_callstack;
unsigned short rX = 0; unsigned short rX = 0;
unsigned char rY = 0; unsigned char rY = 0;
unsigned char rZ = 0; unsigned char rZ = 0;
bool sleeping = false;
static void load_rom() { 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); } inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); }
const int vm_step() { const int vm_step() {
if (sleeping) return vm_cycles;
char val, val2; char val, val2;
switch (vm_program[vm_pc++]) { 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_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_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_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; 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) { void vm_call_interrupt(const char num) {
sleeping = false;
stack_push(vm_callstack, vm_pc); stack_push(vm_callstack, vm_pc);
stack_push(vm_callstack, rX & 255); stack_push(vm_callstack, rX & 255);
stack_push(vm_callstack, rX >> 8); stack_push(vm_callstack, rX >> 8);