diff --git a/CHANGES b/CHANGES index c44b50efe..50887f41d 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ Bugfixes: - Qt: Fix a crash in the memory viewer - Libretro: Fix problems with rumble not turning off - GBA BIOS: Fix CpuSet on 0x01XXXXXX addresses + - GBA Memory: Fix DMA behavior for SRAM accesses Misc: - GBA Audio: Implement missing flags on SOUNDCNT_X register diff --git a/src/gba/gba.h b/src/gba/gba.h index e472a14ac..a69a464b0 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h @@ -85,7 +85,7 @@ struct GBA { struct ARMDebugger* debugger; uint32_t bus; - bool performingDMA; + int performingDMA; int timersEnabled; struct GBATimer timers[4]; diff --git a/src/gba/memory.c b/src/gba/memory.c index fe56188de..09ff4da92 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -586,6 +586,9 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { GBALog(gba, GBA_LOG_INFO, "Detected SRAM savegame"); GBASavedataInitSRAM(&memory->savedata); } + if (gba->performingDMA == 1) { + break; + } if (memory->savedata.type == SAVEDATA_SRAM) { value = memory->savedata.data[address & (SIZE_CART_SRAM - 1)]; } else if (memory->savedata.type == SAVEDATA_FLASH512 || memory->savedata.type == SAVEDATA_FLASH1M) { @@ -1464,7 +1467,7 @@ void GBAMemoryServiceDMA(struct GBA* gba, int number, struct GBADMA* info) { } } - gba->performingDMA = true; + gba->performingDMA = 1 | (number << 1); int32_t word; if (width == 4) { word = cpu->memory.load32(cpu, source, 0); @@ -1501,7 +1504,7 @@ void GBAMemoryServiceDMA(struct GBA* gba, int number, struct GBADMA* info) { --wordsRemaining; } } - gba->performingDMA = false; + gba->performingDMA = 0; if (!wordsRemaining) { if (!GBADMARegisterIsRepeat(info->reg) || GBADMARegisterGetTiming(info->reg) == DMA_TIMING_NOW) {