From e642590826f793b154f0c8a5aa0c70355a089f09 Mon Sep 17 00:00:00 2001 From: RocketRobz Date: Thu, 23 Jan 2025 01:51:37 -0700 Subject: [PATCH] Fix #1768 --- retail/bootloaderi/source/arm7/hook_arm9.c | 6 +++--- retail/bootloaderi/source/arm7/main.arm7.c | 9 +++++++-- retail/bootloaderi/source/arm7/patch_arm9.c | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/retail/bootloaderi/source/arm7/hook_arm9.c b/retail/bootloaderi/source/arm7/hook_arm9.c index 062f990d7..8358bc381 100644 --- a/retail/bootloaderi/source/arm7/hook_arm9.c +++ b/retail/bootloaderi/source/arm7/hook_arm9.c @@ -295,11 +295,11 @@ int hookNdsRetailArm9( extern u32 cheatSizeTotal; const bool cheatsEnabled = (cheatSizeTotal > 4 && cheatSizeTotal <= 0x8000); const bool specialTitle = (strncmp(romTid, "V2G", 3) == 0 || strncmp(romTid, "DD3", 3) == 0); - const bool pkmnTitle = (strncmp(romTid, "IRB", 3) == 0 || strncmp(romTid, "IRA", 3) == 0 || strncmp(romTid, "IRE", 3) == 0 || strncmp(romTid, "IRD", 3) == 0); + extern bool pkmnGen5; ce9->cacheAddress = (consoleModel > 0 ? dev_CACHE_ADRESS_START_TWLSDK : (cheatsEnabled ? retail_CACHE_ADRESS_START_TWLSDK_CHEAT : retail_CACHE_ADRESS_START_TWLSDK)); if (consoleModel == 0 && !gameOnFlashcard) { - if (pkmnTitle) { + if (pkmnGen5) { ce9->cacheAddress = (cheatsEnabled ? retail_CACHE_ADRESS_START_TWLSDK_LARGE_CHEAT : retail_CACHE_ADRESS_START_TWLSDK_LARGE); } else if (specialTitle) { ce9->cacheAddress = (cheatsEnabled ? retail_CACHE_ADRESS_START_TWLSDK_SMALL_CHEAT : retail_CACHE_ADRESS_START_TWLSDK_SMALL); @@ -308,7 +308,7 @@ int hookNdsRetailArm9( ce9->romLocation = ce9->cacheAddress; ce9->cacheSlots = (consoleModel > 0 ? (cheatsEnabled ? dev_CACHE_ADRESS_SIZE_TWLSDK_CHEAT : dev_CACHE_ADRESS_SIZE_TWLSDK) : (cheatsEnabled ? retail_CACHE_ADRESS_SIZE_TWLSDK_CHEAT : retail_CACHE_ADRESS_SIZE_TWLSDK))/cacheBlockSize; if (consoleModel == 0 && !gameOnFlashcard) { - if (pkmnTitle) { + if (pkmnGen5) { ce9->cacheSlots = (cheatsEnabled ? retail_CACHE_ADRESS_SIZE_TWLSDK_LARGE_CHEAT : retail_CACHE_ADRESS_SIZE_TWLSDK_LARGE)/cacheBlockSize; } else if (specialTitle) { ce9->cacheSlots = (cheatsEnabled ? retail_CACHE_ADRESS_SIZE_TWLSDK_SMALL_CHEAT : retail_CACHE_ADRESS_SIZE_TWLSDK_SMALL)/cacheBlockSize; diff --git a/retail/bootloaderi/source/arm7/main.arm7.c b/retail/bootloaderi/source/arm7/main.arm7.c index 2398bf739..7949b6cb8 100644 --- a/retail/bootloaderi/source/arm7/main.arm7.c +++ b/retail/bootloaderi/source/arm7/main.arm7.c @@ -177,6 +177,7 @@ u16 baseHeaderCRC = 0; u32 baseChipID = 0; u32 romPaddingSize = 0; bool pkmnHeader = false; +bool pkmnGen5 = false; bool ndmaDisabled = false; bool sharedWramEnabled = false; @@ -778,6 +779,8 @@ static void loadBinary_ARM7(const tDSiHeader* dsiHeaderTemp, aFile* file) { tNDSHeader* ndsHeaderPokemon = (tNDSHeader*)NDS_HEADER_POKEMON; fileRead((char*)ndsHeaderPokemon, file, 0, 0x160); pkmnHeader = true; + } else { + pkmnGen5 = (strncmp(baseTid, "IRB", 3) == 0 || strncmp(baseTid, "IRA", 3) == 0 || strncmp(baseTid, "IRE", 3) == 0 || strncmp(baseTid, "IRD", 3) == 0); } fileRead((char*)&baseArm9Off, file, 0x20, sizeof(u32)); @@ -837,11 +840,13 @@ bool romLocationAdjust(const tNDSHeader* ndsHeader, const bool laterSdk, const b const bool ntrType = (ndsHeader->unitCode == 0); const u32 romLocationOld = *romLocation; if (*romLocation == 0x0C3FC000) { - *romLocation += 0x4000; + *romLocation += pkmnGen5 ? 0x4020 : 0x4000; } else if (*romLocation == 0x0C7C0000 && !laterSdk) { *romLocation += 0x28000; } else if (*romLocation == 0x0C7C4000) { *romLocation += 0x4000; + } else if (*romLocation == 0x0C7C4020) { + *romLocation += 0x3FE0; } else if (*romLocation == 0x0C7D8000 && laterSdk) { if (ntrType) { extern bool hasVramWifiBinary; @@ -2226,7 +2231,7 @@ int arm7_main(void) { if (ROMsupportsDsiMode(ndsHeader) && dsiModeConfirmed) { cheatEngineOffset = (consoleModel > 0) ? CHEAT_ENGINE_TWLSDK_LOCATION_3DS : CHEAT_ENGINE_TWLSDK_SMALL_LOCATION; if (consoleModel == 0 && !gameOnFlashcard) { - if (strncmp(romTid, "IRB", 3) == 0 || strncmp(romTid, "IRA", 3) == 0 || strncmp(romTid, "IRE", 3) == 0 || strncmp(romTid, "IRD", 3) == 0) { + if (pkmnGen5) { cheatEngineOffset = CHEAT_ENGINE_TWLSDK_LARGE_LOCATION; } else if (strncmp(romTid, "V2G", 3) != 0 && strncmp(romTid, "DD3", 3) != 0) { cheatEngineOffset = CHEAT_ENGINE_TWLSDK_LOCATION; diff --git a/retail/bootloaderi/source/arm7/patch_arm9.c b/retail/bootloaderi/source/arm7/patch_arm9.c index d7a779e1d..9c87e2bf9 100644 --- a/retail/bootloaderi/source/arm7/patch_arm9.c +++ b/retail/bootloaderi/source/arm7/patch_arm9.c @@ -1368,6 +1368,7 @@ void patchHiHeapPointer(const module_params_t* moduleParams, const tNDSHeader* n const bool ROMsupportsDsiMode = (ndsHeader->unitCode > 0 && dsiModeConfirmed); const bool cheatsEnabled = (cheatSizeTotal > 4 && cheatSizeTotal <= 0x8000); const char* romTid = getRomTid(ndsHeader); + extern bool pkmnGen5; if (moduleParams->sdk_version < 0x2008000 || !dsiModeConfirmed || strncmp(romTid, "UBR", 3) == 0) { return; @@ -1423,7 +1424,7 @@ void patchHiHeapPointer(const module_params_t* moduleParams, const tNDSHeader* n } } else { */ // DSi mode title loaded on DSi from SD card, or DSi/3DS with external DSi BIOS files loaded - if (!gameOnFlashcard && (strncmp(romTid, "IRB", 3) == 0 || strncmp(romTid, "IRA", 3) == 0 || strncmp(romTid, "IRE", 3) == 0 || strncmp(romTid, "IRD", 3) == 0)) { + if (!gameOnFlashcard && pkmnGen5) { // Pokemon Black & White 1&2 switch (*heapPointer) { case 0x13A007BE: