diff --git a/BootLoader/source/main.arm7.c b/BootLoader/source/main.arm7.c index fbb440c..ec25311 100755 --- a/BootLoader/source/main.arm7.c +++ b/BootLoader/source/main.arm7.c @@ -228,7 +228,7 @@ void arm7_startBinary (void) void arm7_main (void) { int errorCode; - + // Wait for ARM9 to at least start while (arm9_stateFlag < ARM9_START); @@ -254,7 +254,7 @@ void arm7_main (void) { } debugOutput (ERR_STS_START); - + arm7_startBinary(); return; diff --git a/Makefile b/Makefile index e2052e2..bceca1f 100755 --- a/Makefile +++ b/Makefile @@ -33,8 +33,7 @@ checkarm9: $(TARGET).nds : arm7/$(TARGET).elf arm9/$(TARGET).elf ndstool -c $(TARGET).nds -7 arm7/$(TARGET).elf -9 arm9/$(TARGET).elf \ -b $(CURDIR)/icon.bmp "Nitro Hax;DS Game Cheat Tool;Created by Chishm" \ - -g CHCT 01 "NTR NITROHAX" -z 80040000 -u 00030004 - python patch_ndsheader_dsiware.py $(CURDIR)/$(TARGET).nds --accessControl 0x00000038 + -g CHCT 01 "NTR NITROHAX" -z 80040000 -u 00030004 -a 00000038 -p 0000 #--------------------------------------------------------------------------------- # Create boot loader and link raw binary into ARM9 ELF diff --git a/arm7/source/main.c b/arm7/source/main.c index 09c9827..b508da5 100755 --- a/arm7/source/main.c +++ b/arm7/source/main.c @@ -22,41 +22,7 @@ #include #include "cheat_engine_arm7.h" - -void PowerOnSlot() { - - // Power On Slot - while(REG_SCFG_MC&0x0C != 0x0C); // wait until state<>3 - if(REG_SCFG_MC&0x0C != 0x00) return; // exit if state<>0 - - REG_SCFG_MC = 0x04; // wait 1ms, then set state=1 - while(REG_SCFG_MC&0x0C != 0x04); - - REG_SCFG_MC = 0x08; // wait 10ms, then set state=2 - while(REG_SCFG_MC&0x0C != 0x08); - - REG_ROMCTRL = 0x20000000; // wait 27ms, then set ROMCTRL=20000000h - - while(REG_ROMCTRL&0x8000000 != 0x8000000); - -} - -/* -// Not used for this project yet -void PowerOffSlot() { - while(REG_SCFG_MC&0x0C != 0x0C); // wait until state<>3 - if(REG_SCFG_MC&0x0C != 0x08) return 1; // exit if state<>2 - - REG_SCFG_MC = 0x0C; // set state=3 - while(REG_SCFG_MC&0x0C != 0x00); // wait until state=0 -} - -void TWL_ResetSlot1() { - PowerOffSlot(); - for (int i = 0; i < 30; i++) { swiWaitForVBlank(); } - PowerOnSlot(); -} -*/ +#include "resetslot.h" void VcountHandler() { inputGetAndSend(); @@ -90,6 +56,9 @@ int main(void) { irqEnable( IRQ_VBLANK | IRQ_VCOUNT); + i2cWriteRegister(0x4A, 0x12, 0x00); // Press power-button for auto-reset + i2cWriteRegister(0x4A, 0x70, 0x01); // Bootflag = Warmboot/SkipHealthSafety + // Make sure Arm9 had a chance to check slot status fifoWaitValue32(FIFO_USER_01); // If Arm9 reported slot is powered off, have Arm7 wait for Arm9 to be ready before card reset. This makes sure arm7 doesn't try card reset too early. diff --git a/arm7/source/resetslot.c b/arm7/source/resetslot.c new file mode 100644 index 0000000..447f882 --- /dev/null +++ b/arm7/source/resetslot.c @@ -0,0 +1,30 @@ +#include + +int PowerOnSlot() { + REG_SCFG_MC = 0x04; // set state=1 + while(REG_SCFG_MC&1); + + REG_SCFG_MC = 0x08; // set state=2 + while(REG_SCFG_MC&1); + + REG_ROMCTRL = 0x20000000; // set ROMCTRL=20000000h + return 0; +} + +/* Unused for now +int PowerOffSlot() { + if(REG_SCFG_MC&1) return 1; + + REG_SCFG_MC = 0x0C; // set state=3 + while(REG_SCFG_MC&1); + return 0; +} + +int TWL_ResetSlot1() { + PowerOffSlot(); + for (int i = 0; i < 30; i++) { swiWaitForVBlank(); } + PowerOnSlot(); + return 0; +} +*/ + diff --git a/arm7/source/resetslot.h b/arm7/source/resetslot.h new file mode 100644 index 0000000..601ed8b --- /dev/null +++ b/arm7/source/resetslot.h @@ -0,0 +1,18 @@ +#ifndef RESETSLOT_H +#define RESETSLOT_H + + +#ifdef __cplusplus +extern "C" { +#endif + +int PowerOnSlot(void); +int PowerOffSlot(void); +int TWL_ResetSlot1(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/arm9/source/bootsplash.c b/arm9/source/bootsplash.c index d7d3b6a..ac5afad 100644 --- a/arm9/source/bootsplash.c +++ b/arm9/source/bootsplash.c @@ -205,183 +205,183 @@ void BootSplashDS() { vramcpy_ui (&BG_PALETTE[0], Top01Pal, Top01PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot01Pal, Bot01PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top00Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top00Pal, Top00PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot00Pal, Bot00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top00Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top00Pal, Top00PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot00Pal, Bot00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot01Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top02Pal, Top02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot02Pal, Bot02PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top02Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot02Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top03Pal, Top03PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot03Pal, Bot03PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top03Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot03Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top04Pal, Top04PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot04Pal, Bot04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top04Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot04Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top05Pal, Top05PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot04Pal, Bot04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top05Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot05Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top05Pal, Top05PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot05Pal, Bot05PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } BootJingle(); swiDecompressLZSSVram ((void*)Top06Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top06Pal, Top06PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top07Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top07Pal, Top07PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top08Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top08Pal, Top08PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top09Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top09Pal, Top09PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top10Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top10Pal, Top10PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top11Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top11Pal, Top11PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top12Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top12Pal, Top12PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top13Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top13Pal, Top13PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top14Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top14Pal, Top14PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top15Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top15Pal, Top15PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top16Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top16Pal, Top16PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top17Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top17Pal, Top17PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top18Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top18Pal, Top18PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top19Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top19Pal, Top19PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top20Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top20Pal, Top20PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top21Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top21Pal, Top21PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top22Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top22Pal, Top22PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top23Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top23Pal, Top23PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top24Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top24Pal, Top24PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top25Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top25Pal, Top25PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top26Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top26Pal, Top26PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top27Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top27Pal, Top27PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top28Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top28Pal, Top28PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top29Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top29Pal, Top29PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top30Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top30Pal, Top30PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top31Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top31Pal, Top31PalLen); @@ -394,40 +394,40 @@ void BootSplashDS() { vramcpy_ui (&BG_PALETTE[0], Top32Pal, Top32PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot06Pal, Bot06PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top33Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot07Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top33Pal, Top33PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot07Pal, Bot07PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top34Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot08Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top34Pal, Top34PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot08Pal, Bot08PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top35Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot09Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top35Pal, Top35PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot09Pal, Bot09PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top36Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)Bot10Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top36Pal, Top36PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], Bot10Pal, Bot10PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)Top37Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], Top37Pal, Top37PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiWaitForVBlank(); @@ -447,35 +447,35 @@ void BootSplashDSi() { vramcpy_ui (&BG_PALETTE[0], DSi01Pal, DSi01PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi00Pal, BotDSi00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi02Pal, DSi02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi01Pal, BotDSi01PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi02Pal, DSi02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi01Pal, BotDSi01PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi01Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi02Pal, DSi02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi02Pal, BotDSi02PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi02Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi02Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi03Pal, DSi03PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi03Pal, BotDSi03PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } BootJingleDSi(); @@ -484,131 +484,131 @@ void BootSplashDSi() { vramcpy_ui (&BG_PALETTE[0], DSi03Pal, DSi03PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi03Pal, BotDSi03PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi04Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi04Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi04Pal, DSi04PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi04Pal, BotDSi04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi05Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi05Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi05Pal, DSi05PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi05Pal, BotDSi05PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi06Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi06Pal, DSi06PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi07Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi07Pal, DSi07PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi08Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi08Pal, DSi08PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi09Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi09Pal, DSi09PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi10Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi10Pal, DSi10PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi11Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi11Pal, DSi11PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi12Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi12Pal, DSi12PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi13Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi13Pal, DSi13PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi14Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi14Pal, DSi14PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi15Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi15Pal, DSi15PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi16Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi16Pal, DSi16PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi17Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi17Pal, DSi17PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi18Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi18Pal, DSi18PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi19Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi19Pal, DSi19PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi20Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi20Pal, DSi20PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi21Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi21Pal, DSi21PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi22Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi22Pal, DSi22PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi23Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi23Pal, DSi23PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi24Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi24Pal, DSi24PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi25Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi25Pal, DSi25PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi26Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi26Pal, DSi26PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi27Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi27Pal, DSi27PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi28Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi28Pal, DSi28PalLen); @@ -621,49 +621,49 @@ void BootSplashDSi() { vramcpy_ui (&BG_PALETTE[0], DSi29Pal, DSi29PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi06Pal, BotDSi06PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi30Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi07Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi30Pal, DSi30PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi07Pal, BotDSi07PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi31Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi08Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi31Pal, DSi31PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi08Pal, BotDSi08PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi32Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi09Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi32Pal, DSi32PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi09Pal, BotDSi09PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi33Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi10Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi33Pal, DSi33PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi10Pal, BotDSi10PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi34Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi11Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi34Pal, DSi34PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi11Pal, BotDSi11PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi35Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)BotDSi00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi35Pal, DSi35PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], BotDSi00Pal, BotDSi00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)DSi01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], DSi01Pal, DSi01PalLen); diff --git a/arm9/source/errorsplash.c b/arm9/source/errorsplash.c index 63ed144..c948087 100644 --- a/arm9/source/errorsplash.c +++ b/arm9/source/errorsplash.c @@ -46,42 +46,42 @@ void FadeFX() { - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade00Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade00Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade00Pal, fade00PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade00Pal, fade00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade01Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade01Pal, fade01PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade01Pal, fade01PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade02Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade02Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade02Pal, fade02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade02Pal, fade02PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade03Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade03Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade03Pal, fade03PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade03Pal, fade03PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade04Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade04Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade04Pal, fade04PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade04Pal, fade04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } } void ErrorNoCard() { @@ -93,28 +93,28 @@ void ErrorNoCard() { vramcpy_ui (&BG_PALETTE[0], toperror2_00Pal, toperror2_00PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror00Pal, suberror00PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)toperror2_01Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)suberror01Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], toperror2_01Pal, toperror2_01PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror01Pal, suberror01PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)toperror2_02Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)suberror02Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], toperror2_02Pal, toperror2_02PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror02Pal, suberror02PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)toperror2_03Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)suberror03Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], toperror2_03Pal, toperror2_03PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror03Pal, suberror03PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } // Wait for input, then fade out do { swiWaitForVBlank(); scanKeys(); } while (!keysDown()); @@ -124,7 +124,7 @@ void ErrorNoCard() { vramcpy_ui (&BG_PALETTE[0], toperror2_04Pal, toperror2_04PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror04Pal, suberror04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)toperror2_05Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)suberror05Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); @@ -136,13 +136,13 @@ void ErrorNoCard() { vramcpy_ui (&BG_PALETTE[0], toperror2_06Pal, toperror2_06PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], suberror06Pal, suberror06PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } swiDecompressLZSSVram ((void*)fade04Tiles, (void*)CHAR_BASE_BLOCK(2), 0, &decompressBiosCallback); swiDecompressLZSSVram ((void*)fade04Tiles, (void*)CHAR_BASE_BLOCK_SUB(2), 0, &decompressBiosCallback); vramcpy_ui (&BG_PALETTE[0], fade04Pal, fade04PalLen); vramcpy_ui (&BG_PALETTE_SUB[0], fade04Pal, fade04PalLen); - for (int i = 0; i < 2; i++) { swiWaitForVBlank(); } + for (int i = 0; i < 3; i++) { swiWaitForVBlank(); } } diff --git a/arm9/source/nds_card.c b/arm9/source/nds_card.c index 1171b36..bf21207 100755 --- a/arm9/source/nds_card.c +++ b/arm9/source/nds_card.c @@ -30,3 +30,4 @@ void getHeader (u32* ndsHeader) { ndsHeader, 512); } + diff --git a/patch_ndsheader_dsiware.py b/patch_ndsheader_dsiware.py deleted file mode 100644 index bd2ccd1..0000000 --- a/patch_ndsheader_dsiware.py +++ /dev/null @@ -1,463 +0,0 @@ -# -*- coding: utf8 -*- -# Patch an .nds (works with homebrew and ds demo only) to make it ready for make_cia -# -# 2016-02-28, Ahezard -# -# inspired by -# Apache Thunder .nds edited files and comments -# https://github.com/Relys/Project_CTR/blob/master/makerom/srl.h -# https://dsibrew.org/wiki/DSi_Cartridge_Header -# if the header size of the input nds file is 0x200 (homebrew) -# the header size of the output nds file will be patched to 0x4000 (normal ds/dsi header), 0x3E00 offset - -from struct import * -from collections import namedtuple -from collections import OrderedDict -from pprint import pprint -import os, sys -import binascii -import argparse - - -parser = argparse.ArgumentParser(description='Patch an nds in order to be ready cia conversion via make_cia --srl=.') -parser.add_argument('file', metavar='file.nds', type=file, help='nds file to patch') -parser.add_argument('--verbose', help='verbose mode', action="store_true") -parser.add_argument('--out', help='output file [optionnal]') -parser.add_argument('--read', help='print only the header content, do not patch', action="store_true") -parser.add_argument('--extract', help='extract the content of the rom : header.bin,arm9.bin,arm7.bin,icon.bin,arm9i.bin,arm7i.bin, do not patch', action="store_true") #Not yet implemented -parser.add_argument('--title', help='Game title') -parser.add_argument('--code', help='Game code') -parser.add_argument('--maker', help='Maker code') -parser.add_argument('--mode', help='target mode, default mode is ds [ds|dsi|dsinogba|nitrohax]') -parser.add_argument('--arm9', type=file, help='swap the ds arm9 binary by the one provided') -parser.add_argument('--arm7', type=file, help='swap the ds arm7 binary by the one provided') -parser.add_argument('--arm9EntryAddress', help='arm9 ram address of the binary provided') -parser.add_argument('--arm7EntryAddress', help='arm7 ram address of the binary provided') -parser.add_argument('--arm9i', type=file, help='add a dsi arm9i binary to the file, not needed for homebrew so far') -parser.add_argument('--arm7i', type=file, help='add a dsi arm7i binary to the file, not needed for homebrew so far') -parser.add_argument('--accessControl', help='access control field') -args = parser.parse_args() - -if args.mode is None: - args.mode = "dsi" - -# -# CRC16 MODULE -# -# includes CRC16 and CRC16 MODBUS -# - -from ctypes import c_ushort - -# from https://github.com/cristianav/PyCRC/blob/master/demo.py -class CRC16(object): - crc16_tab = [] - - # The CRC's are computed using polynomials. Here is the most used - # coefficient for CRC16 - crc16_constant = 0xA001 # 40961 - - def __init__(self, modbus_flag=False): - # initialize the precalculated tables - if not len(self.crc16_tab): - self.init_crc16() - self.mdflag = bool(modbus_flag) - - def calculate(self, input_data=None): - try: - is_string = isinstance(input_data, str) - is_bytes = isinstance(input_data, (bytes, bytearray)) - - if not is_string and not is_bytes: - raise Exception("Please provide a string or a byte sequence " - "as argument for calculation.") - - crc_value = 0x0000 if not self.mdflag else 0xffff - - for c in input_data: - d = ord(c) if is_string else c - tmp = crc_value ^ d - rotated = crc_value >> 8 - crc_value = rotated ^ self.crc16_tab[(tmp & 0x00ff)] - - return crc_value - except Exception as e: - print("EXCEPTION(calculate): {}".format(e)) - - def init_crc16(self): - """The algorithm uses tables with precalculated values""" - for i in range(0, 256): - crc = c_ushort(i).value - for j in range(0, 8): - if crc & 0x0001: - crc = c_ushort(crc >> 1).value ^ self.crc16_constant - else: - crc = c_ushort(crc >> 1).value - self.crc16_tab.append(crc) - -def getSize(fileobject): - current = fileobject.tell() - fileobject.seek(0,2) # move the cursor to the end of the file - size = fileobject.tell() - fileobject.seek(current,0) - return size - -def skipUntilAddress(f_in,f_out, caddr, taddr): - chunk = f_in.read(taddr-caddr) - f_out.write(chunk) - -def writeBlankuntilAddress(f_out, caddr, taddr): - f_out.write("\x00"*(taddr-caddr)) - -fname=args.file.name -args.file.close() - -if not args.read: - print "Patching file : "+fname -else: - print "Reading header of file : "+fname - -#offset of 0x4600 created - -# File size compute -file = open(fname, 'rb') -fsize=getSize(file) -file.close() - -#CRC header compute "CRC-16 (Modbus)" -file = open(fname, 'rb') -#0x15E from https://github.com/devkitPro/ndstool/ ... source/header.cpp -hdr = file.read(0x15E) -hdrCrc=CRC16(modbus_flag=True).calculate(hdr) -if args.verbose: - print("{:10s} {:20X}".format('HDR CRC-16 ModBus', hdrCrc)) -#print "origin header cr c"+hdr[0x15E:0x15F] -#filew = open(fname+".hdr", "wb") -#filew.write(hdr); -#filew.close() -file.close() - -if args.arm9 is not None: - arm9Fname=args.arm9.name - args.arm9.close() - arm9File = open(arm9Fname, 'rb') - arm9FileSize=getSize(arm9File) - dataArm9=arm9File.read(arm9FileSize) - arm9File.close() - -if args.arm7 is not None: - arm7Fname=args.arm7.name - args.arm7.close() - arm7File = open(arm7Fname, 'rb') - arm7FileSize=getSize(arm7File) - dataArm7=arm7File.read(arm7FileSize) - arm7File.close() - -filer = open(fname, 'rb') -data = filer.read(0x180) -caddr=0x180 - -#DS Data 180 bytes -SrlHeader = namedtuple('SrlHeader', - "gameTitle " - "gameCode " - "makerCode " - "unitCode " - "encryptionSeedSelect " - "deviceCapacity " - "reserved0 " - "dsiflags " - "romVersion " - "internalFlag " - "arm9RomOffset " - "arm9EntryAddress " - "arm9RamAddress " - "arm9Size " - "arm7RomOffset " - "arm7EntryAddress " - "arm7RamAddress " - "arm7Size " - "fntOffset " - "fntSize " - "fatOffset " - "fatSize " - "arm9OverlayOffset " - "arm9OverlaySize " - "arm7OverlayOffset " - "arm7OverlaySize " - "normalCardControlRegSettings " - "secureCardControlRegSettings " - "icon_bannerOffset " - "secureAreaCrc " - "secure_transfer_timeout " - "arm9Autoload " - "arm7Autoload " - "secureDisable " - "ntrRomSize " - "headerSize " - "reserved1 " - "nintendoLogo " - "nintendoLogoCrc " - "headerCrc " - "debugReserved ") -srlHeaderFormat='<12s4s2scbb7s2sbcIIIIIIIIIIIIIIIIIIIHHII8sII56s156s2sH32s' -srlHeader=SrlHeader._make(unpack_from(srlHeaderFormat, data)) -if args.verbose: - print "origin header crc "+hex(srlHeader.headerCrc) - print "origin secure crc "+hex(srlHeader.secureAreaCrc) - -#SecureArea CRC compute "CRC-16 (Modbus)" -file = open(fname, 'rb') -#0x15E from https://github.com/devkitPro/ndstool/ ... source/header.cpp -file.read(0x200) -sec = file.read(0x4000) -secCrc=CRC16(modbus_flag=True).calculate(sec) -if args.verbose: - print("{:10s} {:20X}".format('SEC CRC-16 ModBus', secCrc)) -file.close() - -if srlHeader.arm7EntryAddress>0x2400000 and not args.read and args.arm7 is None: - print "WARNING: .nds arm7EntryAddress greater than 0x2400000 will not boot as cia" - print "you need to recompile or swap the arm7 binary with a precompiled one with --arm7 and --arm7EntryAddress" - -if "dsi" in args.mode : - srlHeaderPatched=srlHeader._replace( - dsiflags= '\x01\x00', #disable modcrypt but enable twl - unitCode= '\x03', - ) - -data1=pack(*[srlHeaderFormat]+srlHeaderPatched._asdict().values()) -newHdrCrc=CRC16(modbus_flag=True).calculate(data1[0:0x15E]) -srlHeaderPatched=srlHeaderPatched._replace(headerCrc=newHdrCrc) - -if args.verbose: - print "new header crc "+hex(newHdrCrc) -if not args.read : - if args.verbose: - pprint(dict(srlHeaderPatched._asdict())) -else: - pprint(dict(srlHeader._asdict())) - -data1=pack(*[srlHeaderFormat]+srlHeaderPatched._asdict().values()) - -arm9isize=0 -arm7isize=0 - -#TWL Only Data 384 bytes -SrlTwlExtHeader = namedtuple('SrlTwlExtHeader', - "MBK_1_5_Settings " - "MBK_6_8_Settings_ARM9 " - "MBK_6_8_Settings_ARM7 " - "global_MBK_9_Setting " - "regionFlags " - "accessControl " - "arm7ScfgExtMask " - "reserved_flags " - "arm9iRomOffset " - "reserved2 " - "arm9iLoadAddress " - "arm9iSize " - "arm7iRomOffset " - "struct_param_baseAddress " - "arm7iLoadAddress " - "arm7iSize " - "digest_ntrRegionOffset " - "digest_ntrRegionSize " - "digest_twlRegionOffset " - "digest_twlRegionSize " - "digestSectorHashtableOffset " - "digestSectorHashtableSize " - "digest_blockHashtableOffset " - "digest_blockHashtableSize " - "digestSectorSize " - "digest_blockSectorcount " - "iconSize " #usually 0x23C0 or 2112 in homebrew - "unknown1 " - "twlRomSize " - "unknown2 " - "modcryptArea1Offset " - "modcryptArea1Size " - "modcryptArea2Offset " - "modcryptArea2Size " - "title_id " - "pubSaveDataSize " - "privSaveDataSize " - "reserved4 " - "parentalControl ") -srlTwlExtHeaderFormat="<20s12s12s4s4sIIII4sIIIIIIIIIIIIIIIII4sI12sIIII8sII176s16s" -if srlHeader.headerSize<0x300: - #homebrew - srlTwlExtHeader=SrlTwlExtHeader._make(unpack_from(srlTwlExtHeaderFormat, "\x00" * (0x300-0x180))) -else: - data = filer.read(0x300-0x180) - srlTwlExtHeader=SrlTwlExtHeader._make(unpack_from(srlTwlExtHeaderFormat, data)) - caddr=0x300 - -#pprint(dict(srlTwlExtHeader._asdict())) - -if not args.read: - # Fix srlTwlExtHeader - if "dsi" in args.mode: - arm7iRomOffset=srlHeaderPatched.arm7RomOffset - arm9iRomOffset=srlHeaderPatched.arm9RomOffset - arm7isize=srlHeaderPatched.arm7Size - arm9isize=srlHeaderPatched.arm9Size - totaldsisize=0 - arm7iname = None - arm9iname = None - - if args.arm9i is not None: - arm9iname = args.arm9i.name - arm9isize = getSize(args.arm9i) - arm9iRomOffset=srlHeaderPatched.ntrRomSize - if args.verbose: - print "arm9isize : "+hex(arm9isize) - print "arm9ioffset : "+hex(srlHeaderPatched.ntrRomSize) - args.arm9i.close() - totaldsisize=arm9isize - - if args.arm7i is not None: - arm7iname = args.arm7i.name - arm7isize = getSize(args.arm7i) - arm7iRomOffset=srlHeaderPatched.ntrRomSize+arm9isize - if args.verbose: - print "arm7isize : "+hex(arm7isize) - print "arm9ioffset : "+hex(srlHeaderPatched.ntrRomSize+arm9isize) - args.arm7i.close() - totaldsisize=arm9isize+arm7isize - - - - srlTwlExtHeader=srlTwlExtHeader._replace( - accessControl= 0x00000138, - arm7ScfgExtMask= 0x80040000, - reserved_flags= 0x00000000 - ) - - if args.accessControl is not None: - srlTwlExtHeader=srlTwlExtHeader._replace( - accessControl= int(args.accessControl,0), - ) - -if args.verbose or args.read: - pprint(dict(srlTwlExtHeader._asdict())) - -data2=pack(*[srlTwlExtHeaderFormat]+srlTwlExtHeader._asdict().values()) - -#TWL and Signed NTR 3328 bytes -SrlSignedHeader = namedtuple('SrlSignedHeader', - "arm9WithSecAreaSha1Hmac " - "arm7Sha1Hmac " - "digestMasterSha1Hmac " - "bannerSha1Hmac " - "arm9iSha1Hmac " - "arm7iSha1Hmac " - "reserved5 " - "arm9Sha1Hmac " - "reserved6 " - "reserved7 " - "signature " - ) -srlSignedHeaderFormat="<20s20s20s20s20s20s40s20s2636s384s128s" -if srlHeader.headerSize<0x1100: - #homebrew - srlSignedHeader=SrlSignedHeader._make(unpack_from(srlSignedHeaderFormat, "\x00" * (3328))) -else: - data = filer.read(3328) - srlSignedHeader=SrlSignedHeader._make(unpack_from(srlSignedHeaderFormat, data)) - caddr=0x300+3328 - filer.read(0x4000-caddr) - caddr=0x4000 - -#pprint(dict(srlSignedHeader._asdict())) - -# Fix srlSignedHeader -if not args.read: - srlSignedHeader=srlSignedHeader._replace( - arm7Sha1Hmac= '\xff'*20, - arm9WithSecAreaSha1Hmac= '\xff'*20, - bannerSha1Hmac= '\xff'*20, - signature= '\xff'*128 - ) - if "dsi" in args.mode : - srlSignedHeader=srlSignedHeader._replace( - arm7Sha1Hmac= '\xff'*20, - arm7iSha1Hmac= '\xff'*20, - arm9Sha1Hmac= '\xff'*20, - arm9WithSecAreaSha1Hmac= '\xff'*20, - arm9iSha1Hmac= '\xff'*20, - bannerSha1Hmac= '\xff'*20, - digestMasterSha1Hmac= '\xff'*20, - signature= '\xff'*128 - ) -if args.verbose or args.read: - pprint(dict(srlSignedHeader._asdict())) - -data3=pack(*[srlSignedHeaderFormat]+srlSignedHeader._asdict().values()) - -# ARM9 footer -# from https://github.com/devkitPro/ndstool/ ... source/header.cpp -# ARM9 footer size = 3*4 -ARM9Footer = namedtuple('ARM9Footer', - "nitrocode " #0xDEC00621 - "versionInfo " - "reserved " - ) -ARM9FooterFormat="