Handle number of M68K cycles used when tracing in debugger mode
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index ff0e195..0202537 100644 (file)
@@ -5,6 +5,8 @@
 //\r
 // JLH = James Hammons <jlhamm@acm.org>\r
 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
+//  RG = Richard Goedeken\r
+\r
 //\r
 // Who  When        What\r
 // ---  ----------  ------------------------------------------------------------\r
 // 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, cartridge view menu\r
+// JPM  11/18/2018  Fix crash with non-debugger mode\r
+// JPM  April/2019  Added ELF sections check, added a save memory dump\r
+// JPM   Aug./2019  Update texts descriptions, set cartridge view menu for debugger mode only, added a HW registers browser and source level tracing\r
+// JPM  Marc./2020  Added the step over for source level tracing\r
+//  RG   Jan./2021  Linux build fixes\r
+// JPM   Apr./2021  Handle number of M68K cycles used in tracing mode\r
 //\r
 \r
 // FIXED:\r
 //\r
 // STILL TO BE DONE:\r
 //\r
+// - The source file listing do not need to be refresh more than one time\r
 // - Fix bug in switching between PAL & NTSC in fullscreen mode.\r
 // - Remove SDL dependencies (sound, mainly) from Jaguar core lib\r
-// - Fix inconsistency with trailing slashes in paths (eeproms needs one,\r
-//   software doesn't)\r
+// - Fix inconsistency with trailing slashes in paths (eeproms needs one, software doesn't)\r
 //\r
 // SFDX CODE: S1E9T8H5M23YS\r
 \r
@@ -67,6 +76,7 @@
 #include "debug/stackbrowser.h"\r
 #include "debug/opbrowser.h"\r
 #include "debug/riscdasmbrowser.h"\r
+#include "debug/hwregsbrowser.h"\r
 \r
 #include "dac.h"\r
 #include "jaguar.h"\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/SourcesWin.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
+#include "debugger/SaveDumpAsWin.h"\r
 \r
 \r
 // According to SebRmv, this header isn't seen on Arch Linux either... :-/\r
@@ -173,16 +188,22 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
        setWindowTitle(title);\r
 \r
+       // Windows common features\r
        aboutWin = new AboutWindow(this);\r
        helpWin = new HelpWindow(this);\r
        filePickWin = new FilePickerWindow(this);\r
+       emuStatusWin = new EmuStatusWindow(this);\r
+       \r
+       // Windows alpine mode features\r
        memBrowseWin = new MemoryBrowserWindow(this);\r
        stackBrowseWin = new StackBrowserWindow(this);\r
-       emuStatusWin = new EmuStatusWindow(this);\r
        cpuBrowseWin = new CPUBrowserWindow(this);\r
        opBrowseWin = new OPBrowserWindow(this);\r
        m68kDasmBrowseWin = new M68KDasmBrowserWindow(this);\r
        riscDasmBrowseWin = new RISCDasmBrowserWindow(this);\r
+       hwRegsBrowseWin = new HWRegsBrowserWindow(this);\r
+\r
+       // Windows debugger mode features\r
        if (vjs.softTypeDebugger)\r
        {\r
                //VideoOutputWin = new VideoOutputWindow(this);\r
@@ -192,9 +213,12 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                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
+               SaveDumpAsWin = new SaveDumpAsWindow(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
@@ -226,9 +250,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 #endif\r
                // Setup disasm tabs\r
                dasmtabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\r
-               dasmtabWidget->addTab(m68kDasmWin = new m68KDasmWindow(this), tr("M68000"));\r
+               dasmtabWidget->addTab(SourcesWin = new SourcesWindow(this), tr("Sources"));\r
+               dasmtabWidget->setCurrentIndex(dasmtabWidget->addTab(m68kDasmWin = new m68KDasmWindow(this), tr("M68000")));\r
                dasmtabWidget->addTab(GPUDasmWin = new GPUDasmWindow(this), tr("GPU"));\r
                dasmtabWidget->addTab(DSPDasmWin = new DSPDasmWindow(this), tr("DSP"));\r
+               connect(dasmtabWidget, SIGNAL(currentChanged(const int)), this, SLOT(SelectdasmtabWidget(const int)));\r
 #if 1\r
                setCentralWidget(dasmtabWidget);\r
 #endif\r
@@ -389,7 +415,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                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
@@ -397,9 +423,24 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                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
+               // Save dump\r
+               saveDumpAsAct = new QAction(tr("&Save Dump As..."), this);\r
+               saveDumpAsAct->setCheckable(false);\r
+               saveDumpAsAct->setDisabled(false);\r
+               connect(saveDumpAsAct, SIGNAL(triggered()), this, SLOT(ShowSaveDumpAsWin()));\r
 \r
                //VideoOutputAct = new QAction(tr("Output Video"), this);\r
                //VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
@@ -434,6 +475,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                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 cartridge's directory structure"));\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
@@ -479,6 +525,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window"));\r
        connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin()));\r
 \r
