Implemented RJ, RB, RJZ, RJN, RBZ, RBN and SWAP
This commit is contained in:
17
vm.cpp
17
vm.cpp
@@ -9,6 +9,7 @@ enum OPS {
|
|||||||
OP_PUSH,
|
OP_PUSH,
|
||||||
OP_POP,
|
OP_POP,
|
||||||
OP_DUP,
|
OP_DUP,
|
||||||
|
OP_SWAP,
|
||||||
|
|
||||||
OP_LOAD,
|
OP_LOAD,
|
||||||
OP_LOADI,
|
OP_LOADI,
|
||||||
@@ -34,6 +35,13 @@ enum OPS {
|
|||||||
OP_RET,
|
OP_RET,
|
||||||
OP_CALL,
|
OP_CALL,
|
||||||
|
|
||||||
|
OP_RJ,
|
||||||
|
OP_RB,
|
||||||
|
OP_RJZ,
|
||||||
|
OP_RJN,
|
||||||
|
OP_RBZ,
|
||||||
|
OP_RBN,
|
||||||
|
|
||||||
OP_RJYZ,
|
OP_RJYZ,
|
||||||
OP_RJYN,
|
OP_RJYN,
|
||||||
OP_RBYZ,
|
OP_RBYZ,
|
||||||
@@ -88,12 +96,13 @@ void vm_init(const unsigned char* program) {
|
|||||||
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); }
|
||||||
|
|
||||||
void vm_step() {
|
void vm_step() {
|
||||||
char val;
|
char val, val2;
|
||||||
switch (vm_program[vm_pc++]) {
|
switch (vm_program[vm_pc++]) {
|
||||||
case OP_NOP: vm_cycles++; break;
|
case OP_NOP: vm_cycles++; break;
|
||||||
case OP_PUSH: stack_push(vm_datastack, vm_program[vm_pc++]); vm_cycles++; break;
|
case OP_PUSH: stack_push(vm_datastack, vm_program[vm_pc++]); vm_cycles++; break;
|
||||||
case OP_POP: stack_pop(vm_datastack); vm_cycles++; break;
|
case OP_POP: stack_pop(vm_datastack); vm_cycles++; break;
|
||||||
case OP_DUP: stack_push(vm_datastack, stack_peek(vm_datastack)); vm_cycles++; break;
|
case OP_DUP: stack_push(vm_datastack, stack_peek(vm_datastack)); vm_cycles++; break;
|
||||||
|
case OP_SWAP: val = stack_pop(vm_datastack); val2 = stack_pop(vm_datastack); stack_push(vm_datastack, val); stack_push(vm_datastack, val2); vm_cycles++; break;
|
||||||
case OP_LOAD: stack_push(vm_datastack, mem[WORD()]); vm_cycles++; break;
|
case OP_LOAD: stack_push(vm_datastack, mem[WORD()]); vm_cycles++; break;
|
||||||
case OP_LOADI: stack_push(vm_datastack, mem[WORD() + rY]); vm_cycles++; break;
|
case OP_LOADI: stack_push(vm_datastack, mem[WORD() + rY]); vm_cycles++; break;
|
||||||
case OP_STORE: mem[WORD()] = stack_pop(vm_datastack); vm_cycles++; break;
|
case OP_STORE: mem[WORD()] = stack_pop(vm_datastack); vm_cycles++; break;
|
||||||
@@ -115,6 +124,12 @@ void vm_step() {
|
|||||||
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_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_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_CALL: external_calls[vm_program[vm_pc++]](vm_datastack); vm_cycles++; break;
|
||||||
|
case OP_RJ: vm_pc += vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
case OP_RB: vm_pc -= vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
case OP_RJZ: if (stack_pop(vm_datastack) == 0) vm_pc += vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
case OP_RJN: if (stack_pop(vm_datastack) != 0) vm_pc += vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
case OP_RBZ: if (stack_pop(vm_datastack) == 0) vm_pc -= vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
case OP_RBN: if (stack_pop(vm_datastack) != 0) vm_pc -= vm_program[vm_pc]; vm_cycles++; break;
|
||||||
case OP_RJYZ: if (rY == 0) vm_pc += vm_program[vm_pc]; 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;
|
case OP_RJYN: if (rY != 0) vm_pc += vm_program[vm_pc]; vm_cycles++; break;
|
||||||
case OP_RBYZ: if (rY == 0) vm_pc -= vm_program[vm_pc]; vm_cycles++; break;
|
case OP_RBYZ: if (rY == 0) vm_pc -= vm_program[vm_pc]; vm_cycles++; break;
|
||||||
|
|||||||
Reference in New Issue
Block a user