・アプリへ引き渡すタイトルリストの作成処理手順を変更。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アプリバナーリード
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;
}

View File

@ -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時間計測
// 時間計測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タイトルリストの取得
@ -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<s_listLength; l++ )
{
MakeTitleListMakerInfoFromTitleID( &s_pTitleListMakerInfo[l], s_pTitleIDList[ l ] );
}
// 念のため残り領域を0クリア
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
@ -1624,20 +1703,16 @@ static void SYSMi_makeTitleIdList( void )
{
// [TODO:]現在ブート不可タイトルについても入れるようにしているが
// これで良いのか?
// カード以外はもっと早いタイミングで作れるのでは?->高速化
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;l<max;l++) // -1はカードアプリの特別処理用
{
ROM_Header_Short e_hs;
ROM_Header_Short *pe_hs;
int m;
BOOL same_maker_code = TRUE;
char path[256];
FSFile file[1];
BOOL bSuccess;
s32 readLen;
char *gamecode;
TitleListMakerInfo *p_info;
TitleListMakerInfo info;
OSTitleId id;
if(l==-1)
{
ROM_Header_Short *pe_hs;
// カードアプリ
if(SYSM_IsExistCard())
{
@ -1673,70 +1747,31 @@ static void SYSMi_makeTitleIdList( void )
{
continue;
}
p_info = &info;
SYSM_MakeTitleListMakerInfoFromHeader( p_info, pe_hs);
id = pe_hs->titleID;
}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時間計測
// 時間計測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
p_info = &s_pTitleListMakerInfo[l];
id = s_pTitleIDList[l];
}
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;
}
}
// 無効な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;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
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。

View File

@ -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<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))
{
holding = TRUE;
dx = tpd.disp.x - bar_left;
// 移動履歴初期化
for( l=0; l<list_len; l++ )
{
list_x[l] = tpd.disp.x;
}
}
}
else
@ -682,15 +713,37 @@ static void MoveByScrollBar( void )
{
int det = s_csr % FRAME_PER_SELECT;
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 )
{
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( s_csr < 0 ) s_csr = 0;
}

View File

@ -20,6 +20,7 @@
#include <twl/types.h>
#include <twl/os/common/banner.h>
#include <sysmenu.h>
#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 );

View File

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