diff --git a/CHANGES b/CHANGES index 5349ac9d5..a9c5ce82c 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ Bugfixes: - GBA Cheats: Fix GameShark ROM patches - GB MBC: Fix initializing MBC when no ROM is loaded - VFS: Fix resizing memory chunks when not needed + - GB Memory: Fix patching ROM bank 0 Misc: - PSP2: Improved controller rumble - GB, GBA: Prevent loading null ROMs diff --git a/src/gb/gb.c b/src/gb/gb.c index ba6a26194..0a9aa8647 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -240,6 +240,9 @@ void GBSavedataUnmask(struct GB* gb) { void GBUnloadROM(struct GB* gb) { // TODO: Share with GBAUnloadROM + if (gb->memory.rom && gb->memory.romBase != gb->memory.rom && gb->memory.romBase != gb->pristineRom) { + free(gb->memory.romBase); + } if (gb->memory.rom && gb->pristineRom != gb->memory.rom) { if (gb->yankedRomSize) { gb->yankedRomSize = 0; @@ -247,9 +250,6 @@ void GBUnloadROM(struct GB* gb) { mappedMemoryFree(gb->memory.rom, GB_SIZE_CART_MAX); gb->memory.rom = gb->pristineRom; } - if (gb->memory.rom && gb->memory.romBase != gb->memory.rom) { - free(gb->memory.romBase); - } gb->memory.rom = 0; if (gb->romVf) { diff --git a/src/gb/memory.c b/src/gb/memory.c index 43f39ec21..fa630994c 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -508,8 +508,8 @@ void GBPatch8(struct LR35902Core* cpu, uint16_t address, int8_t value, int8_t* o case GB_REGION_CART_BANK0 + 2: case GB_REGION_CART_BANK0 + 3: _pristineCow(gb); - oldValue = memory->rom[address & (GB_SIZE_CART_BANK0 - 1)]; - memory->rom[address & (GB_SIZE_CART_BANK0 - 1)] = value; + oldValue = memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)]; + memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)] = value; break; case GB_REGION_CART_BANK1: case GB_REGION_CART_BANK1 + 1: @@ -652,5 +652,8 @@ void _pristineCow(struct GB* gb) { gb->memory.rom = anonymousMemoryMap(GB_SIZE_CART_MAX); memcpy(gb->memory.rom, gb->pristineRom, gb->memory.romSize); memset(((uint8_t*) gb->memory.rom) + gb->memory.romSize, 0xFF, GB_SIZE_CART_MAX - gb->memory.romSize); + if (gb->pristineRom == gb->memory.romBase) { + gb->memory.romBase = gb->memory.rom; + } GBMBCSwitchBank(&gb->memory, gb->memory.currentBank); }