・カードレジスタのスワップとカードIDのシステム領域へのセットを、カードブートの時

のみ行うよう修正。
・アプリブート時のマウント情報設定への対応。
 ・ランチャーは、自身の起動時にマウント情報を自分でセットするようにする。
 ・暫定対策:全ドライブをRW可能にしている。
 ・暫定対策:FS不具合回避のため、"nand:"を'F'ドライブに設定。
 ・MachineSettingsとPictoChatでのnand_app_hack.hを使用したFSの暫定
  NAND対応を削除。
  これに伴い、nand_app_hack.hも削除。
・NANDアプリ読み込み時のリストバグ修正。


git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@272 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-27 13:06:08 +00:00
parent eaaa5c04c8
commit fd9112d120
9 changed files with 209 additions and 174 deletions

View File

@ -44,23 +44,6 @@ void BOOT_Init( void )
BOOL BOOT_WaitStart( void )
{
if( (reg_PXI_MAINPINTF & 0x000f ) == 0x000f ) {
// メモリクリアリストの設定
static u32 clr_list[] =
{
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
#ifdef ISDBG_MB_CHILD_
HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600),
HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20),
#endif
HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED,
HW_ARENA_INFO_BUF, HW_ROM_HEADER_BUF - HW_ARENA_INFO_BUF,
HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SYSTEM_END - HW_PXI_SIGNAL_PARAM_ARM9,
NULL
};
(void)OS_DisableIrq(); // ここで割り込み禁止にしないとダメ。
(void)OS_SetIrqMask(0); // SDKバージョンのサーチに時間がかかると、ARM9がHALTにかかってしまい、ARM7のサウンドスレッドがARM9にFIFOでデータ送信しようとしてもFIFOが一杯で送信できない状態で無限ループに入ってしまう。
/*
@ -77,7 +60,25 @@ BOOL BOOT_WaitStart( void )
reg_PXI_MAINPINTF = MAINP_SEND_IF | 0x0100; // ARM9に対してブートするようIRQで要求ARM7のステートをにする。
// SDK共通リブート
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), clr_list );
{
// メモリクリアリストの設定
static u32 clr_list[] =
{
SYSM_OWN_ARM7_MMEM_ADDR, SYSM_OWN_ARM7_MMEM_ADDR_END - SYSM_OWN_ARM7_MMEM_ADDR,
SYSM_OWN_ARM9_MMEM_ADDR, SYSM_OWN_ARM9_MMEM_ADDR_END - SYSM_OWN_ARM9_MMEM_ADDR,
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
SYSM_OWN_ARM7_WRAM_ADDR, SYSM_OWN_ARM7_WRAM_ADDR_END - SYSM_OWN_ARM7_WRAM_ADDR,
#ifdef ISDBG_MB_CHILD_
HW_PRV_WRAM_END - 0x600, (HW_PRV_WRAM_END - HW_PRV_WRAM_SYSRV_SIZE) - (HW_PRV_WRAM_END - 0x600),
HW_PRV_WRAM_END - 0x600 + 0x20, HW_PRV_WRAM_END - (HW_PRV_WRAM_END - 0x600 + 0x20),
#endif
HW_MAIN_MEM_SHARED, HW_RED_RESERVED - HW_MAIN_MEM_SHARED,
HW_ARENA_INFO_BUF, HW_ROM_HEADER_BUF - HW_ARENA_INFO_BUF,
HW_PXI_SIGNAL_PARAM_ARM9, HW_MAIN_MEM_SYSTEM_END - HW_PXI_SIGNAL_PARAM_ARM9,
NULL
};
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x34), clr_list );
}
}
return FALSE;
}
@ -90,11 +91,13 @@ static void BOOTi_ClearREG_RAM( void )
MI_StopDma( (u16)i );
}
if( SYSMi_GetWork()->isCardBoot ) {
#ifdef DEBUG_USED_CARD_SLOT_B_
reg_MI_MC_SWP = 0x80; // カードスロットのスワップ
reg_MI_MC_SWP = 0x80; // カードスロットのスワップ
#endif
*(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // カード抜けチェックバッファにカードIDをセット
*(u32 *)HW_RED_RESERVED = SYSMi_GetWork()->nCardID;
*(u32 *)HW_BOOT_CHECK_INFO_BUF = SYSMi_GetWork()->nCardID; // カード抜けチェックバッファにカードIDをセット
*(u32 *)HW_RED_RESERVED = SYSMi_GetWork()->nCardID;
}
// レジスタのクリア
SVC_CpuClearFast( 0x0000, (void*)(HW_REG_BASE + 0x0b0), (0x13c - 0x0b0) );

View File

@ -54,14 +54,6 @@ static void ie_subphandler( void )
// ブート準備をして、ARM7からの通知を待つ。
void BOOT_Ready( void )
{
// メモリクリアリストの設定
static u32 clr_list[] =
{
HW_ITCM, HW_ITCM_SIZE,
//HW_DTCM, HW_DTCM_SIZE,
NULL
};
int i;
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
@ -98,8 +90,20 @@ void BOOT_Ready( void )
reg_GX_VRAMCNT_WRAM = pWRAMREGS->main_wrambnk_01;
}
// ROMヘッダバッファをコピー
MI_CpuCopy32( (void *)HW_TWL_ROM_HEADER_BUF, (void *)HW_ROM_HEADER_BUF, HW_ROM_HEADER_BUF_END - HW_ROM_HEADER_BUF );
// SDK共通リブート
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list );
{
// メモリクリアリストの設定
static u32 clr_list[] =
{
HW_ITCM, HW_ITCM_SIZE,
//HW_DTCM, HW_DTCM_SIZE,
NULL
};
OS_Boot( (void *)*(u32 *)(HW_TWL_ROM_HEADER_BUF + 0x24), clr_list );
}
}

View File

@ -27,29 +27,54 @@
// extern data-----------------------------------------------------------------
// function's prototype--------------------------------------------------------
void SYSM_SetBootSRLPath( NAMTitleId titleID );
void SYSM_SetMountInfo( NAMTitleId titleID );
void SYSMi_SetLauncherMountInfo( void );
void SYSM_SetBootAppMountInfo( NAMTitleId titleID );
static void SYSMi_ModifySaveDataMount( NAMTitleId titleID );
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
static void SYSMi_SetBootSRLPath( NAMTitleId titleID );
static void SYSMi_SetMountInfoCore( const OSMountInfo *pSrc );
// const data------------------------------------------------------------------
/*
SDKのFATFSバグ回避のため"nand:""F:"
NAND2KBリード問題対策が"F"
*/
// デフォルトマウント情報リスト
OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = {
// drive device target pertitionIdx resource userPermission rsvA B archive path
{ 'A', OS_MOUNT_DEVICE_SD, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "sdmc", "/" },
{ 'B', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, 0, 0, 0, "nand", "/" }, // ユーザーはこのアーカイブを使えない(RW不可)
{ 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, 0, 0, 0, "nand2", "/" }, // ユーザーはこのアーカイブを使えない(RW不可)
// { 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R), 0, 0, "nand", "/" }, // ユーザーはこのアーカイブではWrite不可
// { 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R), 0, 0, "nand2", "/" }, // ユーザーはこのアーカイブではWrite不可
{ 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" }, // ユーザーはこのアーカイブではWrite不可
{ 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand2", "/" }, // ユーザーはこのアーカイブではWrite不可
{ 'D', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "shared2", "nand2:/shared2" },
{ 'E', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "photo", "nand2:/photo" },
{ 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL },
{ 'G', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL },
{ 'G', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL },
{ 'H', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL },
};
// ランチャーマウント情報
const OSMountInfo s_launcherMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = {
// drive device target pertitionIdx resource userPermission rsvA B archive path
{ 'A', OS_MOUNT_DEVICE_SD, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "sdmc", "/" },
{ 'F', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 0, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand", "/" }, // ランチャーはここもアクセス可
{ 'C', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_ROOT, 1, OS_MOUNT_RSC_WRAM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "nand2", "/" }, // 同上
{ 'D', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "shared2", "nand2:/shared2" },
{ 'E', OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_DIR, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "photo", "nand2:/photo" },
{ 0, OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPrv", NULL },
{ 0, OS_MOUNT_DEVICE_NAND, OS_MOUNT_TGT_FILE, 0, OS_MOUNT_RSC_MMEM, (OS_MOUNT_USR_R|OS_MOUNT_USR_W), 0, 0, "dataPub", NULL },
};
// ============================================================================
//
@ -57,53 +82,76 @@ OSMountInfo s_defaultMountList[ DEFAULT_MOUNT_LIST_NUM ] ATTRIBUTE_ALIGN(4) = {
//
// ============================================================================
// 起動SRLパスをシステム領域にセット
void SYSM_SetBootSRLPath( NAMTitleId titleID )
// ランチャーのマウント情報セット
void SYSMi_SetLauncherMountInfo( void )
{
char path[ FS_FILE_NAME_MAX ];
// タイトルIDが"0"の時は、ROMと判断するDSダウンロードプレイの時の挙動は未実装。。。
if( titleID ) {
NAM_GetTitleBootContentPath( path, titleID );
}else {
STD_StrCpy( path, (const char*)"rom:" );
}
STD_CopyLStringZeroFill( (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, path, OS_MOUNT_PATH_LEN );
OS_TPrintf( "boot path : %s\n", (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF );
// ※とりあえず自身はROMブートで。後で修正
// SYSMi_SetBootSRLPath( 0 ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
SYSMi_SetMountInfoCore( &s_launcherMountList[0] );
}
// システム領域に、ブートするアプリのマウント情報を登録する
void SYSM_SetMountInfo( NAMTitleId titleID )
void SYSM_SetBootAppMountInfo( NAMTitleId titleID )
{
// マウント情報の整理
SYSMi_ModifySaveDataMount( titleID ); // セーブデータ
// SDは全アプリ解放で良い
// PHOTOは全アプリに解放で良い
SYSMi_SetBootSRLPath( titleID ); // 起動アプリのSRLパスをセット
SYSMi_ModifySaveDataMount( titleID ); // セーブデータ有無によるマウント情報の編集
/*
  
MountInfoはFSで直接参照してアクセス許可状態を判定しているため
FSライブラリおよびFSを使用したESやNAMライブラリが全く使用できなくなる
FSライブラリを使用する処理は
*/
SYSMi_SetMountInfoCore( (const OSMountInfo *)&s_defaultMountList[0] ); // マウント情報のセット
}
// 起動SRLパスをシステム領域にセット
static void SYSMi_SetBootSRLPath( NAMTitleId titleID )
{
static char path[ FS_FILE_NAME_MAX ];
// マウント情報をシステム領域に書き込み
{
OSMountInfo *pSrc = s_defaultMountList;
OSMountInfo *pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
int i;
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
if( pSrc->drive[ 0 ] ) {
MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) );
pDst++;
}
pSrc++;
MI_CpuClear8( path, FS_FILE_NAME_MAX );
// タイトルIDが"0"の時は、ROMと判断するDSダウンロードプレイの時の挙動は未実装。。。
if( titleID ) {
if( NAM_GetTitleBootContentPath( path, titleID ) != NAM_OK ) {
OS_TPrintf( "ERROR: BootContentPath Get failed.\n" );
}
#if 0
pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
OS_TPrintf( "mount path : %s\n", pDst->path );
}else {
// STD_StrCpy( path, (const char*)"rom:" ); // ※SDK2623では、BootSRLPathを"rom:"としたらFSi_InitRomArchiveでNANDアプリ扱いされてアクセス例外で落ちる。
}
STD_CopyLStringZeroFill( (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF, path, OS_MOUNT_PATH_LEN );
// OS_TPrintf( "boot path : %s\n", (char *)HW_TWL_FS_BOOT_SRL_PATH_BUF ); // ※今はOS_Init前で呼ばれるので、Printfできない。
}
// マウント情報をシステム領域に書き込み
static void SYSMi_SetMountInfoCore( const OSMountInfo *pSrc )
{
OSMountInfo *pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
int i;
MI_CpuClearFast( (void *)HW_TWL_FS_MOUNT_INFO_BUF, HW_TWL_FS_BOOT_SRL_PATH_BUF - HW_TWL_FS_MOUNT_INFO_BUF );
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
if( pSrc->drive[ 0 ] ) {
MI_CpuCopyFast( pSrc, pDst, sizeof(OSMountInfo) );
pDst++;
}
#endif
pSrc++;
}
#if 0
pDst = (OSMountInfo *)HW_TWL_FS_MOUNT_INFO_BUF;
for( i = 0; i < DEFAULT_MOUNT_LIST_NUM; i++ ) {
OS_TPrintf( "mount path : %s\n", pDst->path );
pDst++;
}
#endif
}
// タイトルIDをもとにセーブデータ有無を判定して、マウント情報を編集する。
static void SYSMi_ModifySaveDataMount( NAMTitleId titleID )
{
@ -116,13 +164,13 @@ static void SYSMi_ModifySaveDataMount( NAMTitleId titleID )
// セーブデータのファイルパスを取得
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
// 結果を元にマウント情報を編集。
for( i = 0; i < 2; i++ ) {
FSFile file[1];
FS_InitFile( file );
// ※現在は、セーブファイルを開けるかどうかでセーブファイル有無を確認。
// 最終的にはTMDもしくはROMヘッダの値を参照。ROMヘッダの方が簡単で速いか
if( FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) {
FS_CloseFile( file );
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
@ -138,3 +186,56 @@ static void SYSMi_ModifySaveDataMount( NAMTitleId titleID )
}
}
}
/*
static void SYSMi_ModifySaveDataMount2( NAMTitleId titleID, ROM_Header_Short *pROMH )
{
int i;
OSMountInfo *pMountTgt = &s_defaultMountList[ PRV_SAVE_DATA_MOUNT_INDEX ];
u32 *pROMHSaveDataSize = &pROMH->public_save_data_size;
if( titleID ) {
// タイトルIDが指定されているNANDアプリの場合は、セーブデータ有無を判定して、パスをセット
char saveFilePath[ 2 ][ FS_FILE_NAME_MAX ];
// セーブデータのファイルパスを取得
NAM_GetTitleSaveFilePath( saveFilePath[ 1 ], saveFilePath[ 0 ], titleID );
// 結果を元にマウント情報を編集。
for( i = 0; i < 2; i++ ) {
BOOL isFind = FALSE;
// ROMヘッダにセーブデータサイズの記載があるなら
if( *pROMHSaveDataSize++ ) {
FSFile file[1];
FS_InitFile( file );
// セーブファイルを開けるならOK。
if( FS_OpenFileEx( file, saveFilePath[ i ], FS_FILEMODE_R) ) {
FS_CloseFile( file );
isFind = TRUE;
}
// ※ランチャーでセーブデータファイルのリカバリまでやる?
#if 0
else if( FS_CreateFile( saveFilePath[ i ], FS_PERMIT_R | FS_PERMIT_W ) &&
FS_SetFileLength( file, *pROMHSaveDataSize ) ) {
FS_CloseFile( file );
isFind = TRUE;
}
#endif
}
if( isFind ) {
STD_CopyLStringZeroFill( pMountTgt->path, saveFilePath[ i ], OS_MOUNT_PATH_LEN );
}else {
pMountTgt->drive[ 0 ] = 0;
}
pMountTgt++;
}
}else {
// タイトルID指定なしのカードアプリの場合は、セーブデータ無効
for( i = 0; i < 2; i++ ) {
pMountTgt->drive[ 0 ] = 0;
}
}
}
*/

View File

@ -21,6 +21,7 @@
#include "spi.h"
// define data-----------------------------------------------------------------
#define CARD_BANNER_INDEX ( LAUNCHER_TITLE_LIST_NUM - 1 )
typedef struct BannerCheckParam {
u8 *pSrc;
@ -28,8 +29,8 @@ typedef struct BannerCheckParam {
}BannerCheckParam;
// extern data-----------------------------------------------------------------
extern void SYSM_SetMountInfo( NAMTitleId titleID ); // マウント情報のセット
extern void SYSM_SetBootSRLPath( NAMTitleId titleID ); // SRL起動パスのセット
extern void SYSMi_SetLauncherMountInfo( void );
extern void SYSM_SetBootAppMountInfo( NAMTitleId titleID ); // マウント情報のセット
// function's prototype-------------------------------------------------------
static TitleProperty *SYSMi_CheckShortcutBoot( void );
@ -141,6 +142,9 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) )
pSysm = SYSMi_GetWork();
#endif /* SYSM_DEBUG_ */
// ランチャーのマウント情報セット
SYSMi_SetLauncherMountInfo();
// ARM7コンポーネント用プロテクションユニット領域変更
OS_SetProtectionRegion( 2, SYSM_OWN_ARM7_MMEM_ADDR, 512KB );
@ -307,10 +311,10 @@ BOOL SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
// バナーデータのリード
if( SYSM_GetCardRomHeader()->banner_offset &&
SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ 0 ] ) ) {
pTitleList_Card->pBanner = &s_bannerBuf[ 0 ];
SYSMi_ReadCardBannerFile( SYSM_GetCardRomHeader()->banner_offset, &s_bannerBuf[ CARD_BANNER_INDEX ] ) ) {
pTitleList_Card->pBanner = &s_bannerBuf[ CARD_BANNER_INDEX ];
}else {
MI_CpuClearFast( &s_bannerBuf[ 0 ], sizeof(TWLBannerFile) );
MI_CpuClearFast( &s_bannerBuf[ CARD_BANNER_INDEX ], sizeof(TWLBannerFile) );
}
}
@ -363,9 +367,13 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
int l;
int gotten;
NAMTitleId titleIdArray[ LAUNCHER_TITLE_LIST_NUM ];
gotten = NAM_GetTitleList( &titleIdArray[ 1 ], LAUNCHER_TITLE_LIST_NUM - 1 ) + 1;
for(l=1;l<gotten;l++)
if( listNum > LAUNCHER_TITLE_LIST_NUM ) {
OS_TPrintf( "Warning: TitleList_Nand num over LAUNCHER_TITLE_LIST_NUM(%d)\n", LAUNCHER_TITLE_LIST_NUM );
}
gotten = NAM_GetTitleList( &titleIdArray[ 0 ], LAUNCHER_TITLE_LIST_NUM - 1 );
for(l=0;l<gotten;l++)
{
//ヘッダからバナーを読み込む
FSFile file[1];
@ -429,26 +437,18 @@ int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand, int listNum )
titleIdArray[l] = 0;
}
#if 0
for(l=1;l<listNum;l++)
{
pTitleList_Nand[l].titleID = 0;
pTitleList_Nand[l].pBanner = 0;
}
#else
// カードアプリ部分を除いたリストクリア
MI_CpuClearFast( &pTitleList_Nand[ 1 ], sizeof(TitleProperty) * ( listNum - 1 ) );
#endif
listNum = (gotten<listNum) ? gotten : listNum;
for(l=1;l<listNum;l++)
for(l=0;l<listNum;l++)
{
pTitleList_Nand[l].titleID = titleIdArray[l];
pTitleList_Nand[l].pBanner = &s_bannerBuf[l];
pTitleList_Nand[l+1].titleID = titleIdArray[l];
pTitleList_Nand[l+1].pBanner = &s_bannerBuf[l];
if( titleIdArray[l] ) {
pTitleList_Nand[l].flags.isValid = TRUE;
pTitleList_Nand[l].flags.media = TITLE_MEDIA_NAND;
pTitleList_Nand[l+1].flags.isValid = TRUE;
pTitleList_Nand[l+1].flags.media = TITLE_MEDIA_NAND;
}
}
// return : *TitleProperty Array
@ -657,7 +657,7 @@ OS_TPrintf("RebootSystem failed: cant read file(%d, %d)\n", source[i], len);
void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
{
#define THREAD_PRIO 17
#define STACK_SIZE 5120 // 適当
#define STACK_SIZE 0xc00
static u64 stack[ STACK_SIZE / sizeof(u64) ];
// アプリ未ロード状態なら、ロード開始
@ -671,6 +671,10 @@ void SYSM_StartLoadTitle( TitleProperty *pBootTitle )
SYSMi_Relocate();
SYSMi_GetWork()->isLoadSucceeded = TRUE;
}
if( pBootTitle->flags.media == TITLE_MEDIA_CARD ) {
SYSMi_GetWork()->isCardBoot = TRUE;
}
}
@ -739,8 +743,7 @@ AuthResult SYSM_AuthenticateTitle( TitleProperty *pBootTitle )
// マウント情報の登録
SYSM_SetMountInfo ( pBootTitle->titleID );
SYSM_SetBootSRLPath( pBootTitle->titleID );
SYSM_SetBootAppMountInfo ( pBootTitle->titleID );
BOOT_Ready(); // never return.

