diff --git a/CHANGES b/CHANGES index 6032c5f54..61b8d113f 100644 --- a/CHANGES +++ b/CHANGES @@ -55,6 +55,7 @@ Bugfixes: - Python: Fix package directory - GB Memory: Fix OAM DMA blocking regions (fixes mgba.io/i/1013) - Wii: Fix various setup and teardown drawing issues (fixes mgba.io/i/988) + - GBA Timer: Fix timers sometimes being late (fixes mgba.io/i/1012) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722) diff --git a/src/gba/timer.c b/src/gba/timer.c index 985ef0744..282263364 100644 --- a/src/gba/timer.c +++ b/src/gba/timer.c @@ -51,7 +51,7 @@ static void GBATimerUpdate(struct GBA* gba, int timerId, uint32_t cyclesLate) { int32_t tickMask = (1 << GBATimerFlagsGetPrescaleBits(timer->flags)) - 1; currentTime &= ~tickMask; timer->lastEvent = currentTime; - GBATimerUpdateRegister(gba, timerId, 0); + GBATimerUpdateRegister(gba, timerId, TIMER_RELOAD_DELAY + cyclesLate); if (GBATimerFlagsIsDoIrq(timer->flags)) { timer->flags = GBATimerFlagsFillIrqPending(timer->flags); @@ -155,7 +155,7 @@ void GBATimerUpdateRegister(struct GBA* gba, int timer, int32_t cyclesLate) { if (!mTimingIsScheduled(&gba->timing, ¤tTimer->event)) { tickIncrement = (0x10000 - tickIncrement) << prescaleBits; currentTime -= mTimingCurrentTime(&gba->timing) - cyclesLate; - mTimingSchedule(&gba->timing, ¤tTimer->event, TIMER_RELOAD_DELAY + tickIncrement + currentTime); + mTimingSchedule(&gba->timing, ¤tTimer->event, tickIncrement + currentTime); } }