From 89a17f06f00bee0a412e1d4f6a47f53bc4f42521 Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 29 Nov 2025 10:50:29 -0800 Subject: [PATCH] start making changes to init_vm --- src/arch/linux/main.c | 54 +++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/arch/linux/main.c b/src/arch/linux/main.c index 461daf9..ff72554 100644 --- a/src/arch/linux/main.c +++ b/src/arch/linux/main.c @@ -199,6 +199,7 @@ i32 main(i32 argc, char *argv[]) { char *output_file = nil; bool is_rom = false; bool is_assembly = false; + bool is_ir = false; // Parse command line arguments for (i32 i = 1; i < argc; i++) { @@ -216,36 +217,43 @@ i32 main(i32 argc, char *argv[]) { if (ext && (strcmp(ext, ".lisp") == 0)) { is_assembly = true; } + if (ext && (strcmp(ext, ".ir") == 0)) { + is_ir = true; + } } else if (output_file == nil && dump_rom) { // This is the output file for -o flag output_file = argv[i]; } } - VM vm = {0}; + VM *vm; + if (!init_vm(vm)) { + printf("vm did not initialize for some reason."); + return 1; + } bool compilation_success = true; if (input_file) { if (is_rom) { // Load ROM file directly - compilation_success = loadVM(input_file, &vm); + compilation_success = loadVM(input_file, vm); } else if (is_assembly) { // Compile Lisp file if (dump_rom && output_file) { - compilation_success = assembleAndSave(input_file, output_file, &vm); + compilation_success = assembleAndSave(input_file, output_file, vm); } else { - compilation_success = assembleAndSave(input_file, nil, &vm); + compilation_success = assembleAndSave(input_file, nil, vm); } } else { if (dump_rom && output_file) { - compilation_success = compileAndSave(input_file, output_file, &vm); + compilation_success = compileAndSave(input_file, output_file, vm); } else { - compilation_success = compileAndSave(input_file, nil, &vm); + compilation_success = compileAndSave(input_file, nil, vm); } } } else { printf("usage: undar ..."); - return 0; + return 1; } if (dump_rom) { @@ -254,7 +262,7 @@ i32 main(i32 argc, char *argv[]) { // If dump_rom flag was set without specifying output file, use default if (dump_rom && !is_rom && !output_file) { - if (!saveVM("memory_dump.bin", &vm)) { + if (!saveVM("memory_dump.bin", vm)) { printf("Failed to save VM to memory_dump.bin\n"); return EXIT_FAILURE; } @@ -262,7 +270,7 @@ i32 main(i32 argc, char *argv[]) { return EXIT_SUCCESS; } - vm_register_device(&vm, "/dev/term/0", "terminal", &console_data, + vm_register_device(vm, "/dev/term/0", "terminal", &console_data, &console_device_ops, 4); if (SDL_Init(SDL_INIT_VIDEO) < 0) { @@ -275,7 +283,7 @@ i32 main(i32 argc, char *argv[]) { screen_data.height = 480; screen_data.buffer_size = screen_data.width * screen_data.height; - vm_register_device(&vm, "/dev/screen/0", "screen", &screen_data, &screen_ops, + vm_register_device(vm, "/dev/screen/0", "screen", &screen_data, &screen_ops, 16 + screen_data.buffer_size); mouse_data.x = 0; @@ -285,10 +293,10 @@ i32 main(i32 argc, char *argv[]) { mouse_data.btn3 = 0; mouse_data.btn4 = 0; - vm_register_device(&vm, "/dev/mouse/0", "mouse", &mouse_data, &mouse_ops, 16); + vm_register_device(vm, "/dev/mouse/0", "mouse", &mouse_data, &mouse_ops, 16); keyboard_data.keys = SDL_GetKeyboardState(&keyboard_data.key_count); - vm_register_device(&vm, "/dev/keyboard/0", "keyboard", &keyboard_data, + vm_register_device(vm, "/dev/keyboard/0", "keyboard", &keyboard_data, &keyboard_ops, keyboard_data.key_count + 4); SDL_Event event; @@ -333,11 +341,11 @@ i32 main(i32 argc, char *argv[]) { case SDL_FINGERDOWN: case SDL_FINGERUP: { - float x = event.tfinger.x * 640; - float y = event.tfinger.y * 480; + f32 x = event.tfinger.x * 640; + f32 y = event.tfinger.y * 480; - mouse_data.x = (int)x; - mouse_data.y = (int)y; + mouse_data.x = (i32)x; + mouse_data.y = (i32)y; // Only treat the first finger as mouse input (ignore multi-touch // beyond 1 finger) @@ -354,10 +362,10 @@ i32 main(i32 argc, char *argv[]) { } // Run VM for a fixed number of cycles or a time slice - int cycles_this_frame = 0; - int max_cycles_per_frame = 100; // Adjust this value + i32 cycles_this_frame = 0; + i32 max_cycles_per_frame = 100; // Adjust this value while (cycles_this_frame < max_cycles_per_frame) { - if (!step_vm(&vm)) { + if (!step_vm(vm)) { running = false; break; } @@ -374,9 +382,9 @@ i32 main(i32 argc, char *argv[]) { SDL_RenderGetViewport(screen_data.renderer, &output_rect); // Calculate aspect ratio preserving scaling - float scale_x = (float)output_rect.w / screen_data.width; - float scale_y = (float)output_rect.h / screen_data.height; - float scale = SDL_min(scale_x, scale_y); + f32 scale_x = (f32)output_rect.w / screen_data.width; + f32 scale_y = (f32)output_rect.h / screen_data.height; + f32 scale = SDL_min(scale_x, scale_y); SDL_Rect dstrect = { (i32)((output_rect.w - screen_data.width * scale) / 2), @@ -392,5 +400,5 @@ i32 main(i32 argc, char *argv[]) { } } - return vm.flag; + return vm->flag; }