dma: don't generate irqs after aborted DMA
[pcsx_rearmed.git] / libpcsxcore / psxdma.c
index df79b6d..6d7981f 100644 (file)
 // Dma3   in CdRom.c
 
 void spuInterrupt() {
-       HW_DMA4_CHCR &= SWAP32(~0x01000000);
-       DMA_INTERRUPT(4);
+       if (HW_DMA4_CHCR & SWAP32(0x01000000))
+       {
+               HW_DMA4_CHCR &= SWAP32(~0x01000000);
+               DMA_INTERRUPT(4);
+       }
 }
 
 void psxDma4(u32 madr, u32 bcr, u32 chcr) { // SPU
@@ -192,8 +195,11 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
 }
 
 void gpuInterrupt() {
-       HW_DMA2_CHCR &= SWAP32(~0x01000000);
-       DMA_INTERRUPT(2);
+       if (HW_DMA2_CHCR & SWAP32(0x01000000))
+       {
+               HW_DMA2_CHCR &= SWAP32(~0x01000000);
+               DMA_INTERRUPT(2);
+       }
 }
 
 void psxDma6(u32 madr, u32 bcr, u32 chcr) {
@@ -239,6 +245,9 @@ void psxDma6(u32 madr, u32 bcr, u32 chcr) {
 
 void gpuotcInterrupt()
 {
-       HW_DMA6_CHCR &= SWAP32(~0x01000000);
-       DMA_INTERRUPT(6);
+       if (HW_DMA6_CHCR & SWAP32(0x01000000))
+       {
+               HW_DMA6_CHCR &= SWAP32(~0x01000000);
+               DMA_INTERRUPT(6);
+       }
 }