mirror of https://github.com/PCSX2/pcsx2.git
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:
parent
227a651c17
commit
f8e9c20664
|
@ -164,14 +164,10 @@ 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
|
CPU_INT(DMAC_SIF0, sif0.ee.cycles*BIAS);
|
||||||
{
|
|
||||||
// hence no Interrupt.
|
|
||||||
CPU_INT(DMAC_SIF0, sif0.ee.cycles*BIAS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop transferring iop, and signal an interrupt.
|
// Stop transferring iop, and signal an interrupt.
|
||||||
|
@ -184,17 +180,13 @@ 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
|
// 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:
|
||||||
// hence no Interrupt.
|
//PSX_INT(IopEvt_SIF0, ( ( sif0.iop.cycles*BIAS ) / 4 ) / 8);
|
||||||
// iop is 1/8th the clock rate of the EE and psxcycles is in words (not quadwords)
|
PSX_INT(IopEvt_SIF0, sif0.iop.cycles);
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle the EE transfer.
|
// Handle the EE transfer.
|
||||||
|
|
|
@ -185,14 +185,10 @@ 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
|
CPU_INT(DMAC_SIF1, min((int)(sif1.ee.cycles*BIAS), 384));
|
||||||
{
|
|
||||||
// Hence no Interrupt (fixes Eternal Poison reboot when selecting new game)
|
|
||||||
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.
|
||||||
|
@ -209,15 +205,11 @@ 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
|
// 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));
|
||||||
// Hence no Interrupt
|
|
||||||
// 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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle the EE transfer.
|
// Handle the EE transfer.
|
||||||
|
|
Loading…
Reference in New Issue