// 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
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
// 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
\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
// 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
\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
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("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