From ddfffd22de0a1b726aa16c509a31f26a6ff54edd Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Mon, 19 Jan 2015 01:16:18 -0800 Subject: [PATCH] GBA Memory: Fix prefetch values in Thumb mode --- src/gba/gba-memory.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/gba/gba-memory.c b/src/gba/gba-memory.c index 82508cd2f..65746821f 100644 --- a/src/gba/gba-memory.c +++ b/src/gba/gba-memory.c @@ -304,7 +304,11 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (gba->performingDMA) { LOAD_16(value, address & 2, &gba->bus); } else { - LOAD_16(value, address & 2, &cpu->prefetch[1]); + uint32_t prefetch = cpu->prefetch[1]; + if (cpu->executionMode == MODE_THUMB) { + prefetch |= prefetch << 16; + } + LOAD_16(value, address & 2, &prefetch); } } break; @@ -366,7 +370,11 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (gba->performingDMA) { LOAD_16(value, address & 2, &gba->bus); } else { - LOAD_16(value, address & 2, &cpu->prefetch[1]); + uint32_t prefetch = cpu->prefetch[1]; + if (cpu->executionMode == MODE_THUMB) { + prefetch |= prefetch << 16; + } + LOAD_16(value, address & 2, &prefetch); } break; } @@ -399,7 +407,11 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (gba->performingDMA) { value = ((uint8_t*) &gba->bus)[address & 3]; } else { - value = ((uint8_t*) &cpu->prefetch[1])[address & 3]; + uint32_t prefetch = cpu->prefetch[1]; + if (cpu->executionMode == MODE_THUMB) { + prefetch |= prefetch << 16; + } + value = ((uint8_t*) &prefetch)[address & 3]; } } break; @@ -463,7 +475,11 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (gba->performingDMA) { value = ((uint8_t*) &gba->bus)[address & 3]; } else { - value = ((uint8_t*) &cpu->prefetch[1])[address & 3]; + uint32_t prefetch = cpu->prefetch[1]; + if (cpu->executionMode == MODE_THUMB) { + prefetch |= prefetch << 16; + } + value = ((uint8_t*) &prefetch)[address & 3]; } break; }