diff --git a/main.cpp b/main.cpp index 7386918..5eeb685 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,8 @@ int main(int argc, char** argv) { - + int i = 10; + int x = i++ + (i++ + 1); + // aci, i == 12 ; x == 21 return 0; } \ No newline at end of file diff --git a/vbvm.vcxproj b/vbvm.vcxproj index 392a2e4..130f113 100644 --- a/vbvm.vcxproj +++ b/vbvm.vcxproj @@ -76,6 +76,13 @@ + + + + + + + diff --git a/vbvm.vcxproj.filters b/vbvm.vcxproj.filters index f81daba..e238e83 100644 --- a/vbvm.vcxproj.filters +++ b/vbvm.vcxproj.filters @@ -14,4 +14,23 @@ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + \ No newline at end of file diff --git a/vm.cpp b/vm.cpp index 5bb5d7e..34cf394 100644 --- a/vm.cpp +++ b/vm.cpp @@ -1,5 +1,9 @@ #include "vm.h" +#define MAX_EXTERNAL_CALLS 256 +#define MAX_DATA_STACK 256 +#define MAX_CALL_STACK 256 + enum OPS { OP_NOP = 0, OP_PUSH, @@ -34,19 +38,52 @@ enum OPS { }; typedef void(*t_extcall)(t_stack&); -t_extcall external_calls[100]; +t_extcall external_calls[MAX_EXTERNAL_CALLS]; int numcallbacks = 0; const unsigned char* vm_program = nullptr; int vm_pc = 0; +int vm_cycles = 0; +t_stack vm_datastack; +t_stack vm_callstack; void vm_init(const unsigned char* program) { vm_program = program; vm_pc = 0; + vm_datastack = stack_new(MAX_DATA_STACK); + vm_callstack = stack_new(MAX_CALL_STACK); } -void vm_step() { +void vm_step() { + switch (vm_program[vm_pc++]) { + case OP_NOP: 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_DUP: stack_push(vm_datastack, stack_peek(vm_datastack)); vm_cycles++; break; + case OP_LOAD: vm_cycles++; break; + case OP_STORE: vm_cycles++; break; + case OP_JMP: vm_pc = vm_program[vm_pc] + (vm_program[vm_pc + 1] << 8); vm_cycles++; break; + case OP_JNT: vm_cycles++; break; + case OP_JTR: vm_cycles++; break; + case OP_JSR: vm_cycles++; break; + case OP_RET: vm_cycles++; break; + case OP_CALL: external_calls[vm_program[vm_pc++]](vm_datastack); vm_cycles++; break; + case OP_ADD: vm_cycles++; break; + case OP_SUB: vm_cycles++; break; + case OP_MUL: vm_cycles++; break; + case OP_DIV: vm_cycles++; break; + case OP_MOD: vm_cycles++; break; + case OP_AND: vm_cycles++; break; + case OP_OR: vm_cycles++; break; + case OP_NOT: vm_cycles++; break; + case OP_NEG: vm_cycles++; break; + case OP_INC: vm_cycles++; break; + case OP_EQ: vm_cycles++; break; + case OP_NEQ: vm_cycles++; break; + case OP_LT: vm_cycles++; break; + case OP_GT: vm_cycles++; break; + } } void vm_register_call(void(*callback)(t_stack&)) {