systemMenu_REDのフォルダ再構成

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@73 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-10-30 09:33:43 +00:00
parent 1952c74fb3
commit c52da9b005
64 changed files with 2655 additions and 1966 deletions

View File

@ -29,7 +29,9 @@ SPACE ?= $(EMPTY) $(EMPTY)
SYSMENU_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(TWLIPL_ROOT)))
SYSMENU_BUILDTOOLSDIR := $(SYSMENU_ROOT)/build/buildtools
SYSMENU_INCDIR := $(SYSMENU_ROOT)/include
SYSMENU_INCDIR := $(SYSMENU_ROOT)/include \
$(TWLSDK_ROOT)/build/libraries/spi/arm9/include \
$(TWLSDK_ROOT)/build/libraries/mb/common/include
SYSMENU_TOOLSDIR := $(SYSMENU_ROOT)/tools
SYSMENU_COMPONENTSDIR := $(SYSMENU_ROOT)/components

View File

@ -19,10 +19,6 @@
#include <sysmenu/machineSettings/common/nitroSettings.h>
#include "spi.h"
#ifndef USED_COMPONENT
#include <sysmenu/sysmenu_work.h>
#endif
// define data----------------------------------------------------------
#define NCD_EX_FORCE_ENABLE // このスイッチを定義すると、SYSMバージョンに関わらず強制的にNitroConfigDataExが有効になる。
@ -39,6 +35,9 @@
#define SR_WEN 0x02 // 0:ライト禁止 1:ライト許可
#define SR_EER 0x20 // 1:イレースエラー発生SANYO製FLASHのみ
#define READ_IPL2_HEADER_ADDR 0x18 // IPL2ヘッダのうち、読み込みが必要な部分の先頭アドレス
#define READ_IPL2_HEADER_SIZE 0x0a // IPL2ヘッダのうち、読み込みが必要なサイズ
#define NCD_ROM_ADDR_SHIFT 3
// NVRAM関連送信コマンドステート
static enum NvramCommState{
@ -52,49 +51,22 @@ static enum NvramCommState{
}NvramCommState;
// SYSMヘッダ情報
typedef struct SYSMHeader {
u16 bm_arm9_rom_addr;
u16 bm_arm7_rom_addr;
u16 bm_crc16;
u16 ipl2_crc16;
u8 ipl2_key[4];
u16 ipl2_arm9_rom_addr;
u16 ipl2_arm9_ram_addr;
u16 ipl2_arm7_rom_addr;
u16 ipl2_arm7_ram_addr;
u16 ipl2_arm9_romOffsetUnit:3;
u16 ipl2_arm9_ramOffsetUnit:3;
u16 ipl2_arm7_romOffsetUnit:3;
u16 ipl2_arm7_ramOffsetUnit:3;
u16 ipl2_arm7_ramSelect:1;
u16 ipl2_header_ver:3;
u16 ipl2_data_rom_addr;
union {
struct {
u8 timestamp[5]; // SYSMタイムスタンプ [0]:分,[1]:時,[2]:日,[3]:月,[4]:年
u8 ipl2_type; // SYSMタイプ(nitroConfigData.hで定義のSYSM_TYPE...
u8 rsv[2];
} version;
u8 card_key[8];
} info;
// IPL2ヘッダの一部0x18からのデータ)
typedef struct IPL2HeaderPart {
struct {
u8 timestamp[5]; // IPL2タイムスタンプ [0]:分,[1]:時,[2]:日,[3]:月,[4]:年
u8 ipl2_type; // IPL2タイプ(nitroConfigData.hで定義のIPL2_TYPE...
u8 rsv[2];
} version;
u16 ncd_rom_addr;
union { // SYSMHeader.info.version.type == SYSM_TYPE_I_DISPLAY_JAPANもしくは
u16 sys_rsv_rom_addr; // SYSMHeader.info.version.timestamp >= 0x0502280851(SYSM_TYPE_NORMAL 3rd.以降)
u16 font_bncmp_offset; // ならば、font_bncmp_offset, font_bnfr_offsetが有効。
} rom_addr1; // ※なお、sys_rsv_rom_addr, app_rsv_rom_addrは、アドレスが変わったので
union { //  ここに入っている値は無効。ncd_rom_addrからの相対値で算出。
u16 app_rsv_rom_addr;
u16 font_bnfr_offset;
} rom_addr2;
u16 ipl2_data_crc16;
u8 pad[ 0x18 ]; // ※キャッシュラインに合わせるためのパディング。本来は必要なし。
} SYSMHeader; // 0x40bytes
u8 pad[ 0x16 ]; // ※キャッシュラインに合わせるためのパディング。本来は必要なし。
} IPL2HeaderPart; // 0x20bytes
// function's prototype-------------------------------------------------
static void NCD_ReadIPL2Header( void );
static int NVRAMm_checkCorrectNCD(NCDStoreEx *ncdsp);
static BOOL NCD_CheckDataValue( NCDStoreEx *ncdsp );
static BOOL NVRAMm_ExecuteCommand( int nv_state, u32 addr, u16 size, u8 *srcp );
@ -103,7 +75,7 @@ static void Callback_NVRAM(PXIFifoTag tag, u32 data, BOOL err);
// const data-----------------------------------------------------------
// global variables-----------------------------------------------------
NitroConfigDataEx ncdEx;
NitroConfigDataEx ncdEx;
// static variables-----------------------------------------------------
static volatile BOOL nv_cb_occurred;
@ -112,98 +84,48 @@ static u16 ena_ncd_num = NCD_NOT_CORRECT;
static u16 next_saveCount;
static NCDStoreEx ncds[2] ATTRIBUTE_ALIGN(32);
#ifdef USED_COMPONENT
static SYSMHeader ipl2Header ATTRIBUTE_ALIGN(32);
static IPL2HeaderPart ipl2Header ATTRIBUTE_ALIGN(32);
static BOOL read_ipl2h = FALSE;
#endif
// function's description-----------------------------------------------
//----------------------------------------------------------------------
// SYSMヘッダ情報の読み出し
// IPL2ヘッダ情報の読み出し
//----------------------------------------------------------------------
#ifndef USED_COMPONENT
// SYSM上での使用時
// SYSMタイプの取得
#define NCD_GetSYSMType() ( (u32)GetSYSMWork()->ipl2_type )
// NCD格納ROMアドレスの取得
#define NCD_GetNCDRomAddr() ( (u32)GetSYSMWork()->ncd_rom_adr )
#else
// コンポーネント上での使用時
// SYSMヘッダの読み出し
void NCD_ReadSYSMHeader( void )
// IPL2ヘッダの読み出し
static void NCD_ReadIPL2Header( void )
{
if( !read_ipl2h ) {
OS_TPrintf( "SYSMHeader:%x\n", sizeof(SYSMHeader) );
DC_InvalidateRange( &ipl2Header, sizeof(SYSMHeader) );
while( !NVRAMm_ExecuteCommand( COMM_RD, 0, sizeof(SYSMHeader), (u8 *)&ipl2Header ) ) {}
read_ipl2h = TRUE;
OS_TPrintf( "IPL2Header:%x\n", sizeof(IPL2HeaderPart) );
DC_InvalidateRange( &ipl2Header, sizeof(IPL2HeaderPart) );
while( !NVRAMm_ExecuteCommand( COMM_RD, READ_IPL2_HEADER_ADDR, READ_IPL2_HEADER_SIZE, (u8 *)&ipl2Header ) ) {}
read_ipl2h = TRUE;
}
}
// SYSMタイプの取得
u8 NCD_GetSYSMType( void )
// IPL2タイプの取得
u8 NCD_GetIPL2Type( void )
{
NCD_ReadSYSMHeader();
return ipl2Header.info.version.ipl2_type;
NCD_ReadIPL2Header();
return ipl2Header.version.ipl2_type;
}
// SYSMバージョンの取得
u8 *NCD_GetSYSMVersion( void )
// IPL2バージョンの取得
u8 *NCD_GetIPL2Version( void )
{
NCD_ReadSYSMHeader();
return ipl2Header.info.version.timestamp;
NCD_ReadIPL2Header();
return ipl2Header.version.timestamp;
}
// NCD格納ROMアドレスの取得
u32 NCD_GetNCDRomAddr( void )
{
NCD_ReadSYSMHeader();
NCD_ReadIPL2Header();
return (u32)( ipl2Header.ncd_rom_addr << NCD_ROM_ADDR_SHIFT );
}
// システム予約領域ROMアドレスの取得
u32 NCD_GetSysRsvRomAddr( void )
{
NCD_ReadSYSMHeader();
return (u32)( ipl2Header.ncd_rom_addr << NCD_ROM_ADDR_SHIFT ) - NCD_SYS_RSV_SIZE;
}
// アプリ予約領域ROMアドレスの取得
u32 NCD_GetAppRsvRomAddr( void )
{
NCD_ReadSYSMHeader();
return (u32)( ipl2Header.ncd_rom_addr << NCD_ROM_ADDR_SHIFT ) - NCD_SYS_RSV_SIZE - NCD_APP_RSV_SIZE;
}
// SYSMデータ格納ROMアドレスの取得
u32 NCD_GetSYSMDataRomAddr( void )
{
NCD_ReadSYSMHeader();
return (u32)( ipl2Header.ipl2_data_rom_addr << NCD_ROM_ADDR_SHIFT );
}
// bncmpフォントデータ格納ROMアドレスの取得
u32 NCD_GetFontBncmpRomAddr( void )
{
NCD_ReadSYSMHeader();
return (u32)( ipl2Header.rom_addr1.font_bncmp_offset << FONT_ROM_ADDR_SHIFT );
}
// bnfrフォントデータ格納ROMアドレスの取得
u32 NCD_GetFontBnfrRomAddr( void )
{
NCD_ReadSYSMHeader();
return (u32)( ipl2Header.rom_addr2.font_bnfr_offset << FONT_ROM_ADDR_SHIFT );
}
#endif
//----------------------------------------------------------------------
// NITRO設定データのリード
//----------------------------------------------------------------------
@ -228,7 +150,7 @@ int NVRAMm_ReadNitroConfigData(NitroConfigData *dstp)
next_saveCount = (u8)((ncdsp[ena_ncd_num].saveCount + 1) & SAVE_COUNT_MASK);
// 有効なNITRO設定データをバッファに転送
if(dstp!=NULL) {
if( dstp != NULL ) {
SVC_CpuCopy( (void *)&ncdsp[ ena_ncd_num ].ncd, (void *)dstp, sizeof(NitroConfigData), 16);
SVC_CpuCopy( (void *)&ncdsp[ ena_ncd_num ].ncd_ex, (void *)&ncdEx, sizeof(NitroConfigDataEx), 16);
}
@ -264,11 +186,12 @@ void NVRAMm_WriteNitroConfigData( NitroConfigData *srcp )
// NCD_EXのCRC算出。
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetSYSMType() != SYSM_TYPE_NTR_WW ) && ( NCD_GetSYSMType() & SYSM_TYPE_NCD_EX_FLAG ) )
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
ncdsp->ncd_ex = *GetNCDExWork();
ncdsp->ncd_ex.version = NITRO_CONFIG_DATA_EX_VERSION; // バージョンを現在のものに設定。
ncdsp->ncd_ex.valid_language_bitmap = VALID_LANG_BITMAP;
ncdsp->crc16_ex = SVC_GetCRC16( 0xffff, (const void *)&ncdsp->ncd_ex, sizeof(NitroConfigDataEx) );
size = sizeof(NCDStoreEx); // ※書き込みサイズをNCDStoreExに拡張。
}
@ -314,9 +237,9 @@ static int NVRAMm_checkCorrectNCD(NCDStoreEx *ncdsp)
invalid = TRUE;
}
// NCDExが有効なSYSMTypeならば、NCDExのCRCチェックを行う。
// NCDExが有効なIPL2Typeならば、NCDExのCRCチェックを行う。
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetSYSMType() != SYSM_TYPE_NTR_WW ) && ( NCD_GetSYSMType() & SYSM_TYPE_NCD_EX_FLAG ) )
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
crc = SVC_GetCRC16( 0xffff, (const void *)&ncdsp[i].ncd_ex, sizeof(NitroConfigDataEx) );
@ -374,9 +297,9 @@ static BOOL NCD_CheckDataValue( NCDStoreEx *ncdsp )
ncdp->option.language, ncdexp->language, ncdexp->valid_language_bitmap );
return FALSE;
}
// NCDExのlanguageチェックNCDExが有効なのは、下記のSYSMタイプのもの)
// NCDExのlanguageチェックNCDExが有効なのは、下記のIPL2タイプのもの)
#ifndef NCD_EX_FORCE_ENABLE
if( ( NCD_GetSYSMType() != SYSM_TYPE_NTR_WW ) && ( NCD_GetSYSMType() & SYSM_TYPE_NCD_EX_FLAG ) )
if( ( NCD_GetIPL2Type() != IPL2_TYPE_NTR_WW ) && ( NCD_GetIPL2Type() & IPL2_TYPE_NCD_EX_FLAG ) )
#endif
{
if( ( ~VALID_LANG_BITMAP & ( 0x0001 << ncdexp->language ) )

View File

@ -32,21 +32,6 @@ typedef struct BannerCheckParam {
u32 size;
}BannerCheckParam;
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
u64 titleID; // アプリケーション識別ID
u32 platform; // NTR, TWL (HYBLIDはTWLを返す
void *pBanner; // 固定長フォーマットなら偽造されても大丈夫だろう。
}TitleProperty;
typedef enum AuthState {
AUTH_PROCESSING = 0,
AUTH_RESULT_SUCCEEDED = 1,
AUTH_RESULT_TITLE_POINTER_ERROR = 2,
AUTH_RESULT_AUTHENTICATE_FAILED = 3,
AUTH_RESULT_ENTRY_ADDRESS_ERROR = 4
}AuthState;
// extern data-----------------------------------------------------------------
extern void ReturnFromMain( void );
extern void BootFuncEnd( void );
@ -55,9 +40,14 @@ FS_EXTERN_OVERLAY( ipl2_data );
FS_EXTERN_OVERLAY( bm_mainp );
// function's prototype-------------------------------------------------------
static void SYSMi_WaitInitARM7( void );
static BOOL SYSMi_IsDebuggerBannerViewMode( void );
static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle );
AuthState SYSM_AuthAndLoadTitle( TitleProperty *pBootTitle );
void SYSM_Finalize( void );
void SYSM_RebootLauncher( void );
void SYSM_RebootTitle( u64 titleID );
static void INTR_SubpIRQ( void );
@ -74,8 +64,7 @@ static void SYSMi_CopyInfoFromIPL1( void );
static void SYSMi_ReadNTRSetting( void );
static void SYSMi_ReadTWLSetting( void );
static void SYSMi_VerifyNTRSetting( void );
static void SYSMi_CheckEntryAddress( void );
static void SYSMi_CaribrateTP( void );
static BOOL SYSMi_CheckEntryAddress( void );
static void SYSMi_WriteAdjustRTC( void );
static BOOL SYSMi_SendMessageToARM7( u32 msg );
static BOOL SYSMi_CheckNitroCardRightly( void );
@ -134,7 +123,10 @@ void SYSM_Init( void )
ncdp = GetNCDWork();
// SYSMi_DispInitialDebugData(); // 初期デバッグ情報表示
#endif /* __SYSM_DEBUG */
TP_Init();
RTC_Init();
// WRAM設定はいる
// MI_SetMainMemoryPriority(MI_PROCESSOR_ARM7);
// MI_SetWramBank(MI_WRAM_ARM7_ALL);
@ -142,11 +134,12 @@ void SYSM_Init( void )
SVC_CpuClearFast(0x0000, (u16 *)GetSYSMWork(), sizeof(SYSM_work)); // SYSMワークのクリア
// ※ISデバッガかどうかの判定。 BootROMからのパラメータ引渡し
SYSMi_WaitInitARM7();
}
// ARM7側の初期化待ち
BOOL SYSM_WaitARM7Init( void )
static void SYSMi_WaitInitARM7( void )
{
/* while( !( SYSM_GetBootFlag() & BFLG_ARM7_INIT_COMPLETED ) ) {
SVC_WaitByLoop(0x1000); // ARM7の初期化が終了するのを待つ。
@ -154,14 +147,15 @@ BOOL SYSM_WaitARM7Init( void )
*/
reg_OS_PAUSE |= REG_OS_PAUSE_CHK_MASK; // PAUSEレジスタのチェックフラグのセット
SYSMi_ReadNTRSetting(); // NOR からNTR本体設定データをリード
SYSMi_ReadTWLSetting(); // NANDからTWL本体設定データをリード
PMm_SetBackLightBrightness();
SYSMi_CaribrateTP(); // 読み出したTWL本体設定データをもとにTPキャリブレーション。
SYSMi_WriteAdjustRTC(); // 読み出したTWL本体設定データをもとにRTCクロック補正値をセット。
SYSMi_ReadNTRSetting(); // NOR からNTR本体設定データをリード
SYSMi_VerifyNTRSetting(); // NVRAMのNTR本体設定データをリードし、不一致箇所があればNTR側をリカバリ。
SYSM_CaribrateTP(); // 読み出したTWL本体設定データをもとにTPキャリブレーション。
SYSMi_WriteAdjustRTC(); // 読み出したTWL本体設定データをもとにRTCクロック補正値をセット。
SYSMi_CheckCardCloneBoot(); // カードがクローンブートかチェック
SYSMi_ReadCardBannerFile(); // カードバナーファイルの読み出し。
@ -169,33 +163,32 @@ BOOL SYSM_WaitARM7Init( void )
// デバッガ対応コード
#ifdef __IS_DEBUGGER_BUILD
if( GetSYSMWork()->isOnDebugger ) {
if( !SYSM_IsDebuggerBannerViewMode() ){ // デバッガ上動作の場合は、この中でカードブートまでやってしまう。
( void )OS_EnableIrqMask( OS_IE_V_BLANK );
( void )OS_EnableIrq();
( void )OS_EnableInterrupts();
( void )GX_VBlankIntr( TRUE );
if( SYSMi_ExistCard() ) {
( void )SYSM_Main();
SYSM_SetBootFlag( BFLG_BOOT_CARD );
( void )SYSM_BootCARD();
SYSM_PermitToBootSelectedTarget();
while(1) {
OS_WaitIrq( 1, OS_IE_V_BLANK ); // Vブランク割込終了待ち
if( SYSM_Main() ) { // システムのメイン
return TRUE; // TRUEが帰ってきたらメインループからリターンカード起動
}
}
}
if( SYSMi_ExistCard() &&
!SYSMi_IsDebuggerBannerViewMode() ){ // デバッガ上動作の場合は、この中でカードブートまでやってしまう。
SYSM_GetResetParam()->isLogoSkip = TRUE;
SYSM_GetResetParam()->bootTitleID = SYSM_GetCardTitleID();
}
}else {
while( 1 ) {} // ISデバッガビルドでISデバッガが検出できなかったら停止。
}
#endif // __IS_DEBUGGER_BUILD
// ==============================================================
}
return FALSE;
int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card )
{
#pragma unused( pTitleList_Card )
return 0;
}
int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand )
{
#pragma unused( pTitleList_Nand )
// filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
// return : *TitleProperty Array
return 0;
}
@ -209,16 +202,21 @@ static BOOL SYSMi_CheckTitlePointer( TitleProperty *pBootTitle )
// 指定タイトルの認証&ロード ※1フレームじゃ終わらん。
AuthState SYSM_AuthAndLoadTitle( TitleProperty *pBootTitle )
AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle )
{
#pragma unused( pBootTitle )
// メインメモリのクリア
// DSダウンロードプレイの時は、ROMヘッダを退避する
// アプリロード
// アプリ認証
// エントリアドレスの正当性をチェックし、無効な場合は無限ループに入る。
SYSMi_CheckEntryAddress();
// パラメータチェック
if( !SYSMi_CheckTitlePointer( pBootTitle ) ) {
return AUTH_RESULT_TITLE_POINTER_ERROR;
}
// エントリアドレスの正当性をチェック
if( !SYSMi_CheckEntryAddress() ) {
return AUTH_RESULT_ENTRY_ADDRESS_ERROR;
}
return AUTH_RESULT_SUCCEEDED;
}
@ -260,6 +258,20 @@ void SYSM_Finalize( void )
}
// ランチャーをリブート
void SYSM_RebootLauncher( void )
{
}
// 再起動タイトルを指定してのリブート
void SYSM_RebootTitle( u64 titleID )
{
#pragma unused( titleID )
}
#if 0
// NITRO起動をARM7に通知
BOOL SYSM_BootCard( void )
@ -278,13 +290,14 @@ BOOL SYSM_BootCard( void )
}
#endif
#if 0
// TPリード可能かどうかを調べる。
BOOL SYSM_IsTPReadable( void )
{
if( SYSM_GetBootFlag() & BFLG_BOOT_DECIDED ) return FALSE;
else return TRUE;
}
#endif
// ARM7-ARM9共有リソースのbootFlagへの値のセット
@ -326,7 +339,7 @@ static void INTR_SubpIRQ( void )
// ============================================================================
// エントリアドレスの正当性チェック
static void SYSMi_CheckEntryAddress( void )
static BOOL SYSMi_CheckEntryAddress( void )
{
// エントリアドレスがROM内登録エリアかAGBカートリッジエリアなら、無限ループに入る。
if( !( ( (u32)GetRomHeaderAddr()->main_entry_address >= HW_MAIN_MEM )
@ -340,9 +353,10 @@ static void SYSMi_CheckEntryAddress( void )
#ifdef __DEBUG_SECURITY_CODE
DispSingleColorScreen( SCREEN_YELLOW );
#endif
while( 1 ) {}
return FALSE;
}
OS_TPrintf("entry address valid.\n");
return TRUE;
}
@ -401,8 +415,16 @@ static void SYSMi_MainpRegisterAndRamClear( BOOL isPlatformTWL )
// サブルーチン
// ============================================================================
// ロゴデモスキップか?
BOOL SYSM_IsLogoDemoSkip( void )
{
// ※システムアプリからのハードリセットによるロゴデモ飛ばしも判定に入れる。
return SYSMi_IsDebuggerBannerViewMode();
}
// ISデバッガのバナービューモード起動かどうか
BOOL SYSM_IsDebuggerBannerViewMode( void )
static BOOL SYSMi_IsDebuggerBannerViewMode( void )
{
#ifdef __IS_DEBUGGER_BUILD
return ( GetSYSMWork()->isOnDebugger &&
@ -567,15 +589,15 @@ static void SYSMi_CheckCardCloneBoot( void )
// タッチパネルキャリブレーション
static void SYSMi_CaribrateTP( void )
void SYSM_CaribrateTP( void )
{
#ifndef __TP_OFF
TPCalibrateParam calibrate;
( void )TP_CalcCalibrateParam(&calibrate, // タッチパネル初期化
( void )TP_CalcCalibrateParam( &calibrate, // タッチパネル初期化
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );
TP_SetCalibrateParam(&calibrate);
TP_SetCalibrateParam( &calibrate );
OS_Printf("TP_calib: %4d %4d %4d %4d %4d %4d\n",
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );

View File

@ -1,8 +0,0 @@
#define WAVE_VGROUP000 0
#define BANK_VGROUP000 0
#define SEQ_SONG0 0
#define SEQ_DUMMY 0
#define DUMMY 0
extern const u8 _binary_sound_data_sdat[]; // サウンドデータ

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 KiB

View File

@ -1,128 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: DS_Setting.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "main.h"
#include "DS_Setting.h"
// define data-----------------------------------------------------------------
// function's prototype--------------------------------------------------------
int DS_SettingMain();
void VBlankIntr_bm(void);
// extern data-----------------------------------------------------------------
// global variable-------------------------------------------------------------
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
// ============================================================================
// function's description
// ============================================================================
int DS_SettingMain()
{
(void)OS_DisableIrq();
// GXS_DispOff(); // LCDC OFF
// reg_GX_POWCNT = 0x7fff; // 表示画面を下LCDに切り替え
OS_Printf("ARM9 bootMenu start.\n");
//---- VRAM クリア
// GX_SetBankForLCDC(GX_VRAM_LCDC_ALL); // VRAMクリアのために一時的にLCDCにVRAMを全て割り当てる。
// MI_CpuClearFast((void*)HW_LCDC_VRAM, HW_LCDC_VRAM_SIZE);
// (void)GX_DisableBankForLCDC();
//---- OAMとパレットクリア
// MI_CpuFillFast( (void*)HW_DB_OAM, 192, HW_DB_OAM_SIZE );
// MI_CpuClearFast((void*)HW_DB_PLTT, HW_PLTT_SIZE);
//---- VRAMの割り当て
// GX_SetBankForBG(GX_VRAM_BG_64_E); // VRAM割り当て
// GX_SetBankForOBJ(GX_VRAM_OBJ_32_FG);
//---- グラフィックス表示モードにする
// GX_SetGraphicsMode(GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D);
//---- BG1の設定
// G2_SetBG1Control(GX_BG_SCRSIZE_TEXT_256x256, GX_BG_COLORMODE_16, GX_BG_SCRBASE_0xf000,
// GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01 );
// G2_SetBG1Priority(3); // BGコントロール セット
//---- OBJ,BG1の表示のみON
GXS_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1);
//---- OBJは2Dマップモードで使用
GXS_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_2D);
//---- データロード
// MI_CpuCopyFast(myChar, (void *)HW_BG_VRAM, sizeof(myChar)); // BGキャラクタ セット
// MI_CpuCopyFast(myChar, (void *)HW_OBJ_VRAM, sizeof(myChar)); // OBJキャラクタ セット
// MI_CpuCopyFast(myPlttData, (void *)HW_BG_PLTT, sizeof(myPlttData));// BGパレット セット
// MI_CpuCopyFast(myPlttData, (void *)HW_OBJ_PLTT, sizeof(myPlttData));// OBJパレット セット
//---- Vブランク割込切り替え
(void)OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr_bm);
(void)OS_EnableIrq();
//---- 表示開始
OS_WaitIrq(1, OS_IE_V_BLANK);
// SVC_WaitVBlankIntr();
// GXS_DispOn();
//---- メインループ前処理
SEQ_MainMenu_init();
//================ メインループ
while(1)
{
OS_WaitIrq(1, OS_IE_V_BLANK);
// SVC_WaitVBlankIntr(); // Vブランク割込終了待ち
ReadKeyPad();
mf_KEYPAD_rapid();
(void)nowProcess(); // メインプロセス実行
if (PAD_DetectFold() == TRUE) { // スリープモードへの遷移
SYSM_GoSleepMode();
}
OS_PrintServer(); // ARM7からのプリントデバッグを処理する
}
}
//=============================================================================
// 割り込みルーチン
//=============================================================================
// Vブランク割り込み
void VBlankIntr_bm(void)
{
//---- OAM、BG-VRAMの更新
DC_FlushRange(oamBakS, sizeof(oamBakS));
MI_CpuCopyFast(oamBakS,(void*)HW_DB_OAM, sizeof(oamBakS));
DC_FlushRange(bgBakS, sizeof(bgBakS));
MI_CpuCopyFast(bgBakS, (void*)(HW_DB_BG_VRAM+0xf000), sizeof(bgBakS));
//---- 割り込みチェックフラグ
OS_SetIrqCheckFlag(OS_IE_V_BLANK);
}

View File

@ -1,141 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: langSelect.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "DS_Setting.h"
// define data------------------------------------------
#define CANCEL_BUTTON_LT_X 2
#define CANCEL_BUTTON_LT_Y 21
#define CANCEL_BUTTON_RB_X (CANCEL_BUTTON_LT_X+8)
#define CANCEL_BUTTON_RB_Y (CANCEL_BUTTON_LT_Y+2)
// extern data------------------------------------------
// function's prototype declaration---------------------
void SEQ_LangSelect_init(void);
int SEQ_LangSelect(void);
// global variable -------------------------------------
// static variable -------------------------------------
static NvLangCode langCode; // 言語コード
// const data -----------------------------------------
static const u8 *const str_language[] ATTRIBUTE_ALIGN(2) = {
(const u8 *)"にほんご ",
(const u8 *)"English ",
(const u8 *)"Francais",
(const u8 *)"Deutsch ",
(const u8 *)"Italiano",
(const u8 *)"Espanol ",
};
static const MenuComponent langSel = {
(u16)LANG_CODE_MAX,
10,
5,
0,
2,
8,
WHITE,
HIGHLIGHT_Y,
(const u8 **)&str_language,
};
//======================================================
// function's description
//======================================================
// 言語設定の初期化
void SEQ_LangSelect_init(void)
{
GXS_SetVisiblePlane(GX_PLANEMASK_NONE);
MI_CpuClearFast(bgBakS, sizeof(bgBakS));
SVC_CpuClearFast(0xc0, oamBakS, sizeof(oamBakS));
ClearAllStringSJIS();
(void)DrawStringSJIS( 1, 0, YELLOW, (const u8 *)"LANGUAGE SELECT");
(void)DrawStringSJIS( CANCEL_BUTTON_LT_X, CANCEL_BUTTON_LT_Y,HIGHLIGHT_C, (const u8 *)" CANCEL ");
if( initialSet ) {
(void)DrawStringSJIS( 8, 18, RED, (const u8 *)"Select language.");
}
if((GetSYSMWork()->ncd_invalid) || (GetNCDWork()->option.language >= LANG_CODE_MAX)) {
langCode = LANG_ENGLISH;
}else {
langCode = (NvLangCode)GetNCDWork()->option.language;
}
DrawMenu((u16)langCode, &langSel);
SVC_CpuClear(0x0000,&tpd, sizeof(TpWork),16);
GXS_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1);
}
// 言語選択
int SEQ_LangSelect(void)
{
BOOL tp_select,tp_cancel = FALSE;
ReadTpData(); // タッチパネル入力の取得
//--------------------------------------
// キー入力処理
//--------------------------------------
if(pad.trg & PAD_KEY_DOWN){ // カーソルの移動
if(++langCode == LANG_CODE_MAX) langCode = (NvLangCode)0;
}
if(pad.trg & PAD_KEY_UP){
if(--langCode < 0) langCode = (NvLangCode)(LANG_CODE_MAX-1);
}
tp_select = SelectMenuByTp((u16 *)&langCode, &langSel);
DrawMenu((u16)langCode, &langSel);
// [CANCEL]ボタン押下チェック
if(tpd.disp.touch) {
tp_cancel = InRangeTp(CANCEL_BUTTON_LT_X*8, CANCEL_BUTTON_LT_Y*8-4,
CANCEL_BUTTON_RB_X*8, CANCEL_BUTTON_RB_Y*8-4, &tpd.disp);
}
if((pad.trg & PAD_BUTTON_A) || (tp_select)) { // メニュー項目への分岐
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_language = 1; // 言語入力フラグを立てる
GetNCDWork()->option.language = langCode;
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
SEQ_MainMenu_init();
return 0;
}else if((pad.trg & PAD_BUTTON_B) || (tp_cancel)) {
SEQ_MainMenu_init();
return 0;
}
ReadTpData();
return 0;
}

View File

@ -1,553 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: rtcSet.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "DS_Setting.h"
// define data------------------------------------------
//#define __RTC_MINUTE_OFFSET // この定義が有効な場合はrtcOffsetは分オフセットで算出されます。また、無効な場合は秒オフセットとなります。
// RETURNボタンLCD領域
#define RETURN_BUTTON_LT_X 2
#define RETURN_BUTTON_LT_Y 21
#define RETURN_BUTTON_RB_X (RETURN_BUTTON_LT_X + 8)
#define RETURN_BUTTON_RB_Y (RETURN_BUTTON_LT_Y + 2)
// 日付データLCD領域
#define DATE_LT_X 5
#define DATE_LT_Y 10
// 時刻データLCD領域
#define TIME_LT_X (DATE_LT_X + 14)
#define TIME_LT_Y DATE_LT_Y
// RTC設定メニュー要素
#define RTC_MENU_ELEM_NUM 1
// 文字入力タッチパネル用カウンタ
#define S_UPDOWN_COUNT_MAX 16
// 数値入力タッチパネル用カウンタ
#define D_DOWN_COUNT_MAX -50
#define D_UP_COUNT_MAX 50
// 日付時刻入力シーケンス用ワーク
typedef struct DateTimeParam {
int seq; // シーケンス番号
int *tgtp; // 入力対象の変数へのポインタ
RTCDate Date;
RTCTime Time;
}DateTimeParam;
// RTC設定シーケンス用ワーク
typedef struct SetRtcWork {
int csr; // カーソル位置
s64 rtcOffset[2]; // RTCオフセット値[0]:設定変更前の値、[1]:変更後の値)
DateTimeParam dtp; // 日付時刻入力シーケンス用ワーク
InputNumParam inp; // 数値入力インターフェース用ワーク
}SetRtcWork;
// extern data------------------------------------------
// function's prototype declaration---------------------
void SEQ_RtcSet_init(void);
int SEQ_RtcSet(void);
RTCWeek CalcWeekFromDate( u32 year, u32 month, u32 day );
void InputDecimal(int *tgtp, InputNumParam *inpp);
static void SEQ_InputRtcDateTime_init(int start);
static int SEQ_InputRtcDateTime(void);
static void TransmitRtcData(DateTimeParam *dtpp, RtcDateTime *rtcp);
static void SelectString( int *tgtp, const u8 **const strpp, InputNumParam *inpp);
static void BcdToHex(int *bcdp);
static void HexToBcd(int *hexp);
static BOOL CheckLeapYear( u32 year );
// global variable -------------------------------------
// static variable -------------------------------------
SetRtcWork *pRtcWork; // RTC設定用ワーク
// const data -----------------------------------------
//======================================================
// 日付&時刻設定
//======================================================
// RTC設定シーケンスの初期化
void SEQ_RtcSet_init(void)
{
GXS_SetVisiblePlane(GX_PLANEMASK_NONE);
MI_CpuClearFast(bgBakS, sizeof(bgBakS));
SVC_CpuClearFast(0xc0, oamBakS, sizeof(oamBakS));
ClearAllStringSJIS();
(void)DrawStringSJIS( 1, 0, YELLOW, (const u8 *)"DATE & TIME SET");
(void)DrawStringSJIS( DATE_LT_X + 3, DATE_LT_Y, WHITE, (const u8 *)"/ / [ ] : :");
(void)DrawStringSJIS( RETURN_BUTTON_LT_X, RETURN_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" RETURN ");
if( initialSet ) {
if( GetSYSMWork()->rtcStatus & 0x01) {
(void)DrawStringSJIS( 8, 18, RED, (const u8 *)"RTC reset is detected!");
}else {
(void)DrawStringSJIS( 8, 18, RED, (const u8 *)"Set RTC.");
}
}
pRtcWork=OS_Alloc(sizeof(SetRtcWork)); // RTC設定用ワークの確保
#ifdef __SYSM_DEBUG
if(pRtcWork==NULL) OS_Panic("ARM9- Fail to allocate memory...\n");
#endif /* __SYSM_DEBUG */
OS_Printf("Alloc :SetRtcWork\n");
SVC_CpuClear(0x0000, pRtcWork, sizeof(SetRtcWork), 16);
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
InitGetAndDrawRtcData( DATE_LT_X, DATE_LT_Y, TIME_LT_X, TIME_LT_Y); // RTCデータ表示位置の指定
GXS_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1);
/* if(0){
s64 offset;
RTCDate date;
RTCTime time;
date.year = 99;
date.month = 12;
date.day = 31;
time.hour = 23;
time.minute = 59;
time.second = 0;
offset = IPL2i_CalcRtcSecOffset( &date, &time ); // 設定直前のRTC値のオフセットを算出
OS_Printf( " 99/12/31 23:59:00 offset = %x\n", offset );
date.year = 100;
date.month = 1;
date.day = 1;
time.hour = 0;
time.minute = 0;
time.second = 0;
offset = IPL2i_CalcRtcSecOffset( &date, &time ); // 設定直前のRTC値のオフセットを算出
OS_Printf( "100/01/01 00:00:00 offset = %x\n", offset );
}
*/
}
// RTC設定シーケンス
int SEQ_RtcSet(void)
{
BOOL tp_set = FALSE;
BOOL tp_return = FALSE;
ReadTpData(); // タッチパネル入力の取得
GetAndDrawRtcData();
if(tpd.disp.touch) {
tp_set = InRangeTp( DATE_LT_X*8, DATE_LT_Y*8-4, // [RTC設定]領域押下チェック
(TIME_LT_X + 8)*8, (TIME_LT_Y+2)*8-4, &tpd.disp);
// [RETURN]ボタン押下チェック
tp_return = InRangeTp(RETURN_BUTTON_LT_X*8, RETURN_BUTTON_LT_Y*8-4,
RETURN_BUTTON_RB_X*8, RETURN_BUTTON_RB_Y*8-4, &tpd.disp);
}
if( initialSet && !GetNCDWork()->option.input_rtc ) {
tp_set = TRUE;
}
//--------------------------------------
// キー入力処理
//--------------------------------------
if(pad.trg & PAD_KEY_DOWN){ // カーソルの移動
if(++pRtcWork->csr == RTC_MENU_ELEM_NUM) pRtcWork->csr = 0;
}
if(pad.trg & PAD_KEY_UP){
if(--pRtcWork->csr < 0) pRtcWork->csr = RTC_MENU_ELEM_NUM - 1;
}
if((pad.trg & PAD_BUTTON_A) || (tp_set)) { // RTC設定開始
if(pRtcWork->csr == 0) {
SEQ_InputRtcDateTime_init(1);
nowProcess = SEQ_InputRtcDateTime;
}
}else if((pad.trg & PAD_BUTTON_B) || (tp_return)) { // メニューに戻る
OS_Free(pRtcWork); // RTC設定用ワークの解放
pRtcWork = NULL;
OS_Printf("Free :SetRtcWork\n");
SEQ_MainMenu_init();
}
#ifdef __SYSM_DEBUG
if(pad.trg & PAD_BUTTON_START) {
ClearRTC();
OS_Printf("RTC offset in NVRAM is ZERO clear!\n");
}
#endif /* __SYSM_DEBUG */
return 0;
}
//======================================================
// 日付&時刻入力処理
//======================================================
// 日付時刻入力初期化
static void SEQ_InputRtcDateTime_init(int start)
{
mf_clearRect( RETURN_BUTTON_LT_X, RETURN_BUTTON_LT_Y, 2, 28);
if(start) {
DrawOKCancelButton();
pRtcWork->dtp.seq = 0;
}else {
(void)DrawStringSJIS( RETURN_BUTTON_LT_X, RETURN_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" RETURN ");
}
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
}
// 日付時刻入力
static int SEQ_InputRtcDateTime(void)
{
BOOL tp_ok = FALSE;
BOOL tp_cancel = FALSE;
int new_seq, x_base, y_base, abs_y_offset;
enum { // 日付時刻入力シーケンス番号
SEQ_INIT=0,
SEQ_YEAR_INIT=2, SEQ_YEAR_SET,
SEQ_MONTH_INIT, SEQ_MONTH_SET,
SEQ_DAY_INIT, SEQ_DAY_SET,
SEQ_HOUR_INIT, SEQ_HOUR_SET,
SEQ_MINUTE_INIT, SEQ_MINUTE_SET,
SEQ_SECOND_INIT, SEQ_SECOND_SET,
SEQ_END,
SEQ_RETURN=64
};
ReadTpData(); // タッチパネル入力の取得
CheckOKCancelButton(&tp_ok, &tp_cancel); // [OK],[CANCEL]ボタン押下チェック
pRtcWork->inp.y_offset = 0;
if(tpd.disp.touch) { // [CANCEL]ボタン押下チェック
if((pRtcWork->dtp.seq & 0x01) && (pRtcWork->dtp.seq < SEQ_END)) { // SEQ_**_SETの時のみ有効
new_seq = pRtcWork->dtp.seq;
x_base = DATE_LT_X * 8;
y_base = DATE_LT_Y * 8 + 6;
// 入力項目移動のチェック
if( InRangeTp( x_base, (y_base - 6), (x_base + 22 * 8), (y_base + 6), &tpd.disp) ) {
if(tpd.disp.x < x_base + 28) {
new_seq = SEQ_YEAR_SET;
}else if((tpd.disp.x >= x_base + 4*8) && (tpd.disp.x < x_base + 6*8)) {
new_seq = SEQ_MONTH_SET;
}else if((tpd.disp.x >= x_base + 7*8) && (tpd.disp.x < x_base + 9*8)) {
new_seq = SEQ_DAY_SET;
}else if((tpd.disp.x >= x_base + 14*8) && (tpd.disp.x < x_base + 16*8)) {
new_seq = SEQ_HOUR_SET;
}else if((tpd.disp.x >= x_base + 17*8) && (tpd.disp.x < x_base + 19*8)) {
new_seq = SEQ_MINUTE_SET;
}else if(tpd.disp.x >= x_base + 20*8) {
new_seq = SEQ_SECOND_SET;
}
}
if(pRtcWork->dtp.seq != new_seq) {
pRtcWork->dtp.seq = new_seq - 1;
}else {
// 入力値の増減
if(InRangeTp( pRtcWork->inp.pos_x * 8, (y_base - 30), (pRtcWork->inp.pos_x + pRtcWork->inp.keta_max)*8, (y_base + 30), &tpd.disp)) {
pRtcWork->inp.y_offset = tpd.disp.y - y_base;
abs_y_offset = (pRtcWork->inp.y_offset >= 0) ? pRtcWork->inp.y_offset : -pRtcWork->inp.y_offset;
if(abs_y_offset <= 6) {
pRtcWork->inp.y_offset = 0;
}else if(abs_y_offset <= 14){
pRtcWork->inp.y_offset >>= 2;
}else if(abs_y_offset <= 22){
pRtcWork->inp.y_offset >>= 1;
}
}
}
}
}
// タッチパネル or キー入力によって、カーソル位置が動いた時に、元の位置のカーソルを消す。
if((pRtcWork->dtp.seq > 0) && ((pRtcWork->dtp.seq & 0x01) == 0)) { // SEQ_INITの時は実行しない
(void)DrawDecimalSJIS( pRtcWork->inp.pos_x, pRtcWork->inp.pos_y, WHITE, pRtcWork->dtp.tgtp, (u8)pRtcWork->inp.keta_max, 4);
}
// 各シーケンスの処理
switch(pRtcWork->dtp.seq){
case SEQ_INIT:
pRtcWork->dtp.Date = GetSYSMWork()->rtc[0].Date;
pRtcWork->dtp.Time = GetSYSMWork()->rtc[0].Time;
pRtcWork->dtp.Date.year += 2000; // yearをする。
pRtcWork->dtp.seq = SEQ_YEAR_INIT;
// ※SEQ_INITは直通でSEQ_YEAR_INITへ
case SEQ_YEAR_INIT:
pRtcWork->inp.pos_x = DATE_LT_X;
pRtcWork->inp.pos_y = DATE_LT_Y;
pRtcWork->inp.keta_max = 4;
pRtcWork->inp.value_max = 2099;
pRtcWork->inp.value_min = 2000;
// pRtcWork->inp.value_min = 2004;
// if(pRtcWork->dtp.Date.year < 2004) {
// pRtcWork->dtp.Date.year = 2004;
// }
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Date.year;
break;
case SEQ_MONTH_INIT:
pRtcWork->inp.pos_x = DATE_LT_X + 4;
pRtcWork->inp.keta_max = 2;
pRtcWork->inp.value_max = 12;
pRtcWork->inp.value_min = 1;
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Date.month;
break;
case SEQ_DAY_INIT:
pRtcWork->inp.pos_x = DATE_LT_X + 7;
pRtcWork->inp.keta_max = 2;
pRtcWork->inp.value_max = (int)SYSM_GetDayNum( pRtcWork->dtp.Date.year, pRtcWork->dtp.Date.month );
// 年・月をもとにその月の日数を算出する。
pRtcWork->inp.value_min = 1;
if(pRtcWork->dtp.Date.day > pRtcWork->inp.value_max) {
pRtcWork->dtp.Date.day = (u32)pRtcWork->inp.value_max;
}
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Date.day;
break;
case SEQ_HOUR_INIT:
pRtcWork->inp.pos_x = TIME_LT_X;
pRtcWork->inp.keta_max = 2;
pRtcWork->inp.value_max = 23;
pRtcWork->inp.value_min = 0;
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Time.hour;
break;
case SEQ_MINUTE_INIT:
pRtcWork->inp.pos_x = TIME_LT_X + 3;
pRtcWork->inp.keta_max = 2;
pRtcWork->inp.value_max = 59;
pRtcWork->inp.value_min = 0;
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Time.minute;
break;
case SEQ_SECOND_INIT:
pRtcWork->inp.pos_x = TIME_LT_X + 6;
pRtcWork->inp.keta_max = 2;
pRtcWork->inp.value_max = 59;
pRtcWork->inp.value_min = 0;
pRtcWork->dtp.tgtp = (int *)&pRtcWork->dtp.Time.second;
break;
case SEQ_YEAR_SET:
case SEQ_MONTH_SET:
case SEQ_DAY_SET:
case SEQ_HOUR_SET:
case SEQ_MINUTE_SET:
case SEQ_SECOND_SET:
InputDecimal( pRtcWork->dtp.tgtp, &pRtcWork->inp);
// 年月日入力ならば、曜日を算出して表示。
if( (pRtcWork->dtp.seq == SEQ_YEAR_SET) || (pRtcWork->dtp.seq == SEQ_MONTH_SET) || (pRtcWork->dtp.seq == SEQ_DAY_SET) ) {
pRtcWork->dtp.Date.week = CalcWeekFromDate(pRtcWork->dtp.Date.year, pRtcWork->dtp.Date.month, pRtcWork->dtp.Date.day);
(void)DrawStringSJIS( DATE_LT_X + 10, DATE_LT_Y, WHITE, g_strWeek[pRtcWork->dtp.Date.week]);
}
// 年・月入力ならば、日数を算出して、現在の入力日が日数を超えていたら修正する。
if( (pRtcWork->dtp.seq == SEQ_YEAR_SET) || (pRtcWork->dtp.seq == SEQ_MONTH_SET) ) {
u32 dayNum = SYSM_GetDayNum( pRtcWork->dtp.Date.year, pRtcWork->dtp.Date.month );
if( dayNum < pRtcWork->dtp.Date.day) {
pRtcWork->dtp.Date.day = dayNum;
(void)DrawDecimalSJIS( DATE_LT_X + 7, DATE_LT_Y, WHITE, &pRtcWork->dtp.Date.day, 2, 4);
}
}
break;
case SEQ_END:
pRtcWork->dtp.Date.year -= 2000; // yearをする。
/* // RTCへの新しい値の設定
(void)RTC_GetDateTime(&now_dtp.Date, &now_dtp.Time); // ライト直前に現在のRTC値を取得する。
(void)RTC_SetDateTime(&pRtcWork->dtp.Date, &pRtcWork->dtp.Time); // 新RTC設定値のセット。
if((GetSYSMWork()->rtc[0].Date.year == 99) && (now_dtp.Date.year == 0)) {
now_dtp.Date.year = 100; // 設定前設定完了の間にRTCが一周してしまったら、yearは100としてoffsetを計算する。
}
// RTC設定時は、今回の設定でどれだけRTC値が変化したか秒オフセット単位を算出してNVRAMに保存する。とりあえず実装
pRtcWork->rtcOffset[0] = IPL2i_CalcRtcSecOffset( &now_dtp.Date, &now_dtp.Time ); // 現在のRTC値のオフセットを算出
pRtcWork->rtcOffset[1] = IPL2i_CalcRtcSecOffset( &pRtcWork->dtp.Date, &pRtcWork->dtp.Time ); // 新しくセットされたRTC値のオフセットを算出
GetNCDWork()->option.rtcOffset += pRtcWork->rtcOffset[1] - pRtcWork->rtcOffset[0];
// 新RTC_ofs と 現在のRTC_ofs の差分の値を加算。
*/
pRtcWork->dtp.Time.second = 0;
NCD_SetRtcOffset( SYSM_CalcRtcOffsetAndSetDateTime( &pRtcWork->dtp.Date, &pRtcWork->dtp.Time ) );
GetSYSMWork()->rtc[0].Date = pRtcWork->dtp.Date;
GetSYSMWork()->rtc[0].Time = pRtcWork->dtp.Time;
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_rtc = 1; // RTC入力フラグを立てる。
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
// SEQ_ENDの時はこのままリターンする。
case SEQ_RETURN:
nowProcess = SEQ_RtcSet;
SEQ_InputRtcDateTime_init(0); // 日付入力画面のクリア
return 0;
}
if(pRtcWork->dtp.seq & 0x01) { // SEQ_**_SETの時のみ有効
if((pad.trg & PAD_BUTTON_A) || (tp_ok)) {
pRtcWork->dtp.seq = SEQ_END; // Aボタンで決定
}else if((pad.trg & PAD_BUTTON_B) || (tp_cancel)) { // Bボタンでキャンセル
pRtcWork->dtp.seq = SEQ_RETURN;
}else if(pad.trg & PAD_KEY_LEFT) {
if(pRtcWork->dtp.seq == SEQ_YEAR_SET) pRtcWork->dtp.seq = SEQ_SECOND_INIT;
else pRtcWork->dtp.seq -= 3;
}else if(pad.trg & PAD_KEY_RIGHT) {
if(pRtcWork->dtp.seq == SEQ_SECOND_SET) pRtcWork->dtp.seq = SEQ_YEAR_INIT;
else pRtcWork->dtp.seq++;
}
}else { // SEQ_**_INITの時のみ有効
pRtcWork->dtp.seq++;
}
return 0;
}
/*
// うるう年の判定 (うるう年:1、通常の年:0リターン)
BOOL CheckLeapYear( u32 year)
{
if((year & 0x03) == 0) { // うるう年は、「4で割り切れ かつ 100で割り切れない年」
CP_SetDiv32_32(year, 100); // 「400で割り切れる年」
if(CP_GetDivRemainder32() != 0) {
return TRUE;
}else {
CP_SetDiv32_32(year, 400);
if(CP_GetDivRemainder32() == 0) {
return TRUE;
}
}
}
return FALSE;
}
*/
// 日付から曜日を求める。
RTCWeek CalcWeekFromDate( u32 year, u32 month, u32 day )
{
if(month == 1 || month == 2 ){
year--;
month += 12;
}
return (RTCWeek)( (year + year/4 - year/100 + year/400 + (13*month + 8)/5 + day) % 7 );
}
/*
// 文字列によるパラメータ選択
static void SelectString(int *tgtp, const u8 **const srtpp, InputNumParam *inpp)
{
BOOL value_up = FALSE;
BOOL value_down = FALSE;
if(inpp->y_offset == 0) {
inpp->up_count = S_UPDOWN_COUNT_MAX;
}else {
inpp->up_count ++;
if(inpp->up_count > S_UPDOWN_COUNT_MAX) {
inpp->up_count = 0;
if(inpp->y_offset < 0) value_up = TRUE;
else value_down = TRUE;
}
}
if((pad.trg & PAD_KEY_DOWN) || (value_down)) { // 表示文字列切り替え
if(++*tgtp>inpp->value_max) *tgtp = 0;
}else if((pad.trg & PAD_KEY_UP) || (value_up)) {
if(--*tgtp & 0x8000) *tgtp = inpp->value_max;
}
(void)DrawStringSJIS( inpp->pos_x, inpp->pos_y, HIGHLIGHT_Y, srtpp[*tgtp]); // 現在選択している文字列を表示
}
*/
// 10進数数値入力
void InputDecimal(int *tgtp, InputNumParam *inpp)
{
BOOL value_up = FALSE;
BOOL value_down = FALSE;
if(inpp->y_offset == 0) {
inpp->up_count = D_UP_COUNT_MAX;
inpp->down_count = D_DOWN_COUNT_MAX;
}else if(inpp->y_offset < 0) {
inpp->down_count += inpp->y_offset;
if(inpp->down_count < D_DOWN_COUNT_MAX) {
inpp->down_count = 0;
value_down = TRUE;
}
}else { // y_offset > 0
inpp->up_count += inpp->y_offset;
if(inpp->up_count > D_UP_COUNT_MAX) {
inpp->up_count = 0;
value_up = TRUE;
}
}
// キー入力に応じて対象値を増減
if( (value_down) || (pad.trg & PAD_KEY_UP)
|| ((pad.cont & PAD_KEY_UP) && (pad.cont & PAD_BUTTON_R)) ) {
if(--*tgtp < inpp->value_min) {
*tgtp = inpp->value_max;
}
}else if( (value_up) || (pad.trg & PAD_KEY_DOWN)
|| ((pad.cont & PAD_KEY_DOWN) && (pad.cont & PAD_BUTTON_R)) ) {
if(++*tgtp > inpp->value_max) {
*tgtp = inpp->value_min;
}
}
(void)DrawDecimalSJIS( inpp->pos_x, inpp->pos_y, HIGHLIGHT_Y, tgtp, (u8)inpp->keta_max, 4);
// 対象値をハイライト表示
}
// RTC設定のクリア
void ClearRTC( void )
{
SVC_CpuClear(0x0000, &GetSYSMWork()->rtc[0].Time, sizeof(RTCTime), 16);
GetSYSMWork()->rtc[0].Date.year = 0;
GetSYSMWork()->rtc[0].Date.month = 1;
GetSYSMWork()->rtc[0].Date.day = 1;
(void)RTC_SetDateTime( &GetSYSMWork()->rtc[0].Date, &GetSYSMWork()->rtc[0].Time);
GetNCDWork()->option.input_rtc = 0;
GetNCDWork()->option.rtcOffset = 0;
NCD_SetRtcLastSetYear( 0 );
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
}

