From c52da9b0054504a5bdeab54607ea7a756af49fb4 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Tue, 30 Oct 2007 09:33:43 +0000 Subject: [PATCH] =?UTF-8?q?systemMenu=5FRED=E3=81=AE=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E5=86=8D=E6=A7=8B=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@73 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/buildtools/commondefs.sysmenu | 4 +- .../sysmenu/ARM9/src/nitroSettingsEx.c | 155 ++--- .../sysmenu/ARM9/src/sysmenu_lib.c | 130 ++-- .../systemMenu_RED/ARM9/data/sound_data.sadl | 8 - .../systemMenu_RED/ARM9/data/sound_data.sdat | Bin 16160 -> 0 bytes build/systemMenu_RED/ARM9/font/f12han.dat | Bin 10528 -> 0 bytes build/systemMenu_RED/ARM9/font/f12han_map.bmp | Bin 43454 -> 0 bytes build/systemMenu_RED/ARM9/font/f12zen.dat | Bin 190632 -> 0 bytes build/systemMenu_RED/ARM9/font/f12zen_map.bmp | Bin 276926 -> 0 bytes .../ARM9/src/DS_Setting/DS_Setting.c | 128 ---- .../ARM9/src/DS_Setting/langSelect.c | 141 ----- .../ARM9/src/DS_Setting/rtcSet.c | 553 ------------------ .../ARM9/src/DS_Setting/settingMenu.c | 308 ---------- .../{ => DS_DownloadPlay}/ARM9/ARM9-TS.lsf | 0 .../{ => DS_DownloadPlay}/ARM9/Makefile | 36 +- .../{ => DS_DownloadPlay}/ARM9/main.rsf | 0 .../ARM9/src}/DS_DownloadPlay.c | 0 .../ARM9/src}/DS_DownloadPlay.h | 0 build/systemMenu_RED/DS_DownloadPlay/Makefile | 30 + .../systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf | 54 ++ build/systemMenu_RED/Launcher/ARM9/Makefile | 53 ++ build/systemMenu_RED/Launcher/ARM9/main.rsf | 147 +++++ .../{ => Launcher}/ARM9/src/Logo/logoData.c | 2 +- .../{ => Launcher}/ARM9/src/Logo/logoDemo.c | 1 + .../{ => Launcher}/ARM9/src/Logo/logoDemo.h | 1 - .../{ => Launcher}/ARM9/src/launcher.c | 47 +- .../Launcher/ARM9/src/launcher.h | 41 ++ .../{ => Launcher}/ARM9/src/main.c | 145 +++-- .../mainFunc.c => Launcher/ARM9/src/misc.c} | 334 +++++------ .../src/main.h => Launcher/ARM9/src/misc.h} | 76 +-- build/systemMenu_RED/Launcher/Makefile | 30 + .../MachineSettings/ARM9/Makefile | 55 ++ .../MachineSettings/ARM9/main.rsf | 147 +++++ .../MachineSettings/ARM9/src/MachineSetting.c | 296 ++++++++++ .../ARM9/src/MachineSetting.h} | 51 +- .../ARM9/src/calibrationTP.c} | 296 +++++----- .../MachineSettings/ARM9/src/main.c | 114 ++++ .../ARM9/src/old}/AgbLcdSel.c | 0 .../ARM9/src/old}/autoBoot.c | 0 .../ARM9/src/old}/font.c | 4 +- .../ARM9/src/old}/font.h | 0 .../ARM9/src/old}/misc.c | 2 +- .../ARM9/src/old}/misc.h | 4 +- .../ARM9/src/old}/myChar.c | 0 .../ARM9/src/old}/myFontequ.h | 0 .../ARM9/src/old}/unicode.c | 0 .../ARM9/src/old}/unicode.h | 0 .../MachineSettings/ARM9/src/selectLanguage.c | 148 +++++ .../ARM9/src/setOwnerInfo.c} | 22 +- .../MachineSettings/ARM9/src/setRTC.c | 530 +++++++++++++++++ build/systemMenu_RED/MachineSettings/Makefile | 30 + build/systemMenu_RED/Makefile | 3 +- build/systemMenu_RED/PictoChat/ARM9/Makefile | 52 ++ build/systemMenu_RED/PictoChat/ARM9/main.rsf | 147 +++++ .../ARM9/src/PictoChat.c} | 52 +- .../ARM9/src/PictoChat.h} | 3 +- .../systemMenu_RED/PictoChat/ARM9/src/main.c | 107 ++++ build/systemMenu_RED/PictoChat/Makefile | 30 + .../{ARM9 => }/data/NTR_IPL_font_l.NFTR | Bin .../{ARM9 => }/data/NTR_IPL_font_m.NFTR | Bin .../{ARM9 => }/data/NTR_IPL_font_s.NFTR | Bin .../machineSettings/common/nitroSettings.h | 15 +- .../sysmenu/sysmenu_lib/ARM9/sysmenu_api.h | 37 +- include/sysmenu/sysmenu_work.h | 52 +- 64 files changed, 2655 insertions(+), 1966 deletions(-) delete mode 100644 build/systemMenu_RED/ARM9/data/sound_data.sadl delete mode 100644 build/systemMenu_RED/ARM9/data/sound_data.sdat delete mode 100644 build/systemMenu_RED/ARM9/font/f12han.dat delete mode 100644 build/systemMenu_RED/ARM9/font/f12han_map.bmp delete mode 100644 build/systemMenu_RED/ARM9/font/f12zen.dat delete mode 100644 build/systemMenu_RED/ARM9/font/f12zen_map.bmp delete mode 100644 build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.c delete mode 100644 build/systemMenu_RED/ARM9/src/DS_Setting/langSelect.c delete mode 100644 build/systemMenu_RED/ARM9/src/DS_Setting/rtcSet.c delete mode 100644 build/systemMenu_RED/ARM9/src/DS_Setting/settingMenu.c rename build/systemMenu_RED/{ => DS_DownloadPlay}/ARM9/ARM9-TS.lsf (100%) rename build/systemMenu_RED/{ => DS_DownloadPlay}/ARM9/Makefile (50%) rename build/systemMenu_RED/{ => DS_DownloadPlay}/ARM9/main.rsf (100%) rename build/systemMenu_RED/{ARM9/src/DS_DownloadPlay => DS_DownloadPlay/ARM9/src}/DS_DownloadPlay.c (100%) rename build/systemMenu_RED/{ARM9/src/DS_DownloadPlay => DS_DownloadPlay/ARM9/src}/DS_DownloadPlay.h (100%) create mode 100644 build/systemMenu_RED/DS_DownloadPlay/Makefile create mode 100644 build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf create mode 100644 build/systemMenu_RED/Launcher/ARM9/Makefile create mode 100644 build/systemMenu_RED/Launcher/ARM9/main.rsf rename build/systemMenu_RED/{ => Launcher}/ARM9/src/Logo/logoData.c (96%) rename build/systemMenu_RED/{ => Launcher}/ARM9/src/Logo/logoDemo.c (94%) rename build/systemMenu_RED/{ => Launcher}/ARM9/src/Logo/logoDemo.h (93%) rename build/systemMenu_RED/{ => Launcher}/ARM9/src/launcher.c (87%) create mode 100644 build/systemMenu_RED/Launcher/ARM9/src/launcher.h rename build/systemMenu_RED/{ => Launcher}/ARM9/src/main.c (79%) rename build/systemMenu_RED/{ARM9/src/mainFunc.c => Launcher/ARM9/src/misc.c} (67%) rename build/systemMenu_RED/{ARM9/src/main.h => Launcher/ARM9/src/misc.h} (65%) create mode 100644 build/systemMenu_RED/Launcher/Makefile create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/Makefile create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/main.rsf create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c rename build/systemMenu_RED/{ARM9/src/DS_Setting/DS_Setting.h => MachineSettings/ARM9/src/MachineSetting.h} (59%) rename build/systemMenu_RED/{ARM9/src/DS_Setting/tpCalib.c => MachineSettings/ARM9/src/calibrationTP.c} (61%) create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/src/main.c rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/AgbLcdSel.c (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/autoBoot.c (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/font.c (96%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/font.h (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/misc.c (94%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/misc.h (94%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/myChar.c (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/myFontequ.h (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/unicode.c (100%) rename build/systemMenu_RED/{ARM9/src/DS_Setting => MachineSettings/ARM9/src/old}/unicode.h (100%) create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c rename build/systemMenu_RED/{ARM9/src/DS_Setting/ownerInfo.c => MachineSettings/ARM9/src/setOwnerInfo.c} (95%) create mode 100644 build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c create mode 100644 build/systemMenu_RED/MachineSettings/Makefile create mode 100644 build/systemMenu_RED/PictoChat/ARM9/Makefile create mode 100644 build/systemMenu_RED/PictoChat/ARM9/main.rsf rename build/systemMenu_RED/{ARM9/src/DS_Chat/DS_Chat.c => PictoChat/ARM9/src/PictoChat.c} (74%) rename build/systemMenu_RED/{ARM9/src/DS_Chat/DS_Chat.h => PictoChat/ARM9/src/PictoChat.h} (90%) create mode 100644 build/systemMenu_RED/PictoChat/ARM9/src/main.c create mode 100644 build/systemMenu_RED/PictoChat/Makefile rename build/systemMenu_RED/{ARM9 => }/data/NTR_IPL_font_l.NFTR (100%) rename build/systemMenu_RED/{ARM9 => }/data/NTR_IPL_font_m.NFTR (100%) rename build/systemMenu_RED/{ARM9 => }/data/NTR_IPL_font_s.NFTR (100%) diff --git a/build/buildtools/commondefs.sysmenu b/build/buildtools/commondefs.sysmenu index 352fd9a4..64dd0dc9 100644 --- a/build/buildtools/commondefs.sysmenu +++ b/build/buildtools/commondefs.sysmenu @@ -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 diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c b/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c index 8b24d576..6cfbd2b8 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/nitroSettingsEx.c @@ -19,10 +19,6 @@ #include #include "spi.h" -#ifndef USED_COMPONENT -#include -#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 ) ) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c index 4d138dc2..8b40ee0e 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/sysmenu_lib.c @@ -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 ); diff --git a/build/systemMenu_RED/ARM9/data/sound_data.sadl b/build/systemMenu_RED/ARM9/data/sound_data.sadl deleted file mode 100644 index d72c8162..00000000 --- a/build/systemMenu_RED/ARM9/data/sound_data.sadl +++ /dev/null @@ -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[]; // サウンドデータ - diff --git a/build/systemMenu_RED/ARM9/data/sound_data.sdat b/build/systemMenu_RED/ARM9/data/sound_data.sdat deleted file mode 100644 index 58b6dd67fc47f34bbc2bb7b92c30d2b5a32531a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16160 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 z 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 diff --git a/build/systemMenu_RED/ARM9/font/f12han.dat b/build/systemMenu_RED/ARM9/font/f12han.dat deleted file mode 100644 index 08bd466fee917f69d9337fb4484f116a288b4021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10528 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%0DenHV#BcY2 zq6ZZ{r08Kqk0^Rn(PN;cl@(++co%h#b1nn?@;%2fkHm|k{MEs@Cvjd7rb;XEJQ5e$ z@~-Bdih6jMz)GDOo?K5uH$aSLm^SViHWHh%9nT|i2SZw*XE{RocIKWN78{7y2jh4i ziD^OByT4NS#MIbsp)|d8GSF zwNvMj?i;03=aKGPrTb2i$|If1Bb~}4oysGf$|If1Bi)Z`1eHg+pOjAJk?!Yto$tb5 z;Er@dWBewJdK3EK1hgqj6>T;jF})nJ(~*1A)cDQkBc}gFQX(Re-vZtTPi6WI!r!%P zJOh+72)|{DpvSa)#L>4(5Cc&y(AM+u)2}Rx`{RQ(x0#Qhep^mBL`LY;d8F^pM@+xH ztO#pl)b}`#l%m85zvFzw^b*vuJpMV=_?_k>rr&u!V)|V|Ai(FeX8eG2NpbkXw8Zbq zrHjxKyOof!=I%oTnhsahfo>z4;UR$4gZALOD$DOln=PV8yaE}&m)!d6sEM5150}vn zw!tT8Z?(7kDB4#MMwyAQPB7+g~kQ(@7ny=2@!v_&|*Q?1d>nVua&D|ca0Bu3>OR2>t*7 diff --git a/build/systemMenu_RED/ARM9/font/f12han_map.bmp b/build/systemMenu_RED/ARM9/font/f12han_map.bmp deleted file mode 100644 index fd7c1e0f13f2b68789388dfac43cc38ceed2294c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43454 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 T_Wz+h+l~CezjMTIi@-ksbFGKF diff --git a/build/systemMenu_RED/ARM9/font/f12zen.dat b/build/systemMenu_RED/ARM9/font/f12zen.dat deleted file mode 100644 index ee38836d5d164023e51586fa41ba45e9de7a61f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190632 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ÒkQgu55){<+?JS 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%0AfLia|MI85hpj*=$_ zVS91h@cGdWasIbHLKF9@$5L3iU|IF?UC#fm3aiEbkQT5Yr2VTBi|YLECn>;ag0m1| zzOI86Ql632l8hk^q-;6VFtD0sSzhtfAMiWu#1rlJBw!}`px;j&cc}K z?RjIc=?%iRH4D;va(zM1(3B?RX2h2uAuwj;qMuOd9eLUv=aaf?!2{o9HJZOB268)TV@=6@+9wgoM$IrlHdopd z9zU?apqJQ#`U#|g_Ef!s-1tMnQP`DIKWrGac4 zR;YtQZRHMFzsMc561lT|IAAQFbCC%K^(Y?fwcr6_D66~!HiP%shyvFh@h^~GU!RIc zEY6-__O*d&`j~>6kaOfr!QbdaiNCO8T?ns8jM;^NznRjb7y9d9`8n_&i>!THRnKcx}unxIi*o*q;amU})$ui}=ergLq z9>6bBZ`EB{M$isKhQK#*8ojtiy857YxcPy(?US}n(NDHUt%l8vxv}kl><172Z{$E$ zWHA$?JoElW{%s37nA<^cN1af0pnH{F0MjBDBsRZ&65HTLsCUt6+TB1>oq@@zb5&lIK8Ce&vGE1OED;`7_9;Qdg zxZ?XNb!*b+>gihUD7kSeg-21iB6YF@S#t6gOj$u!X_Vuvp!FK%9CL`~E*lWD!`z^x z;Li7j;Yq22x8)U5b)2-FmW^?(S!HgG`||L`laA^U@_#(7RW~TlH@1Omxlt-1cnw0* zS4v1oM2|5iqmM{gu~L`QKvo)JP%uWXhLa`iJ4I{a<f=ypBfp-}?zWPArt5-DnNR*`MW++CYKr5^hc17Z7l=G7+j0|(b zGDqPrR+EmS^=cpoklu7sS3MJRNrgx{IvWg&2NK@$<>LihcouDGBLbyi{(+vA(n?LA z#tYAejHVr`O&u(C6nIPPL9X}0d3Jux`kB3UyOa5d9F@x5xoI+b>Kw-tBdGsj>FZjNZPSF8{G#n^Wkiv>R5 z0oJsrv(!LdMF|;=vyht6cqqyiX=`#+znYd((1tn;tDy+C2T++|Igc{UBYD_I(vfI? zaY2#)&*p)gXZv7e!uYf{$P3SF*B37EHx)@7GA#vK&=!-ni$E~b$%YHeLwVROmA483 zu^9#Xj>a8FK_K?xbCdfFVLvq?#~atCuf@632)0}N_K{$ZXi63+f5-KO z*JXm{$nCzw!)C9d9Qqr)F5nzxV>+(5x4#m(^(lC!K@*`I7heo^lma=-c{D!_lj=9J zO;1FPsf<>qOQSyY%UatI0eKTgnK7)1GFXT2#XBXtl`Z#XNM6cY0VoGc*n?57>)UV1 zDEdzuw240@H`yEC+El`BQmjOC5-7?+PNG#y$PIQeM0&tz-3AT(u&WQOCTyR#!8W7W za*TO_-e@Kz@qa2-9L69Rl4v!)Skt$&ok#IozQg*JD&g;+yYP-qnMJ&5dIXQaC%6-q z&754!G{p*Sl{BcSak;&dcXN#u+oLx5NU&hRDW!pYmaGXXiq z_hEA&U|yicAkBNYlQN9YK=c88M$6e|3FN&TA;uMbV^$|i)Q+S!-g^piIhRAzV202sqxHvjp5O5 zwrq%Riy+sQy~NS>2_mOu9VlI?ZjDXIPp&?nthK1Ar56(BF5uf_nooga(MUuI;aK9^ z$F=FFsY`q$Pj8c%l-|!cUPnwhmhKH<&rJM%hZjDZjrg5HTQE1u0D4yns@;8*fo;yySKSbcVeCB6IaSDWCxQkvl2P zEayuc`FTo$wj^rNS)!~*zg+QhJA<(=gI`V7=PRgBa$2!8jI^Mg`z4)4tMb|zN+t9VocbzR7oM!tC;XBMIB1MjVFB5dePKOi% zjOeh22N}J9()<04+N=j)ZG>&Iyap@JHhwU*%QI|`7{ANYB9P{XzR!Vb$nFZ)gUd4d zBep5_C=Kk}&>_6-jg|tW`LUBX>Dz*R+s}A_{G>&;nRC!c?eV$d;fOvZtx;P9b5A?01Hc2Y7TK#xHDJzQZ8R&$3aQ8UZIO9HreqOWJ-;9bZ8Tpt*9_-vykb z98VkI$Hl%!N%kilkmi@H^N4KHx#+k$lBh5nm0Rvt%SSY+u6<-X?{Ju zmtfSi)QUM$@EeSC$+(3qS!h@beNY)2f7_xndKfK^v4kUrLhmz8tk3TtM;5*wmXTo| zNPN7?tOWA=%8m{9Bll|7hvPkvKe#@HeudpY@=dmwMat#&NAP7@&mu?pAWf>07DNGW zfyJ5ggN3D*fDe#AE!G|Bc-Rpv#Mp?|P8Ub5Xm22YZZ2>SITvGIl@3Yvo+jY(tQS+JoaPoMeI4i=402S zLs(70t~ROpF0QAR^aySMauVlfLKio**c`_CY^fz2%^wJ<(f#d-7dN7hg{Kl)^~bRj z&GU*2B}a^lU6Z}uT-k#!Zt^mkQ`AdGF+No0y%%pM)oxEOI-WeNsH>Wj1$pGQ+4@3+d&n6}KZ8XPkZ!CT>^P(1IN4Hey_-T#Ph#a#!+PfY@ij zxIGxQki6zdfE^f~i+vFMODnymE52BSOd0^NI672)KT)JR- z`}9%|vpx%ozCIkEU48m8ioT1JX9cI)bjQ?Q==kJb=)wRL^wUdpd4X}F4x1;2?P_fa z_kk6F4CJWe1KcpT=GHbEBa#qi_^=@zK;^2P7vE7fc^sH&s zYxQBw-xj<0uov&jU@YpADy-29@>;m~3yPNDi+3|}l1$s=CUX|MgCn}%j@auYkX<*1 z*>FR;M&=B6?QYZ9y|Yb3?l~K7KtI`ta(H7`AIjNa$B5i}oj8VdD16tEh7m%rOK7=6 zc=5hD`iZ(8R-p!U&f-z^>WNq*0lEL2*82XS&)l!H8dC#!v^hs)cV({)XBd&}3n^}uld8cYus}=9J0b3?4LhssqRgr&(3TtY?}B zG8#L40me*d$#u$kNWxPR$WU`~LTyb?tIg@@sLq|#+LZ*9(S5L!ipnWZoT-Mr7rU+k z$o`YilTC7!Y|XdgWXNn;qhzT$59Gj!d~->KE3k*z2~X!ax<=P3>g$UKPnWRflPff$ zDyh5loJcYab31f8q?Y&lcDu13H<{)zbHl!_LHtC0BO)=$P==geUwrVShJI8lVpsyi z-FjXM3gQ-0@X(2{83^{^QqndTGuT?$oB}y=GHFuH=_<)6d_-v7%aFE*$3=6xK&?&~ zS8$iO2D9KAlPLl@dIG&xh3nFVvLo50u1T;SMae*da{>DW&O2Km_L_v_xa-@;m?kS% zC*0AyA89y`a@u8h+-8co0@Ex`b``J3NZ6QH2Du$SshW#T>i~x~-y>=jfuUL;+ zJL7h0FTE$q)^79}YIp4Or2hQ!#gi&roodYPJL1!VYu&YWuDvOb+{R%uSGQw-;w<*; zXO(Ufvy#(t7P)ikMoX=>A{>e`c15@sGXPqLfVlW#v^#8+?)Ot^&RkVOB$09s*XECv zZid#pIY64THzEfWuEe}jg{zP=M@E-hI0L!*=mX0PEJ&g`xnFK%IZxtT46)zz`jmUy zu+qVk<^*$lGFxXvZce+xuF$=kQFDDB$WurobqDqVOG4vi@KQjYIvvUA^?I$THT#J? zZ91|ATrV8t$>ZmKq;=LO0 zd~IfZp4B93#0;@sbS5+Km%Fh|Za?edvv;RW4r#(!g)5Nf=t4`#Gxsei{UYcE$=zz? z_T24hMpTK7NmfFq4%c{)^KH8_(^aqC%_buWiJf4zWwhwDX7&6G1`F5jk_ z)cOQzUI406PumKD+MqMKT6L*bIV+ig-&3->nC68oSVL6flr(qgs`1X3 ztLck2r&-9;<}`;=sx6}8U`4n^BF&3YlcZX8D}@|pB}!#jjXPZo%g{*i+>D9MzVz3Y?TpfxL{ooP(WXBJ;sRcysEz@<3j`O=onK-Ue>X z4zIVILuZP2#z0;{?#x1OASY&})2MzW=ruF3yT$jbgK5aCP#;-o)0w~*)+?$Ghe$&^?CAow(OQ@xza3=6_b3!h9l%4b??|wokqb$P!M?v z!0YK!Wp$x5^ercp(3t0m1!4=!dChjrfo4m*L;uXfd#mX%_bMQ--JUdwnR=6MQ@r1! z38gj($LrTkra?-ik$gE`zurp-QmT2$9Mm8am3jS!EF@8jdaMTcZ?BV(YysuGk#aj5 zXLBMy3Vo^F%*AVAFv)|r^Df|Ov)M_=HKqw^GO~;Hd53RP zEm{)X6^8T~lQrEer?@?B1t+y@^LhB(iN_)D^l3H#f#n$W!74DnHAb3uZ4g;K&u)ko z0=X*jwsqG_-mNf3iEsntd1j27>L!ieD3RtpT{4?o?|S{!_F9WRXLIUK1?0V2E>5c0 zgNxVOD)2dr-nlge^1d#W!N{v4XczF0{A?{czP+E3On6tZmefd`w=RaHA^5{Vsl}N47%`BPuGmHy`iqrd{?1$nC?~s6M*7 zxGCnjzv>7x<+#1r9Rc~s_EbTxyQ780x$*3%Jzi8SOX5d)lBgOokyW#xOSnqRs&0ui zAKMsa^=zE)qc){nx2c?Vw0+#^s)*&xjM;;8ak&SVZZ9;2*9UBiDlrSZZb80Xtm!8l zuf+z)^GqXz3OSE(-1%e|xO=_rvN?IZz7D%h*)VH2#Ypoh1W-lOsjJ8xu~8t+XISVSNbX3tc*^=i_8*8>pVE+67i0dM9)HA}C1M z+L^FAx)FRMZH{kWVsE@Qzpk~VVGrTN+h)S*hVmk2cr^=z?9Y1H6i+$}mwQg2VF zDXvX;o4xm8y7=|&Nlwj}^DU*@N!vFdiHX;}^C894Wb~Vq1A#KVys`Y2 z)V1li)??-{Q&V~w$GcT^;&D9q_6F2(rr8dusn*xy^HR{aNur$ZY*L*mG*XfUrv-B2 zIMWpY`7Sx?DPaFugtTpH2h)6y5oj@1LI`7xh9@# zc+*3>ahm+cI2Ed^Qy1?Uy%CWmO;>bB5ovzXjT)0`#*nK)v;mxoF7}e@pKcB-T6vzi z&UjzfC;xChLP7*~m5QYDh$AzCw>76-hrk)Qe$VB(1DCg&1!)}Q><(%U6aa(b5 z)aJ*mU$6&POO2MPQZqDLyE$>K{Y#_~&|)ZguE7i*?U+?gzx}E==pnTMscs0s8@#$% z(_e2aEzHkKx**R^t_8gP)Q$wmZ#IP4Vs&(TF$-NLAc$F)(+KvAOt`a1Pne6p*CFNy78KfRlG!0kDVOsHWvTru(yJ6C z&i9f(Qg%3IwaOWgo-Am9P9$w9CH|^pgKAEy)K!ovrg0<2pB7+GH}ny+-?nL`=Lgy@Rzh8$Vm}x4*`|Q}om68s2w5jbGkURsZCC>NM|XP4 z%(kaeL|!OV2|vT$PYV9IL3PH}dak`M&V<(m=ygh!HVYvCa&nCpLu5cioa{mw186%S z|J!5NrE~3$qH=QGnY2}AxBuP-IjTyx!9SF9B+e2u*3A?Dvk7amxptTCD9*(_AMLt5 z>2NcBi!#O0NKQI-PP#%v@=w6 z7323Nx39af=p<|vLne%_n(cj?8p+HRNa3C2^sILYe8h}eiU1725Yu{N!Z zo`CxE1o+)~AUiqsLHnZ@Qu}8hNq$a|3~t7FGanw$i(*)8Qrt9<_+FpfMP85x-D;j2 zQ@TM7S2@Yum@`14d*z}+Rrp^4v?Xjh>xt}QnyTnN)NWCM8l7nj>vPYP9-V8eHRLd6 z3_2k9Zp1vEEtj)Z8Z)6hb;#xf$bD>?8i_kb<>QMD7!xYvLUKR(HW!+_Bc>!WqMe`B zB)f^sk(;0i=b?8qua<;5J}KO3w&+G^y+Q0LHe$b?{+m0A?D4Yz%01SaVnKv`Qp34R zvX{BdmbVwO>gob=!!L4%8Yy{zHLZ&_>Fvo(JukUCzdhN4x&j&67Imc8TS#JYuHf87 z*>=-Y1hUWbpi6h6$06>Lg5^QnSpc%1J!=MX>_T2Q=E=2gdw&4rz}C1IBf_qDo4F;v z9(n~a8|7|NaInlb*@3>|HD8+qm8dSQ3O5nU_X{c9XDye&}T`hdNDu7w zWA6>N+NyAVqCtz6npBVQj+&*aR?mU;NeFs9c)#^zRECVM!YDh4(`m7vtXo6Qm6Jyr zQ^X*`KCl~|(H@K9g>Fufj5Vh4W-+|U)kVIULQd3SmlN@xCOvmB^A)r(B`&_$-DzLg z59=~5lh_w>GyG(na_Qn0p{5PyhWtWVF6WewIK_LH8Mmo6kKCNSDmm?Fiw4tv%7_q4 zcYOGlE9B&*HEIwxXnL$mRadOF9k#u=F$VH7QcdXv-vaKOBkqW~Jpl6ZTJ3L4HE|;> z66SW+^cAu&816z|y(M~mAU9}pCvUH$gxrnU#*XBMJh{*TF1Y#5s~Gi!5y1xH z8;Vy*$g68vA4A;%c?%jPGy?3*DCg07+bi!&7~}1RxUNtecj)%grWDBedfl7eh3Gei zX-}aPPdVCHBh`fb}AMhJM zn=(Em(!gJ=A>L6Ka1YzNt<-K^Z+tC$i&3NdB=6v@PwMTW6nCRB&FdP22DA+#Wd;2a zJW!%VuvFY$1oHaj1$y9jNB@Of=!t*0I8)#j3z57*B*e&*B(xDHZ@gM~?>n3U z5Cal1e?+e^Eay!kS*L5z!aVnac>uV*r$ozk@@C#qRU_AxlyZZezG%4w0E zM2d`bH?Dn@A4F#`b%vgHK;Bu0Qcfj2V}s}&&>9tg%j8`v1@`UCD$^gyd`7HGHh@c2 z^%w*aXHb$zOtw0&X_bGd%Sc&ba)U{W8}n*p_$<$Tg$lrw@mY)ce; ztdX`C`#eBC<&coHEsHs#)#x&9p9XDmFqLS7rTEJ@S^YB0G@qefNAxs(FzhI_V*bW6 zo-Vh~GB@atJiWq8$*sduAHy3eb}Z*0}5&(Av@Fp=JqwF=}Q_x)vchH+Lzw|iCZz| zttib= zvcjNkK>M{DAm8dOp{B8GAJ9lHmF3{uytND8pr&i&AksC)y{4szG~Z#p`XfZri&-Dc z715)cLLlEA!#DyeKmnrz34PXP>^f5Ly*``MeU|!tX~f=DZ+9k(nA`WCpe6SGcch4O z22X+>eY+jEgG}>-{Qcwdh>)}Kx7S&ACADf4{vhp3wjG1?lKLo5kP)4 zY+>hyh8qd9?zI%2GS%ehk4FSniqL-e1zy>RaV2Ju>YoItPZp^dQDK3ax*<3DDPqBd zJdpx#0?EJsC6CD&DbghL1fo|8?`@@j$`bf93zl6h-m3w`Y%g*;YpkE0QA01~F%lR2%dVs33e^HdROZ7f=J-PGq;h+VzZ!x0< zMj%)aFAEOn>okyG982L{l;$KTP`M;4mg#+FZUE$$Ccq@2mvKuiy=Z zvf<(6-kXDEdXKKsKz==u0N`ydu=Y7-ZpI$AhG<^;3Fw09oem@fNG!o+`WFl;enOW zE=h)>*+l+4Y@IbhvOHhTUUyq`@)vxA+IZh}tm!4<^O)Irr1|SuszgrG2afes;nHX* za_!%R8 zwvgMuj#EC;oOvYgb9)7%0mz24unj8hJk1c9X`#*(v=MP{3b%j=61{lb#K6 zOG`pujycIW*rBq?bwwcCxkli9Fr1b0rnO1#7_KC0bxS&qmV!4?S|8R%r&FZq^|G_i zNzN4XUo86QfOhvNYol+$T+Q*i|6EdCx(a3SjH!S8eIJ(w z=%L~t_-A0|#usPAmv&+&Qe`y1C#;@@Ch?9_sxL& zR7UO=jw-}m0EK*K?1mWP2Uw`*B{ z57edIQ#`n~bgQ_w#9Uo&h3V^rbI=U@C42CtJ)jG6)1S~=jnP4QOO_x7dtEui1Zpa2 z7daD)Jdg*bT8?&wDZXDCf+wfNZ3TE*Q77KOJl8H~If%P|4z)pz;CaKpkYXzeK=%9k zuxylLv2IakJ#wIuH*b{SsTH1`a#SCD4B}+bA%{G&H_!X^u1Iru2CNwhMRLz>kMMp8 zwC-Pe&?E5LheRJlk8RQ$)E(sYLmt@!dqSH!gr`k;3*e9V#E{N} zO=5%E9s?P!ltX*Vg9W_nt%ml*OUFHO0J-o^0-xLV6v)Vx2yxyL0c4a&Rvf^rnDJJi zxAbPAOF$l}Ag!v!4%rr)Ep*AvOfy!6G)*|c(xf_*LjrtN8^SvZKu-8_j)qyiA`cuG z?Ug`IdSpnm6)MPj0c5gSMr?71$4`J+RPqtyd2gq4c-5fHv9LnLY$j0#A07zKL4f`SXkitHbE$8;6DGIXs zu=VwER6p4xl#NXIP=S5{8+>k0A(8>T^j0{8C!=AX)F|hvKFyG`>mMmBDl9^@7h3l( zJ#9MjaI!F2X3EIZJ#rN7(`gUeP759s2My9Zg9zj9(OY2%BWF9TXPfdso=GGV4#Afj zcSe{tv&e3R!~uC$CAT)z5*!tsNso2y^K6$!98GZtv3f9RhurlD?nGXCj!$!>kO^-K z4wN|01Z^cC&n40nJ{(ZeK!<2adSDX(@;oA0@i4}c_To9wo-DRKnpWyd&-b}KoVH>u za4sc}$~_DBQF^J$gq_I{O37;O8Y4|aq)mB_?h_f^Y1fOpS<@GK#OJe@WmeksMdfmW zcC$EmFovxt?lCTC zYKKKTdU7{(IgpnT$%ID}_}b_LCEl;N1u+YNyqrj@KuzUhHIgn?*9YNLI5K ztVQ@s{;$fXl z7VCZKV!P1xCz~XYM?HczRh_|M)e7rABh>;q?~#XikB>f_ti^udT0NkFTp-deM{IlA zWY0pAuT7P`pJ^@%r(Y6Leg9<5U{hIx#l+SYkllq{35ax7eb$=yApUqweq| zW?w+wOiy=?d`1KURw&)8ht0JCkhf&QQ^_5$U2Vtd9F(Sd)Hrs)fxOj6S6Q9*!FR`7 zR!Jj}|IS7uSmhez#N24#8dkGdpSR5s>qHy4y(Y#iEnb#y6I)=p1A_Y~bJ(qJ(|0CK zYK`4w+jK4T50JN?)|+5cIj08_%w6mmTcgkFS|ab5lb(}3dTWZ?!Z2J~teBnvteOJy(+`V7*1a(2YKXBS5&Qu4a;0QuAmJ&L}JNHEDjh(7QG67AGN1J^BRXs~hh~^SLTTyR3=OS3-E5VD#xP@{GWx&!av9 zeJ~lvuY1HeKJ{RZ2jmMg#3KQEKrn({K#uY@3dhke&Jbe>V(X;G)L_ypjwP^Si&ISV zC4t^(P(px*k%@M|S~Oe$@@1q+8Apiyt5*z@8Xb_fufWGda2D92ZY=rPaJfETy&B&$ z4!M(U$b^@Er1=_hi(w(wxD{C;IuD*cSYv_2q@X_80U-w6&#hvj$aU=rr z?O8YphrN%8aj*x?s2WuFnPUdXcgVK^@Xbd_8cX`Yztedj-<<_Z2+A?X#6a99j^kIR zG)Clmh>s-w!<$a`;Az4GO_;qu60`OrZl!vXeEX5F55AK-lHTxq*?5{UxNXa< zHHQs--`bAJY_Swj)_(uW{D>OTRpm z&=%j6xM+5cA8XWAEazAA(kr7uu1l|t8e$;7#yOTmg(_T^9u(Y(W&FZfO!FIeCPie_ zDs{wgw}l9;UzdJ6u4ofdVx>N0+6#+8+bUB<+I~mh6?%{Ms2cQ=+1Ql`)O@zw?`H*P zuu5qO*1+b(b7YLxL>t$oKd>BHAxS|8W~J>Y(T#wA#Ce&7mZcTyC`w;kYzY zh?*yx@vKe{iH;P$bY_*jstDvy?#vLTIPpU&o_N)Qq{%YSM;rwIf~WIr_I#pe&QL;6%(+IaLa| z{heoqXhmBQV#bG53-t=$+W!~_1zDT1E8X0QG_11Ktj|Bo^%1M=gQUzMGh-nC0-{k< z4cau$8p-zJs;D{-dA!HMpv)5g@>_3CJRqn=j+vgJgWi*cqlUR^j6 zv;0acO!S;dXUG}OO78YN1$I4QFGrfK&=+z>%y?L|Uf>n?OUZKXIFY}qRHbRH>eG0s z9mSoJ(TOJRq&0(9BFpJzM_HN;!YKi{!>Yny($^EbxE(;8T2MQpyL~f44eqj zf+3?Ba75|VET@h&-AN5QQ;tI$Rbt#{6uq@32G0dE(aXXAh!kKnMM*LQau;t|CW0Mn z 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

}xaeiiHi-&)$jLhVMl}{<600)LMJ~MAG1m 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

5%{^RIf(f>JXf9}{mUc&Uq-Ou-#$4`CF z>%O-AeUPUKNZ1GyMBTHr{VXhSI_WYIOER?ftmkv^1b-{_aZQ(fBo;h z?c#1z1Qz(umlVDn{QsH#EobyUv&Q^S=C|Chp)tR)=eI|{vFFQueL46~A~4sJ$e4-w zH5B}RWzVnYzq04ceSJyzgZ&i$N%X&cX@^O~_T_?4&A%M{4OpWjvGjiv|NqH+$qn!Y z;hzP2ZL$g7|KGtC{V({>zl8w*X#{^hE&nID#Ek!k|CZZ-rki{@^bem0f8q8M^IJ~v zpUOYE&jiiCrPwbB|H$HR`Tq@QzG&|AC5^v~zC!;C{BIE7zw_rm?fA2z)vG|BpV|mvR0K|9NS@7x(@DKFlDl diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.c b/build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.c deleted file mode 100644 index ef950e1a..00000000 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.c +++ /dev/null @@ -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 -#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); -} diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/langSelect.c b/build/systemMenu_RED/ARM9/src/DS_Setting/langSelect.c deleted file mode 100644 index ef990447..00000000 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/langSelect.c +++ /dev/null @@ -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 -#include -#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; -} - - diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/rtcSet.c b/build/systemMenu_RED/ARM9/src/DS_Setting/rtcSet.c deleted file mode 100644 index 22f3baa1..00000000 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/rtcSet.c +++ /dev/null @@ -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 -#include -#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を+2000する。 - 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を−2000する。 - -/* // 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()); -} - diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/settingMenu.c b/build/systemMenu_RED/ARM9/src/DS_Setting/settingMenu.c deleted file mode 100644 index af941f9a..00000000 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/settingMenu.c +++ /dev/null @@ -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 -#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; -} - diff --git a/build/systemMenu_RED/ARM9/ARM9-TS.lsf b/build/systemMenu_RED/DS_DownloadPlay/ARM9/ARM9-TS.lsf similarity index 100% rename from build/systemMenu_RED/ARM9/ARM9-TS.lsf rename to build/systemMenu_RED/DS_DownloadPlay/ARM9/ARM9-TS.lsf diff --git a/build/systemMenu_RED/ARM9/Makefile b/build/systemMenu_RED/DS_DownloadPlay/ARM9/Makefile similarity index 50% rename from build/systemMenu_RED/ARM9/Makefile rename to build/systemMenu_RED/DS_DownloadPlay/ARM9/Makefile index 5ee14a6f..74b09d1a 100644 --- a/build/systemMenu_RED/ARM9/Makefile +++ b/build/systemMenu_RED/DS_DownloadPlay/ARM9/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/ARM9/main.rsf b/build/systemMenu_RED/DS_DownloadPlay/ARM9/main.rsf similarity index 100% rename from build/systemMenu_RED/ARM9/main.rsf rename to build/systemMenu_RED/DS_DownloadPlay/ARM9/main.rsf diff --git a/build/systemMenu_RED/ARM9/src/DS_DownloadPlay/DS_DownloadPlay.c b/build/systemMenu_RED/DS_DownloadPlay/ARM9/src/DS_DownloadPlay.c similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_DownloadPlay/DS_DownloadPlay.c rename to build/systemMenu_RED/DS_DownloadPlay/ARM9/src/DS_DownloadPlay.c diff --git a/build/systemMenu_RED/ARM9/src/DS_DownloadPlay/DS_DownloadPlay.h b/build/systemMenu_RED/DS_DownloadPlay/ARM9/src/DS_DownloadPlay.h similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_DownloadPlay/DS_DownloadPlay.h rename to build/systemMenu_RED/DS_DownloadPlay/ARM9/src/DS_DownloadPlay.h diff --git a/build/systemMenu_RED/DS_DownloadPlay/Makefile b/build/systemMenu_RED/DS_DownloadPlay/Makefile new file mode 100644 index 00000000..02cacbf9 --- /dev/null +++ b/build/systemMenu_RED/DS_DownloadPlay/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf b/build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf new file mode 100644 index 00000000..199d6f87 --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/ARM9-TS.lsf @@ -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) +} diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile new file mode 100644 index 00000000..0cd1a08c --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/Launcher/ARM9/main.rsf b/build/systemMenu_RED/Launcher/ARM9/main.rsf new file mode 100644 index 00000000..62ecd99a --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/main.rsf @@ -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 +} diff --git a/build/systemMenu_RED/ARM9/src/Logo/logoData.c b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoData.c similarity index 96% rename from build/systemMenu_RED/ARM9/src/Logo/logoData.c rename to build/systemMenu_RED/Launcher/ARM9/src/Logo/logoData.c index 98fad436..03fa5f13 100644 --- a/build/systemMenu_RED/ARM9/src/Logo/logoData.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoData.c @@ -16,7 +16,7 @@ *---------------------------------------------------------------------------*/ #include -#include "main.h" +#include "misc.h" // define data----------------------------------------------------------- #define NIN_LOGO_LENGTH 0x9c // Nintendoロゴデータサイズ diff --git a/build/systemMenu_RED/ARM9/src/Logo/logoDemo.c b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.c similarity index 94% rename from build/systemMenu_RED/ARM9/src/Logo/logoDemo.c rename to build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.c index d023bfef..91467d73 100644 --- a/build/systemMenu_RED/ARM9/src/Logo/logoDemo.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.c @@ -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(); diff --git a/build/systemMenu_RED/ARM9/src/Logo/logoDemo.h b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.h similarity index 93% rename from build/systemMenu_RED/ARM9/src/Logo/logoDemo.h rename to build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.h index 251087d9..3923a334 100644 --- a/build/systemMenu_RED/ARM9/src/Logo/logoDemo.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/Logo/logoDemo.h @@ -24,7 +24,6 @@ extern "C" { #endif -extern void LoadLogo( void ); extern int LogoMain( void ); extern void SetLogoEnable( BOOL enable ); extern BOOL IsLogoEnable( void ); diff --git a/build/systemMenu_RED/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c similarity index 87% rename from build/systemMenu_RED/ARM9/src/launcher.c rename to build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 1e6e5d7e..1e03a1ff 100644 --- a/build/systemMenu_RED/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -16,9 +16,8 @@ *---------------------------------------------------------------------------*/ #include -#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) diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.h b/build/systemMenu_RED/Launcher/ARM9/src/launcher.h new file mode 100644 index 00000000..fd63c322 --- /dev/null +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.h @@ -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 +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// define data---------------------------------------------------------- + +// global variables-------------------------------------------------- + +// function------------------------------------------------------------- +void LauncherInit( TitleProperty *pTitleList ); +TitleProperty *LauncherMain( TitleProperty *pTitleList ); + + +#ifdef __cplusplus +} +#endif + +#endif // __LAUNCHER_H__ diff --git a/build/systemMenu_RED/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c similarity index 79% rename from build/systemMenu_RED/ARM9/src/main.c rename to build/systemMenu_RED/Launcher/ARM9/src/main.c index 3f34c0ea..6d7dc103 100644 --- a/build/systemMenu_RED/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -16,11 +16,9 @@ *---------------------------------------------------------------------------*/ #include -#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 ) diff --git a/build/systemMenu_RED/ARM9/src/mainFunc.c b/build/systemMenu_RED/Launcher/ARM9/src/misc.c similarity index 67% rename from build/systemMenu_RED/ARM9/src/mainFunc.c rename to build/systemMenu_RED/Launcher/ARM9/src/misc.c index 3718c83e..f92abe4c 100644 --- a/build/systemMenu_RED/ARM9/src/mainFunc.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/misc.c @@ -1,6 +1,6 @@ /*---------------------------------------------------------------------------* Project: TwlIPL - File: mainFunc.c + File: misc.c Copyright 2007 Nintendo. All rights reserved. @@ -16,11 +16,6 @@ *---------------------------------------------------------------------------*/ #include -#include -#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が押されていなければ、カウント進行し、10カウントでメニュー選択 - 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 +} diff --git a/build/systemMenu_RED/ARM9/src/main.h b/build/systemMenu_RED/Launcher/ARM9/src/misc.h similarity index 65% rename from build/systemMenu_RED/ARM9/src/main.h rename to build/systemMenu_RED/Launcher/ARM9/src/misc.h index 17714990..67b32bda 100644 --- a/build/systemMenu_RED/ARM9/src/main.h +++ b/build/systemMenu_RED/Launcher/ARM9/src/misc.h @@ -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 #include -#include "misc.h" #define NNS_G2D_UNICODE #include @@ -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__ diff --git a/build/systemMenu_RED/Launcher/Makefile b/build/systemMenu_RED/Launcher/Makefile new file mode 100644 index 00000000..02cacbf9 --- /dev/null +++ b/build/systemMenu_RED/Launcher/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/MachineSettings/ARM9/Makefile b/build/systemMenu_RED/MachineSettings/ARM9/Makefile new file mode 100644 index 00000000..d6497f5f --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/MachineSettings/ARM9/main.rsf b/build/systemMenu_RED/MachineSettings/ARM9/main.rsf new file mode 100644 index 00000000..62ecd99a --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/main.rsf @@ -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 +} diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c new file mode 100644 index 00000000..2ad6773f --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.c @@ -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 +#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; +} + diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.h b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h similarity index 59% rename from build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.h rename to build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h index 7c249495..da904fca 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/DS_Setting.h +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/MachineSetting.h @@ -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 -#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__ diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/tpCalib.c b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c similarity index 61% rename from build/systemMenu_RED/ARM9/src/DS_Setting/tpCalib.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c index cdfbc1fb..e12fc480 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/tpCalib.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/calibrationTP.c @@ -1,6 +1,6 @@ /*---------------------------------------------------------------------------* Project: TwlIPL - File: tpCalib.c + File: calibrationTP.c Copyright 2007 Nintendo. All rights reserved. @@ -16,28 +16,27 @@ *---------------------------------------------------------------------------*/ #include -#include #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; } diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c new file mode 100644 index 00000000..bf346a1c --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -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 +#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ブランク割込チェックのセット +} + diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/AgbLcdSel.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/AgbLcdSel.c similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/AgbLcdSel.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/AgbLcdSel.c diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/autoBoot.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/autoBoot.c similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/autoBoot.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/autoBoot.c diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/font.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/font.c similarity index 96% rename from build/systemMenu_RED/ARM9/src/DS_Setting/font.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/font.c index 748cf7a7..916334ac 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/font.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/old/font.c @@ -18,7 +18,7 @@ #include #include #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; diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/font.h b/build/systemMenu_RED/MachineSettings/ARM9/src/old/font.h similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/font.h rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/font.h diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/misc.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.c similarity index 94% rename from build/systemMenu_RED/ARM9/src/DS_Setting/misc.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.c index 501ee223..7b186a98 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/misc.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.c @@ -32,7 +32,7 @@ // global variable------------------------------ -int (*nowProcess)(void); +int (*g_pNowProcess)(void); //MyTime myTime; //KeyWork pad; diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/misc.h b/build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.h similarity index 94% rename from build/systemMenu_RED/ARM9/src/DS_Setting/misc.h rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.h index f5bf3481..d9f5a2af 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/misc.h +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/old/misc.h @@ -23,7 +23,7 @@ extern "C" { #endif #include -#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----------------------------------- diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/myChar.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/myChar.c similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/myChar.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/myChar.c diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/myFontequ.h b/build/systemMenu_RED/MachineSettings/ARM9/src/old/myFontequ.h similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/myFontequ.h rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/myFontequ.h diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/unicode.c b/build/systemMenu_RED/MachineSettings/ARM9/src/old/unicode.c similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/unicode.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/unicode.c diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/unicode.h b/build/systemMenu_RED/MachineSettings/ARM9/src/old/unicode.h similarity index 100% rename from build/systemMenu_RED/ARM9/src/DS_Setting/unicode.h rename to build/systemMenu_RED/MachineSettings/ARM9/src/old/unicode.h diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c new file mode 100644 index 00000000..ffe1d0e6 --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/selectLanguage.c @@ -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 +#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; +} + + diff --git a/build/systemMenu_RED/ARM9/src/DS_Setting/ownerInfo.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c similarity index 95% rename from build/systemMenu_RED/ARM9/src/DS_Setting/ownerInfo.c rename to build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c index 6d91d5c9..436d49c2 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Setting/ownerInfo.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setOwnerInfo.c @@ -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文字削除 diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c new file mode 100644 index 00000000..db7e1347 --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/setRTC.c @@ -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 +#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を+2000する。 + 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を−2000する。 + 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() ); +} + diff --git a/build/systemMenu_RED/MachineSettings/Makefile b/build/systemMenu_RED/MachineSettings/Makefile new file mode 100644 index 00000000..02cacbf9 --- /dev/null +++ b/build/systemMenu_RED/MachineSettings/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/Makefile b/build/systemMenu_RED/Makefile index 02cacbf9..bcccad8e 100644 --- a/build/systemMenu_RED/Makefile +++ b/build/systemMenu_RED/Makefile @@ -20,7 +20,8 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs #---------------------------------------------------------------------------- -SUBDIRS = ARM9 +SUBDIRS = launcher MachineSettings PictoChat \ + #DS_DownloadPlay #---------------------------------------------------------------------------- diff --git a/build/systemMenu_RED/PictoChat/ARM9/Makefile b/build/systemMenu_RED/PictoChat/ARM9/Makefile new file mode 100644 index 00000000..d0d9a7d7 --- /dev/null +++ b/build/systemMenu_RED/PictoChat/ARM9/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/PictoChat/ARM9/main.rsf b/build/systemMenu_RED/PictoChat/ARM9/main.rsf new file mode 100644 index 00000000..62ecd99a --- /dev/null +++ b/build/systemMenu_RED/PictoChat/ARM9/main.rsf @@ -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 +} diff --git a/build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.c b/build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.c similarity index 74% rename from build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.c rename to build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.c index d6425b6c..1af7577f 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.c +++ b/build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.c @@ -18,8 +18,7 @@ #include #include #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(); } + diff --git a/build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.h b/build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.h similarity index 90% rename from build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.h rename to build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.h index 3b34b21f..eaea9196 100644 --- a/build/systemMenu_RED/ARM9/src/DS_Chat/DS_Chat.h +++ b/build/systemMenu_RED/PictoChat/ARM9/src/PictoChat.h @@ -27,7 +27,8 @@ extern "C" { // define data---------------------------------------------------------- -int DS_ChatMain( void ); +void PictoChatInit( void ); +void PictoChatMain( void ); #ifdef __cplusplus } diff --git a/build/systemMenu_RED/PictoChat/ARM9/src/main.c b/build/systemMenu_RED/PictoChat/ARM9/src/main.c new file mode 100644 index 00000000..21de3807 --- /dev/null +++ b/build/systemMenu_RED/PictoChat/ARM9/src/main.c @@ -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 +#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ブランク割込チェックのセット +} + diff --git a/build/systemMenu_RED/PictoChat/Makefile b/build/systemMenu_RED/PictoChat/Makefile new file mode 100644 index 00000000..02cacbf9 --- /dev/null +++ b/build/systemMenu_RED/PictoChat/Makefile @@ -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 ===== diff --git a/build/systemMenu_RED/ARM9/data/NTR_IPL_font_l.NFTR b/build/systemMenu_RED/data/NTR_IPL_font_l.NFTR similarity index 100% rename from build/systemMenu_RED/ARM9/data/NTR_IPL_font_l.NFTR rename to build/systemMenu_RED/data/NTR_IPL_font_l.NFTR diff --git a/build/systemMenu_RED/ARM9/data/NTR_IPL_font_m.NFTR b/build/systemMenu_RED/data/NTR_IPL_font_m.NFTR similarity index 100% rename from build/systemMenu_RED/ARM9/data/NTR_IPL_font_m.NFTR rename to build/systemMenu_RED/data/NTR_IPL_font_m.NFTR diff --git a/build/systemMenu_RED/ARM9/data/NTR_IPL_font_s.NFTR b/build/systemMenu_RED/data/NTR_IPL_font_s.NFTR similarity index 100% rename from build/systemMenu_RED/ARM9/data/NTR_IPL_font_s.NFTR rename to build/systemMenu_RED/data/NTR_IPL_font_s.NFTR diff --git a/include/sysmenu/machineSettings/common/nitroSettings.h b/include/sysmenu/machineSettings/common/nitroSettings.h index 27cb25c2..9dca4b71 100644 --- a/include/sysmenu/machineSettings/common/nitroSettings.h +++ b/include/sysmenu/machineSettings/common/nitroSettings.h @@ -43,13 +43,8 @@ typedef enum NvLangCode{ LANG_GERMAN =3, // ドイツ語 LANG_ITALIAN =4, // イタリア語 LANG_SPANISH =5, // スペイン語 -#ifdef IPL2_DEST_CHINA - LANG_CHINESE =6, // 中国語 -#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オフセット値のセット diff --git a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h index d79af41a..db5e09b6 100644 --- a/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h +++ b/include/sysmenu/sysmenu_lib/ARM9/sysmenu_api.h @@ -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カードが差さっているか? diff --git a/include/sysmenu/sysmenu_work.h b/include/sysmenu/sysmenu_work.h index db942bc3..593f66ad 100644 --- a/include/sysmenu/sysmenu_work.h +++ b/include/sysmenu/sysmenu_work.h @@ -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共有ワーク領域のアドレスを獲得します。