From 1521f64f6f055c9fd236a9e2c72ffe3860c5eb14 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 28 May 2021 08:47:42 -0400 Subject: FInish gf_gfx_loader.c --- arm9/arm9.lsf | 1 - arm9/asm/unk_02006864.s | 326 ------------------------------------------- arm9/lib/include/GXS_ioreg.h | 64 +++++++++ arm9/lib/include/NNS_g2d.h | 125 ++++++++++++++++- arm9/src/gf_gfx_loader.c | 204 +++++++++++++++++++++++++-- 5 files changed, 378 insertions(+), 342 deletions(-) delete mode 100644 arm9/asm/unk_02006864.s create mode 100644 arm9/lib/include/GXS_ioreg.h (limited to 'arm9') 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; +} -- cgit v1.2.3