@@ -15,40 +15,47 @@ firmHeader *firmLocation = (firmHeader *)0x24000000;
1515firmSectionHeader * section ;
1616u32 firmSize = 0 ;
1717u8 mode = 1 ,
18- console = 1 ;
18+ console = 1 ,
19+ a9lhSetup = 0 ,
20+ updatedSys = 0 ;
1921u16 pressed ;
2022
2123//Load firm into FCRAM
22- u8 loadFirm (u8 a9lh ){
24+ u8 loadFirm (u8 a9lhBoot ){
2325
26+ //Detect the console being used
2427 if (PDN_MPCORE_CFG == 1 ) console = 0 ;
28+ //Get pressed buttons
2529 pressed = HID_PAD ;
30+ //Determine if A9LH is installed
31+ if (a9lhBoot || fileSize ("/rei/installeda9lh" )){
32+ a9lhSetup = 1 ;
33+ //Check flag for > 9.2 SysNAND
34+ if (fileSize ("/rei/updatedsysnand" )) updatedSys = 1 ;
35+ }
36+
2637 section = firmLocation -> section ;
2738
28- //If L and R are pressed, boot SysNAND with the 9.0 FIRM
29- if ((pressed & BUTTON_L1R1 ) == BUTTON_L1R1 ) mode = 0 ;
39+ /* If L and R are pressed on a 9.0/2 SysNAND, or L on an updated
40+ SysNAND, boot 9.0 FIRM */
41+ if ((!updatedSys & ((pressed & BUTTON_L1R1 ) == BUTTON_L1R1 )) |
42+ (updatedSys & (pressed == BUTTON_L1 ))) mode = 0 ;
3043
3144 //If not using an A9LH setup, do so by decrypting FIRM0
32- if (!a9lh && ! fileSize ( "/rei/installeda9lh" ) && !mode ){
45+ if (!a9lhSetup && !mode ){
3346 //Read FIRM from NAND and write to FCRAM
3447 firmSize = console ? 0xF2000 : 0xE9000 ;
3548 nandFirm0 ((u8 * )firmLocation , firmSize , console );
3649 if (memcmp ((u8 * )firmLocation , "FIRM" , 4 ) != 0 ) return 1 ;
3750 }
3851 //Load FIRM from SD
3952 else {
40- if (!mode ){
41- char firmPath [] = "/rei/firmware90.bin" ;
42- firmSize = fileSize (firmPath );
43- if (!firmSize ) return 1 ;
44- fileRead ((u8 * )firmLocation , firmPath , firmSize );
45- }
46- else {
47- char firmPath [] = "/rei/firmware.bin" ;
48- firmSize = fileSize (firmPath );
49- if (!firmSize ) return 1 ;
50- fileRead ((u8 * )firmLocation , firmPath , firmSize );
51- }
53+ char firmPath [] = "/rei/firmware.bin" ;
54+ char firmPath2 [] = "/rei/firmware90.bin" ;
55+ char * pathPtr = mode ? firmPath : firmPath2 ;
56+ firmSize = fileSize (pathPtr );
57+ if (!firmSize ) return 1 ;
58+ fileRead ((u8 * )firmLocation , pathPtr , firmSize );
5259 }
5360 if ((((u32 )section [2 ].address >> 8 ) & 0xFF ) != (console ? 0x60 : 0x68 )) return 1 ;
5461
@@ -69,11 +76,16 @@ u8 loadEmu(void){
6976 emuCodeOffset = 0 ;
7077
7178 //Read emunand code from SD
72- const char path [] = "/rei/emunand/emunand.bin" ;
73- u32 size = fileSize (path );
79+ char path [] = "/rei/emunand/emunand.bin" ;
80+ char path2 [] = "/rei/emunand/emunand90.bin" ;
81+ char * pathPtr = ((!mode ) & console ) ? path2 : path ;
82+ u32 size = fileSize (pathPtr );
7483 if (!size ) return 1 ;
75- getEmuCode (firmLocation , & emuCodeOffset , firmSize );
76- fileRead ((u8 * )emuCodeOffset , path , size );
84+ if (!console | !mode ) nandRedir [5 ] = 0xA4 ;
85+ u8 * emuCodeTmp = & nandRedir [4 ];
86+ emuCodeOffset = * (u32 * )emuCodeTmp - (u32 )section [2 ].address +
87+ section [2 ].offset + (u32 )firmLocation ;
88+ fileRead ((u8 * )emuCodeOffset , pathPtr , size );
7789
7890 //Find and patch emunand related offsets
7991 u32 * pos_sdmmc = memsearch ((u32 * )emuCodeOffset , "SDMC" , size , 4 );
@@ -88,7 +100,6 @@ u8 loadEmu(void){
88100 * pos_header = emuHeader ;
89101
90102 //Add emunand hooks
91- if (!console ) nandRedir [5 ] = 0xA4 ;
92103 memcpy ((u8 * )emuRead , nandRedir , sizeof (nandRedir ));
93104 memcpy ((u8 * )emuWrite , nandRedir , sizeof (nandRedir ));
94105
@@ -101,8 +112,18 @@ u8 loadEmu(void){
101112//Patches
102113u8 patchFirm (void ){
103114
104- //If L is pressed, boot SysNAND with the SD FIRM
105- if (mode && !(pressed & BUTTON_L1 )) if (loadEmu ()) return 1 ;
115+ /* If L is pressed on a 9.0/9.2 SysNAND, or L+R on a > 9.2 SysNAND,
116+ or the 9.0 FIRM is loaded on a > 9.2 SysNAND, boot emuNAND */
117+ if ((updatedSys & (!mode | (pressed == BUTTON_L1R1 ))) |
118+ ((!updatedSys ) & mode & !(pressed & BUTTON_L1 ))){
119+ if (loadEmu ()) return 1 ;
120+ }
121+ else if (a9lhSetup ){
122+ //Patch FIRM partitions writes on SysNAND to protect A9LH
123+ u32 writeOffset = 0 ;
124+ getFIRMWrite (firmLocation , firmSize , & writeOffset );
125+ memcpy ((u8 * )writeOffset , FIRMblock , sizeof (FIRMblock ));
126+ }
106127
107128 u32 sigOffset = 0 ,
108129 sigOffset2 = 0 ;
@@ -112,8 +133,8 @@ u8 patchFirm(void){
112133 memcpy ((u8 * )sigOffset , sigPat1 , sizeof (sigPat1 ));
113134 memcpy ((u8 * )sigOffset2 , sigPat2 , sizeof (sigPat2 ));
114135
115- //Apply FIRM reboot patch. Not needed with A9LH and N3DS.
116- if (!console && !a9lh && mode &&
136+ //Apply FIRM reboot patch. Not needed with A9LH and N3DS
137+ if (!console && !a9lhSetup && mode &&
117138 ((fileSize ("/rei/reversereboot" ) > 0 ) == (pressed & BUTTON_A ))){
118139 u32 rebootOffset = 0 ,
119140 rebootOffset2 = 0 ;
0 commit comments