From 3023ab7d5018bcd6ed983f95ccdd39c4b397f29e Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Mon, 9 Nov 2020 20:02:06 -0500 Subject: [PATCH] Changed Qt debugger asssembly window address selection logic to allow for any valid hex address on the display to be selected. Previously was only allowing the instruction address at the beginning of the line to be selected. --- src/drivers/Qt/ConsoleDebugger.cpp | 94 +++++++++++++++++++++++++----- src/drivers/Qt/ConsoleDebugger.h | 6 ++ 2 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/drivers/Qt/ConsoleDebugger.cpp b/src/drivers/Qt/ConsoleDebugger.cpp index 970ab2df..68f36d6c 100644 --- a/src/drivers/Qt/ConsoleDebugger.cpp +++ b/src/drivers/Qt/ConsoleDebugger.cpp @@ -2811,6 +2811,12 @@ QAsmView::QAsmView(QWidget *parent) maxLineOffset = 0; ctxMenuAddr = -1; + selAddrLine = -1; + selAddrChar = 0; + selAddrWidth = 0; + selAddrValue = -1; + memset( selAddrText, 0, sizeof(selAddrText) ); + //setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Expanding ); setFocusPolicy(Qt::StrongFocus); } @@ -3047,11 +3053,68 @@ void QAsmView::mousePressEvent(QMouseEvent * event) if ( line < asmEntry.size() ) { - int addr; + int i,j, addr = -1, addrTextLoc = -1, selChar; + char addrClicked = 0; + char stmp[64]; - addr = asmEntry[line]->addr; + selChar = c.x(); + + if ( selChar < (int)asmEntry[line]->text.size() ) + { + i = selChar; + + if ( isxdigit( asmEntry[line]->text[i] ) ) + { + addrClicked = 1; + 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 ); + + selAddrLine = line; + selAddrChar = addrTextLoc; + selAddrWidth = j; + selAddrValue = addr; + strcpy( selAddrText, stmp ); + } + } + } + + //printf("Line: '%s'\n", asmEntry[line]->text.c_str() ); + + if ( addr >= 0 ) + { + parent->setBookmarkSelectedAddress( addr ); + } - parent->setBookmarkSelectedAddress( addr ); } } //---------------------------------------------------------------------------- @@ -3070,7 +3133,14 @@ void QAsmView::contextMenuEvent(QContextMenuEvent *event) { int addr; - ctxMenuAddr = addr = asmEntry[line]->addr; + if ( selAddrValue < 0 ) + { + ctxMenuAddr = addr = asmEntry[line]->addr; + } + else + { + ctxMenuAddr = addr = selAddrValue; + } act = new QAction(tr("Add Breakpoint"), &menu); menu.addAction(act); @@ -3168,22 +3238,20 @@ void QAsmView::paintEvent(QPaintEvent *event) } painter.drawText( x, y, tr(asmEntry[l]->text.c_str()) ); - if ( selAddr == asmEntry[l]->addr ) + if ( (selAddrLine == l) ) { // Highlight ASM line for selected address. - if ( !displayROMoffsets && (asmEntry[l]->type == dbg_asm_entry_t::ASM_TEXT) ) + if ( (selAddr == selAddrValue) && (asmEntry[l]->type == dbg_asm_entry_t::ASM_TEXT) && + ( asmEntry[l]->text.compare( selAddrChar, selAddrWidth, selAddrText ) == 0 ) ) { int ax; - char addrString[16]; - ax = 4*pxCharWidth; + ax = selAddrChar*pxCharWidth; - painter.fillRect( ax, y - pxLineSpacing + pxLineLead, 4*pxCharWidth, pxLineSpacing, QColor("blue") ); + painter.fillRect( ax, y - pxLineSpacing + pxLineLead, selAddrWidth*pxCharWidth, pxLineSpacing, QColor("blue") ); - sprintf( addrString, "%04X", selAddr ); + painter.setPen( QColor("white")); - painter.setPen( this->palette().color(QPalette::Background)); - - painter.drawText( ax, y, tr(addrString) ); + painter.drawText( ax, y, tr(selAddrText) ); painter.setPen( this->palette().color(QPalette::WindowText)); } diff --git a/src/drivers/Qt/ConsoleDebugger.h b/src/drivers/Qt/ConsoleDebugger.h index 3e5e97e4..112fbcc7 100644 --- a/src/drivers/Qt/ConsoleDebugger.h +++ b/src/drivers/Qt/ConsoleDebugger.h @@ -145,6 +145,12 @@ class QAsmView : public QWidget int cursorPosX; int cursorPosY; + int selAddrLine; + int selAddrChar; + int selAddrWidth; + int selAddrValue; + char selAddrText[16]; + dbg_asm_entry_t *asmPC; std::vector asmEntry;