Nintendoロゴデータ処理の整理。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@192 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yosiokat 2007-11-16 03:34:45 +00:00
parent 96de8ec173
commit 6034261796
7 changed files with 63 additions and 174 deletions

View File

@ -30,7 +30,6 @@ MEMORY
<OVERLAY.NAME> (RWXO): ORIGIN = <OVERLAY.ADDRESS>, LENGTH = 0x0 > <OVERLAY.NAME><PROPERTY.FLXSUFFIX>
<END.OVERLAYS>
arena.MAIN (RW) : ORIGIN = AFTER(<STATIC.NAME><FOREACH.OVERLAYS>,<OVERLAY.NAME><END.OVERLAYS>), LENGTH = 0x0
check.WORKRAM (RWX) : ORIGIN = 0x037c0000, LENGTH = 0x50000 > workram.check
binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > <STATIC.NAME><PROPERTY.LTDSUFFIX>
@ -516,15 +515,6 @@ SECTIONS
<END.OVERLAYS>
############################ ARENA ##################################
.arena.MAIN:
{
. = ALIGN(4);
SDK_SECTION_ARENA_START =.;
} > arena.MAIN
############################ OVERLAYDEFS ############################
.<PROPERTY.OVERLAYDEFS>F:
{

View File

@ -55,6 +55,7 @@ Autoload WRAM
librtc_sp.TWL$(CODEGEN).a \
libwvr_sp.TWL$(CODEGEN).a \
libaes_sp.TWL$(CODEGEN).a \
$(USE_CRYPTO_LIBS) \
$(ISDBG_LIBS)
Library libsdio_hcd_twl.TWL$(CODEGEN).a \
@ -81,4 +82,5 @@ Ltdautoload LTDMAIN
Object * (.ltdmain)
Library libfatfs_sp.TWL$(CODEGEN).a
Library librompatch_sp.TWL$(CODEGEN).a
}

View File

