diff options
author | 2015-02-22 01:06:37 +1100 | |
---|---|---|
committer | 2015-02-22 01:19:09 +1100 | |
commit | a581728a279f5320245579fbcacf4d5b7268831a (patch) | |
tree | 14500370faa2185bd3db346ca9b5dcbdb959289a /src/osd/modules/debugger/qt/dasmwindow.c | |
parent | b5afc9dfea42f3c7f361fb2006c9b3df2bc41b00 (diff) |
Qt debugger dynamically updates menu items controlling disassembly views
Diffstat (limited to 'src/osd/modules/debugger/qt/dasmwindow.c')
-rw-r--r-- | src/osd/modules/debugger/qt/dasmwindow.c | 84 |
1 files changed, 72 insertions, 12 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) |