From 91b99f71a7a0d71e10ee498e64e5e452010230d7 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Fri, 16 Nov 2007 02:17:19 +0000 Subject: [PATCH] =?UTF-8?q?ROM=E3=83=87=E3=83=BC=E3=82=BF=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=92=E5=88=A5=E3=82=B9=E3=83=AC=E3=83=83?= =?UTF-8?q?=E3=83=89=E5=8C=96=20=E3=83=AD=E3=83=BC=E3=83=89=E4=B8=AD?= =?UTF-8?q?=E3=81=AB=E7=94=BB=E9=9D=A2=E7=99=BD=E3=83=95=E3=82=A7=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=82=A2=E3=82=A6=E3=83=88=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@190 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/sysmenu_lib.c | 27 ++++- .../Launcher/ARM9/src/launcher.c | 73 +++++++----- build/systemMenu_RED/Launcher/ARM9/src/main.c | 112 +++++++++++++++++- .../MachineSettings/ARM9/src/setOwnerInfo.c | 2 +- build/systemMenu_RED/data/BGData_Launcher.c | 6 +- build/systemMenu_RED/misc/src/misc.c | 13 +- .../sysmenu/sysmenu_lib/ARM9/sysmenu_api.h | 2 + 7 files changed, 196 insertions(+), 39 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 84c38686..e20ee757 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -342,8 +342,8 @@ BOOL SYSM_IsTPReadable( void ) // // ============================================================================ -// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 -AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ) +// 指定タイトルをロードするだけ +AuthResult SYSM_LoadTitle( TitleProperty *pBootTitle ) { enum { @@ -470,6 +470,12 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); // ROMヘッダバッファをコピー MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF ); + return AUTH_RESULT_SUCCEEDED; +} + +// ロード済みの指定タイトルの認証とブートを行う +AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ) +{ // パラメータチェック if( !SYSMi_CheckTitlePointer( pBootTitle ) ) { return AUTH_RESULT_TITLE_POINTER_ERROR; @@ -485,12 +491,25 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len); SYSM_SetMountInfo ( pBootTitle->titleID ); SYSM_SetBootSRLPath( pBootTitle->titleID ); - // 起動。 - BOOT_Ready(); // never return; + BOOT_Ready(); // never return. return AUTH_RESULT_SUCCEEDED; } +// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。 +// もしかすると使わないかも +AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ) +{ + AuthResult result; + // 指定タイトルのロード + result = SYSM_LoadTitle( pBootTitle ); + + if (result != AUTH_RESULT_SUCCEEDED) return result; + + // 認証 + return SYSM_AuthenticateTitle( pBootTitle ); +} + // ============================================================================ // diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index af0277b6..386bdbe0 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -35,6 +35,7 @@ extern u32 bg_char_data[16 * 3]; extern u16 bg_scr_data[32 * 32]; +extern u16 bg_scr_data2[32 * 32]; // function's prototype declaration--------------------- static void DrawBackLightSwitch(void); @@ -96,8 +97,7 @@ static void NTRBannerInit() 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 - // ここでやるべきじゃない気がするBGとOBJの設定 - GX_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1); // display only OBJ&BG0 + // ここでやるべきじゃない気がするOBJの設定 GX_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_1D_128K); // 2D mapping mode // パレット読み込み @@ -111,7 +111,7 @@ static void NTRBannerInit() G2_SetOBJAttr( &banner_oam_attr[l], // OAM pointer 128, // X position 96, // Y position - 0, // Priority + 1, // Priority GX_OAM_MODE_NORMAL, // Bitmap mode FALSE, // mosaic off GX_OAM_EFFECT_NONE, // affine off @@ -268,6 +268,12 @@ void LauncherInit( TitleProperty *pTitleList ) GX_LoadBG1Char(bg_char_data, 0, sizeof(bg_char_data)); GX_LoadBG1Scr(bg_scr_data, 0, sizeof(bg_scr_data)); + // フェードアウト用BGデータ作成とロード + SVC_CpuClear( 0x0004, &bg_scr_data2, sizeof(bg_scr_data2), 16 ); + DC_FlushRange(&bg_scr_data2, sizeof(bg_scr_data2)); + GX_LoadBG2Char(bg_char_data, 0, sizeof(bg_char_data)); + GX_LoadBG2Scr(bg_scr_data2, 0, sizeof(bg_scr_data2)); + DrawBackLightSwitch(); PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.", SYSMENU_VER ); @@ -276,7 +282,10 @@ void LauncherInit( TitleProperty *pTitleList ) GetAndDrawRTCData( &g_rtcDraw, TRUE ); - GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 ); + GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1 | GX_PLANEMASK_BG2 | GX_PLANEMASK_OBJ ); + G2_SetBlendAlpha(GX_BLEND_PLANEMASK_BG2, + GX_BLEND_PLANEMASK_BG0 | GX_BLEND_PLANEMASK_BG1 | GX_BLEND_PLANEMASK_OBJ, 0,31); + GX_DispOn(); GXS_DispOn(); @@ -294,6 +303,8 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) BOOL tp_select = FALSE; static int csr_v = 0; static int selected = 0; + static int fadecount = 0; + TitleProperty *ret = NULL; // RTC情報の取得&表示 GetAndDrawRTCData( &g_rtcDraw, FALSE ); @@ -317,23 +328,33 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) //-------------------------------------- // キー入力処理 //-------------------------------------- - if(pad.cont & PAD_KEY_RIGHT){ // バナー選択 - if(csr_v == 0) csr_v = 1; - } - if( pad.cont & PAD_KEY_LEFT ){ - if(csr_v == 0) csr_v = -1; - } - s_csr += csr_v; - if((LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT; - if( s_csr < 0 ) s_csr = 0; - if(s_csr%CURSOR_PER_SELECT == 0){ - csr_v = 0; - selected = s_csr/CURSOR_PER_SELECT; + if(fadecount == 0) + { + if(pad.cont & PAD_KEY_RIGHT){ // バナー選択 + if(csr_v == 0) csr_v = 1; + } + if( pad.cont & PAD_KEY_LEFT ){ + if(csr_v == 0) csr_v = -1; + } + s_csr += csr_v; + if((LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT; + if( s_csr < 0 ) s_csr = 0; + if(s_csr%CURSOR_PER_SELECT == 0){ + csr_v = 0; + selected = s_csr/CURSOR_PER_SELECT; + } + + if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐 + if(pTitleList[selected].titleID != 0) + { + fadecount = 1; + ret = &pTitleList[selected]; + } + } } - // 文字描画クリア + // 描画関係 NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL ); - PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER ); DrawBackLightSwitch(); @@ -341,16 +362,14 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) NTRBannerDraw( s_csr, selected, pTitleList ); #endif - if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐 - if(pTitleList[selected].titleID != 0) - { - NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL ); - return &pTitleList[selected]; - //return NULL; - } - } + if(fadecount>0) + { + // これだと93フレームでフェードアウト終わる + G2_ChangeBlendAlpha( fadecount/3, 31-(fadecount/3) ); + if(fadecount < 93) fadecount++; + };// ロード開始&フェードアウト用描画 - return NULL; + return ret; } #if 0 diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index 8c02856a..8b2f271d 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -25,6 +25,7 @@ // define data----------------------------------------------------------------- // function's prototype------------------------------------------------------- +static BOOL CheckBootStatus( void ); static void INTR_VBlank( void ); // global variable------------------------------------------------------------- @@ -33,6 +34,14 @@ static void INTR_VBlank( void ); // const data------------------------------------------------------------------ +// スタック用 +#define THREAD_PRIO 17 +#define STACK_SIZE 5120 // 適当 +static OSThread thread; +static u64 stack[ STACK_SIZE / sizeof(u64) ]; + +#define COUNT_JOIN_START 32 //2秒ぐらい? +static BOOL s_loading = FALSE; // メイン void TwlMain( void ) @@ -48,6 +57,7 @@ void TwlMain( void ) }; u32 state = START; TitleProperty *pBootTitle = NULL; + TitleProperty *pLoadTitle = NULL; TitleProperty pTitleList[ LAUNCHER_TITLE_LIST_NUM ]; // システムメニュー初期化---------- @@ -55,6 +65,7 @@ void TwlMain( void ) // OS初期化------------------------ OS_Init(); + PM_Init(); (void)OS_EnableIrq(); (void)OS_EnableInterrupts(); @@ -115,13 +126,28 @@ void TwlMain( void ) state = LAUNCHER; break; case LAUNCHER: - pBootTitle = LauncherMain( pTitleList ); - if( pBootTitle ) { + pLoadTitle = LauncherMain( pTitleList ); + if(!s_loading){ + if( pLoadTitle ) { + void (*func)(void*); + func = (void (*)(void *))SYSM_LoadTitle; + OS_InitThread(); + OS_CreateThread( &thread, func, (void*)pLoadTitle, stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO ); + OS_WakeupThreadDirect( &thread ); + s_loading = TRUE; + pBootTitle = pLoadTitle; + } + } + else if(OS_IsThreadTerminated( &thread )) + { + GX_DispOff(); + GXS_DispOff(); state = AUTHENTICATE; + s_loading = FALSE; } break; case AUTHENTICATE: - switch ( SYSM_LoadAndAuthenticateTitle( pBootTitle ) ) { // アプリロード&認証 成功時:never return + switch ( SYSM_AuthenticateTitle( pBootTitle ) ) { // アプリ認証&ブート 成功時:never return case AUTH_PROCESSING: break; case AUTH_RESULT_TITLE_POINTER_ERROR: @@ -138,6 +164,86 @@ void TwlMain( void ) } +// ブート状態を確認し、ロゴ表示有無を判断する------- +static BOOL CheckBootStatus(void) +{ +#if 0 + BOOL boot_decision = FALSE; // 「ブート内容未定」に + BOOL other_shortcut_off = FALSE; + + //----------------------------------------------------- + // デバッグ用コンパイルスイッチによる挙動 + //----------------------------------------------------- + { + +#ifdef __LOGO_SKIP // ※デバッグ用ロゴスキップ + SetLogoEnable( FALSE ); // ロゴ表示スキップ +#endif /* __LOGO_SKIP */ + } + + + //----------------------------------------------------- + // NITRO設定データ未入力時の設定メニューショートカット起動 + //----------------------------------------------------- +#ifdef __DIRECT_BOOT_BMENU_ENABLE // ※NITRO設定データ未入力時のブートメニュー直接起動スイッチがONか? + 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; // 「ブート内容決定」でリターン + } + } +#endif /* __DIRECT_BOOT_BMENU_ENABLE */ + + + //----------------------------------------------------- + // キーショートカット起動 + //----------------------------------------------------- + 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; // 「ブート内容決定」でリターン + } + } + + + //----------------------------------------------------- + // 自動起動オプション有効時の挙動 + //----------------------------------------------------- +#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; // 「ブート内容未定」でリターン +} + + // ============================================================================ // 割り込み処理 // ============================================================================ diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c index 87b30c83..2f4d706b 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c @@ -442,7 +442,7 @@ static BOOL SelectSoftwareKeyFunc( u16 *csr, TPData *tgt ) s[0] = code; s[1] = 0; // rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, s ); - // 文字幅じゃ判定が厳しい + // 文字幅じゃかなり判定が厳しい……ギリギリまでとってみる rect.width = CLIST_MARGIN; rect.height = CLIST_MARGIN; } diff --git a/build/systemMenu_RED/data/BGData_Launcher.c b/build/systemMenu_RED/data/BGData_Launcher.c index ab78c24d..57317f34 100644 --- a/build/systemMenu_RED/data/BGData_Launcher.c +++ b/build/systemMenu_RED/data/BGData_Launcher.c @@ -8,6 +8,8 @@ u32 bg_char_data[16 * 3] = { 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,// 0003h 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, + 0x11111111, 0x11111111, 0x11111111, 0x11111111,// 0004h + 0x11111111, 0x11111111, 0x11111111, 0x11111111, }; // BGスクリーンデータ1 @@ -61,4 +63,6 @@ u16 bg_scr_data[32 * 32]= 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802, 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//23 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801, -};// Buffer for screen data(背景の枠) \ No newline at end of file +};// Buffer for screen data(背景の枠) + +u16 bg_scr_data2[32 * 32];//スクリーンデータ2 \ No newline at end of file diff --git a/build/systemMenu_RED/misc/src/misc.c b/build/systemMenu_RED/misc/src/misc.c index a6d0b23d..ad51fb52 100644 --- a/build/systemMenu_RED/misc/src/misc.c +++ b/build/systemMenu_RED/misc/src/misc.c @@ -256,13 +256,20 @@ static void InitScreen( void ) G2_SetBG1Control( GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text GX_BG_COLORMODE_16, // use 16 colors mode - GX_BG_SCRBASE_0xf000, // screen base offset + 0x0000 is the address for BG #1 screen + GX_BG_SCRBASE_0xe800, // screen base offset + 0x0000 is the address for BG #1 screen GX_BG_CHARBASE_0x10000, // character base offset + 0x04000 is the address for BG #0 characters GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled ); + G2_SetBG2ControlText( + GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text + GX_BG_COLORMODE_16, // use 16 colors mode + GX_BG_SCRBASE_0xd800, // screen base offset + 0x0000 is the address for BG #1 screen + GX_BG_CHARBASE_0x14000 // character base offset + 0x04000 is the address for BG #0 characters + ); GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1); - G2_SetBG0Priority(0); - G2_SetBG1Priority(1); + G2_SetBG2Priority(0); + G2_SetBG0Priority(1); + G2_SetBG1Priority(2); // サブ画面 BG 0 を設定 G2S_SetBG0Control( diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index 78ac63ca..005a9e73 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -83,6 +83,8 @@ extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card ); // extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int size ); // NAND アプリタイトルリストの取得 // アプリ起動 +extern AuthResult SYSM_LoadTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをロード +extern AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyを認証してブート extern AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle ); // 指定したTitlePropertyをロード&認証してブート // 成功時は、never return. // デバイス制御