Skip to content

Commit 9cfb5ee

Browse files
committed
Sleep mode disable now works in games
1 parent 5c1a6e8 commit 9cfb5ee

14 files changed

Lines changed: 218 additions & 2 deletions

File tree

retail/bootloader/include/find.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ u32* findSwiGetPitchTableOffset(const tNDSHeader* ndsHeader, const module_params
103103
u32* findUserDataAddrOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);
104104
u32* findSleepPatchOffset(const tNDSHeader* ndsHeader);
105105
u16* findSleepPatchOffsetThumb(const tNDSHeader* ndsHeader);
106+
u32* findSleepInputWriteOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);
106107
u32* findRamClearOffset(const tNDSHeader* ndsHeader);
107108
u32* findPostBootOffset(const tNDSHeader* ndsHeader);
108109
u32* findCardIrqEnableOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);

retail/bootloader/include/patch.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
//extern bool cardReadFound; // patch_arm9.c
5252

53-
#define patchOffsetCacheFileVersion 45 // Change when new functions are being patched, some offsets removed,
53+
#define patchOffsetCacheFileVersion 46 // Change when new functions are being patched, some offsets removed,
5454
// the offset order changed, and/or the function signatures changed (not added)
5555

5656
typedef struct patchOffsetCacheContents {
@@ -109,6 +109,7 @@ typedef struct patchOffsetCacheContents {
109109
u32* swiGetPitchTableOffset;
110110
u32 swiGetPitchTableChecked;
111111
u32* sleepPatchOffset;
112+
u32* sleepInputWriteOffset;
112113
u32* postBootOffset;
113114
u32* a7CardIrqEnableOffset;
114115
u32* a7IrqHandlerOffset;

retail/bootloader/source/arm7/find_arm7.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ static const u32 sleepPatch[2] = {0x0A000001, 0xE3A00601};
8484
static const u16 sleepPatchThumb[2] = {0xD002, 0x4831};
8585
static const u16 sleepPatchThumbAlt[2] = {0xD002, 0x0440};
8686

87+
// Sleep input write
88+
static const u32 sleepInputWriteEndSignature1[2] = {0x04000136, 0x027FFFA8};
89+
static const u32 sleepInputWriteEndSignature5[2] = {0x04000136, 0x02FFFFA8};
90+
static const u32 sleepInputWriteSignature[1] = {0x13A04902};
91+
static const u16 sleepInputWriteBeqSignatureThumb[1] = {0xD000};
92+
8793
// RAM clear
8894
// static const u32 ramClearSignature[2] = {0xE12FFF1E, 0x027FF000};
8995
static const u32 ramClearSignatureTwl[2] = {0x02FFC000, 0x02FFF000};
@@ -988,6 +994,40 @@ u16* findSleepPatchOffsetThumb(const tNDSHeader* ndsHeader) {
988994
return sleepPatchOffset;
989995
}
990996

997+
u32* findSleepInputWriteOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
998+
dbg_printf("findSleepInputWriteOffset:\n");
999+
1000+
u32* offset = NULL;
1001+
u32* endOffset = findOffset(
1002+
(u32*)ndsHeader->arm7destination, newArm7binarySize,
1003+
isSdk5(moduleParams) ? sleepInputWriteEndSignature5 : sleepInputWriteEndSignature1, 2
1004+
);
1005+
if (endOffset) {
1006+
offset = findOffsetBackwards(
1007+
endOffset, 0x38,
1008+
sleepInputWriteSignature, 1
1009+
);
1010+
if (!offset) {
1011+
u32 thumbOffset = (u32)findOffsetBackwardsThumb(
1012+
(u16*)endOffset, 0x30,
1013+
sleepInputWriteBeqSignatureThumb, 1
1014+
);
1015+
if (thumbOffset) {
1016+
thumbOffset += 2;
1017+
offset = (u32*)thumbOffset;
1018+
}
1019+
}
1020+
}
1021+
if (offset) {
1022+
dbg_printf("Sleep input write found\n");
1023+
} else {
1024+
dbg_printf("Sleep input write not found\n");
1025+
}
1026+
1027+
dbg_printf("\n");
1028+
return offset;
1029+
}
1030+
9911031
u32* findRamClearOffset(const tNDSHeader* ndsHeader) {
9921032
dbg_printf("findRamClearOffset:\n");
9931033

retail/bootloader/source/arm7/patch_arm7.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,33 @@ static void patchSleepMode(const tNDSHeader* ndsHeader) {
288288
}
289289
}
290290

291+
292+
static void patchSleepInputWrite(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
293+
u32* offset = patchOffsetCache.sleepInputWriteOffset;
294+
if (!patchOffsetCache.sleepInputWriteOffset) {
295+
offset = findSleepInputWriteOffset(ndsHeader, moduleParams);
296+
if (offset) {
297+
patchOffsetCache.sleepInputWriteOffset = offset;
298+
}
299+
}
300+
if (!offset) {
301+
return;
302+
}
303+
304+
if (!sleepMode) {
305+
if (*offset == 0x13A04902) {
306+
*offset = 0xE1A00000; // nop
307+
} else {
308+
u16* offsetThumb = (u16*)offset;
309+
*offsetThumb = 0x46C0; // nop
310+
}
311+
}
312+
313+
dbg_printf("Sleep input write location : ");
314+
dbg_hexa((u32)offset);
315+
dbg_printf("\n\n");
316+
}
317+
291318
static void patchRamClear(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
292319
if (moduleParams->sdk_version < 0x5000000 || arm7newUnitCode == 0) {
293320
return;
@@ -455,6 +482,7 @@ u32 patchCardNdsArm7(
455482
patchPostBoot(ndsHeader);
456483

457484
patchSleepMode(ndsHeader);
485+
patchSleepInputWrite(ndsHeader, moduleParams);
458486

459487
patchRamClear(ndsHeader, moduleParams);
460488

retail/bootloader/source/arm7/patch_common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ void rsetA7Cache(void)
522522
patchOffsetCache.swiGetPitchTableOffset = 0;
523523
patchOffsetCache.swiGetPitchTableChecked = 0;
524524
patchOffsetCache.sleepPatchOffset = 0;
525+
patchOffsetCache.sleepInputWriteOffset = 0;
525526
patchOffsetCache.postBootOffset = 0;
526527
patchOffsetCache.a7CardIrqEnableOffset = 0;
527528
patchOffsetCache.a7IrqHandlerOffset = 0;

retail/bootloaderi/include/find.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ u32* findSwiGetPitchTableOffset(const tNDSHeader* ndsHeader, const module_params
129129
//u32* findUserDataAddrOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);
130130
u32* findSleepPatchOffset(const tNDSHeader* ndsHeader);
131131
u16* findSleepPatchOffsetThumb(const tNDSHeader* ndsHeader);
132+
u32* findSleepInputWriteOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);
132133
u32* findRamClearOffset(const tNDSHeader* ndsHeader);
133134
u32* findRamClearIOffset(const tNDSHeader* ndsHeader);
134135
u32* findRamClearI2Offset(const u32* ramClearIOffset);

retail/bootloaderi/include/patch.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
//extern bool cardReadFound; // patch_arm9.c
5252

53-
#define patchOffsetCacheFileVersion 104 // Change when new functions are being patched, some offsets removed,
53+
#define patchOffsetCacheFileVersion 105 // Change when new functions are being patched, some offsets removed,
5454
// the offset order changed, and/or the function signatures changed (not added)
5555

5656
typedef struct patchOffsetCacheContents {
@@ -135,6 +135,7 @@ typedef struct patchOffsetCacheContents {
135135
u32* swiGetPitchTableOffset;
136136
u32 swiGetPitchTableChecked;
137137
u32* sleepPatchOffset;
138+
u32* sleepInputWriteOffset;
138139
u32* postBootOffset;
139140
u32* a7CardIrqEnableOffset;
140141
u32* cardCheckPullOutOffset;

retail/bootloaderi/source/arm7/find_arm7.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ static const u32 sleepPatch[2] = {0x0A000001, 0xE3A00601};
8585
static const u16 sleepPatchThumb[2] = {0xD002, 0x4831};
8686
static const u16 sleepPatchThumbAlt[2] = {0xD002, 0x0440};
8787

88+
// Sleep input write
89+
static const u32 sleepInputWriteEndSignature1[2] = {0x04000136, 0x027FFFA8};
90+
static const u32 sleepInputWriteEndSignature5[2] = {0x04000136, 0x02FFFFA8};
91+
static const u32 sleepInputWriteSignature[1] = {0x13A04902};
92+
static const u16 sleepInputWriteBeqSignatureThumb[1] = {0xD000};
93+
8894
// RAM clear
8995
static const u32 ramClearSignature[2] = {0x02FFC000, 0x02FFF000};
9096
static const u32 ramClearISignature[1] = {0x02FE0000};
@@ -1037,6 +1043,46 @@ u16* findSleepPatchOffsetThumb(const tNDSHeader* ndsHeader) {
10371043
return sleepPatchOffset;
10381044
}
10391045

1046+
u32* findSleepInputWriteOffset(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
1047+
dbg_printf("findSleepInputWriteOffset:\n");
1048+
1049+
u32* offset = NULL;
1050+
u32* endOffset = findOffset(
1051+
(u32*)ndsHeader->arm7destination, newArm7binarySize,
1052+
isSdk5(moduleParams) ? sleepInputWriteEndSignature5 : sleepInputWriteEndSignature1, 2
1053+
);
1054+
if (!endOffset && dsiModeConfirmed && ndsHeader->unitCode > 0 && *(u32*)0x02FFE1A0 != 0x00403000) {
1055+
endOffset = findOffset(
1056+
(u32*)__DSiHeader->arm7idestination, newArm7ibinarySize,
1057+
sleepInputWriteEndSignature5, 2
1058+
);
1059+
}
1060+
if (endOffset) {
1061+
offset = findOffsetBackwards(
1062+
endOffset, 0x38,
1063+
sleepInputWriteSignature, 1
1064+
);
1065+
if (!offset) {
1066+
u32 thumbOffset = (u32)findOffsetBackwardsThumb(
1067+
(u16*)endOffset, 0x30,
1068+
sleepInputWriteBeqSignatureThumb, 1
1069+
);
1070+
if (thumbOffset) {
1071+
thumbOffset += 2;
1072+
offset = (u32*)thumbOffset;
1073+
}
1074+
}
1075+
}
1076+
if (offset) {
1077+
dbg_printf("Sleep input write found\n");
1078+
} else {
1079+
dbg_printf("Sleep input write not found\n");
1080+
}
1081+
1082+
dbg_printf("\n");
1083+
return offset;
1084+
}
1085+
10401086
u32* findRamClearOffset(const tNDSHeader* ndsHeader) {
10411087
dbg_printf("findRamClearOffset:\n");
10421088

retail/bootloaderi/source/arm7/main.arm7.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1797,6 +1797,9 @@ int arm7_main(void) {
17971797
extern void patchScfgExt(const tNDSHeader* ndsHeader);
17981798
patchScfgExt(ndsHeader);
17991799

1800+
extern void patchSleepInputWrite(const tNDSHeader* ndsHeader, const module_params_t* moduleParams);
1801+
patchSleepInputWrite(ndsHeader, moduleParams);
1802+
18001803
extern void patchRamClearI(const tNDSHeader* ndsHeader, const module_params_t* moduleParams, const bool _isDSiWare);
18011804
patchRamClearI(ndsHeader, moduleParams, true);
18021805

retail/bootloaderi/source/arm7/patch_arm7.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,32 @@ static void patchSleepMode(const tNDSHeader* ndsHeader) {
382382
}
383383
}
384384

385+
void patchSleepInputWrite(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
386+
u32* offset = patchOffsetCache.sleepInputWriteOffset;
387+
if (!patchOffsetCache.sleepInputWriteOffset) {
388+
offset = findSleepInputWriteOffset(ndsHeader, moduleParams);
389+
if (offset) {
390+
patchOffsetCache.sleepInputWriteOffset = offset;
391+
}
392+
}
393+
if (!offset) {
394+
return;
395+
}
396+
397+
if (!sleepMode) {
398+
if (*offset == 0x13A04902) {
399+
*offset = 0xE1A00000; // nop
400+
} else {
401+
u16* offsetThumb = (u16*)offset;
402+
*offsetThumb = 0x46C0; // nop
403+
}
404+
}
405+
406+
dbg_printf("Sleep input write location : ");
407+
dbg_hexa((u32)offset);
408+
dbg_printf("\n\n");
409+
}
410+
385411
static void patchRamClear(const tNDSHeader* ndsHeader, const module_params_t* moduleParams) {
386412
if (moduleParams->sdk_version < 0x5000000 || ndsHeader->unitCode == 0 || dsiModeConfirmed) {
387413
return;
@@ -589,6 +615,7 @@ u32 patchCardNdsArm7(
589615
patchPostBoot(ndsHeader);
590616
patchScfgExt(ndsHeader);
591617
patchSleepMode(ndsHeader);
618+
patchSleepInputWrite(ndsHeader, moduleParams);
592619

593620
patchRamClear(ndsHeader, moduleParams);
594621
patchRamClearI(ndsHeader, moduleParams, false);

0 commit comments

Comments
 (0)