From f28dd417d954d385dfd4b7311f8eda797e0ce87e Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 5 Jul 2025 15:54:33 -0400 Subject: [PATCH] pretty sure strings are still broken, but it runs at least --- src/compiler.c | 59 ++++++++++++++------------------------------------ src/compiler.h | 6 ++--- src/main.c | 6 ++++- src/vm.c | 45 +++++++++++++++++++++++++------------- 4 files changed, 54 insertions(+), 62 deletions(-) diff --git a/src/compiler.c b/src/compiler.c index 6798e3f..2e83685 100644 --- a/src/compiler.c +++ b/src/compiler.c @@ -1,7 +1,7 @@ #include "compiler.h" #include "parser.h" -void demo_add_compile(Value *memory) { +uint32_t demo_add_compile(Value *memory) { uint32_t i = 0; memory[i++].u = OP(OP_LOADU, 0, 0, 0); memory[i++].u = 0; @@ -14,56 +14,27 @@ void demo_add_compile(Value *memory) { memory[i++].u = OP(OP_LOADF, 4, 0, 0); memory[i++].f = 5.0f; memory[i++].u = OP(OP_LOADU, 5, 0, 0); - memory[i++].u = 200; - memory[i++].u = OP(OP_LOADU, 6, 0, 0); - memory[i++].u = 250; - memory[i++].u = OP(OP_LOADU, 7, 0, 0); - memory[i++].u = 252; - uint32_t jmp = i; + uint32_t jmp = i + 1; + memory[i++].u = jmp; memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3); memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2); - memory[i++].u = OP(OP_JGT_UINT, jmp, 1, 0); - memory[i++].u = OP(OP_REAL_TO_STRING, 5, 4, 0); - memory[i++].u = OP(OP_PRINT_STRING, 0, 5, 0); - memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4); - memory[i++].u = OP(OP_UINT_TO_STRING, 6, 1, 0); + memory[i++].u = OP(OP_JGT_UINT, 5, 1, 0); + memory[i++].u = OP(OP_REAL_TO_STRING, 6, 4, 0); memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0); - memory[i++].u = OP(OP_READ_STRING, 7, 0, 0); + memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4); + memory[i++].u = OP(OP_UINT_TO_STRING, 7, 1, 0); memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0); - memory[i++].u = OP(OP_HALT, 0, 0, 0); + memory[i++].u = OP(OP_READ_STRING, 8, 0, 0); + memory[i++].u = OP(OP_PRINT_STRING, 0, 8, 0); + memory[i++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */ + return i; } -void demo_function_call_compile(Value *memory) { +uint32_t demo_function_call_compile(Value *memory) { uint32_t i = 0; - memory[i++].u = OP(OP_LOADU, 0, 0, 0); - memory[i++].u = 0; - memory[i++].u = OP(OP_LOADU, 1, 0, 0); - memory[i++].u = 5; - memory[i++].u = OP(OP_LOADU, 2, 0, 0); - memory[i++].u = 1; - memory[i++].u = OP(OP_LOADF, 3, 0, 0); - memory[i++].f = 5.0f; - memory[i++].u = OP(OP_LOADF, 4, 0, 0); - memory[i++].f = 5.0f; - memory[i++].u = OP(OP_LOADU, 5, 0, 0); - memory[i++].u = 200; - memory[i++].u = OP(OP_LOADU, 6, 0, 0); - memory[i++].u = 250; - memory[i++].u = OP(OP_LOADU, 7, 0, 0); - memory[i++].u = 252; - uint32_t jmp = i; - memory[i++].u = OP(OP_ADD_REAL, 4, 4, 3); - memory[i++].u = OP(OP_SUB_UINT, 1, 1, 2); - memory[i++].u = OP(OP_JGT_UINT, jmp, 1, 0); - memory[i++].u = OP(OP_REAL_TO_STRING, 5, 4, 0); - memory[i++].u = OP(OP_PRINT_STRING, 0, 5, 0); - memory[i++].u = OP(OP_REAL_TO_UINT, 1, 4, 4); - memory[i++].u = OP(OP_UINT_TO_STRING, 6, 1, 0); - memory[i++].u = OP(OP_PRINT_STRING, 0, 6, 0); - memory[i++].u = OP(OP_READ_STRING, 7, 0, 0); - memory[i++].u = OP(OP_PRINT_STRING, 0, 7, 0); memory[i++].u = OP(OP_HALT, 0, 0, 0); + return i; } static void letDeclaration() { @@ -92,7 +63,8 @@ static void declaration(Token t) { /** * Compile. */ -void compile(Value *memory, char *buffer) { +uint32_t compile(Value *memory, char *buffer) { + uint32_t i = 0; initTokenizer(buffer); Token t = nextToken(); while (t.type != TOKEN_EOF) { @@ -100,4 +72,5 @@ void compile(Value *memory, char *buffer) { declaration(t); t = nextToken(); } + return i; } diff --git a/src/compiler.h b/src/compiler.h index 311128a..de04409 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -3,8 +3,8 @@ #include "opcodes.h" -void demo_add_compile (Value *memory); -void demo_function_call_compile(Value *memory); -void compile (Value* memory, char *buffer); +uint32_t demo_add_compile (Value *memory); +uint32_t demo_function_call_compile(Value *memory); +uint32_t compile (Value* memory, char *buffer); #endif diff --git a/src/main.c b/src/main.c index 42f2f12..3e2123c 100644 --- a/src/main.c +++ b/src/main.c @@ -51,7 +51,11 @@ int main(int argc, char **argv) { initTokenMap(); compile(vm.memory, buffer); - /* demo_add_compile(vm.memory); */ + vm.frame_stack_size = FRAME_STACK_SIZE; + vm.return_stack_size = RETURN_STACK_SIZE; + vm.memory_size = MEMORY_SIZE; + uint32_t i = demo_add_compile(vm.memory); + vm.frame_stack[vm.fp].allocated.end = i + 1; #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(mainloop, 0, 1); diff --git a/src/vm.c b/src/vm.c index b5b9410..0e2266c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -5,7 +5,8 @@ do { \ type value = vm->frame_stack[vm->fp].registers[src1].accessor; \ type value2 = vm->frame_stack[vm->fp].registers[src2].accessor; \ - vm->pc = (value op value2) ? dest : vm->pc; \ + vm->pc = \ + (value op value2) ? vm->frame_stack[vm->fp].registers[dest].u : vm->pc; \ return true; \ } while (0) @@ -186,38 +187,51 @@ bool step_vm(VM *vm) { COMPARE_AND_JUMP(float, u, <=); } case OP_INT_TO_STRING: { - int32_t a = (int32_t)vm->frame_stack[vm->fp].registers[src1].i; /* get value */ - uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */ - vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */ + int32_t a = + (int32_t)vm->frame_stack[vm->fp].registers[src1].i; /* get value */ + uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp] + .allocated.end; /* get start of unallocated */ + vm->frame_stack[vm->fp].registers[dest].u = + str_dest; /* store ptr of string to dest register */ char buffer[32]; int len = sprintf(buffer, "%d", a); mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */ - vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */ + vm->frame_stack[vm->fp].allocated.end += + len + 1; /* increment to end of allocated */ return true; } case OP_UINT_TO_STRING: { - uint32_t a = (uint32_t)vm->frame_stack[vm->fp].registers[src1].u; /* get value */ - uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */ - vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */ + uint32_t a = + (uint32_t)vm->frame_stack[vm->fp].registers[src1].u; /* get value */ + uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp] + .allocated.end; /* get start of unallocated */ + vm->frame_stack[vm->fp].registers[dest].u = + str_dest; /* store ptr of string to dest register */ char buffer[32]; int len = sprintf(buffer, "%d", a); mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */ - vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */ + vm->frame_stack[vm->fp].allocated.end += + len + 1; /* increment to end of allocated */ return true; } case OP_REAL_TO_STRING: { float a = (float)vm->frame_stack[vm->fp].registers[src1].f; /* get value */ - uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */ - vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */ + uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp] + .allocated.end; /* get start of unallocated */ + vm->frame_stack[vm->fp].registers[dest].u = + str_dest; /* store ptr of string to dest register */ char buffer[32]; int len = sprintf(buffer, "%f", a); mem_strcpy(vm->memory, buffer, len, str_dest); /* copy buffer to dest */ - vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + len * sizeof(char); /* increment to end of allocated */ + vm->frame_stack[vm->fp].allocated.end += + len + 1; /* increment to end of allocated */ return true; } case OP_READ_STRING: { - uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp].allocated.end; /* get start of unallocated */ - vm->frame_stack[vm->fp].registers[dest].u = str_dest; /* store ptr of string to dest register */ + uint32_t str_dest = (uint32_t)vm->frame_stack[vm->fp] + .allocated.end; /* get start of unallocated */ + vm->frame_stack[vm->fp].registers[dest].u = + str_dest; /* store ptr of string to dest register */ uint32_t buffer = str_dest + 1; uint32_t length = 0; while (1) { @@ -230,7 +244,8 @@ bool step_vm(VM *vm) { length++; } vm->memory[str_dest].u = length; - vm->frame_stack[vm->fp].allocated.end += sizeof(uint32_t) + length * sizeof(char); /* increment to end of allocated */ + vm->frame_stack[vm->fp].allocated.end += + length + 1; /* increment to end of allocated */ return true; } case OP_PRINT_STRING: {