diff options
author | Ian C <ianc@noddybox.co.uk> | 2023-04-23 09:42:21 +0800 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2023-04-23 09:42:21 +0800 |
commit | bb7b6e8532ef3282fdd15ec133deff919cd7e7c3 (patch) | |
tree | e576c7b35fabe8d903af8ee963ffa42dd2330619 /source/main.c | |
parent | 1d1e0acb5b4494f7c1b041e24e5de4f0614a150b (diff) |
Initial work to add debug menu from 3dsspec
Diffstat (limited to 'source/main.c')
-rw-r--r-- | source/main.c | 467 |
1 files changed, 456 insertions, 11 deletions
diff --git a/source/main.c b/source/main.c index 8ea8e00..ef2633e 100644 --- a/source/main.c +++ b/source/main.c @@ -32,6 +32,7 @@ #include "tapes.h" #include "config.h" #include "snapshot.h" +#include "debug.h" #ifndef DS81_VERSION #define DS81_VERSION "DEV " __TIME__ "/" __DATE__ @@ -45,17 +46,9 @@ #define FALSE 0 #endif -#define DEBUG(x) \ - do \ - { \ - printf(x); \ - gfxFlushBuffers(); \ - gfxSwapBuffers(); \ - } while(0); \ - do \ - { \ - hidScanInput(); \ - } while(!(hidKeysDown() & KEY_TOUCH)) \ +/* Macro for PRINT AT in the upper framebuffer +*/ +#define AT(x,y) (x)*8,upper.height-1-(y)*8 /* ---------------------------------------- STATIC DATA */ @@ -70,6 +63,7 @@ static const char *main_menu[]= "Save Joypad/Key State", "Load Joypad/Key State", "Help", + "Debug", "Exit 3DS81", "Cancel", NULL @@ -86,9 +80,30 @@ typedef enum MenuSaveMappings, MenuLoadMappings, MenuHelp, + MenuDebug, MenuExit } MenuOpt; +static const char *debug_menu[]= + { + "Enable Debug Output", + "Disable Debug Output", + "Disassembler", + "Memory Viewer", + "CPU Info", + "Cancel", + NULL + }; + +typedef enum +{ + DebugMenuEnableOutput, + DebugMenuDisableOutput, + DebugMenuDisassembler, + DebugMenuMemoryView, + DebugMenuCPUInfo, +} DebugMenuOpt; + /* ---------------------------------------- DISPLAY FUNCS */ @@ -314,6 +329,432 @@ static void MapJoypad(void) } +/* ---------------------------------------- DEBUG FUNCTIONS +*/ +static void DebugDisassembler(Z80 *cpu) +{ + static Z80Word addr = 0; + int done = FALSE; + Z80Word curr_addr = 0; + Framebuffer upper; + Framebuffer lower; + SoftKeyEvent ev; + int f; + + while(!done && aptMainLoop()) + { + FB_StartFrame(&upper, &lower); + + SK_DisplayKeyboard(); + + curr_addr = addr; + + FB_Clear(&upper, COL_WHITE); + + for(f=upper.height - 1; f > 0; f -= 8) + { + FB_printf(&upper, 0, f, COL_RED, COL_TRANSPARENT, + "%4.4x:", (unsigned)curr_addr); + FB_printf(&upper, 6*8, f, COL_BLACK, COL_TRANSPARENT, + "%s", Z80Disassemble(cpu, &curr_addr)); + } + + FB_EndFrame(); + + while(SK_GetBareEvent(&ev)) + { + if (ev.pressed) + { + switch(ev.key) + { + case SK_PAD_UP: + addr--; + break; + + case SK_PAD_DOWN: + addr++; + break; + + case SK_PAD_R: + addr = curr_addr; + break; + + case SK_PAD_L: + addr -= 20; + break; + + case SK_PAD_START: + done = TRUE; + break; + + case SK_PAD_B: + { + char addrstr[32] = {0}; + + if (GUI_Input("Enter address", addrstr, 31)) + { + addr = (Z80Word)strtoul(addrstr, NULL, 0); + } + + break; + } + + default: + break; + } + } + } + } +} + +static void DebugMemory(Z80 *cpu) +{ + static Z80Word addr = 0; + int done = FALSE; + Z80Word curr_addr = 0; + Framebuffer upper; + Framebuffer lower; + SoftKeyEvent ev; + int f; + int r; + int rows; + + while(!done && aptMainLoop()) + { + FB_StartFrame(&upper, &lower); + + SK_DisplayKeyboard(); + + curr_addr = addr; + + FB_Clear(&upper, COL_WHITE); + + rows = 0; + + for(f=upper.height - 1; f > 0; f -= 8) + { + FB_printf(&upper, 0, f, COL_RED, COL_TRANSPARENT, + "%4.4x:", (unsigned)curr_addr); + + for(r=0; r < 8; r++) + { + char c = '.'; + unsigned b; + + b = ZX81ReadDisassem(cpu, curr_addr); + + FB_printf(&upper, 6*8 + r*24, f, COL_BLACK, COL_TRANSPARENT, + "%2.2x", b); + + if (b >= 32 && b < 128) + { + c = b; + } + + FB_printf(&upper, 31*8 + r*8, f, COL_BLUE, COL_TRANSPARENT, + "%c", c); + + curr_addr++; + } + + rows++; + } + + FB_EndFrame(); + + while(SK_GetBareEvent(&ev)) + { + if (ev.pressed) + { + switch(ev.key) + { + case SK_PAD_UP: + addr--; + break; + + case SK_PAD_DOWN: + addr++; + break; + + case SK_PAD_R: + addr += rows * 8; + break; + + case SK_PAD_L: + addr -= rows * 8; + break; + + case SK_PAD_START: + done = TRUE; + break; + + case SK_PAD_B: + { + char addrstr[32] = {0}; + + if (GUI_Input("Enter address", addrstr, 31)) + { + addr = (Z80Word)strtoul(addrstr, NULL, 0); + } + + break; + } + + default: + break; + } + } + } + } +} + +static void DebugCPU(Z80 *cpu) +{ + static enum + { + AddrPC, + AddrSP, + AddrHL, + AddrBC, + AddrDE, + AddrIX, + AddrIY, + NumAddr + } addr_type = AddrPC; + + const char *addr_text[]= + { + "PC", "SP", "HL", "BC", "DE", "IX", "IY" + }; + + int done = FALSE; + Framebuffer upper; + Framebuffer lower; + SoftKeyEvent ev; + Z80Word addr; + Z80Word base; + int f; + + while(!done && aptMainLoop()) + { + FB_StartFrame(&upper, &lower); + + SK_DisplayKeyboard(); + + FB_Clear(&upper, COL_WHITE); + + addr = cpu->PC; + + FB_printf(&upper, AT(0,0), COL_BLACK, COL_TRANSPARENT, + "PC: %4.4x %s", (unsigned)cpu->PC, + Z80Disassemble(cpu, &addr)); + + FB_printf(&upper, AT(0,2), COL_BLACK, COL_TRANSPARENT, + "AF: %4.4x", (unsigned)cpu->AF.w); + + FB_printf(&upper, AT(0,3), COL_BLACK, COL_TRANSPARENT, + "BC: %4.4x", (unsigned)cpu->BC.w); + + FB_printf(&upper, AT(0,4), COL_BLACK, COL_TRANSPARENT, + "DE: %4.4x", (unsigned)cpu->DE.w); + + FB_printf(&upper, AT(0,5), COL_BLACK, COL_TRANSPARENT, + "HL: %4.4x", (unsigned)cpu->HL.w); + + FB_printf(&upper, AT(0,6), COL_BLACK, COL_TRANSPARENT, + "IX: %4.4x", (unsigned)cpu->IX.w); + + FB_printf(&upper, AT(0,7), COL_BLACK, COL_TRANSPARENT, + "IY: %4.4x", (unsigned)cpu->IX.w); + + FB_printf(&upper, AT(9,2), COL_BLACK, COL_TRANSPARENT, + "AF': %4.4x", (unsigned)cpu->AF_); + + FB_printf(&upper, AT(9,3), COL_BLACK, COL_TRANSPARENT, + "BC': %4.4x", (unsigned)cpu->BC_); + + FB_printf(&upper, AT(9,4), COL_BLACK, COL_TRANSPARENT, + "DE': %4.4x", (unsigned)cpu->DE_); + + FB_printf(&upper, AT(9,5), COL_BLACK, COL_TRANSPARENT, + "HL': %4.4x", (unsigned)cpu->HL_); + + switch(addr_type) + { + case AddrPC: + addr = cpu->PC; + break; + case AddrSP: + addr = cpu->SP; + break; + case AddrHL: + addr = cpu->HL.w; + break; + case AddrBC: + addr = cpu->BC.w; + break; + case AddrDE: + addr = cpu->DE.w; + break; + case AddrIX: + addr = cpu->IX.w; + break; + case AddrIY: + addr = cpu->IY.w; + break; + default: + break; + } + + base = addr; + addr -= 5; + + for(f=0; f < 11; f++) + { + if (addr == base) + { + FB_printf(&upper, AT(0,9+f), COL_BLACK, COL_LIGHTGREY, + "%s %4.4x: %2.2x", + addr_text[addr_type], + (unsigned)addr, + (unsigned)ZX81ReadDisassem(cpu, addr)); + } + else + { + FB_printf(&upper, AT(3,9+f), COL_BLACK, COL_TRANSPARENT, + "%4.4x: %2.2x", + (unsigned)addr, + (unsigned)ZX81ReadDisassem(cpu, addr)); + } + + addr++; + } + + FB_printf(&upper, AT(0,21), COL_BLACK, COL_TRANSPARENT, + "IFF1: %2.2x IFF2: %2.2x IM: %2.2x I:%2.2x R:%2.2x", + (unsigned)cpu->IFF1, + (unsigned)cpu->IFF2, + (unsigned)cpu->IM, + (unsigned)cpu->I, + (unsigned)cpu->R); + + FB_printf(&upper, AT(0,23), COL_BLACK, COL_TRANSPARENT, + "Flags: SZ5H3PNC"); + + FB_printf(&upper, AT(7,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Sign ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(8,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Zero ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(9,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Hidden5 ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(10,24), COL_BLACK, + cpu->AF.b.lo & eZ80_HalfCarry ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(11,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Hidden3 ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(12,24), COL_BLACK, + cpu->AF.b.lo & eZ80_PV ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(13,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Neg ? COL_GREEN : COL_RED, " "); + + FB_printf(&upper, AT(14,24), COL_BLACK, + cpu->AF.b.lo & eZ80_Carry ? COL_GREEN : COL_RED, " "); + + FB_EndFrame(); + + if (SK_KeyPressed(SK_PAD_X)) + { + Z80SingleStep(cpu); + } + + while(SK_GetBareEvent(&ev)) + { + if (ev.pressed) + { + switch(ev.key) + { + case SK_PAD_L: + if (addr_type == AddrPC) + { + addr_type = AddrIY; + } + else + { + addr_type--; + } + break; + + case SK_PAD_R: + addr_type = (addr_type + 1) % NumAddr; + break; + + case SK_PAD_START: + done = TRUE; + break; + + case SK_PAD_B: + Z80SingleStep(cpu); + break; + + default: + break; + } + } + } + } +} + +static void DebugMenu(Z80 *cpu) +{ + switch(GUI_Menu(debug_menu)) + { + case DebugMenuEnableOutput: + { + char host[32] = {0}; + char port[32] = {0}; + + debug_enabled = TRUE; + + GUI_Input("Enter host", host, 31); + GUI_Input("Enter port", port, 31); + + if (!host[0]) + { + strcpy(host, "192.168.0.77"); + } + + if (!port[0]) + { + strcpy(port, "12345"); + } + + DEBUG_SetAddress(host, port); + break; + } + + case DebugMenuDisableOutput: + debug_enabled = FALSE; + break; + + case DebugMenuDisassembler: + DebugDisassembler(cpu); + break; + + case DebugMenuMemoryView: + DebugMemory(cpu); + break; + + case DebugMenuCPUInfo: + DebugCPU(cpu); + break; + } +} + /* ---------------------------------------- MAIN */ int main(int argc, char *argv[]) @@ -417,6 +858,10 @@ int main(int argc, char *argv[]) ShowHelp(); break; + case MenuDebug: + DebugMenu(z80); + break; + case MenuExit: quit = TRUE; break; |