diff --git a/patches/reboot.s b/patches/reboot.s index 1a7a91c..799d156 100644 --- a/patches/reboot.s +++ b/patches/reboot.s @@ -41,26 +41,29 @@ payload_maxsize equ 0x10000 ; Maximum size for the payload (maximum that CakeB read_payload: ; Read file - mov r0, r7 + mov r0, r7 adr r1, bytes_read ldr r2, =payload_addr cmp r4, #0 movne r3, #0x12000 ; Skip the first 0x12000 bytes. moveq r3, payload_maxsize - ldr r6, [sp, #0x3A8-0x198] - ldr r6, [r6, #0x28] - blx r6 + ldr r6, [sp, #0x3A8-0x198] + ldr r6, [r6, #0x28] + blx r6 cmp r4, #0 movne r4, #0 bne read_payload ; Go read the real payload. - ; Copy the last digits of the wanted firm to the 5th byte of the payload - add r2, sp, #0x3A8 - 0x70 - ldr r0, [r2, #0x27] - ldr r1, =payload_addr + 4 - str r0, [r1] - ldr r0, [r2, #0x2B] - str r0, [r1, #4] + ; Copy the low TID (in UTF-16) of the wanted firm to the 5th byte of the payload + add r0, sp, #0x3A8 - 0x70 + add r0, 0x1A + add r1, r0, #0x10 + ldr r2, =payload_addr + 4 + copy_TID_low: + ldrh r3, [r0], #2 + strh r3, [r2], #2 + cmp r0, r1 + blo copy_TID_low ; Set kernel state mov r0, #0 @@ -81,10 +84,10 @@ payload_maxsize equ 0x10000 ; Maximum size for the payload (maximum that CakeB bytes_read: .word 0 fopen: .ascii "OPEN" .pool -bin_fname: .dcw "sdmc:/arm9loaderhax.bin" - .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -dat_fname: .dcw "sdmc:/Luma3DS.dat" - .word 0 +bin_fname: .dcw "sdmc:/arm9loaderhax.bin" + .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +dat_fname: .dcw "sdmc:/Luma3DS.dat" + .word 0 .align 4 kernelcode_start: diff --git a/source/config.c b/source/config.c index 60b9063..92aad55 100644 --- a/source/config.c +++ b/source/config.c @@ -43,7 +43,7 @@ void configureCFW(const char *configPath) "( ) Enable region/language emu. and ext. .code", "( ) Show current NAND in System Settings", "( ) Show GBA boot screen in patched AGB_FIRM", - "( ) Enable splash screen with no screen-init", + "( ) Display splash screen before payloads", "( ) Use a PIN", "( ) Disable access checks" }; diff --git a/source/draw.c b/source/draw.c index 4a98161..2dfbea3 100644 --- a/source/draw.c +++ b/source/draw.c @@ -42,13 +42,16 @@ static inline int strlen(const char *string) bool loadSplash(void) { + //Don't delay boot nor init the screens if no splash image is on the SD + if(getFileSize("/luma/splash.bin") + getFileSize("/luma/splash.bin") == 0) + return false; + initScreens(); - //Don't delay boot if no splash image is on the SD - if(fileRead(fb->top_left, "/luma/splash.bin") + - fileRead(fb->bottom, "/luma/splashbottom.bin")) return true; + fileRead(fb->top_left, "/luma/splash.bin"); + fileRead(fb->bottom, "/luma/splashbottom.bin"); - return false; + return true; } void drawCharacter(char character, int posX, int posY, u32 color) diff --git a/source/firm.c b/source/firm.c index e10b131..425be1a 100755 --- a/source/firm.c +++ b/source/firm.c @@ -37,6 +37,8 @@ #include "i2c.h" #include "../build/injector.h" +extern u16 launchedFirmTIDLow[8]; //defined in start.s + static firmHeader *const firm = (firmHeader *)0x24000000; static const firmSectionHeader *section; @@ -80,14 +82,14 @@ void main(void) installArm9Handlers(); //Determine if this is a firmlaunch boot - if(*(vu8 *)0x23F00005) + if(launchedFirmTIDLow[5] != 0) { if(needConfig == CREATE_CONFIGURATION) mcuReboot(); isFirmlaunch = true; //'0' = NATIVE_FIRM, '1' = TWL_FIRM, '2' = AGB_FIRM - firmType = *(vu8 *)0x23F00009 == '3' ? SAFE_FIRM : (FirmwareType)(*(vu8 *)0x23F00005 - '0'); + firmType = launchedFirmTIDLow[7] == u'3' ? SAFE_FIRM : (FirmwareType)(launchedFirmTIDLow[5] - u'0'); nandType = (FirmwareSource)BOOTCONFIG(0, 3); firmSource = (FirmwareSource)BOOTCONFIG(2, 1); @@ -181,14 +183,23 @@ void main(void) else { /* If L and R/A/Select or one of the single payload buttons are pressed, - chainload an external payload (verify the PIN if needed)*/ + chainload an external payload (the PIN, if any, has been verified)*/ + + if(CONFIG(6) && loadSplash()) + { + nbChronoStarted = 2; + chrono(0); + chrono(3); + nbChronoStarted = 0; + pressed = HID_PAD; + } + bool shouldLoadPayload = (pressed & SINGLE_PAYLOAD_BUTTONS) || ((pressed & BUTTON_L1) && (pressed & L_PAYLOAD_BUTTONS)); if(shouldLoadPayload) - loadPayload(pressed); + loadPayload(pressed, nbChronoStarted != 2); - //If screens are inited or the corresponding option is set, load splash screen - if((PDN_GPU_CNT != 1 || CONFIG(6)) && loadSplash()) + if(!CONFIG(6) && loadSplash()) { nbChronoStarted = 2; chrono(0); diff --git a/source/firm.h b/source/firm.h index 029929a..7437b3e 100644 --- a/source/firm.h +++ b/source/firm.h @@ -53,7 +53,7 @@ typedef enum ConfigurationStatus MODIFY_CONFIGURATION = 1, CREATE_CONFIGURATION = 2 } ConfigurationStatus; - + static inline u32 loadFirm(FirmwareType firmType); static inline void patchNativeFirm(u32 firmVersion, FirmwareSource nandType, u32 emuHeader, bool isA9lh); static inline void patchLegacyFirm(FirmwareType firmType); diff --git a/source/fs.c b/source/fs.c index cb9f458..77f028f 100644 --- a/source/fs.c +++ b/source/fs.c @@ -46,8 +46,8 @@ u32 fileRead(void *dest, const char *path) { unsigned int read; size = f_size(&file); - if(dest == NULL) return size; - f_read(&file, dest, size, &read); + if(dest != NULL) + f_read(&file, dest, size, &read); f_close(&file); } else size = 0; @@ -81,7 +81,7 @@ void createDirectory(const char *path) f_mkdir(path); } -void loadPayload(u32 pressed) +void loadPayload(u32 pressed, bool needToInitScreens) { const char *pattern; @@ -107,7 +107,7 @@ void loadPayload(u32 pressed) if(result == FR_OK && info.fname[0]) { - initScreens(); + if(needToInitScreens) initScreens(); u32 *const loaderAddress = (u32 *)0x24FFFF00; diff --git a/source/fs.h b/source/fs.h index 165dce9..cd36d9b 100644 --- a/source/fs.h +++ b/source/fs.h @@ -29,10 +29,10 @@ extern bool isN3DS; void mountFs(void); -u32 getFileSize(const char *path); u32 fileRead(void *dest, const char *path); +u32 getFileSize(const char *path); bool fileWrite(const void *buffer, const char *path, u32 size); void createDirectory(const char *path); void findDumpFile(const char *path, char *fileName); -void loadPayload(u32 pressed); +void loadPayload(u32 pressed, bool needToInitScreens); u32 firmRead(void *dest, u32 firmType); \ No newline at end of file diff --git a/source/start.s b/source/start.s index b135f60..6d4cb91 100644 --- a/source/start.s +++ b/source/start.s @@ -26,12 +26,19 @@ _start: b start - .word 0, 0 +.global launchedFirmTIDLow +launchedFirmTIDLow: + .hword 0, 0, 0, 0, 0, 0, 0, 0 start: @ Change the stack pointer mov sp, #0x27000000 + @ Disable interrupts + mrs r0, cpsr + orr r0, #0x1C0 + msr cpsr_cx, r0 + @ Disable caches / MPU mrc p15, 0, r0, c1, c0, 0 @ read control register bic r0, #(1<<12) @ - instruction cache disable