From a85ae6563c1008685ccd91fcedc1bb2846139ad6 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Mon, 22 Jun 2015 22:32:46 -0700 Subject: [PATCH] GBA: Fix timing of reading from timer registers --- CHANGES | 1 + src/gba/gba.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 65246e8ec..717b6616d 100644 --- a/CHANGES +++ b/CHANGES @@ -48,6 +48,7 @@ Bugfixes: - GBA Video: Fix windows not affecting sprites - VFS: Fix line-reading to return proper values - GBA Memory: Fix load/store multiple video memory waitstates + - GBA: Fix timing of reading from timer registers Misc: - Qt: Handle saving input settings better - Debugger: Free watchpoints in addition to breakpoints diff --git a/src/gba/gba.c b/src/gba/gba.c index 7994f03fa..f99c3a549 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -451,7 +451,8 @@ void GBAApplyPatch(struct GBA* gba, struct Patch* patch) { void GBATimerUpdateRegister(struct GBA* gba, int timer) { struct GBATimer* currentTimer = &gba->timers[timer]; if (currentTimer->enable && !currentTimer->countUp) { - gba->memory.io[(REG_TM0CNT_LO + (timer << 2)) >> 1] = currentTimer->oldReload + ((gba->cpu->cycles - currentTimer->lastEvent) >> currentTimer->prescaleBits); + // Reading this takes two cycles (1N+1I), so let's remove them preemptively + gba->memory.io[(REG_TM0CNT_LO + (timer << 2)) >> 1] = currentTimer->oldReload + ((gba->cpu->cycles - currentTimer->lastEvent - 2) >> currentTimer->prescaleBits); } }