GBA: Fix SharkPort saves for EEPROM games
Vicki Pfau vi@endrift.com
Mon, 05 Feb 2018 22:06:44 -0800
2 files changed,
30 insertions(+),
9 deletions(-)
M
CHANGES
→
CHANGES
@@ -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.c
→
src/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);