all repos — mgba @ c030fb656f69206dda86468549290ba679d37cdc

mGBA Game Boy Advance Emulator

GB, GBA Savedata: Fix savestate-related save overwriting (fixes #834)
Vicki Pfau vi@endrift.com
Fri, 04 Aug 2017 12:42:10 -0700
commit

c030fb656f69206dda86468549290ba679d37cdc

parent

30db4ebee83ce904689e66543078abff5e1e4205

3 files changed, 9 insertions(+), 1 deletions(-)

jump to
M CHANGESCHANGES

@@ -25,6 +25,7 @@ - GB MBC: Fix RTC initialization (fixes mgba.io/i/825)

- GB MBC: Fix RTC loading when file size is off - GB Serialize: Fix deserializing video STAT - Qt: Fix GL display when loading a game from CLI (fixes mgba.io/i/843) + - GB, GBA Savedata: Fix savestate-related save overwriting (fixes mgba.io/i/834) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
M src/gb/gb.csrc/gb/gb.c

@@ -220,7 +220,7 @@ }

void GBSramClean(struct GB* gb, uint32_t frameCount) { // TODO: Share with GBASavedataClean - if (!gb->sramVf || gb->sramVf != gb->sramRealVf) { + if (!gb->sramVf) { return; } if (gb->sramDirty & GB_SRAM_DIRT_NEW) {

@@ -230,6 +230,9 @@ if (!(gb->sramDirty & GB_SRAM_DIRT_SEEN)) {

gb->sramDirty |= GB_SRAM_DIRT_SEEN; } } else if ((gb->sramDirty & GB_SRAM_DIRT_SEEN) && frameCount - gb->sramDirtAge > CLEANUP_THRESHOLD) { + if (gb->sramMaskWriteback) { + GBSavedataUnmask(gb); + } if (gb->memory.mbcType == GB_MBC3_RTC) { GBMBCRTCWrite(gb); }

@@ -259,7 +262,9 @@ GBSramDeinit(gb);

gb->sramVf = gb->sramRealVf; gb->memory.sram = gb->sramVf->map(gb->sramVf, gb->sramSize, MAP_WRITE); if (gb->sramMaskWriteback) { + vf->seek(vf, 0, SEEK_SET); vf->read(vf, gb->memory.sram, gb->sramSize); + gb->sramMaskWriteback = false; } vf->close(vf); }

@@ -287,6 +292,7 @@ gb->memory.rom = NULL;

gb->memory.mbcType = GB_MBC_AUTODETECT; gb->isPristine = false; + gb->sramMaskWriteback = false; GBSavedataUnmask(gb); GBSramDeinit(gb); if (gb->sramRealVf) {
M src/gba/memory.csrc/gba/memory.c

@@ -92,6 +92,7 @@ mappedMemoryFree(gba->memory.iwram, SIZE_WORKING_IRAM);

if (gba->memory.rom) { mappedMemoryFree(gba->memory.rom, gba->memory.romSize); } + gba->memory.savedata.maskWriteback = false; GBASavedataUnmask(&gba->memory.savedata); GBASavedataDeinit(&gba->memory.savedata); if (gba->memory.savedata.realVf) {