From 1ccbd78d29aa6de9af1d77f6ac750ec87616a7ec Mon Sep 17 00:00:00 2001 From: RocketRobz Date: Sat, 6 Jan 2024 17:10:45 -0700 Subject: [PATCH] B4DS: Add support for *Elite Forces: Unit 77* (DSiWare) --- .../arm9/include/dsiwaresSetForBootloader.h | 1 + .../bootloader/source/arm7/dsi2ds_patches.c | 84 +++++++++++++++++++ retail/bootloaderi/source/arm7/patch_common.c | 64 ++++++++++++++ 3 files changed, 149 insertions(+) diff --git a/retail/arm9/include/dsiwaresSetForBootloader.h b/retail/arm9/include/dsiwaresSetForBootloader.h index 23ede3011..b1168a413 100644 --- a/retail/arm9/include/dsiwaresSetForBootloader.h +++ b/retail/arm9/include/dsiwaresSetForBootloader.h @@ -178,6 +178,7 @@ static const char dsiWareForBootloader1[][4] = { "KED", // Electroplankton: Sun-Animalcule "KEA", // Electroplankton: Trapy "KEJ", // Electroplankton: Varvoice + "K42", // Elite Forces: Unit 77 "KD7", // G.G Series: Energy Chain "K5Q", // Escape Trick: The Secret of Rock City Prison (bootloaderi-exclusive) "KEY", // Escape Trick: Ninja Castle (bootloaderi-exclusive) diff --git a/retail/bootloader/source/arm7/dsi2ds_patches.c b/retail/bootloader/source/arm7/dsi2ds_patches.c index c1c8794cb..03e06b7fe 100644 --- a/retail/bootloader/source/arm7/dsi2ds_patches.c +++ b/retail/bootloader/source/arm7/dsi2ds_patches.c @@ -10388,6 +10388,90 @@ void patchDSiModeToDSMode(cardengineArm9* ce9, const tNDSHeader* ndsHeader) { *(u32*)0x02047880 = 0xE1A00000; // nop } + // Elite Forces: Unit 77 (USA) + else if (strcmp(romTid, "K42E") == 0) { + *(u32*)0x020340E4 = 0xE1A00000; // nop + *(u32*)0x020340F8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034104 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034134 = 0xE1A00000; // nop + *(u32*)0x02034178 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034184 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020341B4 = 0xE1A00000; // nop + *(u32*)0x020341D8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x020341E8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034214 = 0xE1A00000; // nop + *(u32*)0x020343E0 = 0xE1A00000; // nop + *(u32*)0x020343F4 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034400 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034430 = 0xE1A00000; // nop + *(u32*)0x02034460 = 0xE1A00000; // nop + *(u32*)0x02034474 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034484 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020344B4 = 0xE1A00000; // nop + setBL(0x02042188, (u32)dsiSaveCreate); + setBL(0x02042190, (u32)dsiSaveGetResultCode); + setBL(0x020421B4, (u32)dsiSaveOpen); + setBL(0x02042208, (u32)dsiSaveSeek); + setBL(0x02042224, (u32)dsiSaveWrite); + setBL(0x02042230, (u32)dsiSaveClose); + setBL(0x02042508, (u32)dsiSaveOpen); + setBL(0x02042560, (u32)dsiSaveSeek); + setBL(0x0204257C, (u32)dsiSaveRead); + setBL(0x02042594, (u32)dsiSaveClose); + *(u32*)0x020426B8 = 0xE1A00000; // nop + *(u32*)0x0209D7E4 = 0xE1A00000; // nop + *(u32*)0x020A0E60 = 0xE1A00000; // nop + patchInitDSiWare(0x020A9498, heapEnd); + *(u32*)0x020A9824 = *(u32*)0x02004FE8; + patchUserSettingsReadDSiWare(0x020AAA80); + *(u32*)0x020AAA9C = wirelessReturnCodeArm; + *(u32*)0x020AAAA0 = 0xE12FFF1E; // bx lr + *(u32*)0x020AAAA8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020AAAAC = 0xE12FFF1E; // bx lr + } + + // Elite Forces: Unit 77 (Europe) + else if (strcmp(romTid, "K42P") == 0) { + *(u32*)0x02033F4C = 0xE1A00000; // nop + *(u32*)0x02033F60 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02033F6C = 0xE3A00000; // mov r0, #0 + *(u32*)0x02033F9C = 0xE1A00000; // nop + *(u32*)0x02033FDC = 0xE3A00001; // mov r0, #1 + *(u32*)0x02033FE8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034018 = 0xE1A00000; // nop + *(u32*)0x0203403C = 0xE3A00001; // mov r0, #1 + *(u32*)0x0203404C = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034078 = 0xE1A00000; // nop + *(u32*)0x02034224 = 0xE1A00000; // nop + *(u32*)0x02034238 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034244 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034274 = 0xE1A00000; // nop + *(u32*)0x020342A4 = 0xE1A00000; // nop + *(u32*)0x020342B8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x020342C8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020342F8 = 0xE1A00000; // nop + setBL(0x02041F98, (u32)dsiSaveCreate); + setBL(0x02041FA0, (u32)dsiSaveGetResultCode); + setBL(0x02041FC4, (u32)dsiSaveOpen); + setBL(0x02042018, (u32)dsiSaveSeek); + setBL(0x02042034, (u32)dsiSaveWrite); + setBL(0x02042040, (u32)dsiSaveClose); + setBL(0x02042318, (u32)dsiSaveOpen); + setBL(0x02042370, (u32)dsiSaveSeek); + setBL(0x0204238C, (u32)dsiSaveRead); + setBL(0x020423A4, (u32)dsiSaveClose); + *(u32*)0x020424C8 = 0xE1A00000; // nop + *(u32*)0x0209D4F0 = 0xE1A00000; // nop + *(u32*)0x020A0B6C = 0xE1A00000; // nop + patchInitDSiWare(0x020A91A4, heapEnd); + *(u32*)0x020A9530 = *(u32*)0x02004FE8; + patchUserSettingsReadDSiWare(0x020AA78C); + *(u32*)0x020AA7A8 = wirelessReturnCodeArm; + *(u32*)0x020AA7AC = 0xE12FFF1E; // bx lr + *(u32*)0x020AA7B4 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020AA7B8 = 0xE12FFF1E; // bx lr + } + // G.G Series: Energy Chain (USA) // Saving not supported due to possible bug else if (strcmp(romTid, "KD7E") == 0) { diff --git a/retail/bootloaderi/source/arm7/patch_common.c b/retail/bootloaderi/source/arm7/patch_common.c index a75e30080..60b15fd11 100644 --- a/retail/bootloaderi/source/arm7/patch_common.c +++ b/retail/bootloaderi/source/arm7/patch_common.c @@ -5729,6 +5729,70 @@ void dsiWarePatch(cardengineArm9* ce9, const tNDSHeader* ndsHeader) { } } + // Elite Forces: Unit 77 (USA) + else if (strcmp(romTid, "K42E") == 0 && saveOnFlashcard) { + *(u32*)0x020340E4 = 0xE1A00000; // nop + *(u32*)0x020340F8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034104 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034134 = 0xE1A00000; // nop + *(u32*)0x02034178 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034184 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020341B4 = 0xE1A00000; // nop + *(u32*)0x020341D8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x020341E8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034214 = 0xE1A00000; // nop + *(u32*)0x020343E0 = 0xE1A00000; // nop + *(u32*)0x020343F4 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034400 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034430 = 0xE1A00000; // nop + *(u32*)0x02034460 = 0xE1A00000; // nop + *(u32*)0x02034474 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034484 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020344B4 = 0xE1A00000; // nop + setBL(0x02042188, (u32)dsiSaveCreate); + setBL(0x02042190, (u32)dsiSaveGetResultCode); + setBL(0x020421B4, (u32)dsiSaveOpen); + setBL(0x02042208, (u32)dsiSaveSeek); + setBL(0x02042224, (u32)dsiSaveWrite); + setBL(0x02042230, (u32)dsiSaveClose); + setBL(0x02042508, (u32)dsiSaveOpen); + setBL(0x02042560, (u32)dsiSaveSeek); + setBL(0x0204257C, (u32)dsiSaveRead); + setBL(0x02042594, (u32)dsiSaveClose); + } + + // Elite Forces: Unit 77 (Europe) + else if (strcmp(romTid, "K42P") == 0 && saveOnFlashcard) { + *(u32*)0x02033F4C = 0xE1A00000; // nop + *(u32*)0x02033F60 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02033F6C = 0xE3A00000; // mov r0, #0 + *(u32*)0x02033F9C = 0xE1A00000; // nop + *(u32*)0x02033FDC = 0xE3A00001; // mov r0, #1 + *(u32*)0x02033FE8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034018 = 0xE1A00000; // nop + *(u32*)0x0203403C = 0xE3A00001; // mov r0, #1 + *(u32*)0x0203404C = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034078 = 0xE1A00000; // nop + *(u32*)0x02034224 = 0xE1A00000; // nop + *(u32*)0x02034238 = 0xE3A00001; // mov r0, #1 + *(u32*)0x02034244 = 0xE3A00000; // mov r0, #0 + *(u32*)0x02034274 = 0xE1A00000; // nop + *(u32*)0x020342A4 = 0xE1A00000; // nop + *(u32*)0x020342B8 = 0xE3A00001; // mov r0, #1 + *(u32*)0x020342C8 = 0xE3A00000; // mov r0, #0 + *(u32*)0x020342F8 = 0xE1A00000; // nop + setBL(0x02041F98, (u32)dsiSaveCreate); + setBL(0x02041FA0, (u32)dsiSaveGetResultCode); + setBL(0x02041FC4, (u32)dsiSaveOpen); + setBL(0x02042018, (u32)dsiSaveSeek); + setBL(0x02042034, (u32)dsiSaveWrite); + setBL(0x02042040, (u32)dsiSaveClose); + setBL(0x02042318, (u32)dsiSaveOpen); + setBL(0x02042370, (u32)dsiSaveSeek); + setBL(0x0204238C, (u32)dsiSaveRead); + setBL(0x020423A4, (u32)dsiSaveClose); + } + // Escape Trick: The Secret of Rock City Prison (USA) else if (strcmp(romTid, "K5QE") == 0) { if (!twlFontFound) {