//\r
// JLH = James Hammons <jlhamm@acm.org>\r
// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
+// RG = Richard Goedeken\r
+\r
//\r
// Who When What\r
// --- ---------- ------------------------------------------------------------\r
// JPM Oct./2018 Added search paths in the settings, breakpoints feature, cartridge view menu\r
// JPM 11/18/2018 Fix crash with non-debugger mode\r
// JPM April/2019 Added ELF sections check, added a save memory dump\r
-// JPM Aug./2019 Update texts descriptions, set cartridge view menu for debugger mode only\r
+// JPM Aug./2019 Update texts descriptions, set cartridge view menu for debugger mode only, added a HW registers browser and source level tracing\r
+// JPM Marc./2020 Added the step over for source level tracing\r
+// RG Jan./2021 Linux build fixes\r
+// JPM Apr./2021 Handle number of M68K cycles used in tracing mode, added video output display in a window\r
//\r
\r
// FIXED:\r
//\r
// STILL TO BE DONE:\r
//\r
+// - The source file listing do not need to be refresh more than one time\r
// - Fix bug in switching between PAL & NTSC in fullscreen mode.\r
// - Remove SDL dependencies (sound, mainly) from Jaguar core lib\r
-// - Fix inconsistency with trailing slashes in paths (eeproms needs one,\r
-// software doesn't)\r
+// - Fix inconsistency with trailing slashes in paths (eeproms needs one, software doesn't)\r
//\r
// SFDX CODE: S1E9T8H5M23YS\r
\r
#include "debug/stackbrowser.h"\r
#include "debug/opbrowser.h"\r
#include "debug/riscdasmbrowser.h"\r
+#include "debug/hwregsbrowser.h"\r
\r
#include "dac.h"\r
#include "jaguar.h"\r
#include "m68000/m68kinterface.h"\r
\r
#include "debugger/DBGManager.h"\r
-//#include "debugger/VideoWin.h"\r
+#include "debugger/VideoWin.h"\r
//#include "debugger/DasmWin.h"\r
-#include "debugger/m68KDasmWin.h"\r
+#include "debugger/SourcesWin.h"\r
+#include "debugger/m68kDasmWin.h"\r
#include "debugger/GPUDasmWin.h"\r
#include "debugger/DSPDasmWin.h"\r
#include "debugger/memory1browser.h"\r
opBrowseWin = new OPBrowserWindow(this);\r
m68kDasmBrowseWin = new M68KDasmBrowserWindow(this);\r
riscDasmBrowseWin = new RISCDasmBrowserWindow(this);\r
+ hwRegsBrowseWin = new HWRegsBrowserWindow(this);\r
\r
// Windows debugger mode features\r
if (vjs.softTypeDebugger)\r
{\r
- //VideoOutputWin = new VideoOutputWindow(this);\r
+ VideoOutputWin = new VideoOutputWindow(this);\r
+ //VideoOutputWin->show();\r
//VideoOutputWin->setCentralWidget()\r
//DasmWin = new DasmWindow();\r
//DasmWin = new DasmWindow(this);\r
#endif\r
// Setup disasm tabs\r
dasmtabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);\r
- dasmtabWidget->addTab(m68kDasmWin = new m68KDasmWindow(this), tr("M68000"));\r
+ dasmtabWidget->addTab(SourcesWin = new SourcesWindow(this), tr("Sources"));\r
+ dasmtabWidget->setCurrentIndex(dasmtabWidget->addTab(m68kDasmWin = new m68KDasmWindow(this), tr("M68000")));\r
dasmtabWidget->addTab(GPUDasmWin = new GPUDasmWindow(this), tr("GPU"));\r
dasmtabWidget->addTab(DSPDasmWin = new DSPDasmWindow(this), tr("DSP"));\r
+ connect(dasmtabWidget, SIGNAL(currentChanged(const int)), this, SLOT(SelectdasmtabWidget(const int)));\r
#if 1\r
setCentralWidget(dasmtabWidget);\r
#endif\r
saveDumpAsAct->setDisabled(false);\r
connect(saveDumpAsAct, SIGNAL(triggered()), this, SLOT(ShowSaveDumpAsWin()));\r
\r
- //VideoOutputAct = new QAction(tr("Output Video"), this);\r
- //VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
- //connect(VideoOutputAct, SIGNAL(triggered()), this, SLOT(ShowVideoOutputWin()));\r
+ VideoOutputAct = new QAction(tr("Output Video"), this);\r
+ VideoOutputAct->setStatusTip(tr("Shows the output video window"));\r
+ connect(VideoOutputAct, SIGNAL(triggered()), this, SLOT(ShowVideoOutputWin()));\r
\r
//DasmAct = new QAction(tr("Disassembly"), this);\r
//DasmAct->setStatusTip(tr("Shows the disassembly window"));\r
m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window"));\r
connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin()));\r
\r
+ // HW registers browser window\r
+ hwRegsBrowseAct = new QAction(QIcon(":/res/tool-hw-regs.png"), tr("HW Registers Browser"), this);\r
+ hwRegsBrowseAct->setStatusTip(tr("Shows the HW registers browser window"));\r
+ connect(hwRegsBrowseAct, SIGNAL(triggered()), this, SLOT(ShowHWRegsBrowserWin()));\r
+\r
// Risc (DSP / GPU) disassembly browser window\r
riscDasmBrowseAct = new QAction(QIcon(":/res/tool-risc-dis.png"), tr("RISC Listing Browser"), this);\r
riscDasmBrowseAct->setStatusTip(tr("Shows the RISC disassembly browser window"));\r
debugWindowExceptionMenu = debugWindowsMenu->addMenu(tr("&Exception"));\r
debugWindowExceptionMenu->addAction(exceptionVectorTableBrowseAct);\r
debugWindowsMenu->addSeparator();\r
-#if 0\r
debugWindowOutputMenu = debugWindowsMenu->addMenu(tr("&Output"));\r
debugWindowOutputMenu->addAction(VideoOutputAct);\r
debugWindowsMenu->addSeparator();\r
-#endif\r
debugWindowsWatchMenu = debugWindowsMenu->addMenu(tr("&Watch"));\r
debugWindowsWatchMenu->addAction(allWatchBrowseAct);\r
debugWindowsMenu->addAction(LocalBrowseAct);\r
debugWindowsBrowsesMenu->addAction(opBrowseAct);\r
debugWindowsBrowsesMenu->addAction(m68kDasmBrowseAct);\r
debugWindowsBrowsesMenu->addAction(riscDasmBrowseAct);\r
+ debugWindowsBrowsesMenu->addAction(hwRegsBrowseAct);\r
debugMenu->addSeparator();\r
debugMenu->addAction(pauseAct);\r
debugMenu->addAction(frameAdvanceAct);\r
debugMenu->addAction(opBrowseAct);\r
debugMenu->addAction(m68kDasmBrowseAct);\r
debugMenu->addAction(riscDasmBrowseAct);\r
+ debugMenu->addAction(hwRegsBrowseAct);\r
}\r
}\r
\r
debugbar->addAction(opBrowseAct);\r
debugbar->addAction(m68kDasmBrowseAct);\r
debugbar->addAction(riscDasmBrowseAct);\r
+ debugbar->addAction(hwRegsBrowseAct);\r
}\r
\r
// Add actions to the main window, as hiding widgets with them\r
}\r
\r
\r
+// \r
+void MainWin::SelectdasmtabWidget(const int Index)\r
+{\r
+ // check sources tab\r
+ if (Index == 0)\r
+ {\r
+ SourcesWin->RefreshContents();\r
+ }\r
+}\r
+\r
+\r
void MainWin::closeEvent(QCloseEvent * event)\r
{\r
JaguarDone();\r
\r
//if (!vjs.softTypeDebugger)\r
videoWidget->updateGL();\r
+ //vjs.softTypeDebugger ? VideoOutputWin->RefreshContents(videoWidget) : NULL;\r
\r
// FPS handling\r
// Approach: We use a ring buffer to store times (in ms) over a given\r
}\r
\r
videoWidget->updateGL();\r
+ //vjs.softTypeDebugger ? VideoOutputWin->RefreshContents(videoWidget) : NULL;\r
\r
cpuBrowseWin->HoldBPM();\r
cpuBrowseWin->HandleBPMContinue();\r
cpuBrowseWin->UnholdBPM();\r
}\r
\r
+ emuStatusWin->ResetM68KCycles();\r
// Pause/unpause any running/non-running threads...\r
DACPauseAudioThread(!running);\r
}\r
{\r
m68k_set_reg(M68K_REG_A6, 0);\r
m68kDasmWin->SetAddress(jaguarRunAddress);\r
+ SourcesWin->Init();\r
//pauseAct->setDisabled(false);\r
//pauseAct->setChecked(true);\r
ToggleRunState();\r
// Open, or display, the new breakpoint function window\r
void MainWin::ShowNewFunctionBreakpointWin(void)\r
{\r
+ NewFunctionBreakpointWin->SetFnctBreakpointWin(BreakpointsWin);\r
NewFunctionBreakpointWin->show();\r
ShowBreakpointsWin();\r
}\r
// Step Into trace\r
void MainWin::DebuggerTraceStepInto(void)\r
{\r
- JaguarStepInto();\r
+ if (SourcesWin->isVisible() && SourcesWin->GetTraceStatus())\r
+ {\r
+ while (!SourcesWin->CheckChangeLine())\r
+ {\r
+ emuStatusWin->UpdateM68KCycles(JaguarStepInto());\r
+ }\r
+ }\r
+ else\r
+ {\r
+ emuStatusWin->UpdateM68KCycles(JaguarStepInto());\r
+ }\r
+\r
videoWidget->updateGL();\r
RefreshWindows();\r
#ifdef _MSC_VER\r
m68k_set_reg(M68K_REG_PC, jaguarRunAddress);\r
m68k_set_reg(M68K_REG_SP, vjs.DRAM_size);\r
#endif\r
+ dasmtabWidget->setCurrentIndex(1); // set focus on the disasm M68K tab\r
m68k_set_reg(M68K_REG_A6, 0);\r
m68k_brk_hitcounts_reset();\r
+ emuStatusWin->ResetM68KCycles();\r
bpmHitCounts = 0;\r
DebuggerResetWindows();\r
CommonResetWindows();\r
+ SourcesWin->Init();\r
RefreshWindows();\r
#ifdef _MSC_VER\r
#pragma message("Warning: !!! Need to verify the Restart function !!!")\r
// Step Over trace\r
void MainWin::DebuggerTraceStepOver(void)\r
{\r
- JaguarStepOver(0);\r
+ if (SourcesWin->isVisible() && SourcesWin->GetTraceStatus())\r
+ {\r
+ while (!SourcesWin->CheckChangeLine())\r
+ {\r
+ emuStatusWin->UpdateM68KCycles(JaguarStepOver(0));\r
+ }\r
+ }\r
+ else\r
+ {\r
+ emuStatusWin->UpdateM68KCycles(JaguarStepOver(0));\r
+ }\r
+\r
videoWidget->updateGL();\r
RefreshWindows();\r
#ifdef _MSC_VER\r
JaguarExecuteNew();\r
//if (!vjs.softTypeDebugger)\r
videoWidget->updateGL();\r
+ //vjs.softTypeDebugger ? VideoOutputWin->RefreshContents(videoWidget) : NULL;\r
ToggleRunState();\r
// Need to execute 1 frames' worth of DSP thread as well :-/\r
\r
}\r
\r
\r
+// Show the OP browser window\r
void MainWin::ShowOPBrowserWin(void)\r
{\r
opBrowseWin->show();\r
}\r
\r
\r
+// Show the HW registers browser window\r
+void MainWin::ShowHWRegsBrowserWin(void)\r
+{\r
+ hwRegsBrowseWin->show();\r
+ hwRegsBrowseWin->RefreshContents();\r
+}\r
+\r
+\r
+// Show the M68K browser window\r
void MainWin::ShowM68KDasmBrowserWin(void)\r
{\r
m68kDasmBrowseWin->show();\r
\r
\r
// \r
-#if 0\r
void MainWin::ShowVideoOutputWin(void)\r
{\r
//VideoOutputWindowCentrale = mainWindowCentrale->addSubWindow(videoWidget);\r
//VideoOutputWindowCentrale->setWindowTitle(QString(tr("Video output")));\r
//VideoOutputWindowCentrale->show();\r
//memBrowseWin->show();\r
- //VideoOutputWin->show();\r
+ VideoOutputWin->show();\r
+ VideoOutputWin->SetupVideo(videoWidget);\r
+ //VideoOutputWin->adjustSize();\r
//VideoOutputWin->RefreshContents(videoWidget);\r
}\r
-#endif\r
\r
\r
// Resize video window based on zoom factor\r
strcpy(vjs.absROMPath, settings.value("DefaultABS", "").toString().toUtf8().data());\r
vjs.refresh = settings.value("refresh", 60).toUInt();\r
vjs.allowWritesToROM = settings.value("writeROM", false).toBool();\r
+ vjs.allowM68KExceptionCatch = settings.value("M68KExceptionCatch", false).toBool();\r
settings.endGroup();\r
\r
// Read settings from the Keybindings\r
size = settings.value("opBrowseWinSize", QSize(400, 400)).toSize();\r
opBrowseWin->resize(size);\r
\r
+ // HW registers UI information\r
+ pos = settings.value("hwRegsBrowseWinPos", QPoint(200, 200)).toPoint();\r
+ hwRegsBrowseWin->move(pos);\r
+ settings.value("hwRegsBrowseWinIsVisible", false).toBool() ? ShowHWRegsBrowserWin() : void();\r
+ size = settings.value("hwRegsBrowseWinSize", QSize(400, 400)).toSize();\r
+ hwRegsBrowseWin->resize(size);\r
+\r
// RISC disassembly UI information\r
pos = settings.value("riscDasmBrowseWinPos", QPoint(200, 200)).toPoint();\r
riscDasmBrowseWin->move(pos);\r
size = settings.value("SaveDumpAsWinSize", QSize(400, 400)).toSize();\r
SaveDumpAsWin->resize(size);\r
\r
+ // save output video UI information\r
+ pos = settings.value("VideoOutputWinPos", QPoint(200, 200)).toPoint();\r
+ VideoOutputWin->move(pos);\r
+ settings.value("VideoOutputWinIsVisible", false).toBool() ? ShowVideoOutputWin() : void();\r
+ size = settings.value("VideoOutputWinSize", QSize(400, 400)).toSize();\r
+ VideoOutputWin->resize(size);\r
+\r
// Breakpoints UI information\r
pos = settings.value("BreakpointsWinPos", QPoint(200, 200)).toPoint();\r
BreakpointsWin->move(pos);\r
settings.setValue("DefaultROM", vjs.alpineROMPath);\r
settings.setValue("DefaultABS", vjs.absROMPath);\r
settings.setValue("writeROM", vjs.allowWritesToROM);\r
+ settings.setValue("M68KExceptionCatch", vjs.allowM68KExceptionCatch);\r
settings.endGroup();\r
\r
// Write settings from the Debugger mode\r
settings.beginGroup("debugger");\r
settings.setValue("DisplayHWLabels", vjs.displayHWlabels);\r
- settings.setValue("NbrDisasmLines", vjs.nbrdisasmlines);\r
+ settings.setValue("NbrDisasmLines", (qulonglong) vjs.nbrdisasmlines);\r
settings.setValue("DisasmOpcodes", vjs.disasmopcodes);\r
settings.setValue("displayFullSourceFilename", vjs.displayFullSourceFilename);\r
settings.setValue("ELFSectionsCheck", vjs.ELFSectionsCheck);\r
settings.setValue("opBrowseWinPos", opBrowseWin->pos());\r
settings.setValue("opBrowseWinIsVisible", opBrowseWin->isVisible());\r
settings.setValue("opBrowseWinSize", opBrowseWin->size());\r
+ settings.setValue("hwRegsBrowseWinPos", hwRegsBrowseWin->pos());\r
+ settings.setValue("hwRegsBrowseWinIsVisible", hwRegsBrowseWin->isVisible());\r
+ settings.setValue("hwRegsBrowseWinSize", hwRegsBrowseWin->size());\r
settings.setValue("riscDasmBrowseWinPos", riscDasmBrowseWin->pos());\r
settings.setValue("riscDasmBrowseWinIsVisible", riscDasmBrowseWin->isVisible());\r
settings.setValue("m68kDasmBrowseWinPos", m68kDasmBrowseWin->pos());\r
settings.setValue("SaveDumpAsWinPos", SaveDumpAsWin->pos());\r
settings.setValue("SaveDumpAsWinIsVisible", SaveDumpAsWin->isVisible());\r
settings.setValue("SaveDumpAsWinSize", SaveDumpAsWin->size());\r
+ settings.setValue("VideoOutputWinPos", VideoOutputWin->pos());\r
+ settings.setValue("VideoOutputWinIsVisible", VideoOutputWin->isVisible());\r
+ settings.setValue("VideoOutputWinSize", VideoOutputWin->size());\r
\r
for (i = 0; i < vjs.nbrmemory1browserwindow; i++)\r
{\r
opBrowseWin->RefreshContents();\r
riscDasmBrowseWin->RefreshContents();\r
m68kDasmBrowseWin->RefreshContents();\r
+ hwRegsBrowseWin->RefreshContents();\r
}\r
\r
\r
heapallocatorBrowseWin->Reset();\r
BreakpointsWin->Reset();\r
CartFilesListWin->Reset();\r
+ SourcesWin->Reset();\r
//ResetAlpineWindows();\r
}\r
}\r
{\r
if (vjs.softTypeDebugger)\r
{\r
+ //VideoOutputWin->RefreshContents(videoWidget);\r
FilesrcListWin->RefreshContents();\r
+ SourcesWin->RefreshContents();\r
m68kDasmWin->RefreshContents();\r
GPUDasmWin->RefreshContents();\r
DSPDasmWin->RefreshContents();\r