diff options
author | 2015-02-22 01:06:37 +1100 | |
---|---|---|
committer | 2015-02-22 01:19:09 +1100 | |
commit | a581728a279f5320245579fbcacf4d5b7268831a (patch) | |
tree | 14500370faa2185bd3db346ca9b5dcbdb959289a | |
parent | b5afc9dfea42f3c7f361fb2006c9b3df2bc41b00 (diff) |
Qt debugger dynamically updates menu items controlling disassembly views
-rw-r--r-- | src/osd/modules/debugger/qt/dasmwindow.c | 84 | ||||
-rw-r--r-- | src/osd/modules/debugger/qt/dasmwindow.h | 9 | ||||
-rw-r--r-- | src/osd/modules/debugger/qt/debuggerview.c | 1 | ||||
-rw-r--r-- | src/osd/modules/debugger/qt/debuggerview.h | 8 | ||||
-rw-r--r-- | src/osd/modules/debugger/qt/mainwindow.c | 141 | ||||
-rw-r--r-- | src/osd/modules/debugger/qt/mainwindow.h | 12 |
6 files changed, 195 insertions, 60 deletions
diff --git a/src/osd/modules/debugger/qt/dasmwindow.c b/src/osd/modules/debugger/qt/dasmwindow.c index 4761af02195..688ea6f9f87 100644 --- a/src/osd/modules/debugger/qt/dasmwindow.c +++ b/src/osd/modules/debugger/qt/dasmwindow.c @@ -37,9 +37,8 @@ DasmWindow::DasmWindow(running_machine* machine, QWidget* parent) : connect(m_cpuComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(cpuChanged(int))); // The main disasm window - m_dasmView = new DebuggerView(DVT_DISASSEMBLY, - m_machine, - this); + m_dasmView = new DebuggerView(DVT_DISASSEMBLY, m_machine, this); + connect(m_dasmView, SIGNAL(updated()), this, SLOT(dasmViewUpdated())); // Force a recompute of the disassembly region downcast<debug_view_disasm*>(m_dasmView->view())->set_expression("curpc"); @@ -69,13 +68,16 @@ DasmWindow::DasmWindow(running_machine* machine, QWidget* parent) : // // Menu bars // - // Create two commands - QAction* breakpointSetAct = new QAction("Toggle Breakpoint At Cursor", this); - QAction* runToCursorAct = new QAction("Run To Cursor", this); - breakpointSetAct->setShortcut(Qt::Key_F9); - runToCursorAct->setShortcut(Qt::Key_F4); - connect(breakpointSetAct, SIGNAL(triggered(bool)), this, SLOT(toggleBreakpointAtCursor(bool))); - connect(runToCursorAct, SIGNAL(triggered(bool)), this, SLOT(runToCursor(bool))); + // Create three commands + m_breakpointToggleAct = new QAction("Toggle Breakpoint at Cursor", this); + m_breakpointEnableAct = new QAction("Disable Breakpoint at Cursor", this); + m_runToCursorAct = new QAction("Run to Cursor", this); + m_breakpointToggleAct->setShortcut(Qt::Key_F9); + m_breakpointEnableAct->setShortcut(Qt::SHIFT + Qt::Key_F9); + m_runToCursorAct->setShortcut(Qt::Key_F4); + connect(m_breakpointToggleAct, SIGNAL(triggered(bool)), this, SLOT(toggleBreakpointAtCursor(bool))); + connect(m_breakpointEnableAct, SIGNAL(triggered(bool)), this, SLOT(enableBreakpointAtCursor(bool))); + connect(m_runToCursorAct, SIGNAL(triggered(bool)), this, SLOT(runToCursor(bool))); // Right bar options QActionGroup* rightBarGroup = new QActionGroup(this); @@ -97,8 +99,9 @@ DasmWindow::DasmWindow(running_machine* machine, QWidget* parent) : // Assemble the options menu QMenu* optionsMenu = menuBar()->addMenu("&Options"); - optionsMenu->addAction(breakpointSetAct); - optionsMenu->addAction(runToCursorAct); + optionsMenu->addAction(m_breakpointToggleAct); + optionsMenu->addAction(m_breakpointEnableAct); + optionsMenu->addAction(m_runToCursorAct); optionsMenu->addSeparator(); optionsMenu->addActions(rightBarGroup->actions()); } @@ -164,6 +167,32 @@ void DasmWindow::toggleBreakpointAtCursor(bool changedTo) } +void DasmWindow::enableBreakpointAtCursor(bool changedTo) +{ + if (m_dasmView->view()->cursor_visible()) + { + offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address(); + device_t *const device = m_dasmView->view()->source()->device(); + device_debug *const cpuinfo = device->debug(); + + // Find an existing breakpoint at this address + device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + if (bp != NULL) + { + cpuinfo->breakpoint_enable(bp->index(), !bp->enabled()); + debug_console_printf(*m_machine, "Breakpoint %X %s\n", (UINT32)bp->index(), bp->enabled() ? "enabled" : "disabled"); + m_machine->debug_view().update_all(); + debugger_refresh_display(*m_machine); + } + } + + refreshAll(); +} + + void DasmWindow::runToCursor(bool changedTo) { if (m_dasmView->view()->cursor_visible()) @@ -193,6 +222,37 @@ void DasmWindow::rightBarChanged(QAction* changedTo) } +void DasmWindow::dasmViewUpdated() +{ + bool const haveCursor = m_dasmView->view()->cursor_visible(); + bool haveBreakpoint = false; + bool breakpointEnabled = false; + if (haveCursor) + { + offs_t const address = downcast<debug_view_disasm *>(m_dasmView->view())->selected_address(); + device_t *const device = m_dasmView->view()->source()->device(); + device_debug *const cpuinfo = device->debug(); + + // Find an existing breakpoint at this address + device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + if (bp != NULL) + { + haveBreakpoint = true; + breakpointEnabled = bp->enabled(); + } + } + + m_breakpointToggleAct->setText(haveBreakpoint ? "Clear Breakpoint at Cursor" : haveCursor ? "Set Breakpoint at Cursor" : "Toggle Breakpoint at Cursor"); + m_breakpointEnableAct->setText((!haveBreakpoint || breakpointEnabled) ? "Disable Breakpoint at Cursor" : "Enable Breakpoint at Cursor"); + m_breakpointToggleAct->setEnabled(haveCursor); + m_breakpointEnableAct->setEnabled(haveBreakpoint); + m_runToCursorAct->setEnabled(haveCursor); +} + + void DasmWindow::populateComboBox() { if (m_dasmView == NULL) diff --git a/src/osd/modules/debugger/qt/dasmwindow.h b/src/osd/modules/debugger/qt/dasmwindow.h index 0954f80d61f..3e7c4978918 100644 --- a/src/osd/modules/debugger/qt/dasmwindow.h +++ b/src/osd/modules/debugger/qt/dasmwindow.h @@ -24,19 +24,26 @@ private slots: void expressionSubmitted(); void toggleBreakpointAtCursor(bool changedTo); + void enableBreakpointAtCursor(bool changedTo); void runToCursor(bool changedTo); void rightBarChanged(QAction* changedTo); + void dasmViewUpdated(); + private: void populateComboBox(); -private: // Widgets QLineEdit* m_inputEdit; QComboBox* m_cpuComboBox; DebuggerView* m_dasmView; + + // Menu items + QAction* m_breakpointToggleAct; + QAction* m_breakpointEnableAct; + QAction* m_runToCursorAct; }; diff --git a/src/osd/modules/debugger/qt/debuggerview.c b/src/osd/modules/debugger/qt/debuggerview.c index 7befa5978f8..c1319114878 100644 --- a/src/osd/modules/debugger/qt/debuggerview.c +++ b/src/osd/modules/debugger/qt/debuggerview.c @@ -379,4 +379,5 @@ void DebuggerView::debuggerViewUpdate(debug_view& debugView, void* osdPrivate) dView->horizontalScrollBar()->setValue(dView->view()->visible_position().x); dView->viewport()->update(); dView->update(); + emit dView->updated(); } diff --git a/src/osd/modules/debugger/qt/debuggerview.h b/src/osd/modules/debugger/qt/debuggerview.h index 2e4e8d9603a..2e0a91ac870 100644 --- a/src/osd/modules/debugger/qt/debuggerview.h +++ b/src/osd/modules/debugger/qt/debuggerview.h @@ -18,13 +18,12 @@ public: void paintEvent(QPaintEvent* event); - // Callback to allow MAME to refresh the view - static void debuggerViewUpdate(debug_view& debugView, void* osdPrivate); - // Setters and accessors void setPreferBottom(bool pb) { m_preferBottom = pb; } debug_view* view() { return m_view; } +signals: + void updated(); protected: void keyPressEvent(QKeyEvent* event); @@ -36,6 +35,9 @@ private slots: private: + // Callback to allow MAME to refresh the view + static void debuggerViewUpdate(debug_view& debugView, void* osdPrivate); + bool m_preferBottom; debug_view* m_view; diff --git a/src/osd/modules/debugger/qt/mainwindow.c b/src/osd/modules/debugger/qt/mainwindow.c index f493741aced..87063adf245 100644 --- a/src/osd/modules/debugger/qt/mainwindow.c +++ b/src/osd/modules/debugger/qt/mainwindow.c @@ -43,13 +43,16 @@ MainWindow::MainWindow(running_machine* machine, QWidget* parent) : // // Options Menu // - // Create two commands - QAction* breakpointSetAct = new QAction("Toggle Breakpoint At Cursor", this); - QAction* runToCursorAct = new QAction("Run To Cursor", this); - breakpointSetAct->setShortcut(Qt::Key_F9); - runToCursorAct->setShortcut(Qt::Key_F4); - connect(breakpointSetAct, SIGNAL(triggered(bool)), this, SLOT(toggleBreakpointAtCursor(bool))); - connect(runToCursorAct, SIGNAL(triggered(bool)), this, SLOT(runToCursor(bool))); + // Create three commands + m_breakpointToggleAct = new QAction("Toggle Breakpoint at Cursor", this); + m_breakpointEnableAct = new QAction("Disable Breakpoint at Cursor", this); + m_runToCursorAct = new QAction("Run to Cursor", this); + m_breakpointToggleAct->setShortcut(Qt::Key_F9); + m_breakpointEnableAct->setShortcut(Qt::SHIFT + Qt::Key_F9); + m_runToCursorAct->setShortcut(Qt::Key_F4); + connect(m_breakpointToggleAct, SIGNAL(triggered(bool)), this, SLOT(toggleBreakpointAtCursor(bool))); + connect(m_breakpointEnableAct, SIGNAL(triggered(bool)), this, SLOT(enableBreakpointAtCursor(bool))); + connect(m_runToCursorAct, SIGNAL(triggered(bool)), this, SLOT(runToCursor(bool))); // Right bar options QActionGroup* rightBarGroup = new QActionGroup(this); @@ -71,8 +74,9 @@ MainWindow::MainWindow(running_machine* machine, QWidget* parent) : // Assemble the options menu QMenu* optionsMenu = menuBar()->addMenu("&Options"); - optionsMenu->addAction(breakpointSetAct); - optionsMenu->addAction(runToCursorAct); + optionsMenu->addAction(m_breakpointToggleAct); + optionsMenu->addAction(m_breakpointEnableAct); + optionsMenu->addAction(m_runToCursorAct); optionsMenu->addSeparator(); optionsMenu->addActions(rightBarGroup->actions()); @@ -109,6 +113,7 @@ MainWindow::MainWindow(running_machine* machine, QWidget* parent) : dasmDock->setAllowedAreas(Qt::TopDockWidgetArea); m_dasmFrame = new DasmDockWidget(m_machine, dasmDock); dasmDock->setWidget(m_dasmFrame); + connect(m_dasmFrame->view(), SIGNAL(updated()), this, SLOT(dasmViewUpdated())); addDockWidget(Qt::TopDockWidgetArea, dasmDock); dockMenu->addAction(dasmDock->toggleViewAction()); @@ -200,58 +205,78 @@ bool MainWindow::eventFilter(QObject* obj, QEvent* event) void MainWindow::toggleBreakpointAtCursor(bool changedTo) { - debug_view_disasm* dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); - if (dasmView->cursor_visible()) + debug_view_disasm *const dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); + if (dasmView->cursor_visible() && (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device())) { - if (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device()) + offs_t const address = downcast<debug_view_disasm *>(dasmView)->selected_address(); + device_debug *const cpuinfo = dasmView->source()->device()->debug(); + + // Find an existing breakpoint at this address + INT32 bpindex = -1; + for (device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + bp != NULL; + bp = bp->next()) { - offs_t address = downcast<debug_view_disasm *>(dasmView)->selected_address(); - device_debug *cpuinfo = dasmView->source()->device()->debug(); - - // Find an existing breakpoint at this address - INT32 bpindex = -1; - for (device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); - bp != NULL; - bp = bp->next()) + if (address == bp->address()) { - if (address == bp->address()) - { - bpindex = bp->index(); - break; - } + bpindex = bp->index(); + break; } + } - // If none exists, add a new one - astring command; - if (bpindex == -1) - { - command.printf("bpset 0x%X", address); - } - else - { - command.printf("bpclear 0x%X", bpindex); - } - debug_console_execute_command(*m_machine, command, 1); + // If none exists, add a new one + astring command; + if (bpindex == -1) + { + command.printf("bpset 0x%X", address); } + else + { + command.printf("bpclear 0x%X", bpindex); + } + debug_console_execute_command(*m_machine, command, 1); } refreshAll(); } -void MainWindow::runToCursor(bool changedTo) +void MainWindow::enableBreakpointAtCursor(bool changedTo) { - debug_view_disasm* dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); - if (dasmView->cursor_visible()) + debug_view_disasm *const dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); + if (dasmView->cursor_visible() && (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device())) { - if (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device()) + offs_t const address = dasmView->selected_address(); + device_debug *const cpuinfo = dasmView->source()->device()->debug(); + + // Find an existing breakpoint at this address + device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + if (bp != NULL) { - offs_t address = downcast<debug_view_disasm*>(dasmView)->selected_address(); + INT32 const bpindex = bp->index(); astring command; - command.printf("go 0x%X", address); + command.printf(bp->enabled() ? "bpdisable 0x%X" : "bpenable 0x%X", bpindex); debug_console_execute_command(*m_machine, command, 1); } } + + refreshAll(); +} + + +void MainWindow::runToCursor(bool changedTo) +{ + debug_view_disasm* dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); + if (dasmView->cursor_visible() && (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device())) + { + offs_t address = downcast<debug_view_disasm*>(dasmView)->selected_address(); + astring command; + command.printf("go 0x%X", address); + debug_console_execute_command(*m_machine, command, 1); + } } @@ -372,6 +397,38 @@ void MainWindow::unmountImage(bool changedTo) } +void MainWindow::dasmViewUpdated() +{ + debug_view_disasm *const dasmView = downcast<debug_view_disasm*>(m_dasmFrame->view()->view()); + bool const haveCursor = dasmView->cursor_visible() && (debug_cpu_get_visible_cpu(*m_machine) == dasmView->source()->device()); + bool haveBreakpoint = false; + bool breakpointEnabled = false; + if (haveCursor) + { + offs_t const address = dasmView->selected_address(); + device_t *const device = dasmView->source()->device(); + device_debug *const cpuinfo = device->debug(); + + // Find an existing breakpoint at this address + device_debug::breakpoint* bp = cpuinfo->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + if (bp != NULL) + { + haveBreakpoint = true; + breakpointEnabled = bp->enabled(); + } + } + + m_breakpointToggleAct->setText(haveBreakpoint ? "Clear Breakpoint at Cursor" : haveCursor ? "Set Breakpoint at Cursor" : "Toggle Breakpoint at Cursor"); + m_breakpointEnableAct->setText((!haveBreakpoint || breakpointEnabled) ? "Disable Breakpoint at Cursor" : "Enable Breakpoint at Cursor"); + m_breakpointToggleAct->setEnabled(haveCursor); + m_breakpointEnableAct->setEnabled(haveBreakpoint); + m_runToCursorAct->setEnabled(haveCursor); +} + + void MainWindow::debugActClose() { m_machine->schedule_exit(); diff --git a/src/osd/modules/debugger/qt/mainwindow.h b/src/osd/modules/debugger/qt/mainwindow.h index d3a6a6b33fc..810631b0f1a 100644 --- a/src/osd/modules/debugger/qt/mainwindow.h +++ b/src/osd/modules/debugger/qt/mainwindow.h @@ -37,6 +37,7 @@ protected: private slots: void toggleBreakpointAtCursor(bool changedTo); + void enableBreakpointAtCursor(bool changedTo); void runToCursor(bool changedTo); void rightBarChanged(QAction* changedTo); @@ -45,23 +46,30 @@ private slots: void mountImage(bool changedTo); void unmountImage(bool changedTo); + void dasmViewUpdated(); + // Closing the main window actually exits the program void debugActClose(); private: + void createImagesMenu(); + // Widgets and docks QLineEdit* m_inputEdit; DebuggerView* m_consoleView; ProcessorDockWidget* m_procFrame; DasmDockWidget* m_dasmFrame; + // Menu items + QAction* m_breakpointToggleAct; + QAction* m_breakpointEnableAct; + QAction* m_runToCursorAct; + // Terminal history int m_historyIndex; std::vector<QString> m_inputHistory; void addToHistory(const QString& command); - - void createImagesMenu(); }; |