}
void psxReset() {
- psxCpu->Reset();
-
psxMemReset();
memset(&psxRegs, 0, sizeof(psxRegs));
psxRegs.CP0.r[12] = 0x10900000; // COP0 enabled | BEV = 1 | TS = 1
psxRegs.CP0.r[15] = 0x00000002; // PRevID = Revision ID, same as R3000A
+ psxCpu->Reset();
+
psxHwReset();
psxBiosInit();
}
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;
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();
}
cdrDmaInterrupt();
}
}
+ if (psxRegs.interrupt & (1 << PSXINT_CDRPLAY)) { // cdr play timing
+ if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRPLAY].sCycle) >= psxRegs.intCycle[PSXINT_CDRPLAY].cycle) {
+ psxRegs.interrupt &= ~(1 << PSXINT_CDRPLAY);
+ cdrPlayInterrupt();
+ }
+ }
if (psxRegs.interrupt & (1 << PSXINT_CDRLID)) { // cdr lid states
if ((psxRegs.cycle - psxRegs.intCycle[PSXINT_CDRLID].sCycle) >= psxRegs.intCycle[PSXINT_CDRLID].cycle) {
psxRegs.interrupt &= ~(1 << PSXINT_CDRLID);