diff --git a/main.cpp b/main.cpp index e4392fe..c4354eb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,10 @@ #include #include +#include "vm.h" int main(int argc, char** argv) { - int i = 1; - char a[4] = { 1, 2, 3, 4 }; - int x = a[i++] + a[i++]; - // aci, i == 12 ; x == 21 + vm_init("test.bin"); + vm_step(); return 0; } \ No newline at end of file diff --git a/vm.cpp b/vm.cpp index 488b181..e6025ad 100644 --- a/vm.cpp +++ b/vm.cpp @@ -1,4 +1,5 @@ #include "vm.h" +#include #define MAX_EXTERNAL_CALLS 256 #define MAX_DATA_STACK 256 @@ -89,29 +90,52 @@ typedef byte(*t_in_port)(); t_out_port out_ports[256]; t_in_port in_ports[256]; -const unsigned char* vm_program = nullptr; +unsigned char mem[65536]; +const unsigned char* vm_program = mem; int vm_pc = 0; int vm_cycles = 0; t_stack vm_datastack; t_stack vm_callstack; -unsigned char mem[65536]; unsigned short rX = 0; unsigned char rY = 0; unsigned char rZ = 0; -void vm_init(const unsigned char* program) { - vm_program = program; +static void load_rom() { + FILE *f = fopen("rom.bin", "rb"); + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + fread(&mem[0x8000], fsize, 1, f); + fclose(f); +} + +static void load_program(const char* filename) { + FILE *f = fopen(filename, "rb"); + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + fread(mem, fsize, 1, f); + fclose(f); +} + +void vm_init(const char* filename) { vm_pc = rX = rY = rZ = 0; - stack_init(vm_datastack, MAX_DATA_STACK); - stack_init(vm_callstack, MAX_CALL_STACK); + vm_datastack.data = &mem[0x8800]; + vm_callstack.data = &mem[0x8900]; + vm_datastack.top = vm_callstack.top = 0; + vm_datastack.max = MAX_DATA_STACK; + vm_callstack.max = MAX_CALL_STACK; + load_rom(); + load_program(filename); } inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); } -void vm_step() { +const int vm_step() { char val, val2; 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; @@ -181,6 +205,7 @@ void vm_step() { case OP_IN: stack_push(vm_datastack, in_ports[vm_program[vm_pc++]]()); vm_cycles++; break; case OP_OUT: out_ports[vm_program[vm_pc++]](stack_pop(vm_datastack)); vm_cycles++; break; } + return vm_cycles; } void vm_register_call(void(*callback)(t_stack&)) { @@ -194,3 +219,13 @@ void vm_register_in_port(const byte port, t_in_port callback) { void vm_register_out_port(const byte port, t_out_port callback) { out_ports[port] = callback; } + +void vm_call_interrupt(const char num) { + stack_push(vm_callstack, vm_pc); + stack_push(vm_callstack, rX & 255); + stack_push(vm_callstack, rX >> 8); + stack_push(vm_callstack, rY); + stack_push(vm_callstack, rZ); + vm_pc = num == 0 ? 0xFFFA : 0xFFFD; + vm_cycles++; +} diff --git a/vm.h b/vm.h index d402517..8fa2429 100644 --- a/vm.h +++ b/vm.h @@ -1,8 +1,10 @@ #pragma once #include "stack.h" -void vm_init(const unsigned char* program); -void vm_step(); -void vm_register_call(void(*callback)(t_stack&)); +void vm_init(const char* filename); +const int vm_step(); void vm_register_in_port(const unsigned char port, unsigned char(*callback)(void)); void vm_register_out_port(const unsigned char port, void(*callback)(const unsigned char&)); +void vm_call_interrupt(const char num); + +void vm_register_call(void(*callback)(t_stack&));