summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/unk_02006864.s285
-rw-r--r--arm9/lib/include/NNS_g2d.h108
-rw-r--r--arm9/src/gf_gfx_loader.c135
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
+};