GB: Fix resizing SRAM being spammed too much

This commit is contained in:
Jeffrey Pfau 2016-09-09 15:33:43 -07:00
parent ec33060390
commit d8a6d940ed
2 changed files with 24 additions and 8 deletions

View File

@ -133,7 +133,7 @@ void GBResizeSram(struct GB* gb, size_t size) {
if (size & 0xFF) { if (size & 0xFF) {
memcpy(&gb->memory.sram[gb->sramSize - (size & 0xFF)], extdataBuffer, size & 0xFF); memcpy(&gb->memory.sram[gb->sramSize - (size & 0xFF)], extdataBuffer, size & 0xFF);
} }
} else { } else if (size > gb->sramSize || !gb->memory.sram) {
if (gb->memory.sram) { if (gb->memory.sram) {
vf->unmap(vf, gb->memory.sram, gb->sramSize); vf->unmap(vf, gb->memory.sram, gb->sramSize);
} }
@ -145,6 +145,9 @@ void GBResizeSram(struct GB* gb, size_t size) {
} }
gb->memory.sram = vf->map(vf, size, MAP_READ); gb->memory.sram = vf->map(vf, size, MAP_READ);
} }
if (gb->memory.sram == (void*) -1) {
gb->memory.sram = NULL;
}
} else { } else {
uint8_t* newSram = anonymousMemoryMap(size); uint8_t* newSram = anonymousMemoryMap(size);
if (gb->memory.sram) { if (gb->memory.sram) {
@ -160,7 +163,9 @@ void GBResizeSram(struct GB* gb, size_t size) {
} }
gb->memory.sram = newSram; gb->memory.sram = newSram;
} }
gb->sramSize = size; if (gb->sramSize < size) {
gb->sramSize = size;
}
} }
void GBSavedataMask(struct GB* gb, struct VFile* vf) { void GBSavedataMask(struct GB* gb, struct VFile* vf) {

View File

@ -48,20 +48,34 @@ void GBMBCSwitchSramBank(struct GB* gb, int bank) {
void GBMBCInit(struct GB* gb) { void GBMBCInit(struct GB* gb) {
const struct GBCartridge* cart = (const struct GBCartridge*) &gb->memory.rom[0x100]; const struct GBCartridge* cart = (const struct GBCartridge*) &gb->memory.rom[0x100];
switch (cart->ramSize) {
case 0:
gb->sramSize = 0;
break;
case 1:
gb->sramSize = 0x800;
break;
default:
case 2:
gb->sramSize = 0x2000;
break;
case 3:
gb->sramSize = 0x8000;
break;
}
switch (cart->type) { switch (cart->type) {
case 0: case 0:
case 8: case 8:
case 9: case 9:
gb->memory.mbc = _GBMBCNone; gb->memory.mbc = _GBMBCNone;
gb->memory.mbcType = GB_MBC_NONE; gb->memory.mbcType = GB_MBC_NONE;
gb->sramSize = 0;
return; return;
case 1: case 1:
case 2: case 2:
case 3: case 3:
gb->memory.mbc = _GBMBC1; gb->memory.mbc = _GBMBC1;
gb->memory.mbcType = GB_MBC1; gb->memory.mbcType = GB_MBC1;
gb->sramSize = 0x2000;
break; break;
case 5: case 5:
case 6: case 6:
@ -76,7 +90,7 @@ void GBMBCInit(struct GB* gb) {
case 0x13: case 0x13:
gb->memory.mbc = _GBMBC3; gb->memory.mbc = _GBMBC3;
gb->memory.mbcType = GB_MBC3; gb->memory.mbcType = GB_MBC3;
gb->sramSize = 0x2048; gb->sramSize += 0x48;
break; break;
default: default:
mLOG(GB_MBC, WARN, "Unknown MBC type: %02X", cart->type); mLOG(GB_MBC, WARN, "Unknown MBC type: %02X", cart->type);
@ -86,14 +100,12 @@ void GBMBCInit(struct GB* gb) {
case 0x1B: case 0x1B:
gb->memory.mbc = _GBMBC5; gb->memory.mbc = _GBMBC5;
gb->memory.mbcType = GB_MBC5; gb->memory.mbcType = GB_MBC5;
gb->sramSize = 0x2000;
break; break;
case 0x1C: case 0x1C:
case 0x1D: case 0x1D:
case 0x1E: case 0x1E:
gb->memory.mbc = _GBMBC5; gb->memory.mbc = _GBMBC5;
gb->memory.mbcType = GB_MBC5_RUMBLE; gb->memory.mbcType = GB_MBC5_RUMBLE;
gb->sramSize = 0x2000;
break; break;
case 0x20: case 0x20:
gb->memory.mbc = _GBMBC6; gb->memory.mbc = _GBMBC6;
@ -108,7 +120,6 @@ void GBMBCInit(struct GB* gb) {
case 0xFE: case 0xFE:
gb->memory.mbc = _GBHuC3; gb->memory.mbc = _GBHuC3;
gb->memory.mbcType = GB_HuC3; gb->memory.mbcType = GB_HuC3;
gb->sramSize = 0x2000;
break; break;
} }