dma: don't generate irqs after aborted DMA
[pcsx_rearmed.git] / libpcsxcore / mdec.c
index 629816b..6cf2886 100644 (file)
@@ -219,7 +219,7 @@ struct _pending_dma1 {
        u32 chcr;
 };
 
-struct {
+static struct {
        u32 reg0;
        u32 reg1;
        u16 * rl;
@@ -436,11 +436,10 @@ static void yuv2rgb24(int *blk, u8 *image) {
 }
 
 void mdecInit(void) {
+       memset(&mdec, 0, sizeof(mdec));
+       memset(iq_y, 0, sizeof(iq_y));
+       memset(iq_uv, 0, sizeof(iq_uv));
        mdec.rl = (u16 *)&psxM[0x100000];
-       mdec.reg0 = 0;
-       mdec.reg1 = 0;
-       mdec.pending_dma1.adr = 0;
-       mdec.block_buffer_pos = 0;
 }
 
 // command register
@@ -532,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)
@@ -652,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) {