・SDKが更新されなかったので、リセットパラメータを一時HW_RED_RESERVEDに戻す。

・ランチャーのショートカット起動部の仮実装。
・makerom.TWLのTitleID埋め込みに伴うNMenu変更に対応。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@208 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-19 04:05:35 +00:00
parent 9215521ecb
commit e6c56e4beb
10 changed files with 94 additions and 117 deletions

View File

@ -25,7 +25,7 @@ include $(NITROSYSTEM_ROOT)/build/buildtools/modulerules
%.wad: $(BINDIR)/$(TARGET_BIN)
$(MAKEWAD) $(TITLEID_LO) $< $@
$(MAKEWAD) $< $@
#----------------------------------------------------------------------------
TWL_SYSMENU_MODULERULES_ = TRUE

View File

@ -162,7 +162,7 @@ static void ReadResetParameter( void )
{
// Hot/Coldスタート判定
#ifdef SDK_FINALROM
if( SYSM_GetMCUFreeRegisterValue() == 0 ) // マイコンフリーレジスタ値が"0"ならColdスタート
if( SYSMi_GetMCUFreeRegisterValue() == 0 ) // マイコンフリーレジスタ値が"0"ならColdスタート
#else
if( 1 ) // ISデバッガでのデバッグ動作時に常にホットスタート判定されるのを防ぐ
#endif

View File

@ -48,7 +48,7 @@ static s32 ReadFile(FSFile* pf, void* buffer, s32 size);
void *(*SYSM_Alloc)( u32 size );
void (*SYSM_Free )( void *ptr );
#ifdef __SYSM_DEBUG
#ifdef SYSM_DEBUG_
SYSM_work *pSysm; // デバッガでのSYSMワークのウォッチ用
#endif
@ -74,9 +74,9 @@ static BannerCheckParam s_bannerCheckList[ NTR_BNR_VER_MAX ] = {
// SystemMenuの初期化
void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
{
#ifdef __SYSM_DEBUG
#ifdef SYSM_DEBUG_
pSysm = SYSMi_GetWork();
#endif /* __SYSM_DEBUG */
#endif /* SYSM_DEBUG_ */
// ARM7コンポーネント用プロテクションユニット領域変更
OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB );

View File

@ -68,16 +68,16 @@ static u64 old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
#define DBGBNR
#ifdef DBGBNR
static NTRBannerFile *empty_banner;
static NTRBannerFile *nobanner_banner;
static NTRBannerFile *no_card_banner;
static TWLBannerFile *empty_banner;
static TWLBannerFile *nobanner_banner;
static TWLBannerFile *no_card_banner;
static u8 image_index_list[ LAUNCHER_TITLE_LIST_NUM ];
static const int MAX_SHOW_BANNER = 6;
static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER+10];// アフィンパラメータ埋める関係で少し大きめ
static u8 *pbanner_image_list[ LAUNCHER_TITLE_LIST_NUM ];
static int banner_count = 0;
static void LoadNTRBannerFiles()
static void LoadBannerFiles()
{
// ファイル読み込み部分。多分emptyバナーだけ読み込む事になる。本来、アプリ系は外部から取得
// 最後に解放しないと駄目。だが、どこで解放すればいいのやら……
@ -90,10 +90,10 @@ static void LoadNTRBannerFiles()
}
// パレットの読み込みやOBJ関係の初期化
static void NTRBannerInit()
static void BannerInit()
{
int l;
LoadNTRBannerFiles();
LoadBannerFiles();
MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) );
MI_DmaFill32(3, banner_oam_attr, 192, sizeof(banner_oam_attr)); // let out of the screen if not display
@ -126,7 +126,7 @@ static void NTRBannerInit()
}
// 活線挿抜対応のため、毎回VRAMへのイメージデータロード判定をしている
static void NTRBannerDraw(int cursor, int selected, TitleProperty *titleprop)
static void BannerDraw(int cursor, int selected, TitleProperty *titleprop)
{
static int count = 0;
@ -177,7 +177,7 @@ static void NTRBannerDraw(int cursor, int selected, TitleProperty *titleprop)
for(l=0;l<LAUNCHER_TITLE_LIST_NUM;l++)
{
u8 m;
u8 *pban=((NTRBannerFile *)titleprop[l].pBanner)->v1.image;
u8 *pban=((TWLBannerFile *)titleprop[l].pBanner)->v1.image;
for(m=0;m<banner_count;m++){
if(pban == pbanner_image_list[m]){
image_index_list[l]=m;
@ -252,7 +252,7 @@ static void NTRBannerDraw(int cursor, int selected, TitleProperty *titleprop)
// アプリ名表示
{
NNSG2dChar *str = ((NTRBannerFile *)titleprop[selected].pBanner)->v1.comment[ TSD_GetLanguage() ];
NNSG2dChar *str = ((TWLBannerFile *)titleprop[selected].pBanner)->v1.comment[ TSD_GetLanguage() ];
int width = NNS_G2dTextCanvasGetStringWidth(&gTextCanvas, str, NULL);
PutStringUTF16( (256-width)/2, 48, TXT_COLOR_BLACK, str );
}
@ -298,7 +298,7 @@ void LauncherInit( TitleProperty *pTitleList )
GXS_DispOn();
#ifdef DBGBNR
NTRBannerInit();
BannerInit();
#endif
}
@ -319,7 +319,7 @@ void LauncherLoading( TitleProperty *pTitleList )
DrawBackLightSwitch();
#ifdef DBGBNR
NTRBannerDraw( s_csr, selected, pTitleList );
BannerDraw( s_csr, selected, pTitleList );
#endif
// これだと93フレームでフェードアウト終わる
@ -404,7 +404,7 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList )
DrawBackLightSwitch();
#ifdef DBGBNR
NTRBannerDraw( s_csr, selected, pTitleList );
BannerDraw( s_csr, selected, pTitleList );
#endif
return ret;

View File

@ -25,7 +25,7 @@
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static BOOL CheckBootStatus( void );
static TitleProperty *CheckShortcutBoot( TitleProperty *pTitleList );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
@ -77,26 +77,31 @@ void TwlMain( void )
InitAllocator(); // ※SYSM_Init以外のSYSMライブラリ関数を呼ぶ前に
// Alloc, Freeで登録したメモリアロケータを初期化してください。
// 各種パラメータの取得------------
SYSM_ReadParameters();
SYSM_ReadParameters(); // 本体設定データ等のリード
(void)SYSM_GetNandTitleList( pTitleList, LAUNCHER_TITLE_LIST_NUM ); // NANDアプリリストの取得内蔵アプリはpTitleList[1]から格納される)
(void)SYSM_GetCardTitleList( pTitleList ); // カードアプリリストの取得カードアプリはpTitleList[0]に格納される)
// リセットパラメータ&ショートカットチェック----------
if( SYSM_GetResetParamBody()->v1.bootTitleID ) { // アプリ直接起動の指定があったらロゴデモを飛ばして指定アプリ起動
pBootTitle = (TitleProperty *)&SYSM_GetResetParamBody()->v1;
}else {
pBootTitle = CheckShortcutBoot( pTitleList );
}
// 各種リソースのロード------------
if( pBootTitle == NULL ) {
// ダイレクトブートでロゴデモスキップでない時、各種リソースのロード------------
if( !( pBootTitle && !pBootTitle->flags.isLogoSkip ) ) {
// FS_ReadContentFile( ContentID ); // タイトル内リソースファイルのリード
// FS_ReadSharedContentFile( ContentID ); // 共有コンテントファイルのリード
// NANDアプリリストの取得
(void)SYSM_GetNandTitleList( pTitleList, LAUNCHER_TITLE_LIST_NUM );
}
// 開始ステートの判定--------------
if( pBootTitle ) {
// リセットパラメータでダイレクト起動タイトルの指定があるなら、ロゴ、ランチャーを飛ばして起動
if( SYSM_GetResetParamBody()->v1.flags.isAppLoadCompleted ) {
// ダイレクト起動タイトルの指定があるなら、ロゴ、ランチャーを飛ばして起動
if( pBootTitle->flags.isAppLoadCompleted ) {
// ロード済み状態なら、直接認証へ
state = AUTHENTICATE;
}else {
// さもなくば、ロード開始
state = LOAD_START;
}
}else if( SYSM_IsLogoDemoSkip() ) {
@ -114,8 +119,6 @@ void TwlMain( void )
ReadKeyPad(); // キー入力の取得
ReadTP(); // TP入力の取得
(void)SYSM_GetCardTitleList( pTitleList ); // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
switch( state ) {
case START:
state = LOGODEMO;
@ -163,87 +166,50 @@ void TwlMain( void )
case STOP: // 停止
break;
}
// カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
(void)SYSM_GetCardTitleList( pTitleList );
}
}
// ブート状態を確認し、ロゴ表示有無を判断する-------
static BOOL CheckBootStatus(void)
// ショートカット起動のチェック
static TitleProperty *CheckShortcutBoot( TitleProperty *pTitleList )
{
#if 0
BOOL boot_decision = FALSE; // 「ブート内容未定」に
BOOL other_shortcut_off = FALSE;
#if 0 // ※未実装
TitleProperty *pTgt;
ReadKeyPad(); // キー入力の取得
//-----------------------------------------------------
// デバッグ用コンパイルスイッチによる挙
// TWL設定データ未入力時の初回起動シーケンス起
//-----------------------------------------------------
{
#ifdef __LOGO_SKIP // ※デバッグ用ロゴスキップ
SetLogoEnable( FALSE ); // ロゴ表示スキップ
#endif /* __LOGO_SKIP */
}
//-----------------------------------------------------
// NITRO設定データ未入力時の設定メニューショートカット起動
//-----------------------------------------------------
#ifdef __DIRECT_BOOT_BMENU_ENABLE // ※NITRO設定データ未入力時のブートメニュー直接起動スイッチがONか
#ifdef ENABLE_INITIAL_SETTINGS_
if( !TSD_IsSetTP() ||
!TSD_IsSetLanguage() ||
!TSD_IsSetDateTime() ||
!TSD_IsSetUserColor() ||
!TSD_IsSetNickname() ) { // TP,言語,RTC,ニックネームがセットされていなければ、ロゴ表示もゲームロードも行わず、ブートメニューをショートカット起動。
if( ( pad.cont & PAD_PRODUCTION_NITRO_SHORTCUT ) == PAD_PRODUCTION_NITRO_SHORTCUT ) {
other_shortcut_off = TRUE; // 量産工程用のキーショートカットが押されていたら、設定メニュー起動はなし。
}else if( !SYSM_IsInspectNITROCard() ) { // 但し、量産用のキーショートカットが押されている時か、NITRO検査カードがささっている時は、ブートメニューへのショートカット起動は行わない。
SYSM_SetBootFlag( BFLG_BOOT_BMENU );
SetLogoEnable( FALSE );
return TRUE; // 「ブート内容決定」でリターン
}
!TSD_IsSetNickname() ) {
return SYSM_GetTitleProperty( TITLE_ID_MACHINE_SETTINGS, pTitleList ); // ※未実装
}
#endif /* __DIRECT_BOOT_BMENU_ENABLE */
#endif // ENABLE_INITIAL_SETTINGS_
//-----------------------------------------------------
// キーショートカット起動
// 量産工程用ショートカットキー or
// 検査カード起動
//-----------------------------------------------------
if( !other_shortcut_off
// && !TSD_IsAutoBoot()
) {
// 他ショートカットONかつオート起動OFFの時
u32 nowBootFlag = 0;
if(pad.cont & PAD_BUTTON_R){ // Rボタン押下起動なら、ロゴ表示なしでAGBゲームへ
SetLogoEnable( FALSE );
nowBootFlag = BFLG_BOOT_AGB;
}else if(pad.cont & PAD_BUTTON_L){ // Lボタン押下起動なら、ロゴ表示後にNITROゲームへ
nowBootFlag = BFLG_BOOT_NITRO;
}else if(pad.cont & PAD_BUTTON_B){ // Bボタン押下起動なら、ロゴ表示後にブートメニューへ
nowBootFlag = BFLG_BOOT_BMENU;
}
if( nowBootFlag ) {
SYSM_SetBootFlag( nowBootFlag );
return TRUE; // 「ブート内容決定」でリターン
if( ( SYSM_IsExistCard() &&
( ( pad.cont & PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) == PAD_PRODUCTION_SHORTCUT_CARD_BOOT ) ) ||
SYSM_IsInspectCard() ) {
pTgt = SYSM_GetTitleProperty(); // ※未実装
if( pTgt ) {
pTgt->flags.isLogoSkip = TRUE; // ロゴデモを飛ばす
pTgt->flags.isInitialShortcutSkip = TRUE; // 初回起動シーケンスを飛ばす
}
return pTgt;
}
//-----------------------------------------------------
// 自動起動オプション有効時の挙動
//-----------------------------------------------------
#ifndef __SYSM_DEBUG
// if( TSD_IsAutoBoot() ) {
if( 0 ) {
if ( SYSM_IsExistCard() ) { // NITROカードのみの時はNITRO起動
SYSM_SetBootFlag( BFLG_BOOT_NITRO );
return TRUE; // 「ブート内容決定」でリターン
}
}
#endif /* __SYSM_DEBUG */
#endif
return FALSE; // 「ブート内容未定」でリターン
#endif // 0
return NULL; // 「ブート内容未定」でリターン
}

View File

@ -77,7 +77,8 @@ void TwlMain(void)
{
// ファイルシステム切り替え応急処置
FS_IdentifyTitle(0x4d534554);//MSET
// FS_IdentifyTitle(0x4d534554);//MSET
FS_IdentifyTitle(0x5445534d);//TESM ※今はmakerom.TWLのバグで逆になっている。
}
InitBG();

View File

@ -189,12 +189,12 @@ int SetRTCMain( void )
s_pWork = NULL;
MachineSettingInit();
}
#ifdef __SYSM_DEBUG
#ifdef SYSM_DEBUG_
else if( pad.trg & PAD_BUTTON_START ) {
ClearRTC();
OS_Printf( "RTC offset in NVRAM is ZERO clear!\n" );
}
#endif /* __SYSM_DEBUG */
#endif /* SYSM_DEBUG_ */
return 0;
}

View File

@ -63,7 +63,8 @@ void TwlMain(void)
{
// ファイルシステム切り替え応急処置
FS_IdentifyTitle(0x50434854);//PCHT
// FS_IdentifyTitle(0x50434854);//PCHT
FS_IdentifyTitle(0x54484350);//THCP ※今はmakerom.TWLのバグで逆になっている。
}
InitBG();

View File

@ -32,17 +32,19 @@ extern "C" {
// define data----------------------------------------------------------
#ifndef SDK_FINALROM
//#define __SYSM_DEBUG // デバッグコード用ビルドスイッチ
//#define SYSM_DEBUG_ // デバッグコード用ビルドスイッチ
//#define ENABLE_INITIAL_SETTINGS_
#endif // SDK_FINALROM
#define BACKLIGHT_LEVEL_MAX 22 // バックライト輝度上限(ハード的な制約は上限のみ)
#define CARD_SLOT_NUM 1 // カードスロット数
#define LAUNCHER_TITLE_LIST_NUM 40 // ランチャーのタイトルリスト数
#define BACKLIGHT_LEVEL_MAX 22 // バックライト輝度上限(ハード的な制約は上限のみ)
#define CARD_SLOT_NUM 1 // カードスロット数
#define LAUNCHER_TITLE_LIST_NUM 40 // ランチャーのタイトルリスト数
#define TITLE_ID_MACHINE_SETTINGS 0x000100014d534554 // 本体設定のタイトルID
#define PAD_PRODUCTION_SKIP_INITIAL_SHORTCUT ( PAD_BUTTON_A | PAD_BUTTON_B \
#define PAD_PRODUCTION_SHORTCUT_CARD_BOOT ( PAD_BUTTON_A | PAD_BUTTON_B \
| PAD_BUTTON_X | PAD_BUTTON_Y | PAD_BUTTON_R )
// 量産工程で使用する初回起動設定をキャンセルするショートカットキー
// 量産工程で使用する初回起動設定をキャンセルしてカードブートするショートカットキー
typedef enum PlatformCode {
PLATFORM_NTR = 0,
@ -52,9 +54,9 @@ typedef enum PlatformCode {
// タイトル情報
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
NAMTitleId titleID; // タイトルIDTitleID_Hiで起動メディアは判定できる
u8 rsv[ 4 ]; // 予約
void *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
NAMTitleId titleID; // タイトルIDTitleID_Hiで起動メディアは判定できる
BootFlags flags; // ブート時のランチャー動作フラグ
TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
}TitleProperty;
// アプリ認証結果

View File

@ -36,12 +36,13 @@ extern "C" {
// リセットパラメータ フラグ
typedef struct ResetFlags {
u16 isLogoSkip : 1; // ロゴデモスキップ要求
u16 isAppLoadCompleted : 1; // アプリロード済みを示す
u16 reqAppRelocate : 1; // アプリ再配置要求
u16 rsv : 13;
}ResetFlags;
typedef struct BootFlags {
u16 isLogoSkip : 1; // ロゴデモスキップ要求
u16 isInitialShortcutSkip : 1; // 初回起動シーケンススキップ要求
u16 isAppLoadCompleted : 1; // アプリロード済みを示す
u16 reqAppRelocate : 1; // アプリ再配置要求
u16 rsv : 12;
}BootFlags;
// リセットパラメータ ヘッダ
@ -57,7 +58,7 @@ typedef struct ResetParameterHeader {
typedef union ResetParamBody {
struct { // ※とりあえず最初はTitlePropertyとフォーマットを合わせておく
NAMTitleId bootTitleID; // リセット後にダイレクト起動するタイトルID
ResetFlags flags; // リセット時のランチャー動作フラグ
BootFlags flags; // リセット時のランチャー動作フラグ
u8 rsv[ 4 ]; // 予約
}v1;
}ResetParamBody;
@ -114,20 +115,26 @@ typedef struct SDKBootCheckInfo{
//----------------------------------------------------------------------
// SYSM共有ワーク領域のアドレス獲得
//----------------------------------------------------------------------
#if 0
// SYSMリセットパラメータアドレスの取得※ライブラリ向け。ARM9側はSYSM_GetResetParamを使用して下さい。
#define SYSMi_GetResetParamAddr() ( (ResetParam *)0x02000100 )
// SYSM共有ワークの取得
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED )
#else
#define SYSMi_GetResetParamAddr() ( (ResetParam *)( HW_RED_RESERVED + 0x50 ) )
#define SYSMi_GetWork() ( (SYSM_work *)HW_RED_RESERVED + 0x10 )
#endif
// SDKブートチェックアプリ起動時にカードIDをセットする必要がある。
#define SYSMi_GetSDKBootCheckInfo() ( (SDKBootCheckInfo *)HW_BOOT_CHECK_INFO_BUF )
#define SYSMi_GetSDKBootCheckInfoForNTR() ( (SDKBootCheckInfo *)0x027ffc00 )
// NANDファームがロードしてくれているマイコンフリーレジスタ値の取得
#define SYSMi_GetMCUFreeRegisterValue() ( *(vu8 *)HW_RESET_PARAMETER_BUF )
// カードROMヘッダワークの取得
#define SYSM_GetCardRomHeader() ( (ROM_Header_Short *)HW_TWL_ROM_HEADER_BUF )
// SDKブートチェックアプリ起動時にカードIDをセットする必要がある。
#define SYSM_GetSDKBootCheckInfo() ( (SDKBootCheckInfo *)HW_BOOT_CHECK_INFO_BUF )
#define SYSM_GetSDKBootCheckInfoForNTR() ( (SDKBootCheckInfo *)0x027ffc00 )
// NANDファームがロードしてくれているマイコンフリーレジスタ値の取得
#define SYSM_GetMCUFreeRegisterValue() ( *(vu8 *)HW_RESET_PARAMETER_BUF )
#ifdef __cplusplus
}