all repos — mgba @ ce0adb6c001719a6e22e5f42af1107dad310be21

mGBA Game Boy Advance Emulator

GBA Serialize: Fix loading savegames from savestates
Jeffrey Pfau jeffrey@endrift.com
Fri, 26 Feb 2016 23:47:00 -0800
commit

ce0adb6c001719a6e22e5f42af1107dad310be21

parent

2163b77abdd94f45aabadb057290b255cc22aa26

3 files changed, 22 insertions(+), 10 deletions(-)

jump to
M CHANGESCHANGES

@@ -12,6 +12,7 @@ - Qt: Fix initial state of key mapping

- Shaders: Fix AGS-001 shader with some bad drivers - Qt: Initialize m_useBios - GBA Serialize: Fix memory corruption bug in GBAExtdataSerialize + - GBA Serialize: Fix loading savegames from savestates Misc: - GBA: Slightly optimize GBAProcessEvents - Qt: Add preset for DualShock 4
M src/gba/savedata.csrc/gba/savedata.c

@@ -124,7 +124,26 @@ return true;

} bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in) { - if (savedata->data) { + if (savedata->vf) { + off_t read = 0; + uint8_t buffer[2048]; + memset(buffer, 0xFF, sizeof(buffer)); + savedata->vf->seek(savedata->vf, 0, SEEK_SET); + while (savedata->vf->seek(savedata->vf, 0, SEEK_CUR) < savedata->vf->size(savedata->vf)) { + savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); + } + savedata->vf->seek(savedata->vf, 0, SEEK_SET); + if (in) { + do { + read = in->read(in, buffer, sizeof(buffer)); + read = savedata->vf->write(savedata->vf, buffer, read); + } while (read == sizeof(buffer)); + } + return read >= 0; + } else if (savedata->data) { + if (!in && savedata->type != SAVEDATA_FORCE_NONE) { + return false; + } switch (savedata->type) { case SAVEDATA_SRAM: return in->read(in, savedata->data, SIZE_CART_SRAM) == SIZE_CART_SRAM;

@@ -138,14 +157,6 @@ case SAVEDATA_AUTODETECT:

case SAVEDATA_FORCE_NONE: return true; } - } else if (savedata->vf) { - off_t read = 0; - uint8_t buffer[2048]; - do { - in->read(in, buffer, read); - read = savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); - } while (read == sizeof(buffer)); - return read >= 0; } return true; }
M src/gba/serialize.csrc/gba/serialize.c

@@ -526,8 +526,8 @@ }

} if (flags & SAVESTATE_SAVEDATA && GBAExtdataGet(&extdata, EXTDATA_SAVEDATA, &item)) { struct VFile* svf = VFileFromMemory(item.data, item.size); + GBASavedataLoad(&gba->memory.savedata, svf); if (svf) { - GBASavedataLoad(&gba->memory.savedata, svf); svf->close(svf); } }