diff --git a/pcsx2/IopDma.cpp b/pcsx2/IopDma.cpp index 9677cf8ff4..575d408560 100644 --- a/pcsx2/IopDma.cpp +++ b/pcsx2/IopDma.cpp @@ -358,13 +358,19 @@ void RaiseDmaIrq(u32 channel) void IopDmaStart(int channel) { + int chcr = IopDmaHandlers[channel].REG_CHCR(); + + int pcr = (channel>=7)?(HW_DMA_PCR2 & (8 << ((channel-7) * 4))):(HW_DMA_PCR & (8 << (channel * 4))); + + if ( !(chcr & 0x01000000) || pcr) + return; + // I dont' really understand this, but it's used above. Is this BYTES OR WHAT? int bcr = IopDmaHandlers[channel].REG_BCR(); int bcr_size = (bcr & 0xFFFF); int bcr_count = (bcr >> 16); int size = 4* bcr_count * bcr_size; - int chcr = IopDmaHandlers[channel].REG_CHCR(); int dirf = IopDmaHandlers[channel].DirectionFlags&3; if(dirf != 3) diff --git a/pcsx2/IopHw.h b/pcsx2/IopHw.h index 658fa0b10f..625242b772 100644 --- a/pcsx2/IopHw.h +++ b/pcsx2/IopHw.h @@ -190,19 +190,8 @@ enum IOPCountRegs } #ifdef ENABLE_NEW_IOPDMA -#define DmaExecNew(n) { \ - if (HW_DMA##n##_CHCR & 0x01000000 && \ - HW_DMA_PCR & (8 << (n * 4))) { \ - IopDmaStart(n); \ - } \ -} - -#define DmaExecNew2(n) { \ - if (HW_DMA##n##_CHCR & 0x01000000 && \ - HW_DMA_PCR2 & (8 << ((n-7) * 4))) { \ - IopDmaStart(n); \ - } \ -} +#define DmaExecNew(n) IopDmaStart(n); +#define DmaExecNew2(n) IopDmaStart(n); #endif struct dma_mbc diff --git a/pcsx2/ps2/Iop/IopHwRead.cpp b/pcsx2/ps2/Iop/IopHwRead.cpp index afd27a0755..ed297cef56 100644 --- a/pcsx2/ps2/Iop/IopHwRead.cpp +++ b/pcsx2/ps2/Iop/IopHwRead.cpp @@ -278,7 +278,7 @@ static __forceinline T _HwRead_16or32_Page1( u32 addr ) // mcase(0x1f8010C0): #ifdef ENABLE_NEW_IOPDMA_SPU2 - ret = IopChannels[4].MemAddr; + ret = psxHu32(addr); #else ret = SPU2ReadMemAddr(0); #endif @@ -286,7 +286,7 @@ static __forceinline T _HwRead_16or32_Page1( u32 addr ) mcase(0x1f801500): #ifdef ENABLE_NEW_IOPDMA_SPU2 - ret = IopChannels[7].MemAddr; + ret = psxHu32(addr); #else ret = SPU2ReadMemAddr(1); #endif