Added screenshot feature
[clinton/Virtual-Jaguar-Rx.git] / src / gui / mainwin.cpp
index 0bbf2df..cd312dc 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
+// JPM  09/17/2018  Added a screenshot feature\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
@@ -145,6 +153,8 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        //      setCentralWidget(mainWindowCentrale);\r
        //}\r
 \r
+       WriteLog("Window creation start\n");\r
+\r
        // video output\r
        videoWidget = new GLWidget(this);\r
        videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\r
@@ -193,6 +203,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
@@ -250,9 +261,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        powerAct->setChecked(false);\r
        connect(powerAct, SIGNAL(triggered()), this, SLOT(TogglePowerState()));\r
 \r
+       // Pause feature\r
        QIcon pauseIcon;\r
-       pauseIcon.addFile(":/res/pause-off", QSize(), QIcon::Normal, QIcon::Off);\r
-       pauseIcon.addFile(":/res/pause-on", QSize(), QIcon::Normal, QIcon::On);\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
        pauseAct = new QAction(pauseIcon, tr("Pause"), this);\r
        pauseAct->setStatusTip(tr("Toggles the running state"));\r
        pauseAct->setCheckable(true);\r
@@ -262,6 +274,14 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        pauseAct->setShortcutContext(Qt::ApplicationShortcut);\r
        connect(pauseAct, SIGNAL(triggered()), this, SLOT(ToggleRunState()));\r
 \r
+       // Screenshot feature\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
+       screenshotAct->setCheckable(false);\r
+       screenshotAct->setDisabled(false);\r
+       connect(screenshotAct, SIGNAL(triggered()), this, SLOT(MakeScreenshot()));\r
+\r
        zoomActs = new QActionGroup(this);\r
 \r
        x1Act = new QAction(QIcon(":/res/zoom100.png"), tr("Zoom 100%"), zoomActs);\r
@@ -351,29 +371,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
@@ -394,18 +414,22 @@ 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->setStatusTip(tr("Shows Local browser 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
                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
+               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
@@ -417,7 +441,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
@@ -507,6 +531,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
@@ -566,6 +592,8 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        toolbar->addSeparator();\r
        if (!vjs.softTypeDebugger)\r
        {\r
+               toolbar->addAction(screenshotAct);\r
+               toolbar->addSeparator();\r
                toolbar->addAction(x1Act);\r
                toolbar->addAction(x2Act);\r
                toolbar->addAction(x3Act);\r
@@ -614,7 +642,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        // Do this in case original size isn't correct (mostly for the first-run case)\r
        ResizeMainWindow();\r
 \r
-       // Create our test pattern bitmaps\r
+       WriteLog("Window creation done\n");\r
+\r
+       // Create our test pattern NTSC bitmap\r
+       WriteLog("Test pattern 1 bitmap\n");\r
+\r
        QImage tempImg(":/res/test-pattern.jpg");\r
        QImage tempImgScaled = tempImg.scaled(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_PAL, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);\r
 \r
@@ -629,7 +661,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                }\r
        }\r
 \r
-       QImage tempImg2(":/res/test-pattern-pal");\r
+       // Create our test pattern PAL bitmap\r
+       WriteLog("Test pattern 2 bitmap\n");\r
+\r
+       QImage tempImg2(":/res/test-pattern-pal.jpg");\r
        QImage tempImgScaled2 = tempImg2.scaled(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_PAL, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);\r
 \r
        for(uint32_t y=0; y<VIRTUAL_SCREEN_HEIGHT_PAL; y++)\r
@@ -660,8 +695,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
@@ -685,7 +725,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
@@ -707,8 +751,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
@@ -989,7 +1037,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
@@ -1145,12 +1193,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
@@ -1194,7 +1242,7 @@ void MainWin::ToggleRunState(void)
 \r
                        cpuBrowseWin->HoldBPM();\r
                        cpuBrowseWin->HandleBPMContinue();\r
-                       RefreshDebuggerWindows();\r
+                       DebuggerRefreshWindows();\r
                }\r
        }\r
        else\r
@@ -1313,24 +1361,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
@@ -1353,6 +1401,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
@@ -1361,6 +1410,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
@@ -1396,11 +1446,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
@@ -1410,13 +1460,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
@@ -1426,11 +1481,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
@@ -1522,6 +1577,7 @@ void MainWin::ToggleFullScreen(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowExceptionVectorTableBrowserWin(void)\r
 {\r
        exceptionvectortableBrowseWin->show();\r
@@ -1529,6 +1585,7 @@ void MainWin::ShowExceptionVectorTableBrowserWin(void)
 }\r
 \r
 \r
+// \r
 void MainWin::ShowLocalBrowserWin(void)\r
 {\r
        LocalBrowseWin->show();\r
@@ -1536,6 +1593,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
@@ -1667,6 +1732,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
@@ -1676,9 +1743,11 @@ 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
+       strcpy(vjs.screenshotPath, settings.value("Screenshots", QStandardPaths::writableLocation(QStandardPaths::DataLocation).append("/screenshots/")).toString().toUtf8().data());\r
 \r
        // Read settings from the Debugger mode\r
        settings.beginGroup("debugger");\r
@@ -1762,6 +1831,8 @@ void MainWin::ReadSettings(void)
        vjs.p2KeyBindings[BUTTON_s] = settings.value("p2k_star", Qt::Key_Asterisk).toInt();\r
 #endif\r
 \r
+       WriteLog("Read setting = Done\n");\r
+\r
        ReadProfiles(&settings);\r
 }\r
 \r
@@ -1884,6 +1955,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
@@ -1899,6 +1977,8 @@ void MainWin::ReadUISettings(void)
        }\r
 \r
        settings.endGroup();\r
+\r
+       WriteLog("Read UI setting = Done\n");\r
 }\r
 \r
 \r
@@ -1922,6 +2002,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
@@ -1930,12 +2012,14 @@ 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
        settings.setValue("CDBootROM", vjs.CDBootPath);\r
        settings.setValue("EEPROMs", vjs.EEPROMPath);\r
        settings.setValue("ROMs", vjs.ROMPath);\r
+       settings.setValue("Screenshots", vjs.screenshotPath);\r
 \r
        // Write settings from the Alpine mode\r
        settings.beginGroup("alpine");\r
@@ -2073,6 +2157,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
@@ -2101,20 +2188,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
@@ -2125,6 +2213,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
@@ -2134,3 +2223,22 @@ void MainWin::RefreshDebuggerWindows(void)
                RefreshAlpineWindows();\r
        }\r
 }\r
+\r
+\r
+// Create and save screenshot\r
+void MainWin::MakeScreenshot(void)\r
+{\r
+       char Text[256];\r
+       QImage screenshot;\r
+       time_t now = time(0);\r
+       struct tm tstruct;\r
+\r
+       // Create filename\r
+       tstruct = *localtime(&now);\r
+       sprintf(Text, "%svj_%i%i%i_%i%i%i.jpg", vjs.screenshotPath, tstruct.tm_year, tstruct.tm_mon, tstruct.tm_mday, tstruct.tm_hour, tstruct.tm_min, tstruct.tm_sec);\r
+\r
+       // Create screenshot\r
+       screenshot = videoWidget->grabFrameBuffer();\r
+       screenshot.save(Text, "JPG", 100);\r
+}\r
+\r