Skip to content

Commit 262d03e

Browse files
committed
B4DS: Add save support for *Trajectile*
1 parent cc35ca3 commit 262d03e

9 files changed

Lines changed: 182 additions & 32 deletions

File tree

retail/bootloader/source/arm7/dsi2ds_ovl_save_patch.s

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@---------------------------------------------------------------------------------
22
.global applyDSi2DSSaveCodeToOverlay
3+
.global applyDSi2DSThumbSaveCodeToOverlay
34
.align 4
45
.arm
56

@@ -13,14 +14,13 @@ applyDSi2DSSaveCodeToOverlay:
1314
bxne lr
1415
mov r2, #0
1516
ldr r3, dsi2dsSaveOverlayPatchLines
16-
adr r4, dsi2dsSaveOverlayPatch
17-
mov r5, #0
17+
ldr r4, dsi2dsSaveOverlayPatch
1818
applyDSi2DSSaveCodeToOverlay_loop:
19-
ldr r0, [r4, r5] @ offset
20-
add r5, #4
21-
ldr r1, [r4, r5] @ code
22-
add r5, #4
19+
ldr r0, [r4] @ offset
20+
add r4, #4
21+
ldr r1, [r4] @ code
2322
str r1, [r0]
23+
add r4, #4
2424

2525
add r2, #1
2626
cmp r2, r3
@@ -33,4 +33,41 @@ dsi2dsSaveOverlayCode:
3333
dsi2dsSaveOverlayPatchLines:
3434
.word 0
3535
dsi2dsSaveOverlayPatch:
36+
.word 0
37+
@---------------------------------------------------------------------------------
38+
39+
@---------------------------------------------------------------------------------
40+
applyDSi2DSThumbSaveCodeToOverlay:
41+
@---------------------------------------------------------------------------------
42+
ldr r0, dsi2dsThumbSaveOverlayOffset
43+
ldr r1, dsi2dsThumbSaveOverlayCode
44+
ldr r0, [r0]
45+
cmp r0, r1
46+
bxne lr
47+
mov r2, #0
48+
ldr r3, dsi2dsThumbSaveOverlayPatchLines
49+
ldr r4, dsi2dsThumbSaveOverlayPatch
50+
applyDSi2DSThumbSaveCodeToOverlay_loop:
51+
ldr r0, [r4] @ offset
52+
add r4, #4
53+
ldrh r1, [r4] @ code
54+
strh r1, [r0]
55+
add r4, #2
56+
add r0, #2
57+
ldrh r1, [r4]
58+
strh r1, [r0]
59+
add r4, #2
60+
61+
add r2, #1
62+
cmp r2, r3
63+
bne applyDSi2DSThumbSaveCodeToOverlay_loop
64+
bx lr
65+
dsi2dsThumbSaveOverlayOffset:
66+
.word 0
67+
dsi2dsThumbSaveOverlayCode:
68+
.word 0
69+
dsi2dsThumbSaveOverlayPatchLines:
70+
.word 0
71+
dsi2dsThumbSaveOverlayPatch:
72+
.word 0
3673
@---------------------------------------------------------------------------------

