summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-08 01:58:47 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-08 01:58:47 +0000
commitf7539cadb89ae24fd21cf24074ad1c2a195ea52b (patch)
treedc64cb3ee61620f7aab3df5aeb404ff675cdf8af /libpcsxcore
parente532bbba974da3a64e931c174a42692602239a6a (diff)
downloadpcsxr-f7539cadb89ae24fd21cf24074ad1c2a195ea52b.tar.gz
Maximum Force - mdec.c
- stall dma1 until dma0 sent - fixes movies git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@59301 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/mdec.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c
index b96538f4..c8312ee3 100644
--- a/libpcsxcore/mdec.c
+++ b/libpcsxcore/mdec.c
@@ -477,6 +477,14 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) {
// input data
MDECINDMA_INT( mdec.rlsize );
+
+
+ // Maximum Force: restart dma1 stall
+ // - fixes movies
+
+ if( HW_DMA1_CHCR & SWAP32(0x01000000) ) {
+ psxDma1( HW_DMA1_MADR, HW_DMA1_BCR, HW_DMA1_CHCR );
+ }
return;
@@ -527,19 +535,21 @@ 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
+ in_ptr = (u8 *)mdec.rl;
+
+ size = (bcr >> 16) * (bcr & 0xffff);
- if( mdec.rlsize < 0 ) {
- // stall dma1 forever
- MDECOUTDMA_INT( 0x7fffffff );
+
+ // Maximum Force: stall dma1 until dma0 sent
+ // - fixes movies
+
+ if( mdec.rlsize <= 0 )
+ {
+ // signal immediate stall
+ mdec.reg1 &= ~MDEC1_BUSY;
return;
}
- in_ptr = (u8 *)mdec.rl;
-
-
- size = (bcr >> 16) * (bcr & 0xffff);
image = (u16 *)PSXM(adr);
@@ -581,14 +591,17 @@ void psxDma1(u32 adr, u32 bcr, u32 chcr) {
}
- // Fear Effect 2: check for infinite output stall
+ // Fear Effect 2: check for input drain, stalling output
// - fixes art gallery corruption, auto-pause
mdec.rlsize -= ((u8 *) mdec.rl - in_ptr) / 4;
- if( mdec.rlsize < 0 ) {
- // stall dma1 forever
- dmacnt = 0x7fffffff;
+
+#ifdef CDR_LOG
+ if( mdec.rlsize < 0 )
+ {
+ CDR_LOG( "dma1 infinite stall - no input left!!\n" );
}
+#endif
/*
@@ -616,10 +629,11 @@ void mdec1Interrupt() {
CDR_LOG("mdec1Interrupt\n");
#endif
if (HW_DMA1_CHCR & SWAP32(0x01000000)) {
- // stall forever
- if( psxRegs.intCycle[PSXINT_MDECOUTDMA].cycle == 0x7fffffff )
+ // Fear Effect 2: stall dma1 forever
+ // - fixes art gallery
+ if( mdec.rlsize < 0 )
{
- MDECOUTDMA_INT( 0x7fffffff );
+ mdec.reg1 &= ~MDEC1_BUSY;
return;
}