From 242620b782356f1b5a6bbdd79df5d4edbf878122 Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Thu, 12 Nov 2020 20:48:52 -0500 Subject: [PATCH] Added logic to allow for symbol names to be clicked in Qt debugger ASM viewer. --- src/drivers/Qt/ConsoleDebugger.cpp | 38 ++++++++++-- src/drivers/Qt/ConsoleDebugger.h | 1 + src/drivers/Qt/SymbolicDebug.cpp | 98 ++++++++++++++++++++++-------- src/drivers/Qt/SymbolicDebug.h | 8 ++- 4 files changed, 110 insertions(+), 35 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index f44f0937..8aa2deb0 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -1944,7 +1944,7 @@ void QAsmView::updateAssemblyView(void) size++; } - DisassembleWithDebug(addr, opcode, asmFlags, asmTxt); + DisassembleWithDebug(addr, opcode, asmFlags, asmTxt, &a->sym); line.append( asmTxt ); } @@ -3087,6 +3087,7 @@ void QAsmView::mousePressEvent(QMouseEvent * event) if ( line < asmEntry.size() ) { int i,j, addr = -1, addrTextLoc = -1, selChar; + int symTextStart = -1, symTextEnd = -1; char addrClicked = 0; char stmp[64]; @@ -3096,9 +3097,36 @@ void QAsmView::mousePressEvent(QMouseEvent * event) { if ( selChar < (int)asmEntry[line]->text.size() ) { + i = selChar; - if ( isxdigit( asmEntry[line]->text[i] ) ) + if ( asmEntry[line]->sym.name.size() > 0 ) + { + size_t subStrLoc = asmEntry[line]->text.find( asmEntry[line]->sym.name, 22 ); + + if ( (subStrLoc != std::string::npos) && (subStrLoc > 22) ) + { + //printf("Line:%i asmEntry DB Sym: %zi '%s'\n", line, subStrLoc, asmEntry[line]->sym.name.c_str() ); + symTextStart = subStrLoc; + symTextEnd = subStrLoc + asmEntry[line]->sym.name.size(); + } + } + + if ( (i >= symTextStart) && (i < symTextEnd) ) + { + selAddrLine = line; + selAddrChar = symTextStart; + selAddrWidth = symTextEnd - symTextStart; + selAddrValue = addr = asmEntry[line]->sym.ofs; + + if ( selAddrWidth >= (int)sizeof(selAddrText) ) + { + selAddrWidth = sizeof(selAddrText)-1; + } + strncpy( selAddrText, asmEntry[line]->sym.name.c_str(), selAddrWidth ); + selAddrText[ selAddrWidth ] = 0; + } + else if ( isxdigit( asmEntry[line]->text[i] ) ) { addrClicked = 1; addrTextLoc = i; @@ -3157,12 +3185,12 @@ void QAsmView::mousePressEvent(QMouseEvent * event) { selAddrWidth = 0; } - if ( selAddrWidth > (int)sizeof(selAddrText) ) + if ( selAddrWidth >= (int)sizeof(selAddrText) ) { - selAddrWidth = sizeof(selAddrText); + selAddrWidth = sizeof(selAddrText)-1; } strncpy( selAddrText, asmEntry[line]->text.c_str(), selAddrWidth ); - selAddrText[ sizeof(selAddrText)-1 ] = 0; + selAddrText[ selAddrWidth ] = 0; } if ( addr < 0 ) diff --git a/src/drivers/Qt/ConsoleDebugger.h b/src/drivers/Qt/ConsoleDebugger.h index 6aa00b14..d7c99d75 100644 --- a/src/drivers/Qt/ConsoleDebugger.h +++ b/src/drivers/Qt/ConsoleDebugger.h @@ -37,6 +37,7 @@ struct dbg_asm_entry_t int line; uint8 opcode[3]; std::string text; + debugSymbol_t sym; enum { diff --git a/src/drivers/Qt/SymbolicDebug.cpp b/src/drivers/Qt/SymbolicDebug.cpp index f028e43f..8e78ac35 100644 --- a/src/drivers/Qt/SymbolicDebug.cpp +++ b/src/drivers/Qt/SymbolicDebug.cpp @@ -616,7 +616,7 @@ void debugSymbolTable_t::print(void) } } //-------------------------------------------------------------- -static int replaceSymbols( int flags, int addr, char *str ) +debugSymbol_t *replaceSymbols( int flags, int addr, char *str ) { debugSymbol_t *sym; @@ -638,22 +638,45 @@ static int replaceSymbols( int flags, int addr, char *str ) if ( sym ) { - strcpy( str, sym->name.c_str() ); + if ( flags & ASM_DEBUG_REPLACE ) + { + strcpy( str, sym->name.c_str() ); + } + else + { + if ( flags & ASM_DEBUG_ADDR_02X ) + { + sprintf( str, "%02X ", addr ); + } + else + { + sprintf( str, "%04X ", addr ); + } + strcat( str, sym->name.c_str() ); + } } else { - //sprintf( str, "%04X", addr ); - str[0] = 0; + if ( flags & ASM_DEBUG_ADDR_02X ) + { + sprintf( str, "%02X", addr ); + } + else + { + sprintf( str, "%04X", addr ); + } } - return 0; + return sym; } //-------------------------------------------------------------- -int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) +int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str, debugSymbol_t *symOut, debugSymbol_t *symOut2 ) { + debugSymbol_t *sym = NULL; + debugSymbol_t *sym2 = NULL; static char chr[8]={0}; uint16_t tmp,tmp2; - char stmp[128]; + char stmp[128], stmp2[128]; //these may be replaced later with passed-in values to make a lighter-weight disassembly mode that may not query the referenced values #define RX (X.X) @@ -733,8 +756,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s ($%02X,X) @ $%04X %s = #$%02X", chr,opcode[1],tmp,stmp,GetMem(tmp)); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s ($%02X,X) @ $%s = #$%02X", chr,opcode[1],stmp,GetMem(tmp)); } else { @@ -769,8 +792,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) // Change width to %04X // don't! if ( flags ) { - replaceSymbols( flags, opcode[1], stmp ); - sprintf(str,"%s $%02X %s = #$%02X", chr,opcode[1],stmp,GetMem(opcode[1])); + sym = replaceSymbols( flags | ASM_DEBUG_ADDR_02X, opcode[1], stmp ); + sprintf(str,"%s $%s = #$%02X", chr,stmp,GetMem(opcode[1])); } else { @@ -823,8 +846,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s $%04X %s = #$%02X", chr,tmp,stmp,GetMem(tmp)); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s $%s = #$%02X", chr,stmp,GetMem(tmp)); } else { @@ -846,8 +869,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s $%04X %s", chr,tmp,stmp); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s $%s", chr,stmp); } else { @@ -869,8 +892,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s ($%02X),Y @ $%04X %s = #$%02X", chr,opcode[1],tmp,stmp,GetMem(tmp)); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s ($%02X),Y @ $%s = #$%02X", chr,opcode[1],stmp,GetMem(tmp)); } else { @@ -901,8 +924,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) // Change width to %04X // don't! if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s $%02X,X @ $%04X %s = #$%02X", chr,opcode[1],tmp,stmp,GetMem(tmp)); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s $%02X,X @ $%s = #$%02X", chr,opcode[1],stmp,GetMem(tmp)); } else { @@ -926,8 +949,9 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) tmp2=(tmp+RY); if ( flags ) { - replaceSymbols( flags, tmp2, stmp ); - sprintf(str,"%s $%04X,Y @ $%04X %s = #$%02X", chr,tmp,tmp2,stmp,GetMem(tmp2)); + sym = replaceSymbols( flags, tmp , stmp ); + sym2 = replaceSymbols( flags, tmp2, stmp2 ); + sprintf(str,"%s $%s,Y @ $%s = #$%02X", chr,stmp,stmp2,GetMem(tmp2)); } else { @@ -956,8 +980,9 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) tmp2=(tmp+RX); if ( flags ) { - replaceSymbols( flags, tmp2, stmp ); - sprintf(str,"%s $%04X,X @ $%04X %s = #$%02X", chr,tmp,tmp2,stmp,GetMem(tmp2)); + sym = replaceSymbols( flags, tmp , stmp ); + sym2 = replaceSymbols( flags, tmp2, stmp2 ); + sprintf(str,"%s $%s,X @ $%s = #$%02X", chr,stmp,stmp2,GetMem(tmp2)); } else { @@ -974,8 +999,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s $%04X %s", chr,tmp,stmp); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s $%s", chr,stmp); } else { @@ -992,8 +1017,8 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) // Change width to %04X // don't! if ( flags ) { - replaceSymbols( flags, tmp, stmp ); - sprintf(str,"%s $%02X,Y @ $%04X %s = #$%02X", chr,opcode[1],tmp,stmp,GetMem(tmp)); + sym = replaceSymbols( flags, tmp, stmp ); + sprintf(str,"%s $%02X,Y @ $%s = #$%02X", chr,opcode[1],stmp,GetMem(tmp)); } else { @@ -1007,6 +1032,25 @@ int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ) } + if ( symOut ) + { + if ( sym ) + { + *symOut = *sym; + } + else if ( sym2 ) + { + *symOut = *sym2; sym2 = NULL; + } + } + if ( symOut2 ) + { + if ( sym2 ) + { + *symOut2 = *sym2; + } + } + return 0; } //-------------------------------------------------------------- diff --git a/src/drivers/Qt/SymbolicDebug.h b/src/drivers/Qt/SymbolicDebug.h index 32083854..f4fb526c 100644 --- a/src/drivers/Qt/SymbolicDebug.h +++ b/src/drivers/Qt/SymbolicDebug.h @@ -112,9 +112,11 @@ extern debugSymbolTable_t debugSymbolTable; int generateNLFilenameForBank(int bank, char *NLfilename); int generateNLFilenameForAddress(int address, char *NLfilename); -#define ASM_DEBUG_SYMS 0x0001 -#define ASM_DEBUG_REGS 0x0002 +#define ASM_DEBUG_SYMS 0x0001 +#define ASM_DEBUG_REGS 0x0002 +#define ASM_DEBUG_REPLACE 0x0004 +#define ASM_DEBUG_ADDR_02X 0x0008 -int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str ); +int DisassembleWithDebug(int addr, uint8_t *opcode, int flags, char *str, debugSymbol_t *symOut = NULL, debugSymbol_t *symOut2 = NULL ); #endif