+       // HW registers browser window\r
+       hwRegsBrowseAct = new QAction(QIcon(":/res/tool-hw-regs.png"), tr("HW Registers Browser"), this);\r
+       hwRegsBrowseAct->setStatusTip(tr("Shows the HW registers browser window"));\r
+       connect(hwRegsBrowseAct, SIGNAL(triggered()), this, SLOT(ShowHWRegsBrowserWin()));\r
+\r
        // Risc (DSP / GPU) disassembly browser window\r
        riscDasmBrowseAct = new QAction(QIcon(":/res/tool-risc-dis.png"), tr("RISC Listing Browser"), this);\r
        riscDasmBrowseAct->setStatusTip(tr("Shows the RISC disassembly browser window"));\r
@@ -504,12 +555,29 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        fileMenu->addSeparator();\r
        fileMenu->addAction(quitAppAct);\r
 \r
+       // Alpine and debugger menus\r
        if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
+               // Create debug menu\r
                debugMenu = menuBar()->addMenu(tr("&Debug"));\r
+\r
+               // Create debugger menu\r
                if (vjs.softTypeDebugger)\r
                {\r
+                       // Create view menu\r
+                       viewMenu = menuBar()->addMenu(tr("&View"));\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
@@ -539,6 +607,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        debugWindowsBrowsesMenu->addAction(opBrowseAct);\r
                        debugWindowsBrowsesMenu->addAction(m68kDasmBrowseAct);\r
                        debugWindowsBrowsesMenu->addAction(riscDasmBrowseAct);\r
+                       debugWindowsBrowsesMenu->addAction(hwRegsBrowseAct);\r
                        debugMenu->addSeparator();\r
                        debugMenu->addAction(pauseAct);\r
                        debugMenu->addAction(frameAdvanceAct);\r
@@ -546,22 +615,28 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        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
+                       debugMenu->addSeparator();\r
+                       debugMenu->addAction(saveDumpAsAct);\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
                        debugMenu->addAction(opBrowseAct);\r
                        debugMenu->addAction(m68kDasmBrowseAct);\r
                        debugMenu->addAction(riscDasmBrowseAct);\r
+                       debugMenu->addAction(hwRegsBrowseAct);\r
                }\r
        }\r
 \r
@@ -605,6 +680,8 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                debuggerbar->addSeparator();\r
                debuggerbar->addAction(traceStepIntoAct);\r
                debuggerbar->addAction(traceStepOverAct);\r
+               debuggerbar->addSeparator();\r
+               debuggerbar->addAction(BreakpointsAct);\r
        }\r
 \r
        if (vjs.hardwareTypeAlpine)\r
@@ -616,6 +693,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                debugbar->addAction(opBrowseAct);\r
                debugbar->addAction(m68kDasmBrowseAct);\r
                debugbar->addAction(riscDasmBrowseAct);\r
+               debugbar->addAction(hwRegsBrowseAct);\r
        }\r
 \r
        // Add actions to the main window, as hiding widgets with them\r
@@ -788,6 +866,17 @@ void MainWin::SyncUI(void)
 }\r
 \r
 \r
+// \r
+void MainWin::SelectdasmtabWidget(const int Index)\r
+{\r
+       // check sources tab\r
+       if (Index == 0)\r
+       {\r
+               SourcesWin->RefreshContents();\r
+       }\r
+}\r
+\r
+\r
 void MainWin::closeEvent(QCloseEvent * event)\r
 {\r
        JaguarDone();\r
@@ -1029,7 +1118,7 @@ void MainWin::Configure(void)
        // Just in case we crash before a clean exit...\r
        WriteSettings();\r
 \r
-       DebuggerRefreshWindows();\r
+       RefreshWindows();\r
 }\r
 \r
 \r
