diff --git a/Assets/dll/virtualjaguar.wbx.zst b/Assets/dll/virtualjaguar.wbx.zst index 89bb52aa75..988a5de9ae 100644 Binary files a/Assets/dll/virtualjaguar.wbx.zst and b/Assets/dll/virtualjaguar.wbx.zst differ diff --git a/waterbox/virtualjaguar/BizInterface.cpp b/waterbox/virtualjaguar/BizInterface.cpp index 033634a392..9e412baa90 100644 --- a/waterbox/virtualjaguar/BizInterface.cpp +++ b/waterbox/virtualjaguar/BizInterface.cpp @@ -3,6 +3,8 @@ #include "settings.h" #include "memory.h" #include "tom.h" +#include "gpu.h" +#include "dsp.h" #include "joystick.h" #include "m68000/m68kinterface.h" @@ -298,22 +300,44 @@ EXPORT void SetMemoryCallback(u32 which, void (*callback)(u32)) } } -void (*TraceCallback)(u32*) = 0; +void (*CPUTraceCallback)(u32*) = 0; +void (*GPUTraceCallback)(u32, u32*) = 0; +void (*DSPTraceCallback)(u32, u32*) = 0; -EXPORT void SetTraceCallback(void (*callback)(u32*)) +EXPORT void SetTraceCallbacks(void (*ccb)(u32*), void (*gcb)(u32, u32*), void (*dcb)(u32, u32*)) { - TraceCallback = callback; + CPUTraceCallback = ccb; + GPUTraceCallback = gcb; + DSPTraceCallback = dcb; } +extern u32 gpu_pc; +extern u32 dsp_pc; + EXPORT void GetRegisters(u32* regs) { for (u32 i = 0; i < 18; i++) { regs[i] = m68k_get_reg(NULL, (m68k_register_t)i); } + memcpy(®s[18], gpu_reg_bank_0, 128); + memcpy(®s[50], gpu_reg_bank_1, 128); + memcpy(®s[82], dsp_reg_bank_0, 128); + memcpy(®s[114], dsp_reg_bank_1, 128); + regs[146] = gpu_pc; + regs[147] = dsp_pc; } EXPORT void SetRegister(u32 which, u32 val) { - m68k_set_reg((m68k_register_t)which, val); + switch (which) + { + case 0 ... 17: m68k_set_reg((m68k_register_t)which, val); break; + case 18 ... 49: gpu_reg_bank_0[which - 18] = val; break; + case 50 ... 81: gpu_reg_bank_1[which - 50] = val; break; + case 82 ... 113: dsp_reg_bank_0[which - 82] = val; break; + case 114 ... 145: dsp_reg_bank_1[which - 114] = val; break; + case 146: gpu_pc = val; break; + case 147: dsp_pc = val; break; + } } diff --git a/waterbox/virtualjaguar/src/dsp.cpp b/waterbox/virtualjaguar/src/dsp.cpp index 134cf0f615..6089f49127 100644 --- a/waterbox/virtualjaguar/src/dsp.cpp +++ b/waterbox/virtualjaguar/src/dsp.cpp @@ -606,6 +606,8 @@ void DSPExec(int32_t cycles) { while (cycles > 0 && DSP_RUNNING) { + MAYBE_CALLBACK(DSPTraceCallback, dsp_pc, dsp_reg); + if (IMASKCleared) { DSPHandleIRQsNP(); diff --git a/waterbox/virtualjaguar/src/gpu.cpp b/waterbox/virtualjaguar/src/gpu.cpp index 533e5af028..17d4fe389d 100644 --- a/waterbox/virtualjaguar/src/gpu.cpp +++ b/waterbox/virtualjaguar/src/gpu.cpp @@ -631,6 +631,8 @@ void GPUExec(int32_t cycles) while (cycles > 0 && GPU_RUNNING) { + MAYBE_CALLBACK(GPUTraceCallback, gpu_pc, gpu_reg); + uint16_t opcode = GPUReadWord(gpu_pc, GPU); uint32_t index = opcode >> 10; gpu_opcode_first_parameter = (opcode >> 5) & 0x1F; diff --git a/waterbox/virtualjaguar/src/jaguar.cpp b/waterbox/virtualjaguar/src/jaguar.cpp index f33045b78a..e8a9208d7c 100644 --- a/waterbox/virtualjaguar/src/jaguar.cpp +++ b/waterbox/virtualjaguar/src/jaguar.cpp @@ -68,14 +68,14 @@ void M68KInstructionHook(void) } } - if (__builtin_expect(!!TraceCallback, false)) + if (__builtin_expect(!!CPUTraceCallback, false)) { uint32_t regs[18]; for (uint32_t i = 0; i < 18; i++) { regs[i] = m68k_get_reg(NULL, (m68k_register_t)i); } - TraceCallback(regs); + CPUTraceCallback(regs); } MAYBE_CALLBACK(ExecuteCallback, m68k_get_reg(NULL, M68K_REG_PC)); diff --git a/waterbox/virtualjaguar/src/jaguar.h b/waterbox/virtualjaguar/src/jaguar.h index d1e474935b..55c3e5c1e3 100644 --- a/waterbox/virtualjaguar/src/jaguar.h +++ b/waterbox/virtualjaguar/src/jaguar.h @@ -44,7 +44,9 @@ extern void (*ReadCallback)(uint32_t); extern void (*WriteCallback)(uint32_t); extern void (*ExecuteCallback)(uint32_t); -extern void (*TraceCallback)(uint32_t*); +extern void (*CPUTraceCallback)(uint32_t*); +extern void (*GPUTraceCallback)(uint32_t, uint32_t*); +extern void (*DSPTraceCallback)(uint32_t, uint32_t*); #define MAYBE_CALLBACK(callback, ...) do { if (__builtin_expect(!!callback, false)) callback(__VA_ARGS__); } while (0)