X-Git-Url: http://git.hcoop.net/clinton/Virtual-Jaguar-Rx.git/blobdiff_plain/0cbc132e807d89562b81cdee20351aeb2bffb467..0e699c1255f04f5c332632eef475ebcef4200305:/src/jaguar.cpp diff --git a/src/jaguar.cpp b/src/jaguar.cpp index 8a12558..4123d4b 100644 --- a/src/jaguar.cpp +++ b/src/jaguar.cpp @@ -15,7 +15,10 @@ // 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 instruction and address error exceptions +// 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 // @@ -23,8 +26,8 @@ #include "jaguar.h" -#include -#include +//#include +#include #include #include #include "SDL_opengl.h" @@ -126,6 +129,7 @@ uint32_t bpmAddress1; S_BrkInfo *brkInfo; size_t brkNbr; +bool frameDone; // // Callback function to detect illegal instructions @@ -1460,10 +1464,14 @@ unsigned int m68k_read_memory_32(unsigned int address) //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; @@ -1471,7 +1479,17 @@ unsigned int m68k_read_memory_32(unsigned int address) 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 { @@ -2571,7 +2589,6 @@ uint8_t * GetRamPtr(void) // New Jaguar execution stack // This executes 1 frame's worth of code. // -bool frameDone; void JaguarExecuteNew(void) { frameDone = false; @@ -2593,24 +2610,26 @@ void JaguarExecuteNew(void) // 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()) { @@ -2647,7 +2666,7 @@ void JaguarStepOver(int depth) // bsr & jsr case 54: case 52: - JaguarStepOver(depth+1); + cycles += JaguarStepOver(depth+1); //if (depth) //{ // exit = false; @@ -2662,22 +2681,24 @@ void JaguarStepOver(int depth) 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) @@ -2689,6 +2710,7 @@ void JaguarStepInto(void) #else #warning "!!! Need to verify the Jaguar Step Into function !!!" #endif // _MSC_VER + return cycles; }