Skip to content

Commit

Permalink
GBA: Fix SharkPort saves for EEPROM games
Browse files Browse the repository at this point in the history
  • Loading branch information
endrift committed Feb 6, 2018
1 parent e112271 commit 633449d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ Bugfixes:
- 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
Expand Down
38 changes: 29 additions & 9 deletions src/gba/sharkport.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,21 @@ bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChec
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;
Expand All @@ -146,7 +159,7 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) {
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;
Expand Down Expand Up @@ -229,17 +242,24 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) {
}

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) {
return false;
}

for (i = 0; i < size; ++i) {
checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24);
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;
} else {
for (i = 0; i < size; ++i) {
checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24);
}
}

STORE_32(checksum, 0, &buffer.i);
Expand Down

0 comments on commit 633449d

Please sign in to comment.