From 80930c80e5a3732e5a5406f3688ba7b74dda8341 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 25 Feb 2020 18:03:07 -0800 Subject: [PATCH] GBA Timers: Fix deserializing count-up timers --- CHANGES | 1 + src/gba/io.c | 13 +++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index d83fa01ab..d3bb4990e 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ Emulation fixes: - GBA SIO: Fix Multiplayer busy bit - GBA SIO: Fix double-unloading active driver + - GBA Timers: Fix deserializing count-up timers Other fixes: - Core: Fix ELF loading regression (fixes mgba.io/i/1669) - Core: Fix crash modifying hash table entry (fixes mgba.io/i/1673) diff --git a/src/gba/io.c b/src/gba/io.c index 65cf1e6bc..a5e765639 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -971,16 +971,13 @@ void GBAIODeserialize(struct GBA* gba, const struct GBASerializedState* state) { for (i = 0; i < 4; ++i) { LOAD_16(gba->timers[i].reload, 0, &state->timers[i].reload); LOAD_32(gba->timers[i].flags, 0, &state->timers[i].flags); - if (i > 0 && GBATimerFlagsIsCountUp(gba->timers[i].flags)) { - // Overwrite invalid values in savestate - gba->timers[i].lastEvent = 0; - } else { - LOAD_32(when, 0, &state->timers[i].lastEvent); - gba->timers[i].lastEvent = when + mTimingCurrentTime(&gba->timing); - } + LOAD_32(when, 0, &state->timers[i].lastEvent); + gba->timers[i].lastEvent = when + mTimingCurrentTime(&gba->timing); LOAD_32(when, 0, &state->timers[i].nextEvent); - if (GBATimerFlagsIsEnable(gba->timers[i].flags)) { + if ((i < 1 || !GBATimerFlagsIsCountUp(gba->timers[i].flags)) && GBATimerFlagsIsEnable(gba->timers[i].flags)) { mTimingSchedule(&gba->timing, &gba->timers[i].event, when); + } else { + gba->timers[i].event.when = when + mTimingCurrentTime(&gba->timing); } LOAD_16(gba->memory.dma[i].reg, (REG_DMA0CNT_HI + i * 12), state->io);