Started implementing some opcodes
This commit is contained in:
4
main.cpp
4
main.cpp
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
|
int i = 10;
|
||||||
|
int x = i++ + (i++ + 1);
|
||||||
|
// aci, i == 12 ; x == 21
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -76,6 +76,13 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp" />
|
||||||
|
<ClCompile Include="stack.cpp" />
|
||||||
|
<ClCompile Include="vm.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="stack.h" />
|
||||||
|
<ClInclude Include="vm.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
|||||||
@@ -14,4 +14,23 @@
|
|||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="stack.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="vm.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="vm.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="stack.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
41
vm.cpp
41
vm.cpp
@@ -1,5 +1,9 @@
|
|||||||
#include "vm.h"
|
#include "vm.h"
|
||||||
|
|
||||||
|
#define MAX_EXTERNAL_CALLS 256
|
||||||
|
#define MAX_DATA_STACK 256
|
||||||
|
#define MAX_CALL_STACK 256
|
||||||
|
|
||||||
enum OPS {
|
enum OPS {
|
||||||
OP_NOP = 0,
|
OP_NOP = 0,
|
||||||
OP_PUSH,
|
OP_PUSH,
|
||||||
@@ -34,19 +38,52 @@ enum OPS {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef void(*t_extcall)(t_stack&);
|
typedef void(*t_extcall)(t_stack&);
|
||||||
t_extcall external_calls[100];
|
t_extcall external_calls[MAX_EXTERNAL_CALLS];
|
||||||
int numcallbacks = 0;
|
int numcallbacks = 0;
|
||||||
|
|
||||||
const unsigned char* vm_program = nullptr;
|
const unsigned char* vm_program = nullptr;
|
||||||
int vm_pc = 0;
|
int vm_pc = 0;
|
||||||
|
int vm_cycles = 0;
|
||||||
|
t_stack vm_datastack;
|
||||||
|
t_stack vm_callstack;
|
||||||
|
|
||||||
void vm_init(const unsigned char* program) {
|
void vm_init(const unsigned char* program) {
|
||||||
vm_program = program;
|
vm_program = program;
|
||||||
vm_pc = 0;
|
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&)) {
|
void vm_register_call(void(*callback)(t_stack&)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user