Added a HW registers browser window and set a tab for the Blitter
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index 1b547e2..98f1df8 100644 (file)
 // JPM  11/04/2017  Added the local window\r
 // JPM  08/31/2018  Added the call stack window\r
 // JPM  Sept./2018  Added the new Models and BIOS handler, a screenshot feature and source code files browsing\r
-// JPM   Oct./2018  Added search paths in the settings, breakpoints feature, cartdridge view menu\r
+// JPM   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  04/06/2019  Added ELF sections check\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\r
 //\r
 \r
 // FIXED:\r
@@ -70,6 +71,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 "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
@@ -179,16 +182,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
@@ -200,6 +209,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                heapallocatorBrowseWin = new HeapAllocatorBrowserWindow(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
@@ -418,6 +428,12 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                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
                //connect(VideoOutputAct, SIGNAL(triggered()), this, SLOT(ShowVideoOutputWin()));\r
@@ -453,7 +469,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
                // Cart files list\r
                CartFilesListAct = new QAction(QIcon(""), tr("Directory and files"), this);\r
-               CartFilesListAct->setStatusTip(tr("List of the files in the cartdridge's directory"));\r
+               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
@@ -501,6 +517,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
@@ -529,13 +550,15 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        // Alpine and debugger menus\r
        if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
-               // Create debug & view menu\r
+               // Create debug menu\r
                debugMenu = menuBar()->addMenu(tr("&Debug"));\r
-               viewMenu = menuBar()->addMenu(tr("&View"));\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
@@ -576,6 +599,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
@@ -588,6 +612,8 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        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
@@ -602,6 +628,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        debugMenu->addAction(opBrowseAct);\r
                        debugMenu->addAction(m68kDasmBrowseAct);\r
                        debugMenu->addAction(riscDasmBrowseAct);\r
+                       debugMenu->addAction(hwRegsBrowseAct);\r
                }\r
        }\r
 \r
@@ -658,6 +685,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
@@ -1071,7 +1099,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
@@ -1123,16 +1151,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
@@ -1237,7 +1268,9 @@ void MainWin::TogglePowerState(void)
                WriteLog("GUI: Resetting Jaguar...\n");\r
                JaguarReset();\r
                DebuggerReset();\r
+               CommonReset();\r
                DebuggerResetWindows();\r
+               CommonResetWindows();\r
                DACPauseAudioThread(false);\r
        }\r
 }\r
@@ -1283,7 +1316,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       DebuggerRefreshWindows();\r
+                       RefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1461,6 +1494,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
@@ -1515,7 +1549,7 @@ void MainWin::ShowNewFunctionBreakpointWin(void)
 }\r
 \r
 \r
-// \r
+// Display list of files found in cartridge\r
 void MainWin::ShowCartFilesListWin(void)\r
 {\r
        CartFilesListWin->show();\r
@@ -1523,12 +1557,19 @@ void MainWin::ShowCartFilesListWin(void)
 }\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
        videoWidget->updateGL();\r
-       DebuggerRefreshWindows();\r
+       RefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Step Into function !!!")\r
 #else\r
@@ -1550,7 +1591,8 @@ void MainWin::DebuggerRestart(void)
        m68k_brk_hitcounts_reset();\r
        bpmHitCounts = 0;\r
        DebuggerResetWindows();\r
-       DebuggerRefreshWindows();\r
+       CommonResetWindows();\r
+       RefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Restart function !!!")\r
 #else\r
@@ -1564,7 +1606,7 @@ void MainWin::DebuggerTraceStepOver(void)
 {\r
        JaguarStepOver(0);\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
@@ -1732,6 +1774,7 @@ void MainWin::ShowCPUBrowserWin(void)
 }\r
 \r
 \r
+// Show the OP browser window\r
 void MainWin::ShowOPBrowserWin(void)\r
 {\r
        opBrowseWin->show();\r
@@ -1739,6 +1782,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
@@ -1963,6 +2015,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
@@ -1983,11 +2040,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
@@ -1995,6 +2047,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
@@ -2058,13 +2117,20 @@ void MainWin::ReadUISettings(void)
                size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize();\r
                CallStackBrowseWin->resize(size);\r
 \r
-               // Cartdridge directory and files\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
@@ -2234,6 +2300,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
@@ -2244,11 +2314,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
@@ -2288,6 +2359,9 @@ void MainWin::WriteUISettings(void)
                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
@@ -2310,10 +2384,22 @@ 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
@@ -2342,6 +2428,13 @@ void MainWin::DebuggerResetWindows(void)
 }\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
@@ -2349,6 +2442,14 @@ void MainWin::ViewRefreshWindows(void)
 }\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