diff --git a/pcsx2/Gif.cpp b/pcsx2/Gif.cpp index 4951daf9ca..804a27df7f 100644 --- a/pcsx2/Gif.cpp +++ b/pcsx2/Gif.cpp @@ -57,6 +57,8 @@ __fi void gifInterrupt() if(vif1Regs.stat.VGW) { + CPU_INT(DMAC_VIF1, 1); + if(!gifUnit.Path3Masked()) CPU_INT(DMAC_GIF, 16); diff --git a/pcsx2/Vif1_Dma.cpp b/pcsx2/Vif1_Dma.cpp index 14319655dd..84ee9148c7 100644 --- a/pcsx2/Vif1_Dma.cpp +++ b/pcsx2/Vif1_Dma.cpp @@ -342,7 +342,9 @@ __fi void vif1Interrupt() if(g_vif1Cycles > 0 || vif1ch.qwc) { - CPU_INT(DMAC_VIF1, max((int)g_vif1Cycles, 8)); + if(!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + CPU_INT(DMAC_VIF1, max((int)g_vif1Cycles, 8)); + return; } else if(vif1Regs.stat.VPS == VPS_TRANSFERRING) DevCon.Warning("Cycles %x, cmd %x, qwc %x, waitonvu %x", g_vif1Cycles, vif1.cmd, vif1ch.qwc, vif1.waitforvu); diff --git a/pcsx2/Vif1_MFIFO.cpp b/pcsx2/Vif1_MFIFO.cpp index 717fe00028..b3dfbb6d01 100644 --- a/pcsx2/Vif1_MFIFO.cpp +++ b/pcsx2/Vif1_MFIFO.cpp @@ -318,9 +318,12 @@ void vifMFIFOInterrupt() vif1Regs.stat.FQC = min((u16)0x10, vif1ch.qwc); case 1: //Transfer data - mfifo_VIF1chain(); + if(vif1.inprogress & 0x1) //Just in case the tag breaks early (or something wierd happens)! + mfifo_VIF1chain(); //Sanity check! making sure we always have non-zero values - CPU_INT(DMAC_MFIFO_VIF, (g_vif1Cycles == 0 ? 4 : g_vif1Cycles) ); + if(!(vif1Regs.stat.VGW && gifUnit.gifPath[GIF_PATH_3].state != GIF_PATH_IDLE)) //If we're waiting on GIF, stop looping, (can be over 1000 loops!) + CPU_INT(DMAC_MFIFO_VIF, (g_vif1Cycles == 0 ? 4 : g_vif1Cycles) ); + vif1Regs.stat.FQC = min((u16)0x10, vif1ch.qwc); return; }