@@ -1081,16 +1170,19 @@ static uint32_t ntscTickCount;
 static uint32_t refresh = 0;\r
                // Do autorefresh on debug windows\r
                // Have to be careful, too much causes the emulator to slow way down!\r
+               if (refresh == vjs.refresh)\r
+               {\r
                if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
                {\r
-                       if (refresh == vjs.refresh)\r
-                       {\r
                                AlpineRefreshWindows();\r
                                //memBrowseWin->RefreshContents();\r
                                //cpuBrowseWin->RefreshContents();\r
+                       }\r
+                       CommonRefreshWindows();\r
                                refresh = 0;\r
                        }\r
                        else\r
+               {\r
                                refresh++;\r
                }\r
        }\r
@@ -1194,7 +1286,10 @@ void MainWin::TogglePowerState(void)
 \r
                WriteLog("GUI: Resetting Jaguar...\n");\r
                JaguarReset();\r
+               DebuggerReset();\r
+               CommonReset();\r
                DebuggerResetWindows();\r
+               CommonResetWindows();\r
                DACPauseAudioThread(false);\r
        }\r
 }\r
@@ -1240,7 +1335,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       DebuggerRefreshWindows();\r
+                       RefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1253,11 +1348,13 @@ void MainWin::ToggleRunState(void)
                        traceStepIntoAct->setDisabled(true);\r
                        traceStepOverAct->setDisabled(true);\r
                        restartAct->setDisabled(true);\r
+                       BreakpointsWin->RefreshContents();\r
                }\r
 \r
                cpuBrowseWin->UnholdBPM();\r
        }\r
 \r
+       emuStatusWin->ResetM68KCycles();\r
        // Pause/unpause any running/non-running threads...\r
        DACPauseAudioThread(!running);\r
 }\r
@@ -1403,6 +1500,7 @@ void MainWin::LoadSoftware(QString file)
        {\r
                m68k_set_reg(M68K_REG_A6, 0);\r
                m68kDasmWin->SetAddress(jaguarRunAddress);\r
+               SourcesWin->Init();\r
                //pauseAct->setDisabled(false);\r
                //pauseAct->setChecked(true);\r
                ToggleRunState();\r
@@ -1417,6 +1515,7 @@ void MainWin::LoadSoftware(QString file)
                }\r
        }\r
 \r
+       // Display the Atari Jaguar software which is running\r
        if ((!vjs.hardwareTypeAlpine || !vjs.softTypeDebugger) && !loadAndGo && jaguarRunAddress)\r
        {\r
                QString newTitle = QString("Virtual Jaguar " VJ_RELEASE_VERSION " Rx - Now playing: %1").arg(filePickWin->GetSelectedPrettyName());\r
@@ -1437,20 +1536,73 @@ void MainWin::ToggleCDUsage(void)
 }\r
 \r
 \r
-//\r
-void MainWin::NewBreakpointFunction(void)\r
+// Open, or display, the breakpoints list window\r
+void MainWin::ShowBreakpointsWin(void)\r
 {\r
-       //brkWin->show();\r
-       //brkWin->RefreshContents();\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->SetFnctBreakpointWin(BreakpointsWin);\r
+       NewFunctionBreakpointWin->show();\r
+       ShowBreakpointsWin();\r
+}\r
+\r
+\r
+// Display list of files found in cartridge\r
+void MainWin::ShowCartFilesListWin(void)\r
+{\r
+       CartFilesListWin->show();\r
+       CartFilesListWin->RefreshContents();\r
+}\r
+\r
+\r
+// Display the save dump pickup file\r
+void MainWin::ShowSaveDumpAsWin(void)\r
+{\r
+       SaveDumpAsWin->show();\r
 }\r
 \r
 \r
 // Step Into trace\r
 void MainWin::DebuggerTraceStepInto(void)\r
 {\r
-       JaguarStepInto();\r
+       if (SourcesWin->isVisible() && SourcesWin->GetTraceStatus())\r
+       {\r
+               while (!SourcesWin->CheckChangeLine())\r
+               {\r
+                       emuStatusWin->UpdateM68KCycles(JaguarStepInto());\r
+               }\r
+       }\r
+       else\r
+       {\r
+               emuStatusWin->UpdateM68KCycles(JaguarStepInto());\r
+       }\r
+\r
        videoWidget->updateGL();\r
-       DebuggerRefreshWindows();\r
+       RefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Step Into function !!!")\r
 #else\r
@@ -1459,7 +1611,7 @@ void MainWin::DebuggerTraceStepInto(void)
 }\r
 \r
 \r