View File

@ -1,308 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mainMenu.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "main.h"
#include "DS_Setting.h"
#include "spi.h"
// define data------------------------------------------
// キャンセルボタンLCD領域
#define CANCEL_BUTTON_LT_X 12
#define CANCEL_BUTTON_LT_Y 21
#define CANCEL_BUTTON_RB_X (CANCEL_BUTTON_LT_X + 8)
#define CANCEL_BUTTON_RB_Y (CANCEL_BUTTON_LT_Y + 2)
// OKボタンLCD領域
#define OK_BUTTON_LT_X 22
#define OK_BUTTON_LT_Y 21
#define OK_BUTTON_RB_X (OK_BUTTON_LT_X + 8)
#define OK_BUTTON_RB_Y (OK_BUTTON_LT_Y + 2)
#define MAIN_MENU_ELEM_NUM 6 // メインメニューの項目数
// extern data------------------------------------------
// function's prototype declaration---------------------
void SEQ_MainMenu_init(void);
int SEQ_MainMenu(void);
BOOL SelectMenuByTp(u16 *nowCsr, const MenuComponent *menu);
//BOOL InRangeTp(u16 lt_x,u16 lt_y,u16 rb_x,u16 rb_y, TPData *tgt);
BOOL InRangeTp(int lt_x, int lt_y, int rb_x, int rb_y, TPData *tgt);
static void SEQ_SettingEnd_init( void );
static int SEQ_SettingEnd( void );
// global variable -------------------------------------
u16 csrMenu = 0; // メニューのカーソル位置bm_main.cで参照してるので、グローバル
BOOL initialSet = FALSE;
// static variable -------------------------------------
static const u8 *str_MainMenu[MAIN_MENU_ELEM_NUM]; // メインメニュー用文字テーブルへのポインタリスト
// const data -----------------------------------------
//===============================================
// mainMenu.c
//===============================================
const u8 *const str_MeinMenuElemTbl[ MAIN_MENU_ELEM_NUM ][ LANG_CODE_MAX ] = {
{
(const u8 *)"ユーザー じょうほう   ",
(const u8 *)"USER INFORMATION ",
(const u8 *)"USER INFORMATION(F)",
(const u8 *)"USER INFORMATION(G)",
(const u8 *)"USER INFORMATION(I)",
(const u8 *)"USER INFORMATION(S)",
},
{
(const u8 *)"ひづけ & じこく    ",
(const u8 *)"DATE & TIME ",
(const u8 *)"DATE & TIME(F) ",
(const u8 *)"DATE & TIME(G) ",
(const u8 *)"DATE & TIME(I) ",
(const u8 *)"DATE & TIME(S) ",
},
{
(const u8 *)"げんご          ",
(const u8 *)"LANGUAGE ",
(const u8 *)"LANGUAGE(F) ",
(const u8 *)"LANGUAGE(G) ",
(const u8 *)"LANGUAGE(I) ",
(const u8 *)"LANGUAGE(S) ",
},
{
(const u8 *)"AGB モード        ",
(const u8 *)"AGB MODE ",
(const u8 *)"AGB MODE(F) ",
(const u8 *)"AGB MODE(G) ",
(const u8 *)"AGB MODE(I) ",
(const u8 *)"AGB MODE(S) ",
},
{
(const u8 *)"タッチパネルほせい     ",
(const u8 *)"TOUCH PANEL ",
(const u8 *)"TOUCH PANEL(F) ",
(const u8 *)"TOUCH PANEL(G) ",
(const u8 *)"TOUCH PANEL(I) ",
(const u8 *)"TOUCH PANEL(S) ",
},
{
(const u8 *)"きどうモード        ",
(const u8 *)"AUTO BOOT ",
(const u8 *)"AUTO BOOT(F) ",
(const u8 *)"AUTO BOOT(G) ",
(const u8 *)"AUTO BOOT(I) ",
(const u8 *)"AUTO BOOT(S) ",
},
};
const MenuComponent mainMenu = {
MAIN_MENU_ELEM_NUM,
2,
6,
0,
2,
17,
WHITE,
HIGHLIGHT_Y,
(const u8 **)&str_MainMenu,
};
//======================================================
// メインメニュー
//======================================================
// メインメニューの初期化
void SEQ_MainMenu_init(void)
{
#ifdef __DIRECT_BOOT_BMENU_ENABLE
// 各種設定が未設定時のダイレクト起動。
{
if(GetNCDWork()->option.input_language == 0) { // 言語設定がまだ。
initialSet = TRUE;
csrMenu = 3;
SEQ_LangSelect_init();
nowProcess = SEQ_LangSelect;
return;
}else if(GetNCDWork()->option.input_tp == 0) { // TPキャリブレーションがまだ。
initialSet = TRUE;
csrMenu = 5;
SEQ_TP_Calibration_init();
nowProcess = SEQ_TP_Calibration;
return ;
}else if(GetNCDWork()->option.input_rtc == 0) { // RTC設定がまだ。
ClearRTC();
initialSet = TRUE;
csrMenu = 2;
SEQ_RtcSet_init();
nowProcess = SEQ_RtcSet;
return;
}else if( (GetNCDWork()->option.input_nickname == 0) // ニックネームまたは好きな色入力がまだ。
|| (GetNCDWork()->option.input_favoriteColor == 0) ) {
initialSet = TRUE;
csrMenu = 1;
SEQ_OwnerInfo_init();
nowProcess = SEQ_OwnerInfo;
return;
}
if( initialSet ) {
SEQ_SettingEnd_init();
nowProcess = SEQ_SettingEnd;
return;
}
}
#endif /* __DIRECT_BOOT_BMENU_ENABLE */
GXS_SetVisiblePlane(GX_PLANEMASK_NONE);
SVC_CpuClearFast(0x0000, bgBakS, sizeof(bgBakS));
SVC_CpuClearFast(0xc0, oamBakS, sizeof(oamBakS));
ClearAllStringSJIS();
#ifdef __NCD_CLEAR_ENABLE
(void)DrawStringSJIS( 18, 21, LIGHTGREEN, (const u8 *)"[START]:NCD clear.");
#endif /* __NCD_CLEAR_ENABLE */
// NITRO設定データのlanguageに応じたメインメニュー構成言語の切り替え
{
int i;
NvLangCode langCode = LANG_ENGLISH;
if(GetSYSMWork()->ncd_invalid == 0) {
langCode = (NvLangCode)GetNCDWork()->option.language;
}
for(i = 0; i < MAIN_MENU_ELEM_NUM; i++) {
str_MainMenu[i] = str_MeinMenuElemTbl[i][langCode];
}
}
DrawMenu(csrMenu, &mainMenu);
SVC_CpuClear(0x0000,&tpd,sizeof(TpWork),16);
GXS_SetVisiblePlane(GX_PLANEMASK_BG1);
nowProcess = SEQ_MainMenu;
}
// メインメニュー
int SEQ_MainMenu(void)
{
BOOL tp_select;
ReadTpData(); // タッチパネル入力の取得
//--------------------------------------
// キー入力処理
//--------------------------------------
if(pad.trg & PAD_KEY_DOWN){ // カーソルの移動
if(++csrMenu == MAIN_MENU_ELEM_NUM) csrMenu=0;
}
if(pad.trg & PAD_KEY_UP){
if(--csrMenu & 0x80) csrMenu=MAIN_MENU_ELEM_NUM-1;
}
tp_select=SelectMenuByTp(&csrMenu, &mainMenu);
DrawMenu(csrMenu, &mainMenu);
if((pad.trg & PAD_BUTTON_A)||(tp_select)) { // メニュー項目への分岐
switch(csrMenu) {
case 0:
SEQ_OwnerInfo_init();
nowProcess=SEQ_OwnerInfo;
break;
case 1:
SEQ_RtcSet_init();
nowProcess=SEQ_RtcSet;
break;
case 2:
SEQ_LangSelect_init();
nowProcess=SEQ_LangSelect;
break;
case 3:
SEQ_AgbLcdSelect_init();
nowProcess=SEQ_AgbLcdSelect;
break;
case 4:
SEQ_TP_Calibration_init();
nowProcess=SEQ_TP_Calibration;
break;
case 5:
SEQ_AutoBootSelect_init();
nowProcess=SEQ_AutoBootSelect;
break;
}
}
#ifdef __NCD_CLEAR_ENABLE
if(pad.trg & PAD_BUTTON_START) {
SVC_CpuClearFast(0x0000, GetNCDWork(), sizeof(NitroConfigData));
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase(0x3fe00);
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase(0x3ff00);
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteDisable();
OS_Printf("NitroConfigData zero clear!!\n");
}
#endif /* __NCD_CLEAR_ENABLE */
return 0;
}
// OK / CANCELボタンの描画
void DrawOKCancelButton(void)
{
(void)DrawStringSJIS( CANCEL_BUTTON_LT_X, CANCEL_BUTTON_LT_Y,HIGHLIGHT_C, (const u8 *)" CANCEL ");
(void)DrawStringSJIS( OK_BUTTON_LT_X, OK_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" OK ");
}
// OK or CANCELボタン押下チェック
void CheckOKCancelButton(BOOL *tp_ok, BOOL *tp_cancel)
{
*tp_cancel = InRangeTp(CANCEL_BUTTON_LT_X*8, CANCEL_BUTTON_LT_Y*8-4,
CANCEL_BUTTON_RB_X*8, CANCEL_BUTTON_RB_Y*8-4, &tpd.disp);
*tp_ok = InRangeTp(OK_BUTTON_LT_X*8, OK_BUTTON_LT_Y*8-4,
OK_BUTTON_RB_X*8, OK_BUTTON_RB_Y*8-4, &tpd.disp);
}
//---------------------------------------------------------
//
// 設定終了
//
//---------------------------------------------------------
static void SEQ_SettingEnd_init( void )
{
ClearAllStringSJIS();
(void)DrawStringSJIS( 6, 10, WHITE, (const u8 *)" Initial setting completed.");
(void)DrawStringSJIS( 6, 12, WHITE, (const u8 *)" Please reboot.");
}
static int SEQ_SettingEnd( void )
{
return 0;
}

