*********************************************************/
OP(psxBREAK) {
regs_->pc -= 4;
- psxException(0x24, branch);
+ psxException(0x24, branch, ®s_->CP0);
}
OP(psxSYSCALL) {
regs_->pc -= 4;
- psxException(0x20, branch);
+ psxException(0x20, branch, ®s_->CP0);
}
static inline void psxTestSWInts(psxRegisters *regs_) {
if (regs_->CP0.n.Cause & regs_->CP0.n.Status & 0x0300 &&
regs_->CP0.n.Status & 0x1) {
regs_->CP0.n.Cause &= ~0x7c;
- psxException(regs_->CP0.n.Cause, branch);
+ psxException(regs_->CP0.n.Cause, branch, ®s_->CP0);
}
}
// SysPrintf("MTC0 %d: %x\n", reg, val);
switch (reg) {
case 12: // Status
- regs_->CP0.r[12] = val;
+ if ((regs_->CP0.n.Status ^ val) & (1 << 16))
+ psxMemOnIsolate((val >> 16) & 1);
+ regs_->CP0.n.Status = val;
psxTestSWInts(regs_);
break;
}
static void intReset() {
- memset(&ICache, 0xff, sizeof(ICache));
}
static inline void execI_(u8 **memRLUT, psxRegisters *regs_) {
static void intClear(u32 Addr, u32 Size) {
}
-void intNotify (int note, void *data) {
- /* Gameblabla - Only clear the icache if it's isolated */
- if (note == R3000ACPU_NOTIFY_CACHE_ISOLATED)
- {
+static void intNotify(enum R3000Anote note, void *data) {
+ switch (note) {
+ case R3000ACPU_NOTIFY_CACHE_ISOLATED: // Armored Core?
+ case R3000ACPU_NOTIFY_AFTER_LOAD:
memset(&ICache, 0xff, sizeof(ICache));
+ break;
+ case R3000ACPU_NOTIFY_CACHE_UNISOLATED:
+ case R3000ACPU_NOTIFY_BEFORE_SAVE:
+ break;
}
}