retail/bootloader/source/arm7/dsi2ds_patches.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26887,6 +26887,24 @@ void patchDSiModeToDSMode(cardengineArm9* ce9, const tNDSHeader* ndsHeader) {
2688726887
doubleNopT(0x020DA21E);
2688826888
*(u32*)0x02104154 = extendedMemory ? 0x1E0000 : 0; // Shrink sound heap from 0x300000 (0 for disabled)
2688926889

26890+
// Overlay code patch (Part of .pck file)
26891+
/* if (*(u32*)0x0217902C == 0xF75A9300) {
26892+
*(u16*)0x0217902E = 0x2001; // movs r0, #1 (dsiSaveGetArcSrc)
26893+
*(u16*)0x02179030 = nopT; // nop
26894+
setBLXThumb(0x0217904A, (u32)dsiSaveOpen);
26895+
setBLXThumb(0x02179056, (u32)dsiSaveCreate);
26896+
setBLXThumb(0x02179060, (u32)dsiSaveOpen);
26897+
setBLXThumb(0x02179074, (u32)dsiSaveClose);
26898+
setBLXThumb(0x0217908C, (u32)dsiSaveWrite);
26899+
setBLXThumb(0x0217909A, (u32)dsiSaveClose);
26900+
doubleNopT(0x021790A6); // dsiSaveFlush
26901+
setBLXThumb(0x021790AC, (u32)dsiSaveClose);
26902+
setBLXThumb(0x021790D2, (u32)dsiSaveOpen);
26903+
setBLXThumb(0x021790EC, (u32)dsiSaveRead);
26904+
setBLXThumb(0x021790FC, (u32)dsiSaveClose);
26905+
setBLXThumb(0x02179108, (u32)dsiSaveClose);
26906+
} */
26907+
2689026908
if (!extendedMemory) {
2689126909
doubleNopT(0x020B70D0); // Skip unneeded allocation code
2689226910
setBLXThumb(0x020B9352, 0x020C463C);
@@ -26929,6 +26947,24 @@ void patchDSiModeToDSMode(cardengineArm9* ce9, const tNDSHeader* ndsHeader) {
2692926947
doubleNopT(0x020D9F0E);
2693026948
*(u32*)0x02103DF8 = extendedMemory ? 0x1E0000 : 0; // Shrink sound heap from 0x300000 (0 for disabled)
2693126949

26950+
// Overlay code patch (Part of .pck file)
26951+
/* if (*(u32*)0x02178CCC == 0xF75A9300) {
26952+
*(u16*)0x02178CCE = 0x2001; // movs r0, #1 (dsiSaveGetArcSrc)
26953+
*(u16*)0x02178CD0 = nopT; // nop
26954+
setBLXThumb(0x02178CEA, (u32)dsiSaveOpen);
26955+
setBLXThumb(0x02178CF6, (u32)dsiSaveCreate);
26956+
setBLXThumb(0x02178D00, (u32)dsiSaveOpen);
26957+
setBLXThumb(0x02178D14, (u32)dsiSaveClose);
26958+
setBLXThumb(0x02178D2C, (u32)dsiSaveWrite);
26959+
setBLXThumb(0x02178D3A, (u32)dsiSaveClose);
26960+
doubleNopT(0x02178D46); // dsiSaveFlush
26961+
setBLXThumb(0x02178D4C, (u32)dsiSaveClose);
26962+
setBLXThumb(0x02178D72, (u32)dsiSaveOpen);
26963+
setBLXThumb(0x02178D8C, (u32)dsiSaveRead);
26964+
setBLXThumb(0x02178D9C, (u32)dsiSaveClose);
26965+
setBLXThumb(0x02178DA8, (u32)dsiSaveClose);
26966+
} */
26967+
2693226968
if (!extendedMemory) {
2693326969
doubleNopT(0x020B6DC0); // Skip unneeded allocation code
2693426970
setBLXThumb(0x020B9042, 0x020C432C);

retail/bootloader/source/arm7/patch_arm9.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,7 +2161,8 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
21612161
const u32* dsiSaveWrite = ce9->patches->dsiSaveWrite;
21622162

21632163
u32* ovlPatcher = NULL;
2164-
u16 ovlPatchOffset = 0x54;
2164+
const u8 codeLen = patchOffsetCache.a9IsThumb ? 0x54 : 0x44;
2165+
u32* ovlPatch = NULL;
21652166

21662167
aFile file;
21672168
getFileFromCluster(&file, dsi2dsSavePatchFileCluster);
@@ -2182,15 +2183,18 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
21822183
ovlPatcher = (u32*)postCardReadCodeOffset;
21832184

21842185
extern u32 applyDSi2DSSaveCodeToOverlay[];
2185-
tonccpy(ovlPatcher, applyDSi2DSSaveCodeToOverlay, 0x48);
2186+
extern u32 applyDSi2DSThumbSaveCodeToOverlay[];
2187+
tonccpy(ovlPatcher, patchOffsetCache.a9IsThumb ? applyDSi2DSThumbSaveCodeToOverlay : applyDSi2DSSaveCodeToOverlay, codeLen);
21862188

21872189
const u32 ovlOffset = patchData[0];
21882190
i += 8;
21892191
fileRead((char*)patchData, &file, dsi2dsSavePatchOffset+i, 8);
21902192

2191-
ovlPatcher[0x48/4] = ovlOffset; // dsi2dsSaveOverlayOffset
2192-
ovlPatcher[0x4C/4] = patchData[0]; // dsi2dsSaveOverlayCode
2193-
ovlPatcher[0x50/4] = 0; // dsi2dsSaveOverlayPatchLines
2193+
ovlPatcher[codeLen/4] = ovlOffset; // dsi2dsSaveOverlayOffset
2194+
ovlPatcher[(codeLen+4)/4] = patchData[0]; // dsi2dsSaveOverlayCode
2195+
ovlPatcher[(codeLen+8)/4] = 0; // dsi2dsSaveOverlayPatchLines
2196+
ovlPatcher[(codeLen+0xC)/4] = patchData[1] ? patchData[1] : postCardReadCodeOffset+codeLen+0x10; // dsi2dsSaveOverlayPatch
2197+
ovlPatch = (u32*)(ovlPatcher[(codeLen+0xC)/4]);
21942198
} break;
21952199
case 0x4E494254: // 'TBIN'
21962200
twlSaveThumbBranchOffset = patchData[0];
@@ -2306,11 +2310,9 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
23062310
break;
23072311
}
23082312
if (ovlPatcherAvailable) {
2309-
ovlPatcher[0x50/4]++;
2310-
ovlPatcher[ovlPatchOffset/4] = patchData[0];
2311-
ovlPatchOffset += 4;
2312-
ovlPatcher[ovlPatchOffset/4] = *(u32*)(patchData[0]);
2313-
ovlPatchOffset += 4;
2313+
ovlPatcher[(codeLen+8)/4]++;
2314+
*ovlPatch++ = patchData[0];
2315+
tonccpy(ovlPatch++, (void*)(patchData[0]), 4);
23142316
}
23152317
}
23162318
}

