diff --git a/pcsx2/HwWrite.cpp b/pcsx2/HwWrite.cpp index 8d37cde3b9..772da76505 100644 --- a/pcsx2/HwWrite.cpp +++ b/pcsx2/HwWrite.cpp @@ -63,10 +63,17 @@ static __forceinline void DmaExec16( void (*func)(), u32 mem, u16 value ) //It's invalid for the hardware to write a DMA while it is active, not without Suspending the DMAC if (chcr.STR && reg->chcr.STR && dmacRegs->ctrl.DMAE) { - DevCon.Warning(L"DMAExec16 Attempt to run DMA while one is already active in %s(%x)", ChcrName(mem), mem ); - func(); - Registers::Thaw(); - return; + if((reg->chcr._u32 & 0xff) == (chcr._u32 & 0xff)) //Tried to start another DMA in the same mode + DevCon.Warning(L"DMAExec32 Attempt to run DMA while one is already active in %s(%x)", ChcrName(mem), mem); + else if(psHu8(DMAC_ENABLER+2) != 0)//Just trying to change mode without stopping the DMA, so we dont care really :P + { + HW_LOG("Attempted to change modes while DMA active, ignoring"); + // When DMA is active only STR field is writable, so we just + // call the dma transfer function w/o modifying CHCR contents... + //func(); + Registers::Thaw(); + return; // Test with Gust games and fatal frame + } } // Note: pad is the padding right above qwc, so we're testing whether qwc @@ -98,10 +105,8 @@ static void DmaExec( void (*func)(), u32 mem, u32 value ) //It's invalid for the hardware to write a DMA while it is active, not without Suspending the DMAC if (chcr.STR && reg->chcr.STR && dmacRegs->ctrl.DMAE) { if((reg->chcr._u32 & 0xff) == (chcr._u32 & 0xff)) //Tried to start another DMA in the same mode - { DevCon.Warning(L"DMAExec32 Attempt to run DMA while one is already active in %s(%x)", ChcrName(mem), mem); - } - else //Just trying to change mode without stopping the DMA, so we dont care really :P + else if(psHu8(DMAC_ENABLER+2) != 0)//Just trying to change mode without stopping the DMA, so we dont care really :P { HW_LOG("Attempted to change modes while DMA active, ignoring"); // When DMA is active only STR field is writable, so we just