Jaguar model and BIOS configuration integration
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index 2e6552c..bf7db69 100644 (file)
 // JPM  01/11/2017  Added stack browser\r
 // JPM  01/02/2017  Added GPU disassembly\r
 // JPM  02/02/2017  Added DSP disassembly\r
-// JPM  07/12/2017  Added all Watch browser window\r
-// JPM  08/01/2017  Added heap allocator browser window\r
-// JPM  08/07/2017  Added memories window browser\r
+// JPM  07/12/2017  Added all Watch window\r
+// JPM  08/01/2017  Added heap allocator window\r
+// JPM  08/07/2017  Added memories window\r
 // JPM  08/10/2017  Added a restart feature\r
-// JPM  08/31/2017  Added breakpoints winndow\r
+// JPM  08/31/2017  Added breakpoints window [Not Supported]\r
 // JPM  09/01/2017  Save position & visibility windows status in the settings\r
 // JPM  09/02/2017  Save size windows in the settings\r
 // JPM  09/05/2017  Added Exception Vector Table window\r
 // JPM  09/06/2017  Added the 'Rx' word to the emulator window name\r
 // JPM  09/12/2017  Added the keybindings in the settings\r
-// JPM  11/04/2017  Added the local browser window\r
+// JPM  11/04/2017  Added the local window\r
+// JPM  08/31/2018  Added the call stack window\r
+// JPM  09/04/2018  Added the new Models and BIOS handler\r
 //\r
 \r
 // FIXED:\r
 #include "debug/opbrowser.h"\r
 #include "debug/riscdasmbrowser.h"\r
 \r
-#include "debugger/allwatchbrowser.h"\r
-#include "debugger/localbrowser.h"\r
-#include "debugger/heapallocatorbrowser.h"\r
-\r
 #include "dac.h"\r
 #include "jaguar.h"\r
 #include "log.h"\r
 #include "file.h"\r
+#ifndef NEWMODELSBIOSHANDLER\r
 #include "jagbios.h"\r
 #include "jagbios2.h"\r
-#include "jagcdbios.h"\r
 #include "jagstub2bios.h"\r
+#else\r
+#include "modelsBIOS.h"\r
+#endif\r
+#include "jagcdbios.h"\r
 #include "joystick.h"\r
 #include "m68000/m68kinterface.h"\r
 \r
 #include "debugger/memory1browser.h"\r
 #include "debugger/brkWin.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
+\r
 \r
 // According to SebRmv, this header isn't seen on Arch Linux either... :-/\r
 //#ifdef __GCCWIN32__\r
@@ -195,6 +202,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                heapallocatorBrowseWin = new HeapAllocatorBrowserWindow(this);\r
                brkWin = new BrkWindow(this);\r
                exceptionvectortableBrowseWin = new ExceptionVectorTableBrowserWindow(this);\r
+               CallStackBrowseWin = new CallStackBrowserWindow(this);\r
 \r
                mem1BrowseWin = (Memory1BrowserWindow **)calloc(vjs.nbrmemory1browserwindow, sizeof(Memory1BrowserWindow));\r
 #ifdef _MSC_VER\r
@@ -353,29 +361,29 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
        if (vjs.softTypeDebugger)\r
        {\r
-               restartAct = new QAction(QIcon(":/res/Restart.png"), tr("&Restart"), this);\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(Restart()));\r
+               connect(restartAct, SIGNAL(triggered()), this, SLOT(DebuggerRestart()));\r
 \r
-               traceStepOverAct = new QAction(QIcon(":/res/StepOver.png"), tr("&Step Over"), this);\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(TraceStepOver()));\r
+               connect(traceStepOverAct, SIGNAL(triggered()), this, SLOT(DebuggerTraceStepOver()));\r
 \r
