ISデバッガタスクのNANDアプリデバッグ対応の仕様を再び調整しました。 ImportJumpをその仕様に合わせて更新しました。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1184 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
kamikawa 2008-04-18 05:51:26 +00:00
parent 5081912251
commit 29341dc9dd
5 changed files with 94 additions and 40 deletions

View File

@ -38,7 +38,6 @@ typedef struct _ImportJumpSetting
u32 clearSaveBannerFile:1; // セーブバナーファイルをクリアするデフォルトOFF
u32 importTad:1; // パスで指定されたTADファイルをインポートするかTADの更新有無に依存
u32 rsv :28; // 予約
u64 bootTitleID; // タイトルID
u32 tadRomOffset; // TADをロードしたエミュレーションROMオフセット
u32 tadLength; // TADファイルの長さ
} ImportJump;

View File

@ -34,7 +34,7 @@ extern "C" {
ЉЦђи`
*---------------------------------------------------------------------------*/
BOOL kamiImportTad(void);
BOOL kamiImportTad(NAMTitleId* pTitleID);
/*===========================================================================*/

View File

@ -69,23 +69,16 @@ static void UpdateNandBoxCount( void );
Returns: None.
*---------------------------------------------------------------------------*/
BOOL kamiImportTad(void)
BOOL kamiImportTad(NAMTitleId* pTitleID)
{
NAMTadInfo tadInfo;
NAMTitleInfo titleInfo;
NAMTitleInfo titleInfoTmp;
OSThread thread;
s32 nam_result;
FSFile file;
// TADファイルが更新されていないためインポート処理をスキップする
if (GetImportJumpSetting()->importTad == 0)
{
// しかしNandInitializerによって消去されている可能性もあるので確認する
if (NAM_ReadTitleInfo(&titleInfo, GetImportJumpSetting()->bootTitleID) == NAM_OK)
{
return TRUE;
}
}
char savePublicPath[FS_ENTRY_LONGNAME_MAX];
char savePrivatePath[FS_ENTRY_LONGNAME_MAX];
char subBannerPath[FS_ENTRY_LONGNAME_MAX];
// ファイル初期化
FS_InitFile(&file);
@ -104,6 +97,9 @@ BOOL kamiImportTad(void)
return FALSE;
}
// titleIDを保存しておく
*pTitleID = tadInfo.titleInfo.titleId;
// Data Only なら失敗
if (tadInfo.titleInfo.titleId & TITLE_ID_DATA_ONLY_FLAG_MASK)
{
@ -119,34 +115,91 @@ BOOL kamiImportTad(void)
return FALSE;
}
// インポート開始フラグを立てる
sNowImport = TRUE;
// 進捗スレッド作成
spStack = OS_Alloc(THREAD_STACK_SIZE);
MI_CpuClear8(spStack, THREAD_STACK_SIZE);
OS_CreateThread(&thread, ProgressThread, NULL,
(void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1);
OS_SetThreadDestructor( &thread, Destructor );
OS_WakeupThreadDirect(&thread);
// Import開始
nam_result = NAM_ImportTadWithFile( &file );
// 進捗スレッドの自力終了を待つ
while (sNowImport){};
if ( nam_result == NAM_OK )
// TADファイルが更新されている場合に限りインポート処理を行う
// NandInitializerによって消去されている可能性もあるので確認する
if (GetImportJumpSetting()->importTad == 1 || NAM_ReadTitleInfo(&titleInfoTmp, tadInfo.titleInfo.titleId) != NAM_OK)
{
// InstalledSoftBoxCount, FreeSoftBoxCount の値を現在のNANDの状態に合わせて更新します。
UpdateNandBoxCount();
return TRUE;
// インポート開始フラグを立てる
sNowImport = TRUE;
// 進捗スレッド作成
spStack = OS_Alloc(THREAD_STACK_SIZE);
MI_CpuClear8(spStack, THREAD_STACK_SIZE);
OS_CreateThread(&thread, ProgressThread, NULL,
(void*)((u32)spStack + THREAD_STACK_SIZE), THREAD_STACK_SIZE, OS_GetCurrentThread()->priority - 1);
OS_SetThreadDestructor( &thread, Destructor );
OS_WakeupThreadDirect(&thread);
// Import開始
nam_result = NAM_ImportTadWithFile( &file );
// 進捗スレッドの自力終了を待つ
while (sNowImport){};
if ( nam_result == NAM_OK )
{
// InstalledSoftBoxCount, FreeSoftBoxCount の値を現在のNANDの状態に合わせて更新します。
UpdateNandBoxCount();
}
else
{
OS_Warning(" Fail! : NAM Result Code = 0x%x\n", nam_result);
return FALSE;
}
}
else
// セーブデータクリア処理
if (GetImportJumpSetting()->clearPublicSaveData || GetImportJumpSetting()->clearPrivateSaveData)
{
OS_Warning(" Fail! : NAM Result Code = 0x%x\n", nam_result);
return FALSE;
// セーブファイルパス取得
if ( NAM_GetTitleSaveFilePath(savePublicPath, savePrivatePath, tadInfo.titleInfo.titleId) != NAM_OK )
{
OS_Warning(" Fail! NAM_GetTitleSaveFilePath\n");
return FALSE;
}
// publicセーブデータFFクリアフォーマット
if (GetImportJumpSetting()->clearPublicSaveData && tadInfo.titleInfo.publicSaveSize > 0)
{
if (NAMUTi_ClearSavedataPublic(savePublicPath, tadInfo.titleInfo.titleId) == FALSE)
{
OS_Warning(" Fail! NAMUTi_ClearSavedataPublic\n");
return FALSE;
}
}
// privateセーブデータFFクリアフォーマット
if (GetImportJumpSetting()->clearPrivateSaveData && tadInfo.titleInfo.privateSaveSize > 0)
{
if (NAMUTi_ClearSavedataPublic(savePrivatePath, tadInfo.titleInfo.titleId) == FALSE)
{
OS_Warning(" Fail! NAMUTi_ClearSavedataPrivate\n");
return FALSE;
}
}
}
// サブバナークリア処理
if (GetImportJumpSetting()->clearSaveBannerFile)
{
// サブバナーパス取得
if ( NAM_GetTitleBannerFilePath(subBannerPath, tadInfo.titleInfo.titleId) != NAM_OK )
{
OS_Warning(" Fail! NAM_GetTitleBannerFilePath\n");
return FALSE;
}
// サブバナー破壊
{
if (NAMUTi_DestroySubBanner(subBannerPath) == FALSE)
{
OS_Warning(" Fail! NAMUTi_DestroySubBanner\n");
return FALSE;
}
}
}
return TRUE;
}
static void Destructor(void* /*arg*/)

View File

@ -53,6 +53,8 @@ extern void FS_MountHostIO(const char *basepath);
void
TwlMain()
{
NAMTitleId titleID;
// OS_Initより前に実行する
{
// SRLの後方に配置したTADファイルにアクセス可能にするために
@ -131,10 +133,10 @@ TwlMain()
}
// TADのインポート開始
if (kamiImportTad())
if (kamiImportTad(&titleID))
{
// インポートに成功したならアプリジャンプ
OS_DoApplicationJump( GetImportJumpSetting()->bootTitleID, OS_APP_JUMP_NORMAL );
OS_DoApplicationJump( titleID, OS_APP_JUMP_NORMAL );
}
// アプリジャンプに成功したならここへは到達しない