diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c index c7701a75..c51e2fc4 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/mountInfo.c @@ -41,6 +41,7 @@ void SYSM_SetBootAppMountInfo( TitleProperty *pBootTitle ); static void SYSMi_SetBootSRLPath( OSBootType bootType, NAMTitleId titleID ); static void SYSMi_SetMountInfoCore( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pSrc ); static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); +static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ); // global variable------------------------------------------------------------- @@ -84,9 +85,10 @@ void SYSMi_SetLauncherMountInfo( void ) // SYSMi_SetBootSRLPath( OS_BOOTTYPE_NAND, titleID ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。 // セーブデータ有無によるマウント情報の編集 - SYSMi_ModifySaveDataMount( OS_BOOTTYPE_NAND, - titleID, - &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); + // ※このタイミングではFSは動かせないので、FSを使わない特別版で対応。 + SYSMi_ModifySaveDataMountForLauncher( OS_BOOTTYPE_NAND, + titleID, + &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ] ); // マウント情報のセット SYSMi_SetMountInfoCore( OS_BOOTTYPE_NAND, @@ -233,3 +235,47 @@ static void SYSMi_ModifySaveDataMount( OSBootType bootType, NAMTitleId titleID, } } + +// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。 +static void SYSMi_ModifySaveDataMountForLauncher( OSBootType bootType, NAMTitleId titleID, OSMountInfo *pMountTgt ) +{ + int i; + u32 titleID_Hi = (u32)( titleID >> 32 ); // u64で論理演算はできない? + + // ※カードからブートされた場合でも、titleIDが"NANDアプリ"の場合は、セーブデータをマウントするようにしている。 + + // セーブデータ有無を判定して、パスをセット + if( ( ( bootType == OS_BOOTTYPE_NAND ) && // NANDアプリがNANDからブートされた時 + ( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) ) || + ( ( bootType == OS_BOOTTYPE_ROM ) && // ISデバッガ上で、NANDアプリがROM からブートされた時 + ( titleID_Hi & TITLEID_HI_MEDIA_NAND_FLAG ) && + ( SYSMi_GetWork()->isOnDebugger ) ) + ) { + char saveFilePath[ 2 ][ FS_ENTRY_LONGNAME_MAX ]; + u32 saveDataSize[ 2 ]; + saveDataSize[ 0 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->private_save_data_size; + saveDataSize[ 1 ] = (( ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF)->public_save_data_size; + + // セーブデータのファイルパスを取得 + STD_TSNPrintf( saveFilePath[ 0 ], FS_ENTRY_LONGNAME_MAX, + "nand:/title/%08x/%08x/data/private.sav", (u32)( titleID >> 32 ), titleID ); + STD_TSNPrintf( saveFilePath[ 1 ], FS_ENTRY_LONGNAME_MAX, + "nand:/title/%08x/%08x/data/public.sav", (u32)( titleID >> 32 ), titleID ); + + // "ROMヘッダのNANDセーブファイルサイズ > 0" かつ そのファイルを開ける場合のみマウント情報を登録 + for( i = 0; i < 2; i++ ) { + if( saveDataSize[ i ] ) { + STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN ); + }else { + pMountTgt->drive[ 0 ] = 0; + } + pMountTgt++; + } + }else { + // タイトルID指定なしのカードアプリの場合は、セーブデータ無効 + 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 23dc7242..dd8aeb85 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -218,7 +218,8 @@ static TitleProperty *SYSMi_CheckShortcutBoot( void ) // 検査カード起動 //----------------------------------------------------- if( SYSM_IsExistCard() ) { - if( SYSMi_GetWork()->isOnDebugger || + if( ( SYSMi_GetWork()->isOnDebugger && // ISデバッガが有効かつJTAGがまだ有効でない時 + !( *(u8 *)( HW_SYS_CONF_BUF + HWi_WSYS09_OFFSET ) & HWi_WSYS09_JTAG_CPUJE_MASK ) ) || SYSM_IsInspectCard() || ( ( PAD_Read() & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) == PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) @@ -724,6 +725,7 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle ) // TWL-ROMヘッダ情報の再配置 MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_TWL_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); MI_CpuCopyFast( (void *)(OS_TWL_HEADER_PRELOAD_MMEM), (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + // NTR-ROMヘッダ情報の再配置は、rebootライブラリで行う。 } } } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index c7bc9dae..395b1919 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -75,10 +75,10 @@ void TwlMain( void ) OSTick start, end = 0; BOOL direct_boot = FALSE; - OS_Init(); // システムメニュー初期化---------- - SYSM_SetArena(); - SYSM_Init( Alloc, Free ); // OS_Initは、本関数内でコールしているので、コールする必要なし。 + SYSM_Init( Alloc, Free ); // OS_Initの前でコールする必要あり。 + OS_Init(); + SYSM_SetArena(); // OS_Initの後でコールする必要あり。 // OS初期化------------------------ OS_InitTick();