mirror of https://github.com/PCSX2/pcsx2.git
Workaround for Ape Escape Million Monkey's. SIGNAL causes issues with Path1, this should avoid it for now until someone has a better idea :P Explination given in both XG_KICK's
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4054 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
9e4041a8e3
commit
3d4c0f6158
|
@ -47,14 +47,14 @@ static __fi void clearFIFOstuff(bool full)
|
|||
else
|
||||
CSRreg.FIFO = CSR_FIFO_EMPTY;
|
||||
}
|
||||
|
||||
extern bool SIGNAL_IMR_Pending;
|
||||
void gsPath1Interrupt()
|
||||
{
|
||||
//DevCon.Warning("Path1 flush W %x, R %x", Path1WritePos, Path1ReadPos);
|
||||
|
||||
|
||||
|
||||
if((gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.IP3 == true && gifRegs.stat.APATH == GIF_APATH3)) && Path1WritePos > 0 && !gifRegs.stat.PSE)
|
||||
if((gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.IP3 == true && gifRegs.stat.APATH == GIF_APATH3)) && Path1WritePos > 0 && !gifRegs.stat.PSE && SIGNAL_IMR_Pending == false)
|
||||
{
|
||||
gifRegs.stat.P1Q = false;
|
||||
|
||||
|
@ -62,7 +62,7 @@ void gsPath1Interrupt()
|
|||
{
|
||||
GetMTGS().PrepDataPacket(GIF_PATH_1, size);
|
||||
//DevCon.Warning("Flush Size = %x", size);
|
||||
while(size > 0)
|
||||
while(size > 0 && SIGNAL_IMR_Pending == false)
|
||||
{
|
||||
uint count = GIFPath_CopyTag(GIF_PATH_1, ((u128*)Path1Buffer) + Path1ReadPos, size);
|
||||
Path1ReadPos += count;
|
||||
|
@ -79,13 +79,18 @@ void gsPath1Interrupt()
|
|||
if(Path1ReadPos == Path1WritePos)
|
||||
{
|
||||
Path1WritePos = Path1ReadPos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
//DevCon.Warning("Queue quitting early due to signal or EOP %x", size);
|
||||
gifRegs.stat.P1Q = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(gifRegs.stat.PSE) DevCon.Warning("Path1 paused by GIF_CTRL");
|
||||
DevCon.Warning("Looping??? IP3 %x APATH %x OPH %x", gifRegs.stat.IP3, gifRegs.stat.APATH, gifRegs.stat.OPH);
|
||||
//DevCon.Warning("Looping??? IP3 %x APATH %x OPH %x", gifRegs.stat.IP3, gifRegs.stat.APATH, gifRegs.stat.OPH);
|
||||
//if(!(cpuRegs.interrupt & (1<<28)) && Path1WritePos > 0)CPU_INT(28, 128);
|
||||
}
|
||||
|
||||
|
|
|
@ -1097,8 +1097,17 @@ void __fastcall mVU_XGKICK_(u32 addr) {
|
|||
u8* data = vuRegs[1].Mem + (addr*16);
|
||||
u32 diff = 0x400 - addr;
|
||||
u32 size;
|
||||
|
||||
///////////////////////////////////////////////
|
||||
///////////////SIGNAL WARNING!!////////////////
|
||||
///////////////////////////////////////////////
|
||||
/* Due to the face SIGNAL can cause the loop
|
||||
to leave early, we can end up missing data.
|
||||
The only way we can avoid this is to queue
|
||||
it :(, im relying on someone else to come
|
||||
up with a better solution! */
|
||||
|
||||
if(gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.APATH == GIF_APATH3 && gifRegs.stat.IP3 == true) && SIGNAL_IMR_Pending == false)
|
||||
/*if(gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.APATH == GIF_APATH3 && gifRegs.stat.IP3 == true) && SIGNAL_IMR_Pending == false)
|
||||
{
|
||||
if(Path1WritePos != 0)
|
||||
{
|
||||
|
@ -1116,7 +1125,7 @@ void __fastcall mVU_XGKICK_(u32 addr) {
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{*/
|
||||
//DevCon.Warning("GIF APATH busy %x Holding for later W %x, R %x", gifRegs.stat.APATH, Path1WritePos, Path1ReadPos);
|
||||
size = GIFPath_ParseTagQuick(GIF_PATH_1, data, diff);
|
||||
u8* pDest = &Path1Buffer[Path1WritePos*16];
|
||||
|
@ -1136,7 +1145,8 @@ void __fastcall mVU_XGKICK_(u32 addr) {
|
|||
}
|
||||
//if(!gifRegs.stat.P1Q) CPU_INT(28, 128);
|
||||
gifRegs.stat.P1Q = true;
|
||||
}
|
||||
//}
|
||||
gsPath1Interrupt();
|
||||
}
|
||||
|
||||
static __fi void mVU_XGKICK_DELAY(mV, bool memVI) {
|
||||
|
|
|
@ -1982,7 +1982,17 @@ void __fastcall VU1XGKICK_MTGSTransfer(u32 *pMem, u32 addr)
|
|||
u32 size;
|
||||
u8* pDest;
|
||||
|
||||
if(gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.APATH == GIF_APATH3 && gifRegs.stat.IP3 == true) && SIGNAL_IMR_Pending == false)
|
||||
///////////////////////////////////////////////
|
||||
///////////////SIGNAL WARNING!!////////////////
|
||||
///////////////////////////////////////////////
|
||||
/* Due to the face SIGNAL can cause the loop
|
||||
to leave early, we can end up missing data.
|
||||
The only way we can avoid this is to queue
|
||||
it :(, im relying on someone else to come
|
||||
up with a better solution! */
|
||||
|
||||
|
||||
/*if(gifRegs.stat.APATH <= GIF_APATH1 || (gifRegs.stat.APATH == GIF_APATH3 && gifRegs.stat.IP3 == true) && SIGNAL_IMR_Pending == false)
|
||||
{
|
||||
if(Path1WritePos != 0)
|
||||
{
|
||||
|
@ -2000,7 +2010,7 @@ void __fastcall VU1XGKICK_MTGSTransfer(u32 *pMem, u32 addr)
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{*/
|
||||
//DevCon.Warning("GIF APATH busy %x Holding for later W %x, R %x", gifRegs.stat.APATH, Path1WritePos, Path1ReadPos);
|
||||
size = GIFPath_ParseTagQuick(GIF_PATH_1, data, diff);
|
||||
pDest = &Path1Buffer[Path1WritePos*16];
|
||||
|
@ -2019,8 +2029,7 @@ void __fastcall VU1XGKICK_MTGSTransfer(u32 *pMem, u32 addr)
|
|||
}
|
||||
//if(!gifRegs.stat.P1Q) CPU_INT(28, 128);
|
||||
gifRegs.stat.P1Q = true;
|
||||
}
|
||||
|
||||
|
||||
//}
|
||||
gsPath1Interrupt();
|
||||
}
|
||||
//------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue