From a85d668f2f25d20c59752821a565451f22c8ee04 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Sat, 10 Jul 2021 22:13:38 -0400 Subject: [PATCH] Added a tool tip for getting operand address information to Qt debugger. --- src/drivers/Qt/ConsoleDebugger.cpp | 89 +++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index 3e84e7fc..d7cddfb5 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -4032,9 +4032,11 @@ bool QAsmView::event(QEvent *event) { if (event->type() == QEvent::ToolTip) { - int line; + int i,j, line, addr = 0; QHelpEvent *helpEvent = static_cast(event); bool opcodeValid = false, showOpcodeDesc = false, showSymHexDecode = false; + bool showAddrDesc = false, showOperandAddrDesc = false; + char stmp[256]; QPoint c = convPixToCursor(helpEvent->pos()); @@ -4045,6 +4047,8 @@ bool QAsmView::event(QEvent *event) showOpcodeDesc = (c.x() >= opcodeLinePos) && (c.x() < operandLinePos) && opcodeValid; + showAddrDesc = (c.x() >= pcLocLinePos) && (c.x() < byteCodeLinePos) && opcodeValid; + if ( (c.x() > operandLinePos) && opcodeValid && (asmEntry[line]->sym.name.size() > 0) ) { size_t subStrLoc = asmEntry[line]->text.find( asmEntry[line]->sym.name, operandLinePos ); @@ -4062,6 +4066,51 @@ bool QAsmView::event(QEvent *event) } } + if ( (c.x() > operandLinePos) && opcodeValid ) + { + i = c.x(); + + if ( isxdigit( asmEntry[line]->text[i] ) ) + { + int addrClicked = 1; + int addrTextLoc = i; + + while ( isxdigit( asmEntry[line]->text[i] ) ) + { + addrTextLoc = i; + i--; + } + if ( asmEntry[line]->text[i] == '$' || asmEntry[line]->text[i] == ':' ) + { + i--; + } + else + { + addrClicked = 0; + } + if ( asmEntry[line]->text[i] == '#' ) + { + addrClicked = 0; + } + if ( addrClicked ) + { + j=0; i = addrTextLoc; + + while ( isxdigit( asmEntry[line]->text[i] ) ) + { + stmp[j] = asmEntry[line]->text[i]; i++; j++; + } + stmp[j] = 0; + + //printf("Addr: '%s'\n", stmp ); + + addr = strtol( stmp, NULL, 16 ); + + showOperandAddrDesc = true; + } + } + } + if ( showOpcodeDesc ) { QString qs = fceuGetOpcodeToolTip(asmEntry[line]->opcode, asmEntry[line]->size ); @@ -4071,12 +4120,46 @@ bool QAsmView::event(QEvent *event) } else if ( showSymHexDecode ) { - char stmp[64]; - sprintf( stmp, "$%04X", asmEntry[line]->sym.ofs ); QToolTip::showText(helpEvent->globalPos(), tr(stmp), this ); } + else if ( showAddrDesc ) + { + if ( asmEntry[line]->bank < 0 ) + { + sprintf( stmp, "ADDR:\t$%04X", asmEntry[line]->sym.ofs ); + } + else + { + sprintf( stmp, "ADDR:\t$%04X\nBANK:\t$%02X\nROM:\t$%06X", + asmEntry[line]->sym.ofs, asmEntry[line]->bank, asmEntry[line]->rom ); + } + + QToolTip::showText(helpEvent->globalPos(), tr(stmp), this ); + } + else if ( showOperandAddrDesc ) + { + int bank = -1, romOfs = -1; + + if (addr >= 0x8000) + { + bank = getBank(addr); + romOfs = GetNesFileAddress(addr); + } + + if ( bank < 0 ) + { + sprintf( stmp, "ADDR:\t$%04X", addr ); + } + else + { + sprintf( stmp, "ADDR:\t$%04X\nBANK:\t$%02X\nROM:\t$%06X", + addr, bank, romOfs ); + } + + QToolTip::showText(helpEvent->globalPos(), tr(stmp), this ); + } else { QToolTip::hideText();