r3000a: don't patch RAM to work around BIOS
authornotaz <notasas@gmail.com>
Mon, 6 Jun 2011 16:43:26 +0000 (19:43 +0300)
committernotaz <notasas@gmail.com>
Tue, 7 Jun 2011 09:46:35 +0000 (12:46 +0300)
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

index 98aff3a..1e8d0b0 100644 (file)
@@ -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();
 }