@ -35,7 +35,11 @@ static u32 MEMBm_WordStreamFunc( const u8 *pDevice );
// global variable-------------------------------------------------------
// static variable-------------------------------------------------------
static MIUnpackBitsParam Nin_UnPackBitsParam2 = { (8 * 8 / 2) * ( 7 * 2 ), 1, 4, 0, 0 };
static MIUnpackBitsParam Nin_UnPackBitsParam2 = { (8 * 8 / 2) * ( 7 * 2 ),
1,
4, // ƒJƒ‰<C692>[bit<69>”(4=4bit=16<31>F, 8=8bit=256<35>F)
0,
0 };
// const data------------------------------------------------------------
static const u8 Nin_Char_Diff_Huff_Table2[]={
@ -73,24 +77,32 @@ BOOL SYSM_CheckNintendoLogo( u16 *pLogoData )
// Nintendoロゴデータの展開ルーチンOBJ2Dマップモードで展開
// ※tempBuffpには、0x700byte必要です。
void SYSM_LoadNintendoLogo2D( u16 *pLogoData, u16 *pDst, u16 color, u32 *pTempBuffer )
void SYSM_LoadNintendoLogo2D( u16 *pLogoData, u16 *pDst, int paletteColorIndex )
{
u32 work[ 0x100 / sizeof(u32) ];
Nin_UnPackBitsParam2.destOffset = color - 1;
UnCompNintendoLogo2( pLogoData, (u16 *)pTempBuffer, work );
MI_CpuCopyFast( (u16 *)( (u32)pTempBuffer + 0 ), pDst + 0x0000 / sizeof(u16), 0x1a0 );
MI_CpuCopyFast( (u16 *)( (u32)pTempBuffer + 0x1a0), pDst + 0x0400 / sizeof(u16), 0x1a0 );
u16 *pBuffer = SYSM_Alloc( 0x700 );
if( pBuffer == NULL ) {
OS_Panic( "memory allocation failed.\n" );
}
Nin_UnPackBitsParam2.destOffset = paletteColorIndex - 1;
UnCompNintendoLogo2( pLogoData, (u16 *)pBuffer, work );
MI_CpuCopy16( (u16 *)( (u32)pBuffer + 0 ), pDst + 0x0000 / sizeof(u16), 0x1a0 );
MI_CpuCopy16( (u16 *)( (u32)pBuffer + 0x1a0), pDst + 0x0400 / sizeof(u16), 0x1a0 );
SYSM_Free( pBuffer );
}
void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, u16 color, u32 *pTempBuffer )
void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, int paletteColorIndex )
{
u32 work[ 0x100 / sizeof(u32) ];
Nin_UnPackBitsParam2.destOffset = color - 1;
UnCompNintendoLogo2( pLogoData, (u16 *)pTempBuffer, work );
MI_CpuCopyFast( (u16 *)pTempBuffer, pDst, 0x340 );
u16 *pBuffer = SYSM_Alloc( 0x700 );
if( pBuffer == NULL ) {
OS_Panic( "memory allocation failed.\n" );
}
Nin_UnPackBitsParam2.destOffset = paletteColorIndex - 1;
UnCompNintendoLogo2( pLogoData, (u16 *)pBuffer, work );
MI_CpuCopy16( (u16 *)pBuffer, pDst, 0x340 );
SYSM_Free( pBuffer );
}
/* UnCompNintendoLogo2ワーク内訳

View File

@ -19,70 +19,17 @@
#include "misc.h"
// define data-----------------------------------------------------------
#define NIN_LOGO_LENGTH 0x9c // Nintendoロゴデータサイズ
#define OAM_OBJ_BLEND 0x00000400 // OBJ半透明モード
#define OAM_SIZE_64x32 0xc0004000 // 64x32ドット
#define OAM_COLOR_256 0x00002000 // 256色 選択
#define OAM_AFFINE_NONE 0x00000000 // アフィン無効モード
#define OAM_V_POS_SHIFT 0
#define OAM_H_POS_SHIFT 16
#define OAM_AFFINE_NO_SHIFT 25
#define OAM_PRIORITY_SHIFT 10
#define OAM_PLTT_SHIFT 12
// extern data-----------------------------------------------------------
// function's prototype--------------------------------------------------
void LoadLogoData( void );
static void UnCompNintendoLogo( u16 *NintendoLogoDatap, u16 *dstp, u32 *temp );
static void SVC_DiffUnFilter16_16( u16 *srcp,u16 *dstp );
static s32 MEMB_InitFunc( const u8 *devicep, void *ramp, const void *paramp );
static s32 MEMB_TerminateFunc( const u8 *devicep );
static u8 MEMB_ByteStreamFunc( const u8 *devicep );
static u32 MEMB_WordStreamFunc( const u8 *devicep );
// global variable-------------------------------------------------------
// static variable-------------------------------------------------------
// const data------------------------------------------------------------
const u32 OamLogoData[ 2 ][ 2 ] = {
{
OAM_OBJ_BLEND | OAM_SIZE_64x32 | OAM_AFFINE_NONE | OAM_COLOR_256 |
71 << OAM_H_POS_SHIFT |
88 << OAM_V_POS_SHIFT |
0 << OAM_AFFINE_NO_SHIFT,
0 << 1 | 5 << OAM_PLTT_SHIFT | 2 << OAM_PRIORITY_SHIFT
},
{
OAM_OBJ_BLEND | OAM_SIZE_64x32 | OAM_AFFINE_NONE | OAM_COLOR_256 |
71 + 64 << OAM_H_POS_SHIFT |
88 << OAM_V_POS_SHIFT |
0 << OAM_AFFINE_NO_SHIFT,
8 << 1 | 5 << OAM_PLTT_SHIFT | 2 << OAM_PRIORITY_SHIFT
},
};
static const MIReadStreamCallbacks memb_ifp={
MEMB_InitFunc,
MEMB_TerminateFunc,
MEMB_ByteStreamFunc,
NULL,
MEMB_WordStreamFunc,
};
static const MIUnpackBitsParam Nin_UnPackBitsParam={
(8*8/2)*( 7*2), 1, 8, 0x1e, 0
};
static const u8 Nin_Char_Diff_Huff_Table[] = {
0x24,0xd4,0x00,0x00,
0x0f,0x40,0x00,0x00,0x00,0x01,0x81,0x82,0x82,0x83,0x0f,0x83,0x0c,0xc3,0x03,0x83,
0x01,0x83,0x04,0xc3,0x08,0x0e,0x02,0xc2,0x0d,0xc2,0x07,0x0b,0x06,0x0a,0x05,0x09,
};
static const u8 Nin_Char_Diff_Huff[] ATTRIBUTE_ALIGN( 2 ) = {
0x24, 0xff, 0xae, 0x51, 0x69, 0x9a, 0xa2, 0x21, 0x3d, 0x84, 0x82, 0x0a, 0x84, 0xe4, 0x09, 0xad,
@ -103,101 +50,37 @@ static const u8 Nin_Char_Diff_Huff[] ATTRIBUTE_ALIGN( 2 ) = {
// ============================================================================
void LoadLogoData(void)
{
u32 temp[ 0x500 / sizeof(u32) ];
u16 *pBuff = NNS_FndAllocFromAllocator( &g_allocator, 0x1000 );
if( pBuff == NULL ) {
OS_TPrintf( " %s : memory allocate error.\n", __FUNCTION__ );
return;
}
MI_CpuClear32( pBuff, 0x1000 );
UnCompNintendoLogo( (u16 *)Nin_Char_Diff_Huff, pBuff, temp ); // NintendoロゴをpBuffに展開
MI_CpuCopy32( pBuff, (u32 *)HW_OBJ_VRAM, 0x340 ); // OBJ-VRAMにロード
MI_CpuCopy32( (void *)( (u32)pBuff + 0x340 ), (u32 *)( HW_OBJ_VRAM + 0x400 ), 8*8*13 );
*(vu16 *)( HW_OBJ_PLTT + 0x3e ) = 0x0000; // OBJパレットセット
*(vu16 *)( HW_OBJ_PLTT + 0x1e ) = 0x7c00; // OBJƒpƒŒƒbƒgƒZƒbƒg
*(vu16 *)HW_BG_PLTT = 0xffff; // バックドロップを「白」にする。
MI_CpuCopy32( OamLogoData, (u32 *)HW_OAM, sizeof(OamLogoData) ); // Nintendoロゴ用OAMデータセット
NNS_FndFreeToAllocator( &g_allocator, pBuff );
SYSM_LoadNintendoLogo2D( (u16 *)Nin_Char_Diff_Huff, (u16 *)( HW_OBJ_VRAM + 0x0000 ), 0xf );
G2_SetOBJAttr(
(GXOamAttr *)HW_OAM,
71,
88,
2,
GX_OAM_MODE_NORMAL,
FALSE,
GX_OAM_EFFECT_NONE,
GX_OAM_SHAPE_64x32,
GX_OAM_COLORMODE_16,
0, // charNo.
0, // paletteNo.
0
);
G2_SetOBJAttr(
(GXOamAttr *)HW_OAM + 1,
71 + 64,
88,
2,
GX_OAM_MODE_NORMAL,
FALSE,
GX_OAM_EFFECT_NONE,
GX_OAM_SHAPE_64x32,
GX_OAM_COLORMODE_16,
8, // charNo.
0, // paletteNo.
0
);
}
// Nintendoロゴ展開ルーチン (r0=ロゴ圧縮データ r1=展開先アドレス)
#include <nitro/code16.h>
asm void UnCompNintendoLogo(u16 *NintendoLogoDatap, u16 *dstp, u32 *temp)
{
push {r0-r2,r4, lr}
ldr r0, =Nin_Char_Diff_Huff_Table
mov r2, #0x0e
lsl r2, r2, #8
add r1, r1, r2 // 引数1+0xe00
mov r4, r1
mov r2, #36
bl MIi_CpuCopy16 // Nintendoロゴの圧縮テーブル部分のみをコピーしてくる
ldr r0, [sp, #0] // 引数NinLogoBak[36])
mov r2, #36
add r1, r4, r2 // 引数1+0xe00+36
mov r2, #NIN_LOGO_LENGTH
bl MIi_CpuCopy16 // 引数からNintendoロゴデータ本体をコピーしてくる
mov r0, r4 // 引数1+0xe00
ldr r1, [sp, #4] // 引数1
ldr r2, [sp, #8] // 引数2
ldr r3, =memb_ifp
bl SVC_UncompressHuffmanFromDevice // ハフマン展開
ldr r0, [sp, #4]
ldr r2, =0x0000d082
str r2, [r0,#0]
mov r1, r4 // 引数1+0xe00
bl SVC_DiffUnFilter16_16 // Diff展開
mov r0, r4 // 引数1+0xe00
ldr r1, [sp, #4] // 引数1
ldr r2, =Nin_UnPackBitsParam
bl SVC_UnpackBits // ビット展開
pop {r0-r2,r4, pc}
}
// 差分フィルタ展開システムコール16Bit→16Bit (r0=Srcp, r1=Destp)
static asm void SVC_DiffUnFilter16_16(u16 *srcp,u16 *dstp)
{
swi 24
bx lr
}
#include <nitro/codereset.h>
// ============================================================================
// バイトアクセス可能メモリ用アクセスルーチン群
// ============================================================================
static s32 MEMB_InitFunc(const u8 *devicep, void *ramp, const void *paramp)
{
#pragma unused(ramp)
if(paramp) return (s32)MEMB_WordStreamFunc(devicep);
else return 0;
}
static s32 MEMB_TerminateFunc(const u8 *devicep)
{
#pragma unused(devicep)
return 0;
}
static u8 MEMB_ByteStreamFunc(const u8 *devicep)
{
return *devicep;
}
static u32 MEMB_WordStreamFunc(const u8 *devicep)
{
return *(u32 *)devicep;
}

View File

@ -16,6 +16,7 @@
*---------------------------------------------------------------------------*/
#include "logoDemo.h"
#include "misc.h"
// define data--------------------------------------------------------

