From 4cbcc41e35665f7b5fcd5fd0f911c80a0efbe81c Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Tue, 11 Oct 2016 21:59:57 -0700 Subject: [PATCH] GBA Memory: Fix misaligned BIOS reads --- CHANGES | 1 + src/gba/memory.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 7a62cbe70..5403d44ce 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Features: Bugfixes: - LR35902: Fix core never exiting with certain event patterns - GB Timer: Improve DIV reset behavior + - GBA Memory: Fix misaligned BIOS reads Misc: - SDL: Remove scancode key input - GBA Video: Clean up unused timers diff --git a/src/gba/memory.c b/src/gba/memory.c index 358f8ff93..1f329f7eb 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -352,7 +352,7 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { #define LOAD_BIOS \ if (address < SIZE_BIOS) { \ if (memory->activeRegion == REGION_BIOS) { \ - LOAD_32(value, address, memory->bios); \ + LOAD_32(value, address & -4, memory->bios); \ } else { \ mLOG(GBA_MEM, GAME_ERROR, "Bad BIOS Load32: 0x%08X", address); \ value = memory->biosPrefetch; \ @@ -479,7 +479,7 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { case REGION_BIOS: if (address < SIZE_BIOS) { if (memory->activeRegion == REGION_BIOS) { - LOAD_16(value, address, memory->bios); + LOAD_16(value, address & -2, memory->bios); } else { mLOG(GBA_MEM, GAME_ERROR, "Bad BIOS Load16: 0x%08X", address); value = (memory->biosPrefetch >> ((address & 2) * 8)) & 0xFFFF;