Handle number of M68K cycles used when tracing in debugger mode
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index ad3a838..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
@@ -239,29 +265,25 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
        setUnifiedTitleAndToolBarOnMac(true);\r
 \r
-       // Create actions\r
-\r
+       // Quit actions\r
        quitAppAct = new QAction(QIcon(":/res/exit.png"), tr("E&xit"), this);\r
-//     quitAppAct->setShortcuts(QKeySequence::Quit);\r
-//     quitAppAct->setShortcut(QKeySequence(tr("Alt+x")));\r
-       //quitAppAct->setShortcut(QKeySequence(tr("Ctrl+q")));\r
        quitAppAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBQUIT].KBSettingValue)));\r
        quitAppAct->setShortcutContext(Qt::ApplicationShortcut);\r
        quitAppAct->setStatusTip(tr("Quit Virtual Jaguar"));\r
        connect(quitAppAct, SIGNAL(triggered()), this, SLOT(close()));\r
 \r
+       // Power action\r
        powerGreen.addFile(":/res/power-off.png", QSize(), QIcon::Normal, QIcon::Off);\r
        powerGreen.addFile(":/res/power-on-green.png", QSize(), QIcon::Normal, QIcon::On);\r
        powerRed.addFile(":/res/power-off.png", QSize(), QIcon::Normal, QIcon::Off);\r
        powerRed.addFile(":/res/power-on-red.png", QSize(), QIcon::Normal, QIcon::On);\r
-\r
        powerAct = new QAction(powerGreen, tr("&Power"), this);\r
        powerAct->setStatusTip(tr("Powers Jaguar on/off"));\r
        powerAct->setCheckable(true);\r
        powerAct->setChecked(false);\r
        connect(powerAct, SIGNAL(triggered()), this, SLOT(TogglePowerState()));\r
 \r
-       // Pause feature\r
+       // Pause action\r
        QIcon pauseIcon;\r
        pauseIcon.addFile(":/res/pause-off.png", QSize(), QIcon::Normal, QIcon::Off);\r
        pauseIcon.addFile(":/res/pause-on.png", QSize(), QIcon::Normal, QIcon::On);\r
@@ -269,12 +291,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        pauseAct->setStatusTip(tr("Toggles the running state"));\r
        pauseAct->setCheckable(true);\r
        pauseAct->setDisabled(true);\r
-       //pauseAct->setShortcut(QKeySequence(tr("Esc")));\r
        pauseAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBPAUSE].KBSettingValue)));\r
        pauseAct->setShortcutContext(Qt::ApplicationShortcut);\r
        connect(pauseAct, SIGNAL(triggered()), this, SLOT(ToggleRunState()));\r
 \r
-       // Screenshot feature\r
+       // Screenshot action\r
        screenshotAct = new QAction(QIcon(":/res/screenshot.png"), tr("&Screenshot"), this);\r
        screenshotAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBSCREENSHOT].KBSettingValue)));\r
        screenshotAct->setShortcutContext(Qt::ApplicationShortcut);\r
@@ -282,51 +303,51 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        screenshotAct->setDisabled(false);\r
        connect(screenshotAct, SIGNAL(triggered()), this, SLOT(MakeScreenshot()));\r
 \r
+       // Zoom actions\r
        zoomActs = new QActionGroup(this);\r
-\r
        x1Act = new QAction(QIcon(":/res/zoom100.png"), tr("Zoom 100%"), zoomActs);\r
        x1Act->setStatusTip(tr("Set window zoom to 100%"));\r
        x1Act->setCheckable(true);\r
        connect(x1Act, SIGNAL(triggered()), this, SLOT(SetZoom100()));\r
-\r
        x2Act = new QAction(QIcon(":/res/zoom200.png"), tr("Zoom 200%"), zoomActs);\r
        x2Act->setStatusTip(tr("Set window zoom to 200%"));\r
        x2Act->setCheckable(true);\r
        connect(x2Act, SIGNAL(triggered()), this, SLOT(SetZoom200()));\r