View File

@ -64,6 +64,7 @@ void TwlMain( void )
FS_Init( FS_DMA_NOT_USE );
GX_Init();
PM_Init();
TP_Init();
RTC_Init();

View File

@ -68,8 +68,8 @@ typedef enum AuthResult {
// global variable------------------------------------------------------
extern void *(*SYSM_Alloc)( u32 size );
extern void (*SYSM_Free)( void *ptr );
extern void *(*SYSM_Alloc)( u32 size ); // ライブラリ内部使用
extern void (*SYSM_Free)( void *ptr ); // 同上
// function-------------------------------------------------------------
@ -106,8 +106,8 @@ extern void SYSM_VerifyAndRecoveryNTRSettings( void );
// Nintendoロゴ制御
extern BOOL SYSM_CheckNintendoLogo( u16 *pLogoData ); // Nintendoロゴデータのチェック
extern void SYSM_LoadNintendoLogo2D( u16 *pLogoData, u16 *pDst, u16 color, u32 *pTempBuffer ); // NintendoロゴデータをOBJ_2D形式でロードpTempBufferには0x700bytes必要)
extern void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, u16 color, u32 *pTempBuffer ); // NintendoロゴデータをOBJ_1D形式でロード同上
extern void SYSM_LoadNintendoLogo2D( u16 *pLogoData, u16 *pDst, int paletteColorIndex ); // NintendoロゴデータをOBJ_2D形式でロードpTempBufferには0x700bytes必要)
extern void SYSM_LoadNintendoLogo1D( u16 *pLogoData, u16 *pDst, int paletteColorIndex ); // NintendoロゴデータをOBJ_1D形式でロード同上
// RTC制御
extern BOOL SYSM_CheckRTCDate( RTCDate *pDate ); // 日付が正常かチェック