From 7c1d7212723df9130714fb2c3e3f52ff7146557c Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sat, 21 Feb 2026 00:01:32 -0500 Subject: [PATCH] trash --- attempt_1/main.c | 194 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 172 insertions(+), 22 deletions(-) diff --git a/attempt_1/main.c b/attempt_1/main.c index 3ee8f1f..1cfd578 100644 --- a/attempt_1/main.c +++ b/attempt_1/main.c @@ -57,13 +57,66 @@ global U8 log_buffer[16] = {0}; global U4 log_count = 0; global S4 scroll_y_offset = 0; +// New GDI log +#define GDI_LOG_MAX_LINES 10 +#define GDI_LOG_MAX_LINE_LEN 128 +global char gdi_log_buffer[GDI_LOG_MAX_LINES][GDI_LOG_MAX_LINE_LEN] = {0}; +global U4 gdi_log_count = 0; + +internal void debug_log(Str8 fmt, KTL_Str8 table) { + // A static buffer for our log lines. + LP_ UTF8 console_log_buffer[1024]; + mem_zero(u8_(console_log_buffer), 1024); + + // Format the string. + Str8 result = str8_fmt_ktl_buf(slice_ut_arr(console_log_buffer), table, fmt); + + // Also write to our GDI log buffer + if (gdi_log_count < GDI_LOG_MAX_LINES) { + U4 len_to_copy = result.len < GDI_LOG_MAX_LINE_LEN - 1 ? result.len : GDI_LOG_MAX_LINE_LEN - 1; + mem_copy(u8_(gdi_log_buffer[gdi_log_count]), u8_(result.ptr), len_to_copy); + gdi_log_buffer[gdi_log_count][len_to_copy] = '\0'; + gdi_log_count++; + } + + // Get stdout handle. + MS_Handle stdout_handle = ms_get_std_handle(MS_STD_OUTPUT); + + // Write the formatted string. + ms_write_console(stdout_handle, result.ptr, (U4)result.len, nullptr, 0); + + // Write a newline. + ms_write_console(stdout_handle, (UTF8 const*r)"\n", 1, nullptr, 0); +} + void ms_builtin_print(U8 val) { + char val_hex[9]; + u64_to_hex(val, val_hex, 8); + val_hex[8] = '\0'; + KTL_Slot_Str8 log_table[] = { + { ktl_str8_key("val"), str8(val_hex) }, + }; + debug_log(str8("ms_builtin_print called with: "), ktl_str8_from_arr(log_table)); if (log_count < 16) log_buffer[log_count++] = val; } // Visual Linker & O(1) Dictionary global U4 tape_to_code_offset[65536] = {0}; +// --- WinAPI Persistence --- +#define MS_GENERIC_READ 0x80000000 +#define MS_GENERIC_WRITE 0x40000000 +#define MS_CREATE_ALWAYS 2 +#define MS_OPEN_EXISTING 3 +#define MS_FILE_ATTRIBUTE_NORMAL 0x80 +#define MS_VK_F1 0x70 +#define MS_VK_F2 0x71 + +WinAPI void* ms_create_file_a(char const* lpFileName, U4 dwDesiredAccess, U4 dwShareMode, void* lpSecurityAttributes, U4 dwCreationDisposition, U4 dwFlagsAndAttributes, void* hTemplateFile) asm("CreateFileA"); +WinAPI B4 ms_write_file(void* hFile, void const* lpBuffer, U4 nNumberOfBytesToWrite, U4* lpNumberOfBytesWritten, void* lpOverlapped) asm("WriteFile"); +WinAPI B4 ms_read_file(void* hFile, void* lpBuffer, U4 nNumberOfBytesToRead, U4* lpNumberOfBytesRead, void* lpOverlapped) asm("ReadFile"); +WinAPI B4 ms_close_handle(void* hObject) asm("CloseHandle"); + #define PRIM_SWAP 1 #define PRIM_MULT 2 #define PRIM_ADD 3 @@ -73,6 +126,10 @@ global U4 tape_to_code_offset[65536] = {0}; #define PRIM_RET_Z 7 #define PRIM_RET 8 #define PRIM_PRINT 9 +#define PRIM_RET_S 10 +#define PRIM_DUP 11 +#define PRIM_DROP 12 +#define PRIM_SUB 13 global const char* prim_names[] = { "", @@ -84,10 +141,45 @@ global const char* prim_names[] = { "STORE ", "RET_IF_Z", "RETURN ", - "PRINT " + "PRINT ", + "RET_IF_S", + "DUP ", + "DROP ", + "SUB " }; internal U4 resolve_name_to_index(const char* ref_name); +internal void relink_tape(void); + +IA_ void compile_and_run_tape(void); + +internal void save_cartridge(void) { + void* hFile = ms_create_file_a("cartridge.bin", MS_GENERIC_WRITE, 0, nullptr, MS_CREATE_ALWAYS, MS_FILE_ATTRIBUTE_NORMAL, nullptr); + if (hFile != (void*)-1) { + U4 written = 0; + ms_write_file(hFile, & tape_arena.used, 8, & written, nullptr); + ms_write_file(hFile, & anno_arena.used, 8, & written, nullptr); + ms_write_file(hFile, & cursor_idx, 8, & written, nullptr); + ms_write_file(hFile, (void*)tape_arena.start, (U4)tape_arena.used, & written, nullptr); + ms_write_file(hFile, (void*)anno_arena.start, (U4)anno_arena.used, & written, nullptr); + ms_close_handle(hFile); + } +} + +internal void load_cartridge(void) { + void* hFile = ms_create_file_a("cartridge.bin", MS_GENERIC_READ, 0, nullptr, MS_OPEN_EXISTING, MS_FILE_ATTRIBUTE_NORMAL, nullptr); + if (hFile != (void*)-1) { + U4 read = 0; + ms_read_file(hFile, & tape_arena.used, 8, & read, nullptr); + ms_read_file(hFile, & anno_arena.used, 8, & read, nullptr); + ms_read_file(hFile, & cursor_idx, 8, & read, nullptr); + ms_read_file(hFile, (void*)tape_arena.start, (U4)tape_arena.used, & read, nullptr); + ms_read_file(hFile, (void*)anno_arena.start, (U4)anno_arena.used, & read, nullptr); + ms_close_handle(hFile); + relink_tape(); + compile_and_run_tape(); + } +} IA_ void scatter(U4 token, const char* anno_str) { if (tape_arena.used + sizeof(U4) <= tape_arena.capacity && anno_arena.used + sizeof(U8) <= anno_arena.capacity) { @@ -133,7 +225,8 @@ internal U4 resolve_name_to_index(const char* ref_name) { U4*r tape_ptr = u4_r(tape_arena.start); U8*r anno_ptr = u8_r(anno_arena.start); - for (int p = 1; p <= 9; p++) { + U8 prim_count = array_len(prim_names); + for (int p = 1; p < prim_count; p++) { int match = 1; for (int c = 0; c < 8; c++) { char c1 = ref_name[c] ? ref_name[c] : ' '; @@ -188,6 +281,10 @@ internal void compile_action(U4 val) emit8(0x48); emit8(0x01); emit8(0xD0); pad32(); return; + } else if (val == PRIM_SUB) { + emit8(0x48); emit8(0x29); emit8(0xD0); + pad32(); + return; } else if (val == PRIM_FETCH) { emit8(0x48); emit8(0x8B); emit8(0x04); emit8(0xC1); pad32(); @@ -206,21 +303,35 @@ internal void compile_action(U4 val) emit8(0xC3); pad32(); return; + } else if (val == PRIM_RET_S) { + emit8(0x48); emit8(0x85); emit8(0xC0); + emit8(0x79); emit8(0x01); + emit8(0xC3); + pad32(); + return; } else if (val == PRIM_RET) { emit8(0xC3); pad32(); return; + } else if (val == PRIM_DUP) { + emit8(0x48); emit8(0x89); emit8(0xC2); + pad32(); + return; + } else if (val == PRIM_DROP) { + emit8(0x48); emit8(0x89); emit8(0xD0); + pad32(); + return; } else if (val == PRIM_PRINT) { - emit8(0x51); emit8(0x52); - emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); - emit8(0x48); emit8(0x89); emit8(0xC1); - emit8(0x49); emit8(0xB8); + emit8(0x52); // push rdx + emit8(0x48); emit8(0x83); emit8(0xEC); emit8(0x20); // sub rsp, 32 (shadow space) + emit8(0x48); emit8(0x89); emit8(0xC1); // mov rcx, rax + emit8(0x49); emit8(0xB8); // mov r8, ... U8 addr = u8_(& ms_builtin_print); emit32(u4_(addr & 0xFFFFFFFF)); emit32(u4_(addr >> 32)); - emit8(0x41); emit8(0xFF); emit8(0xD0); - emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); - emit8(0x5A); emit8(0x59); + emit8(0x41); emit8(0xFF); emit8(0xD0); // call r8 + emit8(0x48); emit8(0x83); emit8(0xC4); emit8(0x20); // add rsp, 32 + emit8(0x5A); // pop rdx pad32(); return; } @@ -239,11 +350,13 @@ IA_ void compile_and_run_tape(void) { farena_reset(& code_arena); log_count = 0; + gdi_log_count = 0; emit8(0x48); emit8(0x8B); emit8(0x41); emit8(0x70); emit8(0x48); emit8(0x8B); emit8(0x51); emit8(0x78); U4*r tape_ptr = u4_r(tape_arena.start); + U8*r anno_ptr = u8_r(anno_arena.start); B4 in_def = false; U4 def_jmp_offset = 0; U8 end_idx = run_full ? (tape_arena.used / sizeof(U4)) : (cursor_idx + 1); @@ -251,6 +364,7 @@ IA_ void compile_and_run_tape(void) { U4 tag = unpack_tag(tape_ptr[i]); U4 val = unpack_val(tape_ptr[i]); + if (tag == STag_Define) { if (in_def == false) { @@ -270,18 +384,19 @@ IA_ void compile_and_run_tape(void) emit8(0x48); emit8(0x87); emit8(0xC2); pad32(); } - else if (tag == STag_Call) + else if (tag == STag_Call || tag == STag_Imm) { - compile_action(val); - } - else if (tag == STag_Data) { - emit8(0x48); emit8(0x89); emit8(0xC2); - emit8(0x48); emit8(0xC7); emit8(0xC0); emit32(val); - pad32(); - } - else if (tag == STag_Imm) - { - if (in_def) { + char* name = (char*)&anno_ptr[i]; + char val_hex[9]; + u64_to_hex(val, val_hex, 8); + val_hex[8] = '\0'; + KTL_Slot_Str8 call_log_table[] = { + { ktl_str8_key("name"), str8(name) }, + { ktl_str8_key("val"), str8(val_hex) }, + }; + debug_log(str8("Compiling call: (val: )"), ktl_str8_from_arr(call_log_table)); + + if (tag == STag_Imm && in_def) { emit8(0xC3); pad32(); U4 current = code_arena.used; @@ -289,7 +404,12 @@ IA_ void compile_and_run_tape(void) in_def = false; } compile_action(val); - } + } + else if (tag == STag_Data) { + emit8(0x48); emit8(0x89); emit8(0xC2); + emit8(0x48); emit8(0xC7); emit8(0xC0); emit32(val); + pad32(); + } } if (in_def) { @@ -309,6 +429,18 @@ IA_ void compile_and_run_tape(void) vm_rax = vm_globals[14]; vm_rdx = vm_globals[15]; + + char rax_hex[9]; + u64_to_hex(vm_rax, rax_hex, 8); + rax_hex[8] = '\0'; + char rdx_hex[9]; + u64_to_hex(vm_rdx, rdx_hex, 8); + rdx_hex[8] = '\0'; + KTL_Slot_Str8 post_jit_log_table[] = { + { ktl_str8_key("rax"), str8(rax_hex) }, + { ktl_str8_key("rdx"), str8(rdx_hex) }, + }; + debug_log(str8("JIT finished. RAX: , RDX: "), ktl_str8_from_arr(post_jit_log_table)); } S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) @@ -359,6 +491,7 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) return 0; } case MS_WM_KEYDOWN: { + if (wparam == 0x45 && editor_mode == MODE_NAV) { editor_mode = MODE_EDIT; mode_switch_now = true; @@ -433,6 +566,8 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) if (wparam == MS_VK_PRIOR) { scroll_y_offset -= 100; if (scroll_y_offset < 0) scroll_y_offset = 0; } if (wparam == MS_VK_NEXT) { scroll_y_offset += 100; } if (wparam == MS_VK_F5) { run_full = !run_full; } + if (wparam == MS_VK_F1) { save_cartridge(); } + if (wparam == MS_VK_F2) { load_cartridge(); ms_invalidate_rect(hwnd, nullptr, true); } if (wparam == MS_VK_TAB) { U4 t = tape_ptr[cursor_idx]; @@ -631,6 +766,18 @@ S8 win_proc(void* hwnd, U4 msg, U8 wparam, S8 lparam) ms_set_text_color(hdc, 0x0094BAA1); ms_text_out_a(hdc, 750, 550 + (i * 25), log_str, 8); } + + ms_set_text_color(hdc, 0x00C8C8C8); + ms_text_out_a(hdc, 40, 650, "Debug Log:", 10); + for (U4 i = 0; i < gdi_log_count; i++) { + U4 len = 0; + while(gdi_log_buffer[i][len] != '\0' && len < GDI_LOG_MAX_LINE_LEN) { + len++; + } + ms_set_text_color(hdc, 0x00AAAAAA); + ms_text_out_a(hdc, 40, 670 + (i * 20), gdi_log_buffer[i], len); + } + ms_select_object(hdc, hOldFont); ms_delete_object(hBgBrush); ms_delete_object(hBrushEdit); @@ -699,6 +846,9 @@ int main(void) { scatter(pack_token(STag_Imm, 0), "F_STEP "); relink_tape(); + run_full = true; + compile_and_run_tape(); + run_full = false; MS_WNDCLASSA wc; mem_fill(u8_(& wc), 0, sizeof(wc)); @@ -713,4 +863,4 @@ int main(void) { while (ms_get_message_a(& msg, nullptr, 0, 0)) { ms_translate_message(& msg); ms_dispatch_message_a(& msg); } ms_exit_process(0); return 0; -} \ No newline at end of file +}