mirror of https://github.com/PCSX2/pcsx2.git
VIF: Don't start transfer if VIF1/0 is stalled
Fix missing VIF status check on MFIFO
This commit is contained in:
parent
083380297f
commit
ab0d785ab5
|
@ -312,6 +312,6 @@ void dmaVIF0()
|
|||
//Using a delay as Beyond Good and Evil does the DMA twice with 2 different TADR's (no checks in the middle, all one block of code),
|
||||
//the first bit it sends isnt required for it to work.
|
||||
//Also being an end chain it ignores the second lot, this causes infinite loops ;p
|
||||
// Chain Mode
|
||||
CPU_INT(DMAC_VIF0, 4);
|
||||
if (!vif0Regs.stat.test(VIF0_STAT_VSS | VIF0_STAT_VIS | VIF0_STAT_VFS))
|
||||
CPU_INT(DMAC_VIF0, 4);
|
||||
}
|
||||
|
|
|
@ -482,6 +482,8 @@ void dmaVIF1()
|
|||
|
||||
if (vif1ch.chcr.DIR) vif1Regs.stat.FQC = std::min((u32)0x10, vif1ch.qwc);
|
||||
|
||||
// Chain Mode
|
||||
CPU_INT(DMAC_VIF1, 4);
|
||||
// Check VIF isn't stalled before starting the loop.
|
||||
// Batman Vengence does something stupid and instead of cancelling a stall it tries to restart VIF, THEN check the stall
|
||||
if (!vif1Regs.stat.test(VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS))
|
||||
CPU_INT(DMAC_VIF1, 4);
|
||||
}
|
||||
|
|
|
@ -322,6 +322,7 @@ void vifMFIFOInterrupt()
|
|||
VIF_LOG("VIF1 MFIFO Stalled qwc = %x done = %x inprogress = %x", vif1ch.qwc, vif1.done, vif1.inprogress & 0x10);
|
||||
//Used to check if the MFIFO was empty, there's really no need if it's finished what it needed.
|
||||
if((vif1ch.qwc > 0 || !vif1.done)) {
|
||||
vif1Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors)
|
||||
VIF_LOG("VIF1 MFIFO Stalled");
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue