From 97f34d72a72e76e8e05ebaa01fef16fa7382dd7f Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Wed, 24 Jun 2026 10:33:39 +0200 Subject: [PATCH] Added a stack view in bottom panel --- src/simulator/gui_tab_stack.odin | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/simulator/gui_tab_stack.odin diff --git a/src/simulator/gui_tab_stack.odin b/src/simulator/gui_tab_stack.odin new file mode 100644 index 0000000..110b798 --- /dev/null +++ b/src/simulator/gui_tab_stack.odin @@ -0,0 +1,63 @@ +package simulator +import "core:fmt" +import rl "vendor:raylib" + +gui_tab_stack :: proc(rect: rl.Rectangle, sim: ^Simulator) { + // Panel below header + panel_rect := rl.Rectangle{ + rect.x, + rect.y + PANEL_HEADER, + rect.width, + rect.height - PANEL_HEADER, + } + rl.GuiPanel(panel_rect, nil) + + // Header background + rl.DrawRectangle(i32(rect.x), i32(rect.y), i32(rect.width), i32(PANEL_HEADER), rl.BLACK) + rl.DrawTextEx(sim.font, "Stack", {rect.x + 4, rect.y + 4}, 18, 1, rl.WHITE) + + // SP indicator in header + sp_label := fmt.ctprintf("SP: %d", sim.machine.sp) + sp_size := rl.MeasureTextEx(sim.font, sp_label, 18, 1) + rl.DrawTextEx(sim.font, sp_label, {rect.x + rect.width - sp_size.x - 8, rect.y + 4}, 18, 1, rl.WHITE) + + // Use full panel height so empty slots fill the space + total_height := max(f32(16) * LINE_HEIGHT, panel_rect.height) + content_rect := rl.Rectangle{ + x = panel_rect.x, + y = panel_rect.y - PANEL_HEADER, + width = panel_rect.width - 15, + height = total_height, + } + view: rl.Rectangle + rl.GuiScrollPanel(panel_rect, nil, content_rect, &sim.stack_scroll, &view) + rl.BeginScissorMode(i32(view.x), i32(view.y), i32(view.width), i32(view.height)) + defer rl.EndScissorMode() + + index_x := panel_rect.x + PADDING_X + colon_x := index_x + 30 + + for i in 0..<16 { + y_pos := panel_rect.y + (f32(i) * LINE_HEIGHT) + sim.stack_scroll.y + is_active := i < int(sim.machine.sp) + is_top := i == int(sim.machine.sp) - 1 + // Only draw a background for active slots + if is_active { + rl.DrawRectangleV( + {panel_rect.x + sim.stack_scroll.x, y_pos}, + {panel_rect.width, LINE_HEIGHT}, + rl.BLACK, + ) + } + sp_marker := "" + if is_top do sp_marker = " <- SP" + + color := rl.WHITE if is_top else (rl.BLACK if is_active else rl.WHITE) + + txt_index := fmt.ctprintf("%02d", i) + txt_value := fmt.ctprintf(": 0x%04X%s", sim.machine.stack[i], sp_marker) + + rl.DrawTextEx(sim.font, txt_index, {index_x + sim.stack_scroll.x, y_pos}, 18, 1, color) + rl.DrawTextEx(sim.font, txt_value, {colon_x + sim.stack_scroll.x, y_pos}, 18, 1, color) + } +}