-\r
        x3Act = new QAction(QIcon(":/res/zoom300.png"), tr("Zoom 300%"), zoomActs);\r
        x3Act->setStatusTip(tr("Set window zoom to 300%"));\r
        x3Act->setCheckable(true);\r
        connect(x3Act, SIGNAL(triggered()), this, SLOT(SetZoom300()));\r
 \r
+       // TV type actions\r
        tvTypeActs = new QActionGroup(this);\r
-\r
        ntscAct = new QAction(QIcon(":/res/ntsc.png"), tr("NTSC"), tvTypeActs);\r
        ntscAct->setStatusTip(tr("Sets Jaguar to NTSC mode"));\r
        ntscAct->setCheckable(true);\r
        connect(ntscAct, SIGNAL(triggered()), this, SLOT(SetNTSC()));\r
-\r
        palAct = new QAction(QIcon(":/res/pal.png"), tr("PAL"), tvTypeActs);\r
        palAct->setStatusTip(tr("Sets Jaguar to PAL mode"));\r
        palAct->setCheckable(true);\r
        connect(palAct, SIGNAL(triggered()), this, SLOT(SetPAL()));\r
 \r
+       // Blur action\r
        blur.addFile(":/res/blur-off.png", QSize(), QIcon::Normal, QIcon::Off);\r
        blur.addFile(":/res/blur-on.png", QSize(), QIcon::Normal, QIcon::On);\r
-\r
        blurAct = new QAction(blur, tr("Blur"), this);\r
        blurAct->setStatusTip(tr("Sets OpenGL rendering to GL_NEAREST"));\r
        blurAct->setCheckable(true);\r
        connect(blurAct, SIGNAL(triggered()), this, SLOT(ToggleBlur()));\r
 \r
+       // About action\r
        aboutAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&About..."), this);\r
        aboutAct->setStatusTip(tr("Blatant self-promotion"));\r
        connect(aboutAct, SIGNAL(triggered()), this, SLOT(ShowAboutWin()));\r
 \r
+       // Help action\r
        helpAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&Contents..."), this);\r
        helpAct->setStatusTip(tr("Help is available, if you should need it"));\r
        connect(helpAct, SIGNAL(triggered()), this, SLOT(ShowHelpWin()));\r
 \r
+       // File pickup action\r
        if (!vjs.softTypeDebugger)\r
        {\r
                filePickAct = new QAction(QIcon(":/res/software.png"), tr("&Insert Cartridge..."), this);\r
@@ -337,99 +358,129 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                filePickAct = new QAction(QIcon(":/res/software.png"), tr("&Insert executable file..."), this);\r
                filePickAct->setStatusTip(tr("Insert an executable into Virtual Jaguar"));\r
        }\r
-       //filePickAct->setShortcut(QKeySequence(tr("Ctrl+i")));\r
        filePickAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBPICKFILE].KBSettingValue)));\r
        filePickAct->setShortcutContext(Qt::ApplicationShortcut);\r
        connect(filePickAct, SIGNAL(triggered()), this, SLOT(InsertCart()));\r
 \r
+       // Configuration action\r
        configAct = new QAction(QIcon(":/res/wrench.png"), tr("&Configure"), this);\r
        configAct->setStatusTip(tr("Configure options for Virtual Jaguar"));\r
-       //configAct->setShortcut(QKeySequence(tr("Ctrl+c")));\r
        configAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBCONFIGURE].KBSettingValue)));\r
        configAct->setShortcutContext(Qt::ApplicationShortcut);\r
        connect(configAct, SIGNAL(triggered()), this, SLOT(Configure()));\r
 \r
+       // Emulation status action\r
        emustatusAct = new QAction(QIcon(":/res/status.png"), tr("&Status"), this);\r
        emustatusAct->setStatusTip(tr("Emulator status"));\r
