From 05a69127c4add745f684fe5126b8b7b54d4a930a Mon Sep 17 00:00:00 2001 From: Rafael Kitover Date: Sat, 15 Oct 2022 22:23:01 +0000 Subject: [PATCH] Revert "Revert DMA:Linger last DMA on bus ..." This reverts commit 173512f65aa9040fda4e97fd90b5ce4a23f59176. Include the patch instead with one line removed that @Squall-Leonhart said fixes the bug in Croket. Signed-off-by: Rafael Kitover --- src/gba/GBA.cpp | 9 +++++---- src/gba/GBAinline.h | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/gba/GBA.cpp b/src/gba/GBA.cpp index cf1c85c7..7619ef15 100644 --- a/src/gba/GBA.cpp +++ b/src/gba/GBA.cpp @@ -50,8 +50,9 @@ bool busPrefetchEnable = false; uint32_t busPrefetchCount = 0; int cpuDmaTicksToUpdate = 0; int cpuDmaCount = 0; -bool cpuDmaHack = false; +bool cpuDmaRunning = false; uint32_t cpuDmaLast = 0; +uint32_t cpuDmaPC = 0; int dummyAddress = 0; bool cpuBreakLoop = false; @@ -2343,7 +2344,7 @@ void doDMA(uint32_t& s, uint32_t& d, uint32_t si, uint32_t di, uint32_t c, int t int dw = 0; int sc = c; - cpuDmaHack = true; + cpuDmaRunning = true; cpuDmaCount = c; // This is done to get the correct waitstates. if (sm > 15) @@ -2408,7 +2409,7 @@ void doDMA(uint32_t& s, uint32_t& d, uint32_t si, uint32_t di, uint32_t c, int t } cpuDmaTicksToUpdate += totalTicks; - cpuDmaHack = false; + cpuDmaRunning = false; } void CPUCheckDMA(int reason, int dmamask) @@ -3660,7 +3661,7 @@ void CPUReset() systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; - cpuDmaHack = false; + cpuDmaRunning = false; lastTime = systemGetClock(); diff --git a/src/gba/GBAinline.h b/src/gba/GBAinline.h index 7713aec6..391cac9c 100644 --- a/src/gba/GBAinline.h +++ b/src/gba/GBAinline.h @@ -23,8 +23,9 @@ extern bool cpuSramEnabled; extern bool cpuFlashEnabled; extern bool cpuEEPROMEnabled; extern bool cpuEEPROMSensorEnabled; -extern bool cpuDmaHack; +extern bool cpuDmaRunning; extern uint32_t cpuDmaLast; +extern uint32_t cpuDmaPC; extern bool timer0On; extern int timer0Ticks; extern int timer0ClockReload; @@ -165,7 +166,7 @@ static inline uint32_t CPUReadMemory(uint32_t address) armMode ? armNextPC - 4 : armNextPC - 2); } #endif - if (cpuDmaHack) { + if (cpuDmaRunning || ((reg[15].I - cpuDmaPC) == (armState ? 4 : 2))) { value = cpuDmaLast; } else { if (armState) { @@ -309,7 +310,7 @@ static inline uint32_t CPUReadHalfWord(uint32_t address) // default default: unreadable: - if (cpuDmaHack) { + if (cpuDmaRunning || ((reg[15].I - cpuDmaPC) == (armState ? 4 : 2))) { value = cpuDmaLast & 0xFFFF; } else { int param = reg[15].I; @@ -442,7 +443,7 @@ static inline uint8_t CPUReadByte(uint32_t address) armMode ? armNextPC - 4 : armNextPC - 2); } #endif - if (cpuDmaHack) { + if (cpuDmaRunning || ((reg[15].I - cpuDmaPC) == (armState ? 4 : 2))) { return cpuDmaLast & 0xFF; } else { if (armState) {