// JPM 11/04/2017 Added the local window\r
// JPM 08/31/2018 Added the call stack window\r
// JPM Sept./2018 Added the new Models and BIOS handler, a screenshot feature and source code files browsing\r
+// JPM Oct./2018 Added search paths in the settings, breakpoints feature, cartdridge view menu\r
+// JPM 11/18/2018 Fix crash with non-debugger mode\r
//\r
\r
// FIXED:\r
#include "joystick.h"\r
#include "m68000/m68kinterface.h"\r
\r
+#include "debugger/DBGManager.h"\r
//#include "debugger/VideoWin.h"\r
//#include "debugger/DasmWin.h"\r
#include "debugger/m68KDasmWin.h"\r
#include "debugger/GPUDasmWin.h"\r
#include "debugger/DSPDasmWin.h"\r
#include "debugger/memory1browser.h"\r
-//#include "debugger/brkWin.h"\r
+#include "debugger/BreakpointsWin.h"\r
+#include "debugger/NewFnctBreakpointWin.h"\r
#include "debugger/FilesrcListWin.h"\r
#include "debugger/exceptionvectortablebrowser.h"\r
#include "debugger/allwatchbrowser.h"\r
#include "debugger/localbrowser.h"\r
#include "debugger/heapallocatorbrowser.h"\r
#include "debugger/callstackbrowser.h"\r
+#include "debugger/CartFilesListWin.h"\r
\r
\r
// According to SebRmv, this header isn't seen on Arch Linux either... :-/\r
allWatchBrowseWin = new AllWatchBrowserWindow(this);\r
LocalBrowseWin = new LocalBrowserWindow(this);\r
heapallocatorBrowseWin = new HeapAllocatorBrowserWindow(this);\r
- //brkWin = new BrkWindow(this);\r
+ BreakpointsWin = new BreakpointsWindow(this);\r
+ NewFunctionBreakpointWin = new NewFnctBreakpointWindow(this);\r
exceptionvectortableBrowseWin = new ExceptionVectorTableBrowserWindow(this);\r
CallStackBrowseWin = new CallStackBrowserWindow(this);\r
+ CartFilesListWin = new CartFilesListWindow(this);\r
\r
mem1BrowseWin = (Memory1BrowserWindow **)calloc(vjs.nbrmemory1browserwindow, sizeof(Memory1BrowserWindow));\r
#ifdef _MSC_VER\r
traceStepOverAct->setDisabled(true);\r
connect(traceStepOverAct, SIGNAL(triggered()), this, SLOT(DebuggerTraceStepOver()));\r
\r
- // Trace into trace\r
+ // Trace into tracing\r
traceStepIntoAct = new QAction(QIcon(":/res/debug-stepinto.png"), tr("&Step Into"), this);\r
traceStepIntoAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBSTEPINTO].KBSettingValue)));\r
traceStepIntoAct->setShortcutContext(Qt::ApplicationShortcut);\r
traceStepIntoAct->setDisabled(true);\r
connect(traceStepIntoAct, SIGNAL(triggered()), this, SLOT(DebuggerTraceStepInto()));\r
\r
- //newBreakpointFunctionAct = new QAction(QIcon(""), tr("&Function Breakpoint"), this);\r
- //newBreakpointFunctionAct->setShortcut(QKeySequence(tr("Ctrl+B")));\r
- //connect(newBreakpointFunctionAct, SIGNAL(triggered()), this, SLOT(NewBreakpointFunction()));\r
+ // Function breakpoint\r
+ newFunctionBreakpointAct = new QAction(QIcon(""), tr("&Function Breakpoint"), this);\r
+ newFunctionBreakpointAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBFUNCTIONBREAKPOINT].KBSettingValue)));\r
+ connect(newFunctionBreakpointAct, SIGNAL(triggered()), this, SLOT(ShowNewFunctionBreakpointWin()));\r
+ BreakpointsAct = new QAction(QIcon(":/res/debug-breakpoints.png"), tr("&Breakpoints"), this);\r
+ BreakpointsAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBBREAKPOINTS].KBSettingValue)));\r
+ connect(BreakpointsAct, SIGNAL(triggered()), this, SLOT(ShowBreakpointsWin()));\r
+ deleteAllBreakpointsAct = new QAction(QIcon(":/res/debug-deleteallbreakpoints.png"), tr("&Delete All Breakpoints"), this);\r
+ deleteAllBreakpointsAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBDELETEALLBREAKPOINTS].KBSettingValue)));\r
+ connect(deleteAllBreakpointsAct, SIGNAL(triggered()), this, SLOT(DeleteAllBreakpoints()));\r
+ disableAllBreakpointsAct = new QAction(QIcon(":/res/debug-disableallbreakpoints.png"), tr("&Disable All Breakpoints"), this);\r
+ connect(disableAllBreakpointsAct, SIGNAL(triggered()), this, SLOT(DisableAllBreakpoints()));\r
\r
//VideoOutputAct = new QAction(tr("Output Video"), this);\r
//VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
CallStackBrowseAct->setStatusTip(tr("Shows Call Stack browser window"));\r
connect(CallStackBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCallStackBrowserWin()));\r
\r
+ // Cart files list\r
+ CartFilesListAct = new QAction(QIcon(""), tr("Directory and files"), this);\r
+ CartFilesListAct->setStatusTip(tr("List of the files in the cartdridge's directory"));\r
+ connect(CartFilesListAct, SIGNAL(triggered()), this, SLOT(ShowCartFilesListWin()));\r
+\r
// Memory windows\r
mem1BrowseAct = (QAction **)calloc(vjs.nbrmemory1browserwindow, sizeof(QAction));\r
QSignalMapper *signalMapper = new QSignalMapper(this);\r
fileMenu->addSeparator();\r
fileMenu->addAction(quitAppAct);\r
\r
+ // Alpine and debugger menus\r
if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
{\r
+ // Create debug & view menu\r
debugMenu = menuBar()->addMenu(tr("&Debug"));\r
+ viewMenu = menuBar()->addMenu(tr("&View"));\r
+\r
+ // Create debugger menu\r
if (vjs.softTypeDebugger)\r
{\r
+ // Cart menu\r
+ viewCartMenu = viewMenu->addMenu(tr("&Cartridge"));\r
+ viewCartMenu->addAction(CartFilesListAct);\r
+#if 0\r
+ viewCartMenu->addSeparator();\r
+ viewCartMenu->addAction(CartStreamsAct);\r
+#endif\r
+\r
+ // Windows menu\r
debugWindowsMenu = debugMenu->addMenu(tr("&Windows"));\r
+ debugWindowsMenu->addAction(BreakpointsAct);\r
debugWindowExceptionMenu = debugWindowsMenu->addMenu(tr("&Exception"));\r
debugWindowExceptionMenu->addAction(exceptionVectorTableBrowseAct);\r
debugWindowsMenu->addSeparator();\r
debugMenu->addSeparator();\r
debugMenu->addAction(traceStepIntoAct);\r
debugMenu->addAction(traceStepOverAct);\r
-#if 0\r
debugMenu->addSeparator();\r
debugNewBreakpointMenu = debugMenu->addMenu(tr("&New Breakpoint"));\r
- debugNewBreakpointMenu->addAction(newBreakpointFunctionAct);\r
+ debugNewBreakpointMenu->addAction(newFunctionBreakpointAct);\r
+ debugMenu->addAction(deleteAllBreakpointsAct);\r
+ debugMenu->addAction(disableAllBreakpointsAct);\r
+#if 0\r
+ debugMenu->addSeparator();\r
+ debugMenu->addAction(DasmAct);\r
#endif\r
- //debugMenu->addSeparator();\r
- //debugMenu->addAction(DasmAct);\r
}\r
else\r
{\r
+ // Create alpine menu\r
debugMenu->addAction(memBrowseAct);\r
debugMenu->addAction(stackBrowseAct);\r
debugMenu->addAction(cpuBrowseAct);\r
debuggerbar->addSeparator();\r
debuggerbar->addAction(traceStepIntoAct);\r
debuggerbar->addAction(traceStepOverAct);\r
+ debuggerbar->addSeparator();\r
+ debuggerbar->addAction(BreakpointsAct);\r
}\r
\r
if (vjs.hardwareTypeAlpine)\r
\r
WriteLog("GUI: Resetting Jaguar...\n");\r
JaguarReset();\r
+ DebuggerReset();\r
DebuggerResetWindows();\r
DACPauseAudioThread(false);\r
}\r
traceStepIntoAct->setDisabled(true);\r
traceStepOverAct->setDisabled(true);\r
restartAct->setDisabled(true);\r
+ BreakpointsWin->RefreshContents();\r
}\r
\r
cpuBrowseWin->UnholdBPM();\r
}\r
\r
\r
-//\r
-void MainWin::NewBreakpointFunction(void)\r
+// Open, or display, the breakpoints list window\r
+void MainWin::ShowBreakpointsWin(void)\r
+{\r
+ BreakpointsWin->show();\r
+ BreakpointsWin->RefreshContents();\r
+}\r
+\r
+\r
+// Delete all breakpoints\r
+void MainWin::DeleteAllBreakpoints(void)\r
+{\r
+ cpuBrowseWin->ResetBPM();\r
+ m68k_brk_reset();\r
+ ShowBreakpointsWin();\r
+}\r
+\r
+\r
+// Disable all breakpoints\r
+void MainWin::DisableAllBreakpoints(void)\r
+{\r
+ cpuBrowseWin->DisableBPM();\r
+ m68k_brk_disable();\r
+ ShowBreakpointsWin();\r
+}\r
+\r
+\r
+// Open, or display, the new breakpoint function window\r
+void MainWin::ShowNewFunctionBreakpointWin(void)\r
+{\r
+ NewFunctionBreakpointWin->show();\r
+ ShowBreakpointsWin();\r
+}\r
+\r
+\r
+// \r
+void MainWin::ShowCartFilesListWin(void)\r
{\r
- //brkWin->show();\r
- //brkWin->RefreshContents();\r
+ CartFilesListWin->show();\r
+ CartFilesListWin->RefreshContents();\r
}\r
\r
\r
}\r
\r
\r
-// Restart\r
+// Restart the Jaguar executable\r
void MainWin::DebuggerRestart(void)\r
{\r
#if 1\r
m68k_set_reg(M68K_REG_SP, vjs.DRAM_size);\r
#endif\r
m68k_set_reg(M68K_REG_A6, 0);\r
-\r
+ m68k_brk_hitcounts_reset();\r
+ bpmHitCounts = 0;\r
DebuggerResetWindows();\r
DebuggerRefreshWindows();\r
#ifdef _MSC_VER\r
// Read settings from the Debugger mode\r
settings.beginGroup("debugger");\r
strcpy(vjs.debuggerROMPath, settings.value("DefaultROM", "").toString().toUtf8().data());\r
+ strcpy(vjs.sourcefilesearchPaths, settings.value("SourceFileSearchPaths", "").toString().toUtf8().data());\r
vjs.nbrdisasmlines = settings.value("NbrDisasmLines", 32).toUInt();\r
vjs.disasmopcodes = settings.value("DisasmOpcodes", true).toBool();\r
vjs.displayHWlabels = settings.value("DisplayHWLabels", true).toBool();\r
\r
// Write important settings to the log file\r
WriteLog("MainWin: Paths\n");\r
- WriteLog(" EEPROMPath = \"%s\"\n", vjs.EEPROMPath);\r
- WriteLog(" ROMPath = \"%s\"\n", vjs.ROMPath);\r
- WriteLog(" AlpineROMPath = \"%s\"\n", vjs.alpineROMPath);\r
- WriteLog("DebuggerROMPath = \"%s\"\n", vjs.debuggerROMPath);\r
- WriteLog(" absROMPath = \"%s\"\n", vjs.absROMPath);\r
- WriteLog("ScreenshotsPath = \"%s\"\n", vjs.screenshotPath);\r
- WriteLog(" Pipelined DSP = %s\n", (vjs.usePipelinedDSP ? "ON" : "off"));\r
+ WriteLog(" EEPROMPath = \"%s\"\n", vjs.EEPROMPath);\r
+ WriteLog(" ROMPath = \"%s\"\n", vjs.ROMPath);\r
+ WriteLog(" AlpineROMPath = \"%s\"\n", vjs.alpineROMPath);\r
+ WriteLog(" DebuggerROMPath = \"%s\"\n", vjs.debuggerROMPath);\r
+ WriteLog(" absROMPath = \"%s\"\n", vjs.absROMPath);\r
+ WriteLog(" ScreenshotsPath = \"%s\"\n", vjs.screenshotPath);\r
+ WriteLog("SourceFileSearchPaths = \"%s\"\n", vjs.sourcefilesearchPaths);\r
+ WriteLog("MainWin: Misc.\n");\r
+ WriteLog(" Pipelined DSP = %s\n", (vjs.usePipelinedDSP ? "ON" : "off"));\r
\r
#if 0\r
// Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *\r
WriteLog("Read setting = Done\n");\r
\r
ReadProfiles(&settings);\r
+ DBGManager_SourceFileSearchPathsSet(vjs.sourcefilesearchPaths);\r
}\r
\r
\r
size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize();\r
CallStackBrowseWin->resize(size);\r
\r
+ // Cartdridge directory and files\r
+ pos = settings.value("CartFilesListWinPos", QPoint(200, 200)).toPoint();\r
+ CartFilesListWin->move(pos);\r
+ settings.value("CartFilesListWinIsVisible", false).toBool() ? ShowCartFilesListWin() : void();\r
+ size = settings.value("CartFilesListWinSize", QSize(400, 400)).toSize();\r
+ CartFilesListWin->resize(size);\r
+\r
+ // Breakpoints UI information\r
+ pos = settings.value("BreakpointsWinPos", QPoint(200, 200)).toPoint();\r
+ BreakpointsWin->move(pos);\r
+ settings.value("BreakpointsWinIsVisible", false).toBool() ? ShowBreakpointsWin() : void();\r
+ size = settings.value("BreakpointsWinSize", QSize(400, 400)).toSize();\r
+ BreakpointsWin->resize(size);\r
+ // New function breakpoint UI information\r
+ pos = settings.value("NewFunctionBreakpointWinPos", QPoint(200, 200)).toPoint();\r
+ NewFunctionBreakpointWin->move(pos);\r
+ settings.value("NewFunctionBreakpointWinIsVisible", false).toBool() ? ShowNewFunctionBreakpointWin() : void();\r
+ size = settings.value("NewFunctionBreakpointWinSize", QSize(400, 400)).toSize();\r
+ NewFunctionBreakpointWin->resize(size);\r
+\r
// Memories browser UI information\r
for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
{\r
settings.setValue("displayFullSourceFilename", vjs.displayFullSourceFilename);\r
settings.setValue("NbrMemory1BrowserWindow", (unsigned int)vjs.nbrmemory1browserwindow);\r
settings.setValue("DefaultROM", vjs.debuggerROMPath);\r
+ settings.setValue("SourceFileSearchPaths", vjs.sourcefilesearchPaths);\r
settings.endGroup();\r
\r
// Write settings from the Keybindings\r
#endif\r
\r
WriteProfiles(&settings);\r
+ DBGManager_SourceFileSearchPathsSet(vjs.sourcefilesearchPaths);\r
}\r
\r
\r
settings.setValue("CallStackBrowseWinPos", CallStackBrowseWin->pos());\r
settings.setValue("CallStackBrowseWinIsVisible", CallStackBrowseWin->isVisible());\r
settings.setValue("CallStackBrowseWinSize", CallStackBrowseWin->size());\r
+ settings.setValue("BreakpointsWinPos", BreakpointsWin->pos());\r
+ settings.setValue("BreakpointsWinIsVisible", BreakpointsWin->isVisible());\r
+ settings.setValue("BreakpointsWinSize", BreakpointsWin->size());\r
+ settings.setValue("NewFunctionBreakpointWinPos", NewFunctionBreakpointWin->pos());\r
+ settings.setValue("NewFunctionBreakpointWinIsVisible", NewFunctionBreakpointWin->isVisible());\r
+ settings.setValue("NewFunctionBreakpointWinSize", NewFunctionBreakpointWin->size());\r
+ settings.setValue("CartFilesListWinPos", CartFilesListWin->pos());\r
+ settings.setValue("CartFilesListWinIsVisible", CartFilesListWin->isVisible());\r
+ settings.setValue("CartFilesListWinSize", CartFilesListWin->size());\r
+\r
for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
{\r
sprintf(mem1Name, "mem1BrowseWinPos[%i]", (unsigned int)i);\r
}\r
\r
\r
+// Reset soft debugger\r
+void MainWin::DebuggerReset(void)\r
+{\r
+ if (vjs.softTypeDebugger)\r
+ {\r
+ DeleteAllBreakpoints();\r
+ }\r
+}\r
+\r
+\r
// Reset soft debugger windows\r
void MainWin::DebuggerResetWindows(void)\r
{\r
FilesrcListWin->Reset();\r
allWatchBrowseWin->Reset();\r
heapallocatorBrowseWin->Reset();\r
-\r
+ BreakpointsWin->Reset();\r
+ CartFilesListWin->Reset();\r
//ResetAlpineWindows();\r
}\r
}\r
\r
\r
+// Refresh view windows\r
+void MainWin::ViewRefreshWindows(void)\r
+{\r
+ CartFilesListWin->RefreshContents();\r
+}\r
+\r
+\r
// Refresh soft debugger & alpine debug windows\r
void MainWin::DebuggerRefreshWindows(void)\r
{\r
- size_t i;\r
-\r
if (vjs.softTypeDebugger)\r
{\r
FilesrcListWin->RefreshContents();\r
LocalBrowseWin->RefreshContents();\r
CallStackBrowseWin->RefreshContents();\r
heapallocatorBrowseWin->RefreshContents();\r
- for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
+ BreakpointsWin->RefreshContents();\r
+ for (size_t i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
{\r
mem1BrowseWin[i]->RefreshContents(i);\r
}\r
\r
AlpineRefreshWindows();\r
+ ViewRefreshWindows();\r
}\r
}\r
\r