diff options
| author | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 22:37:43 +0000 |
|---|---|---|
| committer | SND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-10-30 22:37:43 +0000 |
| commit | b514f235c74e04f08a6111562cdfa6af1c4b242c (patch) | |
| tree | a997491c5b3058628fda9a2fa91e663fe395b597 | |
| parent | b224a1e794a7f241c69a7daa390e65dfba085b9c (diff) | |
| download | pcsxr-b514f235c74e04f08a6111562cdfa6af1c4b242c.tar.gz | |
Fear Effect 2 - mdec.c
- check for input drain, causing infinite dma1 stalls
- fixes art gallery
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@58951 e17a0e51-4ae3-4d35-97c3-1a29b211df97
| -rw-r--r-- | libpcsxcore/mdec.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c index ffcc91b3..28a03fb5 100644 --- a/libpcsxcore/mdec.c +++ b/libpcsxcore/mdec.c @@ -475,7 +475,8 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) { mdec.rl = (u16 *)PSXM(adr); mdec.rlsize = mdec.reg0 & MDEC0_SIZE_MASK; - MDECINDMA_INT( size / 4 ); + // input data
+ MDECINDMA_INT( mdec.rlsize );
return; @@ -517,6 +518,7 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { int blk[DSIZE2 * 6]; unsigned short *image; int size, dmacnt; + u8 *in_ptr;
#ifdef CDR_LOG CDR_LOG("DMA1 %08x %08x %08x (cmd = %08x)\n", adr, bcr, chcr, mdec.reg0); @@ -524,6 +526,19 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { if (chcr != 0x01000200) return; +
+ // Fear Effect 2: check for infinite output stall
+ // - fixes art gallery corruption, auto-pause
+
+ if( mdec.rlsize < 0 ) {
+ // stall dma1 forever
+ MDECOUTDMA_INT( 0x7fffffff );
+ return;
+ }
+
+ in_ptr = mdec.rl;
+
+
size = (bcr >> 16) * (bcr & 0xffff); image = (u16 *)PSXM(adr); @@ -555,6 +570,16 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) { } + // Fear Effect 2: check for infinite output stall
+ // - fixes art gallery corruption, auto-pause
+
+ mdec.rlsize -= ((u8 *) mdec.rl - in_ptr) / 4;
+ if( mdec.rlsize < 0 ) {
+ // stall dma1 forever
+ dmacnt = 0x7fffffff;
+ }
+
+
MDECOUTDMA_INT( dmacnt ); @@ -566,6 +591,14 @@ void mdec1Interrupt() { CDR_LOG("mdec1Interrupt\n"); #endif if (HW_DMA1_CHCR & SWAP32(0x01000000)) { + // stall forever
+ if( psxRegs.intCycle[PSXINT_MDECOUTDMA].cycle == 0x7fffffff )
+ {
+ MDECOUTDMA_INT( 0x7fffffff );
+ return;
+ }
+
+
// Set a fixed value totaly arbitrarie another sound value is // PSXCLK / 60 or PSXCLK / 50 since the bug happened at end of frame. // PSXCLK / 500 seems good for FF9. |
