// JLH 11/25/2009 Major rewrite of memory subsystem and handlers
// JPM 09/04/2018 Added the new Models and BIOS handler
// JPM 10/13/2018 Added breakpoints features
+// JPM Aug./2019 Fix specific breakpoint for ROM cartridge or unknown memory location writing; added a specific breakpoint for the M68K illegal & unimplemented instruction, unknown exceptions and address error exceptions
+// JPM Aug./2019 Fix potential emulator freeze after an exception has occured
+// JPM Feb./2021 Added a specific breakpoint for the M68K bus error exception, and a M68K exception catch detection
+// JPM Apr./2021 Keep number of M68K cycles used in tracing mode
//
#include "jaguar.h"
-#include <QApplication>
-#include <QMessageBox>
+//#include <QApplication>
+#include <QtWidgets/QMessageBox>
#include <time.h>
#include <SDL.h>
#include "SDL_opengl.h"
S_BrkInfo *brkInfo;
size_t brkNbr;
+bool frameDone;
//
// Callback function to detect illegal instructions
QString msg;
QMessageBox msgBox;
- msg.sprintf("$%06x: %s", pcQueue[pcQPtr ? (pcQPtr - 1) : 0x3FF], text);
+#if 0
+ msg.sprintf("68000 exception\n%s at $%06x", text, pcQueue[pcQPtr ? (pcQPtr - 1) : 0x3FF]);
+#else
+ msg.sprintf("68000 exception\n$%06x: %s", pcQueue[pcQPtr ? (pcQPtr - 1) : 0x3FF], text);
+#endif
msgBox.setText(msg);
msgBox.setStandardButtons(QMessageBox::Abort);
msgBox.setDefaultButton(QMessageBox::Abort);
//uint32_t retVal = 0;
// check exception vectors access
- if ((address >= 0x8) && (address <= 0x7c))
+ if (vjs.allowM68KExceptionCatch && (address >= 0x8) && (address <= 0x7c))
{
switch (address)
{
+ case 0x08:
+ m68k_read_exception_vector(address, "Bus error");
+ break;
+
+ case 0x0c:
+ m68k_read_exception_vector(address, "Address error");
+ break;
+
case 0x10:
m68k_read_exception_vector(address, "Illegal instruction");
break;
+
+ case 0x2c:
+ m68k_read_exception_vector(address, "Unimplemented instruction");
+ break;
+
+ default:
+ m68k_read_exception_vector(address, "Exception not referenced");
+ break;
}
+
+ frameDone = true; // Hack to avoid the freeze of the emulator
}
else
{
// New Jaguar execution stack
// This executes 1 frame's worth of code.
//
-bool frameDone;
void JaguarExecuteNew(void)
{
frameDone = false;
// Step over function
-void JaguarStepOver(int depth)
+int JaguarStepOver(int depth)
{
- bool exit;
+ bool exit = !depth;
+ int cycles = 0;
//bool case55 = false;
//uint32_t m68kSR;
- if (!depth)
- {
- exit = true;
- }
- else
- {
- exit = false;
- }
+// if (!depth)
+// {
+// cycles = 0;
+// exit = true;
+// }
+// else
+// {
+// exit = false;
+// }
do
{
- JaguarStepInto();
+ cycles += JaguarStepInto();
switch (M68KGetCurrentOpcodeFamily())
{
// bsr & jsr
case 54:
case 52:
- JaguarStepOver(depth+1);
+ cycles += JaguarStepOver(depth+1);
//if (depth)
//{
// exit = false;
break;
}
}
- while (!exit);
+ while (!exit && !M68KDebugHaltStatus());
#ifdef _MSC_VER
#pragma message("Warning: !!! Need to verify the Jaguar Step Over function !!!")
#else
- #warning "!!! Need to verify the Jaguar Step Over function !!!"
+#warning "!!! Need to verify the Jaguar Step Over function !!!"
#endif // _MSC_VER
+ return cycles;
}
// Step into function
-void JaguarStepInto(void)
+int JaguarStepInto(void)
{
+ int cycles;
// double timeToNextEvent = GetTimeToNextEvent();
- m68k_execute(USEC_TO_M68K_CYCLES(0));
+ cycles = m68k_execute(USEC_TO_M68K_CYCLES(0));
// m68k_execute(USEC_TO_M68K_CYCLES(timeToNextEvent));
if (vjs.GPUEnabled)
#else
#warning "!!! Need to verify the Jaguar Step Into function !!!"
#endif // _MSC_VER
+ return cycles;
}