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