diff options
author | notaz | 2011-06-29 14:35:10 +0300 |
---|---|---|
committer | notaz | 2011-07-08 00:15:20 +0300 |
commit | ad418c19cd4ca9a80820593609b786c6993b2eda (patch) | |
tree | 545f51e495811f245b5c3625143791546c6174fa /libpcsxcore/mdec.c | |
parent | 64bd6f82e9e86c7fac82c4c5c46056d6b4947826 (diff) | |
download | pcsx_rearmed-ad418c19cd4ca9a80820593609b786c6993b2eda.tar.gz pcsx_rearmed-ad418c19cd4ca9a80820593609b786c6993b2eda.tar.bz2 pcsx_rearmed-ad418c19cd4ca9a80820593609b786c6993b2eda.zip |
dma: don't generate irqs after aborted DMA
An idea from Shalma.
Verified on real thing with DMA2.
Diffstat (limited to 'libpcsxcore/mdec.c')
-rw-r--r-- | libpcsxcore/mdec.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/libpcsxcore/mdec.c b/libpcsxcore/mdec.c index b25b961..6cf2886 100644 --- a/libpcsxcore/mdec.c +++ b/libpcsxcore/mdec.c @@ -531,8 +531,11 @@ void psxDma0(u32 adr, u32 bcr, u32 chcr) { void mdec0Interrupt() { - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); + if (HW_DMA0_CHCR & SWAP32(0x01000000)) + { + HW_DMA0_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(0); + } } #define SIZE_OF_24B_BLOCK (16*16*3) @@ -651,22 +654,21 @@ void mdec1Interrupt() { * */ - /* this else if avoid to read outside memory */ - if(mdec.rl >= mdec.rl_end) { - mdec.reg1 &= ~MDEC1_STP; - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); - mdec.reg1 &= ~MDEC1_BUSY; - } else if (SWAP16(*(mdec.rl)) == MDEC_END_OF_DATA) { - mdec.reg1 &= ~MDEC1_STP; - HW_DMA0_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(0); - mdec.reg1 &= ~MDEC1_BUSY; + /* MDEC_END_OF_DATA avoids read outside memory */ + if (mdec.rl >= mdec.rl_end || SWAP16(*(mdec.rl)) == MDEC_END_OF_DATA) { + mdec.reg1 &= ~(MDEC1_STP|MDEC1_BUSY); + if (HW_DMA0_CHCR & SWAP32(0x01000000)) + { + HW_DMA0_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(0); + } } - HW_DMA1_CHCR &= SWAP32(~0x01000000); - DMA_INTERRUPT(1); - return; + if (HW_DMA1_CHCR & SWAP32(0x01000000)) + { + HW_DMA1_CHCR &= SWAP32(~0x01000000); + DMA_INTERRUPT(1); + } } int mdecFreeze(gzFile f, int Mode) { |