diff --git a/include/debug.h b/include/debug.h index 74eda58..0d7e976 100644 --- a/include/debug.h +++ b/include/debug.h @@ -12,6 +12,7 @@ typedef struct { u16 dissasembly_scroll; u16 dissasembly_target; u16 dissasembly_pc; + u16 breakpoint; } debug_context; void debug_update(); diff --git a/lib/bus.c b/lib/bus.c index d314ad0..92cc358 100644 --- a/lib/bus.c +++ b/lib/bus.c @@ -76,6 +76,7 @@ void bus_write(u16 address, u8 value) { return; } else if (address < 0xFE00) { //reserved echo ram... + wram_write((address & 0x1FFF) | 0xC000, value); return; } else if (address < 0xFEA0) { //OAM diff --git a/lib/cpu.c b/lib/cpu.c index 1045c7d..1017ffb 100644 --- a/lib/cpu.c +++ b/lib/cpu.c @@ -6,6 +6,7 @@ #include #include #include +#include static cpu_context ctx = {0}; #define CPU_DEBUG 1 @@ -68,12 +69,17 @@ bool cpu_step() { ); #endif fetch_data(&ctx); + if(debug_get_context()->breakpoint && pc == debug_get_context()->breakpoint) { + emu_get_context()->paused = true; + emu_get_context()->debug = true; + debug_get_context()->state = DS_DISASSEMBLE; + } while(emu_get_context()->paused && !emu_get_context()->step) delay(10); if(emu_get_context()->paused) { emu_get_context()->step--; if(emu_get_context()->step == 0) { - printf("debug!\n"); + //printf("debug!\n"); emu_get_context()->debug = true; } } diff --git a/lib/debug.c b/lib/debug.c index aff90a7..df9d246 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -51,16 +51,13 @@ void debug_update() { } else if(!strcmp(cmd, "da")) { scanf("%d", &ctx.dissasembly_target); ctx.state = DS_DISASSEMBLE; - } else if(!strcmp(cmd, "du")) { - ctx.dissasembly_target--; - ctx.state = DS_DISASSEMBLE; - } else if(!strcmp(cmd, "dd")) { - scanf("%d", &ctx.dissasembly_target); - ctx.state = DS_DISASSEMBLE; + } else if(cmd[0] == 'b' && cmd[1] == 'p') { + scanf("%X", &ctx.breakpoint); + //printf("Set breakpoint to %04X\n", ctx.breakpoint); } else if(cmd[0] == 's') { int steps; scanf("%d", &steps); - printf("adding %d steps\n", steps); + //printf("adding %d steps\n", steps); emu_get_context()->step += steps; emu_get_context()->debug = false; } @@ -73,7 +70,7 @@ void debug_update() { fetch_instruction(&cpu_ctx); fetch_data(&cpu_ctx); char inst[16]; - inst_to_str(cpu_get_context(), inst); + inst_to_str(&cpu_ctx, inst); sprintf(dissasembly[i], "%04X: %s", pc, inst); if(pc == cpu_get_context()->inst_pc) { ctx.dissasembly_scroll = i - 5; diff --git a/lib/emu.c b/lib/emu.c index f08097c..a47916f 100644 --- a/lib/emu.c +++ b/lib/emu.c @@ -132,6 +132,8 @@ int emu_run(int argc, char **argv) { } void emu_cycles(int cpu_cycles) { + if(emu_get_context()->paused && !emu_get_context()->step) + return; for (int i = 0; i < cpu_cycles; i++){ for(int n = 0; n < 4; n++){ ctx.ticks++;