diff --git a/CHANGES b/CHANGES index 31feb2cd9..337672eec 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,7 @@ Misc: - Test: Restructure test suite into multiple executables - Python: Integrate tests from cinema test suite - Util: Don't build crc32 if the function already exists + - GBA: Detect hardware for Pokémon FireRed ROM hacks 0.6.0: (2017-07-16) Features: diff --git a/include/mgba/internal/gba/overrides.h b/include/mgba/internal/gba/overrides.h index 4240fea2e..c20e1f8e1 100644 --- a/include/mgba/internal/gba/overrides.h +++ b/include/mgba/internal/gba/overrides.h @@ -28,7 +28,7 @@ void GBAOverrideSave(struct Configuration*, const struct GBACartridgeOverride* o struct GBA; void GBAOverrideApply(struct GBA*, const struct GBACartridgeOverride*); -void GBAOverrideApplyDefaults(struct GBA*); +void GBAOverrideApplyDefaults(struct GBA*, const struct Configuration*); CXX_GUARD_END diff --git a/src/gba/core.c b/src/gba/core.c index 1940d6418..766d0b67a 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -395,14 +395,7 @@ static void _GBACoreReset(struct mCore* core) { GBAVideoAssociateRenderer(&gba->video, renderer); } - struct GBACartridgeOverride override; - const struct GBACartridge* cart = (const struct GBACartridge*) gba->memory.rom; - if (cart) { - memcpy(override.id, &cart->id, sizeof(override.id)); - if (GBAOverrideFind(gbacore->overrides, &override)) { - GBAOverrideApply(gba, &override); - } - } + GBAOverrideApplyDefaults(gba, gbacore->overrides); #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 if (!gba->biosVf && core->opts.useBios) { diff --git a/src/gba/overrides.c b/src/gba/overrides.c index 787690945..915d220e3 100644 --- a/src/gba/overrides.c +++ b/src/gba/overrides.c @@ -338,11 +338,19 @@ void GBAOverrideApply(struct GBA* gba, const struct GBACartridgeOverride* overri } } -void GBAOverrideApplyDefaults(struct GBA* gba) { - struct GBACartridgeOverride override; +void GBAOverrideApplyDefaults(struct GBA* gba, const struct Configuration* overrides) { + struct GBACartridgeOverride override = { .idleLoop = IDLE_LOOP_NONE }; const struct GBACartridge* cart = (const struct GBACartridge*) gba->memory.rom; - memcpy(override.id, &cart->id, sizeof(override.id)); - if (GBAOverrideFind(0, &override)) { - GBAOverrideApply(gba, &override); + if (cart) { + memcpy(override.id, &cart->id, sizeof(override.id)); + + if (!strncmp("pokemon red version", &((const char*) gba->memory.rom)[0x108], 20) && gba->romCrc32 != 0xDD88761C) { + // Enable FLASH1M and RTC on Pokémon FireRed ROM hacks + override.savetype = SAVEDATA_FLASH1M; + override.hardware = HW_RTC; + GBAOverrideApply(gba, &override); + } else if (GBAOverrideFind(overrides, &override)) { + GBAOverrideApply(gba, &override); + } } }