mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
・可変長データを埋め込めるよう、なんとか対応 ・バージョン以外のデータもいろいろ追加 ・インポートし、ランチャーでの取得まで確認(署名検証処理は未実装) git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1692 b08762b0-b915-fc4b-9d8c-17b2551a87ff
617 lines
19 KiB
C
617 lines
19 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: TwlIPL
|
||
File: main.c
|
||
|
||
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$
|
||
*---------------------------------------------------------------------------*/
|
||
|
||
#include <twl.h>
|
||
#include <twl/dsp.h>
|
||
#include <twl/dsp/common/shutter.h>
|
||
#include <twl/camera.h>
|
||
#include "launcher.h"
|
||
#include "misc.h"
|
||
#include "logoDemo.h"
|
||
#include "sound.h"
|
||
#include "loadWlanFirm.h"
|
||
#include "loadSharedFont.h"
|
||
#include "loadSysmVersion.h"
|
||
|
||
// extern data-----------------------------------------------------------------
|
||
|
||
// define data-----------------------------------------------------------------
|
||
|
||
#define INIT_DEVICES_LIKE_UIG_LAUNCHER
|
||
|
||
#define MEASURE_TIME 1
|
||
|
||
// function's prototype-------------------------------------------------------
|
||
static void INTR_VBlank( void );
|
||
static void deleteTmp();
|
||
void SYSM_DeleteTempDirectory( TitleProperty *pBootTitle );
|
||
static BOOL IsCommandSelected(void);
|
||
static void PrintPause(void);
|
||
static void PrintError(AuthResult res);
|
||
|
||
// global variable-------------------------------------------------------------
|
||
|
||
// static variable-------------------------------------------------------------
|
||
static TitleProperty s_titleList[ LAUNCHER_TITLE_LIST_NUM ];
|
||
|
||
static u64 s_strmThreadStack[THREAD_STACK_SIZE / sizeof(u64)];
|
||
static OSThread s_strmThread;
|
||
static StreamInfo s_strm; // stream info
|
||
|
||
// const data------------------------------------------------------------------
|
||
|
||
const char filename[] = "data/fanfare.32.wav";
|
||
|
||
static const char *error_msg[AUTH_RESULT_MAX] =
|
||
{
|
||
"SUCCEEDED",
|
||
"PROCESSING",
|
||
"TITLE_LOAD_FAILED",
|
||
"TITLE_POINTER_ERROR",
|
||
"AUTHENTICATE_FAILED",
|
||
"ENTRY_ADDRESS_ERROR",
|
||
"TITLE_BOOTTYPE_ERROR",
|
||
"SIGN_DECRYPTION_FAILED",
|
||
"SIGN_COMPARE_FAILED",
|
||
"HEADER_HASH_CALC_FAILED",
|
||
"TITLEID_COMPARE_FAILED",
|
||
"VALID_SIGN_FLAG_OFF",
|
||
"CHECK_TITLE_LAUNCH_RIGHTS_FAILED",
|
||
"MODULE_HASH_CHECK_FAILED",
|
||
"MODULE_HASH_CALC_FAILED",
|
||
"MEDIA_CHECK_FAILED",
|
||
"DL_MAGICCODE_CHECK_FAILED",
|
||
"DL_SIGN_DECRYPTION_FAILED",
|
||
"DL_HASH_CALC_FAILED",
|
||
"DL_SIGN_COMPARE_FAILED",
|
||
"WHITELIST_INITDB_FAILED",
|
||
"WHITELIST_NOTFOUND",
|
||
"DHT_PHASE1_FAILED",
|
||
"DHT_PHASE2_FAILED",
|
||
"LANDING_TMP_JUMP_FLAG_OFF",
|
||
"TWL_BOOTTYPE_UNKNOWN",
|
||
"NTR_BOOTTYPE_UNKNOWN",
|
||
"PLATFORM_UNKNOWN"
|
||
};
|
||
|
||
//#define DEBUG_LAUNCHER_DUMP
|
||
#ifdef DEBUG_LAUNCHER_DUMP
|
||
// <20>f<EFBFBD>o<EFBFBD>O<EFBFBD>p<EFBFBD>BSD<53><44>0x02ffc000<30><30><EFBFBD><EFBFBD>0x02ffe000<30>܂<EFBFBD>dump.dat<61>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD>v<EFBFBD><76><EFBFBD>f<EFBFBD><66>
|
||
static void debugWriteToSD( void )
|
||
{
|
||
FSFile dest;
|
||
FS_InitFile( &dest );
|
||
(void)FS_CreateFile("sdmc:/dump.dat", FS_PERMIT_W | FS_PERMIT_R);
|
||
if ( !FS_OpenFileEx( &dest, "sdmc:/dump.dat", FS_FILEMODE_W ) ) return;
|
||
FS_WriteFile( &dest, (void *)0x02ffc000, 0x2000 );
|
||
if ( !FS_CloseFile( &dest ) ) return;
|
||
OS_TPrintf( "debugWriteToSD:ok\n");
|
||
}
|
||
#endif
|
||
|
||
#ifdef INIT_DEVICES_LIKE_UIG_LAUNCHER
|
||
|
||
static int CreateDspSlotBitmap(int slot_num)
|
||
{
|
||
int i, bitmap;
|
||
bitmap = 0;
|
||
|
||
for (i=0; i<slot_num; i++)
|
||
{
|
||
bitmap += (1 << i);
|
||
}
|
||
|
||
return bitmap;
|
||
}
|
||
|
||
#endif // INIT_DEVICES_LIKE_UIG_LAUNCHER
|
||
|
||
// <20><><EFBFBD>C<EFBFBD><43>
|
||
void TwlMain( void )
|
||
{
|
||
enum {
|
||
LOGODEMO_INIT = 0,
|
||
LOGODEMO = 1,
|
||
LAUNCHER_INIT = 2,
|
||
LAUNCHER = 3,
|
||
LOAD_START = 4,
|
||
LOADING = 5,
|
||
LOAD_PAUSE = 6,
|
||
AUTHENTICATE = 7,
|
||
BOOT = 8,
|
||
STOP = 9
|
||
};
|
||
u32 state = LOGODEMO_INIT;
|
||
TitleProperty *pBootTitle = NULL;
|
||
OSTick allstart, start, end = 0;
|
||
BOOL direct_boot = FALSE;
|
||
|
||
#ifdef DEBUG_LAUNCHER_DUMP
|
||
// you should comment out to clear GX/G2/DMA/TM/PAD register in reboot.c to retreive valid boot time
|
||
STD_TSPrintf((char*)0x02FFCFC0, "\nLauncher Boot Time: %lld usec\n", OS_TicksToMicroSeconds(reg_OS_TM3CNT_L * (1024/64)));
|
||
STD_TSPrintf((char*)0x02FFCFF0, "HOTSTART(0x%08x): %02x\n", HW_NAND_FIRM_HOTSTART_FLAG, *(u8 *)HW_NAND_FIRM_HOTSTART_FLAG);
|
||
#endif
|
||
// <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>----------
|
||
SYSM_Init( Alloc, Free ); // OS_Init<69>̑O<CC91>ŃR<C583>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>B
|
||
OS_Init();
|
||
SYSM_SetArena(); // OS_Init<69>̌<EFBFBD><CC8C>ŃR<C583>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>B
|
||
|
||
// OS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------------------------
|
||
OS_InitTick();
|
||
|
||
// start <20><><EFBFBD>Ԍv<D48C><76>total
|
||
#if (MEASURE_TIME == 1)
|
||
allstart = OS_GetTick();
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76><EFBFBD>P
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
|
||
PM_Init();
|
||
|
||
(void)OS_EnableIrq();
|
||
(void)OS_EnableInterrupts();
|
||
|
||
SYSM_InitPXI(); // <20><><EFBFBD>荞<EFBFBD><EFBFBD><DD8B><EFBFBD><C28C>ɃR<C983>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>B
|
||
|
||
FS_Init( FS_DMA_NOT_USE );
|
||
|
||
#ifdef DEBUG_LAUNCHER_DUMP
|
||
// debug
|
||
debugWriteToSD();
|
||
#endif
|
||
|
||
GX_Init();
|
||
PM_Init();
|
||
TP_Init();
|
||
RTC_Init();
|
||
SND_Init();// sound init
|
||
#ifdef USE_WRAM_LOAD
|
||
HOTSW_Init();
|
||
#endif
|
||
|
||
//NAM<41>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD>
|
||
NAM_Init( Alloc, Free );
|
||
|
||
OS_TPrintf( "SYSM_work size = 0x%x\n", sizeof(SYSM_work) );
|
||
|
||
// <20><><EFBFBD>荞<EFBFBD><EFBFBD><DD8B><EFBFBD>--------------------
|
||
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
|
||
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
|
||
(void)GX_VBlankIntr(TRUE);
|
||
|
||
// <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD>----------------
|
||
InitAllocator(); // <20><>SYSM_Init<69>ȊO<C88A><4F>SYSM<53><4D><EFBFBD>C<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D690><EFBFBD><EFBFBD>ĂԑO<D491><4F>
|
||
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76><EFBFBD>P
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "System Init Time 1: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76><EFBFBD>P-b
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// Alloc, Free<65>œo<C593>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>P<EFBFBD>[<5B>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
|
||
#ifdef INIT_DEVICES_LIKE_UIG_LAUNCHER
|
||
// <20>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
CAMERA_Init();
|
||
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76><EFBFBD>P-b
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "Camera Init: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
#ifdef USE_HYENA_COMPONENT
|
||
// DSP<53><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
{
|
||
MIWramSize sizeB = MI_WRAM_SIZE_32KB;
|
||
MIWramSize sizeC = MI_WRAM_SIZE_64KB;
|
||
int slotB = CreateDspSlotBitmap( DSP_SLOT_B_COMPONENT_G711 ); // <20>P<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>g
|
||
int slotC = CreateDspSlotBitmap( DSP_SLOT_C_COMPONENT_G711 ); // <20>Q<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>g
|
||
|
||
MI_FreeWramSlot_B( 0, sizeB, MI_WRAM_ARM9 );
|
||
MI_FreeWramSlot_C( 0, sizeC, MI_WRAM_ARM9 );
|
||
MI_CancelWramSlot_B( 0, sizeB, MI_WRAM_ARM9 );
|
||
MI_CancelWramSlot_C( 0, sizeC, MI_WRAM_ARM9 );
|
||
if ( ! DSP_LoadShutter() )
|
||
{
|
||
OS_TPanic("failed to load Shutter DSP-component! (lack of WRAM-B/C)");
|
||
}
|
||
DSP_UnloadShutter();
|
||
}
|
||
#endif // USE_HYENA_COMPONENT
|
||
#endif // INIT_DEVICES_LIKE_UIG_LAUNCHER
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76><EFBFBD>P-c
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
|
||
// <20>e<EFBFBD><65><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E>̎擾------------
|
||
pBootTitle = SYSM_ReadParameters(); // <20>{<7B>̐ݒ<CC90><DD92>f<EFBFBD>[<5B>^<5E>AHW<48><57><EFBFBD>[<5B>h
|
||
// <20>A<EFBFBD>v<EFBFBD><76><EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>J<EFBFBD>[<5B>h<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD>Y<EFBFBD>H<EFBFBD><48><EFBFBD>p<EFBFBD>V<EFBFBD><56><EFBFBD>[<5B>g<EFBFBD>J<EFBFBD>b<EFBFBD>g<EFBFBD>A<EFBFBD>f<EFBFBD>o<EFBFBD>b<EFBFBD>K<EFBFBD>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>V<EFBFBD>[<5B>P<EFBFBD><50><EFBFBD>X<EFBFBD>ATP<54>ݒ<EFBFBD><DD92>V<EFBFBD><56><EFBFBD>[<5B>g<EFBFBD>J<EFBFBD>b<EFBFBD>g<EFBFBD>̔<EFBFBD><CC94><EFBFBD>
|
||
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76><EFBFBD>P-c
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "SYSM_ReadParameters: %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76><EFBFBD>Q
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
|
||
// TP<54>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD>[<5B>V<EFBFBD><56><EFBFBD><EFBFBD>
|
||
UTL_CaribrateTP( LCFG_TSD_GetTPCalibrationPtr() );
|
||
|
||
if( UTL_IsFatalError() ) {
|
||
// FATAL<41>G<EFBFBD><47><EFBFBD>[<5B><><EFBFBD><EFBFBD>
|
||
}
|
||
if( !LCFG_TSD_IsFinishedInitialSetting_Launcher() ) {
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B><><EFBFBD>ł̏<C582><CC8F><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>V<EFBFBD>[<5B>P<EFBFBD><50><EFBFBD>X<EFBFBD><58><EFBFBD>Ȃ<EFBFBD><C882>A<EFBFBD>ʐ^<5E>B<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>B
|
||
// <20><><EFBFBD>{<7B>̐ݒ<CC90><DD92><EFBFBD><EFBFBD>ł̏<C582><CC8F><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>V<EFBFBD>[<5B>P<EFBFBD><50><EFBFBD>X<EFBFBD><58><EFBFBD>̏ꍇ<CC8F>́ASYSM_ReadParameters <20><><EFBFBD>̃`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>Ō<EFBFBD><C58C>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD>āA<C481>{<7B>̐ݒ肪<DD92>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>悤<EFBFBD>ɂȂ<C982><C882>Ă<EFBFBD><C482>܂<EFBFBD><DC82>B
|
||
}
|
||
|
||
(void)SYSM_GetCardTitleList( s_titleList ); // <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̎擾<CC8E>i<EFBFBD>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>s_titleList[0]<5D>Ɋi<C98A>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76><EFBFBD>Q
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "GetCardTitleList Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>3
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// TMP<4D>t<EFBFBD>H<EFBFBD><48><EFBFBD>_<EFBFBD>̃N<CC83><4E><EFBFBD>[<5B><>
|
||
SYSM_DeleteTmpDirectory( pBootTitle );
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>3
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "TmpClean : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>4
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// NAND<4E>^<5E>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̏<EFBFBD><CC8F><EFBFBD>
|
||
SYSM_InitNandTitleList();
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>4
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "InitNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>5
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// <20>u<EFBFBD>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>łȂ<C582><C882>v<EFBFBD>Ȃ<EFBFBD>
|
||
if( !pBootTitle ) {
|
||
// NAND & <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>擾
|
||
(void)SYSM_GetNandTitleList( s_titleList, LAUNCHER_TITLE_LIST_NUM ); // NAND<4E>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̎擾<CC8E>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD>s_titleList[1]<5D><><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
|
||
}else
|
||
{
|
||
SYSM_GetNandTitleListMakerInfo(); // <09>A<EFBFBD>v<EFBFBD><76><EFBFBD>Ɉ<EFBFBD><C988><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD>^<5E>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>쐬<EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>̎擾
|
||
}
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>5
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "GetNandTitleList : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>6
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// <20>u<EFBFBD>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>łȂ<C582><C882>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// <20>u<EFBFBD>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>S<EFBFBD>f<EFBFBD><66><EFBFBD>\<5C><><EFBFBD>v<EFBFBD>̎<EFBFBD><CC8E>A<EFBFBD>e<EFBFBD>탊<EFBFBD>\<5C>[<5B>X<EFBFBD>̃<EFBFBD><CC83>[<5B>h------------
|
||
if( !pBootTitle ||
|
||
( pBootTitle && !SYSM_IsLogoDemoSkip() ) ) {
|
||
u32 timestamp;
|
||
if( !LoadSharedFontInit() ) { // <20><><EFBFBD>L<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>̃<EFBFBD><CC83>[<5B>h
|
||
UTL_SetFatalError( FATAL_ERROR_SHARED_FONT );
|
||
}
|
||
timestamp = OS_GetSharedFontTimestamp();
|
||
if( timestamp > 0 ) OS_TPrintf( "SharedFont timestamp : %08x\n", timestamp );
|
||
}
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>6
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "GetSharedFont : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
if( LoadSysmVersion() )
|
||
{
|
||
OS_TPrintf("Launcher Version = %d.%d\n",GetSysmMajorVersion(), GetSysmMinorVersion() );
|
||
}
|
||
|
||
// <20>J<EFBFBD>n<EFBFBD>X<EFBFBD>e<EFBFBD>[<5B>g<EFBFBD>̔<EFBFBD><CC94><EFBFBD>--------------
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>7
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
if( pBootTitle ) {
|
||
// <20>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD>S<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CE82>ă<EFBFBD><C483>[<5B>h<EFBFBD>J<EFBFBD>n
|
||
if( pBootTitle->flags.isLogoSkip ) {
|
||
state = LOAD_START;
|
||
}else {
|
||
state = LOGODEMO_INIT;
|
||
}
|
||
direct_boot = TRUE;
|
||
}else if( SYSM_IsLogoDemoSkip() ) {
|
||
// <20><><EFBFBD>S<EFBFBD>f<EFBFBD><66><EFBFBD>X<EFBFBD>L<EFBFBD>b<EFBFBD>v<EFBFBD><76><EFBFBD>w<EFBFBD>肳<EFBFBD><E882B3><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B>N<EFBFBD><4E>
|
||
state = LAUNCHER_INIT;
|
||
}else {
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>Ȃ<EFBFBD><C882>A<EFBFBD><41><EFBFBD>S<EFBFBD>f<EFBFBD><66><EFBFBD>N<EFBFBD><4E>
|
||
state = LOGODEMO_INIT;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD>[<5B><><EFBFBD>ʂ<EFBFBD><CA82><EFBFBD><EFBFBD>Ε\<5C><><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD>
|
||
if( SYSM_IsLauncherHidden() )
|
||
{
|
||
if(direct_boot == FALSE)
|
||
{
|
||
state = STOP;
|
||
}else
|
||
{
|
||
state = LOAD_START;
|
||
}
|
||
}
|
||
|
||
// <20>`<60><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD>
|
||
SND_LockChannel((1 << L_CHANNEL) | (1 << R_CHANNEL), 0);
|
||
|
||
/* <20>X<EFBFBD>g<EFBFBD><67><EFBFBD>[<5B><><EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>h<EFBFBD>̋N<CC8B><4E> */
|
||
OS_CreateThread(&s_strmThread,
|
||
StrmThread,
|
||
NULL,
|
||
s_strmThreadStack + THREAD_STACK_SIZE / sizeof(u64),
|
||
THREAD_STACK_SIZE, STREAM_THREAD_PRIO);
|
||
OS_WakeupThreadDirect(&s_strmThread);
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>7
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "time 7 (etc...) : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
|
||
// start<72><74><EFBFBD>Ԍv<D48C><76>8
|
||
#if (MEASURE_TIME == 1)
|
||
start = OS_GetTick();
|
||
#endif
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>[<5B><><EFBFBD>E<EFBFBD>F<EFBFBD>A<EFBFBD><EFBFBD><F096B390><EFBFBD><EFBFBD>W<EFBFBD><57><EFBFBD>[<5B><><EFBFBD>Ƀ_<C983>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>B
|
||
#ifndef DISABLE_WLFIRM_LOAD
|
||
if( FALSE == InstallWlanFirmware( SYSM_IsHotStart() ) ) {
|
||
OS_TPrintf( "ERROR: Wireless firmware download failed!\n" );
|
||
}
|
||
#endif // DISABLE_WLFIRM_LOAD
|
||
// end<6E><64><EFBFBD>Ԍv<D48C><76>8
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "Load WlanFirm Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - start ) );
|
||
#endif
|
||
|
||
if( UTL_IsFatalError() ) {
|
||
// FATAL<41>G<EFBFBD><47><EFBFBD>[<5B><><EFBFBD><EFBFBD>
|
||
}
|
||
|
||
// end <20><><EFBFBD>Ԍv<D48C><76>total
|
||
#if (MEASURE_TIME == 1)
|
||
OS_TPrintf( "Total Time : %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - allstart ) );
|
||
#endif
|
||
|
||
// <20><><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>[<5B>v--------------------
|
||
while( 1 ) {
|
||
OS_WaitIrq(1, OS_IE_V_BLANK); // V<>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>荞<EFBFBD>ݑ҂<DD91>
|
||
|
||
// <20>`<60>q<EFBFBD>l<EFBFBD>V<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M
|
||
while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL)
|
||
{
|
||
}
|
||
|
||
ReadKeyPad(); // <20>L<EFBFBD>[<5B><><EFBFBD>͂̎擾
|
||
ReadTP(); // TP<54><50><EFBFBD>͂̎擾
|
||
|
||
switch( state ) {
|
||
case LOGODEMO_INIT:
|
||
LogoInit();
|
||
// <20><><EFBFBD>炷<C282>e<EFBFBD>X<EFBFBD>g
|
||
FS_InitFile(&s_strm.file);
|
||
s_strm.isPlay = FALSE;
|
||
PlayStream(&s_strm, filename);
|
||
|
||
state = LOGODEMO;
|
||
break;
|
||
case LOGODEMO:
|
||
if( LogoMain() &&
|
||
IsFinishedLoadSharedFont() ) { // <20>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD><67><EFBFBD>[<5B>h<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ń`<60>F<EFBFBD>b<EFBFBD>N
|
||
#if 0
|
||
if( UTL_IsFatalError() ) {
|
||
state = STOP;
|
||
}else
|
||
#endif
|
||
if( !direct_boot ) {
|
||
state = LAUNCHER_INIT;
|
||
}else {
|
||
state = LOAD_START;
|
||
}
|
||
}
|
||
break;
|
||
case LAUNCHER_INIT:
|
||
LauncherInit( s_titleList );
|
||
state = LAUNCHER;
|
||
break;
|
||
case LAUNCHER:
|
||
pBootTitle = LauncherMain( s_titleList );
|
||
if( pBootTitle ) {
|
||
state = LOAD_START;
|
||
}
|
||
break;
|
||
case LOAD_START:
|
||
if( IsFinishedLoadSharedFont() ) { // <20>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>̎<EFBFBD><CC8E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ŁA<C581>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD><67><EFBFBD>[<5B>h<EFBFBD>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ń`<60>F<EFBFBD>b<EFBFBD>N
|
||
SYSM_StartLoadTitle( pBootTitle );
|
||
state = LOADING;
|
||
|
||
start = OS_GetTick();
|
||
}
|
||
break;
|
||
case LOADING:
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ń<EFBFBD><C583>[<5B>h<EFBFBD>O<EFBFBD>z<EFBFBD><7A><EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD>X<EFBFBD>g<EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>s<EFBFBD><73><EFBFBD>b<EFBFBD>Z<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD>|<7C>[<5B><><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD>A<EFBFBD><EFBFBD><F382AF8E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>state<74><65>LOAD_PAUSE<53><45>
|
||
if( SYSM_IsLoadTitlePaused() )
|
||
{
|
||
state = LOAD_PAUSE;
|
||
PrintPause();
|
||
}
|
||
if( SYSM_IsLoadTitleFinished() ) {
|
||
SYSM_StartAuthenticateTitle( pBootTitle );
|
||
state = AUTHENTICATE;
|
||
}
|
||
if( !direct_boot )
|
||
{
|
||
(void)LauncherFadeout( s_titleList ); // <20>_<EFBFBD>C<EFBFBD><43><EFBFBD>N<EFBFBD>g<EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>łȂ<C582><C882>Ƃ<EFBFBD><C682>̓t<CD83>F<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>E<EFBFBD>g<EFBFBD><67><EFBFBD>s<EFBFBD><73>
|
||
}
|
||
if( ( end == 0 ) &&
|
||
SYSM_IsLoadTitleFinished() ) {
|
||
end = OS_GetTick();
|
||
OS_TPrintf( "Load Time : %dms\n", OS_TicksToMilliSeconds( end - start ) );
|
||
}
|
||
break;
|
||
case LOAD_PAUSE:
|
||
// <20><><EFBFBD>[<5B>h<EFBFBD>O<EFBFBD>z<EFBFBD><7A><EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD>X<EFBFBD>g<EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>s<EFBFBD>ňꎞ<C588><EA8E9E><EFBFBD>~<7E><>
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>邩<EFBFBD><E982A9><EFBFBD>~<7E><><EFBFBD>邩<EFBFBD>̑I<CC91><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ꂽ<EFBFBD><EA82BD>LOADING<4E>ɖ߂<C996>
|
||
if( IsCommandSelected() )
|
||
{
|
||
state = LOADING;
|
||
}
|
||
break;
|
||
case AUTHENTICATE:
|
||
if( ( direct_boot || ( !direct_boot && LauncherFadeout( s_titleList ) ) ) &&
|
||
#ifndef DISABLE_WLFIRM_LOAD
|
||
PollingInstallWlanFirmware( FALSE ) && // <20>A<EFBFBD>v<EFBFBD><76><EFBFBD>u<EFBFBD>[<5B>g<EFBFBD>O<EFBFBD>ɖ<EFBFBD><C996><EFBFBD><EFBFBD>t<EFBFBD>@<40>[<5B><><EFBFBD>̃<EFBFBD><CC83>[<5B>h<EFBFBD>͊<EFBFBD><CD8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
#endif // DISABLE_WLFIRM_LOAD
|
||
SYSM_IsAuthenticateTitleFinished() )
|
||
{
|
||
AuthResult res;
|
||
if( UTL_IsFatalError() ) {
|
||
// FATAL<41>G<EFBFBD><47><EFBFBD>[<5B><><EFBFBD><EFBFBD>
|
||
}
|
||
|
||
res = SYSM_TryToBootTitle( pBootTitle );
|
||
switch ( res ) { // <20>A<EFBFBD>v<EFBFBD><76><EFBFBD>F<EFBFBD>،<EFBFBD><D88C>ʎ擾or<6F>u<EFBFBD>[<5B>g <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Fnever return
|
||
case AUTH_RESULT_TITLE_LOAD_FAILED:
|
||
case AUTH_RESULT_TITLE_POINTER_ERROR:
|
||
case AUTH_RESULT_AUTHENTICATE_FAILED:
|
||
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
|
||
default:
|
||
state = STOP;
|
||
// [TODO:]<5D>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>ق<EFBFBD><D982><EFBFBD><EFBFBD>ǂ<EFBFBD><C782>f<EFBFBD>[<5B>^<5E>i<EFBFBD><69><EFBFBD>Ȃǁj<C781><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ώ<EFBFBD><CE8F><EFBFBD>
|
||
|
||
// <20>G<EFBFBD><47><EFBFBD>[<5B>\<5C><>
|
||
PrintError(res);
|
||
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
case STOP: // <20><><EFBFBD>~
|
||
break;
|
||
}
|
||
|
||
// <20>J<EFBFBD>[<5B>h<EFBFBD>A<EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>̎擾<CC8E>i<EFBFBD>X<EFBFBD><58><EFBFBD>b<EFBFBD>h<EFBFBD>Ő<EFBFBD><C590><EFBFBD><EFBFBD>J<EFBFBD>[<5B>h<EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD>ʒm<CA92><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD>[<5B>v<EFBFBD>Ŏ擾<C58E>j
|
||
(void)SYSM_GetCardTitleList( s_titleList );
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>@<40>[<5B><><EFBFBD><EFBFBD><EFBFBD>[<5B>h<EFBFBD>̃|<7C>[<5B><><EFBFBD><EFBFBD><EFBFBD>O
|
||
(void)PollingInstallWlanFirmware( pBootTitle ? FALSE : TRUE );
|
||
|
||
// <20>R<EFBFBD>}<7D><><EFBFBD>h<EFBFBD>t<EFBFBD><74><EFBFBD>b<EFBFBD>V<EFBFBD><56>
|
||
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
|
||
|
||
#ifndef DISABLE_SLEEP
|
||
// <20>X<EFBFBD><58><EFBFBD>[<5B>v<EFBFBD><76><EFBFBD>[<5B>h<EFBFBD>ւ̑J<CC91>ځi<DA81>W<EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>Ԃƃf<C683>o<EFBFBD>b<EFBFBD>K<EFBFBD>ڑ<EFBFBD><DA91><EFBFBD><EFBFBD>̃L<CC83><4C><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><5A><EFBFBD>̓f<CD83>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD>ōs<C58D><73><EFBFBD>j
|
||
UTL_GoSleepMode();
|
||
#endif // DISABLE_SLEEP
|
||
}
|
||
}
|
||
|
||
static BOOL IsCommandSelected(void)
|
||
{
|
||
static BOOL left = FALSE;
|
||
if( !( pad.cont & ( PAD_BUTTON_A | PAD_BUTTON_B ) ) )
|
||
{
|
||
left = TRUE;
|
||
}
|
||
|
||
if( left && ( pad.trg & PAD_BUTTON_A ) )
|
||
{
|
||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||
PrintfSJIS( 1, 25, TXT_COLOR_RED,"Resume Loading....\n" );
|
||
SYSM_ResumeLoadingThread( TRUE );
|
||
left = FALSE;
|
||
return TRUE;
|
||
}else if( left && ( pad.trg & PAD_BUTTON_B ) )
|
||
{
|
||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||
PrintfSJIS( 1, 25, TXT_COLOR_RED,"Please Wait....\n" );
|
||
SYSM_ResumeLoadingThread( FALSE );
|
||
left = FALSE;
|
||
return TRUE;
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
static void PrintPause(void)
|
||
{
|
||
LauncherInit( s_titleList );
|
||
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
|
||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||
G2_ChangeBlendAlpha( 0, 31 );
|
||
PrintfSJIS( 1, 25, TXT_COLOR_RED,"WhiteList Check Failed.\n" );
|
||
PrintfSJIS( 1, 40, TXT_COLOR_RED,"Prease Select Command." );
|
||
PrintfSJIS( 1, 55, TXT_COLOR_RED,"A : Force to Launch" );
|
||
PrintfSJIS( 1, 70, TXT_COLOR_RED," or" );
|
||
PrintfSJIS( 1, 85, TXT_COLOR_RED,"B : Stop And Show Error Message" );
|
||
GX_DispOn();
|
||
GXS_DispOn();
|
||
}
|
||
|
||
static void PrintError(AuthResult res)
|
||
{
|
||
LauncherInit( s_titleList );
|
||
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
|
||
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL );
|
||
G2_ChangeBlendAlpha( 0, 31 );
|
||
PrintfSJIS( 1, 25, TXT_COLOR_RED,"LAUNCHER : ERROR OCCURRED! - %d\n",res );
|
||
PrintfSJIS( 1, 40, TXT_COLOR_RED,"%s",error_msg[res] );
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>\<5C><>
|
||
if(res == AUTH_RESULT_CHECK_TITLE_LAUNCH_RIGHTS_FAILED)
|
||
{
|
||
PrintfSJIS( 1, 55, TXT_COLOR_RED,"NAM result = %d", SYSMi_getCheckTitleLaunchRightsResult() );
|
||
}
|
||
GX_DispOn();
|
||
GXS_DispOn();
|
||
}
|
||
|
||
// ============================================================================
|
||
// <20><><EFBFBD>荞<EFBFBD>ݏ<EFBFBD><DD8F><EFBFBD>
|
||
// ============================================================================
|
||
|
||
// V<>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>荞<EFBFBD><E88D9E>
|
||
static void INTR_VBlank(void)
|
||
{
|
||
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // V<>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>`<60>F<EFBFBD>b<EFBFBD>N<EFBFBD>̃Z<CC83>b<EFBFBD>g
|
||
}
|
||
|