From: Toni Wilen Date: Sat, 16 Jan 2021 14:19:17 +0000 (+0200) Subject: fi debugger command assembler support X-Git-Tag: 4900~207 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=4d9cc628b8c0bd1f5b27b133cb9682a179a170a8;p=francis%2Fwinuae.git fi debugger command assembler support --- diff --git a/debug.cpp b/debug.cpp index 2ee5af1b..5a596326 100644 --- a/debug.cpp +++ b/debug.cpp @@ -114,15 +114,16 @@ void activate_debugger (void) if (isfullscreen() > 0) return; + if (debugger_active) { + // already in debugger but some break point triggered + // during disassembly etc.. + return; + } debugger_load_libraries(); inside_debugger = 1; debug_pc = 0xffffffff; trace_mode = 0; - if (debugger_active) { - write_log(_T("Debugger already active!?\n")); - return; - } debug_cycles(); debugger_active = 1; set_special (SPCFLAG_BRK); @@ -4811,19 +4812,33 @@ int instruction_breakpoint (TCHAR **c) } return 0; } else if (nc == 'I') { - next_char (c); + uae_u16 opcodes[32]; + next_char(c); + ignore_ws(c); trace_param[1] = 0x10000; trace_param[2] = 0x10000; - if (more_params(c)) { - trace_param[0] = readhex(c); - if (more_params(c)) { - trace_param[1] = readhex(c); + + int w = m68k_asm(*c, opcodes, 0); + if (w > 0) { + trace_param[0] = opcodes[0]; + if (w > 1) { + trace_param[1] = opcodes[1]; + if (w > 2) { + trace_param[2] = opcodes[2]; + } } + } else { if (more_params(c)) { - trace_param[2] = readhex(c); + trace_param[0] = readhex(c); + if (more_params(c)) { + trace_param[1] = readhex(c); + } + if (more_params(c)) { + trace_param[2] = readhex(c); + } + } else { + trace_param[0] = 0x10000; } - } else { - trace_param[0] = 0x10000; } trace_mode = TRACE_MATCH_INS; return 1; diff --git a/disasm.cpp b/disasm.cpp index 93471cad..19316e3f 100644 --- a/disasm.cpp +++ b/disasm.cpp @@ -897,8 +897,12 @@ static int asm_ispc(const TCHAR *s) static uae_u32 asmgetval(const TCHAR *s) { TCHAR *endptr; - if (s[0] == '-') + if (s[0] == '$') { + s++; + } + if (s[0] == '-') { return _tcstol(s, &endptr, 16); + } return _tcstoul(s, &endptr, 16); } @@ -996,7 +1000,10 @@ static int asm_parse_mode(TCHAR *s, uae_u8 *reg, uae_u32 *v, int *extcnt, uae_u1 startptr = s + 2; *v = _tcstol(startptr, &endptr, 10); } else { - startptr = s + 1; + if (s[1] == '$') + startptr = s + 2; + else + startptr = s + 1; *v = _tcstol(startptr, &endptr, 16); } if (endptr == startptr || endptr[0] != ',') @@ -1022,7 +1029,10 @@ static int asm_parse_mode(TCHAR *s, uae_u8 *reg, uae_u32 *v, int *extcnt, uae_u1 startptr = s + 2; *v = _tcstol(startptr, &endptr, 10); } else { - startptr = s + 1; + if (s[1] == '$') + startptr = s + 2; + else + startptr = s + 1; *v = _tcstol(startptr, &endptr, 16); } if (endptr == startptr || endptr[0] != ',') @@ -1684,8 +1694,29 @@ static uaecptr disasm_mmu030(uaecptr pc, uae_u16 opcode, uae_u16 extra, struct i return pc; } +static uae_u16 get_disasm_word(uaecptr pc, uae_u16 *bufpc, int bufpcsizep, int offset) +{ + offset /= 2; + if (bufpc) { + if (bufpcsizep > offset) { + return bufpc[offset]; + } + return 0; + } else { + return get_word_debug(pc + offset * 2); + } +} +static void add_disasm_word(uaecptr *pcp, uae_u16 **bufpcp, int *bufpcsizep, int add) +{ + if (*bufpcp) { + *bufpcp += add; + *bufpcsizep -= add; + } else { + *pcp += add; + } +} -uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode) +uae_u32 m68k_disasm_2(TCHAR *buf, int bufsize, uaecptr pc, uae_u16 *bufpc, int bufpcsize, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode) { uae_u32 seaddr2; uae_u32 deaddr2; @@ -1711,8 +1742,8 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int seaddr2 = deaddr2 = 0xffffffff; oldpc = pc; - opcode = get_word_debug (pc); - extra = get_word_debug (pc + 2); + opcode = get_disasm_word(pc, bufpc, bufpcsize, 0); + extra = get_disasm_word(pc, bufpc, bufpcsize, 2); if (cpufunctbl[opcode] == op_illg_1 || cpufunctbl[opcode] == op_unimpl_1) { m68kpc_illg = pc + 2; illegal = 1; @@ -1729,12 +1760,15 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int lastsegid = -1; bool exact = false; - if (lastpc != 0xffffffff) { - lastsegid = debugmem_get_segment(lastpc, NULL, NULL, NULL, NULL); - } - segid = debugmem_get_segment(pc, &exact, NULL, segout, segname); - if (segid && (lastsegid != -1 || exact) && (segid != lastsegid || pc == lastpc || exact)) { - buf = buf_out(buf, &bufsize, _T("%s\n"), segname); + segid = 0; + if (!bufpc) { + if (lastpc != 0xffffffff) { + lastsegid = debugmem_get_segment(lastpc, NULL, NULL, NULL, NULL); + } + segid = debugmem_get_segment(pc, &exact, NULL, segout, segname); + if (segid && (lastsegid != -1 || exact) && (segid != lastsegid || pc == lastpc || exact)) { + buf = buf_out(buf, &bufsize, _T("%s\n"), segname); + } } symbolpos = buf; @@ -1744,7 +1778,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int buf = buf_out(buf, &bufsize, _T("%s "), segout); } - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (lookup->friendlyname) _tcscpy (instrname, lookup->friendlyname); @@ -1790,7 +1824,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int int lvl = (currprefs.cpu_model - 68000) / 10; if (lvl == 6) lvl = 5; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (lvl < 1 || !(m2cregs[j].flags & (1 << (lvl - 1)))) illegal = -1; } else if (lookup->mnemo == i_CHK2) { @@ -1799,14 +1833,14 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int instrname[1] = 'M'; instrname[2] = 'P'; } - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &seaddr2, &actualea_src, safemode); p = instrname + _tcslen(instrname); _stprintf(p, (extra & 0x8000) ? _T(",A%d") : _T(",D%d"), (extra >> 12) & 7); } else if (lookup->mnemo == i_CAS) { TCHAR *p = instrname + _tcslen(instrname); _stprintf(p, _T("D%d,D%d,"), extra & 7, (extra >> 6) & 7); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &deaddr2, &actualea_dst, safemode); } else if (lookup->mnemo == i_CAS2) { TCHAR *p = instrname + _tcslen(instrname); @@ -1815,7 +1849,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int extra & 7, extra2 & 7, (extra >> 6) & 7, (extra2 >> 6) & 7, (extra & 0x8000) ? 'A' : 'D', (extra >> 12) & 7, (extra2 & 0x8000) ? 'A' : 'D', (extra2 >> 12) & 7); - pc += 4; + add_disasm_word(&pc, &bufpc, &bufpcsize, 4); } else if (lookup->mnemo == i_ORSR || lookup->mnemo == i_ANDSR || lookup->mnemo == i_EORSR) { pc = ShowEA(NULL, pc, opcode, dp->sreg, dp->smode, dp->size, instrname, &seaddr2, &actualea_src, safemode); _tcscat(instrname, dp->size == sz_byte ? _T(",CCR") : _T(",SR")); @@ -1833,19 +1867,19 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int pc = ShowEA(NULL, pc, opcode, dp->sreg, dp->smode, dp->size, instrname, &seaddr2, &actualea_src, safemode); } else if (lookup->mnemo == i_MVMEL) { uae_u16 mask = extra; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); pc = ShowEA (NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &seaddr2, &actualea_src, safemode); movemout (instrname, mask, dp->dmode, 0, true); } else if (lookup->mnemo == i_MVMLE) { uae_u16 mask = extra; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (movemout(instrname, mask, dp->dmode, 0, false)) _tcscat(instrname, _T(",")); pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &deaddr2, &actualea_dst, safemode); } else if (lookup->mnemo == i_DIVL || lookup->mnemo == i_MULL) { TCHAR *p; - extra = get_word_debug(pc); - pc += 2; + extra = get_disasm_word(pc, bufpc, bufpcsize, 0); + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (extra & 0x0800) // signed/unsigned instrname[3] = 'S'; else @@ -1866,7 +1900,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int _stprintf(p, _T(",D%d"), (extra >> 12) & 7); } else if (lookup->mnemo == i_MOVES) { TCHAR *p; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (!(extra & 0x0800)) { pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &deaddr2, &actualea_dst, safemode); p = instrname + _tcslen(instrname); @@ -1883,7 +1917,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int TCHAR *p; int reg = -1; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); p = instrname + _tcslen(instrname); if (lookup->mnemo == i_BFEXTS || lookup->mnemo == i_BFEXTU || lookup->mnemo == i_BFFFO || lookup->mnemo == i_BFINS) reg = (extra >> 12) & 7; @@ -1924,7 +1958,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int TCHAR *p = instrname + _tcslen(instrname); if (opcode & 0x20) { _stprintf(p, _T("(A%d)+,(A%d)+"), opcode & 7, (extra >> 12) & 7); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); } else { uae_u32 addr = get_long_debug(pc); int ay = opcode & 7; @@ -1951,30 +1985,30 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &deaddr2, &actualea_dst, safemode); extra = get_word_debug(pc); _stprintf(instrname + _tcslen(instrname), _T(",#$%04x"), extra); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); } else if (lookup->mnemo == i_LPSTOP) { if (extra == 0x01c0) { uae_u16 extra2 = get_word_debug(pc + 2); _stprintf(instrname, _T("LPSTOP #$%04x"), extra2); - pc += 4; + add_disasm_word(&pc, &bufpc, &bufpcsize, 4); } else { _stprintf(instrname, _T("ILLG #$%04x"), extra); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); } } else if (lookup->mnemo == i_CALLM) { TCHAR *p = instrname + _tcslen(instrname); _stprintf(p, _T("#%d,"), extra & 255); pc = ShowEA(NULL, pc, opcode, dp->sreg, dp->smode, dp->size, instrname, &seaddr2, &actualea_src, safemode); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); } else if (lookup->mnemo == i_FDBcc) { pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &seaddr2, &actualea_src, safemode); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); _tcscat(instrname, _T(",")); pc = ShowEA(NULL, pc, opcode, 0, imm1, sz_word, instrname, &deaddr2, &actualea_dst, safemode); } else if (lookup->mnemo == i_FTRAPcc) { pc = ShowEA(NULL, pc, opcode, dp->dreg, dp->dmode, dp->size, instrname, &seaddr2, &actualea_src, safemode); int mode = opcode & 7; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if (mode == 2) { pc = ShowEA(NULL, pc, opcode, 0, imm1, sz_word, instrname, NULL, NULL, safemode); } else if (mode == 3) { @@ -1985,7 +2019,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int int ins = extra & 0x7f; int size = (extra >> 10) & 7; - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); if ((extra & 0xfc00) == 0x5c00) { // FMOVECR (=i_FPP with source specifier = 7) fpdata fp; fpu_get_constant(&fp, extra & 0x7f); @@ -2076,7 +2110,7 @@ uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int } else { if (lookup->mnemo == i_FBcc && (opcode & 0x1f) == 0 && extra == 0) { _tcscpy(instrname, _T("FNOP")); - pc += 2; + add_disasm_word(&pc, &bufpc, &bufpcsize, 2); } else { if (dp->suse) { pc = ShowEA(NULL, pc, opcode, dp->sreg, dp->smode, dp->size, instrname, &seaddr2, &actualea_src, safemode); diff --git a/include/disasm.h b/include/disasm.h index 79808bb0..1744ed98 100644 --- a/include/disasm.h +++ b/include/disasm.h @@ -1,7 +1,8 @@ -uaecptr ShowEA (void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode, wordsizes size, TCHAR *buf, uae_u32 *eaddr, int *actualea, int safemode); + +uaecptr ShowEA(void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode, wordsizes size, TCHAR *buf, uae_u32 *eaddr, int *actualea, int safemode); uaecptr ShowEA_disp(uaecptr *pcp, uaecptr base, TCHAR *buffer, const TCHAR *name, bool pcrel); -uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr pc, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode); -void sm68k_disasm (TCHAR *instrname, TCHAR *instrcode, uaecptr addr, uaecptr *nextpc, uaecptr lastpc); +uae_u32 m68k_disasm_2(TCHAR *buf, int bufsize, uaecptr pc, uae_u16 *bufpc, int bufpccount, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode); +void sm68k_disasm(TCHAR *instrname, TCHAR *instrcode, uaecptr addr, uaecptr *nextpc, uaecptr lastpc); uae_u32 REGPARAM2 op_illg_1(uae_u32 opcode); uae_u32 REGPARAM2 op_unimpl_1(uae_u32 opcode); diff --git a/include/newcpu.h b/include/newcpu.h index 41fab0bd..75bb2cb2 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -667,7 +667,7 @@ extern void REGPARAM3 put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, extern void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc); extern void m68k_disasm (uaecptr addr, uaecptr *nextpc, uaecptr lastpc, int cnt); -extern uae_u32 m68k_disasm_2 (TCHAR *buf, int bufsize, uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode); +extern uae_u32 m68k_disasm_2(TCHAR *buf, int bufsize, uaecptr pc, uae_u16 *bufpc, int bufpccount, uaecptr *nextpc, int cnt, uae_u32 *seaddr, uae_u32 *deaddr, uaecptr lastpc, int safemode); extern void sm68k_disasm (TCHAR*, TCHAR*, uaecptr addr, uaecptr *nextpc, uaecptr lastpc); extern int m68k_asm(TCHAR *buf, uae_u16 *out, uaecptr pc); extern uaecptr ShowEA(void *f, uaecptr pc, uae_u16 opcode, int reg, amodes mode, wordsizes size, TCHAR *buf, uae_u32 *eaddr, int *actualea, int safemode); diff --git a/newcpu.cpp b/newcpu.cpp index 20bc6ecf..f6164ab4 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -5416,7 +5416,7 @@ static void opcodedebug (uae_u32 pc, uae_u16 opcode, bool full) TCHAR buf[100]; if (full) write_log (_T("mmufixup=%d %04x %04x\n"), mmufixup[0].reg, regs.wb3_status, regs.mmu_ssw); - m68k_disasm_2 (buf, sizeof buf / sizeof (TCHAR), addr, NULL, 1, NULL, NULL, 0xffffffff, 0); + m68k_disasm_2(buf, sizeof buf / sizeof (TCHAR), addr, NULL, 0, NULL, 1, NULL, NULL, 0xffffffff, 0); write_log (_T("%s\n"), buf); if (full) m68k_dumpstate(NULL, 0xffffffff); @@ -6461,7 +6461,7 @@ void m68k_disasm_ea (uaecptr addr, uaecptr *nextpc, int cnt, uae_u32 *seaddr, ua buf = xcalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); if (!buf) return; - m68k_disasm_2 (buf, MAX_LINEWIDTH * cnt, addr, nextpc, cnt, seaddr, deaddr, lastpc, 1); + m68k_disasm_2(buf, MAX_LINEWIDTH * cnt, addr, NULL, 0, nextpc, cnt, seaddr, deaddr, lastpc, 1); xfree (buf); } void m68k_disasm (uaecptr addr, uaecptr *nextpc, uaecptr lastpc, int cnt) @@ -6471,7 +6471,7 @@ void m68k_disasm (uaecptr addr, uaecptr *nextpc, uaecptr lastpc, int cnt) buf = xcalloc (TCHAR, (MAX_LINEWIDTH + 1) * cnt); if (!buf) return; - m68k_disasm_2 (buf, MAX_LINEWIDTH * cnt, addr, nextpc, cnt, NULL, NULL, lastpc, 0); + m68k_disasm_2(buf, MAX_LINEWIDTH * cnt, addr, NULL, 0, nextpc, cnt, NULL, NULL, lastpc, 0); console_out_f (_T("%s"), buf); xfree (buf); } diff --git a/od-win32/debug_win32.cpp b/od-win32/debug_win32.cpp index b9b87e8f..3a6fa907 100644 --- a/od-win32/debug_win32.cpp +++ b/od-win32/debug_win32.cpp @@ -519,7 +519,7 @@ static void ShowBreakpoints(void) for (i = 0; i < BREAKPOINT_TOTAL; i++) { if (!bpnodes[i].enabled) continue; - m68k_disasm_2(outbp, sizeof outbp / sizeof (TCHAR), bpnodes[i].value1, NULL, 1, NULL, NULL, 0xffffffff, 0); + m68k_disasm_2(outbp, sizeof outbp / sizeof (TCHAR), bpnodes[i].value1, NULL, 0, NULL, 1, NULL, NULL, 0xffffffff, 0); ULBS(outbp); got = 1; } @@ -575,7 +575,7 @@ static int GetPrevAddr(uae_u32 addr, uae_u32 *prevaddr) dasmaddr = addr - 20; while (dasmaddr < addr) { next = dasmaddr + 2; - m68k_disasm_2(NULL, 0, dasmaddr, &next, 1, NULL, NULL, 0xffffffff, 0); + m68k_disasm_2(NULL, 0, dasmaddr, NULL, 0, &next, 1, NULL, NULL, 0xffffffff, 0); if (next == addr) { *prevaddr = dasmaddr; return 1; @@ -607,7 +607,7 @@ static void ShowDasm(int direction) else addr = dbgpage[currpage].dasmaddr; if (direction > 0) { - m68k_disasm_2(NULL, 0, addr, &addr, 1, NULL, NULL, 0xffffffff, 0); + m68k_disasm_2(NULL, 0, addr, NULL, 0, &addr, 1, NULL, NULL, 0xffffffff, 0); if (!addr || addr < dbgpage[currpage].dasmaddr) addr = dbgpage[currpage].dasmaddr; } @@ -621,7 +621,7 @@ static void ShowDasm(int direction) lines_old = SendMessage(hDasm, LB_GETCOUNT, 0, 0); lines_new = GetLBOutputLines(hDasm); for (i = 0; i < lines_new; i++) { - m68k_disasm_2(out, sizeof out / sizeof (TCHAR), addr, &addr, 1, NULL, NULL, 0xffffffff, 0); + m68k_disasm_2(out, sizeof out / sizeof (TCHAR), addr, NULL, 0, &addr, 1, NULL, NULL, 0xffffffff, 0); if (addr > dbgpage[currpage].dasmaddr) UpdateListboxString(hDasm, i, out, FALSE); else