From edaf9beba84113dbf7ada75a9612129d2b37af9a Mon Sep 17 00:00:00 2001 From: refraction Date: Tue, 15 Mar 2011 20:03:03 +0000 Subject: [PATCH] FF12 Ingame menu fix - MFIFO games generally compare VIF TADR to SPR MADR to find out when it's finished, copying part packets from SPR can be a hazard in this scenario, so we're making sure now that the whole packet has gone over before MFIFO VIF/GIF resumes. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4438 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/SPR.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pcsx2/SPR.cpp b/pcsx2/SPR.cpp index f3c0562332..eb29b9e327 100644 --- a/pcsx2/SPR.cpp +++ b/pcsx2/SPR.cpp @@ -104,7 +104,7 @@ int _SPR0chain() __fi void SPR0chain() { int cycles = 0; - cycles = _SPR0chain() * BIAS; + cycles = _SPR0chain() * 4; if(spr0lastqwc == false)CPU_INT(DMAC_FROM_SPR, cycles); } @@ -237,7 +237,9 @@ void SPRFROMinterrupt() { _dmaSPR0(); - if(mfifotransferred != 0) + //the qwc check is simply because having data still to transfer from the packet can freak games out if they do a d.tadr == s.madr check + //and there is still data to come over (FF12 ingame menu) + if(mfifotransferred != 0 && spr0ch.qwc == 0) { switch (dmacRegs.ctrl.MFD) { @@ -330,7 +332,7 @@ __fi void SPR1chain() int cycles = 0; if(!CHECK_IPUWAITHACK) { - cycles = _SPR1chain() * BIAS; + cycles = _SPR1chain() * 4; if(spr1lastqwc == false)CPU_INT(DMAC_TO_SPR, cycles); } else