From 67fedf8618e7e0f884f3c6ce749c537758cf1962 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 23 Mar 2019 22:46:58 -0700 Subject: [PATCH] GB Timer: Fix timing adjustments when writing to TAC (fixes #1340) --- CHANGES | 1 + src/gb/timer.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index aaa95489f..9edcc44f9 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,7 @@ Emulation fixes: - GBA DMA: Fix DMA0-2 lengths (fixes mgba.io/i/1344) - GB Video: Fix window y changing mid-window (fixes mgba.io/i/1345) - GB Video: Fix more window edge cases (fixes mgba.io/i/1346) + - GB Timer: Fix timing adjustments when writing to TAC (fixes mgba.io/i/1340) Other fixes: - Qt: More app metadata fixes - Qt: Fix load recent from archive (fixes mgba.io/i/1325) diff --git a/src/gb/timer.c b/src/gb/timer.c index e990b3534..bddb4ad53 100644 --- a/src/gb/timer.c +++ b/src/gb/timer.c @@ -92,6 +92,10 @@ void GBTimerDivReset(struct GBTimer* timer) { uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) { if (GBRegisterTACIsRun(tac)) { + timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event); + mTimingDeschedule(&timer->p->timing, &timer->event); + _GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3); + switch (GBRegisterTACGetClock(tac)) { case 0: timer->timaPeriod = 1024 >> 4; @@ -107,9 +111,6 @@ uint8_t GBTimerUpdateTAC(struct GBTimer* timer, GBRegisterTAC tac) { break; } - timer->nextDiv -= mTimingUntil(&timer->p->timing, &timer->event); - mTimingDeschedule(&timer->p->timing, &timer->event); - _GBTimerDivIncrement(timer, (timer->p->cpu->executionState + 2) & 3); timer->nextDiv += GB_DMG_DIV_PERIOD; mTimingSchedule(&timer->p->timing, &timer->event, timer->nextDiv); } else {