-       //emustatusAct->setShortcut(QKeySequence(tr("Ctrl+s")));\r
        emustatusAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBEMUSTATUS].KBSettingValue)));\r
        emustatusAct->setShortcutContext(Qt::ApplicationShortcut);\r
        connect(emustatusAct, SIGNAL(triggered()), this, SLOT(ShowEmuStatusWin()));\r
 \r
+       // Use CD action\r
        useCDAct = new QAction(QIcon(":/res/compact-disc.png"), tr("&Use CD Unit"), this);\r
        useCDAct->setStatusTip(tr("Use Jaguar Virtual CD unit"));\r
-//     useCDAct->setShortcut(QKeySequence(tr("Ctrl+c")));\r
        useCDAct->setCheckable(true);\r
        connect(useCDAct, SIGNAL(triggered()), this, SLOT(ToggleCDUsage()));\r
 \r
+       // Frame advance action\r
        frameAdvanceAct = new QAction(QIcon(":/res/frame-advance.png"), tr("&Frame Advance"), this);\r
-       //frameAdvanceAct->setShortcut(QKeySequence(tr("F7")));\r
        frameAdvanceAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBFRAMEADVANCE].KBSettingValue)));\r
        frameAdvanceAct->setShortcutContext(Qt::ApplicationShortcut);\r
        frameAdvanceAct->setDisabled(true);\r
        connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance()));\r
 \r
+       // Fullscreen action\r
+       fullScreenAct = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this);\r
+       fullScreenAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBFULLSCREEN].KBSettingValue)));\r
+       fullScreenAct->setShortcutContext(Qt::ApplicationShortcut);\r
+       fullScreenAct->setCheckable(true);\r
+       connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen()));\r
+\r
+       // Actions dedicated to debugger mode\r
        if (vjs.softTypeDebugger)\r
        {\r
+               // Restart\r
                restartAct = new QAction(QIcon(":/res/debug-restart.png"), tr("&Restart"), this);\r
-               //restartAct->setShortcut(QKeySequence(tr("Ctrl+Shift+F5")));\r
                restartAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBRESTART].KBSettingValue)));\r
                restartAct->setShortcutContext(Qt::ApplicationShortcut);\r
                restartAct->setCheckable(false);\r
                restartAct->setDisabled(true);\r
                connect(restartAct, SIGNAL(triggered()), this, SLOT(DebuggerRestart()));\r
 \r
+               // Step over trace\r
                traceStepOverAct = new QAction(QIcon(":/res/debug-stepover.png"), tr("&Step Over"), this);\r
-               //traceStepOverAct->setShortcut(QKeySequence(tr("F10")));\r
                traceStepOverAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBSTEPOVER].KBSettingValue)));\r
                traceStepOverAct->setShortcutContext(Qt::ApplicationShortcut);\r
                traceStepOverAct->setCheckable(false);\r
                traceStepOverAct->setDisabled(true);\r
                connect(traceStepOverAct, SIGNAL(triggered()), this, SLOT(DebuggerTraceStepOver()));\r
 \r
+               // Trace into tracing\r
                traceStepIntoAct = new QAction(QIcon(":/res/debug-stepinto.png"), tr("&Step Into"), this);\r
-               //traceStepIntoAct->setShortcut(QKeySequence(tr("F11")));\r
                traceStepIntoAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBSTEPINTO].KBSettingValue)));\r
                traceStepIntoAct->setShortcutContext(Qt::ApplicationShortcut);\r
                traceStepIntoAct->setCheckable(false);\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