View File

@ -23,40 +23,15 @@ SUBDIRS =
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TARGET_BIN = main.srl
TARGET_BIN = dlplay.srl
LCFILE_SPEC = ARM9-TS.lsf
ROM_SPEC = main.rsf
LOGO_DIR = Logo
SETTING_DIR = DS_Setting
MBOOT_DIR = DS_DownloadPlay
CHAT_DIR = DS_Chat
FONT_DIR = font
FONTS = f12han.dat
FONT_DATAS = $(addprefix $(FONT_DIR)/, $(FONTS))
FONT_OBJS = $(FONT_DATAS:.dat=.o)
SRCS_IPL2 = main.c mainFunc.c launcher.c $(SETTING_DIR)/font.c $(SETTING_DIR)/myChar.c
SRCS_LOGO = logoDemo.c logoData.c
SRCS_SETTING = DS_Setting.c settingMenu.c unicode.c misc.c \
rtcSet.c langSelect.c tpCalib.c ownerInfo.c AgbLcdSel.c autoBoot.c
SRCS_MBOOT = DS_DownloadPlay.c
SRCS_DSCHAT = DS_Chat.c
SRCS = $(SRCS_IPL2) $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO))
SRCS_OVERLAY = $(addprefix $(SETTING_DIR)/,$(SRCS_SETTING)) \
$(addprefix $(MBOOT_DIR)/,$(SRCS_MBOOT)) \
$(addprefix $(CHAT_DIR)/,$(SRCS_DSCHAT)) \
OBJS_OVERLAY += $(FONT_OBJS)
SRCS = main.c mainFunc.c DS_DownloadPlay.c
LINCLUDES = $(TWLSDK_ROOT)/build/libraries/spi/arm9/include \
$(TWLSDK_ROOT)/build/libraries/mb/common/include \
$(SRCDIR)/$(LOGO_DIR) \
$(SRCDIR)/$(SETTING_DIR) \
$(SRCDIR)/$(CHAT_DIR) \
$(SRCDIR)/$(MBOOT_DIR) \
LLIBRARY_DIRS =
LLIBRARIES =
@ -66,16 +41,11 @@ include $(TWLIPL_ROOT)/build/buildtools/commondefs.sysmenu
#----------------------------------------------------------------------------
do-build : $(FONT_OBJS) $(TARGETS)
do-build : $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules.sysmenu
#----------------------------------------------------------------------------
CW_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CWFOLDER_NITRO)))
$(FONT_DIR)/%.o : $(FONT_DIR)/%.dat
$(CW_ROOT)/ARM_Tools/Command_Line_Tools/BinToElf.exe $< -aligndata 4 -endian little -output $@
#===== End of Makefile =====

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 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:: 2007-10-03#$
# $Rev: 1319 $
# $Author: kitase_hirotake $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,54 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ARM9-BB.lsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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$
#----------------------------------------------------------------------------
#
# TWL LCF SPEC FILE
#
Static $(TARGET_NAME)
{
Address 0x02800000
Object $(OBJS_STATIC)
Library $(LLIBS) $(GLIBS) $(CW_LIBS)
}
Autoload ITCM
{
Address 0x01ff8000
Object * (.itcm)
Object $(OBJS_AUTOLOAD) (.text)
Object $(OBJS_AUTOLOAD) (.rodata)
}
Autoload DTCM
{
Address $(ADDRESS_DTCM)
Object * (.dtcm)
Object $(OBJS_AUTOLOAD) (.data)
Object $(OBJS_AUTOLOAD) (.sdata)
Object $(OBJS_AUTOLOAD) (.bss)
Object $(OBJS_AUTOLOAD) (.sbss)
}
Ltdautoload LTDMAIN
{
# NITRO/TWL 共有のオーバーレイが在る場合は、さらにその後ろに配置する必要があります。
After $(TARGET_NAME)
Object * (.ltdmain)
Object $(OBJS_LTDAUTOLOAD)
Library $(LLIBS_EX) $(GLIBS_EX)
}

View File

@ -0,0 +1,53 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# File: Makefile
#
# Copyright 2007 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: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TARGET_BIN = main.srl
LCFILE_SPEC = ARM9-TS.lsf
ROM_SPEC = main.rsf
LOGO_DIR = Logo
SRCS_LOGO = logoDemo.c logoData.c
SRCS = main.c launcher.c misc.c $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO))
#SRCS_OVERLAY =
LINCLUDES = $(SRCDIR)/$(LOGO_DIR)
#LLIBRARY_DIRS =
#LLIBRARIES =
#LDEPENDS_NEF =
include $(TWLIPL_ROOT)/build/buildtools/commondefs.sysmenu
#----------------------------------------------------------------------------
do-build : $(FONT_OBJS) $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules.sysmenu
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,147 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-BB.rsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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$
#----------------------------------------------------------------------------
#
# TWL ROM SPEC FILE
#
Arm9
{
Static "$(MAKEROM_ARM9:r).FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.FLX.TWL.sbin$(COMPSUFFIX9)"
Elf "$(MAKEROM_ARM9:r).tef"
}
Arm7
{
Static "$(MAKEROM_ARM7_BASE:r).FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.FLX.TWL.sbin$(COMPSUFFIX7)"
Elf "$(MAKEROM_ARM7_BASE:r).tef"
}
Arm9.Ltd
{
Static "$(MAKEROM_ARM9:r).LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.LTD.TWL.sbin$(COMPSUFFIX9)"
}
Arm7.Ltd
{
Static "$(MAKEROM_ARM7_BASE:r).LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.LTD.TWL.sbin$(COMPSUFFIX7)"
}
Property
{
###
### Settings for FinalROM
###
#### BEGIN
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
# issued by NINTENDO
#
#MakerCode "00"
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
#
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
#
# ROM PADDING: TRUE if finalrom
#
#RomFootPadding TRUE
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
#BannerFile ./etc/myGameBanner.bnr
BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
###
### Setting for TWL
###
#
# BANNER FILE:
#
BannerTWLFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Boot allowed Media: [GameCard/NAND/SDCard/DownloadPlay]
# possible to choose one or more.
#
BootMedia GameCard NAND SDCard DownloadPlay
#
# Certification FILE:
#
Certificate $(TWLSDK_ROOT)/include/twl/specfiles/default_sgn.sbin
#
# Digest parameters:
#
DigestParam 1024 32
#
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD]
# don't have to edit
#
WramMapping $(MAKEROM_WRAM_MAPPING)
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
###
#### END
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot ../../data
Root /data
File NTR_IPL_font_m.NFTR
}

View File

@ -16,7 +16,7 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "main.h"
#include "misc.h"
// define data-----------------------------------------------------------
#define NIN_LOGO_LENGTH 0x9c // Nintendoロゴデータサイズ

View File

@ -63,6 +63,7 @@ static void LogoInit( void )
s_logo.value_A = 0;
s_logo.value_B = 16;
G2_ChangeBlendAlpha( s_logo.value_A, s_logo.value_B );
// メイン画面のみON
GX_DispOn();

View File

