From 2af4e9a6e02d80e84de68f9714b79d12d8424cb7 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Thu, 26 Feb 2009 07:51:02 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E5=88=97?= =?UTF-8?q?=E6=8C=99=E6=99=82=E3=81=AB=E3=80=81=E7=89=B9=E5=AE=9A=E3=81=AE?= =?UTF-8?q?=E6=B3=95=E5=89=87=E3=81=AB=E3=81=97=E3=81=9F=E3=81=8C=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=82=BD=E3=83=BC=E3=83=88=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20=E3=81=93=E3=81=AE?= =?UTF-8?q?=E4=B8=A6=E3=81=B3=E9=A0=86=E3=81=AB=E3=82=88=E3=81=A3=E3=81=A6?= =?UTF-8?q?=E3=80=81=E3=82=AA=E3=83=BC=E3=83=88=E5=AE=9F=E8=A1=8C=E6=99=82?= =?UTF-8?q?=E3=81=AE=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E9=A0=86?= =?UTF-8?q?=E5=BA=8F=E3=82=82=E6=B1=BA=E5=AE=9A=E3=81=95=E3=82=8C=E3=81=BE?= =?UTF-8?q?=E3=81=99?= 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@2755 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../NandInitializerRed/ARM9.TWL/Makefile | 3 +- .../ARM9.TWL/include/sort_title.h | 100 ++++++++++++++++++ .../ARM9.TWL/src/process_import.c | 48 +++++++-- .../ARM9.TWL/src/sort_title.c | 86 +++++++++++++++ 4 files changed, 226 insertions(+), 11 deletions(-) create mode 100644 build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/sort_title.h create mode 100644 build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/sort_title.c diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile index 6cea7dc1..bde667a8 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/Makefile @@ -81,7 +81,8 @@ SRCS = main.c \ process_mcu.c \ process_wireless_setting.c \ hwi.c \ - debugger_hw_reset_control.c + debugger_hw_reset_control.c \ + sort_title.c LINCLUDES = ../common/include \ $(ROOT)/build/libraries/lcfg/ARM9.TWL/include \ diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/sort_title.h b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/sort_title.h new file mode 100644 index 00000000..50e1f415 --- /dev/null +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/include/sort_title.h @@ -0,0 +1,100 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - NandInitializer + File: sort_title.h + + Copyright 2008 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$ + *---------------------------------------------------------------------------*/ + +/* + +【つかいかた】 + +TitleID と パス文字列の先頭アドレス を TitleSortSet 構造体にセットして +TitleSortSet 構造体を SortTitle 関数に引き渡します。 + +パス文字列の実体は、適当にどこかに格納しておいて弄らないようにしてください。 +次に使用例を示します。 + + +【擬似コード】 + +#define FILE_NUM_MAX 256 // 手抜き +#define QSORT_BUF_SIZE ((8+1) * 8) // サイズは(log2(num)+1) * 8 bytes + + char sFilePath[FILE_NUM_MAX][FS_ENTRY_LONGNAME_MAX]; + TitleSortSet sTitleSortSet[FILE_NUM_MAX]; + FSDirectoryEntryInfo info[1]; + NAMTadInfo tadInfo; + char qsortBuf[QSORT_BUF_SIZE]; + + while (ファイル全部舐めるまで) + { + // 〜 info にファイル情報読み込み〜 + // 〜 tadInfo に tad 情報取得〜 + + STD_CopyString( sFilePath[ counter ], info->longname ); + sTitleSortSet[ counter ].titleID = tadInfo.titleInfo.titleId; + sTitleSortSet[ counter ].path = sFilePath[ counter ]; + + counter++; + } + + SortTitle( sTitleSortSet, counter, qsortBuf ); + + // ソート完了 + +*/ + +#ifndef TWL_SORT_TITLE_H_ +#define TWL_SORT_TITLE_H_ + +/*---------------------------------------------------------------------------* + 定数定義 + *---------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/*===========================================================================*/ + +typedef struct { + OSTitleId titleID; + char *path; +} TitleSortSet; + +// TitleSortSet の配列をある法則にしたがってソートします。 +// 内部で MATH_QSort を使用しているので、MATH_QSortStackSize() 関数で取得できる +// サイズの作業バッファを buf に与える必要があります。 +// このサイズは (log2(num)+1) * 8 byte となっています。 +// 作業バッファを渡さない場合には、スタックからこのサイズの作業領域が確保されます。 +// +// info ソートする TitleSortSet 配列の先頭アドレス +// num ソートする配列の要素数 +// buf 作業バッファ +void SortTitle( TitleSortSet *info, u32 num, void *buf ); + +/*===========================================================================*/ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TWL_SORT_TITLE_H_ */ + +/*---------------------------------------------------------------------------* + End of file + *---------------------------------------------------------------------------*/ diff --git a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c index d4e5eba6..33385236 100644 --- a/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c +++ b/build/systemMenu_tools/NandInitializerRed/ARM9.TWL/src/process_import.c @@ -15,6 +15,8 @@ $Author$ *---------------------------------------------------------------------------*/ +#include "sort_title.h" + #include #include #include @@ -65,6 +67,7 @@ typedef enum { // 表示&インポートできる.TADファイルは最大16個まで // しかもSDカードのルートに存在するファイルのみというお手軽実装 #define FILE_NUM_MAX 256 +#define QSORT_BUF_SIZE ((8+1) * 8) // サイズは(Log2(FILE_NUM_MAX)+1) * 8 bytes 必要 動的確保できるならそっちの方が楽 #define VIEW_LINES_MAX 16 @@ -78,6 +81,7 @@ static s32 sMenuSelectNoIndividually; static LCFGReadResult (*s_pReadSecureInfoFunc)( void ); static char sFilePath[FILE_NUM_MAX][FS_ENTRY_LONGNAME_MAX]; +static TitleSortSet sTitleSortSet[FILE_NUM_MAX]; static u8 sFileNum; @@ -159,6 +163,7 @@ void* ImportProcess0(void) // 配列クリア MI_CpuClear8( sFilePath, sizeof(sFilePath) ); + MI_CpuClear8( sTitleSortSet, sizeof(sTitleSortSet) ); // ファイル数初期化 sFileNum = 0; @@ -176,6 +181,8 @@ void* ImportProcess0(void) kamiFontFillChar( 0, BG_COLOR_PINK, BG_COLOR_PINK ); kamiFontFillChar( 1, BG_COLOR_PINK, BG_COLOR_PINK ); kamiFontFillChar( 2, BG_COLOR_PINK, BG_COLOR_TRANS ); + + FS_InitFile(&dir); // SDカードのルートディレクトリを検索 if ( !FS_OpenDirectory(&dir, "sdmc:/", FS_FILEMODE_R | FS_FILEMODE_W) ) @@ -184,6 +191,8 @@ void* ImportProcess0(void) } else { + int l; + char qsortBuf[QSORT_BUF_SIZE]; FSDirectoryEntryInfo info[1]; OS_Printf("[%s]:\n", "sdmc:/"); @@ -208,13 +217,24 @@ void* ImportProcess0(void) { if (!STD_CompareString( pExtension, ".tad") || !STD_CompareString( pExtension, ".TAD") ) { + NAMTadInfo tadInfo; char full_path[FS_ENTRY_LONGNAME_MAX+6]; // フルパスを作成 MakeFullPathForSD(info->longname, full_path); STD_CopyString( sFilePath[sFileNum], info->longname ); - kamiFontPrintfConsole(CONSOLE_ORANGE, "%d:%s\n", sFileNum, info->longname); + // kamiFontPrintfConsole(CONSOLE_ORANGE, "%d:%s\n", sFileNum, info->longname); + + // tadファイルの情報取得 + if (NAM_ReadTadInfo(&tadInfo, full_path) != NAM_OK) + { + // 失敗したらエラーを表示して現在のファイルを飛ばして先へ進む + kamiFontPrintfConsole(CONSOLE_RED, "Error NAM_ReadTadInfo()\n"); + continue; + } + sTitleSortSet[sFileNum].titleID = tadInfo.titleInfo.titleId; + sTitleSortSet[sFileNum].path = sFilePath[sFileNum]; if (++sFileNum >= FILE_NUM_MAX) { @@ -225,7 +245,15 @@ void* ImportProcess0(void) } } (void)FS_CloseDirectory(&dir); - + + // ファイルパスをTitleID_lo順にソートする + SortTitle( sTitleSortSet, sFileNum, qsortBuf ); + + for( l=0; ltitleID); + u32 titleID_lo2 = (u32)(0xffffffff & ipp2->titleID); + BOOL isSystem1 = (u32)( 0x1 & ( ipp1->titleID >> 32 ) ) ? TRUE : FALSE; + BOOL isSystem2 = (u32)( 0x1 & ( ipp2->titleID >> 32 ) ) ? TRUE : FALSE; + BOOL isH1 = ( (u8)( 0xff & ( titleID_lo1 >> 24 ) ) == 'H' ) ? TRUE : FALSE; + BOOL isH2 = ( (u8)( 0xff & ( titleID_lo2 >> 24 ) ) == 'H' ) ? TRUE : FALSE; + + if( isSystem1 && !isSystem2 ) + { + // 要素1が System であり、要素2が System でない場合、要素1が前 (-1) + return -1; + }else if( !isSystem1 && isSystem2 ) + { + // 要素1が System でなく、要素2が System である場合、要素1が後 (1) + return 1; + }else if( isH1 && !isH2 ) + { + // 要素1が "H***" であり、要素2が "H***" でない場合、要素1が前 (-1) + return -1; + }else if( !isH1 && isH2 ) + { + // 要素1が "H***" でなく、要素2が "H***" である場合、要素1が後 (1) + return 1; + }else + { + // その他の場合、titleID_loの小さいほうが前 + return ( titleID_lo1 > titleID_lo2 ) ? + 1 : + ( (titleID_lo1 < titleID_lo2) ? -1 : 0 ); + } + +} + +// TitleSortSet の配列をある法則にしたがってソートします。 +// 内部で MATH_QSort を使用しているので、MATH_QSortStackSize() 関数で取得できる +// サイズの作業バッファを buf に与える必要があります。 +// このサイズは (log2(num)+1) * 8 byte となっています。 +// 作業バッファを渡さない場合には、スタックからこのサイズの作業領域が確保されます。 +// +// info ソートする TitleSortSet 配列の先頭アドレス +// num ソートする配列の要素数 +// buf 作業バッファ +void SortTitle( TitleSortSet *info, u32 num, void *buf ) +{ + MATH_QSort( info, num, sizeof(TitleSortSet), TitleCompareFunc, buf ); +} \ No newline at end of file