From 9262475cb47c1bbfd4422591394b789ce18f6b6b Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 9 Nov 2018 20:31:30 -0800 Subject: [PATCH] GBA Savedata: Fix various filesize edge cases (fixes #1221) --- src/gba/savedata.c | 20 +++++++++----------- src/platform/libretro/libretro.c | 1 + 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/gba/savedata.c b/src/gba/savedata.c index 8cf291f24..10f9499fa 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -259,9 +259,6 @@ void GBASavedataInitFlash(struct GBASavedata* savedata) { end = savedata->vf->size(savedata->vf); if (end < flashSize) { savedata->vf->truncate(savedata->vf, flashSize); - } else if (end >= SIZE_CART_FLASH1M) { - flashSize = SIZE_CART_FLASH1M; - savedata->type = SAVEDATA_FLASH1M; } savedata->data = savedata->vf->map(savedata->vf, flashSize, savedata->mapMode); } @@ -291,9 +288,6 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata) { end = savedata->vf->size(savedata->vf); if (end < eepromSize) { savedata->vf->truncate(savedata->vf, eepromSize); - } else if (end >= SIZE_CART_EEPROM) { - eepromSize = SIZE_CART_EEPROM; - savedata->type = SAVEDATA_EEPROM; } savedata->data = savedata->vf->map(savedata->vf, eepromSize, savedata->mapMode); } @@ -439,13 +433,17 @@ static void _ensureEeprom(struct GBASavedata* savedata, uint32_t size) { return; } savedata->type = SAVEDATA_EEPROM; - if (!savedata->vf || savedata->vf->size(savedata->vf) > SIZE_CART_EEPROM512) { + if (!savedata->vf) { return; } savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_EEPROM512); - savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM); - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); - memset(&savedata->data[SIZE_CART_EEPROM512], 0xFF, SIZE_CART_EEPROM - SIZE_CART_EEPROM512); + if (savedata->vf->size(savedata->vf) < SIZE_CART_EEPROM) { + savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM); + savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); + memset(&savedata->data[SIZE_CART_EEPROM512], 0xFF, SIZE_CART_EEPROM - SIZE_CART_EEPROM512); + } else { + savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); + } } void GBASavedataWriteEEPROM(struct GBASavedata* savedata, uint16_t value, uint32_t writeSize) { @@ -605,7 +603,7 @@ void _flashSwitchBank(struct GBASavedata* savedata, int bank) { savedata->type = SAVEDATA_FLASH1M; if (savedata->vf) { savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_FLASH512); - if (savedata->vf->size(savedata->vf) == SIZE_CART_FLASH512) { + if (savedata->vf->size(savedata->vf) < SIZE_CART_FLASH1M) { savedata->vf->truncate(savedata->vf, SIZE_CART_FLASH1M); savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_FLASH1M, MAP_WRITE); memset(&savedata->data[SIZE_CART_FLASH512], 0xFF, SIZE_CART_FLASH512); diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 06a9638b1..57bd74296 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -489,6 +489,7 @@ bool retro_load_game(const struct retro_game_info* game) { core->setPeripheral(core, mPERIPH_RUMBLE, &rumble); savedata = anonymousMemoryMap(SIZE_CART_FLASH1M); + memset(savedata, 0xFF, SIZE_CART_FLASH1M); struct VFile* save = VFileFromMemory(savedata, SIZE_CART_FLASH1M); _reloadSettings();