Add disassembler window
diff --git a/gui.c b/gui.c
index 7fe5d69..a03d948 100644
--- a/gui.c
+++ b/gui.c
@@ -30,7 +30,23 @@
bool cpu_running = false;
struct nk_context *ctx;
- struct nk_colorf bg;
+ struct nk_colorf bg =
+ {
+ .r = 0.29f,
+ .g = 0.28f,
+ .b = 0.50f,
+ .a = 1.0f,
+ };
+ struct nk_color selected =
+ {
+ .r = 28,
+ .g = 234,
+ .b = 79,
+ .a = 255,
+ };
+
+ uint16_t disas_start = 0,
+ disas_end = 32;
SDL_SetHint(SDL_HINT_VIDEO_HIGHDPI_DISABLED, "0");
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS);
@@ -62,8 +78,6 @@
//nk_style_load_all_cursors(ctx, atlas->cursors);
nk_style_set_font(ctx, &font->handle);
- bg.r = 0.29f, bg.g = 0.28f, bg.b = 0.50f, bg.a = 1.0f;
-
while (running)
{
SDL_Event evt;
@@ -86,14 +100,6 @@
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
{
nk_layout_row_dynamic(ctx, 30, 4);
- char regpc[12],
- rega[12],
- regx[12],
- regy[12];
- sprintf(regpc, "PC: $%x", cpu->pc);
- sprintf(rega, "A: $%x", cpu->regs[A]);
- sprintf(regx, "X: $%x", cpu->regs[X]);
- sprintf(regy, "Y: $%x", cpu->regs[Y]);
cpu->pc = nk_propertyi(ctx, "PC", 0, cpu->pc, 0xFFFF, 1, 20.0f);
cpu->regs[A] = nk_propertyi(ctx, "A", 0, cpu->regs[A], 0xFF, 1, 20.0f);
cpu->regs[X] = nk_propertyi(ctx, "X", 0, cpu->regs[X], 0xFF, 1, 20.0f);
@@ -101,6 +107,45 @@
}
nk_end(ctx);
+ if (nk_begin(ctx, "Disassembler", nk_rect(330, 50, 250, 200),
+ NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
+ NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
+ {
+ nk_layout_row_dynamic(ctx, 30, 2);
+ disas_start = nk_propertyi(ctx, "Start", 0, disas_start, 0xFFFF, 1, 20.0f);
+ disas_end = nk_propertyi(ctx, "End", 0, disas_end, 0xFFFF, 1, 20.0f);
+
+ uint16_t pc = cpu->pc;
+
+ for (cpu->pc = disas_start; cpu->pc < disas_end;)
+ {
+ nk_layout_row_begin(ctx, NK_STATIC, 24, 2);
+
+ uint16_t this_pc = cpu->pc;
+
+ char addr[6];
+ sprintf(addr, "$%x", this_pc);
+
+ nk_layout_row_push(ctx, 48);
+ nk_label(ctx, addr, NK_TEXT_LEFT);
+
+ nk_layout_row_push(ctx, 120);
+ char *line = disas_step(cpu);
+ if (pc == this_pc)
+ {
+ nk_label_colored(ctx, line, NK_TEXT_LEFT, selected);
+ }
+ else
+ {
+ nk_label(ctx, line, NK_TEXT_LEFT);
+ }
+ free(line);
+ }
+
+ cpu->pc = pc;
+ }
+ nk_end(ctx);
+
if (nk_begin(ctx, "Debugger", nk_rect(50, 50, 230, 150),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))