all repos — mgba @ 80930c80e5a3732e5a5406f3688ba7b74dda8341

mGBA Game Boy Advance Emulator

GBA Timers: Fix deserializing count-up timers
Vicki Pfau vi@endrift.com
Tue, 25 Feb 2020 18:03:07 -0800
commit

80930c80e5a3732e5a5406f3688ba7b74dda8341

parent

1815f1d961e06686d45b370f0b0a076c25fd9340

2 files changed, 6 insertions(+), 8 deletions(-)

jump to
M CHANGESCHANGES

@@ -2,6 +2,7 @@ 0.8.2: (Future)

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)
M src/gba/io.csrc/gba/io.c

@@ -971,16 +971,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);