From: slack Date: Tue, 28 Apr 2009 01:39:52 +0000 (+0200) Subject: Comment support in the disassembly window. X-Git-Url: http://slack.codemaniacs.com/git/?a=commitdiff_plain;h=e9033da2708fc412e15901f078c5cc58b5b3ebf5;p=wenboi.git Comment support in the disassembly window. Also, "Go to" button added. --- diff --git a/qtboi/QtBoiDisassemblyWindow.cc b/qtboi/QtBoiDisassemblyWindow.cc index 9827e71..30b8677 100644 --- a/qtboi/QtBoiDisassemblyWindow.cc +++ b/qtboi/QtBoiDisassemblyWindow.cc @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "QtBoiDisassemblyWindow.h" #include "../common/toString.h" @@ -19,7 +21,7 @@ QtBoiDisassemblyWindow::QtBoiDisassemblyWindow(QWidget *parent, GameBoy *gb, QHa browser->setOpenLinks(false); browser->setFont(QFont("courier")); browser->setFocusPolicy(Qt::NoFocus); - browser->setMinimumSize(500,500); + browser->setMinimumSize(700,500); connect(browser, SIGNAL(anchorClicked(const QUrl&)), this, SIGNAL(anchorClicked(const QUrl &))); @@ -29,8 +31,12 @@ QtBoiDisassemblyWindow::QtBoiDisassemblyWindow(QWidget *parent, GameBoy *gb, QHa forwardButton = new QPushButton("Forward", this); forwardButton->setEnabled(false); forwardButton->setFocusPolicy(Qt::NoFocus); + gotoButton = new QPushButton("Go to...", this); + gotoButton->setFocusPolicy(Qt::NoFocus); + gotoButton->setEnabled(false); connect(backButton, SIGNAL(clicked()), this, SLOT(historyBack())); connect(forwardButton, SIGNAL(clicked()), this, SLOT(historyForward())); + connect(gotoButton, SIGNAL(clicked()), this, SLOT(onGotoButton())); //backButton->setIcon(QIcon("../icons/go-next.svg")); //forwardButton->setIcon(QIcon("../icons/go-previous.svg")); @@ -38,6 +44,7 @@ QtBoiDisassemblyWindow::QtBoiDisassemblyWindow(QWidget *parent, GameBoy *gb, QHa QHBoxLayout *buttons = new QHBoxLayout(); buttons->addWidget(backButton); buttons->addWidget(forwardButton); + buttons->addWidget(gotoButton); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(browser); @@ -56,7 +63,7 @@ std::string QtBoiDisassemblyWindow::htmlLinkMem(u32 addr) result += toString(addr); result += "\">"; if (tags->value(addr) != "") - result += tags->value(addr).toStdString(); + result += tags->value(addr).split("#").at(0).toStdString(); else result += toStringHex(addr, 4); result += ""; @@ -147,7 +154,8 @@ void QtBoiDisassemblyWindow::gotoAddress(u16 addr) str << "Disassembly"; str << ""; - str << ""; + str << "" + ""; bool hilightBG=true; @@ -162,18 +170,23 @@ void QtBoiDisassemblyWindow::gotoAddress(u16 addr) } } + QStringList tag_comment = tags->value(pos, "#").split("#"); + QString tag = tag_comment.at(0); + QString comment = tag_comment.at(1); + Instruction ins(gb->disassemble_opcode(pos)); str << "regs.PC ? "#ffc0c0" : (hilightBG ? "#d0d0d0" : "#ffffff"))) << ">" << - "" << + "" << "" << - ""; + str << insToHtml(ins) << "  "; + str << ""; pos += ins.length; hilightBG = !hilightBG; @@ -217,6 +230,13 @@ void QtBoiDisassemblyWindow::refresh() gotoAddress(currentAddress); } +void QtBoiDisassemblyWindow::ready() +{ + gotoPC(); + gotoButton->setEnabled(true); +} + + void QtBoiDisassemblyWindow::historyBack() { if (historyPosition >= 1) @@ -229,5 +249,10 @@ void QtBoiDisassemblyWindow::historyForward() gotoAddress(history[historyPosition+1]); } +void QtBoiDisassemblyWindow::onGotoButton() +{ + QString s = QInputDialog::getText(this, tr("Go to address"), tr("Enter the address to disassemble")); + gotoAddress(s.toUInt(0,0)); +} diff --git a/qtboi/QtBoiDisassemblyWindow.h b/qtboi/QtBoiDisassemblyWindow.h index 375237b..95b63de 100644 --- a/qtboi/QtBoiDisassemblyWindow.h +++ b/qtboi/QtBoiDisassemblyWindow.h @@ -11,39 +11,39 @@ class QtBoiDisassemblyWindow: public QWidget { - Q_OBJECT + Q_OBJECT - public: - QtBoiDisassemblyWindow(QWidget *parent, GameBoy *gb, QHash *tags); - ~QtBoiDisassemblyWindow(); + public: + QtBoiDisassemblyWindow(QWidget *parent, GameBoy *gb, QHash *tags); + ~QtBoiDisassemblyWindow(); - void gotoAddress(u16 addr); - void gotoPC(); + void gotoAddress(u16 addr); + void gotoPC(); void refresh(); + void ready(); - public slots: - void historyBack(); + public slots: + void historyBack(); void historyForward(); + void onGotoButton(); - signals: - void anchorClicked(const QUrl & link); + signals: + void anchorClicked(const QUrl & link); - private: - std::string insToHtml(const Instruction &ins); - std::string operandToHtml(const Instruction::Operand &ins); - std::string htmlLinkMem(u32 addr); + private: + std::string insToHtml(const Instruction &ins); + std::string operandToHtml(const Instruction::Operand &ins); + std::string htmlLinkMem(u32 addr); - QTextBrowser *browser; - QPushButton *backButton, *forwardButton; - - GameBoy *gb; - QString romTitle; - QHash *tags; - QList history; - int historyPosition; - - u16 currentAddress; + QTextBrowser *browser; + QPushButton *backButton, *forwardButton, *gotoButton; + GameBoy *gb; + QString romTitle; + QHash *tags; + QList history; + int historyPosition; + u16 currentAddress; }; diff --git a/qtboi/QtBoiMainWindow.cc b/qtboi/QtBoiMainWindow.cc index 1b66baf..b759abc 100644 --- a/qtboi/QtBoiMainWindow.cc +++ b/qtboi/QtBoiMainWindow.cc @@ -185,39 +185,43 @@ void QtBoiMainWindow::createToolbar() toolbar->addAction(emulatorCont); toolbar->addAction(emulatorPause); toolbar->addAction(emulatorReset); + toolbar->addAction(emulatorStep); } void QtBoiMainWindow::onLoadROM() { - saveTags(); + saveTags(); - QString filename = QFileDialog::getOpenFileName(this, tr("Load ROM"), "../roms", tr("GameBoy ROMs (*.gb *.gbc)")); - if (filename == "") return; + QString filename = QFileDialog::getOpenFileName(this, tr("Load ROM"), "../roms", tr("GameBoy ROMs (*.gb *.gbc)")); + if (filename == "") return; - emuThread->loadROM(filename); - - char title[12]; - memcpy(title, emuThread->gb.rom->header.new_title, 11); - title[11]='\0'; - romTitle=QString(title); - loadTags(); + emuThread->loadROM(filename); + + char title[12]; + memcpy(title, emuThread->gb.rom->header.new_title, 11); + title[11]='\0'; + romTitle=QString(title); + loadTags(); - statusbar->showMessage(tr("Loaded ROM ")+filename+" ["+romTitle+"]"); + statusbar->showMessage(tr("Loaded ROM ")+filename+" ["+romTitle+"]"); + disassembly->ready(); } void QtBoiMainWindow::onDisassemblyAnchorClicked(const QUrl& url) { - std::cout << url.toString().toStdString() << std::endl; + //std::cout << url.toString().toStdString() << std::endl; if (url.scheme() == "gotoaddr") { u32 addr = url.path().toUInt(); disassembly->gotoAddress(addr); } - else if (url.scheme() == "newtag") { + else if (url.scheme() == "tag") { u32 addr = url.path().toUInt(); - QString tag = QInputDialog::getText(this, tr("Create new tag"), tr("Enter the tag for the selected address"), - QLineEdit::Normal, tags[addr]); - - tags[addr] = tag; + QStringList tag_comment = tags.value(addr,"#").split("#"); + QString tag = tag_comment.at(0); + QString comment = tag_comment.at(1); + tag = QInputDialog::getText(this, tr("Edit tag"), tr("Enter the tag for the selected address"), + QLineEdit::Normal, tag); + tags[addr] = tag+"#"+comment; disassembly->refresh(); } else if (url.scheme() == "togglebp") { @@ -233,11 +237,21 @@ void QtBoiMainWindow::onDisassemblyAnchorClicked(const QUrl& url) } if (!bpFound) { emuThread->gb.set_breakpoint(addr); - std::cout << "bp set at 0x" << std::hex << addr << std::endl; + //std::cout << "bp set at 0x" << std::hex << addr << std::endl; } disassembly->refresh(); status->update(); } + else if (url.scheme() == "comment") { + u32 addr = url.path().toUInt(); + QStringList tag_comment = tags.value(addr,"#").split("#"); + QString tag = tag_comment.at(0); + QString comment = tag_comment.at(1); + comment = QInputDialog::getText(this, tr("Edit comment"), tr("Enter the comment for the selected address"), + QLineEdit::Normal, comment); + tags[addr] = tag+"#"+comment; + disassembly->refresh(); + } } void QtBoiMainWindow::onRedraw(const uchar *buffer)
Labels BP AddrOpcodesInstruction
Labels BP  Addr  Opcodes InstructionComments
" << tags->value(pos).toStdString() << "" << tag.toStdString() << (tag=="" ? "" : ":")<<"  "<< (isBP? "#" : " ") <<" 0x" << std::hex << std::setw(4) << std::setfill('0') << - pos << ""; + "0x" << std::hex << std::setw(4) << std::setfill('0') << + pos << "  "; for (int i=0; imemory.read(pos+i)) << " "; - str << ""; + str << "  "; - str << insToHtml(ins) << "
" << "#  "<< comment.toStdString() << "