diff --git a/pcsx2/SPR.cpp b/pcsx2/SPR.cpp index f174d7e68..6e735b56d 100644 --- a/pcsx2/SPR.cpp +++ b/pcsx2/SPR.cpp @@ -61,10 +61,8 @@ int _SPR0chain() pMem = SPRdmaGetAddr(spr0ch.madr, true); if (pMem == NULL) return -1; - switch (dmacRegs.ctrl.MFD) + if(spr0ch.madr >= dmacRegs.rbor.ADDR && spr0ch.madr <= (dmacRegs.rbor.ADDR + dmacRegs.rbsr.RMSK + 16)) { - case MFD_VIF1: - case MFD_GIF: partialqwc = spr0ch.qwc; if ((spr0ch.madr & ~dmacRegs.rbsr.RMSK) != dmacRegs.rbor.ADDR) @@ -77,10 +75,11 @@ int _SPR0chain() spr0ch.madr = dmacRegs.rbor.ADDR + (spr0ch.madr & dmacRegs.rbsr.RMSK); spr0ch.sadr += partialqwc << 4; spr0ch.qwc -= partialqwc; - break; - - case NO_MFD: - case MFD_RESERVED: + + spr0finished = true; + } + else + { //Taking an arbitary small value for games which like to check the QWC/MADR instead of STR, so get most of //the cycle delay out of the way before the end. @@ -94,7 +93,6 @@ int _SPR0chain() spr0ch.sadr += partialqwc << 4; spr0ch.qwc -= partialqwc; - break; } diff --git a/pcsx2/Vif1_Dma.cpp b/pcsx2/Vif1_Dma.cpp index 58029d30b..42be0e169 100644 --- a/pcsx2/Vif1_Dma.cpp +++ b/pcsx2/Vif1_Dma.cpp @@ -152,13 +152,6 @@ __fi void vif1SetupTransfer() switch (vif1.dmamode) { - case VIF_NORMAL_TO_MEM_MODE: - case VIF_NORMAL_FROM_MEM_MODE: - vif1.inprogress |= 1; - vif1.done = true; - g_vifCycles = 2; - break; - case VIF_CHAIN_MODE: ptag = dmaGetAddr(vif1ch.tadr, false); //Set memory pointer to TADR @@ -379,21 +372,11 @@ void dmaVIF1() } #endif - if ((vif1ch.chcr.MOD == NORMAL_MODE) || vif1ch.qwc > 0) // Normal Mode + if (vif1ch.qwc > 0) // Normal Mode { - - if (dmacRegs.ctrl.STD == STD_VIF1) - Console.WriteLn("DMA Stall Control on VIF1 normal"); - - if (vif1ch.chcr.DIR) // to Memory - vif1.dmamode = VIF_NORMAL_FROM_MEM_MODE; - else - vif1.dmamode = VIF_NORMAL_TO_MEM_MODE; - - vif1.done = false; // ignore tag if it's a GS download (Def Jam Fight for NY) - if(vif1ch.chcr.MOD == CHAIN_MODE && vif1.dmamode != VIF_NORMAL_TO_MEM_MODE) + if(vif1ch.chcr.MOD == CHAIN_MODE && vif1ch.chcr.DIR) { vif1.dmamode = VIF_CHAIN_MODE; //DevCon.Warning(L"VIF1 QWC on Chain CHCR " + vif1ch.chcr.desc()); @@ -402,7 +385,25 @@ void dmaVIF1() { vif1.done = true; } + else + { + vif1.done = false; + } } + else //Assume normal mode for reverse FIFO and Normal. + { + if (dmacRegs.ctrl.STD == STD_VIF1) + Console.WriteLn("DMA Stall Control on VIF1 normal"); + + if (vif1ch.chcr.DIR) // to Memory + vif1.dmamode = VIF_NORMAL_FROM_MEM_MODE; + else + vif1.dmamode = VIF_NORMAL_TO_MEM_MODE; + + vif1.done = true; + } + + vif1.inprogress |= 1; } else {