Implemented SLEEP opcode
This commit is contained in:
6
vm.cpp
6
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);
|
||||
|
||||
Reference in New Issue
Block a user