@ -24,7 +24,6 @@
extern "C" {
#endif
extern void LoadLogo( void );
extern int LogoMain( void );
extern void SetLogoEnable( BOOL enable );
extern BOOL IsLogoEnable( void );

View File

@ -16,9 +16,8 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "main.h"
#include "logoDemo.h"
#include "DS_Setting.h"
#include "misc.h"
#include "launcher.h"
// define data------------------------------------------
@ -108,46 +107,44 @@ static const u16 *const str_backlight[] = {
//======================================================
// ランチャーの初期化
void LauncherInit(void)
void LauncherInit( TitleProperty *pTitleList )
{
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
#pragma unused( pTitleList )
GX_DispOn();
int i;
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
DrawBackLightSwitch();
PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER );
// NITRO設定データのlanguageに応じたメインメニュー構成言語の切り替え
{
int i;
NvLangCode langCode = LANG_ENGLISH;
if( GetSYSMWork()->ncd_invalid == 0 ) {
langCode = (NvLangCode)GetNCDWork()->option.language;
}
for( i = 0; i < LAUNCHER_ELEMENT_NUM; i++ ) {
s_pStrLauncher[ i ] = s_pStrLauncherElemTbl[ i ][ langCode ];
}
for( i = 0; i < LAUNCHER_ELEMENT_NUM; i++ ) {
s_pStrLauncher[ i ] = s_pStrLauncherElemTbl[ i ][ GetNCDWork()->option.language ];
}
if( !SYSM_IsNITROCard() ) {
s_launcherPos[ 0 ].enable = FALSE; // DSカードが無い時は、先頭要素を無効にする。
}
InitGetAndDrawRtcData( RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y );
DrawLauncher( s_csr, &s_launcherParam );
DrawMenu( s_csr, &s_launcherParam );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
InitGetAndDrawRtcData( RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y );
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
// ランチャーメイン
IPL2BootType LauncherMain( BOOL boot_decision )
TitleProperty *LauncherMain( TitleProperty *pTitleList )
{
#pragma unused( boot_decision )
#pragma unused( pTitleList )
static BOOL touch_bl = FALSE;
BOOL tp_bl_on_off = FALSE;
@ -192,19 +189,19 @@ IPL2BootType LauncherMain( BOOL boot_decision )
csr_old = s_csr;
tp_select = SelectMenuByTP( &s_csr, &s_launcherParam );
DrawLauncher( s_csr, &s_launcherParam );
DrawMenu( s_csr, &s_launcherParam );
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
if( s_launcherPos[ 0 ].enable ) {
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
return (IPL2BootType)( s_csr + 1 );
return NULL;
}
}
return (IPL2BootType)0;
return NULL;
}
#if 0
// ランチャー描画
static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu)
{
@ -224,7 +221,7 @@ static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu)
PutStringUTF16( pMenu->pos[ i ].x, pMenu->pos[ i ].y, color, (pMenu->str_elem)[ i ] );
}
}
#endif
// バックライトスイッチの表示
static void DrawBackLightSwitch(void)

View File

@ -0,0 +1,41 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: launcher.h
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#ifndef __LAUNCHER_H__
#define __LAUNCHER_H__
#include <twl.h>
#include <sysmenu.h>
#ifdef __cplusplus
extern "C" {
#endif
// define data----------------------------------------------------------
// global variables--------------------------------------------------
// function-------------------------------------------------------------
void LauncherInit( TitleProperty *pTitleList );
TitleProperty *LauncherMain( TitleProperty *pTitleList );
#ifdef __cplusplus
}
#endif
#endif // __LAUNCHER_H__

View File

