From b12be2494dff690ac974a46b3be903a56005b422 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 25 Jan 2017 18:42:49 +0100 Subject: [PATCH] JSR and RET now save and restore registers --- vm.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vm.cpp b/vm.cpp index 81c2d77..e4e81ae 100644 --- a/vm.cpp +++ b/vm.cpp @@ -112,8 +112,8 @@ void vm_step() { case OP_JMP: vm_pc = WORD(); vm_cycles++; break; case OP_JNT: if (stack_pop(vm_datastack) == 0) { vm_pc = WORD(); } vm_cycles++; break; case OP_JTR: if (stack_pop(vm_datastack) != 0) { vm_pc = WORD(); } vm_cycles++; break; - case OP_JSR: stack_push(vm_callstack, vm_pc+2); vm_pc = WORD(); vm_cycles++; break; - case OP_RET: vm_pc = stack_pop(vm_callstack); vm_cycles++; break; + case OP_JSR: stack_push(vm_callstack, vm_pc + 2); stack_push(vm_callstack, rX & 255); stack_push(vm_callstack, rX >> 8); stack_push(vm_callstack, rY); stack_push(vm_callstack, rZ); vm_pc = WORD(); vm_cycles++; break; + case OP_RET: rZ = stack_pop(vm_callstack); rY = stack_pop(vm_callstack); rX = (stack_pop(vm_callstack) << 8) + stack_pop(vm_callstack); vm_pc = stack_pop(vm_callstack); vm_cycles++; break; case OP_CALL: external_calls[vm_program[vm_pc++]](vm_datastack); vm_cycles++; break; case OP_RJYZ: if (rY == 0) vm_pc += vm_program[vm_pc]; vm_cycles++; break; case OP_RJYN: if (rY != 0) vm_pc += vm_program[vm_pc]; vm_cycles++; break;