From 2a8379931b5c327489f6ed38a1bd265853bf6f83 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Mon, 26 May 2008 08:38:13 +0000 Subject: [PATCH] =?UTF-8?q?=E5=85=B1=E6=9C=89=E3=83=95=E3=82=A9=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AE=E3=83=AD=E3=83=BC=E3=83=89=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=83=97=E3=83=AD=E3=82=B0=E3=83=A9=E3=83=A0=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=80=82=20=E3=83=A9=E3=83=B3=E3=83=81?= =?UTF-8?q?=E3=83=A3=E3=83=BC=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E8=A1=A8?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0=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@1527 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- build/tests/CheckSharedFont/Makefile | 42 +++ build/tests/CheckSharedFont/ROM-TS_nand.rsf | 263 ++++++++++++++++++ .../CheckSharedFont/src/loadSharedFont.c | 134 +++++++++ .../CheckSharedFont/src/loadSharedFont.h | 41 +++ build/tests/CheckSharedFont/src/main.c | 97 +++++++ .../SDK_5_0_FC_plus3_ランチャーチェック表.xls | Bin 0 -> 49664 bytes 6 files changed, 577 insertions(+) create mode 100644 build/tests/CheckSharedFont/Makefile create mode 100644 build/tests/CheckSharedFont/ROM-TS_nand.rsf create mode 100644 build/tests/CheckSharedFont/src/loadSharedFont.c create mode 100644 build/tests/CheckSharedFont/src/loadSharedFont.h create mode 100644 build/tests/CheckSharedFont/src/main.c create mode 100644 docs/リリース_SDK_5_0_FC_plus3/SDK_5_0_FC_plus3_ランチャーチェック表.xls diff --git a/build/tests/CheckSharedFont/Makefile b/build/tests/CheckSharedFont/Makefile new file mode 100644 index 00000000..1513319c --- /dev/null +++ b/build/tests/CheckSharedFont/Makefile @@ -0,0 +1,42 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - demos - FS - overlay +# 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$ +#---------------------------------------------------------------------------- +TARGET_PLATFORM = TWL +TWL_ARCHGEN = LIMITED + +SUBDIRS = + +#---------------------------------------------------------------------------- + +TARGET_BIN = main.srl + +SRCS = main.c loadSharedFont.c + +LLIBRARIES += libsharedfont$(TWL_LIBSUFFIX).a + +ROM_SPEC = ROM-TS_nand.rsf + +include $(TWLSDK_ROOT)/build/buildtools/commondefs +include $(TWLSDK_ROOT)/build/buildtools/commondefs.gx.demolib + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + +#===== End of Makefile ===== diff --git a/build/tests/CheckSharedFont/ROM-TS_nand.rsf b/build/tests/CheckSharedFont/ROM-TS_nand.rsf new file mode 100644 index 00000000..546adb61 --- /dev/null +++ b/build/tests/CheckSharedFont/ROM-TS_nand.rsf @@ -0,0 +1,263 @@ +#---------------------------------------------------------------------------- +# Project: TwlSDK - include +# File: ROM-TS.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).TWL.FLX.sbin$(COMPSUFFIX9)" + OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.FLX.sbin$(COMPSUFFIX9)" + OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.FLX.sbin$(COMPSUFFIX9)" + Elf "$(MAKEROM_ARM9:r).tef" +} + +Arm7 +{ + Static "$(MAKEROM_ARM7_BASE:r).TWL.FLX.sbin$(COMPSUFFIX7)" + OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.FLX.sbin$(COMPSUFFIX7)" + OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.FLX.sbin$(COMPSUFFIX7)" + Elf "$(MAKEROM_ARM7_BASE:r).tef" +} + +Arm9.Ltd +{ + Static "$(MAKEROM_ARM9:r).TWL.LTD.sbin$(COMPSUFFIX9)" + OverlayDefs "$(MAKEROM_ARM9:r)_defs.TWL.LTD.sbin$(COMPSUFFIX9)" + OverlayTable "$(MAKEROM_ARM9:r)_table.TWL.LTD.sbin$(COMPSUFFIX9)" +} + +Arm7.Ltd +{ + Static "$(MAKEROM_ARM7_BASE:r).TWL.LTD.sbin$(COMPSUFFIX7)" + OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.TWL.LTD.sbin$(COMPSUFFIX7)" + OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.TWL.LTD.sbin$(COMPSUFFIX7)" +} + +Property +{ + ### + ### Settings for FinalROM + ### + #### BEGIN + # + # TITLE NAME: Your product name within 12bytes + # + #TitleName "MY APP NAME" + + # + # 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 + + # + # Permit LandingNormalJump: for TWL "ApplicationJump" function [TRUE/FALSE] + # + #PermitLandingNormalJump FALSE + + # + # Permit LandingTmpJump: for TWL "ApplicationJump" function [TRUE/FALSE] + # + #PermitLandingTmpJump FALSE + + ### + ### Setting for TWL + ### + + # + # ROM HEADER Ltd: Provided to every product by NINTENDO + # + RomHeaderLtd $(TWLSDK_ROOT)/tools/bin/rom_header.LTD.sbin + + # + # Digest parameters: + # + DigestParam 1024 32 + + # + # WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD + # MAP2_BB_HYB/MAP2_BB_LTD/MAP2_TS_HYB/MAP2_TS_LTD] + # don't have to edit + # + WramMapping $(MAKEROM_WRAM_MAPPING) + + # + # CardRegion: card region [Japan/America/Europe/Australia/China/Korea] + # + CardRegion ALL + + # + # SDCardAccess: sd card access control [TRUE/FALSE] + # + #SDCardAccess FALSE + + # + # NANDAccess: NAND access control [TRUE/FALSE] + # + #NANDAccess FALSE + + # + # Codec mode: + # don't have to edit + # + CodecMode $(MAKEROM_CODEC_MODE) + + # + # Disp WiFiConnection Icon for Launcher [TRUE/FALSE] + # + #WiFiConnectionIcon FALSE + + # + # Disp DSWireless Icon for Launcher [TRUE/FALSE] + # + #DSWirelessIcon FALSE + + # + # Disable debug [TRUE/FALSE] + # + DisableDebug FALSE + + # + # Agree EULA [TRUE/FALSE] + # + #AgreeEULA FALSE + + # + # Agree EULA version [0 - 255] + # + #AgreeEULAVersion 0 + + ### + #### END +} + +AppendProperty +{ + # + # Boot allowed Media: [GameCard] + # + Media NAND + + # + # GameCode for TitleID : Your GameCode in 4 ascii words + # + #GameCode ABCJ + + # + # Public save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M] + # + #PublicSaveDataSize 0K + + # + # Private save data size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M] + # + #PrivateSaveDataSize 0K + + # + # Enable SubBannerFile + #SubBannerFile TRUE + + # + # Use Shared2 file index: [0-65535] + #Shared2FileIndex 0 + + # + # Use Shared2 file size: [0K/16K/32K/64K/128K/256K/512K/1M/2M/4M] + #Shared2FileSize 0K + + # + # Game card power on: [TRUE/FALSE] + # + #GameCardOn FALSE +} + +RomSpec +{ + Offset 0x00000000 + Segment ALL + HostRoot $(MAKEROM_ROMROOT) + Root / + File $(MAKEROM_ROMFILES) +} + +Rating +{ + # + # Permited age to play for each rating organization [0 - 31, ALWAYS, FREE] + # + # Supported organization + # - CERO (OGN0) : for Japan + # - ESRB (OGN1) : for North America + # - BBFC (OGN2) : obsolete organization + # - USK (OGN3) : for German + # - PEGI_GEN (OGN4) : for Europe + # - PEGI_FINLAND (OGN5) : obsolete organization + # - PEGI_PRT (OGN6) : for Portugal + # - PEGI_BBFC (OGN7) : for UK + # - OFLC (OGN8) : for Australia and NewZealand + # - GRB (OGN9) : for Korea + # - OGN10 : reserved + # - OGN11 : reserved + # - OGN12 : reserved + # - OGN13 : reserved + # - OGN14 : reserved + # - OGN15 : reserved + # + # Available age [ 0 - 31 / ALWAYS / FREE ] + + CERO FREE +# ESRB FREE +# USK FREE +# PEGI_GEN FREE +# PEGI_PRT FREE +# PEGI_BBFC FREE +# OFLC FREE +# GRB FREE +} diff --git a/build/tests/CheckSharedFont/src/loadSharedFont.c b/build/tests/CheckSharedFont/src/loadSharedFont.c new file mode 100644 index 00000000..e09fdb3b --- /dev/null +++ b/build/tests/CheckSharedFont/src/loadSharedFont.c @@ -0,0 +1,134 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: loadSharedFont.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 "loadSharedFont.h" + +// extern data----------------------------------------------------------------- + +// define data----------------------------------------------------------------- +#define FONT_LOAD_THREAD_PRIO 13 +#define THREAD_STACK_SIZE 1024 + +// function's prototype------------------------------------------------------- + +// global variable------------------------------------------------------------- +BOOL g_isSucceededLoad[ OS_SHARED_FONT_MAX ]; + +// static variable------------------------------------------------------------- +static u64 s_fontLoadThreadStack[THREAD_STACK_SIZE / sizeof(u64)]; +static OSThread s_fontLoadThread; +static OSTick s_fontLoadStartTick; +static u8 *s_pFontBuffer[ OS_SHARED_FONT_MAX ]; // ǂݍ݂̓eXgȂ̂Ń[hstaticϐɂĂB +static BOOL s_isStarted = FALSE; + +// const data------------------------------------------------------------------ + + +// ============================================================================ +// LtHg[h +// ============================================================================ +BOOL LoadSharedFontInit( void ) +{ + u8 *pBuffer; + int size; + + s_fontLoadStartTick = OS_GetTick(); + + // [hXbh + OS_CreateThread(&s_fontLoadThread, + LoadSharedFontThread, + NULL, + s_fontLoadThreadStack + THREAD_STACK_SIZE / sizeof(u64), + THREAD_STACK_SIZE, FONT_LOAD_THREAD_PRIO); + + // tHg[h + if( !OS_InitSharedFont() ) { + OS_TPrintf( "OS_InitSharedFont failed.\n" ); + return FALSE; + } + size = OS_GetSharedFontTableSize(); + if( size < 0 ) { + OS_TPrintf( "OS_GetSharedTableSize failed.\n" ); + return FALSE; + } + + pBuffer = OS_Alloc( (u32)size ); + if( pBuffer == NULL ) { + OS_TPrintf( "malloc failed.\n" ); + return FALSE; + } + if( !OS_LoadSharedFontTable( pBuffer ) ) { + OS_TPrintf( "OS_LoadSharedTable failed.\n" ); + return FALSE; + } + + // [hXbhN + OS_WakeupThreadDirect(&s_fontLoadThread); + s_isStarted = TRUE; + return TRUE; +} + + +void LoadSharedFontThread( void *arg ) +{ +#pragma unused(arg) + BOOL retval = TRUE; + OSSharedFontIndex i; + + for( i = OS_SHARED_FONT_WW_S; i < OS_SHARED_FONT_MAX; i++ ) { + int size; + + OS_TPrintf( "%s read.\n", OS_GetSharedFontName( i ) ); + + size = OS_GetSharedFontSize( i ); + if( size < 0 ) { + OS_TPrintf( " get font size failed.\n" ); + retval = FALSE; + } + + // FS̃LbVȂ̂ŁAƂ肠ACgƂĂB + size = MATH_ROUNDUP( size, 32 ); + + s_pFontBuffer[ i ] = OS_Alloc( (u32)size ); + if( s_pFontBuffer[ i ] == NULL ) { + OS_TPrintf( " malloc failed.\n" ); + retval = FALSE; + } + + if( OS_LoadSharedFont( i, s_pFontBuffer[ i ] ) ) { + OS_TPrintf( " load succeeded.\n" ); + g_isSucceededLoad[ i ] = TRUE; + }else { + OS_TPrintf( " load failed.\n" ); + g_isSucceededLoad[ i ] = FALSE; + retval = FALSE; + } + } + OS_TPrintf( "Shared Font load time = %dms\n", OS_TicksToMilliSeconds( OS_GetTick() - s_fontLoadStartTick ) ); +} + + +BOOL IsFinishedLoadSharedFont( void ) +{ + if( s_isStarted ) { + return OS_IsThreadTerminated( &s_fontLoadThread ); + }else { + return TRUE; + } +} + diff --git a/build/tests/CheckSharedFont/src/loadSharedFont.h b/build/tests/CheckSharedFont/src/loadSharedFont.h new file mode 100644 index 00000000..67c563ed --- /dev/null +++ b/build/tests/CheckSharedFont/src/loadSharedFont.h @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------* + Project: TwlIPL + File: loadSharedFont.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 __LOAD_SHARED_FONT_H__ +#define __LOAD_SHARED_FONT_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// define data------------------------------------------------------- +// global variables-------------------------------------------------- +extern BOOL g_isSucceededLoad[ OS_SHARED_FONT_MAX ]; + +// function---------------------------------------------------------- +BOOL LoadSharedFontInit( void ); +void LoadSharedFontThread( void *arg ); +BOOL IsFinishedLoadSharedFont( void ); + +#ifdef __cplusplus +} +#endif + +#endif // __LOAD_SHARED_FONT_H__ diff --git a/build/tests/CheckSharedFont/src/main.c b/build/tests/CheckSharedFont/src/main.c new file mode 100644 index 00000000..80793aee --- /dev/null +++ b/build/tests/CheckSharedFont/src/main.c @@ -0,0 +1,97 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK - demos - FS - overlay + 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 "DEMO.h" +#include "loadSharedFont.h" + +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------* + Name: NitroMain + + Description: AvP[VCGg + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void NitroMain(void) +{ + + OS_Init(); + OS_InitTick(); + (void)OS_EnableIrq(); + (void)OS_EnableInterrupts(); + + { + OSHeapHandle hh; + void *tmp; + tmp = OS_InitAlloc(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi(), 1); + OS_SetArenaLo(OS_ARENA_MAIN, tmp); + hh = OS_CreateHeap(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi()); + if (hh < 0) + { + OS_TPanic("ARM9: Fail to create heap...\n"); + } + (void)OS_SetCurrentHeap(OS_ARENA_MAIN, hh); + } + + DEMOInitCommon(); + DEMOInitVRAM(); + DEMOInitDisplayBitmap(); + DEMOHookConsole(); + + DEMOSetBitmapTextColor(GX_RGBA(31, 31, 0, 1)); + DEMOSetBitmapGroundColor(DEMO_RGB_CLEAR); + DEMOStartDisplay(); + + FS_Init(FS_DMA_NOT_USE); + + OS_TPrintf("--------------------------------\n" + "Shared Font sample.\n"); + + (void)LoadSharedFontInit(); + + + while( !IsFinishedLoadSharedFont() ) { + OS_WaitVBlankIntr(); + } + + // ʕ\ + { + int i; + int ox = 10; + int oy = 60; + DEMOFillRect(0, 0, GX_LCD_SIZE_X, GX_LCD_SIZE_Y, DEMO_RGB_CLEAR); + DEMOSetBitmapTextColor(GX_RGBA(0, 31, 0, 1)); + DEMOSetBitmapTextColor(GX_RGBA(31, 31, 31, 1)); + DEMODrawFrame(ox, oy, 240, 10 + OS_SHARED_FONT_MAX * 10, GX_RGBA( 0, 31, 0, 1)); + for (i = 0; i < OS_SHARED_FONT_MAX; ++i) + { + DEMODrawText(ox + 10, oy + 5 + i * 10, "%s %s load ", + OS_GetSharedFontName( (OSSharedFontIndex)i ), g_isSucceededLoad[ i ] ? "suceeded" : "failed"); + } + } + DEMO_DrawFlip(); + OS_WaitVBlankIntr(); + OS_Terminate(); +} + + diff --git a/docs/リリース_SDK_5_0_FC_plus3/SDK_5_0_FC_plus3_ランチャーチェック表.xls b/docs/リリース_SDK_5_0_FC_plus3/SDK_5_0_FC_plus3_ランチャーチェック表.xls new file mode 100644 index 0000000000000000000000000000000000000000..b8b07226bb665d0fee6286f366c04735a52e9562 GIT binary patch literal 49664 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 E4*;