mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・アプリへ引き渡すタイトルリストの作成処理手順を変更。romヘッダ情報読み込み処理をバナー読み込み処理に組み込み。
・スクロールバーの操作感変更。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1616 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
22e68de023
commit
748c81ca26
@ -65,7 +65,7 @@ BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pBanner )
|
|||||||
|
|
||||||
|
|
||||||
// NANDアプリバナーリード
|
// NANDアプリバナーリード
|
||||||
BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst )
|
BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst, TitleListMakerInfo *pTitleListMakerInfo )
|
||||||
{
|
{
|
||||||
#define PATH_LENGTH 1024
|
#define PATH_LENGTH 1024
|
||||||
|
|
||||||
@ -77,7 +77,8 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst )
|
|||||||
BOOL bSuccess;
|
BOOL bSuccess;
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
s32 readLen;
|
s32 readLen;
|
||||||
s32 offset;
|
u32 offset;
|
||||||
|
ROM_Header_Short hs;
|
||||||
|
|
||||||
FS_InitFile(file);
|
FS_InitFile(file);
|
||||||
|
|
||||||
@ -114,30 +115,18 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst )
|
|||||||
start = OS_GetTick();
|
start = OS_GetTick();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ROMヘッダのバナーデータオフセットを読み込む
|
readLen = FS_ReadFile(file, &hs, sizeof(hs));
|
||||||
bSuccess = FS_SeekFile(file, 0x68, FS_SEEK_SET);
|
if( readLen != sizeof(hs) )
|
||||||
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) )
|
|
||||||
{
|
{
|
||||||
OS_TPrintf("BANNER_GetNandTitleList failed: cant read file\n");
|
OS_TPrintf("BANNER_GetNandTitleList failed: cant read file\n");
|
||||||
FS_CloseFile(file);
|
FS_CloseFile(file);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offset = hs.banner_offset;
|
||||||
|
|
||||||
#if (MEASURE_BANNER_LOAD_TIME == 1)
|
#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
|
#endif
|
||||||
|
|
||||||
// バナーが存在する場合のみリード
|
// バナーが存在する場合のみリード
|
||||||
@ -147,7 +136,7 @@ BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst )
|
|||||||
start = OS_GetTick();
|
start = OS_GetTick();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bSuccess = FS_SeekFile(file, offset, FS_SEEK_SET);
|
bSuccess = FS_SeekFile(file, (s32)offset, FS_SEEK_SET);
|
||||||
if( ! bSuccess )
|
if( ! bSuccess )
|
||||||
{
|
{
|
||||||
OS_TPrintf("BANNER_GetNandTitleList failed: cant seek file(offset)\n");
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -103,6 +103,7 @@ static BOOL s_loadForcibly = FALSE;
|
|||||||
static OSMessageQueue s_msgQ;
|
static OSMessageQueue s_msgQ;
|
||||||
static OSMessage s_msgArray[SYSM_TITLE_MESSAGE_ARRAY_MAX];
|
static OSMessage s_msgArray[SYSM_TITLE_MESSAGE_ARRAY_MAX];
|
||||||
|
|
||||||
|
static TitleListMakerInfo *s_pTitleListMakerInfo = NULL;
|
||||||
static NAMTitleId *s_pTitleIDList = NULL;
|
static NAMTitleId *s_pTitleIDList = NULL;
|
||||||
static int s_listLength = 0;
|
static int s_listLength = 0;
|
||||||
|
|
||||||
@ -370,7 +371,8 @@ BOOL SYSM_InitNandTitleList( void )
|
|||||||
s_listLength = NAM_GetNumTitles();
|
s_listLength = NAM_GetNumTitles();
|
||||||
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
|
||||||
s_pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * s_listLength );
|
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__ );
|
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -384,11 +386,80 @@ BOOL SYSM_InitNandTitleList( void )
|
|||||||
// NANDアプリリストの解放
|
// NANDアプリリストの解放
|
||||||
void SYSM_FreeNandTitleList( void )
|
void SYSM_FreeNandTitleList( void )
|
||||||
{
|
{
|
||||||
if(s_pTitleIDList != NULL)
|
if( s_pTitleIDList != NULL)
|
||||||
{
|
{
|
||||||
SYSM_Free( s_pTitleIDList );
|
SYSM_Free( s_pTitleIDList );
|
||||||
s_pTitleIDList = NULL;
|
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タイトルリストの取得
|
// ローンチ対象となるNANDタイトルリストの取得
|
||||||
@ -403,21 +474,29 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
|
|||||||
int validNum = 0;
|
int validNum = 0;
|
||||||
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];// ローンチ可能なタイトルリストの一時置き場
|
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++ ) {
|
for( l = 0; l < s_listLength; l++ ) {
|
||||||
// "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加
|
// "Not Launch"でない かつ "Data Only"でない なら有効なタイトルとしてリストに追加
|
||||||
if( ( s_pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) {
|
if( ( s_pTitleIDList[ l ] & ( TITLE_ID_NOT_LAUNCH_FLAG_MASK | TITLE_ID_DATA_ONLY_FLAG_MASK ) ) == 0 ) {
|
||||||
titleIDArray[ validNum ] = s_pTitleIDList[ l ];
|
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++;
|
validNum++;
|
||||||
if( !( validNum < LAUNCHER_TITLE_LIST_NUM - 1 ) )// 最大(LAUNCHER_TITLE_LIST_NUM - 1)まで
|
if( !( validNum < LAUNCHER_TITLE_LIST_NUM - 1 ) )// 最大(LAUNCHER_TITLE_LIST_NUM - 1)まで
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
MakeTitleListMakerInfoFromTitleID( &s_pTitleListMakerInfo[l], s_pTitleIDList[ l ] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 画面に表示できる以上のNANDタイトルが存在する場合、それらについてタイトルリスト作成用情報を生成
|
||||||
|
for( ; l<s_listLength; l++ )
|
||||||
|
{
|
||||||
|
MakeTitleListMakerInfoFromTitleID( &s_pTitleListMakerInfo[l], s_pTitleIDList[ l ] );
|
||||||
|
}
|
||||||
|
|
||||||
// 念のため残り領域を0クリア
|
// 念のため残り領域を0クリア
|
||||||
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
|
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
|
||||||
@ -1624,20 +1703,16 @@ static void SYSMi_makeTitleIdList( void )
|
|||||||
{
|
{
|
||||||
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
|
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
|
||||||
// これで良いのか?
|
// これで良いのか?
|
||||||
// カード以外はもっと早いタイミングで作れるのでは?->高速化
|
|
||||||
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
|
OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST;
|
||||||
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
|
||||||
int l;
|
int l;
|
||||||
u8 count = 0;
|
u8 count = 0;
|
||||||
int max = ( s_listLength < OS_TITLEIDLIST_MAX ) ? s_listLength : OS_TITLEIDLIST_MAX;
|
int max = ( s_listLength < OS_TITLEIDLIST_MAX-1 ) ? s_listLength : OS_TITLEIDLIST_MAX-1;
|
||||||
OSTick start;
|
OSTick start;
|
||||||
#if (MEASURE_MAKELIST_TIME == 1)
|
|
||||||
OSTick prev;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// 時間計測総合
|
// 時間計測総合
|
||||||
start = OS_GetTick();
|
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");
|
OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_InitNandTitleList() is not called.\n");
|
||||||
return;
|
return;
|
||||||
@ -1654,17 +1729,16 @@ static void SYSMi_makeTitleIdList( void )
|
|||||||
|
|
||||||
for(l=-1;l<max;l++) // -1はカードアプリの特別処理用
|
for(l=-1;l<max;l++) // -1はカードアプリの特別処理用
|
||||||
{
|
{
|
||||||
ROM_Header_Short e_hs;
|
|
||||||
ROM_Header_Short *pe_hs;
|
|
||||||
int m;
|
int m;
|
||||||
BOOL same_maker_code = TRUE;
|
BOOL same_maker_code = TRUE;
|
||||||
char path[256];
|
|
||||||
FSFile file[1];
|
|
||||||
BOOL bSuccess;
|
|
||||||
s32 readLen;
|
|
||||||
char *gamecode;
|
char *gamecode;
|
||||||
|
TitleListMakerInfo *p_info;
|
||||||
|
TitleListMakerInfo info;
|
||||||
|
OSTitleId id;
|
||||||
|
|
||||||
if(l==-1)
|
if(l==-1)
|
||||||
{
|
{
|
||||||
|
ROM_Header_Short *pe_hs;
|
||||||
// カードアプリ
|
// カードアプリ
|
||||||
if(SYSM_IsExistCard())
|
if(SYSM_IsExistCard())
|
||||||
{
|
{
|
||||||
@ -1673,70 +1747,31 @@ static void SYSMi_makeTitleIdList( void )
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
p_info = &info;
|
||||||
|
SYSM_MakeTitleListMakerInfoFromHeader( p_info, pe_hs);
|
||||||
|
id = pe_hs->titleID;
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
// 無効なTitleID または、DataOnlyアプリはスキップ
|
p_info = &s_pTitleListMakerInfo[l];
|
||||||
if( (s_pTitleIDList[l] == NULL) || ( s_pTitleIDList[l] & TITLE_ID_DATA_ONLY_FLAG_MASK ) )
|
id = s_pTitleIDList[l];
|
||||||
{
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(m=0;m<MAKER_CODE_MAX;m++)
|
for(m=0;m<MAKER_CODE_MAX;m++)
|
||||||
{
|
{
|
||||||
if(hs->maker_code[m] != pe_hs->maker_code[m])
|
if(hs->maker_code[m] != p_info->makerCode[m])
|
||||||
{
|
{
|
||||||
same_maker_code = FALSE;
|
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 ) )
|
if( ( 0 == STD_CompareNString( &gamecode[1], "ANH", 3 ) )
|
||||||
#ifdef DEV_UIG_LAUNCHER
|
#ifdef DEV_UIG_LAUNCHER
|
||||||
|| ( ( 0 == STD_CompareNString( &gamecode[1], "AN4", 3 ) ) && ( SCFG_GetBondingOption() != 0 ) )
|
|| ( ( 0 == STD_CompareNString( &gamecode[1], "AN4", 3 ) ) && ( SCFG_GetBondingOption() != 0 ) )
|
||||||
@ -1751,18 +1786,18 @@ static void SYSMi_makeTitleIdList( void )
|
|||||||
( same_maker_code ) )
|
( 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
|
// sameMakerFlagをON
|
||||||
list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8));
|
list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8));
|
||||||
// Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON
|
// 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));
|
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));
|
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
|
// リストに追加してジャンプ可能フラグON
|
||||||
list->TitleID[count] = pe_hs->titleID;
|
list->TitleID[count] = id;
|
||||||
list->appJumpFlag[count/8] |= (u8)(0x1 << (count%8));
|
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));
|
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;l<MAKER_CODE_MAX;l++)
|
||||||
|
{
|
||||||
|
info->makerCode[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
|
#if 0
|
||||||
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。
|
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。
|
||||||
|
|||||||
@ -646,16 +646,35 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList )
|
|||||||
// スクロールバーによるスクロール
|
// スクロールバーによるスクロール
|
||||||
static void MoveByScrollBar( void )
|
static void MoveByScrollBar( void )
|
||||||
{
|
{
|
||||||
|
static double vx = 0;
|
||||||
|
|
||||||
// スクロールバーによるスクロール
|
// スクロールバーによるスクロール
|
||||||
{
|
{
|
||||||
static BOOL holding = FALSE;
|
static BOOL holding = FALSE;
|
||||||
static int dx;
|
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));
|
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(tpd.disp.touch)
|
||||||
{
|
{
|
||||||
if(holding)
|
if(holding)
|
||||||
@ -669,11 +688,23 @@ static void MoveByScrollBar( void )
|
|||||||
bar_left = tpd.disp.x - dx - BAR_LOOSENESS;
|
bar_left = tpd.disp.x - dx - BAR_LOOSENESS;
|
||||||
}
|
}
|
||||||
s_csr = (u16)((bar_left - BAR_ZERO_X) * FRAME_PER_ITEMDOT);
|
s_csr = (u16)((bar_left - BAR_ZERO_X) * FRAME_PER_ITEMDOT);
|
||||||
|
|
||||||
|
// 移動履歴追記
|
||||||
|
for( l=0; l<list_len-1; l++ )
|
||||||
|
{
|
||||||
|
list_x[l] = list_x[l+1];
|
||||||
|
}
|
||||||
|
list_x[list_len-1] = tpd.disp.x;
|
||||||
}
|
}
|
||||||
else if(WithinRangeTP(bar_left+5-BAR_WIDTH/2, BAR_ZERO_Y+BAR_OFFSET,bar_left+5+BAR_WIDTH/2,BAR_ZERO_Y+BAR_OFFSET+BAR_HEIGHT,&tpd.disp))
|
else if(WithinRangeTP(bar_left+5-BAR_WIDTH/2, BAR_ZERO_Y+BAR_OFFSET,bar_left+5+BAR_WIDTH/2,BAR_ZERO_Y+BAR_OFFSET+BAR_HEIGHT,&tpd.disp))
|
||||||
{
|
{
|
||||||
holding = TRUE;
|
holding = TRUE;
|
||||||
dx = tpd.disp.x - bar_left;
|
dx = tpd.disp.x - bar_left;
|
||||||
|
// 移動履歴初期化
|
||||||
|
for( l=0; l<list_len; l++ )
|
||||||
|
{
|
||||||
|
list_x[l] = tpd.disp.x;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -682,15 +713,37 @@ static void MoveByScrollBar( void )
|
|||||||
{
|
{
|
||||||
int det = s_csr % FRAME_PER_SELECT;
|
int det = s_csr % FRAME_PER_SELECT;
|
||||||
holding = FALSE;
|
holding = FALSE;
|
||||||
csr_v = (det < FRAME_PER_SELECT/2) ? (det == 0 ? 0 : -1) : 1;
|
|
||||||
|
// 移動履歴から速度算出
|
||||||
|
for( l=1; l<list_len; l++ )
|
||||||
|
{
|
||||||
|
int ax = list_x[l] - list_x[l-1];
|
||||||
|
vx += (double)ax;
|
||||||
|
if(l == list_len-1 && ax == 0)
|
||||||
|
{
|
||||||
|
vx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vx /= (list_len-1);
|
||||||
|
if(vx == 0)
|
||||||
|
{
|
||||||
|
csr_v = (det < FRAME_PER_SELECT/2) ? (det == 0 ? 0 : -1) : 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// タッチパッドによるスクロール後の調整
|
// タッチパッドによるスクロール後の調整
|
||||||
if( BAR_ZERO_X + (ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1) < bar_left )
|
if( BAR_ZERO_X + (ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1) < bar_left )
|
||||||
|
{
|
||||||
bar_left = BAR_ZERO_X + (ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1);
|
bar_left = BAR_ZERO_X + (ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1);
|
||||||
if( bar_left < BAR_ZERO_X ) bar_left = BAR_ZERO_X;
|
vx = -vx;
|
||||||
|
}
|
||||||
|
if( bar_left < BAR_ZERO_X )
|
||||||
|
{
|
||||||
|
bar_left = BAR_ZERO_X;
|
||||||
|
vx = -vx;
|
||||||
|
}
|
||||||
if((LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT;
|
if((LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT;
|
||||||
if( s_csr < 0 ) s_csr = 0;
|
if( s_csr < 0 ) s_csr = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <twl/types.h>
|
#include <twl/types.h>
|
||||||
#include <twl/os/common/banner.h>
|
#include <twl/os/common/banner.h>
|
||||||
|
#include <sysmenu.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -35,7 +36,7 @@ extern "C" {
|
|||||||
BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pDst );
|
BOOL BANNER_ReadBannerFromCARD( u32 bannerOffset, TWLBannerFile *pDst );
|
||||||
|
|
||||||
// NANDからのバナーリード
|
// NANDからのバナーリード
|
||||||
BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst );
|
BOOL BANNER_ReadBannerFromNAND( OSTitleId titleID, TWLBannerFile *pDst, TitleListMakerInfo *pTitleListMakerInfo );
|
||||||
|
|
||||||
// バナーのフォーマットが正しいかチェック(NTRバナー、TWLバナーのどちらでもOK)
|
// バナーのフォーマットが正しいかチェック(NTRバナー、TWLバナーのどちらでもOK)
|
||||||
BOOL BANNER_CheckBanner( TWLBannerFile *pBanner );
|
BOOL BANNER_CheckBanner( TWLBannerFile *pBanner );
|
||||||
|
|||||||
@ -57,6 +57,14 @@ typedef struct TitleProperty { //
|
|||||||
TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
|
TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
|
||||||
}TitleProperty;
|
}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 {
|
typedef enum AuthResult {
|
||||||
AUTH_RESULT_SUCCEEDED = 0,
|
AUTH_RESULT_SUCCEEDED = 0,
|
||||||
@ -142,6 +150,9 @@ extern s32 SYSMi_getCheckTitleLaunchRightsResult( void ); // CheckTitleLaun
|
|||||||
extern BOOL SYSM_IsLoadTitlePaused(void); // ローディングスレッドが一時停止しているか?
|
extern BOOL SYSM_IsLoadTitlePaused(void); // ローディングスレッドが一時停止しているか?
|
||||||
extern void SYSM_ResumeLoadingThread( BOOL force ); // ローディングスレッドが一時停止していたら再開
|
extern void SYSM_ResumeLoadingThread( BOOL force ); // ローディングスレッドが一時停止していたら再開
|
||||||
|
|
||||||
|
extern BOOL SYSM_MakeTitleListMakerInfoFromHeader( TitleListMakerInfo *info, ROM_Header_Short *hs);
|
||||||
|
// タイトルリスト作成用情報をヘッダ情報から作成
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 状態チェック
|
// 状態チェック
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user