retail/bootloaderi/source/arm7/dsi2ds_ovl_save_patch.s

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@---------------------------------------------------------------------------------
22
.global applyDSi2DSSaveCodeToOverlay
3+
.global applyDSi2DSThumbSaveCodeToOverlay
34
.align 4
45
.arm
56

@@ -13,14 +14,13 @@ applyDSi2DSSaveCodeToOverlay:
1314
bxne lr
1415
mov r2, #0
1516
ldr r3, dsi2dsSaveOverlayPatchLines
16-
adr r4, dsi2dsSaveOverlayPatch
17-
mov r5, #0
17+
ldr r4, dsi2dsSaveOverlayPatch
1818
applyDSi2DSSaveCodeToOverlay_loop:
19-
ldr r0, [r4, r5] @ offset
20-
add r5, #4
21-
ldr r1, [r4, r5] @ code
22-
add r5, #4
19+
ldr r0, [r4] @ offset
20+
add r4, #4
21+
ldr r1, [r4] @ code
2322
str r1, [r0]
23+
add r4, #4
2424

2525
add r2, #1
2626
cmp r2, r3
@@ -33,4 +33,41 @@ dsi2dsSaveOverlayCode:
3333
dsi2dsSaveOverlayPatchLines:
3434
.word 0
3535
dsi2dsSaveOverlayPatch:
36+
.word 0
37+
@---------------------------------------------------------------------------------
38+
39+
@---------------------------------------------------------------------------------
40+
applyDSi2DSThumbSaveCodeToOverlay:
41+
@---------------------------------------------------------------------------------
42+
ldr r0, dsi2dsThumbSaveOverlayOffset
43+
ldr r1, dsi2dsThumbSaveOverlayCode
44+
ldr r0, [r0]
45+
cmp r0, r1
46+
bxne lr
47+
mov r2, #0
48+
ldr r3, dsi2dsThumbSaveOverlayPatchLines
49+
ldr r4, dsi2dsThumbSaveOverlayPatch
50+
applyDSi2DSThumbSaveCodeToOverlay_loop:
51+
ldr r0, [r4] @ offset
52+
add r4, #4
53+
ldrh r1, [r4] @ code
54+
strh r1, [r0]
55+
add r4, #2
56+
add r0, #2
57+
ldrh r1, [r4]
58+
strh r1, [r0]
59+
add r4, #2
60+
61+
add r2, #1
62+
cmp r2, r3
63+
bne applyDSi2DSThumbSaveCodeToOverlay_loop
64+
bx lr
65+
dsi2dsThumbSaveOverlayOffset:
66+
.word 0
67+
dsi2dsThumbSaveOverlayCode:
68+
.word 0
69+
dsi2dsThumbSaveOverlayPatchLines:
70+
.word 0
71+
dsi2dsThumbSaveOverlayPatch:
72+
.word 0
3673
@---------------------------------------------------------------------------------

