From 08a634371a60549d6e73fb1a3ddf6c9668fb00ce Mon Sep 17 00:00:00 2001 From: StapleButter Date: Tue, 21 Mar 2017 02:05:40 +0100 Subject: fix bug that happened when HDMA got interrupted (or any repeating DMA, for that matter) --- src/DMA.cpp | 25 ++++++++++++++----------- src/DMA.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/DMA.cpp b/src/DMA.cpp index 14fe791..d4e6d70 100644 --- a/src/DMA.cpp +++ b/src/DMA.cpp @@ -115,6 +115,7 @@ void DMA::Reset() DstAddrInc = 0; Running = false; + InProgress = false; } void DMA::WriteCnt(u32 val) @@ -162,15 +163,18 @@ void DMA::Start() { if (Running) return; - u32 countmask; - if (CPU == 0) - countmask = 0x001FFFFF; - else - countmask = (Num==3 ? 0x0000FFFF : 0x00003FFF); + if (!InProgress) + { + u32 countmask; + if (CPU == 0) + countmask = 0x001FFFFF; + else + countmask = (Num==3 ? 0x0000FFFF : 0x00003FFF); - RemCount = Cnt & countmask; - if (!RemCount) - RemCount = countmask+1; + RemCount = Cnt & countmask; + if (!RemCount) + RemCount = countmask+1; + } if (StartMode == 0x07 && RemCount > 112) IterCount = 112; @@ -211,6 +215,7 @@ void DMA::Start() // TODO eventually: not stop if we're running code in ITCM Running = true; + InProgress = true; NDS::StopCPU(CPU, 1<