GBA Memory: Fix DMA behavior for SRAM accesses

This commit is contained in:
Jeffrey Pfau 2015-11-06 21:06:09 -08:00
parent 7fb51f865e
commit 28651a1f64
3 changed files with 7 additions and 3 deletions

View File

@ -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

View File

@ -85,7 +85,7 @@ struct GBA {
struct ARMDebugger* debugger;
uint32_t bus;
bool performingDMA;
int performingDMA;
int timersEnabled;
struct GBATimer timers[4];

View File

@ -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) {