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&)) {