mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
Nintendoロゴデータ処理の整理。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@192 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
96de8ec173
commit
6034261796
@ -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:
|
||||
{
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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ワーク内訳
|
||||
|
||||
@ -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 // OBJ 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] // 引数0(NinLogoBak[36])
|
||||
mov r2, #36
|
||||
add r1, r4, r2 // 引数1+0xe00+36
|
||||
mov r2, #NIN_LOGO_LENGTH
|
||||
bl MIi_CpuCopy16 // 引数0から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;
|
||||
}
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "logoDemo.h"
|
||||
#include "misc.h"
|
||||
|
||||
// define data--------------------------------------------------------
|
||||
|
||||
|
||||
@ -64,6 +64,7 @@ void TwlMain( void )
|
||||
|
||||
FS_Init( FS_DMA_NOT_USE );
|
||||
GX_Init();
|
||||
PM_Init();
|
||||
TP_Init();
|
||||
RTC_Init();
|
||||
|
||||
|
||||
@ -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 ); // 日付が正常かチェック
|
||||
|
||||
Loading…
Reference in New Issue
Block a user