-       }\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
-       fullScreenAct = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this);\r
-       //fullScreenAct->setShortcut(QKeySequence(tr("F9")));\r
-       fullScreenAct->setShortcut(QKeySequence(tr(vjs.KBContent[KBFULLSCREEN].KBSettingValue)));\r
-       fullScreenAct->setShortcutContext(Qt::ApplicationShortcut);\r
-       fullScreenAct->setCheckable(true);\r
-       connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen()));\r
+               //VideoOutputAct = new QAction(tr("Output Video"), this);\r
+               //VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
+               //connect(VideoOutputAct, SIGNAL(triggered()), this, SLOT(ShowVideoOutputWin()));\r
 \r
-       // Debugger Actions\r
-       if (vjs.softTypeDebugger)\r
-       {\r
+               //DasmAct = new QAction(tr("Disassembly"), this);\r
+               //DasmAct->setStatusTip(tr("Shows the disassembly window"));\r
+               //connect(DasmAct, SIGNAL(triggered()), this, SLOT(ShowDasmWin()));\r
+\r
+               // Exception vector table window\r
                exceptionVectorTableBrowseAct = new QAction(QIcon(""), tr("Exception Vector Table"), this);\r
                exceptionVectorTableBrowseAct->setStatusTip(tr("Shows all Exception Vector Table browser window"));\r
                connect(exceptionVectorTableBrowseAct, SIGNAL(triggered()), this, SLOT(ShowExceptionVectorTableBrowserWin()));\r
 \r
+               // All watch variables window\r
                allWatchBrowseAct = new QAction(QIcon(":/res/debug-watch.png"), tr("All Watch"), this);\r
                allWatchBrowseAct->setStatusTip(tr("Shows all Watch browser window"));\r
                connect(allWatchBrowseAct, SIGNAL(triggered()), this, SLOT(ShowAllWatchBrowserWin()));\r
 \r
+               // Local variables window\r
                LocalBrowseAct = new QAction(QIcon(":/res/debug-local.png"), tr("Locals"), this);\r
                LocalBrowseAct->setStatusTip(tr("Shows Locals browser window"));\r
                connect(LocalBrowseAct, SIGNAL(triggered()), this, SLOT(ShowLocalBrowserWin()));\r
 \r
+               // Heap (memory) allocation window\r
                heapallocatorBrowseAct = new QAction(QIcon(""), tr("Heap allocator"), this);\r
                heapallocatorBrowseAct->setStatusTip(tr("Shows the heap allocator browser window"));\r
                connect(heapallocatorBrowseAct, SIGNAL(triggered()), this, SLOT(ShowHeapAllocatorBrowserWin()));\r
 \r
+               // Call stack window\r
                CallStackBrowseAct = new QAction(QIcon(":/res/debug-callstack.png"), tr("Call Stack"), this);\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 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
 #ifdef _MSC_VER\r
@@ -443,56 +494,47 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        sprintf(MB, "Memory %i", (unsigned int)(i+1));\r
                        mem1BrowseAct[i] = new QAction(QIcon(":/res/debug-memory.png"), tr(MB), this);\r
                        mem1BrowseAct[i]->setStatusTip(tr("Shows a Jaguar memory browser window"));\r
-                       //mem1BrowseAct[i]->\r
-                       //connect(mem1BrowseAct[0], SIGNAL(triggered()), this, SLOT(ShowMemory1BrowserWin(size_t(0))));\r
                        connect(mem1BrowseAct[i], SIGNAL(triggered()), signalMapper, SLOT(map()));\r
                        signalMapper->setMapping(mem1BrowseAct[i], (int)i);\r
                        connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(ShowMemory1BrowserWin(int)));\r
                }\r
        }\r
 \r
-       // Debugger Browser Actions\r
+       // Memory browser window action\r
        memBrowseAct = new QAction(QIcon(":/res/tool-memory.png"), tr("Memory Browser"), this);\r
        memBrowseAct->setStatusTip(tr("Shows the Jaguar memory browser window"));\r
-//     memBrowseAct->setCheckable(true);\r
        connect(memBrowseAct, SIGNAL(triggered()), this, SLOT(ShowMemoryBrowserWin()));\r
 \r
