本体のアプリ表示順を、SDカードの出力順にあわせた。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2907 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-09-01 10:13:35 +00:00
parent 617aaca7df
commit 6164849472

View File

@ -46,6 +46,9 @@
#define NAND_FIRM_INFO_OFS 1 #define NAND_FIRM_INFO_OFS 1
#define SHARED_FONT_INFO_OFS 2 #define SHARED_FONT_INFO_OFS 2
#define NAND_FIRM_MAGIC_CODE 0x4649524D
#define SHARED_FONT_MAGIC_CODE 0x464f4e54
#define NAND_BLOCK_BYTE 0x200 #define NAND_BLOCK_BYTE 0x200
#define NAND_FIRM_START_OFFSET 0x200 #define NAND_FIRM_START_OFFSET 0x200
#define NAND_FIRM_START_OFFSET_IN_FILE 0x200 #define NAND_FIRM_START_OFFSET_IN_FILE 0x200
@ -101,13 +104,13 @@ typedef struct DataStruct
u8 Sha1_digest[SVC_SHA1_DIGEST_SIZE]; u8 Sha1_digest[SVC_SHA1_DIGEST_SIZE];
u16 crc16; u16 crc16;
BOOL output; BOOL sort;
} DataStruct; } DataStruct;
static u8 sFontData_Sha1_digest[SVC_SHA1_DIGEST_SIZE]; static u8 sFontData_Sha1_digest[SVC_SHA1_DIGEST_SIZE];
static u8 sNandFirm_Sha1_digest[SVC_SHA1_DIGEST_SIZE]; static u8 sNandFirm_Sha1_digest[SVC_SHA1_DIGEST_SIZE];
static DataStruct gDataList[TITLE_NUM_PAGE * 2]; static DataStruct gDataList[TITLE_NUM_PAGE];
static u16 crc_table[0x100]; static u16 crc_table[0x100];
@ -122,9 +125,9 @@ static const u32 TitleIDTable[14] = {
0x484e4a00, // 7.HNJ* Nintendoゾーン 0x484e4a00, // 7.HNJ* Nintendoゾーン
0x484e4b00, // 8.HNK* サウンド 0x484e4b00, // 8.HNK* サウンド
0x484e4c00, // 9.HNL* バージョンデータ 0x484e4c00, // 9.HNL* バージョンデータ
NAND_FIRM_INFO_OFS, //10.---- NANDファーム NAND_FIRM_MAGIC_CODE, //10.---- NANDファーム
0x344e4641, //11.4NFA Nand Filer 0x344e4641, //11.4NFA Nand Filer
SHARED_FONT_INFO_OFS, //12.---- フォント SHARED_FONT_MAGIC_CODE, //12.---- フォント
0x34544e41 //13.4TNA TwlNmenu 0x34544e41 //13.4TNA TwlNmenu
}; };
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -153,8 +156,10 @@ void* MyNAMUT_Alloc(u32 size);
void MyNAMUT_Free(void* buffer); void MyNAMUT_Free(void* buffer);
static BOOL ReadTWLSettings( void ); static BOOL ReadTWLSettings( void );
static void SortList( DataStruct* list );
static BOOL OutputHashDataForSD( DataStruct* list ); static BOOL OutputHashDataForSD( DataStruct* list );
static BOOL OutputData( FSFile* file, DataStruct* data, u32 index ); static BOOL OutputData( FSFile* file, DataStruct* data );
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -199,7 +204,9 @@ void TwlMain(void)
// hash Check // hash Check
ProcessTitleHashCheck(); ProcessTitleHashCheck();
OutputHashDataForSD(gDataList); SortList( gDataList );
OutputHashDataForSD( gDataList );
while(TRUE) while(TRUE)
{ {
@ -370,14 +377,14 @@ static void DrawScene(DataStruct* list)
tmp_i = (s32)(i & 0xf); tmp_i = (s32)(i & 0xf);
if( i == (gNandAppNum - SHARED_FONT_INFO_OFS) ) if( list[i].id == NAND_FIRM_MAGIC_CODE )
{
PutMainScreen( GAME_CODE_BASE_X, TITLE_SHOW_BASE_Y+tmp_i, OK_COLOR, "%2d:Shared Font", (tmp_i+1));
}
else if( i == (gNandAppNum - NAND_FIRM_INFO_OFS) )
{ {
PutMainScreen( GAME_CODE_BASE_X, TITLE_SHOW_BASE_Y+tmp_i, OK_COLOR, "%2d:Nand Firm", (tmp_i+1)); PutMainScreen( GAME_CODE_BASE_X, TITLE_SHOW_BASE_Y+tmp_i, OK_COLOR, "%2d:Nand Firm", (tmp_i+1));
} }
else if( list[i].id == SHARED_FONT_MAGIC_CODE )
{
PutMainScreen( GAME_CODE_BASE_X, TITLE_SHOW_BASE_Y+tmp_i, OK_COLOR, "%2d:Shared Font", (tmp_i+1));
}
else else
{ {
ConvertInitialCode(init_code, NAM_GetTitleIdLo(p->id)); ConvertInitialCode(init_code, NAM_GetTitleIdLo(p->id));
@ -393,11 +400,11 @@ static void DrawScene(DataStruct* list)
// 下画面 詳細表示 // 下画面 詳細表示
ConvertInitialCode(init_code, NAM_GetTitleIdLo(list[gCurrentElem].id)); ConvertInitialCode(init_code, NAM_GetTitleIdLo(list[gCurrentElem].id));
if( gCurrentElem == (gNandAppNum - SHARED_FONT_INFO_OFS) ) if( list[gCurrentElem].id == SHARED_FONT_MAGIC_CODE )
{ {
PutSubScreen(2, 1, 0xf6, "Shared Font Hash Data"); PutSubScreen(2, 1, 0xf6, "Shared Font Hash Data");
} }
else if( gCurrentElem == (gNandAppNum - NAND_FIRM_INFO_OFS) ) else if( list[gCurrentElem].id == NAND_FIRM_MAGIC_CODE )
{ {
PutSubScreen(2, 1, 0xf6, "Nand Firm Hash Data"); PutSubScreen(2, 1, 0xf6, "Nand Firm Hash Data");
} }
@ -626,7 +633,7 @@ static BOOL OutputHashDataForSD( DataStruct* list )
BOOL retval = TRUE; BOOL retval = TRUE;
FSFile file; FSFile file;
u32 i,j; u32 i;
char path_buf[FS_ENTRY_LONGNAME_MAX+6]; char path_buf[FS_ENTRY_LONGNAME_MAX+6];
RTCDate rtc; RTCDate rtc;
@ -659,52 +666,12 @@ static BOOL OutputHashDataForSD( DataStruct* list )
OS_PutString("Fail: OpenFile\n"); OS_PutString("Fail: OpenFile\n");
} }
// ファイルへ書き込み p = list;
retval = FS_WriteFile( &file, "**************************\n" , 27);
retval = FS_WriteFile( &file, "* Title Hash Checker *\n" , 27);
retval = FS_WriteFile( &file, "**************************\n\n", 28);
// retval = FS_WriteFile( &file, "GameCode | Title Hash:SRL [SHA1 Digest Data]\n", 45); // ファイルへ書き出し
// retval = FS_WriteFile( &file, "----------------------------------------------------\n", 53);
// 特定ファイルの書き出し
for(i=0; i<OUTPUT_SORT_TITLE_NUM; i++)
{
p = list;
// ファーム
if( TitleIDTable[i] == NAND_FIRM_INFO_OFS )
{
retval = OutputData( &file, (p + gNandAppNum - NAND_FIRM_INFO_OFS), i );
continue;
}
// シェアドフォント
else if( TitleIDTable[i] == SHARED_FONT_INFO_OFS )
{
retval = OutputData( &file, (p + gNandAppNum - SHARED_FONT_INFO_OFS), i );
continue;
}
for(j=0; j<gNandAppNum; j++, p++)
{
if( TitleIDTable[i] == ((u32)(p->id) & TITLE_ID_GAMECODE_MASK))
{
retval = OutputData( &file, p, i );
break;
}
}
}
p = list;
// 残りファイルの書き出し
for(i=0; i<gNandAppNum; i++, p++) for(i=0; i<gNandAppNum; i++, p++)
{ {
if(!p->output) retval = OutputData( &file, p );
{
OutputData( &file, p, i );
}
} }
// ファイルクローズ // ファイルクローズ
@ -714,7 +681,13 @@ static BOOL OutputHashDataForSD( DataStruct* list )
} }
static BOOL OutputData( FSFile* file, DataStruct* data, u32 index ) /*---------------------------------------------------------------------------*
Name: OutputData
Description:
*---------------------------------------------------------------------------*/
static BOOL OutputData( FSFile* file, DataStruct* data )
{ {
BOOL retval = TRUE; BOOL retval = TRUE;
u8 init_code[5]; u8 init_code[5];
@ -722,11 +695,11 @@ static BOOL OutputData( FSFile* file, DataStruct* data, u32 index )
u8* p = data->Sha1_digest; u8* p = data->Sha1_digest;
if( index == OUTPUT_NAND_FIRM_IDX ) if( data->id == NAND_FIRM_MAGIC_CODE )
{ {
retval = FS_WriteFile( file, "NandFirm\t", 9); retval = FS_WriteFile( file, "NandFirm\t", 9);
} }
else if( index == OUTPUT_SHARED_FONT_IDX ) else if( data->id == SHARED_FONT_MAGIC_CODE )
{ {
retval = FS_WriteFile( file, "SharedFont\t", 11); retval = FS_WriteFile( file, "SharedFont\t", 11);
} }
@ -750,8 +723,6 @@ static BOOL OutputData( FSFile* file, DataStruct* data, u32 index )
OS_PutString("Fail: WriteFile\n"); OS_PutString("Fail: WriteFile\n");
} }
data->output = TRUE;
return retval; return retval;
} }
@ -761,10 +732,6 @@ static BOOL OutputData( FSFile* file, DataStruct* data, u32 index )
Description: Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#define READ_SIZE 0x1000 // MasterEditorでのCRC計算にあわせるためこの値を使う #define READ_SIZE 0x1000 // MasterEditorでのCRC計算にあわせるためこの値を使う
@ -971,6 +938,8 @@ BOOL CulcuFontDataHash(DataStruct* list)
// Hash値 UpDate // Hash値 UpDate
SVC_CalcSHA1( data->Sha1_digest, pTempBuf, file_size ); SVC_CalcSHA1( data->Sha1_digest, pTempBuf, file_size );
data->id = SHARED_FONT_MAGIC_CODE;
// バッファの開放 // バッファの開放
spFreeFunc( pTempBuf ); spFreeFunc( pTempBuf );
@ -1059,6 +1028,7 @@ BOOL CulcuNandFirmHash(DataStruct* list)
if( culcu_size <= READ_NAND_FIRM_SIZE ) if( culcu_size <= READ_NAND_FIRM_SIZE )
{ {
SVC_CalcSHA1( data->Sha1_digest, pTempBuf, culcu_size ); SVC_CalcSHA1( data->Sha1_digest, pTempBuf, culcu_size );
data->id = NAND_FIRM_MAGIC_CODE;
} }
else else
{ {
@ -1072,6 +1042,75 @@ BOOL CulcuNandFirmHash(DataStruct* list)
} }
/*---------------------------------------------------------------------------*
Name: SortList
Description:
*---------------------------------------------------------------------------*/
static void SortList( DataStruct* list )
{
u32 i,j,count=0;
u8* tmpList;
DataStruct* p;
tmpList = spAllocFunc( sizeof(DataStruct) * TITLE_NUM_PAGE );
if ( tmpList == NULL )
{
OS_Warning("Failure! Alloc Buffer");
return ;
}
for(i=0; i<OUTPUT_SORT_TITLE_NUM; i++)
{
p = list;
// ファーム
if( TitleIDTable[i] == NAND_FIRM_MAGIC_CODE )
{
MI_CpuCopy8(&p[gNandAppNum - NAND_FIRM_INFO_OFS], ((DataStruct *)tmpList)+count, sizeof(DataStruct));
p[gNandAppNum - NAND_FIRM_INFO_OFS].sort = TRUE;
count++;
continue;
}
// シェアドフォント
else if( TitleIDTable[i] == SHARED_FONT_MAGIC_CODE )
{
MI_CpuCopy8(&p[gNandAppNum - SHARED_FONT_INFO_OFS], ((DataStruct *)tmpList)+count, sizeof(DataStruct));
p[gNandAppNum - SHARED_FONT_INFO_OFS].sort = TRUE;
count++;
continue;
}
for(j=0; j<gNandAppNum; j++, p++)
{
if( TitleIDTable[i] == ((u32)(p->id) & TITLE_ID_GAMECODE_MASK))
{
MI_CpuCopy8( p, ((DataStruct *)tmpList)+count, sizeof(DataStruct) );
p->sort = TRUE;
count++;
break;
}
}
}
p = list;
// 残りファイルの書き出し
for(i=0; i<gNandAppNum; i++, p++)
{
if(!p->sort)
{
MI_CpuCopy8(p, ((DataStruct *)tmpList)+count, sizeof(DataStruct));
count++;
}
}
// ソートが済んだデータを反映する
MI_CpuCopy8(tmpList, list, sizeof(DataStruct) * TITLE_NUM_PAGE);
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: newGetCRC Name: newGetCRC