バナー関係およびタイトルリスト関係の処理をutilのmenuAppManagerに統合し、こちらを使うように変更

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1783 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yoshida_teruhisa 2008-07-04 05:23:56 +00:00
parent cd54aa1287
commit 209cecd327
6 changed files with 653 additions and 799 deletions

View File

@ -21,6 +21,7 @@
#include <firm/hw/ARM9/mmap_firm.h>
#include "internal_api.h"
#include "fs_wram.h"
#include <sysmenu/util_menuAppManager.h>
// define data-----------------------------------------------------------------
@ -84,7 +85,6 @@ typedef struct CalcSHA1CallbackArg
extern const u8 g_devPubKey[ 4 ][ 0x80 ];
// function's prototype-------------------------------------------------------
static s32 ReadFile( FSFile* pf, void* buffer, s32 size );
static void SYSMi_LoadTitleThreadFunc( TitleProperty *pBootTitle );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
@ -95,7 +95,7 @@ static BOOL SYSMi_AuthenticateHeader( TitleProperty *pBootTitle, ROM_Header *hea
// static variable-------------------------------------------------------------
static OSThread s_thread;
static OSThread s_auth_thread;
static TWLBannerFile s_bannerBuf[ LAUNCHER_TITLE_LIST_NUM ] ATTRIBUTE_ALIGN(32);
static TWLBannerFile s_card_bannerBuf;
static MbAuthCode s_authcode;
@ -107,16 +107,12 @@ 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;
static u8 *s_calc_hash = NULL;
static BOOL s_b_dev = FALSE;
static BOOL s_result_phase1 = FALSE;
static BOOL s_nand_title_list_maker_info_enabled = FALSE;
static u8 dht_buffer[DS_HASH_TABLE_SIZE] ATTRIBUTE_ALIGN(256);
static DHTFile *const dht = (DHTFile*)dht_buffer;
static const u8* hash0;
@ -276,14 +272,15 @@ static inline u16 SCFG_GetBondingOption(void)
// ============================================================================
// カードタイトルの取得
BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
TitleProperty *SYSM_GetCardTitleList( BOOL *changed )
{
BOOL retval = FALSE;
TitleProperty *pTitleList_Card = AMN_getTitlePropertyList();
if(changed) *changed = FALSE;
if(s_loadstart)
{
// ロード開始していたら、もうヘッダやタイトル情報は変更しない
return retval;
return pTitleList_Card;
}
// [TODO:] ROMヘッダの platform_code がNTR,TWL-HYB,TWL-LTD以外のもの
// region_codeが本体情報と違うもの
@ -304,20 +301,17 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
// バナーデータのリード
(void)SYSMi_CopyCardBanner();
pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
pTitleList_Card->pBanner = &s_card_bannerBuf;
AMN_stepBannerAnime(0, TRUE); // バナーカウンタセットしなおし
pTitleList_Card->flags.isValid = TRUE;
pTitleList_Card->flags.isAppLoadCompleted = FALSE;
pTitleList_Card->flags.isAppRelocate = TRUE;
pTitleList_Card->sub_info.exFlags = SYSM_GetCardRomHeader()->exFlags;
pTitleList_Card->sub_info.platform_code = SYSM_GetCardRomHeader()->platform_code;
MI_CpuCopy8( SYSM_GetCardRomHeader()->parental_control_rating_info, pTitleList_Card->sub_info.parental_control_rating_info, 0x10);
pTitleList_Card->sub_info.card_region_bitmap = SYSM_GetCardRomHeader()->card_region_bitmap;
pTitleList_Card->sub_info.agree_EULA_version = SYSM_GetCardRomHeader()->agree_EULA_version;
MI_CpuCopy8( SYSM_GetCardRomHeader(), AMN_getRomHeaderList(), sizeof(ROM_Header_Short) );
}else {
// ROMヘッダのクリア
MI_CpuClearFast( (void *)SYSM_APP_ROM_HEADER_BUF, SYSM_APP_ROM_HEADER_SIZE );
// バナーデータのクリア
MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) );
MI_CpuClearFast( &s_card_bannerBuf, sizeof(TWLBannerFile) );
}
SYSMi_GetWork()->flags.hotsw.isCardStateChanged = FALSE; // カード情報更新フラグを落とす
@ -327,10 +321,10 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
// タイトル情報フラグのセット
pTitleList_Card->flags.bootType = LAUNCHER_BOOTTYPE_ROM;
pTitleList_Card->titleID = *(u64 *)( &SYSM_GetCardRomHeader()->titleID_Lo );
retval = TRUE;
if(changed) *changed = TRUE;
}
return retval;
return pTitleList_Card;
}
// カードROMヘッダのARM7バッファからARM9バッファへのコピー
@ -358,7 +352,7 @@ BOOL SYSMi_CopyCardBanner( void )
if( SYSM_IsExistCard() ) {
// バナーデータのコピー
TWLBannerFile *pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
TWLBannerFile *pBanner = &s_card_bannerBuf;
if( SYSMi_GetWork()->flags.hotsw.isValidCardBanner ) {
DC_InvalidateRange( (void *)SYSM_CARD_BANNER_BUF, 0x3000 );
MI_CpuCopyFast( (void *)SYSM_CARD_BANNER_BUF, pBanner, sizeof(TWLBannerFile) );
@ -373,250 +367,33 @@ BOOL SYSMi_CopyCardBanner( void )
return retval;
}
// インポートされているすべてのNANDアプリを列挙したリストの準備
// SYSM_GetNandTitleListおよびSYSM_GetNandTitleListMakerInfo前に呼ぶ必要あり
BOOL SYSM_InitNandTitleList( void )
void SYSM_InitTitleList( void )
{
OSTick start;
if( s_pTitleIDList != NULL ) return TRUE;
// インポートされているタイトルの取得
start = OS_GetTick();
s_listLength = NAM_GetNumTitles();
OS_TPrintf( "NAM_GetNumTitles : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
s_pTitleIDList = SYSM_Alloc( sizeof(NAMTitleId) * s_listLength );
s_pTitleListMakerInfo = SYSM_Alloc( sizeof(TitleListMakerInfo) * s_listLength );
if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL ) {
OS_TPrintf( "%s: alloc error.\n", __FUNCTION__ );
return FALSE;
}
start = OS_GetTick();
(void)NAM_GetTitleList( s_pTitleIDList, (u32)s_listLength );
OS_TPrintf( "NAM_GetTitleList : %dus\n", OS_TicksToMicroSeconds( OS_GetTick() - start ) );
return TRUE;
AMN_init( SYSM_Alloc, SYSM_Free );
}
// NANDアプリリストの解放
void SYSM_FreeNandTitleList( void )
{
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はスキップ
if( titleID == NULL)
{
return FALSE;
}
// DataOnlyはTADからメーカーコードを読み出し、他の情報はOFFでリスト登録
if( titleID & TITLE_ID_DATA_ONLY_FLAG_MASK )
{
int l;
NAMTitleInfo naminfo;
// この関数で得られる情報は無検証なので改ざんの可能性があるが、メーカーコードのみの判定なので、速度を優先する。(2008.06.20吉岡)
// Fastつけないと一回300msぐらいかかる
NAM_ReadTitleInfoFast( &naminfo, titleID );
for(l=0;l<MAKER_CODE_MAX;l++)
{
info->makerCode[l] = ((char *)&naminfo.companyCode)[l];
//OS_TPrintf("companyCode[%d]::::%c\n",l,((char *)&naminfo.companyCode)[l]);
}
info->public_save_data_size = 0;
info->private_save_data_size = 0;
info->permit_landing_normal_jump = FALSE;
return TRUE;
}
// 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);
}
// SYSM_InitNandTitleListを事前に呼ぶ必要あり
// この関数か、SYSM_GetNandTitleListのどちらかをSYSM_TryToBootTitle前に呼ぶ必要あり
// SYSM_InitTitleListを事前に呼ぶ必要あり
void SYSM_GetNandTitleListMakerInfo( void )
{
int l;
if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL )
{
OS_TPrintf("SYSM_GetNandTitleListMakerInfo failed : SYSM_InitNandTitleList() is not called.");
return;
AMN_restartWithReadNandTitleHeaderShort();
while (!AMN_isNandTitleListReady()) {
OS_Sleep(1);
}
for( l = 0; l < s_listLength; l++ ) {
MakeTitleListMakerInfoFromTitleID( &s_pTitleListMakerInfo[l], s_pTitleIDList[ l ] );
}
s_nand_title_list_maker_info_enabled = TRUE;
}
// ローンチ対象となるNANDタイトルリストの取得
// listNumには、pTitleList_Nandの長さを与える
// 得られる最大のタイトル数は、(LAUNCHER_TITLE_LIST_NUM - 1)に制限される(ランチャーが表示できる最大数からカードぶんを引いた数)
// SYSM_InitNandTitleListを事前に呼ぶ必要あり
// この関数か、SYSM_GetNandTitleListMakerInfoのどちらかをSYSM_TryToBootTitle前に呼ぶ必要あり
// return:取得したNANDタイトルの数
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
// SYSM_InitTitleListを事前に呼ぶ必要あり
// return:Titleリストのポインタ
TitleProperty *SYSM_GetNandTitleList( void )
{
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
// とりあえずALL
int l;
int validNum = 0;
NAMTitleId titleIDArray[ LAUNCHER_TITLE_LIST_NUM - 1 ];// ローンチ可能なタイトルリストの一時置き場
static TitleListMakerInfo local_titleListMakerinfo[ LAUNCHER_TITLE_LIST_NUM - 1 ];// 苦肉の策
if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL )
{
OS_TPrintf("SYSM_GetNandTitleList failed : SYSM_InitNandTitleList() is not called.");
return -1;
AMN_restartWithReadNandTitle();
while (!AMN_isNandTitleListReady()) {
OS_Sleep(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 ], &s_pTitleListMakerInfo[l] );
local_titleListMakerinfo[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 ] );
}
s_nand_title_list_maker_info_enabled = TRUE;
// 念のため残り領域を0クリア
for( l = validNum; l < LAUNCHER_TITLE_LIST_NUM - 1; l++ ) {
titleIDArray[ l ] = 0;
}
// 最終リストに対して、カードアプリ部分を除いた部分をクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
listNum--; // カードのぶん引いておく
// 引数に与えられたリストの長さ-1 と、ローンチ可能タイトルリストの長さの比較
listNum = ( validNum < listNum ) ? validNum : listNum;
for(l=0;l<listNum;l++)
{
pTitleList_Nand[l+1].titleID = titleIDArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIDArray[l] ) {
pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.bootType = LAUNCHER_BOOTTYPE_NAND;
MI_CpuCopy8( &local_titleListMakerinfo[l].sub_info, &pTitleList_Nand[l+1].sub_info, sizeof(TitleInfoSub));
}
}
// return : *TitleProperty Array
return listNum;
return AMN_getTitlePropertyList();
}
// 指定ファイルリード
static s32 ReadFile(FSFile* pf, void* buffer, s32 size)
{
u8* p = (u8*)buffer;
s32 remain = size;
while( remain > 0 )
{
const s32 len = MATH_IMin(1024, remain);
const s32 readLen = FS_ReadFile(pf, p, len);
if( readLen < 0 )
{
return readLen;
}
if( readLen != len )
{
return size - remain + readLen;
}
remain -= readLen;
p += readLen;
}
return size;
}
// ============================================================================
//
//
@ -1821,7 +1598,6 @@ void SYSM_TryToBootTitle( TitleProperty *pBootTitle )
// タイトルIDリストの作成
SYSMi_makeTitleIdList();
SYSM_FreeNandTitleList();
BOOT_Ready(); // never return.
@ -1834,21 +1610,11 @@ static void SYSMi_makeTitleIdList( void )
ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF;
int l;
u8 count = 0;
int max = ( s_listLength < OS_TITLEIDLIST_MAX-1 ) ? s_listLength : OS_TITLEIDLIST_MAX-1;
int max = AMN_getRomHeaderListLength();
OSTick start;
// 時間計測総合
start = OS_GetTick();
if( s_pTitleIDList == NULL || s_pTitleListMakerInfo == NULL )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_InitNandTitleList() is not called.\n");
return;
}
if( !s_nand_title_list_maker_info_enabled )
{
OS_TPrintf("SYSMi_makeTitleIdList failed: SYSM_GetNandTitleList or SYSM_GetNandTitleListMakerInfo is not called.\n");
}
// とりあえずゼロクリア
MI_CpuClear8( (void *)HW_OS_TITLE_ID_LIST, HW_OS_TITLE_ID_LIST_SIZE );
@ -1859,38 +1625,20 @@ static void SYSMi_makeTitleIdList( void )
return;
}
for(l=-1;l<max;l++) // -1はカードアプリの特別処理用
for(l=0;l<max;l++)
{
int m;
BOOL same_maker_code = TRUE;
char *gamecode;
TitleListMakerInfo *p_info;
TitleListMakerInfo info;
OSTitleId id;
ROM_Header_Short *pe_hs;
if(l==-1)
{
ROM_Header_Short *pe_hs;
// カードアプリ
if(SYSM_IsExistCard())
{
pe_hs = (ROM_Header_Short *)SYSM_CARD_ROM_HEADER_BAK;// BAKの値を使う
}else
{
continue;
}
p_info = &info;
SYSM_MakeTitleListMakerInfoFromHeader( p_info, pe_hs);
id = pe_hs->titleID;
}else
{
p_info = &s_pTitleListMakerInfo[l];
id = s_pTitleIDList[l];
}
pe_hs = &((AMN_getRomHeaderList())[l]);
id = pe_hs->titleID;
for(m=0;m<MAKER_CODE_MAX;m++)
{
if(hs->maker_code[m] != p_info->makerCode[m])
if(hs->maker_code[m] != pe_hs->maker_code[m])
{
same_maker_code = FALSE;
}
@ -1922,7 +1670,7 @@ static void SYSMi_makeTitleIdList( void )
}
// ジャンプ可能フラグON or ブートアプリ自身 or ジャンプ元アプリ ならばジャンプ可能
if( p_info->permit_landing_normal_jump || hs->titleID == id ||
if( pe_hs->permit_landing_normal_jump || hs->titleID == id ||
( SYSMi_GetWork()->flags.common.isValidLauncherParam && SYSM_GetLauncherParamBody()->v1.bootTitleID && ( SYSM_GetLauncherParamBody()->v1.prevTitleID == id ) )
)
{
@ -1935,11 +1683,11 @@ static void SYSMi_makeTitleIdList( void )
if( hs->titleID & TITLE_ID_SECURE_FLAG_MASK )
{
// Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON
if(p_info->public_save_data_size != 0)
if(pe_hs->public_save_data_size != 0)
{
list->publicFlag[count/8] |= (u8)(0x1 << (count%8));
}
if(p_info->private_save_data_size != 0)
if(pe_hs->private_save_data_size != 0)
{
list->privateFlag[count/8] |= (u8)(0x1 << (count%8));
}
@ -1951,13 +1699,13 @@ static void SYSMi_makeTitleIdList( void )
if( !(id & TITLE_ID_SECURE_FLAG_MASK) && same_maker_code )
{
// Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON
if(p_info->public_save_data_size != 0)
if(pe_hs->public_save_data_size != 0)
{
list->publicFlag[count/8] |= (u8)(0x1 << (count%8));
// リストに追加
list->TitleID[count] = id;
}
if(p_info->private_save_data_size != 0)
if(pe_hs->private_save_data_size != 0)
{
list->privateFlag[count/8] |= (u8)(0x1 << (count%8));
// リストに追加
@ -1977,28 +1725,6 @@ 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 );
info->sub_info.exFlags = hs->exFlags;
info->sub_info.platform_code = hs->platform_code;
MI_CpuCopy8( hs->parental_control_rating_info, info->sub_info.parental_control_rating_info, 0x10);
info->sub_info.card_region_bitmap = hs->card_region_bitmap;
info->sub_info.agree_EULA_version = hs->agree_EULA_version;
return TRUE;
}
// 指定タイトルがブート可能なポインタかチェック
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )

File diff suppressed because it is too large Load Diff

View File

@ -18,10 +18,10 @@
#include <twl.h>
#include "misc.h"
#include "launcher.h"
#include "bannerCounter.h"
#include "sound.h"
#include <math.h>
#include <sysmenu/mcu.h>
#include <sysmenu/util_menuAppManager.h>
// define data------------------------------------------
@ -81,7 +81,6 @@ static void LoadBannerFiles( void );
static void BannerInit( void );
static void SetDefaultBanner( TitleProperty *titleprop );
static void SetAffineAnimation( BOOL (*flipparam)[4] );
static void SetBannerCounter( TitleProperty *titleprop );
static void SetOAMAttr( void );
static void BannerDraw( int selected, TitleProperty *titleprop);
static BOOL SelectCenterFunc( u16 *csr, TPData *tgt );
@ -110,7 +109,6 @@ static int selected = 0;
static int bar_left = BAR_ZERO_X;
static fx32 s_selected_banner_size;
static BOOL s_wavstop = FALSE;
static BannerCounter banner_counter[LAUNCHER_TITLE_LIST_NUM];
static BOOL s_launcher_initialized = FALSE;
@ -148,12 +146,6 @@ static void BannerInit( void )
// OBJModeの設定
GX_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_1D_128K); // 2D mapping mode
// BannerCounterの初期化
for( l=0; l<LAUNCHER_TITLE_LIST_NUM; l++ )
{
BNC_initCounter( &banner_counter[l], empty_banner);
}
//OBJATTRの初期化……表示前には値を弄る
for(l=0;l<MAX_SHOW_BANNER;l++)
@ -192,10 +184,12 @@ static void SetDefaultBanner( TitleProperty *titleprop )
{
titleprop[l].pBanner = no_card_banner;
}
AMN_stepBannerAnime(l, TRUE); // バナーカウンタセットしなおし
}
else if(titleprop[l].pBanner == NULL) //isValidフラグがTRUEでバナーがNULLならーバナー
{
titleprop[l].pBanner = nobanner_banner;
AMN_stepBannerAnime(l, TRUE); // バナーカウンタセットしなおし
}
}
}
@ -239,24 +233,6 @@ static void SetAffineAnimation( BOOL (*flipparam)[4] )
G2_SetOBJPosition(&banner_oam_attr[3], (int)x-( mtx._00==-FX32_ONE ? 1 : 0 ), (int)y-( mtx._11==-FX32_ONE ? 1 : 0 ));
}
static void SetBannerCounter( TitleProperty *titleprop )
{
int l;
for( l=0; l<LAUNCHER_TITLE_LIST_NUM; l++ )
{
// nandも一応毎回セット
BNC_setBanner( &banner_counter[l], titleprop[l].pBanner);
if( l==0 )
{
// カードの場合、バナーヘッダのv1のCRCが違ったらカウントをリセット
if ( BNC_getBanner( &banner_counter[l] )->h.crc16_v1 != titleprop[l].pBanner->h.crc16_v1)
{
BNC_resetCount( &banner_counter[l] );
}
}
}
}
// OAMデータの設定
static void SetOAMAttr( void )
{
@ -265,19 +241,19 @@ static void SetOAMAttr( void )
int div2 = s_csr % FRAME_PER_SELECT;
BOOL flipparam[4];
AMN_stepBannerAnimeAll(FALSE);
for (l=0;l<MAX_SHOW_BANNER;l++)
{
int num = div1 - 2 + l;
if(-1 < num && num < LAUNCHER_TITLE_LIST_NUM){
// バナーカウンタからフレームデータを取得し、カウンタをインクリメント
FrameAnimeData fad = BNC_getFADAndIncCount( &banner_counter[num] );
// パレットのロード
GX_LoadOBJPltt( fad.pltt, (u16)(l * BANNER_PLTT_SIZE), BANNER_PLTT_SIZE );
GX_LoadOBJPltt( AMN_getBannerPltt(num), (u16)(l * BANNER_PLTT_SIZE), BANNER_PLTT_SIZE );
G2_SetOBJMode(&banner_oam_attr[l], GX_OAM_MODE_NORMAL, l);
// バナー画像のロード
GX_LoadOBJ( fad.image, (u32)l*BANNER_IMAGE_SIZE , BANNER_IMAGE_SIZE);
GX_LoadOBJ( AMN_getBannerImage(num), (u32)l*BANNER_IMAGE_SIZE , BANNER_IMAGE_SIZE);
// 表示画像の設定、キャラクタネーム境界128バイトである事に注意
banner_oam_attr[l].charNo = l*4;
@ -290,16 +266,16 @@ static void SetOAMAttr( void )
G2_SetOBJPosition(&banner_oam_attr[l],
BANNER_FAR_LEFT_POS - BANNER_WIDTH/2 + l*(BANNER_WIDTH + BANNER_INTERVAL) - div2 * DOT_PER_FRAME,
BANNER_TOP - BANNER_HEIGHT/2 );
flipparam[(l-2)*2] = fad.hflip;// フリップ情報は一旦保存
flipparam[(l-2)*2+1] = fad.vflip;
flipparam[(l-2)*2] = AMN_getBannerHFlip(num);// フリップ情報は一旦保存
flipparam[(l-2)*2+1] = AMN_getBannerVFlip(num);
}
else
{
// その他のバナー
GXOamEffect effect = GX_OAM_EFFECT_NONE;
if( fad.vflip )
if( AMN_getBannerVFlip(num) )
{
if( fad.hflip )
if( AMN_getBannerHFlip(num) )
{
effect = GX_OAM_EFFECT_FLIP_HV;
}
@ -308,7 +284,7 @@ static void SetOAMAttr( void )
effect = GX_OAM_EFFECT_FLIP_V;
}
}
else if( fad.hflip )
else if( AMN_getBannerHFlip(num) )
{
effect = GX_OAM_EFFECT_FLIP_H;
}
@ -360,9 +336,6 @@ static void BannerDraw(int selected, TitleProperty *titleprop)
// デフォルトバナーをTitlePropertyに埋め込み
SetDefaultBanner( titleprop );
// バナーカウンタのバナーセット
SetBannerCounter( titleprop );
// OAMデータの設定
SetOAMAttr();

View File

@ -49,7 +49,7 @@ static void PrintError(void);
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
static TitleProperty s_titleList[ LAUNCHER_TITLE_LIST_NUM ];
static TitleProperty *sp_titleList;
static u64 s_strmThreadStack[THREAD_STACK_SIZE / sizeof(u64)];
static OSThread s_strmThread;
@ -268,16 +268,6 @@ void TwlMain( void )
// 各種パラメータの取得------------
pBootTitle = SYSM_ReadParameters(); // 本体設定データ、HW情報リード
// アプリジャンプ、検査用カード起動、生産工程用ショートカット、デバッガ起動、初回起動シーケンス、TP設定ショートカットの判定
// end時間計測-c
#if (MEASURE_TIME == 1)
OS_TPrintf( "SYSM_ReadParameters: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// start時間計測
#if (MEASURE_TIME == 1)
start = OS_GetTick();
#endif
// TPキャリブレーション
UTL_CaribrateTP( LCFG_TSD_GetTPCalibrationPtr() );
@ -293,8 +283,28 @@ void TwlMain( void )
// ランチャー内での初回起動シーケンス中なら、写真撮影を実行するようにする。
// ※本体設定内での初会起動シーケンス中の場合は、SYSM_ReadParameters 内のチェックで検出されて、本体設定が起動されるようになっています。
}
(void)SYSM_GetCardTitleList( s_titleList ); // カードアプリリストの取得カードアプリはs_titleList[0]に格納される)
// end時間計測-c
#if (MEASURE_TIME == 1)
OS_TPrintf( "SYSM_ReadParameters: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// start時間計測4
#if (MEASURE_TIME == 1)
start = OS_GetTick();
#endif
// タイトルリストの準備
SYSM_InitTitleList();
// end時間計測4
#if (MEASURE_TIME == 1)
OS_TPrintf( "InitNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// start時間計測
#if (MEASURE_TIME == 1)
start = OS_GetTick();
#endif
sp_titleList = SYSM_GetCardTitleList(NULL); // カードアプリリストの取得カードアプリはsp_titleList[0]に格納される)
// end時間計測
#if (MEASURE_TIME == 1)
OS_TPrintf( "GetCardTitleList Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
@ -311,17 +321,6 @@ void TwlMain( void )
OS_TPrintf( "TmpClean : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// start時間計測4
#if (MEASURE_TIME == 1)
start = OS_GetTick();
#endif
// NANDタイトルリストの準備
SYSM_InitNandTitleList();
// end時間計測4
#if (MEASURE_TIME == 1)
OS_TPrintf( "InitNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
#endif
// start時間計測5
#if (MEASURE_TIME == 1)
start = OS_GetTick();
@ -329,7 +328,7 @@ void TwlMain( void )
// 「ダイレクトブートでない」なら
if( !pBootTitle ) {
// NAND & カードアプリリスト取得
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得内蔵アプリはs_titleList[1]から格納される)
sp_titleList = SYSM_GetNandTitleList(); // NANDアプリリストの取得内蔵アプリはsp_titleList[1]から格納される)
}else
{
SYSM_GetNandTitleListMakerInfo(); // アプリに引き渡すタイトルリスト作成用情報の取得
@ -477,11 +476,11 @@ MAIN_LOOP_START:
}
break;
case LAUNCHER_INIT:
LauncherInit( s_titleList );
LauncherInit( NULL );
state = LAUNCHER;
break;
case LAUNCHER:
pBootTitle = LauncherMain( s_titleList );
pBootTitle = LauncherMain( sp_titleList );
if( pBootTitle ) {
state = LOAD_START;
}
@ -513,7 +512,7 @@ MAIN_LOOP_START:
}
if( !direct_boot )
{
(void)LauncherFadeout( s_titleList ); // ダイレクトブートでないときはフェードアウトも行う
(void)LauncherFadeout( sp_titleList ); // ダイレクトブートでないときはフェードアウトも行う
}
if( ( end == 0 ) &&
SYSM_IsLoadTitleFinished() ) {
@ -530,7 +529,7 @@ MAIN_LOOP_START:
}
break;
case AUTHENTICATE:
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
if( ( direct_boot || ( !direct_boot && LauncherFadeout( sp_titleList ) ) ) &&
SYSM_IsAuthenticateTitleFinished()
) {
// メインループ開始から検証終了までの間に起きたFATALの処理
@ -568,8 +567,13 @@ MAIN_LOOP_START:
}
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
if( SYSM_GetCardTitleList( s_titleList ) ) {
OS_TPrintf( "Change CARD status.\n" );
{
BOOL changed;
sp_titleList = SYSM_GetCardTitleList( &changed );
if( changed )
{
OS_TPrintf( "Change CARD status.\n" );
}
}
// 無線ファームロードのポーリング
@ -633,7 +637,7 @@ static BOOL IsCommandSelected(void)
static void PrintPause(void)
{
LauncherInit( s_titleList );
LauncherInit( NULL );
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
G2_ChangeBlendAlpha( 0, 31 );
@ -651,7 +655,7 @@ static void PrintError( void )
u64 error_code;
int l;
int count = 0;
LauncherInit( s_titleList );
LauncherInit( NULL );
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
G2_ChangeBlendAlpha( 0, 31 );

View File

@ -85,10 +85,9 @@ extern TitleProperty *SYSM_ReadParameters( void ); //
extern void SYSM_DeleteTmpDirectory( TitleProperty *pBootTitle ); // "nand:/tmp"フォルダのクリーン
// アプリ情報取得
extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // カードアプリタイトルリストの取得
extern BOOL SYSM_InitNandTitleList( void ); // NANDアプリタイトルリスト取得準備
extern void SYSM_FreeNandTitleList( void ); // NANDアプリタイトルリスト
extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得
extern TitleProperty *SYSM_GetCardTitleList( BOOL *changed ); // カードアプリタイトルリストの取得
extern void SYSM_InitTitleList( void ); // アプリタイトルリスト取得準備
extern TitleProperty *SYSM_GetNandTitleList( void ); // NAND アプリタイトルリストの取得
extern void SYSM_GetNandTitleListMakerInfo( void ); // アプリ引き渡しタイトルリスト作成用情報の取得(ダイレクトブート用)
// アプリ起動

View File

@ -1,7 +1,20 @@
/*!
@file menuAppManager.h
@brief
*/
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: util_menuAppManager.h
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Date:: $
$Rev$
$Author$
*---------------------------------------------------------------------------*/
#ifndef MENU_APP_MANAGER_H_
#define MENU_APP_MANAGER_H_
@ -10,13 +23,9 @@
#include <twl/os/common/banner.h>
#include <twl/lcfg.h>
#include <../build/libraries/os/common/include/application_jump_private.h>
#include <sysmenu/sysmenu_lib/common/sysmenu_api.h>
// see also TwlIPL_RED/include/sysmenu/sysmenu_lib/common/sysmenu_api.h
// タイトル情報
typedef struct AMNTitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
NAMTitleId titleID; // タイトルIDTitleID_Hiで起動メディアは判定できる
LauncherBootFlags flags; // ブート時のランチャー動作フラグ
TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
}AMNTitleProperty;
typedef struct AMNBannerCounter
{
@ -37,15 +46,16 @@ AMNFrameAnimeData;
// アプリマネージャ
void AMN_Manager( );
void AMN_init( void *(*pAlloc)(u32), void (*pFree)(void*) );
void AMN_restart();
void AMN_restartWithReadNandTitle();
void AMN_restartWithReadNandTitleHeaderShort();
void AMN_destroy();
BOOL AMN_isNandTitleListReady();
s32 AMN_getNandTitleListLengthForLauncher();
s32 AMN_getCardTitleListLength();
s32 AMN_getRomHeaderListLength();
// 本体設定の場合、アプリマネージャ用indexは飛び飛びになったり、
// ForSetting()が返す値(個数)より大きくなるので
@ -59,31 +69,8 @@ NAMTitleId AMN_getTitleIdByIndex(s32 index);
void AMN_stepBannerAnimeAll(BOOL restart);
void AMN_stepBannerAnime(s32 index, BOOL restart);
// see also TwlSDK/include/twl/os/common/format_rom.h
// 0x1BF - TWL expansion flags
typedef union {
u8 packed;
struct {
u8 codec_mode:1; // 0:NTR mode, 1:TWL mode // undeveloped
u8 otherParentalControls:1; // 1: Enable OtherParentalControls
u8 subBannerFile:1; // 1: Enable subBannerFile
u8 WiFiConnectionIcon :1; // 1: WiFiConnectionをランチャーで表示
u8 DSWirelessIcon :1; // 1: DSWirelessIconをランチャーで表示
u8 game_card_on :1; // 1: NANDアプリでゲームカード電源ONーマルモード
u8 enable_nitro_whitelist_signature :1; // 1: NITROホワイトリスト署名有効フラグ
u8 rsv:1;
};
} ExpansionFlags;
enum {
// 0x02f0 - 0x0300 Parental Controls Rating Info
cParentalControlRatingInfoSize = 0x10
};
typedef struct {
AMNTitleProperty prop;
u8 parental_control_rating_info[ cParentalControlRatingInfoSize ];
ExpansionFlags expansionFlags;
} AppInfo;
const AppInfo* AMN_getAppInfo(s32 index);
const TitleProperty* AMN_getTitleProperty(s32 index);
const ROM_Header_Short* AMN_getTitleRomHeaderShort(s32 index);
const u8* AMN_getBannerImage(s32 index);
const u8* AMN_getBannerPltt(s32 index);
@ -95,10 +82,14 @@ const u16* AMN_getBannerText2(s32 index, OSLanguage language);
BOOL AMN_isDSWirelessIcon(s32 index);
BOOL AMN_isWiFiConnectionIcon(s32 index);
BOOL AMN_isOtherParentalControlsFlag(s32 index);
BOOL AMN_isAgreeEULAFlag(s32 index);
// info size is cParentalControlRatingInfoSize
const u8* AMN_getParentalControlRatingInfo(s32 index);
// 生データTitlePropertyのリスト、HeaderShortリストにアクセスできる抜け道関数
TitleProperty* AMN_getTitlePropertyList( void );
ROM_Header_Short* AMN_getRomHeaderList( void );
enum {
// アプリマネージャ用タイトルindexは、0から始まり非負です。
// 0はCARD固定です。