X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fpsxdma.c;h=6d7981f0c243f44d69cc8a7b49c150d1c16e0fac;hp=1274d9300896292392d4e0fe01ecf0bb5819c1e3;hb=caeefe315aeb0c86e7c9135fac7d79d8e4e4ebd4;hpb=916a765bb0a5516ce681c83f479c668b0ef8473f diff --git a/libpcsxcore/psxdma.c b/libpcsxcore/psxdma.c index 1274d930..6d7981f0 100644 --- a/libpcsxcore/psxdma.c +++ b/libpcsxcore/psxdma.c @@ -27,8 +27,11 @@ // 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 @@ -167,8 +170,9 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %lx addr = %lx size = %lx\n", chcr, madr, bcr); #endif - size = gpuDmaChainSize(madr); - GPU_dmaChain((u32 *)psxM, madr & 0x1fffff); + size = GPU_dmaChain((u32 *)psxM, madr & 0x1fffff); + if ((int)size <= 0) + size = gpuDmaChainSize(madr); // Tekken 3 = use 1.0 only (not 1.5x) @@ -191,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) { @@ -238,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); + } }