Mercurial > repos > blastem
diff debug.c @ 1931:374a5ae694e8 mame_interp
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 18 Apr 2020 11:42:53 -0700 |
parents | 0a26f3657295 23394a890508 |
children | a7b753e260a2 |
line wrap: on
line diff
--- a/debug.c Thu Apr 18 22:06:47 2019 -0700 +++ b/debug.c Sat Apr 18 11:42:53 2020 -0700 @@ -11,7 +11,7 @@ #include "terminal.h" #include "z80inst.h" -#ifndef USE_NATIVE +#ifdef NEW_CORE #define Z80_OPTS opts #else #define Z80_OPTS options @@ -105,7 +105,7 @@ return m68k_read_word(address, context) << 16 | m68k_read_word(address + 2, context); } -void debugger_print(m68k_context *context, char format_char, char *param) +void debugger_print(m68k_context *context, char format_char, char *param, uint32_t address) { uint32_t value; char format[8]; @@ -141,7 +141,7 @@ value &= 0xFF; } } - } else if (param[0] == 'S' && param[1] == 'R') { + } else if (param[0] == 's' && param[1] == 'r') { value = (context->status << 8); for (int flag = 0; flag < 5; flag++) { value |= context->flags[flag] << (4-flag); @@ -151,6 +151,8 @@ } else if(param[0] == 'f') { genesis_context *gen = context->system; value = gen->vdp->frame; + } else if (param[0] == 'p' && param[1] == 'c') { + value = address; } else if ((param[0] == '0' && param[1] == 'x') || param[0] == '$') { char *after; uint32_t p_addr = strtol(param+(param[0] == '0' ? 2 : 1), &after, 16); @@ -197,7 +199,7 @@ } switch (param[0]) { -#ifdef USE_NATIVE +#ifndef NEW_CORE case 'a': if (param[1] == 'f') { if(param[2] == '\'') { @@ -348,22 +350,7 @@ case '0': if (param[1] == 'x') { uint16_t p_addr = strtol(param+2, NULL, 16); - if (p_addr < 0x4000) { - value = system->zram[p_addr & 0x1FFF]; - } else if(p_addr >= 0x8000) { - uint32_t v_addr = system->z80_bank_reg << 15; - v_addr += p_addr & 0x7FFF; - if (v_addr < 0x400000) { - value = system->cart[v_addr/2]; - } else if(v_addr > 0xE00000) { - value = system->work_ram[(v_addr & 0xFFFF)/2]; - } - if (v_addr & 1) { - value &= 0xFF; - } else { - value >>= 8; - } - } + value = read_byte(p_addr, (void **)context->mem_pointers, &context->options->gen, context); } break; } @@ -496,7 +483,7 @@ if (inst.addr_mode == Z80_IMMED) { after = inst.immed; } else if (inst.ea_reg == Z80_HL) { -#ifdef USE_NATIVE +#ifndef NEW_CORE after = context->regs[Z80_H] << 8 | context->regs[Z80_L]; } else if (inst.ea_reg == Z80_IX) { after = context->regs[Z80_IXH] << 8 | context->regs[Z80_IXL]; @@ -567,12 +554,15 @@ } break; } + case '?': + print_z80_help(); + break; default: if ( !context->Z80_OPTS->gen.debug_cmd_handler || !context->Z80_OPTS->gen.debug_cmd_handler(&system->header, input_buf) ) { - fprintf(stderr, "Unrecognized debugger command %s\n", input_buf); + fprintf(stderr, "Unrecognized debugger command %s\nUse '?' for help.\n", input_buf); } break; } @@ -585,7 +575,7 @@ static uint32_t branch_t; static uint32_t branch_f; -int run_debugger_command(m68k_context *context, char *input_buf, m68kinst inst, uint32_t after) +int run_debugger_command(m68k_context *context, uint32_t address, char *input_buf, m68kinst inst, uint32_t after) { char * param; char format_char; @@ -703,7 +693,7 @@ fputs("display command requires a parameter\n", stderr); break; } - debugger_print(context, format_char, param); + debugger_print(context, format_char, param, address); add_display(&displays, &disp_index, format_char, param); } else { param = find_param(input_buf); @@ -734,11 +724,13 @@ } } param = find_param(input_buf); - if (!param) { - fputs("p command requires a parameter\n", stderr); - break; + if (param) { + debugger_print(context, format_char, param, address); + } else { + m68k_disasm(&inst, input_buf); + printf("%X: %s\n", address, input_buf); } - debugger_print(context, format_char, param); + break; case 'n': if (inst.op == M68K_RTS) { @@ -802,10 +794,12 @@ param = find_param(input_buf); if (!param) { fputs("Missing destination parameter for set\n", stderr); + return 1; } char *val = find_param(param); if (!val) { fputs("Missing value parameter for set\n", stderr); + return 1; } long int_val; int reg_num; @@ -846,6 +840,9 @@ fprintf(stderr, "Invalid destinatino %s\n", param); } break; + } else if (input_buf[1] == 'r') { + system->header.soft_reset(&system->header); + return 0; } else { if (inst.op == M68K_RTS) { after = m68k_read_long(context->aregs[7], context); @@ -940,17 +937,62 @@ break; } #endif + case '?': + print_m68k_help(); + break; case 'q': puts("Quitting"); exit(0); break; default: - fprintf(stderr, "Unrecognized debugger command %s\n", input_buf); + fprintf(stderr, "Unrecognized debugger command %s\nUse '?' for help.\n", input_buf); break; } return 1; } +void print_m68k_help() +{ + printf("M68k Debugger Commands\n"); + printf(" b ADDRESS - Set a breakpoint at ADDRESS\n"); + printf(" d BREAKPOINT - Delete a 68K breakpoint\n"); + printf(" co BREAKPOINT - Run a list of debugger commands each time\n"); + printf(" BREAKPOINT is hit\n"); + printf(" a ADDRESS - Advance to address\n"); + printf(" n - Advance to next instruction\n"); + printf(" o - Advance to next instruction ignoring branches to\n"); + printf(" lower addresses (good for breaking out of loops)\n"); + printf(" s - Advance to next instruction (follows bsr/jsr)\n"); + printf(" se REG|ADDRESS VALUE - Set value\n"); + printf(" sr - Soft reset\n"); + printf(" c - Continue\n"); + printf(" bt - Print a backtrace\n"); + printf(" p[/(x|X|d|c)] VALUE - Print a register or memory location\n"); + printf(" di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n"); + printf(" a breakpoint is hit\n"); + printf(" vs - Print VDP sprite list\n"); + printf(" vr - Print VDP register info\n"); + printf(" yc [CHANNEL NUM] - Print YM-2612 channel info\n"); + printf(" yt - Print YM-2612 timer info\n"); + printf(" zb ADDRESS - Set a Z80 breakpoint\n"); + printf(" zp[/(x|X|d|c)] VALUE - Display a Z80 value\n"); + printf(" ? - Display help\n"); + printf(" q - Quit BlastEm\n"); +} + +void print_z80_help() +{ + printf("Z80 Debugger Commands\n"); + printf(" b ADDRESS - Set a breakpoint at ADDRESS\n"); + printf(" de BREAKPOINT - Delete a Z80 breakpoint\n"); + printf(" a ADDRESS - Advance to address\n"); + printf(" n - Advance to next instruction\n"); + printf(" c - Continue\n"); + printf(" p[/(x|X|d|c)] VALUE - Print a register or memory location\n"); + printf(" di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n"); + printf(" a breakpoint is hit\n"); + printf(" q - Quit BlastEm\n"); +} void debugger(m68k_context * context, uint32_t address) { @@ -1000,7 +1042,7 @@ char *cmd = commands; strip_nl(cmd); commands += strlen(cmd) + 1; - debugging = run_debugger_command(context, cmd, inst, after); + debugging = run_debugger_command(context, address, cmd, inst, after); } free(copy); } @@ -1013,7 +1055,7 @@ remove_breakpoint(context, address); } for (disp_def * cur = displays; cur; cur = cur->next) { - debugger_print(context, cur->format_char, cur->param); + debugger_print(context, cur->format_char, cur->param, address); } m68k_disasm(&inst, input_buf); printf("%X: %s\n", address, input_buf); @@ -1053,7 +1095,7 @@ } else { strcpy(input_buf, last_cmd); } - debugging = run_debugger_command(context, input_buf, inst, after); + debugging = run_debugger_command(context, address, input_buf, inst, after); } return; }