-               traceStepIntoAct = new QAction(QIcon(":/res/StepInto.png"), tr("&Step Into"), this);\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(TraceStepInto()));\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
@@ -396,11 +404,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                exceptionVectorTableBrowseAct->setStatusTip(tr("Shows all Exception Vector Table browser window"));\r
                connect(exceptionVectorTableBrowseAct, SIGNAL(triggered()), this, SLOT(ShowExceptionVectorTableBrowserWin()));\r
 \r
-               allWatchBrowseAct = new QAction(QIcon(":/res/Watch.png"), tr("All Watch"), this);\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
-               LocalBrowseAct = new QAction(QIcon(":/res/Local.png"), tr("Local"), this);\r
+               LocalBrowseAct = new QAction(QIcon(":/res/debug-local.png"), tr("Local"), this);\r
                LocalBrowseAct->setStatusTip(tr("Shows Local browser window"));\r
                connect(LocalBrowseAct, SIGNAL(triggered()), this, SLOT(ShowLocalBrowserWin()));\r
 \r
@@ -408,6 +416,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                heapallocatorBrowseAct->setStatusTip(tr("Shows the heap allocator browser window"));\r
                connect(heapallocatorBrowseAct, SIGNAL(triggered()), this, SLOT(ShowHeapAllocatorBrowserWin()));\r
 \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
                mem1BrowseAct = (QAction **)calloc(vjs.nbrmemory1browserwindow, sizeof(QAction));\r
                QSignalMapper *signalMapper = new QSignalMapper(this);\r
 #ifdef _MSC_VER\r
@@ -419,7 +431,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                {\r
                        char MB[100];\r
                        sprintf(MB, "Memory %i", (unsigned int)(i+1));\r
-                       mem1BrowseAct[i] = new QAction(QIcon(":/res/tool-memory.png"), tr(MB), this);\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
@@ -509,6 +521,8 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                        debugWindowsWatchMenu->addAction(allWatchBrowseAct);\r
                        debugWindowsMenu->addAction(LocalBrowseAct);\r
                        debugWindowsMenu->addSeparator();\r
+                       debugWindowsMenu->addAction(CallStackBrowseAct);\r
+                       debugWindowsMenu->addSeparator();\r
                        debugWindowsMemoryMenu = debugWindowsMenu->addMenu(tr("&Memory"));\r
                        debugWindowsMemoryMenu->addAction(heapallocatorBrowseAct);\r
                        debugWindowsMemoryMenu->addSeparator();\r
@@ -669,8 +683,13 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        WriteLog("Virtual Jaguar %s Rx (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__);\r
        WriteLog("VJ: Initializing jaguar subsystem...\n");\r
        JaguarInit();\r
-//     memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS\r
+\r
+#ifndef NEWMODELSBIOSHANDLER\r
+       //      memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS\r
        memcpy(jagMemSpace + 0xE00000, (vjs.biosType == BT_K_SERIES ? jaguarBootROM : jaguarBootROM2), 0x20000);        // Use the stock BIOS\r
+#else\r
+       SelectBIOS(vjs.biosType);\r
+#endif\r
 \r
        // Prevent the file scanner from running if filename passed\r
        // in on the command line...\r
@@ -694,7 +713,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
                // Attempt to load/run the ABS file...\r
                LoadSoftware(vjs.absROMPath);\r
+#ifndef NEWMODELSBIOSHANDLER\r
                memcpy(jagMemSpace + 0xE00000, jaguarDevBootROM2, 0x20000);     // Use the stub BIOS\r
+#else\r
+               SelectBIOS(vjs.biosType);\r
+#endif\r
                // Prevent the scanner from running...\r
                return;\r
        }\r
@@ -716,8 +739,12 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 \r
                // Attempt to load/run the ABS file...\r
                LoadSoftware(vjs.absROMPath);\r
+#ifndef NEWMODELSBIOSHANDLER\r
                memcpy(jagMemSpace + 0xE00000, jaguarDevBootROM2, 0x20000);     // Use the stub BIOS\r
                                                                                                                                        // Prevent the scanner from running...\r
+#else\r
+               SelectBIOS(vjs.biosType);\r
+#endif\r
                return;\r
        }\r
 \r