+       // Stack browser window action\r
        stackBrowseAct = new QAction(QIcon(":/res/tool-stack.png"), tr("Stack Browser"), this);\r
        stackBrowseAct->setStatusTip(tr("Shows the Jaguar stack browser window"));\r
-       //      memBrowseAct->setCheckable(true);\r
        connect(stackBrowseAct, SIGNAL(triggered()), this, SLOT(ShowStackBrowserWin()));\r
 \r
+       // CPUs (M68000, GPU & DSP browser window action\r
        cpuBrowseAct = new QAction(QIcon(":/res/tool-cpu.png"), tr("CPU Browser"), this);\r
        cpuBrowseAct->setStatusTip(tr("Shows the Jaguar CPU browser window"));\r
-//     memBrowseAct->setCheckable(true);\r
        connect(cpuBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCPUBrowserWin()));\r
 \r
+       // OP browser window action\r
        opBrowseAct = new QAction(QIcon(":/res/tool-op.png"), tr("OP Browser"), this);\r
        opBrowseAct->setStatusTip(tr("Shows the Jaguar OP browser window"));\r
-//     memBrowseAct->setCheckable(true);\r
        connect(opBrowseAct, SIGNAL(triggered()), this, SLOT(ShowOPBrowserWin()));\r
 \r
+       // M68000 disassembly browser window\r
        m68kDasmBrowseAct = new QAction(QIcon(":/res/tool-68k-dis.png"), tr("68K Listing Browser"), this);\r
        m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window"));\r
-//     memBrowseAct->setCheckable(true);\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
-//     memBrowseAct->setCheckable(true);\r
        connect(riscDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowRISCDasmBrowserWin()));\r
 \r
-       if (vjs.softTypeDebugger)\r
-       {\r
-               //VideoOutputAct = new QAction(tr("Output Video"), this);\r
-               //VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
-               //connect(VideoOutputAct, SIGNAL(triggered()), this, SLOT(ShowVideoOutputWin()));\r
-\r
-               //DasmAct = new QAction(tr("Disassembly"), this);\r
-               //DasmAct->setStatusTip(tr("Shows the disassembly window"));\r
-               //connect(DasmAct, SIGNAL(triggered()), this, SLOT(ShowDasmWin()));\r
-       }\r
-\r
        // Misc. connections...\r
        connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString)));\r
        connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause()));\r
@@ -513,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
@@ -548,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
@@ -555,25 +615,32 @@ 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
+       // Help menus\r
        helpMenu = menuBar()->addMenu(tr("&Help"));\r
        helpMenu->addAction(helpAct);\r
        helpMenu->addAction(aboutAct);\r
@@ -613,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
@@ -624,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
@@ -796,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
@@ -1037,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
@@ -1083,22 +1164,25 @@ static uint32_t ntscTickCount;
                // Otherwise, run the Jaguar simulation\r
                HandleGamepads();\r
                JaguarExecuteNew();\r
-               if (!vjs.softTypeDebugger)\r
+               //if (!vjs.softTypeDebugger)\r
                        videoWidget->HandleMouseHiding();\r
 \r
 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
@@ -1138,6 +1222,7 @@ static uint32_t refresh = 0;
 }\r
 \r
 \r
