aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-10-26 00:01:47 +0300
committernotaz2011-10-30 23:48:08 +0200
commit48e74ef5e10804f8809fae397be4234e8bf613a7 (patch)
tree05bf769f22cad3c940dbae0b99c5881261a2eff2
parent15d0ba027cfbe88c69b539cc0c9ac6769e577c78 (diff)
downloadpcsx_rearmed-48e74ef5e10804f8809fae397be4234e8bf613a7.tar.gz
pcsx_rearmed-48e74ef5e10804f8809fae397be4234e8bf613a7.tar.bz2
pcsx_rearmed-48e74ef5e10804f8809fae397be4234e8bf613a7.zip
psxinterpreter: a bit more accurate Cause reg handling
-rw-r--r--libpcsxcore/psxinterpreter.c8
-rw-r--r--libpcsxcore/r3000a.c2
2 files changed, 5 insertions, 5 deletions
diff --git a/libpcsxcore/psxinterpreter.c b/libpcsxcore/psxinterpreter.c
index 66730d9..ff49491 100644
--- a/libpcsxcore/psxinterpreter.c
+++ b/libpcsxcore/psxinterpreter.c
@@ -780,10 +780,9 @@ void psxMFC0() { if (!_Rt_) return; _i32(_rRt_) = (int)_rFs_; }
void psxCFC0() { if (!_Rt_) return; _i32(_rRt_) = (int)_rFs_; }
void psxTestSWInts() {
- // the next code is untested, if u know please
- // tell me if it works ok or not (linuzappz)
if (psxRegs.CP0.n.Cause & psxRegs.CP0.n.Status & 0x0300 &&
- psxRegs.CP0.n.Status & 0x1) {
+ psxRegs.CP0.n.Status & 0x1) {
+ psxRegs.CP0.n.Cause &= ~0x7c;
psxException(psxRegs.CP0.n.Cause, branch);
}
}
@@ -797,7 +796,8 @@ void MTC0(int reg, u32 val) {
break;
case 13: // Cause
- psxRegs.CP0.n.Cause = val & ~(0xfc00);
+ psxRegs.CP0.n.Cause &= ~0x0300;
+ psxRegs.CP0.n.Cause |= val & 0x0300;
psxTestSWInts();
break;
diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c
index cccfa60..f5996ac 100644
--- a/libpcsxcore/r3000a.c
+++ b/libpcsxcore/r3000a.c
@@ -89,7 +89,7 @@ void psxException(u32 code, u32 bd) {
}
// Set the Cause
- psxRegs.CP0.n.Cause = code;
+ psxRegs.CP0.n.Cause = (psxRegs.CP0.n.Cause & 0x300) | code;
// Set the EPC & PC
if (bd) {