From e8b7894e1c1496f4564a96c0a13ed5cac2000f6f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 27 May 2021 21:28:30 -0400 Subject: Through FUN_02006AE4 --- arm9/asm/unk_02006864.s | 285 +-------------------------------------------- arm9/lib/include/NNS_g2d.h | 108 ++++++++++++++++- arm9/src/gf_gfx_loader.c | 135 +++++++++++++++++++++ 3 files changed, 244 insertions(+), 284 deletions(-) (limited to 'arm9') diff --git a/arm9/asm/unk_02006864.s b/arm9/asm/unk_02006864.s index d716ff8b..0a8b7bf3 100644 --- a/arm9/asm/unk_02006864.s +++ b/arm9/asm/unk_02006864.s @@ -1,291 +1,12 @@ .include "asm/macros.inc" .include "global.inc" - .section .rodata - - .global UNK_020ECB98 -UNK_020ECB98: ; 0x020ECB98 - .word NNS_G2dLoadImage1DMapping - .word NNS_G2dLoadImage2DMapping - - .global UNK_020ECBA0 -UNK_020ECBA0: ; 0x020ECBA0 - .word GX_LoadOBJ, GXS_LoadOBJ - - .global UNK_020ECBA8 -UNK_020ECBA8: ; 0x020ECBA8 - .word NNS_G2dLoadImage1DMapping, NNS_G2dLoadImage2DMapping - - .global UNK_020ECBB0 -UNK_020ECBB0: ; 0x020ECBB0 - .word GX_LoadBGPltt, GX_LoadOBJPltt, GX_LoadBGExtPltt, GX_LoadOBJExtPltt - .word GXS_LoadBGPltt, GXS_LoadOBJPltt, GXS_LoadBGExtPltt, GXS_LoadOBJExtPltt + .extern UNK_020ECB98 + .extern UNK_020ECBA0 + .extern UNK_020ECBA8 .text - thumb_func_start FUN_02006930 -FUN_02006930: ; 0x02006930 - push {lr} - sub sp, #0xc - str r3, [sp, #0x0] - ldr r3, [sp, #0x10] - str r3, [sp, #0x4] - ldr r3, [sp, #0x14] - str r3, [sp, #0x8] - mov r3, #0x0 - bl FUN_02006948 - add sp, #0xc - pop {pc} - - thumb_func_start FUN_02006948 -FUN_02006948: ; 0x02006948 - push {r4-r7, lr} - sub sp, #0xc - add r4, r2, #0x0 - add r7, r3, #0x0 - mov r2, #0x1 - str r2, [sp, #0x0] - ldr r3, [sp, #0x28] - mov r2, #0x0 - ldr r6, [sp, #0x20] - ldr r5, [sp, #0x24] - bl UncompressFromNarc - str r0, [sp, #0x4] - cmp r0, #0x0 - beq _02006A2A - add r1, sp, #0x8 - bl NNS_G2dGetUnpackedPaletteData - cmp r0, #0x0 - beq _02006A24 - ldr r0, [sp, #0x8] - ldr r1, [r0, #0xc] - add r1, r1, r7 - str r1, [r0, #0xc] - cmp r5, #0x0 - bne _02006982 - ldr r0, [sp, #0x8] - ldr r0, [r0, #0x8] - sub r5, r0, r7 -_02006982: - ldr r0, [sp, #0x8] - add r1, r5, #0x0 - ldr r0, [r0, #0xc] - bl DC_FlushRange - cmp r4, #0x7 - bhi _02006A14 - add r0, r4, r4 - add r0, pc - ldrh r0, [r0, #0x6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_0200699C: ; jump table (using 16-bit offset) - .short _02006A14 - _0200699C - 2; case 0 - .short _02006A14 - _0200699C - 2; case 1 - .short _020069AC - _0200699C - 2; case 2 - .short _020069E0 - _0200699C - 2; case 3 - .short _02006A14 - _0200699C - 2; case 4 - .short _02006A14 - _0200699C - 2; case 5 - .short _020069C6 - _0200699C - 2; case 6 - .short _020069FA - _0200699C - 2; case 7 -_020069AC: - bl GX_BeginLoadBGExtPltt - ldr r0, [sp, #0x8] - ldr r3, _02006A30 ; =UNK_020ECBB0 - lsl r4, r4, #0x2 - ldr r0, [r0, #0xc] - ldr r3, [r3, r4] - add r1, r6, #0x0 - add r2, r5, #0x0 - blx r3 - bl GX_EndLoadBGExtPltt - b _02006A24 -_020069C6: - bl GXS_BeginLoadBGExtPltt - ldr r0, [sp, #0x8] - ldr r3, _02006A30 ; =UNK_020ECBB0 - lsl r4, r4, #0x2 - ldr r0, [r0, #0xc] - ldr r3, [r3, r4] - add r1, r6, #0x0 - add r2, r5, #0x0 - blx r3 - bl GXS_EndLoadBGExtPltt - b _02006A24 -_020069E0: - bl GX_BeginLoadOBJExtPltt - ldr r0, [sp, #0x8] - ldr r3, _02006A30 ; =UNK_020ECBB0 - lsl r4, r4, #0x2 - ldr r0, [r0, #0xc] - ldr r3, [r3, r4] - add r1, r6, #0x0 - add r2, r5, #0x0 - blx r3 - bl GX_EndLoadOBJExtPltt - b _02006A24 -_020069FA: - bl GXS_BeginLoadOBJExtPltt - ldr r0, [sp, #0x8] - ldr r3, _02006A30 ; =UNK_020ECBB0 - lsl r4, r4, #0x2 - ldr r0, [r0, #0xc] - ldr r3, [r3, r4] - add r1, r6, #0x0 - add r2, r5, #0x0 - blx r3 - bl GXS_EndLoadOBJExtPltt - b _02006A24 -_02006A14: - ldr r0, [sp, #0x8] - ldr r3, _02006A30 ; =UNK_020ECBB0 - lsl r4, r4, #0x2 - ldr r0, [r0, #0xc] - ldr r3, [r3, r4] - add r1, r6, #0x0 - add r2, r5, #0x0 - blx r3 -_02006A24: - ldr r0, [sp, #0x4] - bl FreeToHeap -_02006A2A: - add sp, #0xc - pop {r4-r7, pc} - nop -_02006A30: .word UNK_020ECBB0 - - thumb_func_start FUN_02006A34 -FUN_02006A34: ; 0x02006A34 - push {r3-r7, lr} - sub sp, #0x8 - add r5, r2, #0x0 - mov r2, #0x1 - add r6, r3, #0x0 - str r2, [sp, #0x0] - ldr r2, [sp, #0x24] - ldr r3, [sp, #0x28] - ldr r4, [sp, #0x20] - bl UncompressFromNarc - add r7, r0, #0x0 - beq _02006A80 - add r1, sp, #0x4 - bl NNS_G2dGetUnpackedCharacterData - cmp r0, #0x0 - beq _02006A7A - cmp r4, #0x0 - bne _02006A60 - ldr r0, [sp, #0x4] - ldr r4, [r0, #0x10] -_02006A60: - ldr r0, [sp, #0x4] - add r1, r4, #0x0 - ldr r0, [r0, #0x14] - bl DC_FlushRange - ldr r0, [sp, #0x4] - ldr r3, _02006A88 ; =UNK_020ECBA0 - lsl r5, r5, #0x2 - ldr r0, [r0, #0x14] - ldr r3, [r3, r5] - add r1, r6, #0x0 - add r2, r4, #0x0 - blx r3 -_02006A7A: - add r0, r7, #0x0 - bl FreeToHeap -_02006A80: - add r0, r4, #0x0 - add sp, #0x8 - pop {r3-r7, pc} - nop -_02006A88: .word UNK_020ECBA0 - - thumb_func_start FUN_02006A8C -FUN_02006A8C: ; 0x02006A8C - push {r4-r7, lr} - sub sp, #0xc - add r5, r2, #0x0 - add r4, r3, #0x0 - mov r2, #0x1 - str r2, [sp, #0x0] - ldr r3, [sp, #0x20] - mov r2, #0x0 - bl UncompressFromNarc - add r6, r0, #0x0 - beq _02006AE0 - add r1, sp, #0x4 - bl NNS_G2dGetUnpackedPaletteCompressInfo - add r7, r0, #0x0 - add r0, r6, #0x0 - add r1, sp, #0x8 - bl NNS_G2dGetUnpackedPaletteData - cmp r0, #0x0 - beq _02006ADA - cmp r7, #0x0 - beq _02006ACE - ldr r0, [sp, #0x24] - add r2, r4, #0x0 - str r0, [sp, #0x0] - ldr r0, [sp, #0x8] - ldr r1, [sp, #0x4] - add r3, r5, #0x0 - bl NNS_G2dLoadPaletteEx - b _02006ADA -_02006ACE: - ldr r0, [sp, #0x8] - ldr r3, [sp, #0x24] - add r1, r4, #0x0 - add r2, r5, #0x0 - bl NNS_G2dLoadPalette -_02006ADA: - add r0, r6, #0x0 - bl FreeToHeap -_02006AE0: - add sp, #0xc - pop {r4-r7, pc} - - thumb_func_start FUN_02006AE4 -FUN_02006AE4: ; 0x02006AE4 - push {r4-r6, lr} - sub sp, #0x8 - add r5, r3, #0x0 - mov r3, #0x1 - str r3, [sp, #0x0] - ldr r3, [sp, #0x24] - bl UncompressFromNarc - add r6, r0, #0x0 - ldr r4, _02006B30 ; =0x00000000 - beq _02006B28 - add r1, sp, #0x4 - bl NNS_G2dGetUnpackedCharacterData - cmp r0, #0x0 - beq _02006B22 - ldr r1, [sp, #0x18] - cmp r1, #0x0 - beq _02006B0E - ldr r0, [sp, #0x4] - str r1, [r0, #0x10] -_02006B0E: - ldr r4, _02006B34 ; =UNK_020ECBA8 - lsl r5, r5, #0x2 - ldr r0, [sp, #0x4] - ldr r1, [sp, #0x20] - ldr r2, [sp, #0x1c] - ldr r3, [sp, #0x28] - ldr r4, [r4, r5] - blx r4 - ldr r0, [sp, #0x4] - ldr r4, [r0, #0x10] -_02006B22: - add r0, r6, #0x0 - bl FreeToHeap -_02006B28: - add r0, r4, #0x0 - add sp, #0x8 - pop {r4-r6, pc} - nop -_02006B30: .word 0x00000000 -_02006B34: .word UNK_020ECBA8 - thumb_func_start FUN_02006B38 FUN_02006B38: ; 0x02006B38 push {r4-r6, lr} diff --git a/arm9/lib/include/NNS_g2d.h b/arm9/lib/include/NNS_g2d.h index e7852744..aa30881e 100644 --- a/arm9/lib/include/NNS_g2d.h +++ b/arm9/lib/include/NNS_g2d.h @@ -32,8 +32,112 @@ typedef struct NNSG2dScreenData } NNSG2dScreenData; +typedef struct NNSG2dPaletteData +{ + + GXTexFmt fmt; + BOOL bExtendedPlt; + + u32 szByte; + void* pRawData; // offset addr of the content. + +} +NNSG2dPaletteData; + +typedef enum NNS_G2D_VRAM_TYPE +{ + NNS_G2D_VRAM_TYPE_3DMAIN = 0, + NNS_G2D_VRAM_TYPE_2DMAIN = 1, + NNS_G2D_VRAM_TYPE_2DSUB = 2, + NNS_G2D_VRAM_TYPE_MAX = 3 + +} NNS_G2D_VRAM_TYPE; + +typedef struct NNSG2dImageAttr +{ + GXTexSizeS sizeS; // Image size (Invalid data is set during 1D mapping.) + GXTexSizeT sizeT; // Image size (Invalid data is set during 1D mapping.) + + GXTexFmt fmt; // Image format + BOOL bExtendedPlt; // Whether or not to use the extended palette + + GXTexPlttColor0 plttUse; // How to use palette number 0 + GXOBJVRamModeChar mappingType; // Mapping mode +} +NNSG2dImageAttr; + +typedef struct NNSG2dVRamLocation +{ + u32 baseAddrOfVram[ NNS_G2D_VRAM_TYPE_MAX ]; +} +NNSG2dVRamLocation; + +typedef struct NNSG2dImageProxy +{ + NNSG2dVRamLocation vramLocation; + NNSG2dImageAttr attr; +} +NNSG2dImageProxy; + +typedef struct NNSG2dPaletteCompressInfo +{ + u16 numPalette; + u16 pad16; + void* pPlttIdxTbl; // offset addr. + +} + NNSG2dPaletteCompressInfo; + +void NNS_G2dLoadImage1DMapping +( + const NNSG2dCharacterData* pSrcData, + u32 baseAddr, + NNS_G2D_VRAM_TYPE type, + NNSG2dImageProxy* pImgProxy +); + +void NNS_G2dLoadImage2DMapping +( + const NNSG2dCharacterData* pSrcData, + u32 baseAddr, + NNS_G2D_VRAM_TYPE type, + NNSG2dImageProxy* pImgProxy +); + +typedef struct NNSG2dImagePaletteProxy +{ + + GXTexFmt fmt; // palette format + // (Obtainable values are limited to GX_TEXFMT_PLTT16 and GX_TEXFMT_PLTT256) + + BOOL bExtendedPlt; // Use expanded palette? + + NNSG2dVRamLocation vramLocation; +} + NNSG2dImagePaletteProxy; + +void NNS_G2dLoadPalette +( + const NNSG2dPaletteData* pSrcData, + u32 addr, + NNS_G2D_VRAM_TYPE type, + NNSG2dImagePaletteProxy* pPltProxy +); + +void NNS_G2dLoadPaletteEx +( + const NNSG2dPaletteData* pSrcData, + const NNSG2dPaletteCompressInfo* pCmpInfo, + u32 addr, + NNS_G2D_VRAM_TYPE type, + NNSG2dImagePaletteProxy* pPltProxy +); -extern BOOL NNS_G2dGetUnpackedBGCharacterData( void* pNcgrFile, NNSG2dCharacterData** ppCharData ); -extern BOOL NNS_G2dGetUnpackedScreenData( void* pNscrFile, NNSG2dScreenData** ppScrData ); +BOOL NNS_G2dGetUnpackedBGCharacterData( void* pNcgrFile, NNSG2dCharacterData** ppCharData ); +BOOL NNS_G2dGetUnpackedCharacterData( void* pNcgrFile, NNSG2dCharacterData** ppCharData ); +BOOL NNS_G2dGetUnpackedScreenData( void* pNscrFile, NNSG2dScreenData** ppScrData ); +BOOL NNS_G2dGetUnpackedPaletteData( void* pNclrFile, NNSG2dPaletteData** ppPltData ); +BOOL NNS_G2dGetUnpackedPaletteData( void* pNclrFile, NNSG2dPaletteData** ppPltData ); +BOOL NNS_G2dGetUnpackedPaletteCompressInfo( void* pNclrFile, NNSG2dPaletteCompressInfo** ppPltCmpInfo ); #endif //NNSYS_NNS_G2D_H diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c index db2614ab..83ca9119 100644 --- a/arm9/src/gf_gfx_loader.c +++ b/arm9/src/gf_gfx_loader.c @@ -39,3 +39,138 @@ THUMB_FUNC void FUN_020068C8(NarcId narcId, s32 memberNo, struct UnkStruct_02016 FreeToHeap(r7); } } + +void FUN_02006948(NarcId narcId, s32 memberNo, u32 r4, u32 r7, u32 r6, u32 r5, u32 heap_id); + +THUMB_FUNC void FUN_02006930(NarcId narcId, s32 memberNo, u32 r2, u32 r3, u32 sp10, u32 heap_id) +{ + FUN_02006948(narcId, memberNo, r2, 0, r3, sp10, heap_id); +} + +THUMB_FUNC void FUN_02006948(NarcId narcId, s32 memberNo, u32 r4, u32 r7, u32 r6, u32 r5, u32 heap_id) +{ + static void (*const UNK_020ECBB0[])(void *, u32, u32) = { + GX_LoadBGPltt, + GX_LoadOBJPltt, + GX_LoadBGExtPltt, + GX_LoadOBJExtPltt, + GXS_LoadBGPltt, + GXS_LoadOBJPltt, + GXS_LoadBGExtPltt, + GXS_LoadOBJExtPltt + }; + NNSG2dPaletteData * sp8; + void * sp4 = UncompressFromNarc(narcId, memberNo, FALSE, heap_id, TRUE); + if (sp4 != NULL) + { + if (NNS_G2dGetUnpackedPaletteData(sp4, &sp8)) + { + sp8->pRawData = (void *)((u32)sp8->pRawData + r7); + if (r5 == 0) + r5 = sp8->szByte - r7; + DC_FlushRange(sp8->pRawData, r5); + switch (r4) + { + case 2: + GX_BeginLoadBGExtPltt(); + UNK_020ECBB0[r4](sp8->pRawData, r6, r5); + GX_EndLoadBGExtPltt(); + break; + case 6: + GXS_BeginLoadBGExtPltt(); + UNK_020ECBB0[r4](sp8->pRawData, r6, r5); + GXS_EndLoadBGExtPltt(); + break; + case 3: + GX_BeginLoadOBJExtPltt(); + UNK_020ECBB0[r4](sp8->pRawData, r6, r5); + GX_EndLoadOBJExtPltt(); + break; + case 7: + GXS_BeginLoadOBJExtPltt(); + UNK_020ECBB0[r4](sp8->pRawData, r6, r5); + GXS_EndLoadOBJExtPltt(); + break; + default: + UNK_020ECBB0[r4](sp8->pRawData, r6, r5); + break; + } + } + FreeToHeap(sp4); + } +} + +THUMB_FUNC u32 FUN_02006A34(NarcId narcId, s32 memberId, u32 r5, u32 r6, u32 r4, BOOL isCompressed, u32 heap_id) +{ + static void (*const UNK_020ECBA0[])(void *, u32, u32) = { + GX_LoadOBJ, + GXS_LoadOBJ + }; + + NNSG2dCharacterData* sp4; + void * r7 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE); + if (r7 != NULL) + { + if (NNS_G2dGetUnpackedCharacterData(r7, &sp4)) + { + if (r4 == 0) + r4 = sp4->szByte; + DC_FlushRange(sp4->pRawData, r4); + UNK_020ECBA0[r5](sp4->pRawData, r6, r4); + } + FreeToHeap(r7); + } + return r4; +} + +THUMB_FUNC void FUN_02006A8C(NarcId narcId, s32 memberId, NNS_G2D_VRAM_TYPE r5, u32 r4, u32 heap_id, NNSG2dImagePaletteProxy * sp24) +{ + void * r6 = UncompressFromNarc(narcId, memberId, FALSE, heap_id, TRUE); + NNSG2dPaletteData* sp8; + NNSG2dPaletteCompressInfo* sp4; + if (r6 != NULL) + { + BOOL r7 = NNS_G2dGetUnpackedPaletteCompressInfo(r6, &sp4); + if (NNS_G2dGetUnpackedPaletteData(r6, &sp8)) + { + if (r7) + { + NNS_G2dLoadPaletteEx(sp8, sp4, r4, r5, sp24); + } + else + { + NNS_G2dLoadPalette(sp8, r4, r5, sp24); + } + } + FreeToHeap(r6); + } +} + +THUMB_FUNC u32 FUN_02006AE4(NarcId narcId, s32 memberId, BOOL isCompressed, u32 r5, u32 sp18, u32 sp1C, u32 sp20, u32 heap_id, NNSG2dImageProxy *sp28) +{ + static void (*const UNK_020ECBA8[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = { + NNS_G2dLoadImage1DMapping, + NNS_G2dLoadImage2DMapping + }; + + void * r6 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE); + u32 r4 = 0; + NNSG2dCharacterData * sp4; + if (r6 != NULL) + { + if (NNS_G2dGetUnpackedCharacterData(r6, &sp4)) + { + if (sp18 != 0) + sp4->szByte = sp18; + UNK_020ECBA8[r5](sp4, sp20, sp1C, sp28); + r4 = sp4->szByte; + } + FreeToHeap(r6); + } + return r4; +} + +void (*const UNK_020ECB98[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = { + NNS_G2dLoadImage1DMapping, + NNS_G2dLoadImage2DMapping +}; -- cgit v1.2.3