mirror of https://github.com/PCSX2/pcsx2.git
Stupid SIF hack tricks 101. Class at 11am.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2288 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
546d79bf4d
commit
c42be1e8f6
|
@ -209,7 +209,11 @@ static __forceinline void sifHackInterrupt()
|
||||||
{
|
{
|
||||||
// No reason -- just that sometimes the SIF fell asleep, and this wakes it up.
|
// No reason -- just that sometimes the SIF fell asleep, and this wakes it up.
|
||||||
|
|
||||||
hwIntcIrq(INTC_SBUS);
|
iopIntcIrq( 3 ); // IOP DMAC int
|
||||||
|
//hwIntcIrq(INTC_SBUS); // EE's SIF BUS notifier... maybe or maybe not needed?
|
||||||
|
|
||||||
|
// hack is rescheduled as needed by the event handler (depending on if it's actively
|
||||||
|
// signalling an interrupt or not).. better there than here.
|
||||||
//PSX_INT( IopEvt_SIFhack, 128 );
|
//PSX_INT( IopEvt_SIFhack, 128 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,10 +266,9 @@ __releaseinline void psxBranchTest()
|
||||||
iopEventTestIsActive = false;
|
iopEventTestIsActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( psxHu32(0x1078) == 0 ) return;
|
if( (psxHu32(0x1078) != 0) && ((psxHu32(0x1070) & psxHu32(0x1074)) != 0) )
|
||||||
if( (psxHu32(0x1070) & psxHu32(0x1074)) == 0 ) return;
|
{
|
||||||
|
if( (psxRegs.CP0.n.Status & 0xFE01) >= 0x401 )
|
||||||
if ((psxRegs.CP0.n.Status & 0xFE01) >= 0x401)
|
|
||||||
{
|
{
|
||||||
PSXCPU_LOG("Interrupt: %x %x", psxHu32(0x1070), psxHu32(0x1074));
|
PSXCPU_LOG("Interrupt: %x %x", psxHu32(0x1070), psxHu32(0x1074));
|
||||||
psxException(0, 0);
|
psxException(0, 0);
|
||||||
|
@ -275,17 +278,20 @@ __releaseinline void psxBranchTest()
|
||||||
// thread sleep hangs and allow the IOP to "come back to life."
|
// thread sleep hangs and allow the IOP to "come back to life."
|
||||||
psxRegs.interrupt &= ~IopEvt_SIFhack;
|
psxRegs.interrupt &= ~IopEvt_SIFhack;
|
||||||
}
|
}
|
||||||
else if( IOP_ENABLE_SIF_HACK && (psxRegs.interrupt & IopEvt_SIFhack) )
|
}
|
||||||
|
|
||||||
|
if( IOP_ENABLE_SIF_HACK && !iopBranchAction && !(psxRegs.interrupt & IopEvt_SIFhack) )
|
||||||
{
|
{
|
||||||
// Safeguard: since we're not executing an exception vector, we should schedule a SIF wakeup
|
// Safeguard: since we're not executing an exception vector, we should schedule a SIF wakeup
|
||||||
// just in case.
|
// just in case. (and don't reschedule it if it's already scheduled, since that would just
|
||||||
|
// delay the previously scheduled one, and we don't want that)
|
||||||
|
|
||||||
// (TODO: The endless loop in question is a branch instruction that branches to itself endlessly,
|
// (TODO: The endless loop in question is a branch instruction that branches to itself endlessly,
|
||||||
// waiting for SIF to wake it up via any cpuException. We could check for that instruction
|
// waiting for SIF to wake it up via any cpuException. We could check for that instruction
|
||||||
// location and only schedule a SIF fix when it's detected... But for now this is easy and gives
|
// location and only schedule a SIF fix when it's detected... But for now this is easy and gives
|
||||||
// us good control over testing parameters...)
|
// us good control over testing parameters...)
|
||||||
|
|
||||||
PSX_INT( IopEvt_SIFhack, 64 );
|
PSX_INT( IopEvt_SIFhack, 96 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue