From 665e364a0aba523bb555f369efe4c7be966a6666 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 6 Jun 2011 19:43:26 +0300 Subject: [PATCH] r3000a: don't patch RAM to work around BIOS BIOS steps over if GTE instructions are interrupted, we must work around that since we don't emulate the pipeline. Previous workaround sucks since it hacks emulated RAM.. --- libpcsxcore/r3000a.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c index 98aff3a3..1e8d0b0e 100644 --- a/libpcsxcore/r3000a.c +++ b/libpcsxcore/r3000a.c @@ -79,6 +79,15 @@ void psxShutdown() { } void psxException(u32 code, u32 bd) { + if (!Config.HLE && (((PSXMu32(psxRegs.pc) >> 24) & 0xfe) == 0x4a)) { + // "hokuto no ken" / "Crash Bandicot 2" ... + // BIOS does not allow to return to GTE instructions + // (just skips it, supposedly because it's scheduled already) + // so we step over it with the interpreter + extern void execI(); + execI(); + } + // Set the Cause psxRegs.CP0.n.Cause = code; @@ -102,11 +111,6 @@ void psxException(u32 code, u32 bd) { psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status &~0x3f) | ((psxRegs.CP0.n.Status & 0xf) << 2); - if (!Config.HLE && (((PSXMu32(psxRegs.CP0.n.EPC) >> 24) & 0xfe) == 0x4a)) { - // "hokuto no ken" / "Crash Bandicot 2" ... fix - PSXMu32ref(psxRegs.CP0.n.EPC)&= SWAPu32(~0x02000000); - } - if (Config.HLE) psxBiosException(); } -- 2.39.5