all repos — mgba @ 633449dfd4dcb9e70646cccf217cea3d4fbb3191

mGBA Game Boy Advance Emulator

GBA: Fix SharkPort saves for EEPROM games
Vicki Pfau vi@endrift.com
Mon, 05 Feb 2018 22:06:44 -0800
commit

633449dfd4dcb9e70646cccf217cea3d4fbb3191

parent

e11227177fe06ba92fa85e6c0fa3e4e8307d9f64

2 files changed, 30 insertions(+), 9 deletions(-)

jump to
M CHANGESCHANGES

@@ -22,6 +22,7 @@ - PSP2: Fix issues causing poor audio

- Wii: Fix screen tear when unpausing - GBA: Fix some GBA ROM misdetection (fixes mgba.io/i/978) - GBA Hardware: RTC accuracy improvements + - GBA: Fix SharkPort saves for EEPROM games Misc: - GBA: Improve multiboot image detection - GB MBC: Remove erroneous bank 0 wrapping
M src/gba/sharkport.csrc/gba/sharkport.c

@@ -130,8 +130,21 @@ case SAVEDATA_AUTODETECT:

goto cleanup; } - memcpy(gba->memory.savedata.data, &payload[0x1C], copySize); - gba->memory.savedata.vf && gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size); + if (gba->memory.savedata.type == SAVEDATA_EEPROM) { + size_t i; + for (i = 0; i < copySize; i += 8) { + uint32_t lo, hi; + LOAD_32BE(lo, i + 0x1C, payload); + LOAD_32BE(hi, i + 0x20, payload); + STORE_32LE(hi, i, gba->memory.savedata.data); + STORE_32LE(lo, i + 4, gba->memory.savedata.data); + } + } else { + memcpy(gba->memory.savedata.data, &payload[0x1C], copySize); + } + if (gba->memory.savedata.vf) { + gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size); + } free(payload); return true;

@@ -146,7 +159,7 @@ union {

char c[0x1C]; int32_t i; } buffer; - int32_t size = strlen(SHARKPORT_HEADER); + uint32_t size = strlen(SHARKPORT_HEADER); STORE_32(size, 0, &buffer.i); if (vf->write(vf, &buffer.i, 4) < 4) { return false;

@@ -229,17 +242,24 @@ return false;

} uint32_t checksum = 0; - int i; + size_t i; for (i = 0; i < 0x1C; ++i) { checksum += buffer.c[i] << (checksum % 24); } - if (vf->write(vf, gba->memory.savedata.data, size) < size) { + + if (gba->memory.savedata.type == SAVEDATA_EEPROM) { + for (i = 0; i < size; ++i) { + char byte = gba->memory.savedata.data[i ^ 7]; + checksum += byte << (checksum % 24); + vf->write(vf, &byte, 1); + } + } else if (vf->write(vf, gba->memory.savedata.data, size) < size) { return false; - } - - for (i = 0; i < size; ++i) { - checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24); + } else { + for (i = 0; i < size; ++i) { + checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24); + } } STORE_32(checksum, 0, &buffer.i);