retail/bootloaderi/source/arm7/patch_arm9.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,7 +2284,8 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
22842284
const u32* dsiSaveWrite = ce9->patches->dsiSaveWrite;
22852285

22862286
u32* ovlPatcher = NULL;
2287-
u16 ovlPatchOffset = 0x54;
2287+
const u8 codeLen = patchOffsetCache.a9IsThumb ? 0x54 : 0x44;
2288+
u32* ovlPatch = NULL;
22882289

22892290
aFile file;
22902291
getFileFromCluster(&file, dsi2dsSavePatchFileCluster, bootstrapOnFlashcard);
@@ -2305,15 +2306,18 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
23052306
ovlPatcher = (u32*)postCardReadCodeOffset;
23062307

23072308
extern u32 applyDSi2DSSaveCodeToOverlay[];
2308-
tonccpy(ovlPatcher, applyDSi2DSSaveCodeToOverlay, 0x48);
2309+
extern u32 applyDSi2DSThumbSaveCodeToOverlay[];
2310+
tonccpy(ovlPatcher, patchOffsetCache.a9IsThumb ? applyDSi2DSThumbSaveCodeToOverlay : applyDSi2DSSaveCodeToOverlay, codeLen);
23092311

23102312
const u32 ovlOffset = patchData[0];
23112313
i += 8;
23122314
fileRead((char*)patchData, &file, dsi2dsSavePatchOffset+i, 8);
23132315

2314-
ovlPatcher[0x48/4] = ovlOffset; // dsi2dsSaveOverlayOffset
2315-
ovlPatcher[0x4C/4] = patchData[0]; // dsi2dsSaveOverlayCode
2316-
ovlPatcher[0x50/4] = 0; // dsi2dsSaveOverlayPatchLines
2316+
ovlPatcher[codeLen/4] = ovlOffset; // dsi2dsSaveOverlayOffset
2317+
ovlPatcher[(codeLen+4)/4] = patchData[0]; // dsi2dsSaveOverlayCode
2318+
ovlPatcher[(codeLen+8)/4] = 0; // dsi2dsSaveOverlayPatchLines
2319+
ovlPatcher[(codeLen+0xC)/4] = patchData[1] ? patchData[1] : postCardReadCodeOffset+codeLen+0x10; // dsi2dsSaveOverlayPatch
2320+
ovlPatch = (u32*)(ovlPatcher[(codeLen+0xC)/4]);
23172321
} break;
23182322
case 0x4E494254: // 'TBIN'
23192323
twlSaveThumbBranchOffset = patchData[0];
@@ -2429,11 +2433,9 @@ void patchTwlSaveFuncs(const cardengineArm9* ce9) {
24292433
break;
24302434
}
24312435
if (ovlPatcherAvailable) {
2432-
ovlPatcher[0x50/4]++;
2433-
ovlPatcher[ovlPatchOffset/4] = patchData[0];
2434-
ovlPatchOffset += 4;
2435-
ovlPatcher[ovlPatchOffset/4] = *(u32*)(patchData[0]);
2436-
ovlPatchOffset += 4;
2436+
ovlPatcher[(codeLen+8)/4]++;
2437+
*ovlPatch++ = patchData[0];
2438+
tonccpy(ovlPatch++, (void*)(patchData[0]), 4);
24372439
}
24382440
}
24392441
}

