// 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
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
\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
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
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
{\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
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
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
\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
\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
// Just in case we crash before a clean exit...\r
WriteSettings();\r
\r
- RefreshDebuggerWindows();\r
+ DebuggerRefreshWindows();\r
}\r
\r
\r
// 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
\r
cpuBrowseWin->HoldBPM();\r
cpuBrowseWin->HandleBPMContinue();\r
- RefreshDebuggerWindows();\r
+ DebuggerRefreshWindows();\r
}\r
}\r
else\r
}\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
// 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
}\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
\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
\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
\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
}\r
\r
\r
+// \r
void MainWin::ShowExceptionVectorTableBrowserWin(void)\r
{\r
exceptionvectortableBrowseWin->show();\r
}\r
\r
\r
+// \r
void MainWin::ShowLocalBrowserWin(void)\r
{\r
LocalBrowseWin->show();\r
}\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
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
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
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
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
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("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
}\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
DSPDasmWin->RefreshContents();\r
allWatchBrowseWin->RefreshContents();\r
LocalBrowseWin->RefreshContents();\r
+ CallStackBrowseWin->RefreshContents();\r
heapallocatorBrowseWin->RefreshContents();\r
for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
{\r