summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/debugger/qt/dasmwindow.c
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2015-02-22 01:06:37 +1100
committer Vas Crabb <vas@vastheman.com>2015-02-22 01:19:09 +1100
commita581728a279f5320245579fbcacf4d5b7268831a (patch)
tree14500370faa2185bd3db346ca9b5dcbdb959289a /src/osd/modules/debugger/qt/dasmwindow.c
parentb5afc9dfea42f3c7f361fb2006c9b3df2bc41b00 (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.c84
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)