From cbc7bbb33ed10fc45368f36815c7feefb5e1d8b4 Mon Sep 17 00:00:00 2001 From: refraction Date: Tue, 20 Apr 2010 22:10:49 +0000 Subject: [PATCH] Fixes for Tri-Ace games and Dark Summit (Which seems to use a similar video engine). Also a couple of other modifications for IPU resuming git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2879 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/HwWrite.cpp | 9 +++++---- pcsx2/IPU/IPU.cpp | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pcsx2/HwWrite.cpp b/pcsx2/HwWrite.cpp index a01d4bdaeb..c6503bdc14 100644 --- a/pcsx2/HwWrite.cpp +++ b/pcsx2/HwWrite.cpp @@ -191,8 +191,9 @@ static void DmaExec( void (*func)(), u32 mem, u32 value ) } //Sanity Check for possible future bug fix0rs ;p if(reg->chcr.TAG != chcr.TAG) DevCon.Warning(L"32bit CHCR Tag on %s changed to %x from %x QWC = %x Channel Active", ChcrName(mem), chcr.TAG, reg->chcr.TAG, reg->qwc); - //Here we update the ENTIRE CHCR, if a chain is stopped half way through, it can be manipulated in to a different mode - reg->chcr.set(value); + //Here we update the LOWER CHCR, if a chain is stopped half way through, it can be manipulated in to a different mode + //But we need to preserve the existing tag for now + reg->chcr.set((reg->chcr.TAG << 16) | chcr.lower()); return; } else //Else the DMA is running (Not Suspended), so we cant touch it! @@ -215,7 +216,7 @@ static void DmaExec( void (*func)(), u32 mem, u32 value ) } - //if(reg->chcr.TAG != chcr.TAG && chcr.MOD == CHAIN_MODE) //DevCon.Warning(L"32bit CHCR Tag on %s changed to %x from %x QWC = %x Channel Not Active", ChcrName(mem), chcr.TAG, reg->chcr.TAG, reg->qwc); + //if(reg->chcr.TAG != chcr.TAG && chcr.MOD == CHAIN_MODE) DevCon.Warning(L"32bit CHCR Tag on %s changed to %x from %x QWC = %x Channel Not Active", ChcrName(mem), chcr.TAG, reg->chcr.TAG, reg->qwc); reg->chcr.set(value); @@ -227,7 +228,7 @@ static void DmaExec( void (*func)(), u32 mem, u32 value ) } else if(reg->chcr.STR) { - ////DevCon.Warning(L"32bit %s DMA Start while DMAC Disabled\n", ChcrName(mem)); + //DevCon.Warning(L"32bit %s DMA Start while DMAC Disabled\n", ChcrName(mem)); QueuedDMA._u16 |= (1 << ChannelNumber(mem)); //Queue the DMA up to be started then the DMA's are Enabled and or the Suspend is lifted } //else QueuedDMA._u16 &~= (1 << ChannelNumber(mem)); // } diff --git a/pcsx2/IPU/IPU.cpp b/pcsx2/IPU/IPU.cpp index 2650a40143..7bd87b460b 100644 --- a/pcsx2/IPU/IPU.cpp +++ b/pcsx2/IPU/IPU.cpp @@ -1594,9 +1594,11 @@ __forceinline void dmaIPU1() // toIPU } else { //Attempting to continue a previous chain + DevCon.Warning("Resuming DMA TAG %x", (ipu1dma->chcr.TAG >> 12)); //We MUST check the CHCR for the tag it last knew, it can be manipulated! IPU1Status.ChainMode = (ipu1dma->chcr.TAG >> 12) & 0x7; IPU1Status.InProgress = true; + IPU1Status.DMAFinished = ((ipu1dma->chcr.TAG >> 15) && ipu1dma->chcr.TIE) ? true : false; } IPU1Status.DMAMode = DMA_MODE_CHAIN;