・アプリへ引き渡すタイトルリストの作成処理手順を変更。romヘッダ情報読み込み処理をバナー読み込み処理に組み込み。

・スクロールバーの操作感変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1616 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-06-12 05:14:03 +00:00
parent 22e68de023
commit 748c81ca26
5 changed files with 211 additions and 99 deletions

View File

@ -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;
} }

View File

@ -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時間計測
// 時間計測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時間計測
#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時間計測
// 時間計測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時間計測
#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フレームじゃ終わらん。

View File

@ -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;
} }

View File

@ -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 );

View File

@ -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
// 状態チェック // 状態チェック