From 748c81ca265ce13c8d373ad82f1571d89a882194 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Thu, 12 Jun 2008 05:14:03 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=A2=E3=83=97=E3=83=AA=E3=81=B8?= =?UTF-8?q?=E5=BC=95=E3=81=8D=E6=B8=A1=E3=81=99=E3=82=BF=E3=82=A4=E3=83=88?= =?UTF-8?q?=E3=83=AB=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AE=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E5=87=A6=E7=90=86=E6=89=8B=E9=A0=86=E3=82=92=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=80=82rom=E3=83=98=E3=83=83=E3=83=80=E6=83=85=E5=A0=B1?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=81=BF=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E3=83=90=E3=83=8A=E3=83=BC=E8=AA=AD=E3=81=BF=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AB=E7=B5=84=E3=81=BF=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=80=82=20=E3=83=BB=E3=82=B9=E3=82=AF=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=83=90=E3=83=BC=E3=81=AE=E6=93=8D=E4=BD=9C=E6=84=9F?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=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@1616 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../banner/ARM9/src/banner.c | 35 ++- .../sysmenu/ARM9/src/title.c | 202 +++++++++++------- .../Launcher/ARM9/src/launcher.c | 59 ++++- include/sysmenu/banner.h | 3 +- .../sysmenu/sysmenu_lib/common/sysmenu_api.h | 11 + 5 files changed, 211 insertions(+), 99 deletions(-) diff --git a/build/libraries_sysmenu/banner/ARM9/src/banner.c b/build/libraries_sysmenu/banner/ARM9/src/banner.c index 3e6abcf7..7324e7af 100644 --- a/build/libraries_sysmenu/banner/ARM9/src/banner.c +++ b/build/libraries_sysmenu/banner/ARM9/src/banner.c @@ -65,7 +65,7 @@ BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pBanner ) // NANDアプリバナーリード -BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) +BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst, TitleListMakerInfo *pTitleListMakerInfo ) { #define PATH_LENGTH 1024 @@ -77,7 +77,8 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) BOOL bSuccess; char path[PATH_LENGTH]; s32 readLen; - s32 offset; + u32 offset; + ROM_Header_Short hs; FS_InitFile(file); @@ -113,31 +114,19 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) OS_TPrintf( "OpenFileEX : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); start = OS_GetTick(); #endif - - // ROMヘッダのバナーデータオフセットを読み込む - bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET); - if( ! bSuccess ) - { - OS_TPrintf("BANNER_GetNandTitleList failed: cant seek file(0)\n"); - FS_CloseFile(file); - return FALSE; - } -#if (MEASURE_BANNER_LOAD_TIME == 1) - OS_TPrintf( "FS_SeekFile offset: %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); - start = OS_GetTick(); -#endif - - readLen = FS_ReadFile(file, &offset, sizeof(offset)); - if( readLen != sizeof(offset) ) + readLen = FS_ReadFile(file, &hs, sizeof(hs)); + if( readLen != sizeof(hs) ) { OS_TPrintf("BANNER_GetNandTitleList failed: cant read file\n"); FS_CloseFile(file); return FALSE; } + + offset = hs.banner_offset; #if (MEASURE_BANNER_LOAD_TIME == 1) - OS_TPrintf( "FS_ReadFile offset : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); + OS_TPrintf( "FS_ReadFile header : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); #endif // バナーが存在する場合のみリード @@ -147,7 +136,7 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) start = OS_GetTick(); #endif - bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET); + bSuccess = FS_SeekFile(file, (s32)offset, FS_SEEK_SET); if( ! bSuccess ) { OS_TPrintf("BANNER_GetNandTitleList failed: cant seek file(offset)\n"); @@ -237,6 +226,12 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ) } + // タイトルリスト用情報の生成 + if(!SYSM_MakeTitleListMakerInfoFromHeader( pTitleListMakerInfo, &hs )) + { + return FALSE; + } + return TRUE; } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index b794483c..7964ab2b 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -103,6 +103,7 @@ static BOOL s_loadForcibly = FALSE; static OSMessageQueue s_msgQ; static OSMessage s_msgArray[SYSM_TITLE_MESSAGE_ARRAY_MAX]; +static TitleListMakerInfo *s_pTitleListMakerInfo = NULL; static NAMTitleId *s_pTitleIDList = NULL; static int s_listLength = 0; @@ -370,7 +371,8 @@ BOOL SYSM_InitNandTitleList( void ) s_listLength = NAM_GetNumTitles(); OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) ); s_pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * s_listLength ); - if( s_pTitleIDList == NULL ) { + s_pTitleListMakerInfo = SYSM_Alloc( sizeof(TitleListMakerInfo) * s_listLength ); + if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL ) { OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ ); return FALSE; } @@ -384,11 +386,80 @@ BOOL SYSM_InitNandTitleList( void ) // NANDアプリリストの解放 void SYSM_FreeNandTitleList( void ) { - if(s_pTitleIDList != NULL) + if( s_pTitleIDList != NULL) { SYSM_Free( s_pTitleIDList ); s_pTitleIDList = NULL; } + if(s_pTitleListMakerInfo != NULL ) + { + SYSM_Free( s_pTitleListMakerInfo ); + s_pTitleListMakerInfo = NULL; + } +} + +static BOOL MakeTitleListMakerInfoFromTitleID( TitleListMakerInfo *info, OSTitleId titleID ) +{ + ROM_Header_Short e_hs; + FSFile file[1]; + char path[256]; + BOOL bSuccess; + s32 readLen; +#if (MEASURE_MAKELIST_TIME == 1) + OSTick prev; +#endif + + // 無効なTitleID または、DataOnlyアプリはスキップ + if( (titleID == NULL) || ( titleID & TITLE_ID_DATA_ONLY_FLAG_MASK ) ) + { + return FALSE; + } + // romヘッダ読み込み + +#if (MEASURE_MAKELIST_TIME == 1) + // 時間計測1 + prev = OS_GetTick(); +#endif + + NAM_GetTitleBootContentPathFast(path, titleID); + +#if (MEASURE_MAKELIST_TIME == 1) + OS_TPrintf("SYSMi_makeTitleIdList : NAM_GetTitleBootContentPathFast %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - prev)); + // end時間計測1 + + // 時間計測2 + prev = OS_GetTick(); +#endif + + FS_InitFile( file ); + bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); + if( ! bSuccess ) + { + OS_TPrintf("SYSMi_makeTitleIdList failed: cant open file(%s)\n",path); + FS_CloseFile(file); + return FALSE; + } + bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET); + if( ! bSuccess ) + { + OS_TPrintf("SYSMi_makeTitleIdList failed: cant seek file(0)\n"); + FS_CloseFile(file); + return FALSE; + } + readLen = FS_ReadFile(file, &e_hs, (s32)sizeof(e_hs)); + if( readLen != (s32)sizeof(e_hs) ) + { + OS_TPrintf("SYSMi_makeTitleIdList failed: cant read file(%p, %d, %d, %d)\n", e_hs, 0, sizeof(e_hs), readLen); + FS_CloseFile(file); + return FALSE; + } + FS_CloseFile(file); + // end時間計測2 +#if (MEASURE_MAKELIST_TIME == 1) + OS_TPrintf("SYSMi_makeTitleIdList : read header. %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - prev)); +#endif + + return SYSM_MakeTitleListMakerInfoFromHeader( info, &e_hs); } // ローンチ対象となるNANDタイトルリストの取得 @@ -403,21 +474,29 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum ) int validNum = 0; NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];// ローンチ可能なタイトルリストの一時置き場 - if( s_pTitleIDList == NULL ) return -1; + if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL ) return -1; // 取得したタイトルがローンチ対象かどうかをチェック for( l = 0; l < s_listLength; l++ ) { // "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加 if( ( s_pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) { titleIDArray[ validNum ] = s_pTitleIDList[ l ]; - BANNER_ReadBannerFromNAND( s_pTitleIDList[ l ], &s_bannerBuf[ validNum ] ); + BANNER_ReadBannerFromNAND( s_pTitleIDList[ l ], &s_bannerBuf[ validNum ], &s_pTitleListMakerInfo[l] ); validNum++; if( !( validNum < LAUNCHER_TITLE_LIST_NUM - 1 ) )// 最大(LAUNCHER_TITLE_LIST_NUM - 1)まで { break; } + }else + { + MakeTitleListMakerInfoFromTitleID( &s_pTitleListMakerInfo[l], s_pTitleIDList[ l ] ); } } + // 画面に表示できる以上のNANDタイトルが存在する場合、それらについてタイトルリスト作成用情報を生成 + for( ; l高速化 OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST; ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF; int l; u8 count = 0; - int max = ( s_listLength < OS_TITLEIDLIST_MAX ) ? s_listLength : OS_TITLEIDLIST_MAX; - OSTick start; -#if (MEASURE_MAKELIST_TIME == 1) - OSTick prev; -#endif + int max = ( s_listLength < OS_TITLEIDLIST_MAX-1 ) ? s_listLength : OS_TITLEIDLIST_MAX-1; + OSTick start; // 時間計測総合 start = OS_GetTick(); - if( s_pTitleIDList == NULL ) + if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL ) { OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_InitNandTitleList() is not called.\n"); return; @@ -1654,17 +1729,16 @@ static void SYSMi_makeTitleIdList( void ) for(l=-1;ltitleID; }else { - // 無効なTitleID または、DataOnlyアプリはスキップ - if( (s_pTitleIDList[l] == NULL) || ( s_pTitleIDList[l] & TITLE_ID_DATA_ONLY_FLAG_MASK ) ) - { - continue; - } - // romヘッダ読み込み - -#if (MEASURE_MAKELIST_TIME == 1) - // 時間計測1 - prev = OS_GetTick(); -#endif - - NAM_GetTitleBootContentPathFast(path, s_pTitleIDList[l]); - -#if (MEASURE_MAKELIST_TIME == 1) - OS_TPrintf("SYSMi_makeTitleIdList : NAM_GetTitleBootContentPathFast %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - prev)); - // end時間計測1 - - // 時間計測2 - prev = OS_GetTick(); -#endif - - FS_InitFile( file ); - bSuccess = FS_OpenFileEx(file, path, FS_FILEMODE_R); - if( ! bSuccess ) - { - OS_TPrintf("SYSMi_makeTitleIdList failed: cant open file(%s)\n",path); - FS_CloseFile(file); - continue; - } - bSuccess = FS_SeekFile(file, 0x00000000, FS_SEEK_SET); - if( ! bSuccess ) - { - OS_TPrintf("SYSMi_makeTitleIdList failed: cant seek file(0)\n"); - FS_CloseFile(file); - continue; - } - readLen = FS_ReadFile(file, &e_hs, (s32)sizeof(e_hs)); - if( readLen != (s32)sizeof(e_hs) ) - { - OS_TPrintf("SYSMi_makeTitleIdList failed: cant read file(%p, %d, %d, %d)\n", e_hs, 0, sizeof(e_hs), readLen); - FS_CloseFile(file); - continue; - } - FS_CloseFile(file); - pe_hs = (ROM_Header_Short *)&e_hs; - // end時間計測2 -#if (MEASURE_MAKELIST_TIME == 1) - OS_TPrintf("SYSMi_makeTitleIdList : read header. %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - prev)); -#endif + p_info = &s_pTitleListMakerInfo[l]; + id = s_pTitleIDList[l]; } for(m=0;mmaker_code[m] != pe_hs->maker_code[m]) + if(hs->maker_code[m] != p_info->makerCode[m]) { same_maker_code = FALSE; } } + // 無効なTitleID または、DataOnlyアプリはスキップ + if( (id == NULL) || ( id & TITLE_ID_DATA_ONLY_FLAG_MASK ) ) + { + continue; + } + // ランチャーはリストに入れない - gamecode = (char *)&(pe_hs->titleID); + gamecode = (char *)&(id); if( ( 0 == STD_CompareNString( &gamecode[1], "ANH", 3 ) ) #ifdef DEV_UIG_LAUNCHER || ( ( 0 == STD_CompareNString( &gamecode[1], "AN4", 3 ) ) && ( SCFG_GetBondingOption() != 0 ) ) @@ -1751,18 +1786,18 @@ static void SYSMi_makeTitleIdList( void ) ( same_maker_code ) ) { // セキュアアプリのデータはマウントさせない - if( !(pe_hs->titleID & TITLE_ID_SECURE_FLAG_MASK) ) + if( !(id & TITLE_ID_SECURE_FLAG_MASK) ) { // リストに追加 - list->TitleID[count] = pe_hs->titleID; + list->TitleID[count] = id; // sameMakerFlagをON list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8)); // Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON - if(pe_hs->public_save_data_size != 0) + if(p_info->public_save_data_size != 0) { list->publicFlag[count/8] |= (u8)(0x1 << (count%8)); } - if(pe_hs->private_save_data_size != 0) + if(p_info->private_save_data_size != 0) { list->privateFlag[count/8] |= (u8)(0x1 << (count%8)); } @@ -1770,10 +1805,10 @@ static void SYSMi_makeTitleIdList( void ) } // ジャンプ可能ならば - if( pe_hs->permit_landing_normal_jump ) + if( p_info->permit_landing_normal_jump ) { // リストに追加してジャンプ可能フラグON - list->TitleID[count] = pe_hs->titleID; + list->TitleID[count] = id; list->appJumpFlag[count/8] |= (u8)(0x1 << (count%8)); } @@ -1788,6 +1823,23 @@ static void SYSMi_makeTitleIdList( void ) OS_TPrintf("SYSMi_makeTitleIdList : total %dms\n",OS_TicksToMilliSeconds(OS_GetTick() - start)); } +BOOL SYSM_MakeTitleListMakerInfoFromHeader( TitleListMakerInfo *info, ROM_Header_Short *hs) +{ + int l; + if( info == NULL || hs == NULL ) + { + return FALSE; + } + for(l=0;lmakerCode[l] = hs->maker_code[l]; + } + info->public_save_data_size = hs->public_save_data_size; + info->private_save_data_size = hs->private_save_data_size; + info->permit_landing_normal_jump = ( hs->permit_landing_normal_jump ? TRUE : FALSE ); + return TRUE; +} + #if 0 // 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 97215453..e69119c7 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -646,16 +646,35 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList ) // スクロールバーによるスクロール static void MoveByScrollBar( void ) { + static double vx = 0; + // スクロールバーによるスクロール { static BOOL holding = FALSE; static int dx; + static const int list_len = 4; + static int list_x[list_len]; + int l; - if(!holding) + if(!holding && vx == 0) { bar_left = (int)(BAR_ZERO_X + (ITEMDOT_PER_FRAME * s_csr)); } + // 慣性移動 + if(vx!=0) + { + bar_left += (int)vx; + s_csr = (u16)((bar_left - BAR_ZERO_X) * FRAME_PER_ITEMDOT); + vx = vx * 0.9; + if(vx*vx < 1) + { + int det = s_csr % FRAME_PER_SELECT; + csr_v = (det == 0 ? 0 : (vx>0 ? 1 : -1) ); + vx = 0; + } + } + if(tpd.disp.touch) { if(holding) @@ -669,11 +688,23 @@ static void MoveByScrollBar( void ) bar_left = tpd.disp.x - dx - BAR_LOOSENESS; } s_csr = (u16)((bar_left - BAR_ZERO_X) * FRAME_PER_ITEMDOT); + + // 移動履歴追記 + for( l=0; l #include +#include #ifdef __cplusplus extern "C" { @@ -35,7 +36,7 @@ extern "C" { BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pDst ); // NANDからのバナーリード -BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst ); +BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst, TitleListMakerInfo *pTitleListMakerInfo ); // バナーのフォーマットが正しいかチェック(NTRバナー、TWLバナーのどちらでもOK) BOOL BANNER_CheckBanner( TWLBannerFile *pBanner ); diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h index deb7363f..7fe22f30 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_api.h @@ -57,6 +57,14 @@ typedef struct TitleProperty { // TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。) }TitleProperty; +// タイトルリスト作成用情報構造体 +typedef struct TitleListMakerInfo { + char makerCode[MAKER_CODE_MAX]; + u32 public_save_data_size; + u32 private_save_data_size; + BOOL permit_landing_normal_jump; +}TitleListMakerInfo; + // アプリ認証結果 typedef enum AuthResult { AUTH_RESULT_SUCCEEDED = 0, @@ -142,6 +150,9 @@ extern s32 SYSMi_getCheckTitleLaunchRightsResult( void ); // CheckTitleLaun extern BOOL SYSM_IsLoadTitlePaused(void); // ローディングスレッドが一時停止しているか? extern void SYSM_ResumeLoadingThread( BOOL force ); // ローディングスレッドが一時停止していたら再開 +extern BOOL SYSM_MakeTitleListMakerInfoFromHeader( TitleListMakerInfo *info, ROM_Header_Short *hs); + // タイトルリスト作成用情報をヘッダ情報から作成 + #endif // 状態チェック