-// Restart\r
+// Restart the Jaguar executable\r
 void MainWin::DebuggerRestart(void)\r
 {\r
 #if 1\r
@@ -1468,10 +1620,15 @@ void MainWin::DebuggerRestart(void)
        m68k_set_reg(M68K_REG_PC, jaguarRunAddress);\r
        m68k_set_reg(M68K_REG_SP, vjs.DRAM_size);\r
 #endif\r
+       dasmtabWidget->setCurrentIndex(1);              // set focus on the disasm M68K tab\r
        m68k_set_reg(M68K_REG_A6, 0);\r
-\r
+       m68k_brk_hitcounts_reset();\r
+       emuStatusWin->ResetM68KCycles();\r
+       bpmHitCounts = 0;\r
        DebuggerResetWindows();\r
-       DebuggerRefreshWindows();\r
+       CommonResetWindows();\r
+       SourcesWin->Init();\r
+       RefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Restart function !!!")\r
 #else\r
@@ -1483,9 +1640,20 @@ void MainWin::DebuggerRestart(void)
 // Step Over trace\r
 void MainWin::DebuggerTraceStepOver(void)\r
 {\r
-       JaguarStepOver(0);\r
+       if (SourcesWin->isVisible() && SourcesWin->GetTraceStatus())\r
+       {\r
+               while (!SourcesWin->CheckChangeLine())\r
+               {\r
+                       emuStatusWin->UpdateM68KCycles(JaguarStepOver(0));\r
+               }\r
+       }\r
+       else\r
+       {\r
+               emuStatusWin->UpdateM68KCycles(JaguarStepOver(0));\r
+       }\r
+\r
        videoWidget->updateGL();\r
-       DebuggerRefreshWindows();\r
+       RefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Step Over function !!!")\r
 #else\r
@@ -1653,6 +1821,7 @@ void MainWin::ShowCPUBrowserWin(void)
 }\r
 \r
 \r
+// Show the OP browser window\r
 void MainWin::ShowOPBrowserWin(void)\r
 {\r
        opBrowseWin->show();\r
@@ -1660,6 +1829,15 @@ void MainWin::ShowOPBrowserWin(void)
 }\r
 \r
 \r
+// Show the HW registers browser window\r
+void MainWin::ShowHWRegsBrowserWin(void)\r
+{\r
+       hwRegsBrowseWin->show();\r
+       hwRegsBrowseWin->RefreshContents();\r
+}\r
+\r
+\r
+// Show the M68K browser window\r
 void MainWin::ShowM68KDasmBrowserWin(void)\r
 {\r
        m68kDasmBrowseWin->show();\r
@@ -1763,10 +1941,12 @@ void MainWin::ReadSettings(void)
        // 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
        vjs.displayFullSourceFilename = settings.value("displayFullSourceFilename", true).toBool();\r
+       vjs.ELFSectionsCheck = settings.value("ELFSectionsCheck", false).toBool();\r
        vjs.nbrmemory1browserwindow = settings.value("NbrMemory1BrowserWindow", MaxMemory1BrowserWindow).toUInt();\r
        settings.endGroup();\r
 \r
@@ -1776,6 +1956,7 @@ void MainWin::ReadSettings(void)
        strcpy(vjs.absROMPath, settings.value("DefaultABS", "").toString().toUtf8().data());\r
        vjs.refresh = settings.value("refresh", 60).toUInt();\r
        vjs.allowWritesToROM = settings.value("writeROM", false).toBool();\r
+       vjs.allowM68KExceptionCatch = settings.value("M68KExceptionCatch", false).toBool();\r
        settings.endGroup();\r
 \r
        // Read settings from the Keybindings\r
@@ -1788,13 +1969,15 @@ void MainWin::ReadSettings(void)
 \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
@@ -1846,6 +2029,7 @@ void MainWin::ReadSettings(void)
        WriteLog("Read setting = Done\n");\r
 \r
        ReadProfiles(&settings);\r
+       DBGManager_SourceFileSearchPathsSet(vjs.sourcefilesearchPaths);\r
 }\r
 \r
 \r
@@ -1879,6 +2063,11 @@ void MainWin::ReadUISettings(void)
        // Video output information\r
        zoomLevel = settings.value("zoom", 2).toInt();\r
 \r
+// Emulator status UI information\r
+       pos = settings.value("emuStatusWinPos", QPoint(200, 200)).toPoint();\r
+       emuStatusWin->move(pos);\r
+       settings.value("emuStatusWinIsVisible", false).toBool() ? ShowEmuStatusWin() : void();\r
+       \r
        // Alpine debug UI information (also needed by the Debugger)\r
        if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
@@ -1899,11 +2088,6 @@ void MainWin::ReadUISettings(void)
                size = settings.value("stackBrowseWinSize", QSize(400, 400)).toSize();\r
                stackBrowseWin->resize(size);\r
 \r
-               // Emulator status UI information\r
-               pos = settings.value("emuStatusWinPos", QPoint(200, 200)).toPoint();\r
-               emuStatusWin->move(pos);\r
-               settings.value("emuStatusWinIsVisible", false).toBool() ? ShowEmuStatusWin() : void();\r
-\r
                // OP (Object Processor) UI information\r
                pos = settings.value("opBrowseWinPos", QPoint(200, 200)).toPoint();\r
                opBrowseWin->move(pos);\r
@@ -1911,6 +2095,13 @@ void MainWin::ReadUISettings(void)
                size = settings.value("opBrowseWinSize", QSize(400, 400)).toSize();\r
                opBrowseWin->resize(size);\r
 \r
+               // HW registers UI information\r
+               pos = settings.value("hwRegsBrowseWinPos", QPoint(200, 200)).toPoint();\r
+               hwRegsBrowseWin->move(pos);\r
+               settings.value("hwRegsBrowseWinIsVisible", false).toBool() ? ShowHWRegsBrowserWin() : void();\r
+               size = settings.value("hwRegsBrowseWinSize", QSize(400, 400)).toSize();\r
+               hwRegsBrowseWin->resize(size);\r
+\r
                // RISC disassembly UI information\r
                pos = settings.value("riscDasmBrowseWinPos", QPoint(200, 200)).toPoint();\r
                riscDasmBrowseWin->move(pos);\r
@@ -1974,6 +2165,33 @@ void MainWin::ReadUISettings(void)
                size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize();\r
                CallStackBrowseWin->resize(size);\r
 \r
+               // cartridge directory and files UI information\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
+               // Save dump UI information\r
+               pos = settings.value("SaveDumpAsWinPos", QPoint(200, 200)).toPoint();\r
+               SaveDumpAsWin->move(pos);\r
+               settings.value("SaveDumpAsWinIsVisible", false).toBool() ? ShowSaveDumpAsWin() : void();\r
+               size = settings.value("SaveDumpAsWinSize", QSize(400, 400)).toSize();\r
+               SaveDumpAsWin->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
@@ -2039,16 +2257,19 @@ void MainWin::WriteSettings(void)
        settings.setValue("DefaultROM", vjs.alpineROMPath);\r
        settings.setValue("DefaultABS", vjs.absROMPath);\r
        settings.setValue("writeROM", vjs.allowWritesToROM);\r
+       settings.setValue("M68KExceptionCatch", vjs.allowM68KExceptionCatch);\r
        settings.endGroup();\r
 \r
        // Write settings from the Debugger mode\r
        settings.beginGroup("debugger");\r
        settings.setValue("DisplayHWLabels", vjs.displayHWlabels);\r
-       settings.setValue("NbrDisasmLines", vjs.nbrdisasmlines);\r
+       settings.setValue("NbrDisasmLines", (qulonglong) vjs.nbrdisasmlines);\r
        settings.setValue("DisasmOpcodes", vjs.disasmopcodes);\r
        settings.setValue("displayFullSourceFilename", vjs.displayFullSourceFilename);\r
+       settings.setValue("ELFSectionsCheck", vjs.ELFSectionsCheck);\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
@@ -2106,6 +2327,7 @@ void MainWin::WriteSettings(void)
 #endif\r
 \r
        WriteProfiles(&settings);\r
+       DBGManager_SourceFileSearchPathsSet(vjs.sourcefilesearchPaths);\r
 }\r
 \r
 \r
