From 50077afa22a99cd4f4985b8017ef3d0f8c9a2ad6 Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Fri, 12 Nov 2010 14:00:21 +0000 Subject: Tekken 3 - gpu.c - Add infinite dma loop check to chain slice - Fixes post-replay flicker git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@59480 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/gpu.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libpcsxcore/gpu.c') diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c index 767d332e..8d33639f 100644 --- a/libpcsxcore/gpu.c +++ b/libpcsxcore/gpu.c @@ -42,6 +42,7 @@ extern unsigned int hSyncCount; u32 chain_ptr_addr; u32 chain_ptr_mem; +u8 chain_infinite_loop; /* DMA2 Chain slicing @@ -86,6 +87,7 @@ static u32 gpuDmaChainSize(u32 addr) { // initial linked list ptr (word) size = 1; + chain_infinite_loop = 0; do { addr &= 0x1ffffc; @@ -95,7 +97,11 @@ static u32 gpuDmaChainSize(u32 addr) { //if (DMACommandCounter++ > 2000000) break; - if (CheckForEndlessLoop(addr)) break; + if (CheckForEndlessLoop(addr)) + { + chain_infinite_loop = 1; + break; + } // # 32-bit blocks to transfer @@ -109,7 +115,7 @@ static u32 gpuDmaChainSize(u32 addr) { chain_ptr_addr = addr; - if( addr != 0xffffff ) + if( !chain_infinite_loop && addr != 0xffffff ) { // save data at stop ptr chain_ptr_mem = psxMu32( addr ); @@ -229,8 +235,8 @@ void gpuInterrupt() { #endif - // check valid data left - no Tekken 3 check yet - if( chain_ptr_addr != 0xffffff ) + // check valid data left + if( !chain_infinite_loop && chain_ptr_addr != 0xffffff ) { // put back old value first psxMu32ref( chain_ptr_addr ) = chain_ptr_mem; -- cgit v1.2.3