GB MBC: Fix SRAM dangling pointer with RTC games

This commit is contained in:
Jeffrey Pfau 2016-10-13 00:17:30 -07:00
parent 18c6e6c330
commit 900700aa41
3 changed files with 12 additions and 2 deletions

View File

@ -8,6 +8,7 @@ Bugfixes:
- GBA Memory: Fix misaligned BIOS reads
- GBA BIOS: Fix MidiKey2Freq BIOS reads
- GBA BIOS: Fix invalid CpuSet not setting BIOS prefetch
- GB MBC: Fix SRAM dangling pointer with RTC games
Misc:
- SDL: Remove scancode key input
- GBA Video: Clean up unused timers

View File

@ -120,7 +120,7 @@ bool GBLoadSave(struct GB* gb, struct VFile* vf) {
static void GBSramDeinit(struct GB* gb) {
if (gb->sramVf) {
gb->sramVf->unmap(gb->sramVf, gb->memory.sram, gb->sramSize);
if (gb->memory.mbcType == GB_MBC3_RTC) {
if (gb->memory.mbcType == GB_MBC3_RTC && gb->sramVf == gb->sramRealVf) {
GBMBCRTCWrite(gb);
}
gb->sramVf = NULL;
@ -192,7 +192,7 @@ void GBResizeSram(struct GB* gb, size_t size) {
void GBSramClean(struct GB* gb, uint32_t frameCount) {
// TODO: Share with GBASavedataClean
if (!gb->sramVf) {
if (!gb->sramVf || gb->sramVf != gb->sramRealVf) {
return;
}
if (gb->sramDirty & GB_SRAM_DIRT_NEW) {

View File

@ -671,6 +671,15 @@ void GBMBCRTCWrite(struct GB* gb) {
STORE_32LE(gb->memory.rtcRegs[4], 0, &rtcBuffer.latchedDaysHi);
STORE_64LE(rtcLastLatch, 0, &rtcBuffer.unixTime);
if (vf->size(vf) == gb->sramSize) {
// Writing past the end of the file can invalidate the file mapping
vf->unmap(vf, gb->memory.sram, gb->sramSize);
gb->memory.sram = NULL;
}
vf->seek(vf, gb->sramSize, SEEK_SET);
vf->write(vf, &rtcBuffer, sizeof(rtcBuffer));
if (!gb->memory.sram) {
gb->memory.sram = vf->map(vf, gb->sramSize, MAP_WRITE);
GBMBCSwitchSramBank(gb, gb->memory.sramCurrentBank);
}
}