View File

@ -18,7 +18,6 @@
#include <twl.h>
#include "misc.h"
#include "MachineSetting.h"
#include "nand_app_hack.h"
// extern data-----------------------------------------------------------------
@ -79,12 +78,6 @@ void TwlMain(void)
SYSM_CaribrateTP();
}
{
// ファイルシステム切り替え応急処置
// FS_IdentifyTitle(0x4d534554);//MSET
FS_IdentifyTitle(0x5445534d);//TESM ※今はmakerom.TWLのバグで逆になっている。
}
InitBG();
GetAndDrawRTCData( &g_rtcDraw, TRUE );
MachineSettingInit();

View File

@ -18,7 +18,6 @@
#include <twl.h>
#include "misc.h"
#include "PictoChat.h"
#include "nand_app_hack.h"
// extern data-----------------------------------------------------------------
@ -61,12 +60,6 @@ void TwlMain(void)
// システムの初期化------------------
InitAllocator();
{
// ファイルシステム切り替え応急処置
// FS_IdentifyTitle(0x50434854);//PCHT
FS_IdentifyTitle(0x54484350);//THCP ※今はmakerom.TWLのバグで逆になっている。
}
InitBG();
PictoChatInit();
// メインループ----------------------------

View File

@ -1,63 +0,0 @@
// とにかく.appファイル内のSRLを直接読み込むコールバック
//#define WAD_SRL_OFFSET 0x12C0
#define WAD_SRL_OFFSET 0
static FSResult ReadFromWad(FSArchive *arc, void *buffer, u32 offset, u32 length)
{
FSFile *file = (FSFile *)FS_GetArchiveBase(arc);
(void)FS_SeekFile(file, (int)(WAD_SRL_OFFSET + offset), FS_SEEK_SET);
return (FS_ReadFile(file, buffer, (int)length) >= 0) ?
FS_RESULT_SUCCESS : FS_GetResultCode(file);
}
// 指定のタイトルIDで起動したNANDアプリであると仮定して"rom"アーカイブを置換
static BOOL FS_IdentifyTitle(u32 titleLo)
{
BOOL retval = FALSE;
static struct
{
BOOL initialized;
FSFile file[1];
}
context;
if (!context.initialized)
{
context.initialized = TRUE;
// if (OS_GetBootType() == OS_BOOTTYPE_NAND)
{
char path[FS_ENTRY_LONGNAME_MAX];
/* STD_TSPrintf(path, "nand:/title_e/00010001/%02X%02X%02X%02X/content/12123434.app",
((titleLo / 1000) % 10) + '0',
((titleLo / 100) % 10) + '0',
((titleLo / 10) % 10) + '0',
((titleLo / 1) % 10) + '0');
*/
STD_TSPrintf(path, "nand:/title/00010001/%08X/content/12123434.app", titleLo );
if (!FS_IsAvailable())
{
FS_Init(FS_DMA_NOT_USE);
}
if (FS_OpenFileEx(context.file, path, FS_FILEMODE_R))
{
CARDRomHeader header[1];
(void)FS_SeekFile(context.file, (int)(WAD_SRL_OFFSET + 0), FS_SEEK_SET);
if (FS_ReadFile(context.file, header, sizeof(header)) == sizeof(header))
{
FSArchive *arc = FS_FindArchive("rom", 3);
(void)FS_UnloadArchive(arc);
if (FS_LoadArchive(arc, (u32)context.file,
header->fat.offset, header->fat.length,
header->fnt.offset, header->fnt.length,
ReadFromWad, NULL))
{
retval = TRUE;
}
}
if (!retval)
{
(void)FS_CloseFile(context.file);
}
}
}
}
return retval;
}

View File

@ -102,13 +102,14 @@ typedef struct SYSM_work {
vu16 isOnDebugger :1; // デバッガ動作か?
vu16 isExistCard :1; // 有効なNTR/TWLカードが存在するか
vu16 isCardStateChanged :1; // カード状態更新フラグ
vu16 isLoadSucceeded :1;
vu16 isLoadSucceeded :1; // アプリロード完了?
vu16 isCardBoot :1; // カードブートか?
#ifdef DEBUG_USED_CARD_SLOT_B_
vu16 isValidCardBanner :1;
vu16 is1stCardChecked :1;
vu16 rsv :5;
vu16 rsv :4;
#else
vu16 rsv :7;
vu16 rsv :6;
#endif
u16 cardHeaderCrc16; // カード検出時に算出したROMヘッダCRC16ARM9側でコピーして使用する側