GBA Timers: Fix deserializing count-up timers

This commit is contained in:
Vicki Pfau 2020-02-25 18:03:07 -08:00
parent 1815f1d961
commit 80930c80e5
2 changed files with 6 additions and 8 deletions

View File

@ -2,6 +2,7 @@
Emulation fixes: Emulation fixes:
- GBA SIO: Fix Multiplayer busy bit - GBA SIO: Fix Multiplayer busy bit
- GBA SIO: Fix double-unloading active driver - GBA SIO: Fix double-unloading active driver
- GBA Timers: Fix deserializing count-up timers
Other fixes: Other fixes:
- Core: Fix ELF loading regression (fixes mgba.io/i/1669) - Core: Fix ELF loading regression (fixes mgba.io/i/1669)
- Core: Fix crash modifying hash table entry (fixes mgba.io/i/1673) - Core: Fix crash modifying hash table entry (fixes mgba.io/i/1673)

View File

@ -971,16 +971,13 @@ void GBAIODeserialize(struct GBA* gba, const struct GBASerializedState* state) {
for (i = 0; i < 4; ++i) { for (i = 0; i < 4; ++i) {
LOAD_16(gba->timers[i].reload, 0, &state->timers[i].reload); LOAD_16(gba->timers[i].reload, 0, &state->timers[i].reload);
LOAD_32(gba->timers[i].flags, 0, &state->timers[i].flags); 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); LOAD_32(when, 0, &state->timers[i].lastEvent);
gba->timers[i].lastEvent = when + mTimingCurrentTime(&gba->timing); gba->timers[i].lastEvent = when + mTimingCurrentTime(&gba->timing);
}
LOAD_32(when, 0, &state->timers[i].nextEvent); 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); 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); LOAD_16(gba->memory.dma[i].reg, (REG_DMA0CNT_HI + i * 12), state->io);