From fd9112d12056931373bb23aeb8d12f59670b9a33 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Tue, 27 Nov 2007 13:06:08 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=AB=E3=83=BC=E3=83=89=E3=83=AC?= =?UTF-8?q?=E3=82=B8=E3=82=B9=E3=82=BF=E3=81=AE=E3=82=B9=E3=83=AF=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=81=A8=E3=82=AB=E3=83=BC=E3=83=89ID=E3=81=AE?= =?UTF-8?q?=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0=E9=A0=98=E5=9F=9F=E3=81=B8?= =?UTF-8?q?=E3=81=AE=E3=82=BB=E3=83=83=E3=83=88=E3=82=92=E3=80=81=E3=82=AB?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=83=96=E3=83=BC=E3=83=88=E3=81=AE=E6=99=82?= =?UTF-8?q?=20=E3=80=80=E3=81=AE=E3=81=BF=E8=A1=8C=E3=81=86=E3=82=88?= =?UTF-8?q?=E3=81=86=E4=BF=AE=E6=AD=A3=E3=80=82=20=E3=83=BB=E3=82=A2?= =?UTF-8?q?=E3=83=97=E3=83=AA=E3=83=96=E3=83=BC=E3=83=88=E6=99=82=E3=81=AE?= =?UTF-8?q?=E3=83=9E=E3=82=A6=E3=83=B3=E3=83=88=E6=83=85=E5=A0=B1=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=B8=E3=81=AE=E5=AF=BE=E5=BF=9C=E3=80=82=20?= =?UTF-8?q?=E3=80=80=E3=83=BB=E3=83=A9=E3=83=B3=E3=83=81=E3=83=A3=E3=83=BC?= =?UTF-8?q?=E3=81=AF=E3=80=81=E8=87=AA=E8=BA=AB=E3=81=AE=E8=B5=B7=E5=8B=95?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=83=9E=E3=82=A6=E3=83=B3=E3=83=88=E6=83=85?= =?UTF-8?q?=E5=A0=B1=E3=82=92=E8=87=AA=E5=88=86=E3=81=A7=E3=82=BB=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=80=82=20=E3=80=80=E3=83=BB=E6=9A=AB=E5=AE=9A?= =?UTF-8?q?=E5=AF=BE=E7=AD=96=EF=BC=9A=E5=85=A8=E3=83=89=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=82=92RW=E5=8F=AF=E8=83=BD=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B=E3=80=82=20=E3=80=80=E3=83=BB?= =?UTF-8?q?=E6=9A=AB=E5=AE=9A=E5=AF=BE=E7=AD=96=EF=BC=9AFS=E4=B8=8D?= =?UTF-8?q?=E5=85=B7=E5=90=88=E5=9B=9E=E9=81=BF=E3=81=AE=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=80=81"nand:"=E3=82=92'F'=E3=83=89=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=96=E3=81=AB=E8=A8=AD=E5=AE=9A=E3=80=82=20=E3=80=80?= =?UTF-8?q?=E3=83=BBMachineSettings=E3=81=A8PictoChat=E3=81=A7=E3=81=AEnan?= =?UTF-8?q?d=5Fapp=5Fhack.h=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=9FFS?= =?UTF-8?q?=E3=81=AE=E6=9A=AB=E5=AE=9A=20=E3=80=80=E3=80=80NAND=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E3=82=92=E5=89=8A=E9=99=A4=E3=80=82=20=E3=80=80?= =?UTF-8?q?=E3=80=80=E3=81=93=E3=82=8C=E3=81=AB=E4=BC=B4=E3=81=84=E3=80=81?= =?UTF-8?q?nand=5Fapp=5Fhack.h=E3=82=82=E5=89=8A=E9=99=A4=E3=80=82=20?= =?UTF-8?q?=E3=83=BBNAND=E3=82=A2=E3=83=97=E3=83=AA=E8=AA=AD=E3=81=BF?= =?UTF-8?q?=E8=BE=BC=E3=81=BF=E6=99=82=E3=81=AE=E3=83=AA=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@272 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 45 +++-- .../libraries_sysmenu/boot/ARM9/src/bootAPI.c | 22 ++- .../sysmenu/ARM9/src/mountInfo.c | 183 ++++++++++++++---- .../sysmenu/ARM9/src/sysmenu_lib.c | 49 ++--- .../MachineSettings/ARM9/src/main.c | 7 - .../systemMenu_RED/PictoChat/ARM9/src/main.c | 7 - doc/NANDフラッシュマップ&フォルダツリー.vsd | Bin 312320 -> 312320 bytes include/nand_app_hack.h | 63 ------ .../sysmenu/sysmenu_lib/common/sysmenu_work.h | 7 +- 9 files changed, 209 insertions(+), 174 deletions(-) delete mode 100644 include/nand_app_hack.h diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index f71fc659..c16893fd 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -44,23 +44,6 @@ void BOOT_Init( void ) BOOL BOOT_WaitStart( void ) { if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) { - // NAXg̐ݒ - static u32 clr_list[] = - { - SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR, - SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR, - SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR, - SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR, -#ifdef ISDBG_MB_CHILD_ - HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600), - HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20), -#endif - HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED, - HW_ARENA_INFO_BUF, HW_ROM_HEADER_BUF - HW_ARENA_INFO_BUF, - HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SYSTEM_END - HW_PXI_SIGNAL_PARAM_ARM9, - NULL - }; - (void)OS_DisableIrq(); // Ŋ荞݋֎~ɂȂƃ_B (void)OS_SetIrqMask(0); // SDKo[W̃T[`ɎԂƁAARM9HALTɂĂ܂AARM7̃TEhXbhARM9FIFOŃf[^M悤ƂĂFIFOtőMłȂԂŖ[vɓĂ܂B /* @@ -77,7 +60,25 @@ BOOL BOOT_WaitStart( void ) reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9ɑ΂ău[g悤IRQŗv{ARM7̃Xe[gPɂB // SDKʃu[g - OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), clr_list ); + { + // NAXg̐ݒ + static u32 clr_list[] = + { + SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR, + SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR, + SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR, + SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR, +#ifdef ISDBG_MB_CHILD_ + HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600), + HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20), +#endif + HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED, + HW_ARENA_INFO_BUF, HW_ROM_HEADER_BUF - HW_ARENA_INFO_BUF, + HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SYSTEM_END - HW_PXI_SIGNAL_PARAM_ARM9, + NULL + }; + OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), clr_list ); + } } return FALSE; } @@ -90,11 +91,13 @@ static void BOOTi_ClearREG_RAM( void ) MI_StopDma( (u16)i ); } + if( SYSMi_GetWork()->isCardBoot ) { #ifdef DEBUG_USED_CARD_SLOT_B_ - reg_MI_MC_SWP = 0x80; // J[hXbg̃Xbv + reg_MI_MC_SWP = 0x80; // J[hXbg̃Xbv #endif - *(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // J[h`FbNobt@ɃJ[hIDZbg - *(u32 *)HW_RED_RESERVED = SYSMi_GetWork()->nCardID; + *(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // J[h`FbNobt@ɃJ[hIDZbg + *(u32 *)HW_RED_RESERVED = SYSMi_GetWork()->nCardID; + } // WX^̃NA SVC_CpuClearFast( 0x0000, (void*)(HW_REG_BASE + 0x0b0), (0x13c - 0x0b0) ); diff --git a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c index 75b9ba66..51680990 100644 --- a/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM9/src/bootAPI.c @@ -54,14 +54,6 @@ static void ie_subphandler( void ) // u[gāAARM7̒ʒm҂B void BOOT_Ready( void ) { - // NAXg̐ݒ - static u32 clr_list[] = - { - HW_ITCM, HW_ITCM_SIZE, - //HW_DTCM, HW_DTCM_SIZE, - NULL - }; - int i; // GgAhX̐`FbNAȏꍇ͖[vɓB @@ -98,8 +90,20 @@ void BOOT_Ready( void ) reg_GX_VRAMCNT_WRAM = pWRAMREGS->main_wrambnk_01; } + // ROMwb_obt@Rs[ + MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + // SDKʃu[g - OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list ); + { + // NAXg̐ݒ + static u32 clr_list[] = + { + HW_ITCM, HW_ITCM_SIZE, + //HW_DTCM, HW_DTCM_SIZE, + NULL + }; + OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list ); + } } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c index b7bc7a44..a664b069 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c @@ -27,29 +27,54 @@ // extern data----------------------------------------------------------------- // function's prototype-------------------------------------------------------- -void SYSM_SetBootSRLPath( NAMTitleId titleID ); -void SYSM_SetMountInfo( NAMTitleId titleID ); +void SYSMi_SetLauncherMountInfo( void ); +void SYSM_SetBootAppMountInfo( NAMTitleId titleID ); static void SYSMi_ModifySaveDataMount( NAMTitleId titleID ); // global variable------------------------------------------------------------- // static variable------------------------------------------------------------- +static void SYSMi_SetBootSRLPath( NAMTitleId titleID ); +static void SYSMi_SetMountInfoCore( const OSMountInfo *pSrc ); // const data------------------------------------------------------------------ +/* + + ݁ASDKFATFSoÔ߁Aˊт"nand:""F:"hCuɂĂB + iNAND2KB[h΍􂪁A"F"hCû݂ł̑ΉɂȂĂ邽߁Bj + +*/ + + // ftHg}Eg񃊃Xg OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = { // drive device target pertitionIdx resource userPermission rsvA B archive path { 'A', OS_MOUNT_DEVICE_SD, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "sdmc", "/" }, - { 'B', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, 0, 0, 0, "nand", "/" }, // [U[͂̃A[JCugȂ(RWs) - { 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, 0, 0, 0, "nand2", "/" }, // [U[͂̃A[JCugȂ(RWs) +// { 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R), 0, 0, "nand", "/" }, // [U[͂̃A[JCułWrites +// { 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R), 0, 0, "nand2", "/" }, // [U[͂̃A[JCułWrites + { 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" }, // [U[͂̃A[JCułWrites + { 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand2", "/" }, // [U[͂̃A[JCułWrites { 'D', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "shared2", "nand2:/shared2" }, { 'E', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "photo", "nand2:/photo" }, - { 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL }, - { 'G', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL }, + { 'G', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL }, + { 'H', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL }, }; +// `[}Eg +const OSMountInfo s_launcherMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = { +// drive device target pertitionIdx resource userPermission rsvA B archive path + { 'A', OS_MOUNT_DEVICE_SD, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "sdmc", "/" }, + { 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" }, // `[͂ANZX + { 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand2", "/" }, // + { 'D', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "shared2", "nand2:/shared2" }, + { 'E', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "photo", "nand2:/photo" }, + { 0, OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL }, + { 0, OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL }, +}; + + // ============================================================================ // @@ -57,53 +82,76 @@ OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = { // // ============================================================================ -// NSRLpXVXëɃZbg -void SYSM_SetBootSRLPath( NAMTitleId titleID ) +// `[̃}EgZbg +void SYSMi_SetLauncherMountInfo( void ) { - char path[ FS_FILE_NAME_MAX ]; - - // ^CgID"0"̎́AROMƔfiDS_E[hvC͖̎̋BBBj - if( titleID ) { - NAM_GetTitleBootContentPath( path, titleID ); - }else { - STD_StrCpy( path, (const char*)"rom:" ); - } - - STD_CopyLStringZeroFill( (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, path, OS_MOUNT_PATH_LEN ); - OS_TPrintf( "boot path : %s\n", (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF ); + // Ƃ肠gROMu[gŁBiŏCj +// SYSMi_SetBootSRLPath( 0 ); // SDK2623ł́ABootSRLPath"rom:"ƂFSi_InitRomArchiveNANDAvăANZXOŗB + SYSMi_SetMountInfoCore( &s_launcherMountList[0] ); } // VXëɁAu[gAṽ}Ego^ -void SYSM_SetMountInfo( NAMTitleId titleID ) +void SYSM_SetBootAppMountInfo( NAMTitleId titleID ) { - // }Eg̐ - SYSMi_ModifySaveDataMount( titleID ); // Z[uf[^ - // SD͑SAvŗǂH - // PHOTO͑SAvɉŗǂH + SYSMi_SetBootSRLPath( titleID ); // NAvSRLpXZbg + SYSMi_ModifySaveDataMount( titleID ); // Z[uf[^Lɂ}Eg̕ҏW + /* + @Ӂ@ + MountInfóAFSŒڎQƂăANZXԂ𔻒肵Ă邽߁AɃAvp̃f[^ZbgƁA + ̌̓p[~bV̓sFSCuFSgpESNAMCuSgpłȂȂBip[~bVdlɂ‚Ă͕ύX”\j + āAFSCugp鏈́A{̑OɊĂKvB + */ + SYSMi_SetMountInfoCore( (const OSMountInfo *)&s_defaultMountList[0] ); // }Eg̃Zbg +} + + +// NSRLpXVXëɃZbg +static void SYSMi_SetBootSRLPath( NAMTitleId titleID ) +{ + static char path[ FS_FILE_NAME_MAX ]; - // }EgVXëɏ - { - OSMountInfo *pSrc = s_defaultMountList; - OSMountInfo *pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF; - int i; - for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) { - if( pSrc->drive[ 0 ] ) { - MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) ); - pDst++; - } - pSrc++; + MI_CpuClear8( path, FS_FILE_NAME_MAX ); + + // ^CgID"0"̎́AROMƔfiDS_E[hvC͖̎̋BBBj + if( titleID ) { + if( NAM_GetTitleBootContentPath( path, titleID ) != NAM_OK ) { + OS_TPrintf( "ERROR: BootContentPath Get failed.\n" ); } -#if 0 - pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF; - for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) { - OS_TPrintf( "mount path : %s\n", pDst->path ); + }else { +// STD_StrCpy( path, (const char*)"rom:" ); // SDK2623ł́ABootSRLPath"rom:"ƂFSi_InitRomArchiveNANDAvăANZXOŗB + } + + STD_CopyLStringZeroFill( (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, path, OS_MOUNT_PATH_LEN ); +// OS_TPrintf( "boot path : %s\n", (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF ); // OS_InitOŌĂ΂̂ŁAPrintfłȂB +} + + +// }EgVXëɏ +static void SYSMi_SetMountInfoCore( const OSMountInfo *pSrc ) +{ + OSMountInfo *pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF; + int i; + + MI_CpuClearFast( (void *)HW_TWL_FS_MOUNT_INFO_BUF, HW_TWL_FS_BOOT_SRL_PATH_BUF - HW_TWL_FS_MOUNT_INFO_BUF ); + + for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) { + if( pSrc->drive[ 0 ] ) { + MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) ); pDst++; } -#endif + pSrc++; } +#if 0 + pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF; + for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) { + OS_TPrintf( "mount path : %s\n", pDst->path ); + pDst++; + } +#endif } + // ^CgIDƂɃZ[uf[^L𔻒肵āA}EgҏWB static void SYSMi_ModifySaveDataMount( NAMTitleId titleID ) { @@ -116,13 +164,13 @@ static void SYSMi_ModifySaveDataMount( NAMTitleId titleID ) // Z[uf[^̃t@CpX擾 NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID ); - // ʂɃ}EgҏWB for( i = 0; i < 2; i++ ) { FSFile file[1]; FS_InitFile( file ); // ݂́AZ[ut@CJ邩ǂŃZ[ut@CLmFB // ŏIIɂTMDROMwb_̒lQƁBROMwb_̕ȒPőH + if( FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) { FS_CloseFile( file ); STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN ); @@ -138,3 +186,56 @@ static void SYSMi_ModifySaveDataMount( NAMTitleId titleID ) } } } + + +/* +static void SYSMi_ModifySaveDataMount2( NAMTitleId titleID, ROM_Header_Short *pROMH ) +{ + int i; + OSMountInfo *pMountTgt = &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ]; + u32 *pROMHSaveDataSize = &pROMH->public_save_data_size; + + if( titleID ) { + // ^CgIDw肳ĂNANDAv̏ꍇ́AZ[uf[^L𔻒肵āApXZbg + char saveFilePath[ 2 ][ FS_FILE_NAME_MAX ]; + + // Z[uf[^̃t@CpX擾 + NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID ); + + // ʂɃ}EgҏWB + for( i = 0; i < 2; i++ ) { + BOOL isFind = FALSE; + // ROMwb_ɃZ[uf[^TCY̋LڂȂ + if( *pROMHSaveDataSize++ ) { + FSFile file[1]; + FS_InitFile( file ); + // Z[ut@CJȂOKB + if( FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) { + FS_CloseFile( file ); + isFind = TRUE; + } + // `[ŃZ[uf[^t@C̃Jo܂łH +#if 0 + else if( FS_CreateFile( saveFilePath[ i ], FS_PERMIT_R | FS_PERMIT_W ) && + FS_SetFileLength( file, *pROMHSaveDataSize ) ) { + FS_CloseFile( file ); + isFind = TRUE; + } +#endif + } + + if( isFind ) { + STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN ); + }else { + pMountTgt->drive[ 0 ] = 0; + } + pMountTgt++; + } + }else { + // ^CgIDwȂ̃J[hAv̏ꍇ́AZ[uf[^ + for( i = 0; i < 2; i++ ) { + pMountTgt->drive[ 0 ] = 0; + } + } +} +*/ diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 19aed91a..7b209957 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -21,6 +21,7 @@ #include "spi.h" // define data----------------------------------------------------------------- +#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 ) typedef struct BannerCheckParam { u8 *pSrc; @@ -28,8 +29,8 @@ typedef struct BannerCheckParam { }BannerCheckParam; // extern data----------------------------------------------------------------- -extern void SYSM_SetMountInfo( NAMTitleId titleID ); // }Eg̃Zbg -extern void SYSM_SetBootSRLPath( NAMTitleId titleID ); // SRLNpX̃Zbg +extern void SYSMi_SetLauncherMountInfo( void ); +extern void SYSM_SetBootAppMountInfo( NAMTitleId titleID ); // }Eg̃Zbg // function's prototype------------------------------------------------------- static TitleProperty *SYSMi_CheckShortcutBoot( void ); @@ -141,6 +142,9 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) ) pSysm = SYSMi_GetWork(); #endif /* SYSM_DEBUG_ */ + // `[̃}EgZbg + SYSMi_SetLauncherMountInfo(); + // ARM7R|[lgpveNVjbg̈ύX OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB ); @@ -307,10 +311,10 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ) // oi[f[^̃[h if( SYSM_GetCardRomHeader()->banner_offset && - SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ 0 ] ) ) { - pTitleList_Card->pBanner = &s_bannerBuf[ 0 ]; + SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ) ) { + pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ]; }else { - MI_CpuClearFast( &s_bannerBuf[ 0 ], sizeof(TWLBannerFile) ); + MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) ); } } @@ -363,9 +367,13 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) int l; int gotten; NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; - gotten = NAM_GetTitleList( &titleIdArray[ 1 ], LAUNCHER_TITLE_LIST_NUM - 1 ) + 1; - for(l=1;l LAUNCHER_TITLE_LIST_NUM ) { + OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM ); + } + gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 ); + + for(l=0;lisLoadSucceeded = TRUE; } + + if( pBootTitle->flags.media == TITLE_MEDIA_CARD ) { + SYSMi_GetWork()->isCardBoot = TRUE; + } } @@ -739,8 +743,7 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) // }Eg̓o^ - SYSM_SetMountInfo ( pBootTitle->titleID ); - SYSM_SetBootSRLPath( pBootTitle->titleID ); + SYSM_SetBootAppMountInfo ( pBootTitle->titleID ); BOOT_Ready(); // never return. diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c index 22e2a44b..c99dd6b4 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -18,7 +18,6 @@ #include #include "misc.h" #include "MachineSetting.h" -#include "nand_app_hack.h" // extern data----------------------------------------------------------------- @@ -79,12 +78,6 @@ void TwlMain(void) SYSM_CaribrateTP(); } - { - // t@CVXe؂ւ}u -// FS_IdentifyTitle(0x4d534554);//MSET - FS_IdentifyTitle(0x5445534d);//TESM makerom.TWL̃oOŋtɂȂĂB - } - InitBG(); GetAndDrawRTCData( &g_rtcDraw, TRUE ); MachineSettingInit(); diff --git a/build/systemMenu_RED/PictoChat/ARM9/src/main.c b/build/systemMenu_RED/PictoChat/ARM9/src/main.c index 953bdbf4..837e94d0 100644 --- a/build/systemMenu_RED/PictoChat/ARM9/src/main.c +++ b/build/systemMenu_RED/PictoChat/ARM9/src/main.c @@ -18,7 +18,6 @@ #include #include "misc.h" #include "PictoChat.h" -#include "nand_app_hack.h" // extern data----------------------------------------------------------------- @@ -61,12 +60,6 @@ void TwlMain(void) // VXȅ------------------ InitAllocator(); - { - // t@CVXe؂ւ}u -// FS_IdentifyTitle(0x50434854);//PCHT - FS_IdentifyTitle(0x54484350);//THCP makerom.TWL̃oOŋtɂȂĂB - } - InitBG(); PictoChatInit(); // C[v---------------------------- diff --git a/doc/NANDフラッシュマップ&フォルダツリー.vsd b/doc/NANDフラッシュマップ&フォルダツリー.vsd index 96f1817b145ce934918b8d5ee2adaa7e463b40b5..52b442eac84f049305db885098e427401d616f70 100644 GIT binary patch delta 35418 zcmZUb30zFy|NqaKnf5X>sU$H?3t2K#N+D*ZRitSbVk)JGrYLKh|GfE7jGR zOT)yu%-q%LTVehAAL@?7)XQp_h@78l_;#UTeE>iS*FQp#E%^yV?*)3v)eo2I}W2agYfB!w}}! z5CRwEp57Ute_DyJ3}J(Xxzwy+{c0tqjrwiUxG;A^R-k^f5^qQNmr3`+TxnLQJ_&D+ zho2B0F_>lB!rXbgGV~+y=t#K46aeQzY_KTz^)7Gy-dD@SuoGc@RKCqNghZ`e&h91p z$<_(bM>HCM@d)>IwsEy{%XbH$a30{LvYs3 zP5CRx(Ag_N46}xCsct+xmYe#QS+0h_PQQK*y4v~cD#}?`FL$mWRKE>3TMa{K02mLJ zGjU1oWkH~RBmQ<7yo2zsoHLf>(y~KFDdr_WzKt0GsGm^t3hVXa;XFrR4mpI}+-z^d zNFS6*0lNOHWNyRa;rZO%*~YoLIi7}-aBc$ZM^{G=<`o#W3XaN+$yq$Y4d*1nBswa^ zMrFSd(S_ZPz%chkPKco;?wJVNl-GW>G2<5++LO9;RdVA0<$ z&+CnV-^YQgU{1T-1!#9EqJ&Y<#TxX;Bh=iuTJez22mQ)<@VcVYJ24C<@PRSRWgPZ8 z&)dIMefDXP0F5Uh$MD~d`}-o`1{>t)$OXu;T^@?ZN5ito04(iomq!wt(d;^$@diz= z$W_tlygqCcG(11)u!n|6HB5kZQ;^$)-)^A>UNF=ix&1v*zIJ(qC@KnmTMTT%)dR(- ze3lMMr|*Lkwf)90IQIOdliq4`nh6O|JRJaxKIqjh$CC}cV9N{uUPS!zYKy{9Wu1Z2 zOc?sRvdPMFxvd?jEYX*kTYUB4`Hr#`+Fsqn1nA2~<@5brzTO)N@DK-;@A`nJE97GS zaES|0E+jN>WO-lNese+ci~deUV{#aLzz0N^0xB2g=C+jSo@ZUl*70d1CBTxo$k+du zuPZe2g5BPzsP}#qwKNdp!zy$WEkX-aB=R-&`D1~q9-RR7#-xFjTE0-6>sL1Jy!)Mp zRIEZR0geh;2f$*P9CbHpg1|GuaQy=0d-<0yDH!?ME=2PgYJ!!>cgsM3_W)1SS7r$? z^Ew}tlK^0<>CM3xHVxK}_yclv-g4&^;P}tbRFsa)S`$ z(SCmKf7eD}dFlyJAX@=|#XuqYU7?8=JQs_~Q2(n821M3kxOpWiCRj=mwxL3N7$`)T zvQtl!uah5;mBo=}j7@;;sQEO$4V0$>t!m=WYtR}<>{KJ+6B6JARMm!lqS3C239x4) z=mGIWqhSU%2{2Y`GXW4OPaYC-t4YXSx^swgs8I z{#7zw;>sxa-&Z*rA6U0eJk-bpqX|C-#%(vU)lyFbB6KqZo!|dssfJgzW&)hO0}Z)~ z-$Sm{YaZ;~iR!v(z|j@PMvCFOtbyk4;A+Rix}n=EnUMhR^1)|F%4Hr7tlSSFS;Mti z3wh?Cp;7vK$W`Cs!j3&?$UXX1N^g8NYKdF`Ce8|1cSFnaN2O^BThWMq^d39zdWITinQs;K6|ynV=N-Y=&}kyiq2T?{6MtDhDlBi+AIec9;NUpXZK4y!yx zhOe|-b#)V9nGiMH+}{nCvC|Ls9NMJp!NGeTkCgbrzl#A#2?K+AX+AN)k~2y*%v z2ftK47zy1q=5!#Z$0v}J{coqhIrE^_DbxkK|JMcfYog&^G&0cmOh!gO7Axl?RHR4; z)X9s%BS=Cy<=!~St`ySYOx?N8!xCUx|-)O*Ts3U-MJ%v;>$^`N#==*7C5YB*3S4klEkA%`7K+!8QLP zv+nKgd6QjZHiX?g6|Pk{PTWHr>idAGT6 zaSJNfiT{-=BPkB5x1w@+qG_0nqO|{YulJTUkgLuI1*`?o3@h!5gN4Ru`0r_#2Y@;> zrQF3L-~<#w-)xtEa{;V&d1Fg3!~;<{a0Qk8n=f!{m%E{LzstzVSIrzYuL*;~9TNc% zFbL+bUbrp{9z4S`9oB&9M4&QNL!dQ#a_w;^5Bt zKMS=o>cE5L0EmCCQ}3<=I_UsBxPC_COB}qk{hC%|Ck`%OM~U6O#z9_GApn1^Q?Ia~ zNG*hD6s}XZ{3eQn9w!pD@;oW``^v0GlD?yM{Ab}-t;AT0$DOTOZLyS|4G*_!1^$SG z=?*WiX;l|f&c9Do`>1dTBDKra+U4r)a*cL*kY>AFt6h#(L>=@O-FCTNyL?!?oQ(cL zX_r&m$G#I{Y`IDe16YNI~qKs(? zfUW#1`m+Nygfd(nBpE1GEUNdAk5XfgYOR{;2&(QcqLg-{WN%T+4JC_2gWm*IaEK_4 zQc>+xji#g84P~#?)D>_N2v0PcQ62puA(xfU!75Pgc#!Z%xa^HGT&Y5oNjLl=1fUG5 zm4CLXkZUMa?*B=3NJXPebw-6u@Gm(cKI`=Hcj3%#!YDu(qIf~3W!Fb77x`AZu z2Kdn8jydT*qlHmQu>GjGK{EKL$X-nd+DI^BTf#`Y%PhB#udN1vrp6rf78enRf z1n*PP6x2aQvk#!NwdwDm0euYJnr=r&vko0iI~3c`3P;X}cKK^)II>-C(k@3&*uL~$ zdUhl|j-F0mPq#+1nC*nX*%+r?ZqqJjw9A=jYMat7pVls4NI%HgOFv2X|4NMDMicbFJoLTfQx&r730Q$iY zZFHiIj_;Id-XS*w1Pl-uqg0GRC)Vi18XfJFzz&^!A+TNv)}xbjbdrva%@BbJ z$V1&0<*#mw%8txQc8E+oxnw#z%u?oh2T50;lUWGZqFi0jF&+Iq9UXU~Bk({cap+_P zI<8fMICQcVovcMijDx^dbg}{EHU}N|qTInj&cTqA=wvVQj!-5!iJ_8ip`KZE5)nHj zWk(>b2fDNcbs^{E5|SNiboY}>b|QS89J|5Q@Gf<{24#W<#eh!TdoBqSB%vOrGBha6Ng5PuI@MN#Vy8iQ>te-y zO7VS4q1aMet5(6iuOU^Q1QbcYmrjkEqCv6Ope&?QeNk|{_avZhOP%wSGI!Ebiaw;qJ*DV8 zrL6V4OO1X?iFr!d>PLNdI?HV@ow~SPzGQwNH7e>UW!Y1T9i;M~QWnHNrEGxI(WvlA z09>cvP5Mt3K-Qq%Hj_V-0qwrszM$5spWEP-6?OzRJKzK>a6s|wB=C$DlD51D? zme=eVVeIwYZa(`f2Pc4tA`npzL=iaHxYw7x+9d%zus@;j2|q`goayS}9Fva|Qiw$b zAufLE8Wxn-tS=54C^F~#98I6(Fn;0;Or5lt`NdwWuNlmE4+ff1o&ruc8hU5)Wp zVY=JKIgMk#Vwgr(GSVk{F^YntkCDK9&INdmw3oHSSg&zk(7fR=a6Ts{Atqs!{scc? zwUeCp=fJ6H`+~gF&3~}2P5nveWZB_3{;$J{FW;}^oCEuUUNSE;#WH3u^T`}Gc8A$9 zgL!@qyN;=S+J6-l5OH4QDykWt%XPzp@fcJsd>4KYFT-!*spPl#cN}ifA&(|63tdk3 zB}b4G$-tRcNIprvMwWA1$ZrF+UHfrhM$se@(##=yFE2LGg62T;q%EMujv<@i^+l<) zJ+xBV#SvVjX0avA|7MBkQfhD#NcVP43#FRn#jJyi6VE`T)++Y&RKr%q*V6 zZecRP&l}4*y5UjW&u+w^t=vK`ILW=nz0YmoMqn6;XT-DSfww$w-VRI`g}|NRQ_y!|H9~wwO3!nRnkE$KZP&g7xT~aYxqrk^lab5*TZO-E#`^^ zVL_q|7|6m7V0Q&o*k{ojEK{H*04D@C0+zr}FiM;xm@h37fKAeW1XO9O0P7N{2}cOW z3&9NG>ayLJLxpj|-uxBiyM&~J!m>QuOL>XzwZa6q79rr`B$1KGS~OkcEm|Uq7lCvU zTYOY>N%XI%S!62(Vj#mU#Z$#U@rB}*;?3f0ac_yZ;_7xc^PJh1(5z1UT>MFli>VR| zi9WyVqt!&&Mh4U_I*fDGwg z>2c{5X}$ENR4#qU00y!chLdcLEL0XJOO@@B0gr+>wTrSlGCQwXijN;o+W!=O@i?9x z2#PnU(-LdKY(p;R)+*>YIN4pRn1!Fki5|IffH^6U7|`JebWpNd&v4jAyn z7GSa1a*+Tl#?E7{0?>pJ#J%UCz*=f0P+a?52D}9E(p3V7tBaZn1SbSLq#*FcXsJv9 zg~NqbLPw#O5Wv}wa#jeFh3`K-$|(^p#60?ZBH2E`4U{m&P0WwXQY^t$6Eq6n7BCdu z!f@PJG(qGn0zRTJ(P~kKXs;+xd_`0*0xv~!k$|y7&r&>gdZHFroJu9H5od}E#3#g8 z#R@0!=MU@gK$s9?jBu)ZSC3_^Ll8cf%66`kKA?cR@igcFD zUdkggr$xd)LdPbczN2hXJmsCv#-Z08+HZbPO7R&guG+C|;9FZ+5WGHUS zp32{))Ymq64^Sq~Re^AQ3DDlQY4+T&*UOWAB0CZd@GV|G`W17!&){3auVO z5!Ccm=wO^zB+AKNUqz~#gH0!O^su*-N|NmUe{L|X2_zMFz+o4te*)cSw zaWobN>T@)FvC+rrw`<4#pfaTZZYSCZ6@;YEA3#`=cD^sEErLe?8cBNjemeVtuM$&J zDC~Z7p+bGq;gH;rRQ;dS5yH+w{|UMN#Dkch`ttyI-2brue;t8FLIo-5042;U?hLVo zrKYu1E$Kf{Z?Ig=k4VVk6w)Ede`*BLdD*kh1Nqh$Z&!$$?XBcLU-z4J;9oYPTf&0P zUT^2xZ+7qeD;6ZbgmmIg7j{Hp^o(fr+=v;`q!NBb6m(wJ5`B8r+~|+|#)>cz2Dj}q z4!wQe&h+ovgc7 z{jpkLX6B+L!2)mFm0JiN3rX0yLfj5GfT`$(3UtYEEAq9&uYP%%=8IE=0L>3*dKjD? zj09+3qikS$m`?U47c=6?WkQfgK1#kS{FmHJmSY5gKJDk7bC>R47`fZya04;McpB}0 z^Fl5SsLl%(43H>9^8&_*WfZXl3_a0#1_)p^G1jqq7?pwsFMQf^CzF87Bj>gaex>^iPwpDi2oL!5sSqQ;(IdiMQkA* zDe;uflyL9!)M6xHH*J?BSoe%XENPGw^mj|ZLz=Pl>zEnREE-RmAl)K0&X*pOUdGTA z;ndn7eJ%B!H`A$gA$O%mR4jXWDtl&Z3NsOuVwtX;3NVJl?ihnk7RYY1oJNhA2mY3w zk%?suve&XNG7Y>2@12N0JbX0x)Z-NwsKe&qp}5e~I-H2%E4iT2rvhKgeTsj?d+}jp zGqQN}KydK#&^_#3*AFat)>w8OSO1_}Ki90$W#%8E+Zi8QLgnc$m@Z0qBPEuF?m>%X-<5X=YOAP#4u z-~qihbi=_*<}GF;vrEh@W6qAzC$%gmjdCldn!3$@bE#62~S)lKs0G4d$O2FhIOtF16~`0U~pCV7tpZvjhu{wRq>pfj_ z3xIbamXqkZ*RIG!q_%Tv61x@ZO_R-i=TUrtwO*7WYiEHz7MV-uPT{(9=W`8to48@S zxiMSp*Ozg#6;J+%_lEa3`HY$}7z@KLlO@6zWSK@U0Y$Pjz~cMym-3VN3r9!ZKE%I| zfogvI^Yn|K_`5MGw)W|w+rSZfEnS2izq$!)kqR-=XRujXBz=p0$Fv2eg2@85fCvIT zibDh|1dIASikD6Ur)<|a`4k%}=7=7Z8Y-ei;3l3WIv^5>szi@O*c;I|5k*T}E4C4{ z#LoWWNO8U{WCv957RL;ekZ+1tli!LTd>3m=OeK>gCY+ks3#^4_f=^kpYsmXZsrMiJ zB(9NUN(v+=Bv)%jYM`K|R`N{JF6pb)egHHclBIO%6e*83Uz*u*)(E6YMY1E(D--M0 z?@Qxkol;ePMP1svP zt{}ge|A2go*Ja;BW>4b(!?PXH!`YwVL8V|pp)Ea}T}6otR@2U`vB;S{!cu?7cc3<> zh7#8nnCfxEZRtNW39XgZMY}2ivyB-O7|!EKxMY!4<|5-hi%XA~12>68d6V3q__cum zKz@A4(xr?f#x_O~;}oMM1P~JH89!Nah8Ev|Rl#y%0k_=?Su0taS@!%AjCEFUn*|;U zKC)s2!?uw-(8sA~8y8CFYXhwn z;eo|DrtA^Nm(NJ5F50;;JbyvRrlR?)u}y2~yQeglbcrh)w!NMCHys?#+_aV=-g@Rk zW}zZ4{3RF2-SWbFxCxk;#9K_17n^+?@I39;f!DK0k_p1$7!G`dj`(WfJ=tF2ap68`y%4+<%7q;LANNLx z#)~4$e^e2!dKvkii4Y}u`iOmc%`{!26D3+S(6t$$*vT@UXR0R+T zIStm-(PI9-yCDsbgEr%skQmD2+GoNFq2HB6SE(FMAS?S53P6Ns%>YVhE9FNw==Cx@L`{3&EsC=c|bx#1MBh*!Yc=s zHM1qMOvc$lOKJkv_QmJaq29QPbEb^R44W@w72+TaZhoXwH=$ax9_^!65G|$!w@_bA ztuqQrwE&6M4BkG4dw^&8M>FN>4Ti${yWFQdPsZly53ZpnvgeCF(%T-&Z5_)}4zZ@twT?__Gu zKFkhDBl&#u!47{&iZN!{xCQpmfAHix`Cvc)EdK`oA-|3Pm9L4JU|`m)%{c+n7#D-F zsg2G@qs9W~qdQX=7qcoSSJv6@5+A${A>-nsO5s1VDqo1{f+>O8QT-%t@^2i|H2$YfBTEp@LM+KJz;9o&ACipA>LVcm7aH>%8>W0r*FKPOGU-d6} zmo)8xaGvt*XXc*hR!y))xa&}4+xMJPIUjNk2oDg!t-l)@*1VYs8=#dMT0qFYkT#rV zMRPP!djrw$*(TMEE#qv}0|hBwP=hBto5ISu93kF8H&DXsPm zrh?knxMDpDvoor~aJ0GemBp5A#?Oa5U-yp1racMoB(W2^n>Kv&vtGI8a8@hS{I-Wk z_}CC!a0qBQ6Si7CooV}sG3>^T8x~sd>gz0-8@8Ok2Usb5Z7J@wi+ob7h?5_gL%t$72EogP6nZE3sG zYT9Dr-PBsl4pd+Ur+uv}Sj40~)t_?AjyTPH{js6r(>7ylUgxfqSFCFbZVvBcflnVB zBL6DXEN8b-%-&4;5kAuT@xi{rKB|2~$~n3v8=zMW@2I3#MzQ(g*uB9|lEzs--eyH` zdKo_daqyGxjH=q%<;jq=8_Q{`p7djXGE62=MKit<468KmH=a|pJ<^me(6D?4J~sTv z!1qQyE17lH@T#NPk^T~geJ*EhYF9l>Jw4*8qwbOKEa@!kHzf{?5oV;c6Z-4o6R$d2 ze*q;9N5))rjImAPZsU%AU*Z5(_g{59*L9D3j{wXY$mtF@LAAtCvHhy^zoZTn?)d7gbhafPemU^y`o`aw%N5RIOQ^H>umAZ zz|CQ9+JWoLQ_fKW)@58^ZT)*2W!AP675fEe|AMToueXVI1D|c51j8j(l37A8$s$Rz z5MXze@y|%CPofNc(8ktQ>3r$(7x8N%*V9D%oA!l+h{J{all*J^`}`JuCm$nWzSo7; z*mTTH{mSw^`k@$z!&0$5SSfZ9yMz6Qbzq<$qX^6e_S<{PU3b{r4iV^UlqRpvbiGK= z$aKAsm&vxdy`y$g?d6P}lKuCg&27+7d*GgP?Q@Cp$!C&ufe^$BS4fplK0ib{;wIq- zA?Ok6q5T9~k*f&pmqm**OToSJ{~ET7_K8l5u8TU2pPvDtwhC%s;3|0ZS*UHMn)l2= zbFqo;nD8&`dFMU^T+*G@<$uZ7*lNTk@ouqD49dl~#E-@A#6QG362@+^g5tV^rtTs6 z(%3R@v!D9Ldu*EeCXF!~mot*de+`2)b#O~Vpf_3L9vP!bEu>>;p3>tBq@lEw=b4?x z7GEAQ@n3T$tJ&-IvWw^uci#gT_W$jH5oBl&Y^=<}d{+N7#_D6I{cPTluE;+xn1aSy z_^zeCelfOSZO49BU%yb>zgwN)Zdu`LcH5}^?w(ea)G9wUDzkb-DmH(y8a2V4)c3vB z!~G{MhFYIKvut0;5qeN(`~XMyDo#@q&z*Tq+<$^g}e z)lJ6NvfbU>uAr5$=lQ1{sR1X@2KOr-7==+F)9c~!*BtXqAD1?9cfj=bWMB->;8|`mL6xD)_TZ$AL zXj#L3M`7r(Oc`)aoH*O2^)zL-dqS|K6PzSJ#&+dA9O(p?I|Q+2ttndVbZD~eZO3<< z@irmd@`vT^zBi{x5@-jqeH$B*0zpJ6Djwbj>z8Ao{J8B5hUZ9orxVM4BP(U$Jr*LsOC> zy-EWG!V^LTjmR)$IPy0#<}xUY$A3I{N)py?LKE5wU4xKOe|m?dT?8$?+ma6p8KM1~r=4HjCL-?oWztF<=uACWvUf0i$K zoTzsBt(oDsOYe$EM!0o9y!>|YH!!~M&bw$_B(4%)!rzF$iNRNVl*C4oDJ_sLl_W{F zNkEaLL-LOVmFp4VcoDh(E*!O#WFQ?Yb&}4J7KB8F(h5VT@3W79H6eJB(ml?|@$ed-sM;0bqEz6MYm0dae6G~2iQ)3^>(nyz#TK8Tu zQtvx8)=b0kdy~ybglfMq3fY{D*^@oUA>#DQI^SzDS;{G)RcG24nN5-Y{Ct;Z*`HSc98_YcCrb(l@ zN2GOm?zbZ~x8Uei)j(_;{mG2ImOnT0E9<$@NI%Mkzg<8^@$9NKYEe&oO~BSyv;A)` zHTiuT>j9ebJr&#%a9q&yth?`~C)?21MR^Zn%9|M7!&Y?t`kVy4#%lT`MRZL#hA*d7 z)7yiZc>m@Wb%&Jst%=r*im&kLY?MEaZ^{VSUg~Zfo0YQcm62Q=7*iBjLm#Rd#{$-CjP0yj_2xA5-Br@}+)6DW10?hwJ6Ku?aj zpLy_d>UP6$XT?&EU-NlR)okHo*px8{TCd~f~|{&_(F>)aUU`CD{RnfP50>`; z4<=CVAlBjoJBZrAjtAzV*gNYmZDJrGm};7NlM>O;J9h*lH=ePc?04$%7{3)h#-^Ow z?IW$DYw~}L@ymC+w8^*9OFC80h`!8B|0`M)CwwIg>!GvX=otmlmeD5P?L7uOZt93% zonrh`>b|ZnsC;A<*4O^dd^nq39x@3x%Bs<3v!zzD8~V-{HRW_ct?ad8J*m^Mg~je0 z({JEst$a**PXD1tg_?WJgRab`g4=-N{EnMSwB$^d--1{Z0dv@`KescRjbU$fq* z`aQj=ov+7c`*1q7*sZhzs5{=*B_47-IT|lOJ!TC-s>uWPMy)BS4YlU*9z!}AOXAf~ zC$>mRT^7G0av^-=IrU?yOX+P*7vBp+0ztRb&9I9~GW-^z*uTDKb)`w=2^PdM5h~uitkQ07PsmKMi78H8xK?r#^Y3CvrCPFSL5`siwiUQ zux-Wz@pu;wc9XbpY^zR#Dd(iETXl)r_Ol~dUf~xGx?OtC*;d=Rj>Tqjy2R{|n{MEw zt?R38i;q2C;1_-&Droe5h=m_}Ton9-_xae2a+3y)20*IFYv9(IG?+ZRB>l(ecrn1u ziV61gWklt^FIBQm+_FQgs3cpR5vNAQkT;QkE{$l`8~0TFg#S-mzuvv0moDCLf7A$B z#bZs@wH--~+Tvrf&LbQIU{RP*Gd1d+^UdY<7N;WjKH@%QV+Q}`r7ttiRV2mSt16e9Zwq3f#Xzw!$<*ma@^QR`seD=VGq^`9 zdIph?!fh9vxq~^E8Ny7%nKit$9Wl%WJpx@cBx*(P_uLM zqp5{G8>El@S1^~qOBF7{1GsU_@5|;f*J0NL*r;rKt_MGF-3sPX*X;Ss%?a7x0+=yt zvLW;RN)2*2feng^Puk{-P8gv6J0~(1JrTVZ{S+0@#)tt^ynr9e2Lk2$;QitnK55*i zj;;?);#v_ytS5OWGP9MqN`fTOk`0o}yJ}92)f{{M_`8m-XUc7P8`hT^Ox=?OAr~4- z$4RG2modO%DPNi<&6OUJri<#N6LIiK%EhTN3z^M@OK&}7A@4z`BT}??s{D9Zuv;E;(sypp|9tKrlni zQ4_!F44yD&5V5ixq89E&bftC+PZ+pTsUpyUJBU0*3q-M^6p=twETWtjC5W3uA4L9# zKIw}883tPdyB)=QhW#L~6z?ZzUji$tEENKSvGlW-S5)a3`s&FairK?YS?JtoM=#8| z=#4pBMy@8+eN#(&HAcd`tJ~!!*(hP_n`od7Xe?iHOmbOrxAy7HQxQeYcecII3}p?s zb41%oN6b#MN*Nc&p4>@feLVkat6xixTn0Ic4)?n{2Ja+4Bs$X3QoxYj(0oPVO3P(y zq>E;JRfn$*NE2jVq|ZmM@imd%XMtHV(@~clV`Lj;?^x$%ZeoEOvWK#E##fmpZh}w3 zzF$!snt{*5Jr-Y4tobn}wZ~43HhdlNh9dcGoOzg8$$ZD`B7Dd*M@{)H$L~3Q3oTZF zO12;m?(@cyQ^+%DhldL$7riWzBw8b%WXhy{c1p~5j&RsuJg1@gIB zEE{2cG`y(%>VY8y$JZ0NM}*_JU9s5(e%z&8a9z0LfWPnr_bT_MK+08c0g*T9dybza zZz^x}KRJGDegyIrTfUE7?`xkNN;%&RE%xy4Vc%AipX2QpKjFRSfuB5G{un-!@4^q{ z>tpNrW;^-2p9DxMSM7e{mYw*N&vvx#iS zWy~@fZRIFD(N>O7qVcZr*0T;8c#OTneqcI+(E^5mBM1NX?N3nH znjnf6=Cvn3DOpw|JSEJL0m0+^`2U0&c)zgzZs$8|5tuGA!`nYq$WldnM5UsOB5+6a zpU5y|MR|`%PmJlUDDMsB#RV@1t3W)!_+T}9|I4@xz&V%|FtQ;|{Hh0NH{PL51M9V7km( zwnP?21L-n5;Za#5{;%u@&EaQ{4Cvu8T&&gF8Gp$Q!zWFw^8`Eb{rETT&3ReeS9mwx z!ven@>7Iq-4Gp_y=BF5M+A(5f1S@BAh?5|E~O+>VP=^A-&M2h-z)+shE z?jgw|^DcLrpLifFpp(tv8O<%`M8e^4J-slk?kQ9E8P4QdD1(AS?-nd#tzwO8+c*5c zP2=@Hxt5zbY3(Q`7}J6IXHNYK>K+a!fcQ@{X1i$svqBUR%+o1iZk$qNJ8BQ43ujL` zsO#VqG;uU*pT0>Zbq5jUz=0(Z!ae)+OQ#3UcG+Qw!h(GUs{(FONvr0U`MnFVe5I4f z_W>YmZqCLvMGn;c3C5w17w+oj{^hfkafq@oGd9!0cZz$wA?9YxLHo7+)1N;6!qZrm zk(QAbNk#i~1;$?LOWA8bw{tK0?|#S?ygWvXq+D9%7fH#_A%G-fb{IYo9-!!eHMm{3 z-)?mHE2khQy6fTa=EW#F5Gc3n=JH!34~IvBRR+eK^^u9iU!w>+a!>3tY&e)=%qaJ# zV`TvqY~YA?>qeHd{f#QthXaYr^9%o7nBsn>e4pXv3&E4q!l$@@x;Q~HZbTw=dNu&h z;7kKE4n8fQDxk`h8#e-kPy@1$Mr=>JvUDSD7i|vXMj7oUO@DsNk+-zQntkoGn^l3G zH(nm2GA2l`QD1u4Ly2A76gI0#8`Fsu>WTV9f3vIZF2>QP`>N9zgq<4ld^NYpCNDB4 zFHk$k0A&oKqx*|YE8g2r3|j`3^(y{_9hp&R^{tfvRyRJNUJ2_zVh2x6f#A-{JqFA4 z!X`hUB*&QI(((S6tSAa`&Zb-zrwtklfGTU1sHP=(|fyzlv(6QTNm7AT!>5O zLuL?$wo?nxc4|u4s^~*ToIPR`RH4XDjqS{h(Mwq{O>V@AiSFg?VXFK4&6B%LllR0i z*$NcWF-v=x?R`^ieBzir;=S2%T;PGRUBt`c1|qqz_5D%ulVJ%wydduL6!vANNR2%z zZpRkpqG|GE#Yfxiu0|YhF;gGMBAG6WJv>gD-B>>7Mu6FkWiJ;H{Q3^|6Sj;-ls+o~KW=xMMZWjA?%17In9z2ez;~O94&1@2e!~1Pg&oIC@!!Fo2R<_YnJ@oxS&ePC)mQlxDcip4>Mm~uifpek zJx;JS@e9k@SNa#p#XA$DFdH8&@PVnxd&m31o5l0xofaqZfbwy>SFC)KwM@KTOyb`# zLXX>nPuuZ)FbQ1C$Xa=8%af`J#b?9Qic9$5?9!U7TRZYHuV$7CE(-1lz<+{{T?-$< zqWQ8}pYJ-HeT*shK+qOQZo&83CTh~Nmu_Qo>mrGE*oQ?KV^5rYX(&rOa#osJv*K-d ze1q~4K1yo2*?r@pwkwh8D6Dv~P_0Avb4%k_7OU+U%TM>nhu(CM;d|#+LSfT~bsQ5h zK}-5}O+&(62meK{akL=UD|a=qU*GL^Va;lS5t#rOZhaMjqPM|sb~kEmVIRV(N)i$p z(~6%|?Py~!Y`wiatvKz-O6kH!MLV9FHI%<-`q>ik*{oW=DD_Q+n}+7r3z2Fv{I#>1 z_`_4+so~s7kn&TVJ5v{zccUPFUseXNes}BK%IXeauL9#6YHe$$T8}&4;Jo$qlPd9OZ=+W~SgWo@rgyTg zpcl$ds(fp0{XaB0>3VAKj9?sS16eEYPMO9y$FJs>zInN7LUAgf?`X@;Y|q>q-HltN z4C{`6u%xv)b~Sp*{OZ+zZ`hxQ&6$#B>}zZz9eB;CP64nIy=30nN=U-8Tf+L1M2EtZ zZ<#?8ddr+)tFvP&F?I5LR(li_?ElfHrz1vp(-zl)bZjaq_ z`!tN5iyhgtkzToBqDNZE0pB~Ei;LQvrY_y`q{V5fzqO?fBxkk~H<)v8P4t-HNmoyI znc$hjJ?suAdPqFM-`KqAp3k_4*~<5pHoU3+TOeVxB0^xu&~XeolKHdvy~U!}1K*n| z_wE*Lq22CflD4-%sF#zsBkkSXhuN|cS;OPK+oeIUM=)WLtRRm7=80;H8XixInlsCt zZ+h(ZiM-p)$0w#dE1PFumS|xM5*pJPd5oisON~i5Bqyf#I%JQR6jRneP?NNO}+1iGrYbhZ*}9^L~d4ojoQ<$m%V6#!QO79@xkShL?0GracR&KGQ6S*rXx{)qpHvM=n05ot`_D?f$}SgN77Ba-8><$ zoQFPKFc6IuIf>?oLPc@ti=REB8&Rt+TrZOq^5-+!4l&h$n&XX_%IAlP-6R5qQqXXm zIDEvu2O~7@?xl%lp@jt|3?fF+5a#Q&L9#%C`aj|B+ghE zEN~-$xS|5Cf;dUd@_IB>E107o+Ky;6TLDY@2_OsoV-&jbAv0gDlu_8aMXqV`ZpmVwA66-_T93Pi^KPL(*@ zACB1iXZ9V4%tBCwXHAJBUCRiQNa9 zFwlA~G(&{)o2*2HiHNfQJqI)yh`6f|=izhULPV6UFsO+{BpDH9XAY8Gh!i7&{;i5% zWIyt$!4MkCEHc^^K1O81Z&3vj;fM@FWUz?!i0JJk0;AuWHbg8CK|eG8Wu1q7oDo4k zB>qKuktQ0Ep}b1}4utD=Vnkr_TVybPF3dq9^b6)+$*Pgj2}G2`bg&+7&aSWt5p6^U z3p5F(YE`kWM%D^Mh6)sjQfX)X+0t!DW0Xb20Qy&8{%4Jh?2u@vsVh*Uc_Q*h!y=>Q zDn_9wRgy}oL_~I~kY?l~RPot`G*yUTLz$5b=D;T^qEaOKu3|I^Y4mpeS)gl3!$4%n zClG1eR5Yahfp8fjLoHpunF~`9VPd~)Z;3=@Dk2ibh5sr=zcr00v!93zjRrTAN^|$0 z){%&qBQn(Z9VpcdL`MAf=|@18FP}QTkwm*(W2BpNgmgiI)Eo4Qld`ra(p0 zhBP7-&1s~0p`tNZ?h3!CXsVIMBKuc?uz}jUA<+zkhHBP~M9cpt8qg#nO`3|P8)-y{ z40TyOYQ<_qhFVc~;#~MvMbnKmJ-;=Wa^a{(eKtDh&p~t=^_e3gLqo3(X`)p$q#J=S zO+{mgGAl=9s6eKMbKq@6h6+SF5D4E7`6$P~GcqFV`7<+1B(g(f=!Qu|8gCViGs-L( zk)h1oP-Z!Z3}v!bN@8TL&<1}{9%MN92LzqqzP8h zB%-NlJt9M^Nd`)lp_0lCRjde+-xb3^8!FLxgoc`WKT7smC0QHF>^mYu1&TyQCV77t z0n@5LXphK{PX+RcL}aLibdBb~4Tuc+VD(7!w~ELfiON(&ZAkM_MH7lN?^HCsNTZei zXJ#2lGX{~N%nT;Yg=`hgX$*;iR78`IXq}3v5ova*XxxzItcs==X>O@#LXqZ;ipFxp z9Qad3lQ;>R3r+X_S!!=2vPER5)Vq*TfQlv&X<}3~rAV_=MYA7igesbANK>VvsU9&0 zgHKdMjY#xeMbv?e^a}ngPzTa55E<%M17o!0sAxzwbKx=-O$HhXvkPfns%WZ_1{9(AXQ)IKNMu;_XJ*Yvd$2 z5gGC+MP!Z&2}G$@s-&t%nlwbPp=6e*KMo^={_VW~Ey`%gsY1m1H_1SA+y_L4=D3x} z`U@fyq#29{-H?yk-$e9dk^lK*AdMv=Lz+mWu~%x8^Z($?ydQ}I5E@#iyHOcq5g7`Z z|6f)29^O=yuW>wEHlt`f6bYypEJ#q%_-Hjc9<7`TnHi^40SP){yb{sTcwvmnU^FUG z#xY)iU=LD6B;2&9XtiFVs6}Y#GP>~;@G5+8Q4(F(0{r66rocg6Uq^~3NiDMM-n3T z!jQF~RH(a7jykVN9Uqw=CDTd9<}1?l)xG}-5;_esqYk_qvc{G}T|;c)=ujy^+ZTvw<(Ls2@5BE@%hWyz6w6zO?2 zbLEj0(#n1+WW6WSMqmFxN`000KR!Yg3!O*rSrfASh#63j%%zg4BXfsjB4n0ICQ0U9 z$)q`qok;mGO8cL-`)VxDQ~aMQ9ND?$_jnXK0x_o}OQ8T_29zN)SuzDO3CZL+WzQkz zlx69DEz)($itE3V&^E|i9yvQ5i=lr5err_5i)m4#z&^nk)i(v zLLW#d&wT7b%zU&Xdqsj2+V3dDe{@5gqn>sSC_<(dF^A!Pk9R`OOu|*5^jyev)``p$ z$unsS5VMa9QYeR<(z6&nCy%iTh?&JC-P?;oNpvHRiTJ3KmOA0Jp@j8<6zXJ*-yp@OKINNCn$CJJb#~_S)>;9?WLn5fl1zr9 ze-JTex{g*)B4!q2NaAgw2IxDHAfvXIIbQ|r_j!YjRP_uoLS}+ws>w{1Op?sgl8KRd zJ0T$tleQBv)96Kh7V#m!iexCg4;kDuphij$TJ9X8pH^cKQ#pW)U7m1Ku6P`TOrbo5 zZjnOOG+QKvg2)n)ER(+iF^{Nn%bvFaf6R#TbpHb(^W>tHLi-VO7TYQ0 zS>Zg3?PShC%yn-s4)Gt@Ij?*Blrh#dlJSwb4M|k?Oq!QaT0%iW87UMXvqmxzGMgk* zM`o8~l4K5e#yKGVsfjfdsVLt6%iE?5p(+W*35`R{(R&8hTGt?E4X4S>luR|52FWy% zc}p@8GMh>n`tN!zC-k#~QiKkE*4bGb89!nM)I{c7$rQ*;mP{L&X_9eQjj^66XS(-4 z_R+Q0^AhqA`cw+}$^0OhYBC2kItLUYGZ-;56k?(M7h={~7#ZCqiSp}x1p0%7qR1GL z7&2BQj!Y0qA{UFKkV{3<$Q9jE-v2Z}le?+>JPf&3q!GD6qzSoMB#YcC5@Lq#K+H9j zBlB2KrnLWwGihnaOj?e`_=+@(QfLEW9wO$+{D7GKagvO^(wWIn`6$Fxwlg8?9HeVN z#r2=&O~pl!c~jvdbTwjbL_s8hn9f>xbFu&#(Q^T}aAa!{bEaF7bs{Yc=wrm!)r$Vx z2PUL{+oZUwl^luRJ%IW=p*AArTm6Q8lvc?)O&D_XDkr2%; zLCmYWhs=YL@gfh4_>fs5eq^plA^^=3szw%w1d&A|b;uHtB*(e}F<0(u%Z+v?1S$N$5Ta zrH}_i(#YRM8jwdsGRSO^M&xmkJSXT0Bw=o`8K$urGSg@;;lT-FuIV;1)+%SlN2Urf z*R*F{$U0v#O>}=3VlL?{a&J+J_y6)saF9axOQAXnEkevjJ4dsPQm6&_Or*da{!7Gc zHCxH-lS~_8y;vL&{g=DXL%mDXE$v7jkpgn4NGH-y#D1X08X)3Ejui1AgUb@`>fQ?t zm5>h^F5*W~clOY?n+F*&&i)+`AETxDh(**VNTnY2%b5Ga50OhD32h5^7+hG6$((mdd;DCSEEA2JN#XH&ZN<9-T_M9f}0 zh)n2~<|D4N`yOy@_;1|iF>__La8%qpy+x?)YIfExkQs!SOeb=*NE5Y>K}x;V4~p6&syq*J$Cgl%(w8IV zM7Gl`j+9nbb1Z6KWhdMZ)mTekb#|9wH~9==zMv3h;+hcib~Honb%?2*Lw-amdrm-% zRtLW3JOOz!Uc|IYB?z4bnFU}k3t8tO=4|_rt3{d^VjM9;43c>OG23(x2euF~^XNqu zi{z>YkG7Ucp$r3Bg_NH9G+Rd^ zsa0)+zLHRyN%#k1CLzth4$O89ta<6}_8+aP*u%WOW9IzjD1IMemQM@qo2Dsgv1GFM9`j7$;9)9QMp^bMru3#Qx0@@QZ)#Juqf4Bi$ zRs7K!>ub!+TPr8-JH*@xleF8@({9RL_OAz2wLVs3y|dccuAO%8A?C7gq}>*zwCw92 zyT?8|QJ~quZ#$dWr;V}x12L}+zT(j#=HB2Xa}HwO47XA`gbe99NdYo3sS~755-|%P zatib`WUl)$na!B*^d+mKzRoko@>y~$%!%k8uhM3~jw405TUx=5_ zu+P4>lV+btvkc8zrCE$-ySkf|UQ+GZHJ0yPXJ-)xc|2mCEq8MKHArcZ*4HNO854sv zyGNS&hSpli?og?89hv2l$uXct#2iN>16qfakK>s8?HP#_&5l^(98n#my@>gQAkG*^ zBWBse$ovU0Ycfq{x@6K+eiSjwuaV3g$uzhrw7k1e^C=J5TY4t~bGc03b2iM;a1de! zkfYtnh#5c|nemb-AX7xzX?3TxatFp(3nb$S9aC$)D4}Yk6*1o>%rlYyM*KZ%G(zTt zwa$!pL&yptrA+3*MLLmJ zMC||Osm1F;ITpxUh}jsp3H`5RJjhNFFY>d95BXKZkL(i(AXef-=hCZ&dW!^+J|cC< zp&}uqpGX)PAQC~26p12(Ka{5yF=(iS;>d6jAM0ZTV%A5J%Yi!jAG-B#vo0r#}M<4*f@Q?g%nSH*QYi~=-nX1K)gpja9=syfy=^&mUArX-%a-B#FiHgLLTSSsbOeBR&b4tRMhT=|g zWmwhsAZF!9S&R*cd0A?p)p~7(Y!GQgHizH&X9?wyUqxDweIl)h z)#6EJSyTx=7XFj^rwQ8JL&g117TF?_L%tDdLB1DhMYf8xA=^dr$POdL_1_NdHiQ(AJtCdR zUJ?6AE<6!8((7aAh37#I6!9X5IE4OvP+teJ{X+VS1dzi;s*$5af=H!E9WqQLgdFFT zge%0#KM^vYAcP5B;0(DU$b}+NmoTGpq|S+o~&EgJ)AF5BW4j5=*+#z`Q+J8t1}UE$^x_+ zhxoXYmcNo3q_Y@eJ_-oZYBrKE&B8Q$1~QZ8=l^Z^6fs8@p^(+;Tvib>gAtSQajfSf z=IH&%c#$N1O+2bvlOaEwul6gZ$#>l??pn$){^w> zf5Omq2}O_{B2i?wNDSE{5=ZumB$53hDWuo`lxE1?wf{*&2R7%I+p7l-NbQebYYiQ1 zyT+D()H*ZyM(dXPS6ADo4aj~wWwrGIf8yuA&mDQv0qJ#D^3NXMw(su~J$$M)oj+Vq z{LSh)-`bP<)G)Pfe%bl+djC82q60Go&KYm>gU{y_|2*P%{5i;Q2ZGi;+dE#_-f{6L*Wp_WXYB46^3$$u?g5hq4BWrH z!*}=CFMs;YmFd1Nel0ls=RISsyLWeZ_}qWq#!;2GSGopQ^}D2E)Q+EAt_iz4E_C@u zZY|8+#(DBitNdx#lA&7*FE6P$qW_5g*0#+TSzj!v;8%z*bnQECdq?)pvDUnM?qHek z?ilB)+TL+j;irl>?(OB;vc2QuNTtj5`NV#wSJceBxR>jborm$`!s*j1_8-D|IBdGh rwI@{kP5Fi+`6cYW<80RnI}hXc=r?=MBGVX#IO@?7;s6ia5^4 delta 35402 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 diff --git a/include/nand_app_hack.h b/include/nand_app_hack.h deleted file mode 100644 index da5761d5..00000000 --- a/include/nand_app_hack.h +++ /dev/null @@ -1,63 +0,0 @@ - -// Ƃɂ.appt@CSRL𒼐ړǂݍރR[obN -//#define WAD_SRL_OFFSET 0x12C0 -#define WAD_SRL_OFFSET 0 -static FSResult ReadFromWad(FSArchive *arc, void *buffer, u32 offset, u32 length) -{ - FSFile *file = (FSFile *)FS_GetArchiveBase(arc); - (void)FS_SeekFile(file, (int)(WAD_SRL_OFFSET + offset), FS_SEEK_SET); - return (FS_ReadFile(file, buffer, (int)length) >= 0) ? - FS_RESULT_SUCCESS : FS_GetResultCode(file); -} -// w̃^CgIDŋNNANDAvłƉ肵"rom"A[JCuu -static BOOL FS_IdentifyTitle(u32 titleLo) -{ - BOOL retval = FALSE; - static struct - { - BOOL initialized; - FSFile file[1]; - } - context; - if (!context.initialized) - { - context.initialized = TRUE; -// if (OS_GetBootType() == OS_BOOTTYPE_NAND) - { - char path[FS_ENTRY_LONGNAME_MAX]; -/* STD_TSPrintf(path, "nand:/title_e/00010001/%02X%02X%02X%02X/content/12123434.app", - ((titleLo / 1000) % 10) + '0', - ((titleLo / 100) % 10) + '0', - ((titleLo / 10) % 10) + '0', - ((titleLo / 1) % 10) + '0'); -*/ - STD_TSPrintf(path, "nand:/title/00010001/%08X/content/12123434.app", titleLo ); - if (!FS_IsAvailable()) - { - FS_Init(FS_DMA_NOT_USE); - } - if (FS_OpenFileEx(context.file, path, FS_FILEMODE_R)) - { - CARDRomHeader header[1]; - (void)FS_SeekFile(context.file, (int)(WAD_SRL_OFFSET + 0), FS_SEEK_SET); - if (FS_ReadFile(context.file, header, sizeof(header)) == sizeof(header)) - { - FSArchive *arc = FS_FindArchive("rom", 3); - (void)FS_UnloadArchive(arc); - if (FS_LoadArchive(arc, (u32)context.file, - header->fat.offset, header->fat.length, - header->fnt.offset, header->fnt.length, - ReadFromWad, NULL)) - { - retval = TRUE; - } - } - if (!retval) - { - (void)FS_CloseFile(context.file); - } - } - } - } - return retval; -} diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index 7204ab76..82bf9ada 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -102,13 +102,14 @@ typedef struct SYSM_work { vu16 isOnDebugger :1; // fobK삩H vu16 isExistCard :1; // LNTR/TWLJ[h݂邩H vu16 isCardStateChanged :1; // J[hԍXVtO - vu16 isLoadSucceeded :1; + vu16 isLoadSucceeded :1; // Av[hH + vu16 isCardBoot :1; // J[hu[gH #ifdef DEBUG_USED_CARD_SLOT_B_ vu16 isValidCardBanner :1; vu16 is1stCardChecked :1; - vu16 rsv :5; + vu16 rsv :4; #else - vu16 rsv :7; + vu16 rsv :6; #endif u16 cardHeaderCrc16; // J[hoɎZoROMwb_CRC16iARM9ŃRs[Ďgp鑤j