mirror of
https://github.com/libretro/mgba.git
synced 2025-02-19 23:22:36 +00:00
GBA: Fix SharkPort saves for EEPROM games
This commit is contained in:
parent
1a6b47a29f
commit
82f78ba37e
1
CHANGES
1
CHANGES
@ -50,6 +50,7 @@ Bugfixes:
|
|||||||
- GBA Hardware: RTC accuracy improvements
|
- GBA Hardware: RTC accuracy improvements
|
||||||
- GB Timer: Minor accuracy improvements
|
- GB Timer: Minor accuracy improvements
|
||||||
- GB Audio: Clock frame events on DIV
|
- GB Audio: Clock frame events on DIV
|
||||||
|
- GBA: Fix SharkPort saves for EEPROM games
|
||||||
Misc:
|
Misc:
|
||||||
- GBA Timer: Use global cycles for timers
|
- GBA Timer: Use global cycles for timers
|
||||||
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
- GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)
|
||||||
|
@ -102,7 +102,7 @@ void GBASavedataDeinit(struct GBASavedata* savedata);
|
|||||||
|
|
||||||
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback);
|
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback);
|
||||||
void GBASavedataUnmask(struct GBASavedata* savedata);
|
void GBASavedataUnmask(struct GBASavedata* savedata);
|
||||||
size_t GBASavedataSize(struct GBASavedata* savedata);
|
size_t GBASavedataSize(const struct GBASavedata* savedata);
|
||||||
bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out);
|
bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out);
|
||||||
bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in);
|
bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in);
|
||||||
void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type, bool realisticTiming);
|
void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type, bool realisticTiming);
|
||||||
|
@ -138,7 +138,7 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t GBASavedataSize(struct GBASavedata* savedata) {
|
size_t GBASavedataSize(const struct GBASavedata* savedata) {
|
||||||
switch (savedata->type) {
|
switch (savedata->type) {
|
||||||
case SAVEDATA_SRAM:
|
case SAVEDATA_SRAM:
|
||||||
return SIZE_CART_SRAM;
|
return SIZE_CART_SRAM;
|
||||||
|
@ -130,8 +130,21 @@ bool GBASavedataImportSharkPort(struct GBA* gba, struct VFile* vf, bool testChec
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
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.vf) {
|
||||||
|
gba->memory.savedata.vf->sync(gba->memory.savedata.vf, gba->memory.savedata.data, size);
|
||||||
|
}
|
||||||
|
|
||||||
free(payload);
|
free(payload);
|
||||||
return true;
|
return true;
|
||||||
@ -146,7 +159,7 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) {
|
|||||||
char c[0x1C];
|
char c[0x1C];
|
||||||
int32_t i;
|
int32_t i;
|
||||||
} buffer;
|
} buffer;
|
||||||
int32_t size = strlen(SHARKPORT_HEADER);
|
uint32_t size = strlen(SHARKPORT_HEADER);
|
||||||
STORE_32(size, 0, &buffer.i);
|
STORE_32(size, 0, &buffer.i);
|
||||||
if (vf->write(vf, &buffer.i, 4) < 4) {
|
if (vf->write(vf, &buffer.i, 4) < 4) {
|
||||||
return false;
|
return false;
|
||||||
@ -187,22 +200,8 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write payload
|
// Write payload
|
||||||
size = 0x1C;
|
size = 0x1C + GBASavedataSize(&gba->memory.savedata);
|
||||||
switch (gba->memory.savedata.type) {
|
if (size == 0x1C) {
|
||||||
case SAVEDATA_SRAM:
|
|
||||||
size += SIZE_CART_SRAM;
|
|
||||||
break;
|
|
||||||
case SAVEDATA_FLASH512:
|
|
||||||
size += SIZE_CART_FLASH512;
|
|
||||||
break;
|
|
||||||
case SAVEDATA_FLASH1M:
|
|
||||||
size += SIZE_CART_FLASH1M;
|
|
||||||
break;
|
|
||||||
case SAVEDATA_EEPROM:
|
|
||||||
size += SIZE_CART_EEPROM;
|
|
||||||
break;
|
|
||||||
case SAVEDATA_FORCE_NONE:
|
|
||||||
case SAVEDATA_AUTODETECT:
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
STORE_32(size, 0, &buffer.i);
|
STORE_32(size, 0, &buffer.i);
|
||||||
@ -229,18 +228,25 @@ bool GBASavedataExportSharkPort(const struct GBA* gba, struct VFile* vf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t checksum = 0;
|
uint32_t checksum = 0;
|
||||||
int i;
|
size_t i;
|
||||||
for (i = 0; i < 0x1C; ++i) {
|
for (i = 0; i < 0x1C; ++i) {
|
||||||
checksum += buffer.c[i] << (checksum % 24);
|
checksum += buffer.c[i] << (checksum % 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vf->write(vf, gba->memory.savedata.data, size) < size) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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) {
|
for (i = 0; i < size; ++i) {
|
||||||
checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24);
|
checksum += ((char) gba->memory.savedata.data[i]) << (checksum % 24);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
STORE_32(checksum, 0, &buffer.i);
|
STORE_32(checksum, 0, &buffer.i);
|
||||||
if (vf->write(vf, &buffer.i, 4) < 4) {
|
if (vf->write(vf, &buffer.i, 4) < 4) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user