+// Toggle the power state, it can be either on or off\r
 void MainWin::TogglePowerState(void)\r
 {\r
        powerButtonOn = !powerButtonOn;\r
@@ -1147,31 +1232,34 @@ void MainWin::TogglePowerState(void)
        if (!powerButtonOn)\r
        {\r
                // Restore the mouse pointer, if hidden:\r
-               if (!vjs.softTypeDebugger)\r
+               //if (!vjs.softTypeDebugger)\r
+               {\r
                        videoWidget->CheckAndRestoreMouseCursor();\r
+               }\r
+\r
                useCDAct->setDisabled(false);\r
                palAct->setDisabled(false);\r
                ntscAct->setDisabled(false);\r
                pauseAct->setChecked(false);\r
                pauseAct->setDisabled(true);\r
                showUntunedTankCircuit = true;\r
+\r
                DACPauseAudioThread();\r
-               // This is just in case the ROM we were playing was in a narrow or wide\r
-               // field mode, so the untuned tank sim doesn't look wrong. :-)\r
+               // This is just in case the ROM we were playing was in a narrow or wide field mode, so the untuned tank sim doesn't look wrong. :-)\r
                TOMReset();\r
 \r
                if (plzDontKillMyComputer)\r
                {\r
-                       //if (!vjs.softTypeDebugger)\r
+                       // We have to do it line by line, because the texture pitch is not the same as the picture buffer's pitch.\r
+                       for (uint32_t y = 0; y < videoWidget->rasterHeight; y++)\r
                        {\r
-                               // We have to do it line by line, because the texture pitch is not\r
-                               // the same as the picture buffer's pitch.\r
-                               for (uint32_t y = 0; y < videoWidget->rasterHeight; y++)\r
+                               if (vjs.hardwareTypeNTSC)\r
                                {\r
-                                       if (vjs.hardwareTypeNTSC)\r
-                                               memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
-                                       else\r
-                                               memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern2 + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
+                                       memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
+                               }\r
+                               else\r
+                               {\r
+                                       memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern2 + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
                                }\r
                        }\r
                }\r
@@ -1198,19 +1286,25 @@ 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
 \r
 \r
+// Toggle the emulator state, it can be either on or off\r
 void MainWin::ToggleRunState(void)\r
 {\r
        startM68KTracing = running;\r
        running = !running;\r
 \r
+       // Pause mode\r
        if (!running)\r
        {\r
+               // Set action buttons for the pause mode\r
                frameAdvanceAct->setDisabled(false);\r
                pauseAct->setChecked(true);\r
                pauseAct->setDisabled(false);\r
@@ -1228,7 +1322,6 @@ void MainWin::ToggleRunState(void)
                {\r
                        // Restore the mouse pointer, if hidden:\r
                        videoWidget->CheckAndRestoreMouseCursor();\r
-                       //              frameAdvanceAct->setDisabled(false);\r
 \r
                        for (uint32_t i = 0; i < (uint32_t)(videoWidget->textureWidth * 256); i++)\r
                        {\r
@@ -1242,7 +1335,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       DebuggerRefreshWindows();\r
+                       RefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1255,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
@@ -1367,6 +1462,7 @@ void MainWin::LoadSoftware(QString file)
        running = false;                                                        // Prevent bad things(TM) from happening...\r
        pauseForFileSelector = false;                           // Reset the file selector pause flag\r
 \r
+       // Setup BIOS in his own dedicated Jaguar memory\r
 #ifndef NEWMODELSBIOSHANDLER\r
        uint8_t * biosPointer = jaguarBootROM;\r
 \r
@@ -1380,6 +1476,7 @@ void MainWin::LoadSoftware(QString file)
        SelectBIOS(vjs.biosType);\r
 #endif\r
 \r
+       // Turn 'on' the power to initialize the Jaguar\r
        powerAct->setDisabled(false);\r
        powerAct->setChecked(true);\r
        powerButtonOn = false;\r
@@ -1387,7 +1484,7 @@ void MainWin::LoadSoftware(QString file)
 \r
        // We have to load our software *after* the Jaguar RESET\r
        cartridgeLoaded = JaguarLoadFile(file.toUtf8().data());\r
-       SET32(jaguarMainRAM, 0, vjs.DRAM_size);         // Set top of stack...\r
+       SET32(jaguarMainRAM, 0, vjs.DRAM_size);                                         // Set stack in the M68000's Reset SP\r
 \r
        // This is icky because we've already done it\r
 // it gets worse :-P\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
@@ -1410,13 +1508,14 @@ void MainWin::LoadSoftware(QString file)
        }\r
        else\r
        {\r
-               // Prevent the Alpine mode to crash in case of software without a start address\r
-               if (vjs.hardwareTypeAlpine && !jaguarRunAddress)\r
+               // Prevent the launch in case of software without a start address and without BIOS presence\r
+               if (!vjs.useJaguarBIOS && !jaguarRunAddress)\r
                {\r
                        ToggleRunState();\r
                }\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
+       BreakpointsWin->show();\r
+       BreakpointsWin->RefreshContents();\r
+}\r
+\r
+\r
+// Delete all breakpoints\r
+void MainWin::DeleteAllBreakpoints(void)\r
 {\r
-       //brkWin->show();\r
-       //brkWin->RefreshContents();\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
@@ -1698,12 +1876,13 @@ void MainWin::ShowVideoOutputWin(void)
 #endif\r
 \r
 \r
+// Resize video window based on zoom factor\r
+// It doesn't apply in debugger mode as we use this window to display disassembly\r
 void MainWin::ResizeMainWindow(void)\r
 {\r
        if (!vjs.softTypeDebugger)\r
        {\r
-               videoWidget->setFixedSize(zoomLevel * VIRTUAL_SCREEN_WIDTH,\r
-                       zoomLevel * (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL));\r
+               videoWidget->setFixedSize(zoomLevel * VIRTUAL_SCREEN_WIDTH,     zoomLevel * (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL));\r
 \r
                // Show the test pattern if user requested plzDontKillMyComputer mode\r
                if (!powerButtonOn && plzDontKillMyComputer)\r
@@ -1711,9 +1890,13 @@ void MainWin::ResizeMainWindow(void)
                        for (uint32_t y = 0; y < videoWidget->rasterHeight; y++)\r
                        {\r
                                if (vjs.hardwareTypeNTSC)\r
+                               {\r
                                        memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
+                               }\r
                                else\r
+                               {\r
                                        memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern2 + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t));\r
+                               }\r
                        }\r
                }\r
 \r
@@ -1758,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
@@ -1771,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
@@ -1783,12 +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("  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
@@ -1840,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
@@ -1873,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
@@ -1893,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
@@ -1905,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
@@ -1968,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
@@ -2021,8 +2245,8 @@ void MainWin::WriteSettings(void)
        settings.setValue("jaguarModel", vjs.jaguarModel);\r
        settings.setValue("biosType", vjs.biosType);\r
        settings.setValue("useFastBlitter", vjs.useFastBlitter);\r
-       settings.setValue("JagBootROM", vjs.jagBootPath);\r
-       settings.setValue("CDBootROM", vjs.CDBootPath);\r
+       //settings.setValue("JagBootROM", vjs.jagBootPath);\r
+       //settings.setValue("CDBootROM", vjs.CDBootPath);\r
        settings.setValue("EEPROMs", vjs.EEPROMPath);\r
        settings.setValue("ROMs", vjs.ROMPath);\r
        settings.setValue("Screenshots", vjs.screenshotPath);\r
@@ -2033,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
@@ -2100,6 +2327,7 @@ void MainWin::WriteSettings(void)
 #endif\r
 \r
        WriteProfiles(&settings);\r
+       DBGManager_SourceFileSearchPathsSet(vjs.sourcefilesearchPaths);\r
 }\r
 \r
 \r
@@ -2121,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
@@ -2131,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
@@ -2166,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
@@ -2187,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
@@ -2202,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
@@ -2223,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
@@ -2247,6 +2540,6 @@ void MainWin::MakeScreenshot(void)
 \r
        // Create screenshot\r
        screenshot = videoWidget->grabFrameBuffer();\r
-       screenshot.save(Text, "JPG", 100);\r
+       screenshot.save((char *)Text, "JPG", 100);\r
 }\r
 \r