@@ -2127,6 +2349,10 @@ void MainWin::WriteUISettings(void)
        // Video output information\r
        settings.setValue("zoom", zoomLevel);\r
 \r
+       // Common UI information\r
+       settings.setValue("emuStatusWinPos", emuStatusWin->pos());\r
+       settings.setValue("emuStatusWinIsVisible", emuStatusWin->isVisible());\r
+       \r
        // Alpine debug UI information (also needed by the Debugger)\r
        if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
@@ -2137,11 +2363,12 @@ void MainWin::WriteUISettings(void)
                settings.setValue("stackBrowseWinPos", stackBrowseWin->pos());\r
                settings.setValue("stackBrowseWinIsVisible", stackBrowseWin->isVisible());\r
                settings.setValue("stackBrowseWinSize", stackBrowseWin->size());\r
-               settings.setValue("emuStatusWinPos", emuStatusWin->pos());\r
-               settings.setValue("emuStatusWinIsVisible", emuStatusWin->isVisible());\r
                settings.setValue("opBrowseWinPos", opBrowseWin->pos());\r
                settings.setValue("opBrowseWinIsVisible", opBrowseWin->isVisible());\r
                settings.setValue("opBrowseWinSize", opBrowseWin->size());\r
+               settings.setValue("hwRegsBrowseWinPos", hwRegsBrowseWin->pos());\r
+               settings.setValue("hwRegsBrowseWinIsVisible", hwRegsBrowseWin->isVisible());\r
+               settings.setValue("hwRegsBrowseWinSize", hwRegsBrowseWin->size());\r
                settings.setValue("riscDasmBrowseWinPos", riscDasmBrowseWin->pos());\r
                settings.setValue("riscDasmBrowseWinIsVisible", riscDasmBrowseWin->isVisible());\r
                settings.setValue("m68kDasmBrowseWinPos", m68kDasmBrowseWin->pos());\r
