summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2021-05-28 08:47:42 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2021-05-28 08:47:42 -0400
commit1521f64f6f055c9fd236a9e2c72ffe3860c5eb14 (patch)
treee7cf8a36b9095ee737a25311b800e343043608b5
parente8b7894e1c1496f4564a96c0a13ed5cac2000f6f (diff)
FInish gf_gfx_loader.c
-rw-r--r--arm9/arm9.lsf1
-rw-r--r--arm9/asm/unk_02006864.s326
-rw-r--r--arm9/lib/include/GXS_ioreg.h64
-rw-r--r--arm9/lib/include/NNS_g2d.h125
-rw-r--r--arm9/src/gf_gfx_loader.c204
5 files changed, 378 insertions, 342 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf
index fe1e31bc..012cd7f5 100644
--- a/arm9/arm9.lsf
+++ b/arm9/arm9.lsf
@@ -22,7 +22,6 @@ Static arm9
Object overlay_manager.o
Object filesystem.o
Object gf_gfx_loader.o
- Object unk_02006864.o
Object unk_02006D98.o
Object unk_02008AA4.o
Object unk_02008DEC.o
diff --git a/arm9/asm/unk_02006864.s b/arm9/asm/unk_02006864.s
deleted file mode 100644
index 0a8b7bf3..00000000
--- a/arm9/asm/unk_02006864.s
+++ /dev/null
@@ -1,326 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern UNK_020ECB98
- .extern UNK_020ECBA0
- .extern UNK_020ECBA8
-
- .text
-
- thumb_func_start FUN_02006B38
-FUN_02006B38: ; 0x02006B38
- 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 r4, r0, #0x0
- beq _02006B9E
- add r1, sp, #0x4
- bl NNS_G2dGetUnpackedCharacterData
- cmp r0, #0x0
- beq _02006B98
- ldr r1, [sp, #0x18]
- cmp r1, #0x0
- beq _02006B60
- ldr r0, [sp, #0x4]
- str r1, [r0, #0x10]
-_02006B60:
- ldr r0, [sp, #0x1c]
- cmp r0, #0x1
- beq _02006B6C
- cmp r0, #0x2
- beq _02006B7C
- b _02006B88
-_02006B6C:
- mov r0, #0x1
- lsl r0, r0, #0x1a
- ldr r1, [r0, #0x0]
- ldr r0, _02006BA4 ; =0x00300010
- and r1, r0
- ldr r0, [sp, #0x4]
- str r1, [r0, #0x8]
- b _02006B88
-_02006B7C:
- ldr r0, _02006BA8 ; =0x04001000
- ldr r1, [r0, #0x0]
- ldr r0, _02006BA4 ; =0x00300010
- and r1, r0
- ldr r0, [sp, #0x4]
- str r1, [r0, #0x8]
-_02006B88:
- lsl r6, r5, #0x2
- ldr r5, _02006BAC ; =UNK_020ECB98
- ldr r0, [sp, #0x4]
- ldr r1, [sp, #0x20]
- ldr r2, [sp, #0x1c]
- ldr r3, [sp, #0x28]
- ldr r5, [r5, r6]
- blx r5
-_02006B98:
- add r0, r4, #0x0
- bl FreeToHeap
-_02006B9E:
- add sp, #0x8
- pop {r4-r6, pc}
- nop
-_02006BA4: .word 0x00300010
-_02006BA8: .word 0x04001000
-_02006BAC: .word UNK_020ECB98
-
- thumb_func_start FUN_02006BB0
-FUN_02006BB0: ; 0x02006BB0
- push {r3-r5, lr}
- add r4, r3, #0x0
- mov r3, #0x0
- str r3, [sp, #0x0]
- ldr r3, [sp, #0x10]
- bl UncompressFromNarc
- add r5, r0, #0x0
- beq _02006BD6
- add r1, r4, #0x0
- bl NNS_G2dGetUnpackedBGCharacterData
- cmp r0, #0x0
- bne _02006BD6
- add r0, r5, #0x0
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r5, pc}
-_02006BD6:
- add r0, r5, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02006BDC
-FUN_02006BDC: ; 0x02006BDC
- push {r3-r5, lr}
- add r4, r3, #0x0
- mov r3, #0x0
- str r3, [sp, #0x0]
- ldr r3, [sp, #0x10]
- bl UncompressFromNarc
- add r5, r0, #0x0
- beq _02006C02
- add r1, r4, #0x0
- bl NNS_G2dGetUnpackedScreenData
- cmp r0, #0x0
- bne _02006C02
- add r0, r5, #0x0
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r5, pc}
-_02006C02:
- add r0, r5, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02006C08
-FUN_02006C08: ; 0x02006C08
- push {r3-r5, lr}
- add r5, r2, #0x0
- mov r2, #0x0
- str r2, [sp, #0x0]
- bl UncompressFromNarc
- add r4, r0, #0x0
- beq _02006C2C
- add r1, r5, #0x0
- bl NNS_G2dGetUnpackedPaletteData
- cmp r0, #0x0
- bne _02006C2C
- add r0, r4, #0x0
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r5, pc}
-_02006C2C:
- add r0, r4, #0x0
- pop {r3-r5, pc}
-
- thumb_func_start FUN_02006C30
-FUN_02006C30: ; 0x02006C30
- push {r3-r5, lr}
- add r4, r3, #0x0
- mov r3, #0x0
- str r3, [sp, #0x0]
- ldr r3, [sp, #0x10]
- bl UncompressFromNarc
- add r5, r0, #0x0
- beq _02006C56
- add r1, r4, #0x0
- bl NNS_G2dGetUnpackedCellBank
- cmp r0, #0x0
- bne _02006C56
- add r0, r5, #0x0
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r5, pc}
-_02006C56:
- add r0, r5, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02006C5C
-FUN_02006C5C: ; 0x02006C5C
- push {r3-r5, lr}
- add r4, r3, #0x0
- mov r3, #0x0
- str r3, [sp, #0x0]
- ldr r3, [sp, #0x10]
- bl UncompressFromNarc
- add r5, r0, #0x0
- beq _02006C82
- add r1, r4, #0x0
- bl NNS_G2dGetUnpackedAnimBank
- cmp r0, #0x0
- bne _02006C82
- add r0, r5, #0x0
- bl FreeToHeap
- mov r0, #0x0
- pop {r3-r5, pc}
-_02006C82:
- add r0, r5, #0x0
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02006C88
-FUN_02006C88: ; 0x02006C88
- push {r3, lr}
- add r3, r2, #0x0
- mov r2, #0x0
- str r2, [sp, #0x0]
- mov r2, #0x1
- bl UncompressFromNarc
- pop {r3, pc}
-
- thumb_func_start UncompressFromNarc
-UncompressFromNarc: ; 0x02006C98
- ; void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd)
- push {r3-r7, lr}
- add r5, r2, #0x0
- add r7, r0, #0x0
- add r6, r3, #0x0
- str r1, [sp, #0x0]
- cmp r5, #0x0
- bne _02006CAC
- ldr r2, [sp, #0x18]
- cmp r2, #0x1
- bne _02006CC0
-_02006CAC:
- ldr r1, [sp, #0x0]
- add r0, r7, #0x0
- bl GetNarcMemberSizeByIdPair
- add r1, r0, #0x0
- add r0, r6, #0x0
- bl AllocFromHeapAtEnd
- add r4, r0, #0x0
- b _02006CCE
-_02006CC0:
- bl GetNarcMemberSizeByIdPair
- add r1, r0, #0x0
- add r0, r6, #0x0
- bl AllocFromHeap
- add r4, r0, #0x0
-_02006CCE:
- cmp r4, #0x0
- beq _02006D12
- ldr r2, [sp, #0x0]
- add r0, r4, #0x0
- add r1, r7, #0x0
- bl ReadWholeNarcMemberByIdPair
- cmp r5, #0x0
- beq _02006D12
- ldr r0, [sp, #0x18]
- cmp r0, #0x0
- bne _02006CF2
- ldr r1, [r4, #0x0]
- add r0, r6, #0x0
- lsr r1, r1, #0x8
- bl AllocFromHeap
- b _02006CFC
-_02006CF2:
- ldr r1, [r4, #0x0]
- add r0, r6, #0x0
- lsr r1, r1, #0x8
- bl AllocFromHeapAtEnd
-_02006CFC:
- add r5, r0, #0x0
- cmp r5, #0x0
- beq _02006D10
- add r0, r4, #0x0
- add r1, r5, #0x0
- bl MI_UncompressLZ8
- add r0, r4, #0x0
- bl FreeToHeap
-_02006D10:
- add r4, r5, #0x0
-_02006D12:
- add r0, r4, #0x0
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start FUN_02006D18
-FUN_02006D18: ; 0x02006D18
- push {r3-r7, lr}
- sub sp, #0x8
- ldr r5, [sp, #0x24]
- str r0, [sp, #0x0]
- str r1, [sp, #0x4]
- add r6, r2, #0x0
- add r7, r3, #0x0
- bl GetNarcMemberSizeByIdPair
- str r0, [r5, #0x0]
- cmp r6, #0x0
- bne _02006D36
- ldr r0, [sp, #0x20]
- cmp r0, #0x1
- bne _02006D42
-_02006D36:
- ldr r1, [r5, #0x0]
- add r0, r7, #0x0
- bl AllocFromHeapAtEnd
- add r4, r0, #0x0
- b _02006D4C
-_02006D42:
- ldr r1, [r5, #0x0]
- add r0, r7, #0x0
- bl AllocFromHeap
- add r4, r0, #0x0
-_02006D4C:
- cmp r4, #0x0
- beq _02006D92
- ldr r1, [sp, #0x0]
- ldr r2, [sp, #0x4]
- add r0, r4, #0x0
- bl ReadWholeNarcMemberByIdPair
- cmp r6, #0x0
- beq _02006D92
- ldr r0, [r4, #0x0]
- lsr r0, r0, #0x8
- str r0, [r5, #0x0]
- ldr r0, [sp, #0x20]
- cmp r0, #0x0
- bne _02006D74
- ldr r1, [r5, #0x0]
- add r0, r7, #0x0
- bl AllocFromHeap
- b _02006D7C
-_02006D74:
- ldr r1, [r5, #0x0]
- add r0, r7, #0x0
- bl AllocFromHeapAtEnd
-_02006D7C:
- add r5, r0, #0x0
- cmp r5, #0x0
- beq _02006D90
- add r0, r4, #0x0
- add r1, r5, #0x0
- bl MI_UncompressLZ8
- add r0, r4, #0x0
- bl FreeToHeap
-_02006D90:
- add r4, r5, #0x0
-_02006D92:
- add r0, r4, #0x0
- add sp, #0x8
- pop {r3-r7, pc}
diff --git a/arm9/lib/include/GXS_ioreg.h b/arm9/lib/include/GXS_ioreg.h
new file mode 100644
index 00000000..1c66c4af
--- /dev/null
+++ b/arm9/lib/include/GXS_ioreg.h
@@ -0,0 +1,64 @@
+#ifndef POKEDIAMOND_GXS_IOREG_H
+#define POKEDIAMOND_GXS_IOREG_H
+
+#define REG_GXS_DB_DISPCNT_O_SHIFT 31
+#define REG_GXS_DB_DISPCNT_O_SIZE 1
+#define REG_GXS_DB_DISPCNT_O_MASK 0x80000000
+
+#define REG_GXS_DB_DISPCNT_BG_SHIFT 30
+#define REG_GXS_DB_DISPCNT_BG_SIZE 1
+#define REG_GXS_DB_DISPCNT_BG_MASK 0x40000000
+
+#define REG_GXS_DB_DISPCNT_OH_SHIFT 23
+#define REG_GXS_DB_DISPCNT_OH_SIZE 1
+#define REG_GXS_DB_DISPCNT_OH_MASK 0x00800000
+
+#define REG_GXS_DB_DISPCNT_EXOBJ_SHIFT 20
+#define REG_GXS_DB_DISPCNT_EXOBJ_SIZE 2
+#define REG_GXS_DB_DISPCNT_EXOBJ_MASK 0x00300000
+
+#define REG_GXS_DB_DISPCNT_MODE_SHIFT 16
+#define REG_GXS_DB_DISPCNT_MODE_SIZE 1
+#define REG_GXS_DB_DISPCNT_MODE_MASK 0x00010000
+
+#define REG_GXS_DB_DISPCNT_OW_SHIFT 15
+#define REG_GXS_DB_DISPCNT_OW_SIZE 1
+#define REG_GXS_DB_DISPCNT_OW_MASK 0x00008000
+
+#define REG_GXS_DB_DISPCNT_W1_SHIFT 14
+#define REG_GXS_DB_DISPCNT_W1_SIZE 1
+#define REG_GXS_DB_DISPCNT_W1_MASK 0x00004000
+
+#define REG_GXS_DB_DISPCNT_W0_SHIFT 13
+#define REG_GXS_DB_DISPCNT_W0_SIZE 1
+#define REG_GXS_DB_DISPCNT_W0_MASK 0x00002000
+
+#define REG_GXS_DB_DISPCNT_DISPLAY_SHIFT 8
+#define REG_GXS_DB_DISPCNT_DISPLAY_SIZE 5
+#define REG_GXS_DB_DISPCNT_DISPLAY_MASK 0x00001f00
+
+#define REG_GXS_DB_DISPCNT_BLANK_SHIFT 7
+#define REG_GXS_DB_DISPCNT_BLANK_SIZE 1
+#define REG_GXS_DB_DISPCNT_BLANK_MASK 0x00000080
+
+#define REG_GXS_DB_DISPCNT_OBJMAP_SHIFT 4
+#define REG_GXS_DB_DISPCNT_OBJMAP_SIZE 3
+#define REG_GXS_DB_DISPCNT_OBJMAP_MASK 0x00000070
+
+#define REG_GXS_DB_DISPCNT_BGMODE_SHIFT 0
+#define REG_GXS_DB_DISPCNT_BGMODE_SIZE 3
+#define REG_GXS_DB_DISPCNT_BGMODE_MASK 0x00000007
+
+#define REG_GXS_DB_DISPCNT_OBJMAP_CH_SHIFT 4
+#define REG_GXS_DB_DISPCNT_OBJMAP_CH_SIZE 1
+#define REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK 0x00000010
+
+#define REG_GXS_DB_DISPCNT_OBJMAP_BM_SHIFT 5
+#define REG_GXS_DB_DISPCNT_OBJMAP_BM_SIZE 2
+#define REG_GXS_DB_DISPCNT_OBJMAP_BM_MASK 0x00000060
+
+#define REG_GXS_DB_DISPCNT_EXOBJ_CH_SHIFT 20
+#define REG_GXS_DB_DISPCNT_EXOBJ_CH_SIZE 2
+#define REG_GXS_DB_DISPCNT_EXOBJ_CH_MASK 0x00300000
+
+#endif //POKEDIAMOND_GXS_IOREG_H
diff --git a/arm9/lib/include/NNS_g2d.h b/arm9/lib/include/NNS_g2d.h
index aa30881e..722f4767 100644
--- a/arm9/lib/include/NNS_g2d.h
+++ b/arm9/lib/include/NNS_g2d.h
@@ -53,6 +53,17 @@ typedef enum NNS_G2D_VRAM_TYPE
} NNS_G2D_VRAM_TYPE;
+typedef enum NNSG2dCharacterDataMapingType
+{
+ NNS_G2D_CHARACTERMAPING_1D_32,
+ NNS_G2D_CHARACTERMAPING_1D_64,
+ NNS_G2D_CHARACTERMAPING_1D_128,
+ NNS_G2D_CHARACTERMAPING_1D_256,
+ NNS_G2D_CHARACTERMAPING_2D,
+ NNS_G2D_CHARACTERMAPING_MAX
+
+} NNSG2dCharacterDataMapingType;
+
typedef struct NNSG2dImageAttr
{
GXTexSizeS sizeS; // Image size (Invalid data is set during 1D mapping.)
@@ -86,7 +97,7 @@ typedef struct NNSG2dPaletteCompressInfo
void* pPlttIdxTbl; // offset addr.
}
- NNSG2dPaletteCompressInfo;
+NNSG2dPaletteCompressInfo;
void NNS_G2dLoadImage1DMapping
(
@@ -114,7 +125,7 @@ typedef struct NNSG2dImagePaletteProxy
NNSG2dVRamLocation vramLocation;
}
- NNSG2dImagePaletteProxy;
+NNSG2dImagePaletteProxy;
void NNS_G2dLoadPalette
(
@@ -133,11 +144,121 @@ void NNS_G2dLoadPaletteEx
NNSG2dImagePaletteProxy* pPltProxy
);
+typedef struct NNSG2dCellVramTransferData
+{
+ u32 srcDataOffset;
+ u32 szByte;
+
+}
+NNSG2dCellVramTransferData;
+
+typedef struct NNSG2dVramTransferData
+{
+ u32 szByteMax; // Maximum byte count during all VRAM transfers
+ NNSG2dCellVramTransferData* pCellTransferDataArray;// This is the length of the numCells amount of the maintained NNSG2dCellDataBank.
+ //
+
+}
+NNSG2dVramTransferData;
+
+typedef struct NNSG2dCellOAMAttrData
+{
+ u16 attr0;
+ u16 attr1;
+ u16 attr2;
+
+}
+NNSG2dCellOAMAttrData;
+
+typedef struct NNSG2dCellData
+{
+ u16 numOAMAttrs; // Number of OAM attributes
+ u16 cellAttr; // Information related to cell type
+ // Information related to flips (upper 8 bits)
+ // Information related to bounding information
+ //
+ // Information related to rendering optimization (lower 8 bits)
+ // (6bit => Radius of bounding sphere >> 2 )
+
+
+ NNSG2dCellOAMAttrData* pOamAttrArray; // Pointer to the NNSG2dCellOAMAttrData array
+
+}
+NNSG2dCellData;
+
+typedef struct NNSG2dCellDataBank
+{
+ u16 numCells; // Total number of cells
+ u16 cellBankAttr; // Attribute
+ NNSG2dCellData* pCellDataArrayHead; // offset address
+ NNSG2dCharacterDataMapingType mappingMode; // Mapping mode of the referenced character
+
+ NNSG2dVramTransferData* pVramTransferData; // Information related to Vram transfer animation
+
+ void* pStringBank; // Character string bank
+ void* pExtendedData; // offset addr (if it exists)
+
+
+}
+NNSG2dCellDataBank;
+
+typedef enum NNSG2dAnimationPlayMode
+{
+ NNS_G2D_ANIMATIONPLAYMODE_INVALID = 0x0, // Disabled
+ NNS_G2D_ANIMATIONPLAYMODE_FORWARD, // one-time playback (forward)
+ NNS_G2D_ANIMATIONPLAYMODE_FORWARD_LOOP, // repeat playback (forward loop)
+ NNS_G2D_ANIMATIONPLAYMODE_REVERSE, // reverse playback (reverse (forward + backward))
+ NNS_G2D_ANIMATIONPLAYMODE_REVERSE_LOOP, // reverse playback repeat (reverse (forward + backward) loop)
+ NNS_G2D_ANIMATIONPLAYMODE_MAX
+}
+NNSG2dAnimationPlayMode;
+
+typedef struct NNSG2dAnimFrameData
+{
+ void* pContent; // pointer to animation result
+ u16 frames; // animation frame continuation time (units: video frames)
+ u16 pad16; // padding
+
+}
+NNSG2dAnimFrameData;
+
+typedef struct NNSG2dAnimSequenceData
+{
+ u16 numFrames; // number of animation frames forming the sequence
+ u16 loopStartFrameIdx; // loop start animation frame number
+
+ u32 animType; // animation type (upper 16 bits)
+ // animation elements (lower 16 bits)
+ // (What's referenced by NNSG2dAnimFrameData.pContent is changed)
+
+ NNSG2dAnimationPlayMode playMode; // animation sequence playback method
+ NNSG2dAnimFrameData* pAnmFrameArray; // offset from the head of pFrameArray.
+
+}
+NNSG2dAnimSequenceData;
+
+typedef struct NNSG2dAnimBankData
+{
+
+ u16 numSequences; // number of animation sequences
+ u16 numTotalFrames; // total number of animation frames
+ NNSG2dAnimSequenceData* pSequenceArrayHead; // pointer to animation sequence array
+ NNSG2dAnimFrameData* pFrameArrayHead; // pointer to animation frame array
+ void* pAnimContents; // pointer to animation result array
+ void* pStringBank; // pointer to string bank (set during execution)
+ void* pExtendedData; // pointer to library expansion area (not used)
+
+}
+NNSG2dAnimBankData;
+
+
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 );
+BOOL NNS_G2dGetUnpackedCellBank( void* pNcerFile, NNSG2dCellDataBank** ppCellBank );
+BOOL NNS_G2dGetUnpackedAnimBank( void* pNanrFile, NNSG2dAnimBankData** ppAnimBank );
#endif //NNSYS_NNS_G2D_H
diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c
index 83ca9119..d9d6d411 100644
--- a/arm9/src/gf_gfx_loader.c
+++ b/arm9/src/gf_gfx_loader.c
@@ -2,6 +2,7 @@
#include "filesystem.h"
#include "NNS_g2d.h"
#include "unk_02016B94.h"
+#include "GXS_ioreg.h"
void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd);
@@ -146,31 +147,208 @@ THUMB_FUNC void FUN_02006A8C(NarcId narcId, s32 memberId, NNS_G2D_VRAM_TYPE r5,
}
}
-THUMB_FUNC u32 FUN_02006AE4(NarcId narcId, s32 memberId, BOOL isCompressed, u32 r5, u32 sp18, u32 sp1C, u32 sp20, u32 heap_id, NNSG2dImageProxy *sp28)
+THUMB_FUNC u32 FUN_02006AE4(NarcId narcId, s32 memberId, BOOL isCompressed, u32 whichRoutine, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy *pImgProxy)
{
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;
+ void * pFile = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE);
+ u32 retSize = 0;
+ NNSG2dCharacterData * pSrcData;
+ if (pFile != NULL)
+ {
+ if (NNS_G2dGetUnpackedCharacterData(pFile, &pSrcData))
+ {
+ if (szByte != 0)
+ pSrcData->szByte = szByte;
+ UNK_020ECBA8[whichRoutine](pSrcData, baseAddr, type, pImgProxy);
+ retSize = pSrcData->szByte;
+ }
+ FreeToHeap(pFile);
+ }
+ return retSize;
+}
+
+THUMB_FUNC void FUN_02006B38(NarcId narcId, s32 memberId, BOOL isCompressed, u32 r5, u32 sp18, NNS_G2D_VRAM_TYPE sp1C, u32 sp20, u32 heap_id, NNSG2dImageProxy * sp28)
+{
+ static void (*const UNK_020ECB98[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
+ NNS_G2dLoadImage1DMapping,
+ NNS_G2dLoadImage2DMapping
+ };
NNSG2dCharacterData * sp4;
- if (r6 != NULL)
+ void * r4 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, TRUE);
+ if (r4 != NULL)
{
- if (NNS_G2dGetUnpackedCharacterData(r6, &sp4))
+ if (NNS_G2dGetUnpackedCharacterData(r4, &sp4))
{
if (sp18 != 0)
sp4->szByte = sp18;
- UNK_020ECBA8[r5](sp4, sp20, sp1C, sp28);
- r4 = sp4->szByte;
+ switch (sp1C)
+ {
+ case NNS_G2D_VRAM_TYPE_2DMAIN:
+ sp4->mapingType = reg_GX_DISPCNT & (REG_GX_DISPCNT_EXOBJ_CH_MASK | REG_GX_DISPCNT_OBJMAP_CH_MASK);
+ break;
+ case NNS_G2D_VRAM_TYPE_2DSUB:
+ sp4->mapingType = reg_GXS_DB_DISPCNT & (REG_GXS_DB_DISPCNT_EXOBJ_MASK | REG_GXS_DB_DISPCNT_OBJMAP_CH_MASK);
+ break;
+ default:
+ ;
+ }
+ UNK_020ECB98[r5](sp4, sp20, sp1C, sp28);
}
- FreeToHeap(r6);
+ FreeToHeap(r4);
}
- return r4;
}
-void (*const UNK_020ECB98[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
- NNS_G2dLoadImage1DMapping,
- NNS_G2dLoadImage2DMapping
-};
+THUMB_FUNC void * FUN_02006BB0(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dCharacterData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedBGCharacterData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006BDC(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dScreenData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedScreenData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C08(NarcId narcId, s32 memberId, NNSG2dPaletteData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, FALSE, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedPaletteData(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C30(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dCellDataBank ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedCellBank(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C5C(NarcId narcId, s32 memberId, BOOL isCompressed, NNSG2dAnimBankData ** r4, u32 heap_id)
+{
+ void * r5 = UncompressFromNarc(narcId, memberId, isCompressed, heap_id, FALSE);
+ if (r5 != NULL)
+ {
+ if (!NNS_G2dGetUnpackedAnimBank(r5, r4))
+ {
+ FreeToHeap(r5);
+ return NULL;
+ }
+ }
+ return r5;
+}
+
+THUMB_FUNC void * FUN_02006C88(NarcId narcId, s32 memberId, u32 heap_id)
+{
+ return UncompressFromNarc(narcId, memberId, TRUE, heap_id, FALSE);
+}
+
+THUMB_FUNC void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd)
+{
+ void * dest;
+ void * dest2;
+ if (isCompressed || allocAtEnd == TRUE)
+ {
+ u32 size = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ dest = AllocFromHeapAtEnd(heap_id, size);
+ }
+ else
+ {
+ u32 size = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ dest = AllocFromHeap(heap_id, size);
+ }
+ if (dest != NULL)
+ {
+ ReadWholeNarcMemberByIdPair(dest, narcId, memberNo);
+ if (isCompressed)
+ {
+ if (allocAtEnd == FALSE)
+ {
+ dest2 = AllocFromHeap(heap_id, (*(u32 *)dest) >> 8);
+ }
+ else
+ {
+ dest2 = AllocFromHeapAtEnd(heap_id, (*(u32 *)dest) >> 8);
+ }
+ if (dest2 != NULL)
+ {
+ MI_UncompressLZ8(dest, dest2);
+ FreeToHeap(dest);
+ }
+ dest = dest2; // UB: if dest2 is NULL, dest is never freed
+ }
+ }
+ return dest;
+}
+
+THUMB_FUNC void * FUN_02006D18(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd, u32 *size_p)
+{
+ void * dest;
+ void * dest2;
+ *size_p = GetNarcMemberSizeByIdPair(narcId, memberNo);
+ if (isCompressed || allocAtEnd == TRUE)
+ {
+ dest = AllocFromHeapAtEnd(heap_id, *size_p);
+ }
+ else
+ {
+ dest = AllocFromHeap(heap_id, *size_p);
+ }
+ if (dest != NULL)
+ {
+ ReadWholeNarcMemberByIdPair(dest, narcId, memberNo);
+ if (isCompressed)
+ {
+ *size_p = (*(u32 *)dest) >> 8;
+ if (allocAtEnd == FALSE)
+ {
+ dest2 = AllocFromHeap(heap_id, *size_p);
+ }
+ else
+ {
+ dest2 = AllocFromHeapAtEnd(heap_id, *size_p);
+ }
+ if (dest2 != NULL)
+ {
+ MI_UncompressLZ8(dest, dest2);
+ FreeToHeap(dest);
+ }
+ dest = dest2; // UB: if dest2 is NULL, dest is never freed
+ }
+ }
+ return dest;
+}