summaryrefslogtreecommitdiffstatshomepage
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
parentb5afc9dfea42f3c7f361fb2006c9b3df2bc41b00 (diff)
Qt debugger dynamically updates menu items controlling disassembly views
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.c84
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.h9
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.c1
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.h8
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.c141
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.h12
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();
};