Skip to content

Commit

Permalink
B4DS: Add support for *Elite Forces: Unit 77* (DSiWare)
Browse files Browse the repository at this point in the history
  • Loading branch information
RocketRobz committed Jan 7, 2024
1 parent 2251c97 commit 1ccbd78
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 0 deletions.
1 change: 1 addition & 0 deletions retail/arm9/include/dsiwaresSetForBootloader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
84 changes: 84 additions & 0 deletions retail/bootloader/source/arm7/dsi2ds_patches.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
64 changes: 64 additions & 0 deletions retail/bootloaderi/source/arm7/patch_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 1ccbd78

Please sign in to comment.