GBA Timers: Fix deserializing count-up timers
Vicki Pfau vi@endrift.com
Tue, 25 Feb 2020 18:03:07 -0800
2 files changed,
6 insertions(+),
8 deletions(-)
M
CHANGES
→
CHANGES
@@ -12,6 +12,7 @@ - GBA Memory: Improve gamepak prefetch timing
- GBA SIO: Fix Multiplayer busy bit - GBA SIO: Fix double-unloading active driver - GBA SIO: Fix copying Normal mode transfer values + - GBA Timers: Fix deserializing count-up timers - GBA Video: Latch scanline at end of Hblank (fixes mgba.io/i/1319) - GBA Video: Fix Hblank timing Other fixes:
M
src/gba/io.c
→
src/gba/io.c
@@ -964,16 +964,13 @@ uint32_t when;
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);