retail/bootloaderi/source/arm7/patch_common.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15273,11 +15273,47 @@ void dsiWarePatch(cardengineArm9* ce9, const tNDSHeader* ndsHeader) {
1527315273
// Reflect Missile (Europe, Australia)
1527415274
else if ((strcmp(romTid, "KDZE") == 0 || strcmp(romTid, "KDZV") == 0) && dsiWramBlocked) {
1527515275
toncset16((u16*)0x020B9298, nopT, 0x4A/sizeof(u16)); // Do not use DSi WRAM
15276+
15277+
// Overlay code patch (Part of .pck file)
15278+
/* if (*(u32*)0x0217902C == 0xF75A9300) {
15279+
*(u16*)0x0217902E = 0x2001; // movs r0, #1 (dsiSaveGetArcSrc)
15280+
*(u16*)0x02179030 = nopT; // nop
15281+
setBLXThumb(0x0217904A, (u32)dsiSaveOpen);
15282+
setBLXThumb(0x02179056, (u32)dsiSaveCreate);
15283+
setBLXThumb(0x02179060, (u32)dsiSaveOpen);
15284+
setBLXThumb(0x02179074, (u32)dsiSaveClose);
15285+
setBLXThumb(0x0217908C, (u32)dsiSaveWrite);
15286+
setBLXThumb(0x0217909A, (u32)dsiSaveClose);
15287+
doubleNopT(0x021790A6); // dsiSaveFlush
15288+
setBLXThumb(0x021790AC, (u32)dsiSaveClose);
15289+
setBLXThumb(0x021790D2, (u32)dsiSaveOpen);
15290+
setBLXThumb(0x021790EC, (u32)dsiSaveRead);
15291+
setBLXThumb(0x021790FC, (u32)dsiSaveClose);
15292+
setBLXThumb(0x02179108, (u32)dsiSaveClose);
15293+
} */
1527615294
}
1527715295

1527815296
// Reflect Missile (Japan)
1527915297
else if (strcmp(romTid, "KDZJ") == 0 && dsiWramBlocked) {
1528015298
toncset16((u16*)0x020B8F88, nopT, 0x4A/sizeof(u16)); // Do not use DSi WRAM
15299+
15300+
// Overlay code patch (Part of .pck file)
15301+
/* if (*(u32*)0x02178CCC == 0xF75A9300) {
15302+
*(u16*)0x02178CCE = 0x2001; // movs r0, #1 (dsiSaveGetArcSrc)
15303+
*(u16*)0x02178CD0 = nopT; // nop
15304+
setBLXThumb(0x02178CEA, (u32)dsiSaveOpen);
15305+
setBLXThumb(0x02178CF6, (u32)dsiSaveCreate);
15306+
setBLXThumb(0x02178D00, (u32)dsiSaveOpen);
15307+
setBLXThumb(0x02178D14, (u32)dsiSaveClose);
15308+
setBLXThumb(0x02178D2C, (u32)dsiSaveWrite);
15309+
setBLXThumb(0x02178D3A, (u32)dsiSaveClose);
15310+
doubleNopT(0x02178D46); // dsiSaveFlush
15311+
setBLXThumb(0x02178D4C, (u32)dsiSaveClose);
15312+
setBLXThumb(0x02178D72, (u32)dsiSaveOpen);
15313+
setBLXThumb(0x02178D8C, (u32)dsiSaveRead);
15314+
setBLXThumb(0x02178D9C, (u32)dsiSaveClose);
15315+
setBLXThumb(0x02178DA8, (u32)dsiSaveClose);
15316+
} */
1528115317
}
1528215318

1528315319
// Treasure Hunter X (USA)
128 Bytes
Binary file not shown.
128 Bytes
Binary file not shown.
128 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)