From 8d101b1842506ed6d294fb2641d8b171c2132f1b Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 14 Nov 2007 13:00:49 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BBsystemMenu=5FRED=E5=86=85=E3=81=AE?= =?UTF-8?q?=E5=90=84=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB=E3=81=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=97=E3=81=A6=E3=81=84=E3=82=8Bmisc.h,=20misc.c?= =?UTF-8?q?=20=E3=80=80=E3=82=92=E7=8B=AC=E7=AB=8B=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80"misc"=E3=81=AB=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E3=81=97=E3=81=A6=E3=80=81=E7=9A=86=E3=81=8C=E3=81=9D?= =?UTF-8?q?=E3=82=8C=E3=82=92=E7=B5=84=E3=81=BF=E8=BE=BC=E3=82=80=E3=82=88?= =?UTF-8?q?=E3=81=86=E5=A4=89=E6=9B=B4=E3=80=82=20=E3=83=BBhyena.TWL?= =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=8D=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=A7=E3=83=9E=E3=82=A4=E3=82=B3=E3=83=B3=E3=81=AB=E3=82=BB?= =?UTF-8?q?=E3=83=83=E3=83=88=E3=81=99=E3=82=8B=E3=83=9B=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=82=B9=E3=82=BF=E3=83=BC=E3=83=88=E5=88=A4=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82=20=E3=83=BBsystemMenu=E3=83=A1?= =?UTF-8?q?=E3=83=A2=E3=83=AA=E3=83=9E=E3=83=83=E3=83=97=E3=81=AE=E3=82=B7?= =?UTF-8?q?=E3=82=B9=E3=83=86=E3=83=A0=E9=A0=98=E5=9F=9F=E3=82=AF=E3=83=AA?= =?UTF-8?q?=E3=82=A2=E9=83=A8=E5=88=86=E3=81=AE=E5=A4=89=E6=9B=B4=E3=80=82?= 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@178 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/components/hyena.TWL/src/main.c | 15 +- .../libraries_sysmenu/boot/ARM7/src/bootAPI.c | 2 + build/systemMenu_RED/Launcher/ARM9/Makefile | 30 +- .../Launcher/ARM9/src/launcher.c | 11 +- build/systemMenu_RED/Launcher/ARM9/src/main.c | 42 +- build/systemMenu_RED/Launcher/ARM9/src/misc.h | 156 ---- .../MachineSettings/ARM9/Makefile | 9 +- .../MachineSettings/ARM9/src/main.c | 4 +- .../MachineSettings/ARM9/src/misc.c | 770 ------------------ build/systemMenu_RED/PictoChat/ARM9/Makefile | 8 +- .../systemMenu_RED/PictoChat/ARM9/src/main.c | 1 - .../ARM9/src => misc/include}/misc.h | 2 - .../{Launcher/ARM9 => misc}/src/misc.c | 222 +++-- doc/TWL_SystemMenuメモリマップ.vsd | Bin 266752 -> 266752 bytes include/sysmenu/sysmenu_work.h | 4 +- 15 files changed, 198 insertions(+), 1078 deletions(-) delete mode 100644 build/systemMenu_RED/Launcher/ARM9/src/misc.h delete mode 100644 build/systemMenu_RED/MachineSettings/ARM9/src/misc.c rename build/systemMenu_RED/{MachineSettings/ARM9/src => misc/include}/misc.h (95%) rename build/systemMenu_RED/{Launcher/ARM9 => misc}/src/misc.c (76%) diff --git a/build/components/hyena.TWL/src/main.c b/build/components/hyena.TWL/src/main.c index ce734fce..10de2a6e 100644 --- a/build/components/hyena.TWL/src/main.c +++ b/build/components/hyena.TWL/src/main.c @@ -33,8 +33,9 @@ #include #include #include -#include "nvram_sp.h" +#include #include +#include /*---------------------------------------------------------------------------* 萔` @@ -81,7 +82,17 @@ TwlSpMain(void) // OS OS_Init(); PrintDebugInfo(); - + + // Cold/HotX^[g + if( *(vu32 *)HW_RESET_PARAMETER_BUF == 0 ) { // NANDt@[񂱂̃obt@Ƀ}CRt[WX^lZbgĂ + u32 data = 1; + MCU_SetFreeRegisters( 0, (u8 *)&data, 4 ); // }CRt[WX^ɃzbgX^[gtOZbg + SYSM_GetWork()->isHotStart = FALSE; + }else { + SYSM_GetWork()->isHotStart = TRUE; + } + SYSM_GetWork()->isARM9Start = TRUE; // HW_RED_RESERVEDNANDt@[ŃNAĂė~ + // q[v̈ݒ { void *wram = OS_GetWramSubPrivArenaHi(); diff --git a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c index 60365022..b3c6387c 100644 --- a/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c +++ b/build/libraries_sysmenu/boot/ARM7/src/bootAPI.c @@ -80,6 +80,8 @@ static void BOOTi_ClearREG_RAM( void ) reg_SPI_SPICNT = 0; reg_PXI_MAINP_FIFO_CNT = 0x4008; + *(vu32 *)HW_RESET_PARAMETER_BUF = 0; // Zbgobt@NA + // NAĂȂWX^́AVCOUNT, JOY, PIFCNT, MC-, EXMEMCNT, IME, PAUSE, POWLCDCNT, ZLeBnłB (void)OS_ResetRequestIrqMask((u16)~0); } diff --git a/build/systemMenu_RED/Launcher/ARM9/Makefile b/build/systemMenu_RED/Launcher/ARM9/Makefile index 17e305ae..967679d9 100644 --- a/build/systemMenu_RED/Launcher/ARM9/Makefile +++ b/build/systemMenu_RED/Launcher/ARM9/Makefile @@ -16,9 +16,10 @@ # $Author: $ #---------------------------------------------------------------------------- -SUBDIRS = ../../../libraries_sysmenu/sysmenu \ - ../../../libraries_sysmenu/boot \ - ../../../components/hyena.TWL +SUBDIRS = \ +# ../../../libraries_sysmenu/sysmenu \ +# ../../../libraries_sysmenu/boot \ +# ../../../components/hyena.TWL #---------------------------------------------------------------------------- @@ -26,21 +27,24 @@ TARGET_FIRM = SYSTEMMENU TARGET_PLATFORM = TWL TWL_ARCHGEN = LIMITED +TITLEID_LO = LNCR +TARGET_WAD = $(BINDIR)/$(TITLEID_LO).wad + TARGET_BIN = main.srl LCFILE_SPEC = ARM9-TS.lsf ROM_SPEC = main.rsf LOGO_DIR = Logo +MISC_DIR = ../../misc SRCS_LOGO = logoDemo.c logoData.c -SRCS = main.c launcher.c misc.c $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO)) -#SRCS_OVERLAY = +SRCS = main.c launcher.c \ + $(addprefix $(LOGO_DIR)/, $(SRCS_LOGO)) \ + $(MISC_DIR)/src/misc.c -LINCLUDES = $(SRCDIR)/$(LOGO_DIR) -#LLIBRARY_DIRS = -#LLIBRARIES = -#LDEPENDS_NEF = +LINCLUDES = $(MISC_DIR)/include \ + $(SRCDIR)/$(LOGO_DIR) LLIBRARIES += libnam$(TWL_LIBSUFFIX).a \ libese$(TWL_LIBSUFFIX).a @@ -50,11 +54,15 @@ ADDRESS_DTCM = 0x0e000000 DEFAULT_COMP_ARM7 = hyena DEFAULT_MAKEROM_ARM7_BASE = $(TWLIPL_ROOT)/components/$(DEFAULT_COMP_ARM7)/$(TWL_BUILDTYPE_ARM7)/$(DEFAULT_COMP_ARM7) -MAKEROM_FLAGS += -F +MAKEROM_FLAGS += -F include $(TWLIPL_ROOT)/build/buildtools/commondefs -MAKELCF_FLAGS += -DADDRESS_BOOTCORE='0x02e7fc00' +MAKELCF_FLAGS += -DADDRESS_BOOTCORE='0x02e7fc00' + +LDIRT_CLEAN = $(TARGET_WAD) +INSTALL_TARGETS = $(TARGET_WAD) +INSTALL_DIR = $(SDK_NMENU_DATADIR) #---------------------------------------------------------------------------- diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index 8f630d19..bae9f0ee 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -38,6 +38,9 @@ static void DrawBackLightSwitch(void); static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu); // global variable ------------------------------------- +RTCDrawProperty g_rtcDraw = { + TRUE, RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y +}; // static variable ------------------------------------- static int s_csr = 0; // j[̃J[\ʒu @@ -267,7 +270,7 @@ void LauncherInit( TitleProperty *pTitleList ) SVC_CpuClear( 0x0000, &tpd, sizeof(TpWork), 16 ); - InitGetAndDrawRtcData( RTC_DATE_TOP_X, RTC_DATE_TOP_Y, RTC_TIME_TOP_X, RTC_TIME_TOP_Y ); + GetAndDrawRTCData( &g_rtcDraw, TRUE ); GX_SetVisiblePlane( GX_PLANEMASK_BG0 ); GX_DispOn(); @@ -295,14 +298,14 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) DrawBackLightSwitch(); // RTC̎擾\ - GetAndDrawRtcData(); + GetAndDrawRTCData( &g_rtcDraw, FALSE ); //-------------------------------------- // obNCgON,OFF //-------------------------------------- if(tpd.disp.touch) { - BOOL range = InRangeTp( B_LIGHT_BUTTON_TOP_X*8, B_LIGHT_BUTTON_TOP_Y*8-4, - B_LIGHT_BUTTON_BOTTOM_X*8, B_LIGHT_BUTTON_BOTTOM_Y*8-4, &tpd.disp ); + BOOL range = WithinRangeTP( B_LIGHT_BUTTON_TOP_X * 8, B_LIGHT_BUTTON_TOP_Y * 8 - 4, + B_LIGHT_BUTTON_BOTTOM_X * 8, B_LIGHT_BUTTON_BOTTOM_Y * 8 - 4, &tpd.disp ); if( range && !touch_bl ) { touch_bl = TRUE; tp_bl_on_off = TRUE; diff --git a/build/systemMenu_RED/Launcher/ARM9/src/main.c b/build/systemMenu_RED/Launcher/ARM9/src/main.c index c0771ebf..ed330458 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/main.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/main.c @@ -25,13 +25,10 @@ // define data----------------------------------------------------------------- // function's prototype------------------------------------------------------- -static void InitAllocator( NNSFndAllocator* pAllocator ); -static void InitAllocSystem( void ); static BOOL CheckBootStatus( void ); static void INTR_VBlank( void ); // global variable------------------------------------------------------------- -NNSFndAllocator g_allocator; // static variable------------------------------------------------------------- @@ -74,12 +71,10 @@ void TwlMain( void ) (void)GX_VBlankIntr(TRUE); // VXȅ---------------- - InitAllocator( &g_allocator ); - CMN_InitFileSystem( &g_allocator ); + InitAllocator(); + // ep[^̎擾-------- SYSM_ReadParameters(); - - // Zbgp[^̎擾-------- if( SYSM_GetResetParam()->flags.isLogoSkip ) { if( SYSM_GetResetParam()->bootTitleID ) { // AvڋN̎w肪烍Sf΂ĎwAvN pBootTitle = (TitleProperty *)SYSM_GetResetParam(); @@ -102,7 +97,7 @@ void TwlMain( void ) OS_WaitIrq(1, OS_IE_V_BLANK); // VuN荞ݑ҂ ReadKeyPad(); // L[͂̎擾 - ReadTpData(); // TP͂̎擾 + ReadTP(); // TP͂̎擾 (void)SYSM_GetCardTitleList( pTitleList ); // J[hAvXg̎擾iXbhŐJ[h}ʒm̂C[vŎ擾j @@ -144,37 +139,6 @@ void TwlMain( void ) } -// AP[^̏ -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, 32); -} - - -// 蓖 -void *Alloc( u32 size ) -{ - return NNS_FndAllocFromAllocator( &g_allocator, size ); -} - - -// -void Free( void *pBuffer ) -{ - NNS_FndFreeToAllocator( &g_allocator, pBuffer ); -} - - // u[gԂmFAS\L𔻒f------- static BOOL CheckBootStatus(void) { diff --git a/build/systemMenu_RED/Launcher/ARM9/src/misc.h b/build/systemMenu_RED/Launcher/ARM9/src/misc.h deleted file mode 100644 index db4fff88..00000000 --- a/build/systemMenu_RED/Launcher/ARM9/src/misc.h +++ /dev/null @@ -1,156 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlIPL - File: misc.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 __MISC_H__ -#define __MISC_H__ - -#include -#include - -#define NNS_G2D_UNICODE -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// define data---------------------------------------------------------- -#define TP_CSR_TOUCH_COUNT 2 // TPJ[\̃`^Oẑ߂̃JEgl -#define TP_CSR_DETACH_COUNT 2 // TPJ[\uIvƔ肷TPf^b`̃JEgl - -// DrawText ł̍ -#define TXT_DRAWTEXT_FLAG_DEFAULT (NNS_G2D_VERTICALORIGIN_TOP | NNS_G2D_HORIZONTALORIGIN_LEFT | NNS_G2D_HORIZONTALALIGN_LEFT) - -// TXTColorPalette ̐F 16Fpbgւ̃[hz -enum -{ - // pbg0 TXT_CPALETTE_MAIN - TXT_COLOR_NULL=0, - TXT_COLOR_WHITE, - TXT_COLOR_BLACK, - TXT_COLOR_RED, - TXT_COLOR_GREEN, - TXT_COLOR_BLUE, - TXT_COLOR_CYAN, - TXT_COLOR_MAGENTA, - TXT_COLOR_YELLOW, - - // pbg1 TXT_CPALETTE_USERCOLOR - TXT_UCOLOR_NULL=0, - TXT_UCOLOR_GRAY, - TXT_UCOLOR_BROWN, - TXT_UCOLOR_RED, - TXT_UCOLOR_PINK, - TXT_UCOLOR_ORANGE, - TXT_UCOLOR_YELLOW, - TXT_UCOLOR_LIMEGREEN, - TXT_UCOLOR_DARKGREEN, - TXT_UCOLOR_SEAGREEN, - TXT_UCOLOR_TURQUOISE, - TXT_UCOLOR_BLUE, - TXT_UCOLOR_DARKBLUE, - TXT_UCOLOR_PURPLE, - TXT_UCOLOR_VIOLET, - TXT_UCOLOR_MAGENTA, - - // pbg TXT_CPALETTE_4BPP - TXT_COLOR_4BPP_NULL=0, - TXT_COLOR_4BPP_BG=1, - TXT_COLOR_4BPP_TEXT=1 -}; - - -// v\ꏊ -#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 ) - - -// L[f[^[N -typedef struct { - u16 trg; // gK - u16 cont; // x^ -}KeyWork; - - -// ^b`pl[N -typedef struct { - int detached; // ̃f[^͂Ń^b`ꂽƂB - TPData disp; // ̓͒liLCDWj - TPData raw; // ̓͒liTP Wj - TPData last; // O̓͒liLCDWj -}TpWork; - - -// j[vfW -typedef struct MenuPos { - BOOL enable; - int x; - int y; -}MenuPos; - - -// j[\p[^\ -typedef struct MenuParam { - int num; - int normal_color; - int select_color; - int disable_color; - MenuPos *pos; - const u16 **str_elem; -}MenuParam; - - -// global variables-------------------------------------------------- -extern TpWork tpd; // ^b`plf[^ -extern KeyWork pad; // L[pbh̓f[^ -extern const u8 *const g_strWeek[ 7 ]; // j - -extern NNSFndAllocator g_allocator; // AP[^ -extern NNSG2dFont gFont; // tHg -extern NNSG2dCharCanvas gCanvas; // CharCanvas -extern NNSG2dTextCanvas gTextCanvas; // TextCanvas - -// function------------------------------------------------------------- -void *Alloc( u32 size ); -void Free( void *pBuffer ); - -void InitBG( void ); -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 ); -BOOL WaitDetachTP( void ); -void StartDetachTP( void ); -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 // __MISC_H__ diff --git a/build/systemMenu_RED/MachineSettings/ARM9/Makefile b/build/systemMenu_RED/MachineSettings/ARM9/Makefile index ed126076..9fd57652 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/Makefile +++ b/build/systemMenu_RED/MachineSettings/ARM9/Makefile @@ -31,8 +31,13 @@ TARGET_BIN = main.srl ROM_SPEC = main.rsf -SRCS = main.c misc.c \ - MachineSetting.c setRTC.c selectLanguage.c calibrationTP.c setOwnerInfo.c +MISC_DIR = ../../misc + +SRCS = main.c MachineSetting.c \ + setRTC.c selectLanguage.c calibrationTP.c setOwnerInfo.c \ + $(MISC_DIR)/src/misc.c + +LINCLUDES = $(MISC_DIR)/include include $(TWLIPL_ROOT)/build/buildtools/commondefs diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c index 32921511..0d595896 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/main.c +++ b/build/systemMenu_RED/MachineSettings/ARM9/src/main.c @@ -65,16 +65,16 @@ void TwlMain(void) // VXȅ------------------ InitAllocator(); - SYSM_SetAllocFunc( Alloc, Free ); // {Ȃ烉`[̃p[^`FbNsA // NV[PXɓpX // TWLݒ̃[h + SYSM_SetAllocFunc( Alloc, Free ); // SYSM_ReadTWLSettingsFile()̎sɕKvB if( SYSM_ReadTWLSettingsFile() ) { SYSM_CaribrateTP(); } - + { // t@CVXe؂ւ}u FS_IdentifyTitle(0x4d534554);//MSET diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c b/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c deleted file mode 100644 index 02d382e0..00000000 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.c +++ /dev/null @@ -1,770 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlIPL - File: misc.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" - -// define data----------------------------------------------------------------- -#define NTR_IPL_FONT_DATA "data/NTR_IPL_font_m.NFTR" - -#define STRING_LENGTH_MAX 256 - -#define GRAY(x) GX_RGB(x, x, x) - -enum -{ - TXT_CPALETTE_MAIN, - TXT_CPALETTE_USERCOLOR, - TXT_CPALETTE_USERCOLORSAMPLE1, - TXT_CPALETTE_USERCOLORSAMPLE2, - TXT_CPALETTE_4BPP, - TXT_NUM_CPALEETE -}; - -// fʂ̃J[pbg -GXRgb TXTColorPalette[TXT_NUM_CPALEETE * 16] = -{ - GX_RGB(31, 31, 31), GX_RGB(31, 31, 31), GX_RGB( 0, 0, 0), GX_RGB(31, 0, 0),// {F - 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), - - GX_RGB( 0, 0, 0), GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3),// [U[J[̈ - GX_RGB(31, 17, 31), GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0), - GX_RGB( 0, 20, 7), GX_RGB( 9, 27, 17), GX_RGB( 6, 23, 30), GX_RGB( 0, 11, 30), - GX_RGB( 0, 0, 18), GX_RGB(17, 0, 26), GX_RGB(26, 0, 29), GX_RGB(31, 0, 18), - - GX_RGB( 0, 0, 0), GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3),// [U[J[̃Tv̈Q - GX_RGB(31, 17, 31), GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0), - GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3), GX_RGB(31, 17, 31), - GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0), GX_RGB( 0, 31, 0), - - GX_RGB( 0, 0, 0), GX_RGB(12, 16, 19), GX_RGB(23, 9, 0), GX_RGB(31, 0, 3),// [U[J[̃Tv̈P - GX_RGB(31, 17, 31), GX_RGB(31, 18, 0), GX_RGB(30, 28, 0), GX_RGB(21, 31, 0), - GX_RGB( 0, 20, 7), GX_RGB( 9, 27, 17), GX_RGB( 6, 23, 30), GX_RGB( 0, 11, 30), - GX_RGB( 0, 0, 18), GX_RGB(17, 0, 26), GX_RGB(26, 0, 29), GX_RGB(31, 0, 18), - - GRAY(31), GRAY(29), GRAY(27), GRAY(25), - GRAY(23), GRAY(21), GRAY(19), GRAY(17), - GRAY(15), GRAY(14), GRAY(12), GRAY(10), - GRAY( 8), GRAY( 6), GRAY( 3), GRAY( 0), -}; - -// Ofpbg邽߂̃}N -#define MAKECOLOR(r,g,b) GX_RGB( 0, 0, 0), GX_RGB(r, g, b), MC(r,g,b,1), MC(r,g,b,2),\ - MC(r,g,b,3), MC(r,g,b,4), MC(r,g,b,5), MC(r,g,b,6),\ - MC(r,g,b,7), MC(r,g,b,8), MC(r,g,b,9), MC(r,g,b,10),\ - MC(r,g,b,11), MC(r,g,b,12), MC(r,g,b,13), GX_RGB(31, 31, 31) - -#define MC(r,g,b,i) GX_RGB(r+((31-r)*i)/14, g+((31-g)*i)/14, b+((31-b)*i)/14) - -// [U[J[pbg؂ւp -GXRgb TempPalette[16 * 16] = -{ - MAKECOLOR(12, 16, 19), - MAKECOLOR(23, 9, 0), - MAKECOLOR(31, 0, 3), - MAKECOLOR(31, 17, 31), - MAKECOLOR(31, 18, 0), - MAKECOLOR(30, 28, 0), - MAKECOLOR(21, 31, 0), - MAKECOLOR( 0, 31, 0), - MAKECOLOR( 0, 20, 7), - MAKECOLOR( 9, 27, 17), - MAKECOLOR( 6, 23, 30), - MAKECOLOR( 0, 11, 30), - MAKECOLOR( 0, 0, 18), - MAKECOLOR(17, 0, 26), - MAKECOLOR(26, 0, 29), - MAKECOLOR(31, 0, 18), -}; - -// BGLN^ -const unsigned int bg_char_data[16 * 3] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000,// 0000h - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x11111111, 0x44444444, 0x77777777, 0x99999999,// 0001h - 0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xcccccccc, - 0xdddddddd, 0xdddddddd, 0xdddddddd, 0xeeeeeeee,// 0002h - 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, 0xeeeeeeee, - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,// 0003h - 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, -}; - -// extern data----------------------------------------------------------------- - -// define data----------------------------------------------------------------- -#define CANVAS_WIDTH 32 // `̕ (LN^P) -#define CANVAS_HEIGHT 24 // `̍ (LN^P) -#define CANVAS_LEFT 0 // `̈ʒuX (LN^P) -#define CANVAS_TOP 0 // `̈ʒuY (LN^P) - -#define TEXT_HSPACE 1 // `掞̕ (sNZP) -#define TEXT_VSPACE 1 // `掞̍s (sNZP) - -#define CHARACTER_OFFSET 0 // gpLN^̊Jnԍ - -// RTCf[^\ʒu[N -typedef struct RtcDrawPos{ - int date_x; - int date_y; - int time_x; - int time_y; -}RtcDrawPos; - -// function's prototype------------------------------------------------------- -static BOOL WaitDetachTP( void ); -static void StartDetachTP( void ); -static void InitScreen( void ); -static void InitCanvas( void ); - -// global variable------------------------------------------------------------- -KeyWork pad; // L[pbh̓f[^ -TpWork tpd; // ^b`pl̓f[^ -NNSFndAllocator g_allocator; // AP[^ -NNSG2dFont gFont; // tHg -NNSG2dCharCanvas gCanvas; // CharCanvas -NNSG2dTextCanvas gTextCanvas; // TextCanvas -NNSG2dCharCanvas gCanvasSub; // CharCanvas -NNSG2dTextCanvas gTextCanvasSub; // TextCanvas - -// static variable------------------------------------------------------------- -static int s_detach_count; -static RtcDrawPos s_rtcPos; -static RTCDate s_rtcDate; -static RTCTime s_rtcTime; -static u16 s_vcount; - - -static const u16 sScrnBuf[32 * 32]= -{ - 0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,//0 - 0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001, - 0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,//1 - 0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//2 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//3 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//4 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//5 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//6 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//7 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//8 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//9 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//10 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//11 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//12 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//13 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//14 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//15 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//16 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//17 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//18 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//19 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//20 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//21 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,//22 - 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802, - 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//23 - 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801, -};// Buffer for screen data(wi̘g) - -static char s_strBuffer[ STRING_LENGTH_MAX * 2 ] ATTRIBUTE_ALIGN(2); -static u16 s_strBufferUTF16[ STRING_LENGTH_MAX ]; - -// const data------------------------------------------------------------------ - -// jf[^\pR[h -const u8 *const g_strWeek[] ATTRIBUTE_ALIGN(2) = { - (const u8 *)"SUN", - (const u8 *)"MON", - (const u8 *)"TUE", - (const u8 *)"WED", - (const u8 *)"THU", - (const u8 *)"FRI", - (const u8 *)"SAT", -}; - - -// ============================================================================ -// Ǘ -// ============================================================================ - -// AP[^̏ -void InitAllocator( void ) -{ - NNSFndAllocator *pAllocator = &g_allocator; - 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, 32 ); -} - - -// 蓖 -void *Alloc( u32 size ) -{ - return NNS_FndAllocFromAllocator( &g_allocator, size ); -} - - -// -void Free( void *pBuffer ) -{ - NNS_FndFreeToAllocator( &g_allocator, pBuffer ); -} - - -// ============================================================================ -// ʐݒ -// ============================================================================ - -// BG -void InitBG(void) -{ - // OFF - GX_DispOff(); - GXS_DispOff(); - - // VRAM̊蓖ĂSĉ - GX_DisableBankForBG(); - GX_DisableBankForOBJ(); - GX_DisableBankForSubBG(); - GX_DisableBankForSubOBJ(); - - // C2DGW̏o͂ʂ - GX_SetDispSelect( GX_DISP_SELECT_SUB_MAIN ); - - // CLCD - { - // VRAM蓖 - GX_SetBankForBG ( GX_VRAM_BG_128_A ); - GX_SetBankForOBJ( GX_VRAM_OBJ_128_B ); - - MI_CpuClearFast( (void *)HW_BG_VRAM, 0x20000 ); // BG -VRAM NA - MI_CpuClearFast( (void *)HW_OBJ_VRAM, 0x20000 ); // OBJ-VRAM NA - - // J[pbgݒ - GX_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) ); - - // BG[hݒ - GX_SetGraphicsMode( GX_DISPMODE_GRAPHICS, GX_BGMODE_0, GX_BG0_AS_2D ); - - GX_SetBGScrOffset ( GX_BGSCROFFSET_0x10000 ); - GX_SetBGCharOffset( GX_BGCHAROFFSET_0x00000 ); - } - // TuLCD - { - // 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 - - MI_CpuClearFast( (void *)HW_DB_BG_VRAM, 0x20000 ); // BG -VRAM NA - MI_CpuClearFast( (void *)HW_DB_OBJ_VRAM, 0x20000 ); // OBJ -VRAM NA - - // J[pbgݒ - GXS_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) ); - - // BG[hݒ - GXS_SetGraphicsMode( GX_BGMODE_0 ); // BGMODE is 0 - } - InitScreen(); - InitCanvas(); -} - - -// XN[ -static void InitScreen( void ) -{ - // C BG 0 ݒ - G2_SetBG0Control( - GX_BG_SCRSIZE_TEXT_256x256, // XN[TCY 256x256 - GX_BG_COLORMODE_256, // J[[h 256F - GX_BG_SCRBASE_0xf800, // XN[x[X - GX_BG_CHARBASE_0x00000, // LN^x[X - GX_BG_EXTPLTT_01 // gpbgXbg - ); - G2_SetBG1Control( - GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text - GX_BG_COLORMODE_16, // use 16 colors mode - GX_BG_SCRBASE_0xf000, // screen base offset + 0x0000 is the address for BG #1 screen - GX_BG_CHARBASE_0x10000, // character base offset + 0x04000 is the address for BG #0 characters - GX_BG_EXTPLTT_01 // use BGExtPltt slot #0 if BGExtPltt is enabled - ); - GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG1); - G2_SetBG0Priority(0); - G2_SetBG1Priority(1); - - GX_LoadBG1Char(bg_char_data, 0, sizeof(bg_char_data)); - GX_LoadBG1Scr(sScrnBuf, 0, sizeof(sScrnBuf)); - - // Tu BG 0 ݒ - G2S_SetBG0Control( - GX_BG_SCRSIZE_TEXT_256x256, // 256pix x 256pix text - GX_BG_COLORMODE_16, // use 16 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 -} - - -// `̏ -static void InitCanvas( void ) -{ - CMN_InitFileSystem( &g_allocator ); - - // tHgǂݍ݂܂ - { - void* pFontFile; - u32 size = CMN_LoadFile( &pFontFile, NTR_IPL_FONT_DATA, &g_allocator); - NNS_G2D_ASSERT( size > 0 ); - NNS_G2dFontInitUTF16(&gFont, pFontFile); -// NNS_G2dPrintFont(&gFont); - } - - { - // CharCanvas ̏ - NNS_G2dCharCanvasInitForBG( - &gCanvas, - (GXCharFmt256*)G2_GetBG0CharPtr() + CHARACTER_OFFSET, - CANVAS_WIDTH, - CANVAS_HEIGHT, - NNS_G2D_CHARA_COLORMODE_256 - ); - - // TextCanvas̏ - NNS_G2dTextCanvasInit( - &gTextCanvas, - &gCanvas, - &gFont, - TEXT_HSPACE, - TEXT_VSPACE - ); - - // XN[ݒ - 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 - ); - - // XN[ݒ - NNS_G2dMapScrToCharText( - G2S_GetBG0ScrPtr(), - CANVAS_WIDTH, - CANVAS_HEIGHT, - CANVAS_LEFT, - CANVAS_TOP, - NNS_G2D_TEXT_BG_WIDTH_256, - CHARACTER_OFFSET, - TXT_CPALETTE_MAIN - ); - } -} - - -// UTF16ł̒ڕ\ -void PutStringUTF16( int x, int y, int color, const u16 *strUTF16 ) -{ - NNS_G2dTextCanvasDrawText( &gTextCanvas, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT, - strUTF16 ); -} - -void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 ) -{ - NNS_G2dTextCanvasDrawText( &gTextCanvasSub, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT, - strUTF16 ); -} - - -// tō쐬\ꍇ̕擾 -int GetPrintfWidth( const NNSG2dTextCanvas *pCanvas, 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; - - return NNS_G2dTextCanvasGetTextWidth( pCanvas, s_strBufferUTF16 ); -} - - -// SJISPrintf`ŕ\iUTF16ɕϊ) -void PrintfSJIS( 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(&gTextCanvas, x, y, color, TXT_DRAWTEXT_FLAG_DEFAULT, - 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 ); -} - - -// L[͓ǂݏo-------------------------------- -void ReadKeyPad(void) -{ - u16 readData = PAD_Read(); - pad.trg = (u16)(readData & (readData ^ pad.cont)); // gK - pad.cont = readData; // x^ -} - - -// ^b`plf[^̎擾----------------------- -void ReadTP(void) -{ - TP_GetCalibratedPoint( &tpd.last, &tpd.raw ); // OTPf[^ޔ - - if( TP_RequestRawSampling(&tpd.raw) ) { // ^b`pl̃TvO - SVC_CpuClear(0x0000, &tpd.raw, sizeof(tpd.raw), 16); // SPI-busyŃf[^擾Ɏśhf[^ȂhŃ^[B - return; - } - TP_GetCalibratedPoint( &tpd.disp, &tpd.raw ); // TPWLCDWɕϊB - - if( !WaitDetachTP() ) { // TPf^b`҂sB - SVC_CpuClear(0x0000, &tpd.disp, sizeof(tpd.disp), 16); // SPI-busyŃf[^擾Ɏśhf[^ȂhŃ^[B - return; - } -#if 1 - if(tpd.disp.touch) { // ݂TPf[^\ - switch ( tpd.disp.validity ) { - case TP_VALIDITY_VALID: - OS_Printf("( %3d, %3d ) -> ( %3d, %3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y); - break; - case TP_VALIDITY_INVALID_X: - OS_Printf("( *%3d, %3d ) -> ( *%3d, %3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y); - break; - case TP_VALIDITY_INVALID_Y: - OS_Printf("( %3d, *%3d ) -> ( %3d, *%3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y); - break; - case TP_VALIDITY_INVALID_XY: - OS_Printf("( *%3d, *%3d ) -> ( *%3d, *%3d )\n", tpd.raw.x, tpd.raw.y, tpd.disp.x, tpd.disp.y); - break; - } - } -#endif -} - - -// TPf^b`҂ -static BOOL WaitDetachTP( void ) -{ - // s_detach_countnĂAJEgB - if(s_detach_count > 0) { - if(tpd.disp.touch == 0) { // TPĂȂ΁AJEgisKlōē͂󂯕tB - s_detach_count--; - }else { - s_detach_count = TP_CSR_DETACH_COUNT; - } - return FALSE; - } - return TRUE; -} - - -// TPf^b`҂̊Jn -static void StartDetachTP( void ) -{ - s_detach_count = TP_CSR_DETACH_COUNT; -} - - -//====================================================== -// j[ -//====================================================== - -// j[` -void DrawMenu( u16 nowCsr, const MenuParam *pMenu ) -{ - int i; - int color; - - for( i = 0; i < pMenu->num; i++ ) { - if(i == nowCsr) { - if( !pMenu->pos[ i ].enable ) { - color = pMenu->disable_color; - }else { - color = pMenu->select_color; - } - }else { - color = pMenu->normal_color; - } - PutStringUTF16( pMenu->pos[ i ].x, pMenu->pos[ i ].y, color, (pMenu->str_elem)[ i ] ); - } -} - - -// ^b`plɂ郁j[I -BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu ) -{ - u16 i; - TPData *target; - static u16 detach_count = 0; - static u16 csr_old = 0xff; - static u16 same_csr_count = 0; - - // detach_countnĂAJEgB - if( detach_count > 0 ) { - if( tpd.disp.touch == 0 ) { // TPĂȂ΁AJEgisAPOJEgŃj[I - if( ++detach_count == TP_CSR_DETACH_COUNT ) { - detach_count = 0; - return TRUE; - }else { - return FALSE; - } - } - } - detach_count=0; // detachJEgl̃NA - - // ʏ́ATPf[^j[ɂ邩ǂ𔻒B - if( tpd.disp.touch ) target = &tpd.disp; - else target = &tpd.last; - - for( i = 0; i < pMenu->num; i++ ) { - if( tpd.disp.touch ) { // ^b`plj[̗vfŃ^b`ĂȂA - NNSG2dTextRect rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, (pMenu->str_elem)[ i ] ); - u16 top_x = (u16)( pMenu->pos[ i ].x ); // j[vfLCDWZo - u16 top_y = (u16)( pMenu->pos[ i ].y ); - u16 bottom_x = (u16)( top_x + rect.width ); - u16 bottom_y = (u16)( top_y + rect.height ); - - OS_TPrintf( "MENU[ %d ] : top_x = %02d top_y = %02d bot_x = %02d bot_y = %02d : ", - i, top_x, top_y, bottom_x, bottom_y ); - - if( WithinRangeTP( top_x, top_y, bottom_x, bottom_y, target ) ) { - OS_TPrintf( "InRange\n" ); - if( tpd.disp.validity == TP_VALIDITY_VALID ) { // J[\̗vfɈړ - 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 { - OS_TPrintf( "OutRange\n" ); - } - }else { // touch==0 - if( same_csr_count == TP_CSR_TOUCH_COUNT ) { - detach_count = 1; - break; - } - } - } - same_csr_count = 0; - return FALSE; -} - - -// ݂̃^b`plWẅɂ邩ǂԂB -BOOL WithinRangeTP( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt ) -{ - if( ( tgt->x >= top_x ) && - ( tgt->x <= bottom_x ) && - ( tgt->y >= top_y ) && - ( tgt->y <= bottom_y ) ) { - OS_TPrintf( "\nRANGE : tx=%3d ty=%3d bx=%3d by=%3d : x=%3d y=%3d\n", - top_x, top_y, bottom_x, bottom_y, tgt->x, tgt->y ); - return TRUE; - }else { - return FALSE; - } -} - - -// oi[ACROBJ̃[h -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 -} - - -//=============================================== -// RTCANZX[` -//=============================================== - -// RTCf[^̎擾 -BOOL GetRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ) -{ - if( forceGetFlag || ( pRTCDraw->vcount++ == 59 ) ) { - pRTCDraw->vcount = 0; - MI_CpuCopy16( &pRTCDraw->date, &pRTCDraw->date_old, sizeof(RTCDate) ); - MI_CpuCopy16( &pRTCDraw->time, &pRTCDraw->time_old, sizeof(RTCTime) ); - (void)RTC_GetDateTime( &pRTCDraw->date, &pRTCDraw->time ); - return TRUE; - } - return FALSE; -} - - -// RTCf[^̕\ -void DrawRTCData( RTCDrawProperty *pRTCDraw ) -{ - void (*pPrintFunc)( int x, int y, int color, const char *fmt, ... ) = - ( pRTCDraw->isTopLCD ) ? PrintfSJISSub : PrintfSJIS; - - // ORTC̏ - { - u32 year = pRTCDraw->date_old.year + 2000; - pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_WHITE, "%04d/%02d/%02d[%3s]", - year, - pRTCDraw->date_old.month, - pRTCDraw->date_old.day, - g_strWeek[ pRTCDraw->date_old.week ] - ); - pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d", - pRTCDraw->time_old.hour, - pRTCDraw->time_old.minute, - pRTCDraw->time_old.second - ); - } - // RTC̕\ - { - u32 year = pRTCDraw->date.year + 2000; - pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_BLACK, "%d/%02d/%02d[%3s]", - year, - pRTCDraw->date.month, - pRTCDraw->date.day, - g_strWeek[ pRTCDraw->date.week ] - ); - pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d", - pRTCDraw->time.hour, - pRTCDraw->time.minute, - pRTCDraw->time.second - ); - } -} - -// RTCf[^̎擾&\ -void GetAndDrawRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ) -{ - if( GetRTCData( pRTCDraw, forceGetFlag ) ) { - DrawRTCData( pRTCDraw ); - } -} - -// [U[J[̈̐؂ւ -void ChangeUserColor( u8 col ) -{ - int l; - if(col > 15) return; - for(l=0;l<16;l++) - { - TXTColorPalette[16+l] = TempPalette[16 * col + l]; - } - GX_LoadBGPltt( TXTColorPalette, 0, sizeof(TXTColorPalette) ); -} \ No newline at end of file diff --git a/build/systemMenu_RED/PictoChat/ARM9/Makefile b/build/systemMenu_RED/PictoChat/ARM9/Makefile index 9863bd48..84426682 100644 --- a/build/systemMenu_RED/PictoChat/ARM9/Makefile +++ b/build/systemMenu_RED/PictoChat/ARM9/Makefile @@ -31,11 +31,13 @@ TARGET_BIN = main.srl ROM_SPEC = main.rsf -MISC_DIR = ../../MachineSettings/ARM9/src +MISC_DIR = ../../misc -SRCS = main.c PictoChat.c $(MISC_DIR)/misc.c +SRCS = main.c PictoChat.c \ + $(MISC_DIR)/src/misc.c + +LINCLUDES = $(MISC_DIR)/include -LINCLUDES = $(MISC_DIR) include $(TWLIPL_ROOT)/build/buildtools/commondefs diff --git a/build/systemMenu_RED/PictoChat/ARM9/src/main.c b/build/systemMenu_RED/PictoChat/ARM9/src/main.c index 371d415a..bcdc406d 100644 --- a/build/systemMenu_RED/PictoChat/ARM9/src/main.c +++ b/build/systemMenu_RED/PictoChat/ARM9/src/main.c @@ -60,7 +60,6 @@ void TwlMain(void) // VXȅ------------------ InitAllocator(); - CMN_InitFileSystem( &g_allocator ); { // t@CVXe؂ւ}u diff --git a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h b/build/systemMenu_RED/misc/include/misc.h similarity index 95% rename from build/systemMenu_RED/MachineSettings/ARM9/src/misc.h rename to build/systemMenu_RED/misc/include/misc.h index bac424ba..c2178276 100644 --- a/build/systemMenu_RED/MachineSettings/ARM9/src/misc.h +++ b/build/systemMenu_RED/misc/include/misc.h @@ -76,7 +76,6 @@ enum TXT_COLOR_4BPP_TEXT=1 }; -#define TXT_COLOR_USER 17 // v\ꏊ #define RTC_DATE_TOP_X ( 9 * 8 ) @@ -164,7 +163,6 @@ void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp ); BOOL GetRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ); void DrawRTCData( RTCDrawProperty *pRTCDraw ); void GetAndDrawRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ); -void ChangeUserColor( u8 col ); #ifdef __cplusplus } diff --git a/build/systemMenu_RED/Launcher/ARM9/src/misc.c b/build/systemMenu_RED/misc/src/misc.c similarity index 76% rename from build/systemMenu_RED/Launcher/ARM9/src/misc.c rename to build/systemMenu_RED/misc/src/misc.c index f92abe4c..b04065ff 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/misc.c +++ b/build/systemMenu_RED/misc/src/misc.c @@ -74,14 +74,15 @@ typedef struct RtcDrawPos{ }RtcDrawPos; // function's prototype------------------------------------------------------- +static BOOL WaitDetachTP( void ); +static void StartDetachTP( void ); static void InitScreen( void ); static void InitCanvas( void ); -static void GetAndDrawRtcDataCore( BOOL forceGetFlag ); // global variable------------------------------------------------------------- -KeyWork pad; // L[pbh̓f[^ -TpWork tpd; // ^b`pl̓f[^ - +KeyWork pad; // L[pbh̓f[^ +TpWork tpd; // ^b`pl̓f[^ +NNSFndAllocator g_allocator; // AP[^ NNSG2dFont gFont; // tHg NNSG2dCharCanvas gCanvas; // CharCanvas NNSG2dTextCanvas gTextCanvas; // TextCanvas @@ -111,8 +112,45 @@ const u8 *const g_strWeek[] ATTRIBUTE_ALIGN(2) = { (const u8 *)"SAT", }; + // ============================================================================ -// function's description +// Ǘ +// ============================================================================ + +// AP[^̏ +void InitAllocator( void ) +{ + NNSFndAllocator *pAllocator = &g_allocator; + 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, 32 ); +} + + +// 蓖 +void *Alloc( u32 size ) +{ + return NNS_FndAllocFromAllocator( &g_allocator, size ); +} + + +// +void Free( void *pBuffer ) +{ + NNS_FndFreeToAllocator( &g_allocator, pBuffer ); +} + + +// ============================================================================ +// ʐݒ // ============================================================================ // BG @@ -197,6 +235,8 @@ static void InitScreen( void ) // `̏ static void InitCanvas( void ) { + CMN_InitFileSystem( &g_allocator ); + // tHgǂݍ݂܂ { void* pFontFile; @@ -285,6 +325,24 @@ void PutStringUTF16Sub( int x, int y, int color, const u16 *strUTF16 ) } +// tō쐬\ꍇ̕擾 +int GetPrintfWidth( const NNSG2dTextCanvas *pCanvas, 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; + + return NNS_G2dTextCanvasGetTextWidth( pCanvas, s_strBufferUTF16 ); +} + + // SJISPrintf`ŕ\iUTF16ɕϊ) void PrintfSJIS( int x, int y, int color, const char *fmt, ... ) { @@ -331,7 +389,7 @@ void ReadKeyPad(void) // ^b`plf[^̎擾----------------------- -void ReadTpData(void) +void ReadTP(void) { TP_GetCalibratedPoint( &tpd.last, &tpd.raw ); // OTPf[^ޔ @@ -367,7 +425,7 @@ void ReadTpData(void) // TPf^b`҂ -BOOL WaitDetachTP( void ) +static BOOL WaitDetachTP( void ) { // s_detach_countnĂAJEgB if(s_detach_count > 0) { @@ -383,7 +441,7 @@ BOOL WaitDetachTP( void ) // TPf^b`҂̊Jn -void StartDetachTP( void ) +static void StartDetachTP( void ) { s_detach_count = TP_CSR_DETACH_COUNT; } @@ -444,14 +502,14 @@ BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu ) if( tpd.disp.touch ) { // ^b`plj[̗vfŃ^b`ĂȂA NNSG2dTextRect rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, (pMenu->str_elem)[ i ] ); u16 top_x = (u16)( pMenu->pos[ i ].x ); // j[vfLCDWZo - u16 top_y = (u16)( pMenu->pos[ i ].y - 4 ); + u16 top_y = (u16)( pMenu->pos[ i ].y ); u16 bottom_x = (u16)( top_x + rect.width ); - u16 bottom_y = (u16)( top_y + rect.height + 4 ); // YẂ}4̃}[W + u16 bottom_y = (u16)( top_y + rect.height ); OS_TPrintf( "MENU[ %d ] : top_x = %02d top_y = %02d bot_x = %02d bot_y = %02d : ", i, top_x, top_y, bottom_x, bottom_y ); - if( InRangeTp( top_x, top_y, bottom_x, bottom_y, target ) ) { + if( WithinRangeTP( top_x, top_y, bottom_x, bottom_y, target ) ) { OS_TPrintf( "InRange\n" ); if( tpd.disp.validity == TP_VALIDITY_VALID ) { // J[\̗vfɈړ if( csr_old == i ) { @@ -482,12 +540,14 @@ BOOL SelectMenuByTP( u16 *nowCsr, const MenuParam *pMenu ) // ݂̃^b`plWẅɂ邩ǂԂB -BOOL InRangeTp( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt ) +BOOL WithinRangeTP( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt ) { if( ( tgt->x >= top_x ) && ( tgt->x <= bottom_x ) && ( tgt->y >= top_y ) && ( tgt->y <= bottom_y ) ) { + OS_TPrintf( "\nRANGE : tx=%3d ty=%3d bx=%3d by=%3d : x=%3d y=%3d\n", + top_x, top_y, bottom_x, bottom_y, tgt->x, tgt->y ); return TRUE; }else { return FALSE; @@ -495,79 +555,6 @@ BOOL InRangeTp( int top_x, int top_y, int bottom_x, int bottom_y, TPData *tgt ) } -//=============================================== -// RTCANZX[` -//=============================================== - -// RTCf[^擾\̏ -void InitGetAndDrawRtcData( int drawDatePos_x, int drawDatePos_y, int drawTimePos_x, int drawTimePos_y) -{ - s_vcount = 0; - s_rtcPos.date_x = drawDatePos_x; - s_rtcPos.date_y = drawDatePos_y; - s_rtcPos.time_x = drawTimePos_x; - s_rtcPos.time_y = drawTimePos_y; - - (void)RTC_GetDateTime( &s_rtcDate, &s_rtcTime); - GetAndDrawRtcDataCore( TRUE ); -} - - -void GetAndDrawRtcData( void ) -{ - GetAndDrawRtcDataCore( FALSE ); -} - - -// RTC̎擾\ -static void GetAndDrawRtcDataCore( BOOL forceGetFlag ) -{ - u32 year; - RTCDate date_old; - RTCTime time_old; - - // RTC̎擾 - if( forceGetFlag || ( s_vcount++ == 60 ) ) { - s_vcount = 0; - MI_CpuCopy16( &s_rtcDate, &date_old, sizeof(RTCDate) ); - MI_CpuCopy16( &s_rtcTime, &time_old, sizeof(RTCTime) ); - - (void)RTC_GetDateTime( &s_rtcDate, &s_rtcTime ); - - // ORTC̏ - { - year = s_rtcDate.year + 2000; - 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 ] - ); - PrintfSJISSub( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d", - time_old.hour, - time_old.minute, - time_old.second - ); - } - // RTC̕\ - { - year = s_rtcDate.year + 2000; - 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 ] - ); - PrintfSJISSub( s_rtcPos.time_x, s_rtcPos.time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d", - s_rtcTime.hour, - s_rtcTime.minute, - s_rtcTime.second - ); - } - } -} - - // oi[ACROBJ̃[h void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp ) { @@ -586,3 +573,68 @@ void SetBannerIconOBJ( GXOamAttr *pDstOAM, BannerFileV1 *bannerp ) 15, // palette 0); // affine } + + +//=============================================== +// RTCANZX[` +//=============================================== + +// RTCf[^̎擾 +BOOL GetRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ) +{ + if( forceGetFlag || ( pRTCDraw->vcount++ == 59 ) ) { + pRTCDraw->vcount = 0; + MI_CpuCopy16( &pRTCDraw->date, &pRTCDraw->date_old, sizeof(RTCDate) ); + MI_CpuCopy16( &pRTCDraw->time, &pRTCDraw->time_old, sizeof(RTCTime) ); + (void)RTC_GetDateTime( &pRTCDraw->date, &pRTCDraw->time ); + return TRUE; + } + return FALSE; +} + + +// RTCf[^̕\ +void DrawRTCData( RTCDrawProperty *pRTCDraw ) +{ + void (*pPrintFunc)( int x, int y, int color, const char *fmt, ... ) = + ( pRTCDraw->isTopLCD ) ? PrintfSJISSub : PrintfSJIS; + + // ORTC̏ + { + u32 year = pRTCDraw->date_old.year + 2000; + pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_WHITE, "%04d/%02d/%02d[%3s]", + year, + pRTCDraw->date_old.month, + pRTCDraw->date_old.day, + g_strWeek[ pRTCDraw->date_old.week ] + ); + pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_WHITE, "%02d:%02d:%02d", + pRTCDraw->time_old.hour, + pRTCDraw->time_old.minute, + pRTCDraw->time_old.second + ); + } + // RTC̕\ + { + u32 year = pRTCDraw->date.year + 2000; + pPrintFunc( pRTCDraw->date_x, pRTCDraw->date_y, TXT_COLOR_BLACK, "%d/%02d/%02d[%3s]", + year, + pRTCDraw->date.month, + pRTCDraw->date.day, + g_strWeek[ pRTCDraw->date.week ] + ); + pPrintFunc( pRTCDraw->time_x, pRTCDraw->time_y, TXT_COLOR_BLACK, "%02d:%02d:%02d", + pRTCDraw->time.hour, + pRTCDraw->time.minute, + pRTCDraw->time.second + ); + } +} + +// RTCf[^̎擾&\ +void GetAndDrawRTCData( RTCDrawProperty *pRTCDraw, BOOL forceGetFlag ) +{ + if( GetRTCData( pRTCDraw, forceGetFlag ) ) { + DrawRTCData( pRTCDraw ); + } +} diff --git a/doc/TWL_SystemMenuメモリマップ.vsd b/doc/TWL_SystemMenuメモリマップ.vsd index 4524af923880300961b8a63949dea30c35e4db8a..4cf8944b45b79756beb59ac19470575fbaf44e7e 100644 GIT binary patch delta 54912 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 o>Q>`D(qGNgFOV delta 54825 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