diff --git a/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c b/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c index 7fd95cd3..4f78fb37 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c +++ b/build/libraries_sysmenu/settings/ARM9/src/NTRSettings.c @@ -66,42 +66,49 @@ typedef struct IPL2HeaderPart { } IPL2HeaderPart; // 0x20bytes +// NTR各種設定データのNVRAM保存時フォーマット +typedef struct NSDStore{ + NTRSettingsData nsd; // NTR各種設定データ + u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。 + u16 crc16; // NTR各種設定データの16bitCRC + u8 pad[ 128 - sizeof(NTRSettingsData) - 4]; +}NSDStore; // 128byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。 + + +// NTR各種設定データEXのNVRAM保存時フォーマット(上記NCDStoreと互換をとるための無理やり拡張) +typedef struct NSDStoreEx{ + NTRSettingsData nsd; // NTR各種設定データ + u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。 + u16 crc16; // NTR各種設定データの16bitCRC + NTRSettingsDataEx nsd_ex; + u16 crc16_ex; +}NSDStoreEx; // 256byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。 + + // function's prototype------------------------------------------------- u32 NSD_GetNSDRomAddr( void ); // NTRSettingデータのNVRAM格納アドレスを取得 u8 NSD_GetIPL2Type( void ); // NTR-IPL2タイプを取得 const u8 *NSD_GetIPL2Timestamp( void ); // NTR-IPL2のタイムスタンプを取得 static void NSDi_ReadIPL2Header( void ); -static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ); -static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStore, u8 region ); +static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u32 validLangBitmap ); +static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStore, u32 validLangBitmap ); static BOOL NVRAMm_ExecuteCommand( int nvState, u32 addr, u16 size, u8 *pSrc ); static void Callback_NVRAM( PXIFifoTag tag, u32 data, BOOL err ); // static variables----------------------------------------------------- -static NSDStoreEx s_NSDStoreEx ATTRIBUTE_ALIGN(32); +static NSDStoreEx s_NSDStoreEx[ 2 ] ATTRIBUTE_ALIGN(32); static IPL2HeaderPart s_IPL2Header ATTRIBUTE_ALIGN(32); static BOOL s_isReadIPL2H = FALSE; static volatile BOOL s_nvCbOccurred; static volatile u16 s_nvResult; static int s_indexNSD = NSD_NOT_CORRECT; -#ifndef SDK_FINALROM -static NSDStoreEx (*s_pNSDStoreExArray)[2]; -#endif // global variables----------------------------------------------------- -NTRSettingsData *g_pNSD = &s_NSDStoreEx.nsd; -NTRSettingsDataEx *g_pNSDEx = &s_NSDStoreEx.nsd_ex; +NTRSettingsData *g_pNSD = &s_NSDStoreEx[ 0 ].nsd; +NTRSettingsDataEx *g_pNSDEx = &s_NSDStoreEx[ 0 ].nsd_ex; // const data----------------------------------------------------------- -static const u16 s_validLangBitmapList[] = { // ※TWLに合わせた方が良さそう。 - NTR_LANG_BITMAP_WW, // TWL_REGION_JAPAN - NTR_LANG_BITMAP_WW, // TWL_REGION_AMERICA - NTR_LANG_BITMAP_WW, // TWL_REGION_EUROPE - NTR_LANG_BITMAP_WW, // TWL_REGION_AUSTRALIA - NTR_LANG_BITMAP_CHINA, // TWL_REGION_CHINA - NTR_LANG_BITMAP_KOREA, // TWL_REGION_KOREA -}; - // function's description----------------------------------------------- @@ -153,25 +160,21 @@ BOOL NSD_IsReadSettings( void ) } -BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ) +BOOL NSD_ReadSettings( u32 validLangBitmap ) { - NSDStoreEx *pNSDStoreEx = (NSDStoreEx *)pTempBuffer; -#ifndef SDK_FINALROM - s_pNSDStoreExArray = pTempBuffer; - OS_TPrintf( "NSDStoreBuff : %08x %08x\n", &(*s_pNSDStoreExArray)[ 0 ], &(*s_pNSDStoreExArray)[ 1 ] ); -#endif - - DC_InvalidateRange( pNSDStoreEx, sizeof(NSDStoreEx) * 2 ); + DC_InvalidateRange( s_NSDStoreEx, sizeof(NSDStoreEx) * 2 ); // フラッシュからニ重化されているNTR設定データを読み出す。 - while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr(), sizeof(NSDStoreEx), (u8 *)&pNSDStoreEx[ 0 ] ) ) {} - while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr() + SPI_NVRAM_PAGE_SIZE, sizeof(NSDStoreEx), (u8 *)&pNSDStoreEx[ 1 ] ) ) {} + while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr(), sizeof(NSDStoreEx), (u8 *)&s_NSDStoreEx[ 0 ] ) ) {} + while( !NVRAMm_ExecuteCommand( COMM_RD, NSD_GetNSDRomAddr() + SPI_NVRAM_PAGE_SIZE, sizeof(NSDStoreEx), (u8 *)&s_NSDStoreEx[ 1 ] ) ) {} OS_TPrintf("NSD read addr=%08x\n", NSD_GetNSDRomAddr() ); // 読み出したデータのどちらが有効かを判定する。 - if( NSDi_CheckCorrectNSD( pTempBuffer, region ) ) { - // 有効なNTR設定データを静的バッファに転送 - MI_CpuCopyFast( (void *)&pNSDStoreEx[ s_indexNSD ], (void *)&s_NSDStoreEx, sizeof(NSDStoreEx) ); + if( NSDi_CheckCorrectNSD( &s_NSDStoreEx, validLangBitmap ) ) { + // 有効なNTR設定データを先頭要素にコピー + if( s_indexNSD == 1 ) { + MI_CpuCopyFast( (void *)&s_NSDStoreEx[ s_indexNSD ], (void *)&s_NSDStoreEx[ 0 ], sizeof(NSDStoreEx) ); + } }else { // 有効なデータがないなら、バッファをクリアする OS_TPrintf( "NSD clear.\n" ); @@ -179,7 +182,7 @@ BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ) return FALSE; } - OS_TPrintf("Use NSD[%d] : saveCount = %d\n", s_indexNSD, s_NSDStoreEx.saveCount); + OS_TPrintf("Use NSD[%d] : saveCount = %d\n", s_indexNSD, s_NSDStoreEx[ 0 ].saveCount ); return TRUE; } @@ -188,10 +191,11 @@ BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ) //---------------------------------------------------------------------- // NTR設定データのライト //---------------------------------------------------------------------- -BOOL NSD_WriteSettings( u8 region ) +BOOL NSD_WriteSettings( void ) { int retry; u32 nvramAddr; + NSDStoreEx *pNSDStoreEx = &s_NSDStoreEx[ 0 ]; // まだNTR設定データがリードされていなければ、リードを行って必要な情報を取得する。 if( !NSD_IsReadSettings() ) { @@ -200,24 +204,25 @@ BOOL NSD_WriteSettings( u8 region ) } // NSD のCRC、セーブカウント値、ライトアドレスの算出。 - s_NSDStoreEx.nsd.version = NTR_SETTINGS_DATA_VERSION; // バージョンを現在のものに設定。 - s_NSDStoreEx.crc16 = SVC_GetCRC16( 0xffff, (const void *)&s_NSDStoreEx.nsd, sizeof(NTRSettingsData) ); - s_NSDStoreEx.saveCount = (u8)( ( s_NSDStoreEx.saveCount + 1 ) & SAVE_COUNT_MASK ); + pNSDStoreEx->nsd.version = NTR_SETTINGS_DATA_VERSION; // バージョンを現在のものに設定。 + pNSDStoreEx->crc16 = SVC_GetCRC16( 0xffff, (const void *)&pNSDStoreEx->nsd, sizeof(NTRSettingsData) ); + pNSDStoreEx->saveCount = (u8)( ( pNSDStoreEx->saveCount + 1 ) & SAVE_COUNT_MASK ); // NSD_EXのCRC算出。 - s_NSDStoreEx.nsd_ex.version = NTR_SETTINGS_DATA_EX_VERSION; // バージョンを現在のものに設定。 - s_NSDStoreEx.nsd_ex.valid_language_bitmap = s_validLangBitmapList[ region ]; - s_NSDStoreEx.crc16_ex = SVC_GetCRC16( 0xffff, (const void *)&s_NSDStoreEx.nsd_ex, sizeof(NTRSettingsDataEx) ); + pNSDStoreEx->nsd_ex.version = NTR_SETTINGS_DATA_EX_VERSION; // バージョンを現在のものに設定。 + pNSDStoreEx->nsd_ex.valid_language_bitmap &= NTR_LANG_BITMAP_ALL; // NTR側は日英仏独伊西中韓のみ + pNSDStoreEx->nsd_ex.valid_language_bitmap |= ( 0x0001 << NTR_LANG_ENGLISH ); // 英語は強制ON(旧NTRアプリ対策) + pNSDStoreEx->crc16_ex = SVC_GetCRC16( 0xffff, (const void *)&pNSDStoreEx->nsd_ex, sizeof(NTRSettingsDataEx) ); // NTR設定データのライト - DC_FlushRange( &s_NSDStoreEx, sizeof(NSDStoreEx) ); + DC_FlushRange( pNSDStoreEx, sizeof(NSDStoreEx) ); retry = NVRAM_RETRY_NUM; while( retry-- ) { s_indexNSD ^= 0x01; // リトライの度に書き込みアドレスを切り替える。 nvramAddr = NSD_GetNSDRomAddr() + s_indexNSD * SPI_NVRAM_PAGE_SIZE; OS_TPrintf("NSD write addr=%08x\n", nvramAddr ); - if( NVRAMm_ExecuteCommand( COMM_WE, nvramAddr, sizeof(NSDStoreEx), (u8 *)&s_NSDStoreEx ) ) { + if( NVRAMm_ExecuteCommand( COMM_WE, nvramAddr, sizeof(NSDStoreEx), (u8 *)pNSDStoreEx ) ) { OS_TPrintf("NVRAM Write succeeded.\n"); break; } @@ -232,7 +237,7 @@ BOOL NSD_WriteSettings( u8 region ) // ミラーリングされているNTR設定データのどちらが有効かを判定 //---------------------------------------------------------------------- -static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ) +static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u32 validLangBitmap ) { NSDStoreEx *pNSDStoreEx = (NSDStoreEx *)pNSDStoreExArray; u16 i; @@ -264,7 +269,7 @@ static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ) // NSD, NSDExのCRCが正しいなら、データの中身をチェック。 if( !isInvalid ) { - if( NSDi_CheckDataValue( &pNSDStoreEx[ i ], region ) ) { // データがおかしい値でないかもチェック。 + if( NSDi_CheckDataValue( &pNSDStoreEx[ i ], validLangBitmap ) ) { // データがおかしい値でないかもチェック。 nsd_valid |= 0x01 << i; // "有効"フラグをセット s_indexNSD = i; // NCDのインデックスも切り替え。 }else { @@ -293,29 +298,29 @@ static BOOL NSDi_CheckCorrectNSD( NSDStoreEx (*pNSDStoreExArray)[2], u8 region ) // NTR設定データの値が正しい値かチェック。 // FALSE:正しくない。TRUE:正しい。 -static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStoreEx, u8 region ) +static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStoreEx, u32 validLangBitmap ) { NTRSettingsData *pNSD = &pNSDStoreEx->nsd; NTRSettingsDataEx *pNSDEx = &pNSDStoreEx->nsd_ex; - u16 validLangBitmap = s_validLangBitmapList[ region ]; + + // NTR標準6言語以外の言語に対応している場合は、対応言語に英語を追加する。(旧NTRアプリ対策) + if( validLangBitmap & ~NTR_LANG_BITMAP_WW ) { + validLangBitmap |= ( 0x0001 << NTR_LANG_ENGLISH ); + } //pNSD->option; - // NSDのlanguageチェック( NSD側のlanguageは、日・英・独・仏・伊・西の6言語のうちの、対応言語のみの値となる。) - if( ~( NTR_LANG_BITMAP_WW & validLangBitmap ) & ( 0x0001 << pNSD->option.language ) ) { + + // NSDおよびNSDExのlanguageチェック + if( ( ~validLangBitmap & ( 0x0001 << pNSD->option.language ) ) || + ( ~validLangBitmap & ( 0x0001 << pNSDEx->language ) ) + ) { OS_TPrintf("NSD: invalid language : org:%02d ex:%02d bitmap:%04x\n", pNSD->option.language, pNSDEx->language, pNSDEx->valid_language_bitmap ); return FALSE; } - // NSDExのlanguageチェック(こちらには、中・韓も入る) - if( ( ~validLangBitmap & ( 0x0001 << pNSDEx->language ) ) || - ( pNSDEx->valid_language_bitmap != validLangBitmap ) ) { - OS_TPrintf("NSDEx: invalid language : org:%02d ex:%02d bitmap:%04x\n", - pNSD->option.language, pNSDEx->language, pNSDEx->valid_language_bitmap ); - return FALSE; - } - //pNSD->owner; + // favoriteColorは4bitなので範囲外はない。 // birthday @@ -357,7 +362,7 @@ static BOOL NSDi_CheckDataValue( NSDStoreEx *pNSDStoreEx, u8 region ) // NTR設定データのクリア void NSD_ClearSettings( void ) { - NSDStoreEx *pNSDStoreEx = &s_NSDStoreEx; + NSDStoreEx *pNSDStoreEx = &s_NSDStoreEx[ 0 ]; s_indexNSD = 1; // ライト前に反転されるので、"0"側が選択されるように"1"にしておく diff --git a/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c index 90d68ec8..e0380ff3 100644 --- a/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c +++ b/build/libraries_sysmenu/settings/ARM9/src/TWLStoreFile.c @@ -149,7 +149,7 @@ BOOL TSF_WriteFile( char *pPath, TSFHeader *pHeader, const void *pSrcBody, u8 *p pHeader->saveCount = 0; } - OS_TPrintf( "Write > %s : 0x%02x\n", pPath, pHeader->saveCount ); + OS_TPrintf( "Write > %s : %d\n", pPath, pHeader->saveCount ); // ファイルオープン if( !FS_OpenFileEx( &file, pPath, FS_FILEMODE_R | FS_FILEMODE_W ) ) { // R|Wモードで開くと、既存ファイルを残したまま更新。 diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c index bd614bf8..60318a01 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/settingsAPI.c @@ -31,21 +31,6 @@ static u8 MY_StrLen( const u16 *pStr ); // static variables----------------------------------------------------- // const data----------------------------------------------------------- -#if 0 -// TWL言語->NTR 言語への対応マップ -const u8 s_langCodeMapFromTWLtoNTR[ TWL_LANG_CODE_MAX ] = { - NTR_LANG_JAPANESE // TWL_LANG_JAPANESE - NTR_LANG_ENGLISH // TWL_LANG_ENGLISH - NTR_LANG_FRENCH // TWL_LANG_FRENCH - NTR_LANG_GERMAN // TWL_LANG_GERMAN - NTR_LANG_ITALIAN // TWL_LANG_ITALIAN - NTR_LANG_SPANISH // TWL_LANG_SPANISH - NTR_LANG_CHINESE // TWL_LANG_SIMP_CHINESE - NTR_LANG_KOREAN // TWL_LANG_KOREAN -// NTR_LANG_ENGLISH // TWL_LANG_DUTCH -// NTR_LANG_CHINESE // TWL_LANG_TRAD_CHINESE -}; -#endif // function's description----------------------------------------------- @@ -57,18 +42,11 @@ BOOL SYSM_ReadTWLSettingsFile( void ) retval = TSD_ReadSettings(); // NTR設定データのリード if( !NSD_IsReadSettings() ) { - NSDStoreEx (*pTempBuffer)[2] = SYSM_Alloc( NSD_TEMP_BUFFER_SIZE ); - if( pTempBuffer == NULL ) { - OS_TPrintf( "%s : malloc failed.\n", __FUNCTION__ ); - goto RETURN; - } - (void)NSD_ReadSettings( THW_GetRegion(), pTempBuffer ); - SYSM_Free( pTempBuffer ); + (void)NSD_ReadSettings( THW_GetValidLanguageBitmap() ); #ifndef SDK_FINALROM - (void)SYSMi_VerifyNTRSettings(); + (void)SYSMi_VerifyNTRSettings(); // デバッグ用ベリファイ #endif } -RETURN: SYSM_SetValidTSD( retval ); return retval; } @@ -84,9 +62,9 @@ BOOL SYSM_WriteTWLSettingsFile( void ) if( retval ) { SYSM_SetValidTSD( TRUE ); SYSMi_ConvertTWL2NTRSettings(); - NSD_WriteSettings( THW_GetRegion() ); + (void)NSD_WriteSettings(); #ifndef SDK_FINALROM - (void)SYSM_VerifyAndRecoveryNTRSettings(); // ※デバッグ用 ベリファイして、NGならリカバリ + (void)SYSMi_VerifyNTRSettings(); // デバッグ用ベリファイ #endif } return retval; @@ -97,20 +75,15 @@ BOOL SYSM_WriteTWLSettingsFile( void ) void SYSM_VerifyAndRecoveryNTRSettings( void ) { BOOL isRecovery = FALSE; - NSDStoreEx (*pTempBuffer)[2] = SYSM_Alloc( NSD_TEMP_BUFFER_SIZE ); // NVRAMからNTR設定データをロードして、TWL設定データとベリファイ - if( pTempBuffer == NULL ) { - OS_Panic( "%s : malloc error.\n", __FUNCTION__ ); - } - if( !NSD_ReadSettings( THW_GetRegion(), pTempBuffer ) || + if( !NSD_ReadSettings( THW_GetValidLanguageBitmap() ) || !SYSMi_VerifyNTRSettings() ) { // ロード or ベリファイ失敗なら、TWL設定データからNTR設定データを生成して、書き込み SYSMi_ConvertTWL2NTRSettings(); - NSD_WriteSettings( THW_GetRegion() ); + NSD_WriteSettings(); } - SYSM_Free( pTempBuffer ); } @@ -118,8 +91,7 @@ void SYSM_VerifyAndRecoveryNTRSettings( void ) BOOL SYSMi_VerifyNTRSettings( void ) { BOOL isFailed = FALSE; -// NTRAlarm zeroAlarm; // TWLでアラームをなくす場合は、ゼロ値アラームと比較させる。 -// MI_CpuClear( &zeroAlarm, sizeof(NTRAlarm) ); + u32 twlValidLangBitmap; // 値が一致する必要があるもの if( // NTR設定データバージョン @@ -177,26 +149,32 @@ BOOL SYSMi_VerifyNTRSettings( void ) } // 値が一致する必要があるもの - if( ( NSD_GetRTCOffset() != TSD_GetRTCOffset() ) || - ( NSD_GetLanguageEx() != TSD_GetLanguage() ) -// || ( NSD_GetLanguageBitmap() != TSD_GetLanguageBitmap() ) - ) { + if( NSD_GetRTCOffset() != TSD_GetRTCOffset() ) { isFailed = TRUE; } - // SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの - { - NTRLangCode language = ( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) ? - NSD_GetLanguage() : NSD_GetLanguageEx(); - // NSD側は、各リージョンの対応言語ビットマップのものしか取りえない。 - if( ( THW_GetValidLanguageBitmap() & ( 0x0001 << language ) ) == 0 ) { + twlValidLangBitmap = ( THW_GetValidLanguageBitmap() & NTR_LANG_BITMAP_ALL ) | ( 0x0001 << NTR_LANG_ENGLISH ); + OS_TPrintf( "%08x %08x\n", twlValidLangBitmap, NSD_GetValidLanguageBitmap() ); + if( twlValidLangBitmap != NSD_GetValidLanguageBitmap() ) { + // 対応言語ビットマップ不一致 + isFailed = TRUE; + }else if( !( twlValidLangBitmap & ( 0x0001 << NSD_GetLanguage() ) & ( 0x0001 << NSD_GetLanguageEx() ) ) ) { + // NSD側が対応言語ビットマップ外の値になっている + isFailed = TRUE; + }else if( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) { + if( ( NSD_GetLanguage() >= NTR_LANG_CODE_MAX_WW ) || + ( NSD_GetLanguageEx() >= NTR_LANG_CODE_MAX_WW ) ) { isFailed = TRUE; } - if( TSD_GetLanguage() >= NTR_LANG_CODE_MAX_WW ) { - // TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る) - if( NSD_GetLanguage() != NTR_LANG_ENGLISH ) { - isFailed = TRUE; - } + }else if( TSD_GetLanguage() <= NTR_LANG_KOREAN ) { + if( ( NSD_GetLanguage() != NTR_LANG_ENGLISH ) || + ( NSD_GetLanguageEx() > NTR_LANG_KOREAN ) ) { + isFailed = TRUE; + } + }else { + if( ( NSD_GetLanguage() != NTR_LANG_ENGLISH ) || + ( NSD_GetLanguageEx() != NTR_LANG_ENGLISH ) ) { + isFailed = TRUE; } } @@ -264,21 +242,30 @@ void SYSMi_ConvertTWL2NTRSettings( void ) // 値が一致する必要があるもの NSD_SetRTCOffset( TSD_GetRTCOffset() ); - NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() ); -// NSD_SetLanguageBitmap( TSD_GetLanguageBitmap() ); // SystemMenuのリージョンによって、ちょっと特殊な処理が必要なもの if( TSD_GetLanguage() < NTR_LANG_CODE_MAX_WW ) { // TSD側がNTR標準6言語の時、TSD側 == NSD側 - NSD_SetLanguage( (NTRLangCode)TSD_GetLanguage() ); - }else { + NSD_SetLanguage ( (NTRLangCode)TSD_GetLanguage() ); + NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() ); + }else if( TSD_GetLanguage() <= TWL_LANG_KOREAN ) { // TSD側がNTR標準6言語以外の時、NSD側のlanguageは強制ENGLISH(NCDEx側にちゃんとした値が入る) - NSD_SetLanguage( NTR_LANG_ENGLISH ); + NSD_SetLanguage ( NTR_LANG_ENGLISH ); + NSD_SetLanguageEx( (NTRLangCode)TSD_GetLanguage() ); + }else { + // それ以外の時は強制ENGLISH + NSD_SetLanguage ( NTR_LANG_ENGLISH ); + NSD_SetLanguageEx( NTR_LANG_ENGLISH ); + } + // 言語ビットマップ + { + u16 validLangBitmap = (u16)( ( THW_GetValidLanguageBitmap() & NTR_LANG_BITMAP_ALL ) | ( 0x0001 << NTR_LANG_ENGLISH ) ); + NSD_SetValidLanguageBitmap( validLangBitmap ); // ライト関数内部でもマスクされるが、ここでもしておく。 } // 値が何でも問題ないもの - // ※※※※ TWL側のバックライト輝度レベルが4段階でない時は、変換が必要。※※※※ - NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() ); + NSD_SetBacklightBrightness( TSD_GetBacklightBrightness() & 0x03 ); + // [TODO:] TWL側のバックライト輝度レベルが4段階でない時は、変換が必要。 } diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 3a60f395..4cfe008a 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -103,50 +103,6 @@ static u32 load_region_check_list[RELOCATE_INFO_NUM][RELOCATE_INFO_NUM * 2 - 1] NULL }, }; -#if 0 - -typedef struct RomReloadInfo { - void *pSrc; - void *pDst; - u32 length; - BOOL revCopy; -}RomReloadInfo; - -static RomReloadInfo romReloadInfo[] = { - -}; - -static BOOL SYSMi_OutOfRangeRomSegment( u32 start, u32 length, RomSegmentRange *pRange, ReloadInfo *pReload ) -{ - BOOL isReload = FALSE; - u32 end = (u32)start + length; - - if( start < pRange->start ) { - if( end <= pRange->start ) { - isReload = TRUE; - pReload->revCopy = FALSE; - }else { - isReload = TRUE; - pReload->revCopy = TRUE; - } - }else if( start <= pRange->end ) { - if( end <= pRange->end ) { - if(u32)( pRange->start + length ) ) - }else if( end > pRange->end ) { - isReload = TRUE; - pReload->revCopy = FALSE; - } - }else if( start > pRange->end ) { - isReload = TRUE; - } - - if( isReload ) { - pReload->pDst = (void *)start; - pReload->pSrc = (void *)pRange->start; - pReload->length = length; - } -} -#endif // ============================================================================ // @@ -174,10 +130,6 @@ void SYSM_Init( void *(*pAlloc)(u32), void (*pFree)(void*) ) SYSM_SetAllocFunc( pAlloc, pFree ); - // WRAM設定はいる? -// MI_SetMainMemoryPriority(MI_PROCESSOR_ARM7); -// MI_SetWramBank(MI_WRAM_ARM7_ALL); - reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット } diff --git a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd index ece8d5d8..0bea22e8 100644 Binary files a/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd and b/doc/TWL_SystemMenu繝。繝「繝ェ繝槭ャ繝.vsd differ diff --git a/doc/險隱槭さ繝シ繝牙ヲ逅.xls b/doc/險隱槭さ繝シ繝牙ヲ逅.xls new file mode 100644 index 00000000..699b7ac4 Binary files /dev/null and b/doc/險隱槭さ繝シ繝牙ヲ逅.xls differ diff --git a/include/sysmenu/settings/common/NTRSettings.h b/include/sysmenu/settings/common/NTRSettings.h index b240a033..d3086cc9 100644 --- a/include/sysmenu/settings/common/NTRSettings.h +++ b/include/sysmenu/settings/common/NTRSettings.h @@ -36,7 +36,6 @@ extern "C" { #define NTR_COMMENT_LENGTH 26 // コメント長 #define NTR_COMMENT_BUFFERSIZE ( NTR_COMMENT_LENGTH * 2 ) #define NTR_USER_COLOR_MAX_NUM 16 // ユーザーカラーの最大数 -#define NSD_TEMP_BUFFER_SIZE ( sizeof(NSDStoreEx) * 2 ) // NSD_ReadSettingsで必要なTempBufferサイズ // 言語設定コード typedef enum NTRLangCode{ @@ -58,7 +57,7 @@ typedef enum NTRLangCode{ ( 0x0001 << NTR_LANG_FRENCH ) | \ ( 0x0001 << NTR_LANG_GERMAN ) | \ ( 0x0001 << NTR_LANG_ITALIAN ) | \ - ( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-WW版での対応言語ビットマップ + ( 0x0001 << NTR_LANG_SPANISH ) ) // NTR-IPL2-WW版での対応言語ビットマップ #define NTR_LANG_BITMAP_CHINA ( ( 0x0001 << NTR_LANG_CHINESE ) | \ @@ -66,7 +65,7 @@ typedef enum NTRLangCode{ ( 0x0001 << NTR_LANG_FRENCH ) | \ ( 0x0001 << NTR_LANG_GERMAN ) | \ ( 0x0001 << NTR_LANG_ITALIAN ) | \ - ( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-CN版での対応言語ビットマップ + ( 0x0001 << NTR_LANG_SPANISH ) ) // NTR-IPL2-CN版での対応言語ビットマップ #define NTR_LANG_BITMAP_KOREA ( ( 0x0001 << NTR_LANG_KOREAN ) | \ @@ -74,8 +73,16 @@ typedef enum NTRLangCode{ ( 0x0001 << NTR_LANG_ENGLISH ) | \ ( 0x0001 << NTR_LANG_FRENCH ) | \ ( 0x0001 << NTR_LANG_GERMAN ) | \ - ( 0x0001 << NTR_LANG_SPANISH ) ) // SystemMenu-KR版での対応言語ビットマップ + ( 0x0001 << NTR_LANG_SPANISH ) ) // NTR-IPL2-KR版での対応言語ビットマップ +#define NTR_LANG_BITMAP_ALL ( ( 0x0001 << NTR_LANG_JAPANESE ) | \ + ( 0x0001 << NTR_LANG_ENGLISH ) | \ + ( 0x0001 << NTR_LANG_FRENCH ) | \ + ( 0x0001 << NTR_LANG_GERMAN ) | \ + ( 0x0001 << NTR_LANG_ITALIAN ) | \ + ( 0x0001 << NTR_LANG_SPANISH ) | \ + ( 0x0001 << NTR_LANG_CHINESE ) | \ + ( 0x0001 << NTR_LANG_KOREAN ) ) // NTR-IPL2全体での対応言語ビットマップ // 日付データ typedef struct NTRDate{ @@ -170,42 +177,23 @@ typedef struct NTRSettingsDataEx{ }NTRSettingsDataEx; // 138bytes -// NTR各種設定データのNVRAM保存時フォーマット -typedef struct NSDStore{ - NTRSettingsData nsd; // NTR各種設定データ - u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。 - u16 crc16; // NTR各種設定データの16bitCRC - u8 pad[ 128 - sizeof(NTRSettingsData) - 4]; -}NSDStore; // 128byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。 - - -// NTR各種設定データEXのNVRAM保存時フォーマット(上記NCDStoreと互換をとるための無理やり拡張) -typedef struct NSDStoreEx{ - NTRSettingsData nsd; // NTR各種設定データ - u16 saveCount; // 0x00-0x7fをループしてカウントし、カウント値が新しいデータが有効。 - u16 crc16; // NTR各種設定データの16bitCRC - NTRSettingsDataEx nsd_ex; - u16 crc16_ex; -}NSDStoreEx; // 256byte // ※本来なら、saveCountとcrc16は256byteの最後に付加して、間にパディングを埋める方がいい。 - - #ifdef SDK_ARM9 -//========================================================= -// グローバル変数 -//========================================================= -extern NTRSettingsData *g_pNSD; -extern NTRSettingsDataEx *g_pNSDEx; -#define GetNSD() ( g_pNSD ) -#define GetNSDEx() ( g_pNSDEx ) - //========================================================= // NVRAMへのリードライト関数 //========================================================= extern void NSD_ClearSettings( void ); extern BOOL NSD_IsReadSettings( void ); -extern BOOL NSD_ReadSettings( u8 region, NSDStoreEx (*pTempBuffer)[2] ); // NSD_TEMP_BUFFER_SIZEのpTempBufferが必要。 -extern BOOL NSD_WriteSettings( u8 region ); // 先にNSD_ReadSettingsを実行しておく必要がある。 +extern BOOL NSD_ReadSettings( u32 validLangBitmap ); +extern BOOL NSD_WriteSettings( void ); // 先にNSD_ReadSettingsを実行しておく必要がある。 + +//========================================================= +// グローバル変数 +//========================================================= +extern NTRSettingsData *g_pNSD; +extern NTRSettingsDataEx *g_pNSDEx; +#define GetNSD() ( g_pNSD ) +#define GetNSDEx() ( g_pNSDEx ) //========================================================= // データ取得(NSD_ReadSettingsで内部ワークに読み出した情報の取得) @@ -313,7 +301,7 @@ static inline NTRLangCode NSD_GetLanguageEx( void ) } // 対応言語ビットマップの取得 -static inline u16 NSD_GetLanguageBitmap( void ) +static inline u16 NSD_GetValidLanguageBitmap( void ) { return GetNSDEx()->valid_language_bitmap; } @@ -488,7 +476,7 @@ static inline void NSD_SetLanguageEx( NTRLangCode language ) #endif // 対応言語ビットマップのセット -static inline void NSD_SetLanguageBitmap( u16 valid_language_bitmap ) +static inline void NSD_SetValidLanguageBitmap( u16 valid_language_bitmap ) { GetNSDEx()->valid_language_bitmap = valid_language_bitmap; }