@@ -998,7 +1025,7 @@ void MainWin::Configure(void)
        // Just in case we crash before a clean exit...\r
        WriteSettings();\r
 \r
-       RefreshDebuggerWindows();\r
+       DebuggerRefreshWindows();\r
 }\r
 \r
 \r
@@ -1154,12 +1181,12 @@ void MainWin::TogglePowerState(void)
 // does the expected thing. Otherwise, if we use the file picker to insert a\r
 // cart, we expect to run the cart! Maybe have a RemoveCart function that only\r
 // works if the CD unit is active?\r
-                       setWindowTitle(QString("Virtual Jaguar " VJ_RELEASE_VERSION\r
-                               " Rx - Now playing: Jaguar CD"));\r
+                       setWindowTitle(QString("Virtual Jaguar " VJ_RELEASE_VERSION     " Rx - Now playing: Jaguar CD"));\r
                }\r
 \r
                WriteLog("GUI: Resetting Jaguar...\n");\r
                JaguarReset();\r
+               DebuggerResetWindows();\r
                DACPauseAudioThread(false);\r
        }\r
 }\r
@@ -1203,7 +1230,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       RefreshDebuggerWindows();\r
+                       DebuggerRefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1322,24 +1349,24 @@ void MainWin::Unpause(void)
 }\r
 \r
 \r
+// Jaguar initialisation and load software file\r
 void MainWin::LoadSoftware(QString file)\r
 {\r
        running = false;                                                        // Prevent bad things(TM) from happening...\r
        pauseForFileSelector = false;                           // Reset the file selector pause flag\r
 \r
+#ifndef NEWMODELSBIOSHANDLER\r
        uint8_t * biosPointer = jaguarBootROM;\r
 \r
-       if (vjs.hardwareTypeAlpine)\r
-       {\r
-               biosPointer = jaguarDevBootROM2;\r
-       }\r
-\r
-       if (vjs.softTypeDebugger)\r
+       if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger)\r
        {\r
                biosPointer = jaguarDevBootROM2;\r
        }\r
 \r
        memcpy(jagMemSpace + 0xE00000, biosPointer, 0x20000);\r
+#else\r
+       SelectBIOS(vjs.biosType);\r
+#endif\r
 \r
        powerAct->setDisabled(false);\r
        powerAct->setChecked(true);\r
@@ -1362,6 +1389,7 @@ void MainWin::LoadSoftware(QString file)
 // set the M68K in halt mode in case of a debug mode is used, so control is at user side\r
        if (vjs.softTypeDebugger)\r
        {\r
+               m68k_set_reg(M68K_REG_A6, 0);\r
                m68kDasmWin->SetAddress(jaguarRunAddress);\r
                //pauseAct->setDisabled(false);\r
                //pauseAct->setChecked(true);\r
@@ -1370,6 +1398,7 @@ 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
                {\r
                        ToggleRunState();\r
@@ -1405,11 +1434,11 @@ void MainWin::NewBreakpointFunction(void)
 \r
 \r
 // Step Into trace\r
-void MainWin::TraceStepInto(void)\r
+void MainWin::DebuggerTraceStepInto(void)\r
 {\r
        JaguarStepInto();\r
        videoWidget->updateGL();\r
-       RefreshDebuggerWindows();\r
+       DebuggerRefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Step Into function !!!")\r
 #else\r
@@ -1419,13 +1448,18 @@ void MainWin::TraceStepInto(void)
 \r
 \r
 // Restart\r
-void MainWin::Restart(void)\r
+void MainWin::DebuggerRestart(void)\r
 {\r
+#if 1\r
+       m68k_pulse_reset();\r
+#else\r
        m68k_set_reg(M68K_REG_PC, jaguarRunAddress);\r
        m68k_set_reg(M68K_REG_SP, vjs.DRAM_size);\r
-       //m68kDasmWin->SetAddress(jaguarRunAddress);\r
-       ResetDebuggerWindows();\r
-       RefreshDebuggerWindows();\r
+#endif\r
+       m68k_set_reg(M68K_REG_A6, 0);\r
+\r
+       DebuggerResetWindows();\r
+       DebuggerRefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Restart function !!!")\r
 #else\r
@@ -1435,11 +1469,11 @@ void MainWin::Restart(void)
 \r
 \r
 // Step Over trace\r
-void MainWin::TraceStepOver(void)\r
+void MainWin::DebuggerTraceStepOver(void)\r
 {\r
        JaguarStepOver(0);\r
        videoWidget->updateGL();\r
-       RefreshDebuggerWindows();\r
+       DebuggerRefreshWindows();\r
 #ifdef _MSC_VER\r
 #pragma message("Warning: !!! Need to verify the Step Over function !!!")\r
 #else\r
@@ -1531,6 +1565,7 @@ void MainWin::ToggleFullScreen(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowExceptionVectorTableBrowserWin(void)\r
 {\r
        exceptionvectortableBrowseWin->show();\r
@@ -1538,6 +1573,7 @@ void MainWin::ShowExceptionVectorTableBrowserWin(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowLocalBrowserWin(void)\r
 {\r
        LocalBrowseWin->show();\r
@@ -1545,6 +1581,14 @@ void MainWin::ShowLocalBrowserWin(void)
 }\r
 \r
 \r
+// \r
+void MainWin::ShowCallStackBrowserWin(void)\r
+{\r
+       CallStackBrowseWin->show();\r
+       CallStackBrowseWin->RefreshContents();\r
+}\r
+\r
+\r
 void MainWin::ShowAllWatchBrowserWin(void)\r
 {\r
        allWatchBrowseWin->show();\r
@@ -1676,6 +1720,8 @@ void MainWin::ReadSettings(void)
        vjs.hardwareTypeNTSC = settings.value("hardwareTypeNTSC", true).toBool();\r
        vjs.frameSkip = settings.value("frameSkip", 0).toInt();\r
        vjs.useJaguarBIOS = settings.value("useJaguarBIOS", false).toBool();\r
+       vjs.useRetailBIOS = settings.value("useRetailBIOS", false).toBool();\r
+       vjs.useDevBIOS = settings.value("useDevBIOS", false).toBool();\r
        vjs.GPUEnabled = settings.value("GPUEnabled", true).toBool();\r
        vjs.DSPEnabled = settings.value("DSPEnabled", true).toBool();\r
        vjs.audioEnabled = settings.value("audioEnabled", true).toBool();\r
@@ -1685,6 +1731,7 @@ void MainWin::ReadSettings(void)
        vjs.glFilter = settings.value("glFilterType", 1).toInt();\r
        vjs.renderType = settings.value("renderType", 0).toInt();\r
        vjs.biosType = settings.value("biosType", BT_M_SERIES).toInt();\r
+       vjs.jaguarModel = settings.value("jaguarModel", JAG_M_SERIES).toInt();\r
        vjs.useFastBlitter = settings.value("useFastBlitter", false).toBool();\r
        strcpy(vjs.EEPROMPath, settings.value("EEPROMs", QStandardPaths::writableLocation(QStandardPaths::DataLocation).append("/eeproms/")).toString().toUtf8().data());\r
        strcpy(vjs.ROMPath, settings.value("ROMs", QStandardPaths::writableLocation(QStandardPaths::DataLocation).append("/software/")).toString().toUtf8().data());\r
@@ -1895,6 +1942,13 @@ void MainWin::ReadUISettings(void)
                size = settings.value("exceptionVectorTableBrowseWinSize", QSize(400, 400)).toSize();\r
                exceptionvectortableBrowseWin->resize(size);\r
 \r
+               // Call Stack browser UI information\r
+               pos = settings.value("CallStackBrowseWinPos", QPoint(200, 200)).toPoint();\r
+               CallStackBrowseWin->move(pos);\r
+               settings.value("CallStackBrowseWinIsVisible", false).toBool() ? ShowCallStackBrowserWin() : void();\r
+               size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize();\r
+               CallStackBrowseWin->resize(size);\r
+\r
                // Memories browser UI information\r
                for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r
@@ -1935,6 +1989,8 @@ void MainWin::WriteSettings(void)
        settings.setValue("hardwareTypeNTSC", vjs.hardwareTypeNTSC);\r
        settings.setValue("frameSkip", vjs.frameSkip);\r
        settings.setValue("useJaguarBIOS", vjs.useJaguarBIOS);\r
+       settings.setValue("useRetailBIOS", vjs.useRetailBIOS);\r
+       settings.setValue("useDevBIOS", vjs.useDevBIOS);\r
        settings.setValue("GPUEnabled", vjs.GPUEnabled);\r
        settings.setValue("DSPEnabled", vjs.DSPEnabled);\r
        settings.setValue("audioEnabled", vjs.audioEnabled);\r
@@ -1943,6 +1999,7 @@ void MainWin::WriteSettings(void)
        settings.setValue("useOpenGL", vjs.useOpenGL);\r
        settings.setValue("glFilterType", vjs.glFilter);\r
        settings.setValue("renderType", vjs.renderType);\r
+       settings.setValue("jaguarModel", vjs.jaguarModel);\r
        settings.setValue("biosType", vjs.biosType);\r
        settings.setValue("useFastBlitter", vjs.useFastBlitter);\r
        settings.setValue("JagBootROM", vjs.jagBootPath);\r
@@ -2086,6 +2143,9 @@ void MainWin::WriteUISettings(void)
                settings.setValue("exceptionVectorTableBrowseWinPos", exceptionvectortableBrowseWin->pos());\r
                settings.setValue("exceptionVectorTableBrowseWinIsVisible", exceptionvectortableBrowseWin->isVisible());\r
                settings.setValue("exceptionVectorTableBrowseWinSize", exceptionvectortableBrowseWin->size());\r
+               settings.setValue("CallStackBrowseWinPos", CallStackBrowseWin->pos());\r
+               settings.setValue("CallStackBrowseWinIsVisible", CallStackBrowseWin->isVisible());\r
+               settings.setValue("CallStackBrowseWinSize", CallStackBrowseWin->size());\r
                for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r
                        sprintf(mem1Name, "mem1BrowseWinPos[%i]", (unsigned int)i);\r
@@ -2114,20 +2174,21 @@ void    MainWin::RefreshAlpineWindows(void)
 }\r
 \r
 \r
-// Reset soft debugger & alpine debug windows\r
-void MainWin::ResetDebuggerWindows(void)\r
+// Reset soft debugger windows\r
+void MainWin::DebuggerResetWindows(void)\r
 {\r
        if (vjs.softTypeDebugger)\r
        {\r
+               allWatchBrowseWin->Reset();\r
                heapallocatorBrowseWin->Reset();\r
-       }\r
 \r
-       //ResetAlpineWindows();\r
+               //ResetAlpineWindows();\r
+       }\r
 }\r
 \r
 \r
 // Refresh soft debugger & alpine debug windows\r
-void MainWin::RefreshDebuggerWindows(void)\r
+void MainWin::DebuggerRefreshWindows(void)\r
 {\r
        size_t i;\r
 \r
@@ -2138,6 +2199,7 @@ void MainWin::RefreshDebuggerWindows(void)
                DSPDasmWin->RefreshContents();\r
                allWatchBrowseWin->RefreshContents();\r
                LocalBrowseWin->RefreshContents();\r
+               CallStackBrowseWin->RefreshContents();\r
                heapallocatorBrowseWin->RefreshContents();\r
                for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
                {\r