UI modifications and crash fix
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index 2e6552c..5a0c4fd 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
 //\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 "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 +197,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 +356,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 +399,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 +411,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 +426,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 +516,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
@@ -998,7 +1007,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 +1163,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 +1212,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       RefreshDebuggerWindows();\r
+                       DebuggerRefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1322,6 +1331,7 @@ 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
@@ -1329,12 +1339,7 @@ void MainWin::LoadSoftware(QString file)
 \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
@@ -1362,6 +1367,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
@@ -1405,11 +1411,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 +1425,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 +1446,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 +1542,7 @@ void MainWin::ToggleFullScreen(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowExceptionVectorTableBrowserWin(void)\r
 {\r
        exceptionvectortableBrowseWin->show();\r
@@ -1538,6 +1550,7 @@ void MainWin::ShowExceptionVectorTableBrowserWin(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowLocalBrowserWin(void)\r
 {\r
        LocalBrowseWin->show();\r
@@ -1545,6 +1558,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
@@ -1895,6 +1916,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
@@ -2086,6 +2114,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 +2145,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 +2170,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