@ -16,11 +16,9 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "main.h"
#include "launcher.h"
#include "misc.h"
#include "logoDemo.h"
#include "DS_Setting.h"
#include "DS_DownloadPlay.h"
#include "DS_Chat.h"
// extern data-----------------------------------------------------------------
@ -40,88 +38,125 @@ static BannerFile banner; //
// const data------------------------------------------------------------------
#if 0
#if 1
typedef struct CardStatus {
u16 primarySlot; // PULLOUT, DETECT, VALID, INVALID
u16 secondarySlot; // 同上。
}CardStatus;
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
u64 titleID; // アプリケーション識別ID
u32 platform; // NTR, TWL (HYBLIDはTWLを返す
void *pBanner; // 固定長フォーマットなら偽造されても大丈夫だろう。
}TitleProperty;
void TwlMain( void )
{
enum {
START = 0,
LOGODEMO = 1,
LAUNCHER_INIT = 2,
LAUNCHER = 3,
AUTHENTICATE = 4,
BOOT = 5,
STOP = 6
};
u32 state = START;
u32 filter_flag;
TitleProperty *pBootTitle = NULL;
// 初期化
SYSM_Init(); // SYSM_CreateCardThread();も含む
TitleProperty *pTitleList = NULL;
// 本体設定データのリード
SYSM_ReadTWLSetting( pTWLSetting );
OS_Init();
// リセットパラメータの取得。PMICの値メインメモリの値
SYSM_GetResetParam( pResetParam );
if( pResetParam->pBootTitle ) { // アプリ直接起動の指定があったらロゴデモを飛ばして起動
pBootTitle = pResetParam->pBootTitle;
state = BOOT;
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
FS_Init( FS_DMA_NOT_USE );
GX_Init();
// 割り込み許可--------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
// システムメニュー初期化----------
SYSM_Init(); // OS_Initの後でコール。
// システムの初期化----------------
InitAllocator( &g_allocator );
CMN_InitFileSystem( &g_allocator );
// リセットパラメータの取得--------
if( SYSM_GetResetParam()->isLogoSkip ) {
if( SYSM_GetResetParam()->bootTitleID ) { // アプリ直接起動の指定があったらロゴデモを飛ばして指定アプリ起動
pBootTitle = (TitleProperty *)SYSM_GetResetParam();
state = AUTHENTICATE;
}else { // それ以外の場合は、ロゴデモを飛ばしてランチャー起動
state = LAUNCHER_INIT;
}
}
// NANDアプリリストの取得
filter_flag = ALL_APP;
SYSM_GetNandTitleList( pTitleList_Nand, filter_flag ); // filter_flag : ALL, ALL_APP, SYS_APP, USER_APP, Data only, 等の条件を指定してタイトルリストを取得する。
// return : *TitleProperty Array
// コンテント(リソース)ファイルのリード
SYSM_ReadContentFile( ContentID );
// FS_ReadContentFile( ContentID );
// 共有コンテントファイルのリード
SYSM_ReadSharedContentFile( ContentID );
// FS_ReadSharedContentFile( ContentID );
// NANDアプリリストの取得----------
(void)SYSM_GetNandTitleList( pTitleList );
while( 1 ) {
CardStatus cardStatus = SYSM_GetCardTitleList( pTitleList_Card ); // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
ReadTpData(); // TP入力の取得
(void)SYSM_GetCardTitleList( pTitleList ); // カードアプリリストの取得(スレッドで随時カード挿抜を通知されるものをメインループで取得)
switch( state ) {
case START:
LogoInit();
state = LOGODEMO;
break;
case LOGODEMO:
if( LogoDemo() ) {
LauncherInit( pTitleList_Nand, pTitleList_Card );
state = LAUNCHER;
if( LogoMain() ) {
state = LAUNCHER_INIT;
}
break;
case LAUNCHER_INIT:
InitBG(); // BG初期化
LauncherInit( pTitleList );
state = LAUNCHER;
break;
case LAUNCHER:
pBootTitle = Launcher( pTitleList_Card, cardStatus );
pBootTitle = LauncherMain( pTitleList );
if( pBootTitle ) {
state = AUTHENTICATE;
}
break;
case AUTHENTICATE:
switch ( SYSM_LoadAndAuthenticateTitle( pBootTitle ) ) { // アプリロード&認証
case AUTH_PROCESSING:
break;
case AUTH_RESULT_SUCCEEDED:
state = BOOT;
break;
case AUTH_RESULT_TITLE_POINTER_ERROR:
case AUTH_RESULT_AUTHENTICATE_FAILED:
case AUTH_RESULT_ENTRY_ADDRESS_ERROR:
state = STOP;
break;
}
break;
case BOOT:
if( pBootTitle ) {
if( SYSM_CheckTitlePointer( pBootTitle ) && // ポインタチェック
SYSM_AuthAndLoadTitle ( pBootTitle ) ) { // ROMヘッダ認証
SYSM_Finalize(); // 終了処理
return;
}
state = STOP;
}
break;
case STOP:
SYSM_Finalize(); // 終了処理
return;
case STOP: // 停止
break;
}
}
}
#endif
extern void SampleMain(void);
// ============================================================================
// function's description
// ============================================================================
/*
void TwlMain(void)
{
typedef enum PrgState {
@ -164,9 +199,9 @@ void TwlMain(void)
// InitAllocSystem();
// ARM7初期化待ち--------------------------
if( SYSM_WaitARM7Init() ) { // ARM7側の初期化が終わるのを待ってからメインループ開始
return; // TRUEが返されたら、デバッガブートなのでリターン
}
// if( SYSM_WaitARM7Init() ) { // ARM7側の初期化が終わるのを待ってからメインループ開始
// return; // TRUEが返されたら、デバッガブートなのでリターン
// }
// メインループ----------------------------
while(1){
@ -194,17 +229,6 @@ void TwlMain(void)
// NITROロゴ表示
//-----------------------------------
case STATE_LOGO_DISP:
// 自動起動ONの時のキーショートカット処理
if( GetNCDWork()->option.autoBootFlag ) { // TPタッチされるか、Bボタンが押下されたら今回の自動起動をOFFにする。
ReadTpDataLogoDirectBootCancel(); // ※red_ipl2特有の処理。red_ipl2のTP仕様は特許にひっかかっているので使えないが、ここだけは有効にしたいので、無理やり実装。
if( (tpd.disp.touch) || (pad.trg & PAD_BUTTON_B) ) {
boot_decision = 0;
SYSM_ClearBootFlag( BFLG_BOOT_NITRO | BFLG_BOOT_AGB | BFLG_BOOT_BMENU );
}
}
if( LogoMain() ) { // ロゴ表示ルーチン※BFLG_GAMEBOY_LOGO_OFFの時は即終了
InitBG(); // BG初期化
LauncherInit(); // ブート未決定時のみロゴメニューを初期化する。
@ -280,7 +304,8 @@ void TwlMain(void)
// MI_CpuCopyFast( bgBakS, (void*)(HW_DB_BG_VRAM+0xf000), sizeof(bgBakS) );
}
}
*/
// アロケータの初期化
static void InitAllocator( NNSFndAllocator* pAllocator )

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mainFunc.c
File: misc.c
Copyright 2007 Nintendo. All rights reserved.
@ -16,11 +16,6 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include "main.h"
#include "DS_Setting.h"
#include "logoDemo.h"
#include "misc.h"
// define data-----------------------------------------------------------------
@ -41,7 +36,7 @@ enum
// デモ共通のカラーパレット
GXRgb TXTColorPalette[TXT_NUM_CPALEETE * 16] =
{
GX_RGB( 0, 0, 0), GX_RGB(31, 31, 31), GX_RGB( 0, 0, 0), GX_RGB(31, 0, 0),
GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), GX_RGB( 0, 0, 0), GX_RGB(31, 0, 0),
GX_RGB( 0, 31, 0), GX_RGB( 0, 0, 31), GX_RGB( 0, 31, 31), GX_RGB(31, 0, 31),
GX_RGB(31, 31, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0), GX_RGB( 0, 0, 0),
@ -84,23 +79,21 @@ static void InitCanvas( void );
static void GetAndDrawRtcDataCore( BOOL forceGetFlag );
// global variable-------------------------------------------------------------
GXOamAttr oamBakS[ 128 ] ATTRIBUTE_ALIGN(32); // OAM バックアップ
GXOamAttr oamBakS[ 128 ] ATTRIBUTE_ALIGN(32); // OAM バックアップ
u16 bgBakM[ 32 * 24 ] ATTRIBUTE_ALIGN(32); // BG バックアップ
u16 bgBakS[ 32 * 24 ] ATTRIBUTE_ALIGN(32); // BG バックアップ
KeyWork pad; // キーパッド入力データ
TpWork tpd; // タッチパネル入力データ
NNSG2dFont gFont; // フォント
NNSG2dCharCanvas gCanvas; // CharCanvas
NNSG2dTextCanvas gTextCanvas; // TextCanvas
NNSG2dCharCanvas gCanvasSub; // CharCanvas
NNSG2dTextCanvas gTextCanvasSub; // TextCanvas
// static variable-------------------------------------------------------------
static int s_detach_count;
static int s_detach_count;
static RtcDrawPos s_rtcPos;
static RTCDate s_rtcDate;
static RTCTime s_rtcTime;
static u16 s_vcount;
static RTCDate s_rtcDate;
static RTCTime s_rtcTime;
static u16 s_vcount;
static char s_strBuffer[ STRING_LENGTH_MAX * 2 ] ATTRIBUTE_ALIGN(2);
static u16 s_strBufferUTF16[ STRING_LENGTH_MAX ];
@ -146,51 +139,40 @@ void InitBG(void)
MI_CpuClearFast( (void *)HW_BG_VRAM, 0x20000 ); // BG -VRAM クリア
MI_CpuClearFast( (void *)HW_OBJ_VRAM, 0x20000 ); // OBJ-VRAM クリア
MI_CpuClearFast( (void *)HW_PLTT, HW_PLTT_SIZE ); // パレット クリア // NitroSDKではcrt0.cでクリアしている。
MI_DmaFill32( 3, (void *)HW_OAM, 192, HW_OAM_SIZE ); // OAM クリア // NitroSDKではcrt0.cでクリアしている。
// カラーパレットを設定
GX_LoadBGPltt(TXTColorPalette, 0, sizeof(TXTColorPalette));
GX_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) );
// BGモード設定
GX_SetGraphicsMode( GX_DISPMODE_GRAPHICS, GX_BGMODE_4, GX_BG0_AS_2D );
GX_SetGraphicsMode( GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D );
GX_SetBGScrOffset ( GX_BGSCROFFSET_0x10000 );
GX_SetBGCharOffset( GX_BGCHAROFFSET_0x00000 );
InitScreen();
InitCanvas();
}
// サブLCD
/*
{
GXS_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_1D_32K);
// VRAM割り当て
GX_SetBankForSubBG ( GX_VRAM_SUB_BG_128_C ); // VRAM-C for BGs
GX_SetBankForSubOBJ( GX_VRAM_SUB_OBJ_128_D ); // VRAM-D for BGs
GXS_SetGraphicsMode( GX_BGMODE_0 ); // BGMODE is 0
GXS_SetVisiblePlane( GX_PLANEMASK_BG1 ); // display only BG #0
G2S_SetBG1Control( GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text
GX_BG_COLORMODE_16, // use 256 colors mode
GX_BG_SCRBASE_0xf000, // screen base offset + 0x0000 is the address for BG #0 screen
GX_BG_CHARBASE_0x00000, // character base offset + 0x04000 is the address for BG #0 characters
GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled
);
G2S_SetBG1Priority( 3 );
G2S_BG1Mosaic( FALSE );
MI_DmaFill32( 3, (void *)HW_DB_OAM, 192, HW_OAM_SIZE ); // OAM クリア
MI_CpuClearFast( (void *)HW_DB_BG_VRAM, 0x20000 ); // BG -VRAM クリア
MI_CpuClearFast( (void *)HW_DB_OBJ_VRAM, 0x20000 ); // OBJ -VRAM クリア
MI_CpuCopyFast( myPlttData, (void *)HW_DB_BG_PLTT, sizeof(myPlttData) ); // BGパレット セット
MI_CpuCopyFast( myPlttData, (void *)HW_DB_BG_PLTT, sizeof(myPlttData) ); // OBJパレット セット
// カラーパレットを設定
GXS_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) );
// BGモード設定
GXS_SetGraphicsMode( GX_BGMODE_0 ); // BGMODE is 0
}
*/
InitScreen();
InitCanvas();
}
// スクリーン初期化
static void InitScreen( void )
{
// BG 0 を設定
// メイン画面 BG 0 を設定
G2_SetBG0Control(
GX_BG_SCRSIZE_TEXT_256x256, // スクリーンサイズ 256x256
GX_BG_COLORMODE_16, // カラーモード 16色
@ -198,9 +180,17 @@ static void InitScreen( void )
GX_BG_CHARBASE_0x00000, // キャラクタベース
GX_BG_EXTPLTT_01 // 拡張パレットスロット
);
// BG0 を可視に
GX_SetVisiblePlane( GX_PLANEMASK_BG0 );
// サブ画面 BG 0 を設定
G2S_SetBG0Control(
GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text
GX_BG_COLORMODE_16, // use 256 colors mode
GX_BG_SCRBASE_0xf800, // screen base offset + 0x0000 is the address for BG #0 screen
GX_BG_CHARBASE_0x00000, // character base offset + 0x04000 is the address for BG #0 characters
GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled
);
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 ); // display only BG #0
}
@ -216,35 +206,68 @@ static void InitCanvas( void )
// NNS_G2dPrintFont(&gFont);
}
// CharCanvas の初期化
NNS_G2dCharCanvasInitForBG(
&gCanvas,
(GXCharFmt16*)G2_GetBG0CharPtr() + CHARACTER_OFFSET,
CANVAS_WIDTH,
CANVAS_HEIGHT,
NNS_G2D_CHARA_COLORMODE_16
);
// TextCanvasの初期化
NNS_G2dTextCanvasInit(
&gTextCanvas,
&gCanvas,
&gFont,
TEXT_HSPACE,
TEXT_VSPACE
);
// スクリーンを設定
NNS_G2dMapScrToCharText(
G2_GetBG0ScrPtr(),
CANVAS_WIDTH,
CANVAS_HEIGHT,
CANVAS_LEFT,
CANVAS_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
CHARACTER_OFFSET,
TXT_CPALETTE_MAIN
);
{
// CharCanvas の初期化
NNS_G2dCharCanvasInitForBG(
&gCanvas,
(GXCharFmt16*)G2_GetBG0CharPtr() + CHARACTER_OFFSET,
CANVAS_WIDTH,
CANVAS_HEIGHT,
NNS_G2D_CHARA_COLORMODE_16
);
// TextCanvasの初期化
NNS_G2dTextCanvasInit(
&gTextCanvas,
&gCanvas,
&gFont,
TEXT_HSPACE,
TEXT_VSPACE
);
// スクリーンを設定
NNS_G2dMapScrToCharText(
G2_GetBG0ScrPtr(),
CANVAS_WIDTH,
CANVAS_HEIGHT,
CANVAS_LEFT,
CANVAS_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
CHARACTER_OFFSET,
TXT_CPALETTE_MAIN
);
}
{
// CharCanvas の初期化
NNS_G2dCharCanvasInitForBG(
&gCanvasSub,
(GXCharFmt16*)G2S_GetBG0CharPtr() + CHARACTER_OFFSET,
CANVAS_WIDTH,
CANVAS_HEIGHT,
NNS_G2D_CHARA_COLORMODE_16
);
// TextCanvasの初期化
NNS_G2dTextCanvasInit(
&gTextCanvasSub,
&gCanvasSub,
&gFont,
TEXT_HSPACE,
TEXT_VSPACE
);
// スクリーンを設定
NNS_G2dMapScrToCharText(
G2S_GetBG0ScrPtr(),
CANVAS_WIDTH,
CANVAS_HEIGHT,
CANVAS_LEFT,
CANVAS_TOP,
NNS_G2D_TEXT_BG_WIDTH_256,
CHARACTER_OFFSET,
TXT_CPALETTE_MAIN
);
}
}
@ -255,6 +278,12 @@ void PutStringUTF16( int x, int y, int color, const u16 *strUTF16 )
strUTF16 );
}
void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 )
{
NNS_G2dTextCanvasDrawText( &gTextCanvasSub, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
strUTF16 );
}
// SJISでPrintf形式で文字表示内部でUTF16に変換)
void PrintfSJIS( int x, int y, int color, const char *fmt, ... )
@ -274,6 +303,23 @@ void PrintfSJIS( int x, int y, int color, const char *fmt, ... )
s_strBufferUTF16 );
}
void PrintfSJISSub( int x, int y, int color, const char *fmt, ... )
{
int srcLen;
int dstLen = sizeof(s_strBufferUTF16);
va_list vlist;
va_start(vlist, fmt);
srcLen = STD_TVSNPrintf( s_strBuffer, sizeof(s_strBuffer), fmt, vlist);
va_end(vlist);
s_strBuffer[ srcLen ] = 0;
(void)STD_ConvertStringSjisToUnicode( s_strBufferUTF16, &dstLen, s_strBuffer, &srcLen, NULL );
s_strBufferUTF16[ dstLen ] = 0;
NNS_G2dTextCanvasDrawText(&gTextCanvasSub, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT,
s_strBufferUTF16 );
}
// キー入力読み出し--------------------------------
void ReadKeyPad(void)
@ -287,12 +333,6 @@ void ReadKeyPad(void)
// タッチパネルデータの取得-----------------------
void ReadTpData(void)
{
#ifndef __TP_OFF
#ifdef __TP_CALIBLATE_ONLY_ENABLE
return;
#endif /* __TP_CALIBLATE_ONLY_ENABLE */
TP_GetCalibratedPoint( &tpd.last, &tpd.raw ); // 前回のTPデータを退避
if( TP_RequestRawSampling(&tpd.raw) ) { // タッチパネルのサンプリング
@ -323,21 +363,6 @@ void ReadTpData(void)
}
}
#endif
#endif /* __TP_OFF */
}
// ロゴメニューの直接ブート時のキャンセルのみタッチパネルを有効にする。
void ReadTpDataLogoDirectBootCancel(void)
{
#ifndef __TP_OFF
TP_GetCalibratedPoint( &tpd.last, &tpd.raw ); // 前回のTPデータを退避
if( TP_RequestRawSampling(&tpd.raw) ) { // タッチパネルのサンプリング
SVC_CpuClear(0x0000, &tpd.raw, sizeof(tpd.raw), 16); // SPI-busyでデータ取得に失敗した時は”データなし”でリターン。
return;
}
TP_GetCalibratedPoint( &tpd.disp, &tpd.raw ); // TP座標からLCD座標に変換。
#endif /* __TP_OFF */
}
@ -364,110 +389,28 @@ void StartDetachTP( void )
}
// バナーアイコンOBJのロード
void SetBannerIconOBJ( BannerFileV1 *bannerp )
{
GXS_LoadOBJPltt( bannerp->pltt, 15, BNR_PLTT_SIZE );
MI_CpuCopyFast( bannerp->image, (void *)(HW_DB_OBJ_VRAM + 0x20), BNR_IMAGE_SIZE );
G2_SetOBJAttr( (GXOamAttr*)&oamBakS[ 1 ], // OAM pointer
32, // X position
32, // Y position
0, // Priority
GX_OAM_MODE_NORMAL, // Bitmap mode
FALSE, // mosaic off
GX_OAM_EFFECT_NONE, // affine off
GX_OAM_SHAPE_32x32, // 16x16 size
GX_OAM_COLOR_16, // 16 color
1, // charactor
15, // palette
0); // affine
}
//======================================================
// メニュー制御
//======================================================
// メニュー描画
void DrawMenu(u16 nowCsr, const MenuComponent *menu)
void DrawMenu( u16 nowCsr, const MenuParam *pMenu )
{
int i;
int color;
for( i = 0; i < menu->num; i++) {
if(i == nowCsr) color = menu->select_color;
else color = menu->normal_color;
PutStringUTF16( menu->pos_x, (int)menu->pos_y + i * menu->next_y_num, color, (const u16 *)(menu->str_elem)[i] );
// (void)DrawStringSJIS( menu->pos_x, (u16)(menu->pos_y + i * menu->next_y_num), color, (menu->str_elem)[i]);
}
}
// タッチパネルによるメニュー選択
BOOL SelectMenuByTp(u16 *nowCsr, const MenuComponent *menu)
{
u16 i, lt_x, lt_y, rb_x, rb_y;
TPData *target;
static u16 detach_count = 0;
static u16 csr_old = 0xff;
static u16 same_csr_count = 0;
// detach_countが始動していたら、カウント判定。
if(detach_count > 0) {
if(tpd.disp.touch == 0) { // TPが押されていなければ、カウント進行し、カウントでメニュー選択
if(++detach_count == TP_CSR_DETACH_COUNT) {
detach_count = 0;
return TRUE;
for( i = 0; i < pMenu->num; i++ ) {
if(i == nowCsr) {
if( !pMenu->pos[ i ].enable ) {
color = pMenu->disable_color;
}else {
return FALSE;
color = pMenu->select_color;
}
}else {
color = pMenu->normal_color;
}
PutStringUTF16( pMenu->pos[ i ].x, pMenu->pos[ i ].y, color, (pMenu->str_elem)[ i ] );
}
detach_count=0; // detachカウント値のクリア
// 通常は、TPデータがメニュー上にあるかどうかを判定。
lt_x = (u16)(menu->pos_x * 8); // メニュー要素先頭のLCD座標を算出
lt_y = (u16)(menu->pos_y * 8 - 4);
rb_x = (u16)((menu->pos_x + menu->name_length) * 8);
rb_y = (u16)(menu->pos_y * 8 + 12); // ※Y座標は±4のマージン
if(tpd.disp.touch) target = &tpd.disp;
else target = &tpd.last;
// (void)DrawDecimalSJIS( 20 , 4, WHITE, &csr_old, 2, 2);
// (void)DrawDecimalSJIS( 20 , 5, WHITE, &same_csr_count, 2, 2);
// (void)DrawDecimalSJIS( 20 , 6, WHITE, &detach_count, 2, 2);
for(i = 0; i < menu->num; i++) {
if(tpd.disp.touch) { // タッチパネルがメニューの要素上でタッチされているなら、
if(InRangeTp(lt_x, lt_y, rb_x, rb_y, target)) {
if(tpd.disp.validity == TP_VALIDITY_VALID) { // カーソルをその要素に移動
if(csr_old == i) {
if(same_csr_count < TP_CSR_TOUCH_COUNT) {
same_csr_count++;
}else {
*nowCsr = i;
}
return FALSE;
}else {
csr_old = i;
}
break;
}
}
}else { // touch==0
if(same_csr_count == TP_CSR_TOUCH_COUNT) {
detach_count = 1;
break;
}
}
lt_y += (u16)(menu->next_y_num * 8);
rb_y += (u16)(menu->next_y_num * 8);
}
same_csr_count = 0;
return FALSE;
}
@ -594,13 +537,13 @@ static void GetAndDrawRtcDataCore( BOOL forceGetFlag )
// 前RTC情報の消去
{
year = s_rtcDate.year + 2000;
PrintfSJIS( s_rtcPos.date_x, s_rtcPos.date_y, TXT_COLOR_WHITE, "%d/%02d/%02d[%3s]",
PrintfSJISSub( s_rtcPos.date_x, s_rtcPos.date_y, TXT_COLOR_WHITE, "%d/%02d/%02d[%3s]",
year,
date_old.month,
date_old.day,
g_strWeek[ date_old.week ]
);
PrintfSJIS( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d",
PrintfSJISSub( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d",
time_old.hour,
time_old.minute,
time_old.second
@ -609,13 +552,13 @@ static void GetAndDrawRtcDataCore( BOOL forceGetFlag )
// RTC情報の表示
{
year = s_rtcDate.year + 2000;
PrintfSJIS( s_rtcPos.date_x, s_rtcPos.date_y, TXT_COLOR_BLACK, "%d/%02d/%02d[%3s]",
PrintfSJISSub( s_rtcPos.date_x, s_rtcPos.date_y, TXT_COLOR_BLACK, "%d/%02d/%02d[%3s]",
year,
s_rtcDate.month,
s_rtcDate.day,
g_strWeek[ s_rtcDate.week ]
);
PrintfSJIS( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d",
PrintfSJISSub( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d",
s_rtcTime.hour,
s_rtcTime.minute,
s_rtcTime.second
@ -624,3 +567,22 @@ static void GetAndDrawRtcDataCore( BOOL forceGetFlag )
}
}
// バナーアイコンOBJのロード
void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp )
{
GXS_LoadOBJPltt( bannerp->pltt, 15, BNR_PLTT_SIZE );
MI_CpuCopyFast( bannerp->image, (void *)(HW_DB_OBJ_VRAM + 0x20), BNR_IMAGE_SIZE );
G2_SetOBJAttr( pDstOAM, // OAM pointer
32, // X position
32, // Y position
0, // Priority
GX_OAM_MODE_NORMAL, // Bitmap mode
FALSE, // mosaic off
GX_OAM_EFFECT_NONE, // affine off
GX_OAM_SHAPE_32x32, // 16x16 size
GX_OAM_COLOR_16, // 16 color
1, // charactor
15, // palette
0); // affine
}

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: main.h
File: misc.h
Copyright 2007 Nintendo. All rights reserved.
@ -15,12 +15,11 @@
$Author$
*---------------------------------------------------------------------------*/
#ifndef __MAIN_H__
#define __MAIN_H__
#ifndef __MISC_H__
#define __MISC_H__
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#define NNS_G2D_UNICODE
#include <nnsys.h>
@ -33,6 +32,8 @@ extern "C" {
#endif
// define data----------------------------------------------------------
#define TP_CSR_TOUCH_COUNT 2 // TPカーソルのチャタリング吸収のためのカウント値
#define TP_CSR_DETACH_COUNT 2 // TPカーソルを「選択」と判定するTPデタッチからのカウント値
// DrawText での左上寄せ
#define TXT_DRAWTEXT_FLAG_DEFAULT (NNS_G2D_VERTICALORIGIN_TOP | NNS_G2D_HORIZONTALORIGIN_LEFT | NNS_G2D_HORIZONTALALIGN_LEFT)
@ -77,19 +78,10 @@ enum
// 時計表示場所
#define RTC_DATE_TOP_X ( 18 * 8 )
#define RTC_DATE_TOP_Y ( 2 * 8 )
#define RTC_TIME_TOP_X ( 25 * 8 )
#define RTC_TIME_TOP_Y ( 4 * 8 )
// IPL2のブートタイプ指定
typedef enum IPL2BootType {
BOOT_TYPE_UNSOLVED = 0,
BOOT_TYPE_NITRO,
BOOT_TYPE_PICT_CHAT,
BOOT_TYPE_WIRELESS_BOOT,
BOOT_TYPE_BMENU
}IPL2BootType;
#define RTC_DATE_TOP_X ( 9 * 8 )
#define RTC_DATE_TOP_Y ( 10 * 8 )
#define RTC_TIME_TOP_X ( 12 * 8 )
#define RTC_TIME_TOP_Y ( 12 * 8 )
// キーデータワーク
@ -108,26 +100,14 @@ typedef struct {
}TpWork;
// メニュー構成パラメータ構造体
typedef struct MenuComponent {
int num;
int pos_x;
int pos_y;
int next_x_num;
int next_y_num;
int name_length;
int normal_color;
int select_color;
const u8 **str_elem;
}MenuComponent;
// メニュー要素座標
typedef struct MenuPos {
BOOL enable;
int x;
int y;
}MenuPos;
// メニュー構成パラメータ構造体
typedef struct MenuParam {
int num;
@ -140,44 +120,34 @@ typedef struct MenuParam {
// global variables--------------------------------------------------
extern GXOamAttr oamBakS[ 128 ]; // OAM バックアップ
extern u16 bgBakM[ 32*24 ]; // BG バックアップ
extern u16 bgBakS[ 32*24 ]; // BG バックアップ
extern TpWork tpd; // タッチパネルデータ
extern KeyWork pad; // キーパッド入力データ
extern const u8 *const g_strWeek[ 7 ];
extern const u8 *const g_strWeek[ 7 ]; // 曜日文字列
extern NNSFndAllocator g_allocator;
extern NNSG2dFont gFont; // フォント
extern NNSG2dCharCanvas gCanvas; // CharCanvas
extern NNSG2dTextCanvas gTextCanvas; // TextCanvas
extern NNSFndAllocator g_allocator; // メモリアロケータ
extern NNSG2dFont gFont; // フォント
extern NNSG2dCharCanvas gCanvas; // CharCanvas
extern NNSG2dTextCanvas gTextCanvas; // TextCanvas
// function-------------------------------------------------------------
void LauncherInit( void );
IPL2BootType LauncherMain( BOOL boot_decision );
void InitBG( void );
void PutStringUTF16( int x, int y, int color, const u16 *strUTF16 );
void PrintfSJIS( int x, int y, int color, const char *fmt, ... );
void PutStringUTF16 ( int x, int y, int color, const u16 *strUTF16 );
void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 );
void PrintfSJIS ( int x, int y, int color, const char *fmt, ... );
void PrintfSJISSub( int x, int y, int color, const char *fmt, ... );
void ReadKeyPad( void );
void ReadTpData( void );
void ReadTpDataLogoDirectBootCancel( void );
BOOL WaitDetachTP( void );
void StartDetachTP( void );
void SetBannerIconOBJ( BannerFileV1 *bannerp );
void DrawMenu( u16 nowCsr, const MenuComponent *menu );
BOOL SelectMenuByTp( u16 *nowCsr, const MenuComponent *menu );
void DrawMenu( u16 nowCsr, const MenuParam *pMenu );
BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu );
BOOL InRangeTp( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt );
void InitGetAndDrawRtcData( int drawDatePos_x, int drawDatePos_y, int drawTimePos_x, int drawTimePos_y );
void GetAndDrawRtcData( void );
void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp );
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
#endif // __MISC_H__

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 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:: 2007-10-03#$
# $Rev: 1319 $
# $Author: kitase_hirotake $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -0,0 +1,55 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# File: Makefile
#
# Copyright 2007 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: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TARGET_BIN = main.srl
#LCFILE_SPEC =
ROM_SPEC = main.rsf
MISC_DIR = ../../Launcher/ARM9/src
SRCS = main.c $(MISC_DIR)/misc.c \
MachineSetting.c setRTC.c selectLanguage.c calibrationTP.c
#setOwnerInfo.c
#SRCS_OVERLAY =
LINCLUDES = $(MISC_DIR)
#LLIBRARY_DIRS =
#LLIBRARIES =
#LDEPENDS_NEF =
include $(TWLIPL_ROOT)/build/buildtools/commondefs.sysmenu
#----------------------------------------------------------------------------
do-build : $(FONT_OBJS) $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules.sysmenu
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,147 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-BB.rsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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$
#----------------------------------------------------------------------------
#
# TWL ROM SPEC FILE
#
Arm9
{
Static "$(MAKEROM_ARM9:r).FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.FLX.TWL.sbin$(COMPSUFFIX9)"
Elf "$(MAKEROM_ARM9:r).tef"
}
Arm7
{
Static "$(MAKEROM_ARM7_BASE:r).FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.FLX.TWL.sbin$(COMPSUFFIX7)"
Elf "$(MAKEROM_ARM7_BASE:r).tef"
}
Arm9.Ltd
{
Static "$(MAKEROM_ARM9:r).LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.LTD.TWL.sbin$(COMPSUFFIX9)"
}
Arm7.Ltd
{
Static "$(MAKEROM_ARM7_BASE:r).LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.LTD.TWL.sbin$(COMPSUFFIX7)"
}
Property
{
###
### Settings for FinalROM
###
#### BEGIN
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
# issued by NINTENDO
#
#MakerCode "00"
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
#
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
#
# ROM PADDING: TRUE if finalrom
#
#RomFootPadding TRUE
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
#BannerFile ./etc/myGameBanner.bnr
BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
###
### Setting for TWL
###
#
# BANNER FILE:
#
BannerTWLFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Boot allowed Media: [GameCard/NAND/SDCard/DownloadPlay]
# possible to choose one or more.
#
BootMedia GameCard NAND SDCard DownloadPlay
#
# Certification FILE:
#
Certificate $(TWLSDK_ROOT)/include/twl/specfiles/default_sgn.sbin
#
# Digest parameters:
#
DigestParam 1024 32
#
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD]
# don't have to edit
#
WramMapping $(MAKEROM_WRAM_MAPPING)
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
###
#### END
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot ../../data
Root /data
File NTR_IPL_font_m.NFTR
}

View File

@ -0,0 +1,296 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: mainMenu.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "MachineSetting.h"
#include "spi.h"
// define data------------------------------------------
// キャンセルボタンLCD領域
#define CANCEL_BUTTON_LT_X ( 12 * 8 )
#define CANCEL_BUTTON_LT_Y ( 21 * 8 )
#define CANCEL_BUTTON_RB_X ( (CANCEL_BUTTON_LT_X + 8) * 8 )
#define CANCEL_BUTTON_RB_Y ( (CANCEL_BUTTON_LT_Y + 2) * 8 )
// OKボタンLCD領域
#define OK_BUTTON_LT_X ( 22 * 8 )
#define OK_BUTTON_LT_Y ( 21 * 8 )
#define OK_BUTTON_RB_X ( (OK_BUTTON_LT_X + 8) * 8 )
#define OK_BUTTON_RB_Y ( (OK_BUTTON_LT_Y + 2) * 8 )
#define SETTING_MENU_ELEMENT_NUM 4 // メインメニューの項目数
// extern data------------------------------------------
// function's prototype declaration---------------------
static BOOL InitialSetting( void );
static void InitialSettingFinalizeInit( void );
static int InitialSettingFinalizeMain( void );
// global variable -------------------------------------
BOOL g_initialSet = FALSE;
// static variable -------------------------------------
static u16 s_csr = 0;
static const u16 *s_pStrSetting[ SETTING_MENU_ELEMENT_NUM ]; // メインメニュー用文字テーブルへのポインタリスト
// const data -----------------------------------------
//===============================================
// mainMenu.c
//===============================================
static const u16 *const s_pStrSettingElemTbl[ SETTING_MENU_ELEMENT_NUM ][ LANG_CODE_MAX ] = {
{
(const u16 *)L"言語",
(const u16 *)L"LANGUAGE",
(const u16 *)L"LANGUAGE(F)",
(const u16 *)L"LANGUAGE(G)",
(const u16 *)L"LANGUAGE(I)",
(const u16 *)L"LANGUAGE(S)",
},
{
(const u16 *)L"日付 & 時刻",
(const u16 *)L"DATE & TIME",
(const u16 *)L"DATE & TIME(F)",
(const u16 *)L"DATE & TIME(G)",
(const u16 *)L"DATE & TIME(I)",
(const u16 *)L"DATE & TIME(S)",
},
{
(const u16 *)L"ユーザー情報",
(const u16 *)L"USER INFORMATION",
(const u16 *)L"USER INFORMATION(F)",
(const u16 *)L"USER INFORMATION(G)",
(const u16 *)L"USER INFORMATION(I)",
(const u16 *)L"USER INFORMATION(S)",
},
{
(const u16 *)L"タッチパネル補正",
(const u16 *)L"TOUCH PANEL",
(const u16 *)L"TOUCH PANEL(F)",
(const u16 *)L"TOUCH PANEL(G)",
(const u16 *)L"TOUCH PANEL(I)",
(const u16 *)L"TOUCH PANEL(S)",
},
};
static MenuPos s_settingPos[] = {
{ TRUE, 4 * 8, 8 * 8 },
{ TRUE, 4 * 8, 10 * 8 },
{ FALSE, 4 * 8, 12 * 8 },
{ TRUE, 4 * 8, 14 * 8 },
};
static const MenuParam s_settingParam = {
SETTING_MENU_ELEMENT_NUM,
TXT_COLOR_BLACK,
TXT_COLOR_GREEN,
TXT_COLOR_RED,
&s_settingPos[ 0 ],
(const u16 **)&s_pStrSetting,
};
//======================================================
// メインメニュー
//======================================================
// メインメニューの初期化
void MachineSettingInit( void )
{
int i;
// 初回起動シーケンス
if( InitialSetting() ) {
return;
}
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"MACHINE SETTINGS" );
#ifdef __NCD_CLEAR_ENABLE
(void)PutStringUTF16( 18 * 8, 21 * 8, TXT_COLOR_BLACK, (const u16 *)L"[START]:NCD clear.");
#endif /* __NCD_CLEAR_ENABLE */
// NITRO設定データのlanguageに応じたメインメニュー構成言語の切り替え
for( i = 0; i < SETTING_MENU_ELEMENT_NUM; i++ ) {
s_pStrSetting[ i ] = s_pStrSettingElemTbl[ i ][ GetNCDWork()->option.language ];
}
DrawMenu( s_csr, &s_settingParam );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
GX_SetVisiblePlane ( GX_PLANEMASK_BG0 );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
g_pNowProcess = MachineSettingMain;
}
// メインメニュー
int MachineSettingMain( void )
{
BOOL tp_select;
GetAndDrawRtcData();
ReadTpData();
//--------------------------------------
// キー入力処理
//--------------------------------------
if( pad.trg & PAD_KEY_DOWN ){ // カーソルの移動
if( ++s_csr == SETTING_MENU_ELEMENT_NUM ) {
s_csr=0;
}
}
if( pad.trg & PAD_KEY_UP ){
if( --s_csr & 0x80 ) {
s_csr=SETTING_MENU_ELEMENT_NUM - 1;
}
}
tp_select = SelectMenuByTP( &s_csr, &s_settingParam );
DrawMenu( s_csr, &s_settingParam );
if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐
if( s_settingPos[ s_csr ].enable ) {
switch( s_csr ) {
case 0:
SelectLanguageInit();
g_pNowProcess = SelectLanguageMain;
break;
case 1:
SetRTCInit();
g_pNowProcess = SetRTCMain;
break;
case 2:
// SetOwnerInfoInit();
// g_pNowProcess = SetOwnerInfoMain;
break;
case 3:
TP_CalibrationInit();
g_pNowProcess = TP_CalibrationMain;
break;
}
}
}
#ifdef __NCD_CLEAR_ENABLE
if( pad.trg & PAD_BUTTON_START ) {
SVC_CpuClearFast( 0x0000, GetNCDWork(), sizeof(NitroConfigData) );
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase( 0x3fe00 );
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteEnable();
SVC_WaitVBlankIntr();
(void)SPI_NvramPageErase( 0x3ff00 );
SVC_WaitVBlankIntr();
(void)SPI_NvramWriteDisable();
OS_TPrintf("NitroConfigData zero clear!!\n");
}
#endif /* __NCD_CLEAR_ENABLE */
return 0;
}
// OK / CANCELボタンの描画
void DrawOKCancelButton(void)
{
(void)PutStringUTF16( CANCEL_BUTTON_LT_X, CANCEL_BUTTON_LT_Y, TXT_COLOR_CYAN, (const u16 *)L" CANCEL ");
(void)PutStringUTF16( OK_BUTTON_LT_X, OK_BUTTON_LT_Y, TXT_COLOR_CYAN, (const u16 *)L" OK ");
}
// OK or CANCELボタン押下チェック
void CheckOKCancelButton(BOOL *tp_ok, BOOL *tp_cancel)
{
*tp_cancel = InRangeTp( CANCEL_BUTTON_LT_X, CANCEL_BUTTON_LT_Y - 4,
CANCEL_BUTTON_RB_X, CANCEL_BUTTON_RB_Y - 4, &tpd.disp );
*tp_ok = InRangeTp( OK_BUTTON_LT_X, OK_BUTTON_LT_Y - 4,
OK_BUTTON_RB_X, OK_BUTTON_RB_Y - 4, &tpd.disp );
}
//---------------------------------------------------------
//
// 設定終了
//
//---------------------------------------------------------
// 初回起動シーケンス
static BOOL InitialSetting( void )
{
#if 0
if(GetNCDWork()->option.input_language == 0) { // 言語設定がまだ。
g_initialSet = TRUE;
s_csr = 2;
SelectLangageInit();
g_pNowProcess = SelectLanguageMain;
return TRUE;
}else if(GetNCDWork()->option.input_tp == 0) { // TPキャリブレーションがまだ。
g_initialSet = TRUE;
s_csr = 3;
TP_CalibrationInit();
g_pNowProcess = TP_CalibrationMain;
return TRUE;
}else if(GetNCDWork()->option.input_rtc == 0) { // RTC設定がまだ。
ClearRTC();
g_initialSet = TRUE;
s_csr = 1;
SetRTCInit();
g_pNowProcess = SetRTCMain;
return TRUE;
}else if( (GetNCDWork()->option.input_nickname == 0) // ニックネームまたは好きな色入力がまだ。
|| (GetNCDWork()->option.input_favoriteColor == 0) ) {
/* g_initialSet = TRUE;
s_csr = 0;
SetOwnerInfoInit();
g_pNowProcess = SetOwnerInfoMain;
return TRUE;
*/ }
if( g_initialSet ) {
InitialSettingFinalizeInit();
g_pNowProcess = InitialSettingFinalizeMain();
return TRUE;
}
#endif
return FALSE;
}
static void InitialSettingFinalizeInit( void )
{
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
(void)PutStringUTF16( 6 * 8, 10 * 8, TXT_COLOR_BLACK, (const u16 *)L" Initial setting completed.");
(void)PutStringUTF16( 6 * 8, 12 * 8, TXT_COLOR_BLACK, (const u16 *)L" Please reboot.");
}
static int InitialSettingFinalizeMain( void )
{
return 0;
}

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: DS_Setting/DS_Setting.h
File: MachineSetting.h
Copyright 2007 Nintendo. All rights reserved.
@ -15,8 +15,8 @@
$Author$
*---------------------------------------------------------------------------*/
#ifndef __DS_SETTING_H__
#define __DS_SETTING_H__
#ifndef __MACHINE_SETTING_H__
#define __MACHINE_SETTING_H__
#ifdef __cplusplus
extern "C" {
@ -24,8 +24,7 @@ extern "C" {
#include <twl.h>
#include "font.h"
#include "unicode.h"
// define data----------------------------------------------------------
#define TP_CSR_TOUCH_COUNT 2 // TPカーソルのチャタリング吸収のためのカウント値
@ -49,35 +48,23 @@ typedef struct InputNumParam {
}InputNumParam;
// global variable------------------------------------------------------
extern u16 csrMenu;
extern BOOL initialSet;
extern NNSFndAllocator g_allocator;
extern BOOL g_initialSet;
extern int (*g_pNowProcess)( void );
// function-------------------------------------------------------------
extern int DS_SettingMain( void );
extern void MachineSettingInit( void );
extern int MachineSettingMain( void );
extern void SetOwnerInfoInit( void );
extern int SetOwnerInfoMain( void );
extern void SetRTCInit( void );
extern int SetRTCMain( void );
extern void SelectLanguageInit( void );
extern int SelectLanguageMain( void );
extern void TP_CalibrationInit( void );
extern int TP_CalibrationMain( void );
extern void SEQ_MainMenu_init(void);
extern int SEQ_MainMenu(void);
extern void SEQ_Setting_init(void);
extern int SEQ_Setting(void);
extern void SEQ_OwnerInfo_init(void);
extern int SEQ_OwnerInfo(void);
extern void SEQ_RtcSet_init(void);
extern int SEQ_RtcSet(void);
extern void SEQ_LangSelect_init(void);
extern int SEQ_LangSelect(void);
extern void SEQ_TP_Calibration_init(void);
extern int SEQ_TP_Calibration(void);
extern void SEQ_AgbLcdSelect_init(void);
extern int SEQ_AgbLcdSelect(void);
extern void SEQ_AutoBootSelect_init(void);
extern int SEQ_AutoBootSelect(void);
extern void DrawMenu(u16 nowCsr, const MenuComponent *menu);
extern BOOL SelectMenuByTp(u16 *nowCsr, const MenuComponent *menu);
//extern BOOL InRangeTp(u16 lt_x, u16 lt_y, u16 rb_x, u16 rb_y, TPData *tgt);
extern BOOL InRangeTp(int lt_x, int lt_y, int rb_x, int rb_y, TPData *tgt);
extern void DrawOKCancelButton(void);
extern void DrawOKCancelButton( void );
extern void CheckOKCancelButton(BOOL *tp_ok, BOOL *tp_cancel);
extern void InputDecimal(int *tgtp, InputNumParam *inpp);
@ -87,4 +74,4 @@ extern void ClearRTC( void );
}
#endif
#endif // __DS_SETTING_H__
#endif // __MACHINE_SETTING_H__

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: tpCalib.c
File: calibrationTP.c
Copyright 2007 Nintendo. All rights reserved.
@ -16,28 +16,27 @@
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "DS_Setting.h"
#include "MachineSetting.h"
// define data------------------------------------------
// OKボタンLCD領域
#define OK_BUTTON_LT_X 2
#define OK_BUTTON_LT_Y 20
#define OK_BUTTON_RB_X (OK_BUTTON_LT_X + 8)
#define OK_BUTTON_RB_Y (OK_BUTTON_LT_Y + 2)
#define OK_BUTTON_TOP_X ( 2 * 8 )
#define OK_BUTTON_TOP_Y ( 20 * 8 )
#define OK_BUTTON_BOTTOM_X ( (OK_BUTTON_TOP_X + 8) * 8 )
#define OK_BUTTON_BOTTOM_Y ( (OK_BUTTON_TOP_Y + 2) * 8 )
// キャンセルボタンLCD領域
#define CANCEL_BUTTON_LT_X 11
#define CANCEL_BUTTON_LT_Y 20
#define CANCEL_BUTTON_RB_X (CANCEL_BUTTON_LT_X+8)
#define CANCEL_BUTTON_RB_Y (CANCEL_BUTTON_LT_Y+2)
#define CANCEL_BUTTON_TOP_X ( 11 * 8 )
#define CANCEL_BUTTON_TOP_Y ( 20 * 8 )
#define CANCEL_BUTTON_BOTTOM_X ( (CANCEL_BUTTON_TOP_X+8) * 8 )
#define CANCEL_BUTTON_BOTTOM_Y ( (CANCEL_BUTTON_TOP_Y+2) * 8 )
// リトライボタンLCD領域
#define RETRY_BUTTON_LT_X 20
#define RETRY_BUTTON_LT_Y 20
#define RETRY_BUTTON_RB_X (RETRY_BUTTON_LT_X+8)
#define RETRY_BUTTON_RB_Y (RETRY_BUTTON_LT_Y+2)
#define RETRY_BUTTON_TOP_X ( 20 * 8 )
#define RETRY_BUTTON_TOP_Y ( 20 * 8 )
#define RETRY_BUTTON_BOTTOM_X ( (RETRY_BUTTON_TOP_X+8) * 8 )
#define RETRY_BUTTON_BOTTOM_Y ( (RETRY_BUTTON_TOP_Y+2) * 8 )
// キャリブレーション用OBJデータ
const u16 bitmapOBJPoint[8 * 8 * 5];
@ -51,13 +50,16 @@ const u16 bitmapOBJPoint[8 * 8 * 5];
#define DISP_X_SIZE 256
#define DISP_Y_SIZE 192
// キャリブレーションシーケンス番号CalibWork.seqの値
enum {
SEQ_INIT=0, SEQ_INTERVAL_0,
SEQ_CALIBRATE_1, SEQ_INTERVAL_1,
SEQ_CALIBRATE_2, SEQ_INTERVAL_2,
SEQ_CHECK_PARAM, SEQ_INTERVAL_3,
SEQ_GET_POINT
INIT=0,
INTERVAL_0,
CALIBRATE_1,
INTERVAL_1,
CALIBRATE_2,
INTERVAL_2,
CHECK_PARAM,
INTERVAL_3,
GET_POINT
};
// キャリブレーション設定ワーク
@ -74,9 +76,6 @@ typedef struct CalibWork {
// extern data------------------------------------------
// function's prototype declaration---------------------
void SEQ_TP_Calibration_init(void);
int SEQ_TP_Calibration(void);
static void DisplayInit();
static BOOL GetSamplePointNow(TPData *data);
static BOOL WaitPanelReleaseNow( void );
@ -85,7 +84,8 @@ static void ReturnMenu(void);
// global variable -------------------------------------
// static variable -------------------------------------
static CalibWork *cw;
static CalibWork *s_pCw;
static GXOamAttr s_oamBak[ 128 ] ATTRIBUTE_ALIGN(32); // OAM バックアップ
// const data -----------------------------------------
@ -105,7 +105,7 @@ static CalibWork *cw;
*---------------------------------------------------------------------------*/
static inline void SetPoint8x8(u16 pos_x, u16 pos_y)
{
G2_SetOBJAttr( &oamBakS[0], // OAM number
G2_SetOBJAttr( &s_oamBak[0], // OAM number
pos_x - 4, // X position
pos_y - 4, // Y position
0, // Priority
@ -132,7 +132,7 @@ static inline void SetPoint8x8(u16 pos_x, u16 pos_y)
*---------------------------------------------------------------------------*/
static inline void SetPoint16x16(u16 pos_x, u16 pos_y)
{
G2_SetOBJAttr( &oamBakS[0], // OAM number
G2_SetOBJAttr( &s_oamBak[0], // OAM number
pos_x - 8, // X position
pos_y - 8, // Y position
0, // Priority
@ -158,9 +158,9 @@ static inline void SetPoint16x16(u16 pos_x, u16 pos_y)
*---------------------------------------------------------------------------*/
static void DisplayInit()
{
GXS_SetOBJVRamModeBmp(GX_OBJVRAMMODE_BMP_1D_128K); // 2D mapping OBJ
GX_SetOBJVRamModeBmp( GX_OBJVRAMMODE_BMP_1D_128K ); // 2D mapping OBJ
/* Load charactor bitmap data */
GXS_LoadOBJ( (const void *)IMAGE_DATA, 0x3000 /* 0 */, IMAGE_DATA_SIZE ); // Transfer OBJ bitmap data to VRAM
GX_LoadOBJ( (const void *)IMAGE_DATA, 0x3000 /* 0 */, IMAGE_DATA_SIZE ); // Transfer OBJ bitmap data to VRAM
}
@ -188,55 +188,55 @@ static BOOL GetSamplePointNow(TPData *data)
while (TP_RequestRawSampling( &temp )) { };
if (! temp.touch ) {
cw->touch_count = 0;
s_pCw->touch_count = 0;
return FALSE;
}
if ( temp.validity != TP_VALIDITY_VALID ) {
cw->touch_count = 0;
s_pCw->touch_count = 0;
return FALSE;
}
OS_Printf("( %d, %d )\n", temp.x, temp.y);
cw->touch_count++;
if ( cw->touch_count == 1 ) {
cw->last_x = temp.x;
cw->last_y = temp.y;
s_pCw->touch_count++;
if ( s_pCw->touch_count == 1 ) {
s_pCw->last_x = temp.x;
s_pCw->last_y = temp.y;
return FALSE;
}
// if jump point from last frame, reset count.
if ( (s32)(cw->last_x - temp.x) < - OK_RANGE ||
(s32)(cw->last_x - temp.x) > OK_RANGE )
if ( (s32)(s_pCw->last_x - temp.x) < - OK_RANGE ||
(s32)(s_pCw->last_x - temp.x) > OK_RANGE )
{
cw->touch_count = 1;
cw->last_x = temp.x;
cw->last_y = temp.y;
s_pCw->touch_count = 1;
s_pCw->last_x = temp.x;
s_pCw->last_y = temp.y;
return FALSE;
}
if ( (s32)(cw->last_y - temp.y) < - OK_RANGE ||
(s32)(cw->last_y - temp.y) > OK_RANGE )
if ( (s32)(s_pCw->last_y - temp.y) < - OK_RANGE ||
(s32)(s_pCw->last_y - temp.y) > OK_RANGE )
{
cw->touch_count = 1;
cw->last_x = temp.x;
cw->last_y = temp.y;
s_pCw->touch_count = 1;
s_pCw->last_x = temp.x;
s_pCw->last_y = temp.y;
return FALSE;
}
// if the point pressed during OK_COUNT, detect finish.
if ( cw->touch_count == OK_COUNT ) {
data->x = (u16) ( (temp.x + cw->last_x) / 2 );
data->y = (u16) ( (temp.y + cw->last_y) / 2 );
if ( s_pCw->touch_count == OK_COUNT ) {
data->x = (u16) ( (temp.x + s_pCw->last_x) / 2 );
data->y = (u16) ( (temp.y + s_pCw->last_y) / 2 );
data->touch = TP_TOUCH_ON;
data->validity = TP_VALIDITY_VALID;
cw->touch_count=0;
s_pCw->touch_count=0;
return TRUE;
}
cw->last_x = temp.x;
cw->last_y = temp.y;
s_pCw->last_x = temp.x;
s_pCw->last_y = temp.y;
return FALSE;
}
@ -266,13 +266,13 @@ static BOOL WaitPanelReleaseNow( void )
};
if ( temp.touch ) {
cw->release_count = 0;
s_pCw->release_count = 0;
return FALSE;
}
cw->release_count++;
if ( cw->release_count >= INTERVAL_CNT ) {
cw->release_count = 0;
s_pCw->release_count++;
if ( s_pCw->release_count >= INTERVAL_CNT ) {
s_pCw->release_count = 0;
return TRUE;
} else {
return FALSE;
@ -281,7 +281,7 @@ static BOOL WaitPanelReleaseNow( void )
/*---------------------------------------------------------------------------*
Name: SEQ_TP_Calibration
Name: TP_Calibration
Description: Initialization and main loop
@ -289,97 +289,101 @@ static BOOL WaitPanelReleaseNow( void )
Returns: None.
*---------------------------------------------------------------------------*/
int SEQ_TP_Calibration(void)
int TP_CalibrationMain( void )
{
BOOL tp_ok = FALSE;
BOOL tp_cancel = FALSE;
BOOL tp_retry = FALSE;
switch (cw->seq) {
case SEQ_INIT:
mf_clearRect(0, 20, 4, 32);
cw->seq=SEQ_INTERVAL_0;
(void)DrawStringSJIS( 2, 21, CYAN,(const u8 *)"[B]:CANCEL");
switch (s_pCw->seq) {
case INIT:
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
0 * 8 , 20 * 8, 32 * 8, 4 * 8 );
s_pCw->seq = INTERVAL_0;
PutStringUTF16( 2 * 8, 21 * 8, TXT_COLOR_CYAN, (const u16 *)L"[B]:CANCEL" );
break;
case SEQ_INTERVAL_0:
case INTERVAL_0:
// wait release TouchPanel
if ( WaitPanelReleaseNow() ) {
cw->seq=SEQ_CALIBRATE_1;
s_pCw->seq = CALIBRATE_1;
}
break;
case SEQ_CALIBRATE_1:
case CALIBRATE_1:
// detect first point.
SetPoint8x8(32, 32);
if ( GetSamplePointNow(&cw->sample[0]) ) {
OS_Printf("OK! ( %d, %d )\n", cw->sample[0].x, cw->sample[0].y);
cw->seq = SEQ_INTERVAL_1;
SetPoint8x8( 32, 32 );
if ( GetSamplePointNow( &s_pCw->sample[ 0 ] ) ) {
OS_Printf( "OK! ( %d, %d )\n", s_pCw->sample[0].x, s_pCw->sample[0].y );
s_pCw->seq = INTERVAL_1;
}
break;
case SEQ_INTERVAL_1:
case INTERVAL_1:
// wait release TouchPanel
if ( WaitPanelReleaseNow() ) {
cw->seq = SEQ_CALIBRATE_2;
s_pCw->seq = CALIBRATE_2;
}
break;
case SEQ_CALIBRATE_2:
case CALIBRATE_2:
// detect second point.
SetPoint8x8( DISP_X_SIZE - 32, DISP_Y_SIZE - 32 );
if ( GetSamplePointNow(&cw->sample[1]) ) {
OS_Printf("OK! ( %d, %d )\n", cw->sample[1].x, cw->sample[1].y);
if ( GetSamplePointNow( &s_pCw->sample[ 1 ] ) ) {
OS_Printf( "OK! ( %d, %d )\n", s_pCw->sample[1].x, s_pCw->sample[1].y );
// Calculate and set calibration parameter from two detected point.
(void)TP_CalcCalibrateParam( &cw->calibrate,
cw->sample[0].x, cw->sample[0].y, 32, 32,
cw->sample[1].x, cw->sample[1].y, DISP_X_SIZE - 32, DISP_Y_SIZE - 32 );
TP_SetCalibrateParam( &cw->calibrate );
(void)TP_CalcCalibrateParam(
&s_pCw->calibrate,
s_pCw->sample[0].x, s_pCw->sample[0].y, 32, 32,
s_pCw->sample[1].x, s_pCw->sample[1].y, DISP_X_SIZE - 32, DISP_Y_SIZE - 32 );
TP_SetCalibrateParam( &s_pCw->calibrate );
OS_Printf("Calibrate param: \n");
OS_Printf("\tx = %d, xDotSize = %d\n", cw->calibrate.x0, cw->calibrate.xDotSize / 0x100);
OS_Printf("\ty = %d, yDotSize = %d\n", cw->calibrate.y0, cw->calibrate.yDotSize / 0x100);
OS_Printf("Check calibrate param\n");
OS_Printf( "Calibrate param: \n" );
OS_Printf( "\tx = %d, xDotSize = %d\n", s_pCw->calibrate.x0, s_pCw->calibrate.xDotSize / 0x100 );
OS_Printf( "\ty = %d, yDotSize = %d\n", s_pCw->calibrate.y0, s_pCw->calibrate.yDotSize / 0x100 );
OS_Printf( "Check calibrate param\n" );
cw->seq = SEQ_INTERVAL_2;
s_pCw->seq = INTERVAL_2;
}
break;
case SEQ_INTERVAL_2:
case INTERVAL_2:
// Wait release TouchPanel
if ( WaitPanelReleaseNow() ) {
cw->seq = SEQ_CHECK_PARAM;
s_pCw->seq = CHECK_PARAM;
}
break;
case SEQ_CHECK_PARAM:
case CHECK_PARAM:
// Verify Calibrattion Parameter.
SetPoint8x8( DISP_X_SIZE / 2, DISP_Y_SIZE / 2 );
if ( GetSamplePointNow(&tpd.raw) ) {
if ( GetSamplePointNow( &tpd.raw ) ) {
TP_GetUnCalibratedPoint( &tpd.disp.x, &tpd.disp.y, DISP_X_SIZE / 2, DISP_Y_SIZE / 2 );
cw->seq = SEQ_GET_POINT;
mf_clearRect( 2, 21, 2, 10);
(void)DrawStringSJIS( OK_BUTTON_LT_X, OK_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" OK ");
(void)DrawStringSJIS( CANCEL_BUTTON_LT_X, CANCEL_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" CANCEL ");
(void)DrawStringSJIS( RETRY_BUTTON_LT_X, RETRY_BUTTON_LT_Y, HIGHLIGHT_C, (const u8 *)" RETRY ");
(void)DrawStringSJIS( (u16)(OK_BUTTON_LT_X + 2), (u16)(OK_BUTTON_LT_Y + 2), CYAN,(const u8 *)"[A]");
(void)DrawStringSJIS( (u16)(CANCEL_BUTTON_LT_X + 2), (u16)(CANCEL_BUTTON_LT_Y + 2), CYAN,(const u8 *)"[B]");
(void)DrawStringSJIS( (u16)(RETRY_BUTTON_LT_X), (u16)(RETRY_BUTTON_LT_Y + 2), CYAN,(const u8 *)"[START]");
s_pCw->seq = GET_POINT;
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
2 * 8 , 21 * 8, 10 * 8, 2 * 8 );
PutStringUTF16( OK_BUTTON_TOP_X, OK_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L" OK ");
PutStringUTF16( CANCEL_BUTTON_TOP_X, CANCEL_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L" CANCEL ");
PutStringUTF16( RETRY_BUTTON_TOP_X, RETRY_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L" RETRY ");
PutStringUTF16( OK_BUTTON_TOP_X + 2 * 8, OK_BUTTON_TOP_Y + 2 * 8, TXT_COLOR_CYAN, (const u16 *)L"[A]");
PutStringUTF16( CANCEL_BUTTON_TOP_X + 2 * 8, CANCEL_BUTTON_TOP_Y + 2 * 8, TXT_COLOR_CYAN, (const u16 *)L"[B]");
PutStringUTF16( RETRY_BUTTON_TOP_X, RETRY_BUTTON_TOP_Y + 2 * 8, TXT_COLOR_CYAN, (const u16 *)L"[START]");
{
s32 xRange, yRange;
xRange = tpd.raw.x - tpd.disp.x;
yRange = tpd.raw.y - tpd.disp.y;
OS_Printf("OK! ( %d, %d )\n", tpd.raw.x, tpd.raw.y);
OS_Printf("Raw ( %d, %d )\n", tpd.disp.x, tpd.disp.y);
OS_Printf("\txRange = %d, yRange = %d\n", xRange, yRange);
OS_TPrintf( "OK! ( %d, %d )\n", tpd.raw.x, tpd.raw.y );
OS_TPrintf( "Raw ( %d, %d )\n", tpd.disp.x, tpd.disp.y );
OS_TPrintf( "\txRange = %d, yRange = %d\n", xRange, yRange );
}
}
break;
case SEQ_GET_POINT:
case GET_POINT:
// Draw Marker by calibrated point.
while ( TP_RequestRawSampling( &tpd.raw ) ) {
SVC_WaitByLoop(0x400);
SVC_WaitByLoop( 0x400 );
}
TP_GetCalibratedPoint( &tpd.disp, &tpd.raw );
@ -387,54 +391,54 @@ int SEQ_TP_Calibration(void)
SetPoint16x16( tpd.disp.x, tpd.disp.y );
// [OK] [CANCEL] [RETRY]ボタン押下チェック
tp_ok = InRangeTp(OK_BUTTON_LT_X*8, OK_BUTTON_LT_Y*8-4,
OK_BUTTON_RB_X*8, OK_BUTTON_RB_Y*8-4, &tpd.disp);
tp_cancel = InRangeTp(CANCEL_BUTTON_LT_X*8, CANCEL_BUTTON_LT_Y*8-4,
CANCEL_BUTTON_RB_X*8, CANCEL_BUTTON_RB_Y*8-4, &tpd.disp);
tp_retry = InRangeTp(RETRY_BUTTON_LT_X*8, RETRY_BUTTON_LT_Y*8-4,
RETRY_BUTTON_RB_X*8, RETRY_BUTTON_RB_Y*8-4, &tpd.disp);
tp_ok = InRangeTp( OK_BUTTON_TOP_X, OK_BUTTON_TOP_Y - 4 * 8,
OK_BUTTON_BOTTOM_X, OK_BUTTON_BOTTOM_Y - 4 * 8, &tpd.disp );
tp_cancel = InRangeTp( CANCEL_BUTTON_TOP_X, CANCEL_BUTTON_TOP_Y - 4 * 8,
CANCEL_BUTTON_BOTTOM_X, CANCEL_BUTTON_BOTTOM_Y - 4 * 8, &tpd.disp );
tp_retry = InRangeTp( RETRY_BUTTON_TOP_X, RETRY_BUTTON_TOP_Y - 4 * 8,
RETRY_BUTTON_BOTTOM_X, RETRY_BUTTON_BOTTOM_Y - 4 * 8, &tpd.disp );
if(tpd.raw.validity==TP_VALIDITY_VALID) {
OS_Printf("( %3d, %3d ) -> ( %4d, %4d )\n", tpd.disp.x, tpd.disp.y, tpd.raw.x, tpd.raw.y);
if( tpd.raw.validity==TP_VALIDITY_VALID ) {
OS_TPrintf( "( %3d, %3d ) -> ( %4d, %4d )\n", tpd.disp.x, tpd.disp.y, tpd.raw.x, tpd.raw.y );
}
}
if((pad.trg & PAD_BUTTON_A) || (tp_ok)) {
if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) {
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_tp = 1; // タッチパネル入力フラグを立てる。
GetNCDWork()->tp.raw_x1 = cw->sample[0].x;
GetNCDWork()->tp.raw_y1 = cw->sample[0].y;
GetNCDWork()->tp.raw_x1 = s_pCw->sample[0].x;
GetNCDWork()->tp.raw_y1 = s_pCw->sample[0].y;
GetNCDWork()->tp.dx1 = 32;
GetNCDWork()->tp.dy1 = 32;
GetNCDWork()->tp.raw_x2 = cw->sample[1].x;
GetNCDWork()->tp.raw_y2 = cw->sample[1].y;
GetNCDWork()->tp.raw_x2 = s_pCw->sample[1].x;
GetNCDWork()->tp.raw_y2 = s_pCw->sample[1].y;
GetNCDWork()->tp.dx2 = DISP_X_SIZE - 32;
GetNCDWork()->tp.dy2 = DISP_Y_SIZE - 32;
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData (GetNCDWork());
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
ReturnMenu();
return 0;
}else if((pad.trg & PAD_BUTTON_START) || (tp_retry)) {
cw->seq = SEQ_INIT;
}else if( ( pad.trg & PAD_BUTTON_START ) || tp_retry ) {
s_pCw->seq = INIT;
}
break;
}
/* flush cache of OAM buffers to main memory */
DC_FlushRange( oamBakS, sizeof(oamBakS) );
GXS_LoadOAM( oamBakS, 0, sizeof(oamBakS) );
MI_DmaFill32( 3, oamBakS, 192, sizeof(oamBakS) ); // Clear OAM buffer
DC_FlushRange( s_oamBak, sizeof(s_oamBak) );
GX_LoadOAM( s_oamBak, 0, sizeof(s_oamBak) );
MI_DmaFill32( 3, s_oamBak, 192, sizeof(s_oamBak) ); // Clear OAM buffer
// Bボタンキャンセル
if((pad.trg & PAD_BUTTON_B) || (tp_cancel)){
(void)TP_CalcCalibrateParam(&cw->calibrate,
if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ){
(void)TP_CalcCalibrateParam(
&s_pCw->calibrate,
GetNCDWork()->tp.raw_x1, GetNCDWork()->tp.raw_y1, (u16)GetNCDWork()->tp.dx1, (u16)GetNCDWork()->tp.dy1,
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2);
TP_SetCalibrateParam(&cw->calibrate);
GetNCDWork()->tp.raw_x2, GetNCDWork()->tp.raw_y2, (u16)GetNCDWork()->tp.dx2, (u16)GetNCDWork()->tp.dy2 );
TP_SetCalibrateParam( &s_pCw->calibrate );
ReturnMenu();
return 0;
}
@ -444,41 +448,43 @@ int SEQ_TP_Calibration(void)
// メニューに戻る
static void ReturnMenu(void)
static void ReturnMenu( void )
{
OS_Free(cw); // キャリブレーション用変数の開放
cw = NULL;
NNS_FndFreeToAllocator( &g_allocator, s_pCw ); // キャリブレーション用変数の開放
s_pCw = NULL;
OS_Printf("Free :CalibWork\n");
SEQ_MainMenu_init();
MachineSettingInit();
}
// キャリブレーション設定の初期化
void SEQ_TP_Calibration_init(void)
void TP_CalibrationInit( void )
{
GXS_SetVisiblePlane(GX_PLANEMASK_NONE);
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
MI_CpuClearFast(bgBakS, sizeof(bgBakS));
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"TOUCH PANEL CALIBRATION" );
ClearAllStringSJIS();
(void)DrawStringSJIS( 1, 0, YELLOW, (const u8 *)"TOUCH PANEL CALIBRATION");
if( initialSet ) {
(void)DrawStringSJIS( 8, 18, RED, (const u8 *)"Calibrate touch panel.");
if( g_initialSet ) {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"Calibrate touch panel." );
}
DisplayInit();
GXS_SetVisiblePlane(GX_PLANEMASK_OBJ | GX_PLANEMASK_BG1);
s_pCw = NNS_FndAllocFromAllocator( &g_allocator, sizeof(CalibWork) ); // キャリブレーション用変数の確保
if( s_pCw == NULL ) {
OS_Panic("ARM9- Fail to allocate memory...\n");
}
SVC_CpuClear( 0x0000, s_pCw, sizeof(CalibWork), 16 );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
cw=OS_Alloc(sizeof(CalibWork)); // キャリブレーション用変数の確保
#ifdef __IPL2_DEBUG
if(cw==NULL) OS_Panic("ARM9- Fail to allocate memory...\n");
#endif /* __IPL2_DEBUG */
OS_Printf("Alloc :CalibWork\n");
SVC_CpuClear(0x0000, cw, sizeof(CalibWork), 16);
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
cw->seq = SEQ_INIT;
GX_SetVisiblePlane ( GX_PLANEMASK_BG0 | GX_PLANEMASK_OBJ );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
s_pCw->seq = INIT;
}

View File

@ -0,0 +1,114 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: main.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "MachineSetting.h"
// extern data-----------------------------------------------------------------
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static void InitAllocator( NNSFndAllocator* pAllocator );
static void InitAllocSystem( void );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
NNSFndAllocator g_allocator;
int (*g_pNowProcess)( void );
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
// ============================================================================
// function's description
// ============================================================================
void TwlMain(void)
{
// 初期化----------------------------------
OS_Init();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
GX_Init();
GX_SetPower(GX_POWER_ALL); // 各ロジック パワーON
// 割り込み許可----------------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
// デバイス初期化-------------------------------
TP_Init();
(void)RTC_Init();
// システムの初期化------------------
InitAllocator( &g_allocator );
CMN_InitFileSystem( &g_allocator );
// NitroConfigDataのリード
(void)NVRAMm_ReadNitroConfigData( GetNCDWork() );
SYSM_CaribrateTP();
InitBG();
MachineSettingInit();
InitGetAndDrawRtcData( RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y );
// メインループ----------------------------
while ( 1 ) {
OS_WaitIrq( 1, OS_IE_V_BLANK ); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
(void)g_pNowProcess();
GetAndDrawRtcData();
}
}
// アロケータの初期化
static void InitAllocator( NNSFndAllocator* pAllocator )
{
u32 arenaLow = MATH_ROUNDUP ( (u32)OS_GetMainArenaLo(), 16 );
u32 arenaHigh = MATH_ROUNDDOWN( (u32)OS_GetMainArenaHi(), 16 );
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo( heapSize, 16 );
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap( heapMemory, heapSize );
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap( pAllocator, heapHandle, 4 );
}
// ============================================================================
// 割り込み処理
// ============================================================================
// Vブランク割り込み
static void INTR_VBlank(void)
{
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
}

View File

@ -18,7 +18,7 @@
#include <twl.h>
#include <sysmenu.h>
#include "font.h"
#include "main.h"
#include "misc.h"
// define data----------------------------------
#define SEARCH_ENTRY_MAX_NUM 128 // 処理が重くなるのを防ぐための、エントリのサーチ回数上限
@ -513,7 +513,7 @@ static int InsertStrEntry(u16 *handle, u16 charNum)
}
// StrEntryのメモリ確保
*sEntrypp = (StrEntry *)OS_Alloc( sizeof(StrEntry) );
*sEntrypp = (StrEntry *)NNS_FndAllocFromAllocator( gAllocator, ( sizeof(StrEntry) );
if( *sEntrypp == NULL) {
OS_Printf("StrEntry allocate failed.\n");
return -1;

View File

@ -32,7 +32,7 @@
// global variable------------------------------
int (*nowProcess)(void);
int (*g_pNowProcess)(void);
//MyTime myTime;
//KeyWork pad;

View File

@ -23,7 +23,7 @@ extern "C" {
#endif
#include <twl.h>
#include "main.h"
#include "misc.h"
// define data ---------------------------------
@ -60,7 +60,7 @@ typedef struct {
// global variable------------------------------
extern MyTime myTime;
//extern KeyWork pad;
extern int (*nowProcess)(void);
extern int (*g_pNowProcess)(void);
// const data-----------------------------------

View File

@ -0,0 +1,148 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: SelectLanguage.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "MachineSetting.h"
// define data------------------------------------------
#define CANCEL_BUTTON_TOP_X ( 2 * 8 )
#define CANCEL_BUTTON_TOP_Y ( 21 * 8 )
#define CANCEL_BUTTON_BOTTOM_X ( (CANCEL_BUTTON_TOP_X + 8 ) * 8 )
#define CANCEL_BUTTON_BOTTOM_Y ( (CANCEL_BUTTON_TOP_Y + 2 ) * 8 )
// extern data------------------------------------------
// function's prototype declaration---------------------
// global variable -------------------------------------
// static variable -------------------------------------
static NvLangCode s_langCode; // 言語コード
// const data -----------------------------------------
static const u16 *const s_pStrLanguage[] = {
(const u16 *)L"日本語",
(const u16 *)L"English ",
(const u16 *)L"Francais",
(const u16 *)L"Deutsch ",
(const u16 *)L"Italiano",
(const u16 *)L"Espanol ",
};
static MenuPos s_languagePos[] = {
{ TRUE, 4 * 8, 6 * 8 },
{ TRUE, 4 * 8, 8 * 8 },
{ TRUE, 4 * 8, 10 * 8 },
{ TRUE, 4 * 8, 12 * 8 },
{ TRUE, 4 * 8, 14 * 8 },
{ TRUE, 4 * 8, 16 * 8 },
};
static const MenuParam langSel = {
6,
TXT_COLOR_BLACK,
TXT_COLOR_GREEN,
TXT_COLOR_RED,
&s_languagePos[ 0 ],
(const u16 **)&s_pStrLanguage,
};
//======================================================
// function's description
//======================================================
// 言語設定の初期化
void SelectLanguageInit( void )
{
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"LANGUAGE SELECT" );
PutStringUTF16( CANCEL_BUTTON_TOP_X, CANCEL_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L"CANCEL" );
if( g_initialSet ) {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"Select language." );
}
if( ( GetSYSMWork()->ncd_invalid ) ||
( GetNCDWork()->option.language >= LANG_CODE_MAX ) ) {
s_langCode = LANG_ENGLISH;
}else {
s_langCode = (NvLangCode)GetNCDWork()->option.language;
}
DrawMenu( (u16)s_langCode, &langSel );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
GX_SetVisiblePlane ( GX_PLANEMASK_BG0 );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
// 言語選択
int SelectLanguageMain( void )
{
BOOL tp_select,tp_cancel = FALSE;
ReadTpData(); // TP入力の取得
//--------------------------------------
// キー入力処理
//--------------------------------------
if( pad.trg & PAD_KEY_DOWN ) { // カーソルの移動
if( ++s_langCode == LANG_CODE_MAX ) {
s_langCode = (NvLangCode)0;
}
}
if( pad.trg & PAD_KEY_UP ) {
if( --s_langCode < 0 ) {
s_langCode = (NvLangCode)( LANG_CODE_MAX - 1 );
}
}
tp_select = SelectMenuByTP( (u16 *)&s_langCode, &langSel );
DrawMenu( (u16)s_langCode, &langSel );
// [CANCEL]ボタン押下チェック
if( tpd.disp.touch ) {
tp_cancel = InRangeTp( CANCEL_BUTTON_TOP_X, CANCEL_BUTTON_TOP_Y - 4 * 8,
CANCEL_BUTTON_BOTTOM_X, CANCEL_BUTTON_BOTTOM_Y - 4 * 8, &tpd.disp );
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_select ) { // メニュー項目への分岐
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_language = 1; // 言語入力フラグを立てる
GetNCDWork()->option.language = s_langCode;
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
MachineSettingInit();
return 0;
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) {
MachineSettingInit();
return 0;
}
return 0;
}

View File

@ -202,7 +202,7 @@ void SEQ_OwnerInfo_init(void)
(void)DrawStringSJIS( RETURN_BUTTON_LT_X, RETURN_BUTTON_LT_Y,HIGHLIGHT_C, (const u8 *)" RETURN ");
if(ow == NULL) {
ow = OS_Alloc(sizeof(OwnerWork)); // オーナー情報編集用ワークの確保
ow = NNS_FndAllocFromAllocator( &g_allocator, sizeof(OwnerWork) ); // オーナー情報編集用ワークの確保
#ifdef __SYSM_DEBUG
if(ow == NULL) OS_Panic("ARM9- Fail to allocate memory...\n");
#endif /* __SYSM_DEBUG */
@ -261,7 +261,7 @@ int SEQ_OwnerInfo(void)
}
// オーナー情報の初回起動シーケンス
if(initialSet) {
if(g_initialSet) {
pad.trg = 0;
@ -301,19 +301,19 @@ int SEQ_OwnerInfo(void)
switch(ow->sel) {
case 0:
SEQ_InputNickname_init();
nowProcess = SEQ_InputNickname;
g_pNowProcess = SEQ_InputNickname;
break;
case 1:
SEQ_InputBirthday_init();
nowProcess = SEQ_InputBirthday;
g_pNowProcess = SEQ_InputBirthday;
break;
case 2:
SEQ_InputFavoriteColor_init();
nowProcess = SEQ_InputFavoriteColor;
g_pNowProcess = SEQ_InputFavoriteColor;
break;
}
}else if((pad.trg & PAD_BUTTON_B) || (tp_return)) { // メニューに戻る
OS_Free(ow); // ワークの解放
NNS_FndFreeToAllocator( &g_allocator, ow ); // ワークの解放
ow = NULL;
OS_Printf("Free :OwnerWork\n");
SEQ_MainMenu_init();
@ -461,7 +461,7 @@ static int SEQ_InputBirthday(void)
case SEQ_RETURN:
SEQ_OwnerInfo_init();
nowProcess = SEQ_OwnerInfo;
g_pNowProcess = SEQ_OwnerInfo;
return 0;
}
@ -506,7 +506,7 @@ static void SEQ_InputFavoriteColor_init(void)
SVC_CpuClear(0x0000, &tpd, sizeof(TpWork), 16);
ow->seq = 0;
if( initialSet ) {
if( g_initialSet ) {
(void)DrawStringSJIS( 8, 18, RED, (const u8 *)"Select user color.");
}
}
@ -582,7 +582,7 @@ static int SEQ_InputFavoriteColor(void)
case SEQ_RETURN:
SEQ_OwnerInfo_init();
nowProcess = SEQ_OwnerInfo;
g_pNowProcess = SEQ_OwnerInfo;
return 0;
}
@ -614,7 +614,7 @@ static void SEQ_InputNickname_init(void)
(void)DrawStringSJIS( 1, 0, YELLOW, (const u8 *)"INPUT NICKNAME");
// (void)DrawStringSJIS( INPUT_NAME_LT_Y, WHITE, (const u16 *)str_uscore);
if( initialSet ) {
if( g_initialSet ) {
(void)DrawStringSJIS( 8, 20, RED, (const u8 *)"Input nickname.");
}
@ -785,7 +785,7 @@ static void ReturnMenu(int save_flag)
(void)NVRAMm_WriteNitroConfigData(GetNCDWork());
}
SEQ_OwnerInfo_init();
nowProcess = SEQ_OwnerInfo; // オーナー情報編集に戻る
g_pNowProcess = SEQ_OwnerInfo; // オーナー情報編集に戻る
}
// 1文字削除

View File

@ -0,0 +1,530 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: setRTC.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "MachineSetting.h"
// define data------------------------------------------
//#define __RTC_MINUTE_OFFSET // この定義が有効な場合はrtcOffsetは分オフセットで算出されます。また、無効な場合は秒オフセットとなります。
// RETURNボタンLCD領域
#define RETURN_BUTTON_TOP_X ( 2 * 8 )
#define RETURN_BUTTON_TOP_Y ( 21 * 8 )
#define RETURN_BUTTON_BOTTOM_X ( (RETURN_BUTTON_TOP_X + 8) * 8 )
#define RETURN_BUTTON_BOTTOM_Y ( (RETURN_BUTTON_TOP_Y + 2) * 8 )
// 日付データLCD領域
#define DATE_TOP_X ( 5 * 8 )
#define DATE_TOP_Y ( 10 * 8 )
// 時刻データLCD領域
#define TIME_TOP_X ( (DATE_TOP_X + 14) * 8 )
#define TIME_TOP_Y ( DATE_TOP_Y * 8 )
// RTC設定メニュー要素
#define RTC_MENU_ELEM_NUM 1
// 文字入力タッチパネル用カウンタ
#define S_UPDOWN_COUNT_MAX 16
// 数値入力タッチパネル用カウンタ
#define D_DOWN_COUNT_MAX -50
#define D_UP_COUNT_MAX 50
// 日付時刻入力シーケンス用ワーク
typedef struct DateTimeParam {
int seq; // シーケンス番号
int *tgtp; // 入力対象の変数へのポインタ
RTCDate Date;
RTCTime Time;
}DateTimeParam;
// RTC設定シーケンス用ワーク
typedef struct SetRtcWork {
int csr; // カーソル位置
s64 rtcOffset[ 2 ]; // RTCオフセット値[0]:設定変更前の値、[1]:変更後の値)
DateTimeParam dtp; // 日付時刻入力シーケンス用ワーク
InputNumParam inp; // 数値入力インターフェース用ワーク
}SetRtcWork;
// extern data------------------------------------------
// function's prototype declaration---------------------
RTCWeek CalcWeekFromDate( u32 year, u32 month, u32 day );
void InputDecimal(int *tgtp, InputNumParam *inpp);
static void InputRtcDateTimeInit( int start );
static int InputRtcDateTimeMain( void );
static void TransmitRtcData(DateTimeParam *dtpp, RtcDateTime *rtcp);
static void SelectString( int *tgtp, const u8 **const strpp, InputNumParam *inpp);
static void BcdToHex(int *bcdp);
static void HexToBcd(int *hexp);
static BOOL CheckLeapYear( u32 year );
// global variable -------------------------------------
// static variable -------------------------------------
SetRtcWork *s_pRTCWork; // RTC設定用ワーク
// const data -----------------------------------------
//======================================================
// 日付&時刻設定
//======================================================
// RTC設定シーケンスの初期化
void SetRTCInit( void )
{
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
PutStringUTF16( 0, 0, TXT_COLOR_BLUE, (const u16 *)L"DATE & TIME SET" );
PrintfSJIS( DATE_TOP_X + 3 * 8, DATE_TOP_Y, TXT_COLOR_BLACK, "/ / [ ] : :");
PutStringUTF16( RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L" RETURN " );
if( g_initialSet ) {
if( GetSYSMWork()->rtcStatus & 0x01) {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"RTC reset is detected!" );
}else {
PutStringUTF16( 8 * 8, 18 * 8, TXT_COLOR_RED, (const u16 *)L"Set RTC." );
}
}
s_pRTCWork = NNS_FndAllocFromAllocator( &g_allocator, sizeof(SetRtcWork) ); // RTC設定用ワークの確保
if( s_pRTCWork == NULL ) {
OS_Panic( "ARM9- Fail to allocate memory...\n" );
}
SVC_CpuClear( 0x0000, s_pRTCWork, sizeof(SetRtcWork), 16 );
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
GX_SetVisiblePlane ( GX_PLANEMASK_BG0 );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
// RTC設定シーケンス
int SetRTCMain( void )
{
BOOL tp_set = FALSE;
BOOL tp_return = FALSE;
ReadTpData(); // TP入力の取得
if(tpd.disp.touch) {
tp_set = InRangeTp( DATE_TOP_X, DATE_TOP_Y - 4, // [RTC設定]領域押下チェック
(TIME_TOP_X + 8), (TIME_TOP_Y + 2) - 4, &tpd.disp );
// [RETURN]ボタン押下チェック
tp_return = InRangeTp( RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y - 4,
RETURN_BUTTON_BOTTOM_X, RETURN_BUTTON_BOTTOM_Y - 4, &tpd.disp );
}
if( g_initialSet && !GetNCDWork()->option.input_rtc ) {
tp_set = TRUE;
}
//--------------------------------------
// キー入力処理
//--------------------------------------
if( pad.trg & PAD_KEY_DOWN ) { // カーソルの移動
if( ++s_pRTCWork->csr == RTC_MENU_ELEM_NUM) {
s_pRTCWork->csr = 0;
}
}
if( pad.trg & PAD_KEY_UP ) {
if( --s_pRTCWork->csr < 0 ) {
s_pRTCWork->csr = RTC_MENU_ELEM_NUM - 1;
}
}
if( ( pad.trg & PAD_BUTTON_A ) || tp_set ) { // RTC設定開始
if( s_pRTCWork->csr == 0 ) {
InputRtcDateTimeInit( 1 );
g_pNowProcess = InputRtcDateTimeMain;
}
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_return ) { // メニューに戻る
NNS_FndFreeToAllocator( &g_allocator, s_pRTCWork ); // RTC設定用ワークの解放
s_pRTCWork = NULL;
MachineSettingInit();
}
#ifdef __SYSM_DEBUG
if( pad.trg & PAD_BUTTON_START ) {
ClearRTC();
OS_Printf( "RTC offset in NVRAM is ZERO clear!\n" );
}
#endif /* __SYSM_DEBUG */
return 0;
}
//======================================================
// 日付&時刻入力処理
//======================================================
// 日付時刻入力初期化
static void InputRtcDateTimeInit( int start )
{
NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_WHITE,
RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y, 28 * 8, 2 * 8 );
if( start ) {
DrawOKCancelButton();
s_pRTCWork->dtp.seq = 0;
}else {
PutStringUTF16( RETURN_BUTTON_TOP_X, RETURN_BUTTON_TOP_Y, TXT_COLOR_CYAN, (const u16 *)L"RETURN" );
}
SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 );
}
// 日付時刻入力
static int InputRtcDateTimeMain( void )
{
BOOL tp_ok = FALSE;
BOOL tp_cancel = FALSE;
int new_seq, x_base, y_base, abs_y_offset;
enum { // 日付時刻入力シーケンス番号
SEQ_INIT=0,
SEQ_YEAR_INIT=2, SEQ_YEAR_SET,
SEQ_MONTH_INIT, SEQ_MONTH_SET,
SEQ_DAY_INIT, SEQ_DAY_SET,
SEQ_HOUR_INIT, SEQ_HOUR_SET,
SEQ_MINUTE_INIT, SEQ_MINUTE_SET,
SEQ_SECOND_INIT, SEQ_SECOND_SET,
SEQ_END,
SEQ_RETURN=64
};
ReadTpData(); // タッチパネル入力の取得
CheckOKCancelButton( &tp_ok, &tp_cancel ); // [OK],[CANCEL]ボタン押下チェック
s_pRTCWork->inp.y_offset = 0;
if( tpd.disp.touch ) { // [CANCEL]ボタン押下チェック
if( ( s_pRTCWork->dtp.seq & 0x01 ) && ( s_pRTCWork->dtp.seq < SEQ_END ) ) { // SEQ_**_SETの時のみ有効
new_seq = s_pRTCWork->dtp.seq;
x_base = DATE_TOP_X;
y_base = DATE_TOP_Y + 6;
// 入力項目移動のチェック
if( InRangeTp( x_base, (y_base - 6), (x_base + 22 * 8), (y_base + 6), &tpd.disp ) ) {
if( tpd.disp.x < x_base + 28 ) {
new_seq = SEQ_YEAR_SET;
}else if( ( tpd.disp.x >= x_base + 4 * 8 ) && ( tpd.disp.x < x_base + 6 * 8 ) ) {
new_seq = SEQ_MONTH_SET;
}else if( ( tpd.disp.x >= x_base + 7 * 8 ) && ( tpd.disp.x < x_base + 9 * 8 ) ) {
new_seq = SEQ_DAY_SET;
}else if( ( tpd.disp.x >= x_base + 14 * 8 ) && ( tpd.disp.x < x_base + 16 * 8 ) ) {
new_seq = SEQ_HOUR_SET;
}else if( ( tpd.disp.x >= x_base + 17 * 8 ) && ( tpd.disp.x < x_base + 19 * 8 ) ) {
new_seq = SEQ_MINUTE_SET;
}else if( tpd.disp.x >= x_base + 20 * 8 ) {
new_seq = SEQ_SECOND_SET;
}
}
if( s_pRTCWork->dtp.seq != new_seq ) {
s_pRTCWork->dtp.seq = new_seq - 1;
}else {
// 入力値の増減
if( InRangeTp( s_pRTCWork->inp.pos_x, (y_base - 30),
s_pRTCWork->inp.pos_x + s_pRTCWork->inp.keta_max * 8, y_base + 30, &tpd.disp ) ) {
s_pRTCWork->inp.y_offset = tpd.disp.y - y_base;
abs_y_offset = ( s_pRTCWork->inp.y_offset >= 0 ) ? s_pRTCWork->inp.y_offset : -s_pRTCWork->inp.y_offset;
if( abs_y_offset <= 6 ) {
s_pRTCWork->inp.y_offset = 0;
}else if( abs_y_offset <= 14 ){
s_pRTCWork->inp.y_offset >>= 2;
}else if( abs_y_offset <= 22 ){
s_pRTCWork->inp.y_offset >>= 1;
}
}
}
}
}
// タッチパネル or キー入力によって、カーソル位置が動いた時に、元の位置のカーソルを消す。
if( ( s_pRTCWork->dtp.seq > 0 ) && ( ( s_pRTCWork->dtp.seq & 0x01 ) == 0 ) ) { // SEQ_INITの時は実行しない
PrintfSJIS( s_pRTCWork->inp.pos_x, s_pRTCWork->inp.pos_y, TXT_COLOR_BLACK,
"%02d", *s_pRTCWork->dtp.tgtp );
}
// 各シーケンスの処理
switch(s_pRTCWork->dtp.seq){
case SEQ_INIT:
s_pRTCWork->dtp.Date = GetSYSMWork()->rtc[0].Date;
s_pRTCWork->dtp.Time = GetSYSMWork()->rtc[0].Time;
s_pRTCWork->dtp.Date.year += 2000; // yearをする。
s_pRTCWork->dtp.seq = SEQ_YEAR_INIT;
// ※SEQ_INITは直通でSEQ_YEAR_INITへ
case SEQ_YEAR_INIT:
s_pRTCWork->inp.pos_x = DATE_TOP_X;
s_pRTCWork->inp.pos_y = DATE_TOP_Y;
s_pRTCWork->inp.keta_max = 4;
s_pRTCWork->inp.value_max = 2099;
s_pRTCWork->inp.value_min = 2000;
// s_pRTCWork->inp.value_min = 2004;
// if(s_pRTCWork->dtp.Date.year < 2004) {
// s_pRTCWork->dtp.Date.year = 2004;
// }
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Date.year;
break;
case SEQ_MONTH_INIT:
s_pRTCWork->inp.pos_x = DATE_TOP_X + 4 * 8;
s_pRTCWork->inp.keta_max = 2;
s_pRTCWork->inp.value_max = 12;
s_pRTCWork->inp.value_min = 1;
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Date.month;
break;
case SEQ_DAY_INIT:
s_pRTCWork->inp.pos_x = DATE_TOP_X + 7 * 8;
s_pRTCWork->inp.keta_max = 2;
s_pRTCWork->inp.value_max = (int)SYSM_GetDayNum( s_pRTCWork->dtp.Date.year, s_pRTCWork->dtp.Date.month );
// 年・月をもとにその月の日数を算出する。
s_pRTCWork->inp.value_min = 1;
if(s_pRTCWork->dtp.Date.day > s_pRTCWork->inp.value_max) {
s_pRTCWork->dtp.Date.day = (u32)s_pRTCWork->inp.value_max;
}
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Date.day;
break;
case SEQ_HOUR_INIT:
s_pRTCWork->inp.pos_x = TIME_TOP_X;
s_pRTCWork->inp.keta_max = 2;
s_pRTCWork->inp.value_max = 23;
s_pRTCWork->inp.value_min = 0;
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Time.hour;
break;
case SEQ_MINUTE_INIT:
s_pRTCWork->inp.pos_x = TIME_TOP_X + 3 * 8;
s_pRTCWork->inp.keta_max = 2;
s_pRTCWork->inp.value_max = 59;
s_pRTCWork->inp.value_min = 0;
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Time.minute;
break;
case SEQ_SECOND_INIT:
s_pRTCWork->inp.pos_x = TIME_TOP_X + 6 * 8;
s_pRTCWork->inp.keta_max = 2;
s_pRTCWork->inp.value_max = 59;
s_pRTCWork->inp.value_min = 0;
s_pRTCWork->dtp.tgtp = (int *)&s_pRTCWork->dtp.Time.second;
break;
case SEQ_YEAR_SET:
case SEQ_MONTH_SET:
case SEQ_DAY_SET:
case SEQ_HOUR_SET:
case SEQ_MINUTE_SET:
case SEQ_SECOND_SET:
InputDecimal( s_pRTCWork->dtp.tgtp, &s_pRTCWork->inp );
// 年月日入力ならば、曜日を算出して表示。
if( ( s_pRTCWork->dtp.seq == SEQ_YEAR_SET ) ||
( s_pRTCWork->dtp.seq == SEQ_MONTH_SET ) ||
( s_pRTCWork->dtp.seq == SEQ_DAY_SET ) ) {
s_pRTCWork->dtp.Date.week = CalcWeekFromDate( s_pRTCWork->dtp.Date.year, s_pRTCWork->dtp.Date.month, s_pRTCWork->dtp.Date.day );
PrintfSJIS( DATE_TOP_X + 10 * 8, DATE_TOP_Y, TXT_COLOR_BLACK, "%s", g_strWeek[ s_pRTCWork->dtp.Date.week ] );
}
// 年・月入力ならば、日数を算出して、現在の入力日が日数を超えていたら修正する。
if( ( s_pRTCWork->dtp.seq == SEQ_YEAR_SET ) ||
( s_pRTCWork->dtp.seq == SEQ_MONTH_SET ) ) {
u32 dayNum = SYSM_GetDayNum( s_pRTCWork->dtp.Date.year, s_pRTCWork->dtp.Date.month );
if( dayNum < s_pRTCWork->dtp.Date.day ) {
s_pRTCWork->dtp.Date.day = dayNum;
PrintfSJIS( DATE_TOP_X + 7 * 8, DATE_TOP_Y, TXT_COLOR_BLACK, "%02d", s_pRTCWork->dtp.Date.day );
}
}
break;
case SEQ_END:
s_pRTCWork->dtp.Date.year -= 2000; // yearをする。
s_pRTCWork->dtp.Time.second = 0;
NCD_SetRtcOffset( SYSM_CalcRtcOffsetAndSetDateTime( &s_pRTCWork->dtp.Date, &s_pRTCWork->dtp.Time ) );
GetSYSMWork()->rtc[0].Date = s_pRTCWork->dtp.Date;
GetSYSMWork()->rtc[0].Time = s_pRTCWork->dtp.Time;
GetSYSMWork()->ncd_invalid = 0;
GetNCDWork()->option.input_rtc = 1; // RTC入力フラグを立てる。
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
// SEQ_ENDの時はこのままリターンする。
case SEQ_RETURN:
g_pNowProcess = SetRTCMain;
InputRtcDateTimeInit( 0 ); // 日付入力画面のクリア
return 0;
}
if( s_pRTCWork->dtp.seq & 0x01 ) { // SEQ_**_SETの時のみ有効
if( ( pad.trg & PAD_BUTTON_A ) || tp_ok ) {
s_pRTCWork->dtp.seq = SEQ_END; // Aボタンで決定
}else if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) { // Bボタンでキャンセル
s_pRTCWork->dtp.seq = SEQ_RETURN;
}else if( pad.trg & PAD_KEY_LEFT ) {
if( s_pRTCWork->dtp.seq == SEQ_YEAR_SET ) {
s_pRTCWork->dtp.seq = SEQ_SECOND_INIT;
}else {
s_pRTCWork->dtp.seq -= 3;
}
}else if( pad.trg & PAD_KEY_RIGHT ) {
if( s_pRTCWork->dtp.seq == SEQ_SECOND_SET ) {
s_pRTCWork->dtp.seq = SEQ_YEAR_INIT;
}else {
s_pRTCWork->dtp.seq++;
}
}
}else { // SEQ_**_INITの時のみ有効
s_pRTCWork->dtp.seq++;
}
return 0;
}
/*
// うるう年の判定 (うるう年:1、通常の年:0リターン)
BOOL CheckLeapYear( u32 year)
{
if((year & 0x03) == 0) { // うるう年は、「4で割り切れ かつ 100で割り切れない年」
CP_SetDiv32_32(year, 100); // 「400で割り切れる年」
if(CP_GetDivRemainder32() != 0) {
return TRUE;
}else {
CP_SetDiv32_32(year, 400);
if(CP_GetDivRemainder32() == 0) {
return TRUE;
}
}
}
return FALSE;
}
*/
// 日付から曜日を求める。
RTCWeek CalcWeekFromDate( u32 year, u32 month, u32 day )
{
if( month == 1 || month == 2 ){
year--;
month += 12;
}
return (RTCWeek)( ( year + year/4 - year/100 + year/400 + (13*month + 8)/5 + day) % 7 );
}
/*
// 文字列によるパラメータ選択
static void SelectString(int *tgtp, const u8 **const srtpp, InputNumParam *inpp)
{
BOOL value_up = FALSE;
BOOL value_down = FALSE;
if(inpp->y_offset == 0) {
inpp->up_count = S_UPDOWN_COUNT_MAX;
}else {
inpp->up_count ++;
if(inpp->up_count > S_UPDOWN_COUNT_MAX) {
inpp->up_count = 0;
if(inpp->y_offset < 0) value_up = TRUE;
else value_down = TRUE;
}
}
if((pad.trg & PAD_KEY_DOWN) || (value_down)) { // 表示文字列切り替え
if(++*tgtp>inpp->value_max) *tgtp = 0;
}else if((pad.trg & PAD_KEY_UP) || (value_up)) {
if(--*tgtp & 0x8000) *tgtp = inpp->value_max;
}
(void)DrawStringSJIS( inpp->pos_x, inpp->pos_y, HIGHLIGHT_Y, srtpp[*tgtp]); // 現在選択している文字列を表示
}
*/
// 10進数数値入力
void InputDecimal( int *tgtp, InputNumParam *inpp )
{
BOOL value_up = FALSE;
BOOL value_down = FALSE;
if( inpp->y_offset == 0 ) {
inpp->up_count = D_UP_COUNT_MAX;
inpp->down_count = D_DOWN_COUNT_MAX;
}else if( inpp->y_offset < 0 ) {
inpp->down_count += inpp->y_offset;
if( inpp->down_count < D_DOWN_COUNT_MAX ) {
inpp->down_count = 0;
value_down = TRUE;
}
}else { // y_offset > 0
inpp->up_count += inpp->y_offset;
if( inpp->up_count > D_UP_COUNT_MAX ) {
inpp->up_count = 0;
value_up = TRUE;
}
}
// キー入力に応じて対象値を増減
if( value_down ||
( pad.trg & PAD_KEY_UP ) ||
( ( pad.cont & PAD_KEY_UP ) && ( pad.cont & PAD_BUTTON_R ) ) ) {
if( --*tgtp < inpp->value_min ) {
*tgtp = inpp->value_max;
}
}else if( value_up ||
( pad.trg & PAD_KEY_DOWN ) ||
( ( pad.cont & PAD_KEY_DOWN ) && ( pad.cont & PAD_BUTTON_R ) ) ) {
if( ++*tgtp > inpp->value_max ) {
*tgtp = inpp->value_min;
}
}
PrintfSJIS( inpp->pos_x, inpp->pos_y, TXT_COLOR_GREEN, "%02d", *tgtp );
// 対象値をハイライト表示
}
// RTC設定のクリア
void ClearRTC( void )
{
SVC_CpuClear( 0x0000, &GetSYSMWork()->rtc[0].Time, sizeof(RTCTime), 16 );
GetSYSMWork()->rtc[0].Date.year = 0;
GetSYSMWork()->rtc[0].Date.month = 1;
GetSYSMWork()->rtc[0].Date.day = 1;
(void)RTC_SetDateTime( &GetSYSMWork()->rtc[0].Date, &GetSYSMWork()->rtc[0].Time );
GetNCDWork()->option.input_rtc = 0;
GetNCDWork()->option.rtcOffset = 0;
NCD_SetRtcLastSetYear( 0 );
// ::::::::::::::::::::::::::::::::::::::::::::::
// NVRAMへの書き込み
// ::::::::::::::::::::::::::::::::::::::::::::::
(void)NVRAMm_WriteNitroConfigData( GetNCDWork() );
}

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 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:: 2007-10-03#$
# $Rev: 1319 $
# $Author: kitase_hirotake $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -20,7 +20,8 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
SUBDIRS = launcher MachineSettings PictoChat \
#DS_DownloadPlay
#----------------------------------------------------------------------------

View File

@ -0,0 +1,52 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlSDK - demos - simpleShoot-1
# File: Makefile
#
# Copyright 2007 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: $
#----------------------------------------------------------------------------
SUBDIRS =
#----------------------------------------------------------------------------
TARGET_PLATFORM = TWL
TWL_ARCHGEN = LIMITED
TARGET_BIN = main.srl
#LCFILE_SPEC =
ROM_SPEC = main.rsf
MISC_DIR = ../../Launcher/ARM9/src
SRCS = main.c PictoChat.c $(MISC_DIR)/misc.c
#SRCS_OVERLAY =
LINCLUDES = $(MISC_DIR)
#LLIBRARY_DIRS =
#LLIBRARIES =
#LDEPENDS_NEF =
include $(TWLIPL_ROOT)/build/buildtools/commondefs.sysmenu
#----------------------------------------------------------------------------
do-build : $(FONT_OBJS) $(TARGETS)
include $(TWLIPL_ROOT)/build/buildtools/modulerules.sysmenu
#----------------------------------------------------------------------------
#===== End of Makefile =====

View File

@ -0,0 +1,147 @@
#----------------------------------------------------------------------------
# Project: TwlSDK - include
# File: ROM-BB.rsf
#
# Copyright 2007 Nintendo. All rights reserved.
#
# These coded insructions, 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$
#----------------------------------------------------------------------------
#
# TWL ROM SPEC FILE
#
Arm9
{
Static "$(MAKEROM_ARM9:r).FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.FLX.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.FLX.TWL.sbin$(COMPSUFFIX9)"
Elf "$(MAKEROM_ARM9:r).tef"
}
Arm7
{
Static "$(MAKEROM_ARM7_BASE:r).FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.FLX.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.FLX.TWL.sbin$(COMPSUFFIX7)"
Elf "$(MAKEROM_ARM7_BASE:r).tef"
}
Arm9.Ltd
{
Static "$(MAKEROM_ARM9:r).LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayDefs "$(MAKEROM_ARM9:r)_defs.LTD.TWL.sbin$(COMPSUFFIX9)"
OverlayTable "$(MAKEROM_ARM9:r)_table.LTD.TWL.sbin$(COMPSUFFIX9)"
}
Arm7.Ltd
{
Static "$(MAKEROM_ARM7_BASE:r).LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.LTD.TWL.sbin$(COMPSUFFIX7)"
OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.LTD.TWL.sbin$(COMPSUFFIX7)"
}
Property
{
###
### Settings for FinalROM
###
#### BEGIN
#
# TITLE NAME: Your product name within 12bytes
#
#TitleName "YourAppName"
#
# MAKER CODE: Your company ID# in 2 ascii words
# issued by NINTENDO
#
#MakerCode "00"
#
# REMASTER VERSION: Mastering version
#
#RomVersion 0
#
# ROM SPEED TYPE: [MROM/1TROM/UNDEFINED]
#
RomSpeedType $(MAKEROM_ROMSPEED)
#
# ROM SIZE: in bit [64M/128M/256M/512M/1G/2G]
#
#RomSize 128M
#RomSize 256M
#
# ROM PADDING: TRUE if finalrom
#
#RomFootPadding TRUE
#
# ROM HEADER TEMPLATE: Provided to every product by NINTENDO
#
#RomHeaderTemplate ./etc/rom_header.template.sbin
#
# BANNER FILE: generated from Banner Spec File
#
#BannerFile ./etc/myGameBanner.bnr
BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
###
### Setting for TWL
###
#
# BANNER FILE:
#
BannerTWLFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr
#
# Boot allowed Media: [GameCard/NAND/SDCard/DownloadPlay]
# possible to choose one or more.
#
BootMedia GameCard NAND SDCard DownloadPlay
#
# Certification FILE:
#
Certificate $(TWLSDK_ROOT)/include/twl/specfiles/default_sgn.sbin
#
# Digest parameters:
#
DigestParam 1024 32
#
# WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD]
# don't have to edit
#
WramMapping $(MAKEROM_WRAM_MAPPING)
#
# Codec mode:
# don't have to edit
#
CodecMode $(MAKEROM_CODEC_MODE)
###
#### END
}
RomSpec
{
Offset 0x00000000
Segment ALL
HostRoot ../../data
Root /data
File NTR_IPL_font_m.NFTR
}

View File

@ -18,8 +18,7 @@
#include <twl.h>
#include <sysmenu.h>
#include "misc.h"
#include "DS_Chat.h"
#include "DS_Setting.h"
#include "PictoChat.h"
// define data------------------------------------------
#define RETURN_BUTTON_TOP_X 2
@ -31,58 +30,35 @@
// function's prototype declaration---------------------
static void DS_ChatInit(void);
static int DS_Chat(void);
// global variable -------------------------------------
// static variable -------------------------------------
// const data -----------------------------------------
// ピクトチャットのメインループ
int DS_ChatMain(void)
{
DS_ChatInit();
while(1) {
OS_WaitIrq( 1, OS_IE_V_BLANK );
ReadKeyPad();
if( DS_Chat() ) {
return 0;
}
if ( PAD_DetectFold() == TRUE ) { // スリープモードへの遷移
SYSM_GoSleepMode();
}
}
return 0;
}
//======================================================
// ピクトチャット
//======================================================
// ピクトチャットの初期化
static void DS_ChatInit( void )
void PictoChatInit( void )
{
GX_DispOff();
GXS_DispOff();
NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_WHITE );
switch(csrMenu) {
case 0:
PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"PictoChat");
break;
}
PutStringUTF16( 1 * 8, 0 * 8, TXT_COLOR_BLUE, (const u16 *)L"PictoChat");
PutStringUTF16( 4 * 8, 8 * 8, TXT_COLOR_BLACK, (const u16 *)L"Under Construction...");
InitGetAndDrawRtcData( 72, 80, 64 + 32, 80 + 16 );
GXS_SetVisiblePlane( GX_PLANEMASK_BG0 );
GX_DispOn();
GXS_DispOn();
}
// ピクトチャット(空処理)
static int DS_Chat(void)
// ピクトチャットのメインループ
void PictoChatMain(void)
{
BOOL tp_cancel = FALSE;
@ -95,8 +71,10 @@ static int DS_Chat(void)
}
if( ( pad.trg & PAD_BUTTON_B ) || tp_cancel ) {
return 1;
// SYSM_RebootLauncher();
}
return 0;
GetAndDrawRtcData();
}

View File

@ -27,7 +27,8 @@ extern "C" {
// define data----------------------------------------------------------
int DS_ChatMain( void );
void PictoChatInit( void );
void PictoChatMain( void );
#ifdef __cplusplus
}

View File

@ -0,0 +1,107 @@
/*---------------------------------------------------------------------------*
Project: TwlIPL
File: main.c
Copyright 2007 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$
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "misc.h"
#include "PictoChat.h"
// extern data-----------------------------------------------------------------
// define data-----------------------------------------------------------------
// function's prototype-------------------------------------------------------
static void InitAllocator( NNSFndAllocator* pAllocator );
static void InitAllocSystem( void );
static void INTR_VBlank( void );
// global variable-------------------------------------------------------------
NNSFndAllocator g_allocator;
// static variable-------------------------------------------------------------
// const data------------------------------------------------------------------
// ============================================================================
// function's description
// ============================================================================
void TwlMain(void)
{
// 初期化----------------------------------
OS_Init();
(void)OS_EnableIrq();
(void)OS_EnableInterrupts();
GX_Init();
GX_SetPower(GX_POWER_ALL); // 各ロジック パワーON
// 割り込み許可----------------------------
(void)OS_SetIrqFunction(OS_IE_V_BLANK, INTR_VBlank);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)GX_VBlankIntr(TRUE);
// デバイス初期化-------------------------------
TP_Init();
(void)RTC_Init();
// システムの初期化------------------
InitAllocator( &g_allocator );
CMN_InitFileSystem( &g_allocator );
InitBG();
PictoChatInit();
// メインループ----------------------------
while(1){
OS_WaitIrq(1, OS_IE_V_BLANK); // Vブランク割り込み待ち
ReadKeyPad(); // キー入力の取得
ReadTpData(); // TP入力の取得
PictoChatMain();
}
}
// アロケータの初期化
static void InitAllocator( NNSFndAllocator* pAllocator )
{
u32 arenaLow = MATH_ROUNDUP ((u32)OS_GetMainArenaLo(), 16);
u32 arenaHigh = MATH_ROUNDDOWN((u32)OS_GetMainArenaHi(), 16);
u32 heapSize = arenaHigh - arenaLow;
void* heapMemory = OS_AllocFromMainArenaLo(heapSize, 16);
NNSFndHeapHandle heapHandle;
SDK_NULL_ASSERT( pAllocator );
heapHandle = NNS_FndCreateExpHeap(heapMemory, heapSize);
SDK_ASSERT( heapHandle != NNS_FND_HEAP_INVALID_HANDLE );
NNS_FndInitAllocatorForExpHeap(pAllocator, heapHandle, 4);
}
// ============================================================================
// 割り込み処理
// ============================================================================
// Vブランク割り込み
static void INTR_VBlank(void)
{
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // Vブランク割込チェックのセット
}

View File

@ -0,0 +1,30 @@
#! make -f
#----------------------------------------------------------------------------
# Project: TwlIPL
# File: Makefile
#
# Copyright 2007 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:: 2007-10-03#$
# $Rev: 1319 $
# $Author: kitase_hirotake $
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/commondefs
#----------------------------------------------------------------------------
SUBDIRS = ARM9
#----------------------------------------------------------------------------
include $(TWLSDK_ROOT)/build/buildtools/modulerules
#===== End of Makefile =====

View File

@ -43,13 +43,8 @@ typedef enum NvLangCode{
LANG_GERMAN =3, // ドイツ語
LANG_ITALIAN =4, // イタリア語
LANG_SPANISH =5, // スペイン語
#ifdef IPL2_DEST_CHINA
LANG_CHINESE =6, // <E28099>ΐ
#endif // IPL2_DEST_CHINA
#ifdef IPL2_DEST_KOREA
LANG_CHINESE =6, // 中国語
LANG_HANGUL =7, // 韓国語
#endif // IPL2_DEST_KOREA
LANG_CODE_MAX
}NvLangCode;
@ -195,6 +190,9 @@ extern NitroConfigDataEx ncdEx;
// NITRO設定データ領域のアドレス獲得
extern void NCD_ClearOwnerInfo( void ); // ニックネーム・誕生日・好きな色のクリア
extern u8 NCD_GetIPL2Type( void );
extern u8 *NCD_GetIPL2Version( void );
extern u32 NCD_GetNCDRomAddr( void );
//=========================================================
// データ取得
@ -392,18 +390,13 @@ static inline void NCD_SetTPCalibration(NvTpCalibData *tp_calibp)
// 言語コードのセット
static inline void NCD_SetLanguage(NvLangCode language)
{
#ifdef IPL2_DEST_WW
GetNCDWork()->option.language = language;
#else // IPL2_DEST_WW
GetNCDExWork()->language = language;
GetNCDExWork()->valid_language_bitmap = VALID_LANG_BITMAP;
GetNCDExWork()->language = language;
if( language >= LANG_CODE_MAX_WW ) {
GetNCDWork()->option.language = LANG_ENGLISH;
}else {
GetNCDWork()->option.language = language;
}
#endif // IPL2_DEST_WW
}
// RTCオフセット値のセット

View File

@ -29,17 +29,42 @@ extern "C" {
// define data----------------------------------------------------------
#define SYSM_CTRDG_DMA_NO 0 // カートリッジ周辺機器情報の読み込みに使用するDMA番号です。
// 同時に使用するDMA番号の中で最も優先が高い番号にして下さい。
// 他のDMAへ割り込まれると、読み込みに失敗する可能性があります。
// タイトル情報
typedef struct TitleProperty { // この情報は、ランチャー時には認証通ってないけど、起動時には認証通すので大丈夫だろう。
u64 titleID; // タイトルID
void *pBanner; // バナーへのポインタ(固定長フォーマットなら偽造されても大丈夫だろう。)
u32 rsv;
}TitleProperty;
// リセットパラメータ
typedef struct ResetParam {
u64 bootTitleID; // 起動するタイトルがあるかあるならそのタイトルID
u32 rsv;
BOOL isLogoSkip; // ロゴデモをスキップするか?
}ResetParam;
// アプリ認証結果
typedef enum AuthResult {
AUTH_PROCESSING = 0,
AUTH_RESULT_SUCCEEDED = 1,
AUTH_RESULT_TITLE_POINTER_ERROR = 2,
AUTH_RESULT_AUTHENTICATE_FAILED = 3,
AUTH_RESULT_ENTRY_ADDRESS_ERROR = 4
}AuthResult;
// global variable------------------------------------------------------
// function-------------------------------------------------------------
extern void SYSM_Init( void );
extern BOOL SYSM_WaitARM7Init( void );
extern s32 SYSM_Main( void );
extern BOOL SYSM_IsLogoDemoSkip( void );
extern void SYSM_CaribrateTP( void );
extern int SYSM_GetCardTitleList( TitleProperty *pTitleList_Card );
extern int SYSM_GetNandTitleList( TitleProperty *pTitleList_Nand );
extern AuthResult SYSM_LoadAndAuthenticateTitle( TitleProperty *pBootTitle );
extern void SYSM_Finalize( void );
extern void SYSM_PermitToBootSelectedTarget( void );
extern void SYSM_LoadSYSMData( void );
@ -70,8 +95,6 @@ extern s64 SYSM_CalcRtcOffsetAndSetDateTime( RTCDate *newDate, RTCTime *newTime
extern u32 SYSM_GetDayNum( u32 year, u32 month );
extern BOOL SYSM_IsLeapYear100( u32 year );
extern BOOL SYSM_IsDebuggerBannerViewMode( void );
// ※以下の関数は、SYSM_Mainがコールされた後に正しい値が取得できるようになります。
// NITROカードが差さっているか

View File

@ -134,64 +134,18 @@ typedef enum SYSMMsg {
// データ型定義
//----------------------------------------------------------------------
#ifdef SDK_ARM7 // ※ARM7では、SDKのrtc/ARM9/api.h定義のこのデータはインクルードされないので、ここで定義。
// 曜日定義
typedef enum RTCWeek
{
RTC_WEEK_SUNDAY = 0 , // 日曜日
RTC_WEEK_MONDAY , // 月曜日
RTC_WEEK_TUESDAY , // 火曜日
RTC_WEEK_WEDNESDAY , // 水曜日
RTC_WEEK_TURSDAY , // 木曜日
RTC_WEEK_FRIDAY , // 金曜日
RTC_WEEK_SATURDAY , // 土曜日
RTC_WEEK_MAX
} RTCWeek;
// 午前・午後定義
typedef enum RTCNoon
{
RTC_NOON_AM = 0, // 午前
RTC_NOON_PM , // 午後
RTC_NOON_MAX
} RTCNoon;
// 日付構造体
typedef struct RTCDate
{
u32 year; // 年 ( 0 ~ 99 )
u32 month; // 月 ( 1 ~ 12 )
u32 day; // 日 ( 1 ~ 31 )
RTCWeek week; // 曜日
} RTCDate;
// 時刻構造体
typedef struct RTCTime
{
u32 hour; // 時 ( 0 ~ 23 )
u32 minute; // 分 ( 0 ~ 59 )
u32 second; // 秒 ( 0 ~ 59 )
} RTCTime;
#endif // SDK_ARM7
// スピンロック変数構造体
// ロック情報
typedef struct LockVariable{
OSLockWord lock;
vu32 value;
}LockVariable;
// RTC日付時刻構造体
typedef struct RtcDateTime {
RTCDate Date;
RTCTime Time;
}RtcDateTime;
// SYSM共有ワーク構造体
typedef struct SYSM_work{
u32 card_arm7_ram_adr; // NITROカードARM7初期ブートコードのRAMロードアドレス
@ -226,7 +180,9 @@ typedef struct SYSM_work{
// SYSM共有ワーク領域のアドレス獲得
//----------------------------------------------------------------------
#define GetSYSMWork() ( (SYSM_work *)HW_RED_RESERVED )
#define SYSM_GetResetParam() ( (ResetParam *)HW_RED_RESERVED )
#define GetSYSMWork() ( (SYSM_work *)( HW_RED_RESERVED + sizeof(ResetParam) ) )
//・SYSM共有ワーク領域のアドレスを獲得します。