SIF does status communication as well, which we detected as null transfers.

Not interrupting on that seems to be bad for a couple games.
This commit should fix Persona3 again. 
(The Eternal Poison problem is something else, will have to look at it more.)

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2629 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
ramapcsx2 2010-02-23 13:42:58 +00:00
parent 227a651c17
commit f8e9c20664
2 changed files with 14 additions and 30 deletions

View File

@ -164,15 +164,11 @@ static __forceinline void EndEE()
sif0.ee.busy = false; sif0.ee.busy = false;
if (sif0.ee.cycles == 0) if (sif0.ee.cycles == 0)
{ {
// No transfer happened,
DevCon.Warning("SIF0 EE: cycles = 0"); DevCon.Warning("SIF0 EE: cycles = 0");
sif0.ee.cycles = 1;
} }
else
{
// hence no Interrupt.
CPU_INT(DMAC_SIF0, sif0.ee.cycles*BIAS); CPU_INT(DMAC_SIF0, sif0.ee.cycles*BIAS);
} }
}
// Stop transferring iop, and signal an interrupt. // Stop transferring iop, and signal an interrupt.
static __forceinline void EndIOP() static __forceinline void EndIOP()
@ -184,18 +180,14 @@ static __forceinline void EndIOP()
if (sif0.iop.cycles == 0) if (sif0.iop.cycles == 0)
{ {
// No transfer happened,
DevCon.Warning("SIF0 IOP: cycles = 0"); DevCon.Warning("SIF0 IOP: cycles = 0");
sif0.iop.cycles = 1;
} }
else
{
// hence no Interrupt.
// iop is 1/8th the clock rate of the EE and psxcycles is in words (not quadwords) // iop is 1/8th the clock rate of the EE and psxcycles is in words (not quadwords)
// So when we're all done, the equation looks like thus: // So when we're all done, the equation looks like thus:
//PSX_INT(IopEvt_SIF0, ( ( sif0.iop.cycles*BIAS ) / 4 ) / 8); //PSX_INT(IopEvt_SIF0, ( ( sif0.iop.cycles*BIAS ) / 4 ) / 8);
PSX_INT(IopEvt_SIF0, sif0.iop.cycles); PSX_INT(IopEvt_SIF0, sif0.iop.cycles);
} }
}
// Handle the EE transfer. // Handle the EE transfer.
static __forceinline void HandleEETransfer() static __forceinline void HandleEETransfer()

View File

@ -185,15 +185,11 @@ static __forceinline void EndEE()
// (Cause of double interrupts on the EE) // (Cause of double interrupts on the EE)
if (sif1.ee.cycles == 0) if (sif1.ee.cycles == 0)
{ {
// No transfer happened
DevCon.Warning("SIF1 EE: cycles = 0"); DevCon.Warning("SIF1 EE: cycles = 0");
sif1.ee.cycles = 1;
} }
else
{
// Hence no Interrupt (fixes Eternal Poison reboot when selecting new game)
CPU_INT(DMAC_SIF1, min((int)(sif1.ee.cycles*BIAS), 384)); CPU_INT(DMAC_SIF1, min((int)(sif1.ee.cycles*BIAS), 384));
} }
}
// Stop processing IOP, and signal an interrupt. // Stop processing IOP, and signal an interrupt.
static __forceinline void EndIOP() static __forceinline void EndIOP()
@ -209,16 +205,12 @@ static __forceinline void EndIOP()
//Total cycles over 1024 makes SIF too slow to keep up the sound stream in so3... //Total cycles over 1024 makes SIF too slow to keep up the sound stream in so3...
if (sif1.iop.cycles == 0) if (sif1.iop.cycles == 0)
{ {
// No transfer happened
DevCon.Warning("SIF1 IOP: cycles = 0"); DevCon.Warning("SIF1 IOP: cycles = 0");
sif1.iop.cycles = 1;
} }
else
{
// Hence no Interrupt
// iop is 1/8th the clock rate of the EE and psxcycles is in words (not quadwords) // iop is 1/8th the clock rate of the EE and psxcycles is in words (not quadwords)
PSX_INT(IopEvt_SIF1, min((sif1.iop.cycles * 26), 1024)); PSX_INT(IopEvt_SIF1, min((sif1.iop.cycles * 26), 1024));
} }
}
// Handle the EE transfer. // Handle the EE transfer.
static __forceinline void HandleEETransfer() static __forceinline void HandleEETransfer()