diff options
-rw-r--r-- | arm9/asm/unk_02006864.s | 285 | ||||
-rw-r--r-- | arm9/lib/include/NNS_g2d.h | 108 | ||||
-rw-r--r-- | arm9/src/gf_gfx_loader.c | 135 |
3 files changed, 244 insertions, 284 deletions
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
+};
|