diff --git a/build/buildtools/modulerules.sysmenu b/build/buildtools/modulerules.sysmenu index 18d2baef..6f1cefca 100644 --- a/build/buildtools/modulerules.sysmenu +++ b/build/buildtools/modulerules.sysmenu @@ -25,7 +25,7 @@ include $(NITROSYSTEM_ROOT)/build/buildtools/modulerules %.wad: $(BINDIR)/$(TARGET_BIN) - $(MAKEWAD) $(TITLEID_LO) $< $@ + $(MAKEWAD) $< $@ #---------------------------------------------------------------------------- TWL_SYSMENU_MODULERULES_ = TRUE diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index 62fbe9b8..4da71c6b 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -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 diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 430db605..247446e8 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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 ); diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index ff4c2125..2fd45602 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -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;lv1.image; + u8 *pban=((TWLBannerFile *)titleprop[l].pBanner)->v1.image; for(m=0;mv1.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; diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index be995191..b5f0818a 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -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; // 「ブート内容未定」でリターン } diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c index 0d595896..ae9b6444 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -77,7 +77,8 @@ void TwlMain(void) { // ファイルシステム切り替え応急処置 - FS_IdentifyTitle(0x4d534554);//MSET +// FS_IdentifyTitle(0x4d534554);//MSET + FS_IdentifyTitle(0x5445534d);//TESM ※今はmakerom.TWLのバグで逆になっている。 } InitBG(); diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c index 1b56d63d..7794c787 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c @@ -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; } diff --git a/build/systemMenu_RED/PictoChat/ARM9/src/main.c b/build/systemMenu_RED/PictoChat/ARM9/src/main.c index bcdc406d..953bdbf4 100644 --- a/build/systemMenu_RED/PictoChat/ARM9/src/main.c +++ b/build/systemMenu_RED/PictoChat/ARM9/src/main.c @@ -63,7 +63,8 @@ void TwlMain(void) { // ファイルシステム切り替え応急処置 - FS_IdentifyTitle(0x50434854);//PCHT +// FS_IdentifyTitle(0x50434854);//PCHT + FS_IdentifyTitle(0x54484350);//THCP ※今はmakerom.TWLのバグで逆になっている。 } InitBG(); diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index cab2923e..61f1ad76 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -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; // タイトルID(TitleID_Hiで起動メディアは判定できる?) - u8 rsv[ 4 ]; // 予約 - void *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。) + NAMTitleId titleID; // タイトルID(TitleID_Hiで起動メディアは判定できる?) + BootFlags flags; // ブート時のランチャー動作フラグ + TWLBannerFile *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。) }TitleProperty; // アプリ認証結果 diff --git a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h index e7a58a9f..4a49bb7f 100644 --- a/include/sysmenu/sysmenu_lib/common/sysmenu_work.h +++ b/include/sysmenu/sysmenu_lib/common/sysmenu_work.h @@ -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 }