@@ -2172,6 +2399,19 @@ void MainWin::WriteUISettings(void)
                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
+               settings.setValue("SaveDumpAsWinPos", SaveDumpAsWin->pos());\r
+               settings.setValue("SaveDumpAsWinIsVisible", SaveDumpAsWin->isVisible());\r
+               settings.setValue("SaveDumpAsWinSize", SaveDumpAsWin->size());\r
+\r
                for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r
                        sprintf(mem1Name, "mem1BrowseWinPos[%i]", (unsigned int)i);\r
@@ -2193,10 +2433,32 @@ void MainWin::AlpineRefreshWindows(void)
        cpuBrowseWin->RefreshContents();\r
        memBrowseWin->RefreshContents();\r
        stackBrowseWin->RefreshContents();\r
-       emuStatusWin->RefreshContents();\r
        opBrowseWin->RefreshContents();\r
        riscDasmBrowseWin->RefreshContents();\r
        m68kDasmBrowseWin->RefreshContents();\r
+       hwRegsBrowseWin->RefreshContents();\r
+}\r
+\r
+\r
+// \r
+void MainWin::CommonResetWindows(void)\r
+{\r
+}\r
+\r
+\r
+// Reset common\r
+void MainWin::CommonReset(void)\r
+{\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
@@ -2208,20 +2470,43 @@ void MainWin::DebuggerResetWindows(void)
                FilesrcListWin->Reset();\r
                allWatchBrowseWin->Reset();\r
                heapallocatorBrowseWin->Reset();\r
-\r
+               BreakpointsWin->Reset();\r
+               CartFilesListWin->Reset();\r
+               SourcesWin->Reset();\r
                //ResetAlpineWindows();\r
        }\r
 }\r
 \r
 \r
+// Refresh common windows\r
+void MainWin::CommonRefreshWindows(void)\r
+{\r
+       emuStatusWin->RefreshContents();\r
+}\r
+\r
+\r
+// Refresh view windows\r
+void MainWin::ViewRefreshWindows(void)\r
+{\r
+       CartFilesListWin->RefreshContents();\r
+}\r
+\r
+\r
+// \r
+void MainWin::RefreshWindows(void)\r
+{\r
+       DebuggerRefreshWindows();\r
+       CommonRefreshWindows();\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
+               SourcesWin->RefreshContents();\r
                m68kDasmWin->RefreshContents();\r
                GPUDasmWin->RefreshContents();\r
                DSPDasmWin->RefreshContents();\r
@@ -2229,12 +2514,14 @@ void MainWin::DebuggerRefreshWindows(void)
                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