From bfcd4ca46f428ba168c6daf6aa7550b7d8d71a03 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 27 May 2021 20:09:37 -0400 Subject: Start decomping unk_02006864 --- arm9/arm9.lsf | 1 + arm9/asm/unk_02006864.s | 93 --------------------------------------------- arm9/lib/include/GX_ioreg.h | 84 ++++++++++++++++++++++++++++++++++++++++ arm9/lib/include/NNS_g2d.h | 39 +++++++++++++++++++ arm9/lib/include/gx.h | 15 ++++++++ arm9/src/gf_gfx_loader.c | 41 ++++++++++++++++++++ arm9/src/unk_02016B94.c | 2 +- include/unk_02016B94.h | 2 +- 8 files changed, 182 insertions(+), 95 deletions(-) create mode 100644 arm9/lib/include/GX_ioreg.h create mode 100644 arm9/lib/include/NNS_g2d.h create mode 100644 arm9/src/gf_gfx_loader.c diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index f68d3633..fe1e31bc 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -21,6 +21,7 @@ Static arm9 Object unk_020061E8.o Object overlay_manager.o Object filesystem.o + Object gf_gfx_loader.o Object unk_02006864.o Object unk_02006D98.o Object unk_02008AA4.o diff --git a/arm9/asm/unk_02006864.s b/arm9/asm/unk_02006864.s index 75adbe92..d716ff8b 100644 --- a/arm9/asm/unk_02006864.s +++ b/arm9/asm/unk_02006864.s @@ -23,99 +23,6 @@ UNK_020ECBB0: ; 0x020ECBB0 .text - thumb_func_start FUN_0200687C -FUN_0200687C: ; 0x0200687C - push {r3-r7, lr} - sub sp, #0x8 - add r6, r2, #0x0 - mov r2, #0x0 - add r5, r3, #0x0 - str r2, [sp, #0x0] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x2c] - ldr r4, [sp, #0x24] - bl UncompressFromNarc - add r7, r0, #0x0 - beq _020068C2 - add r1, sp, #0x4 - bl NNS_G2dGetUnpackedBGCharacterData - cmp r0, #0x0 - beq _020068BC - cmp r4, #0x0 - bne _020068A8 - ldr r0, [sp, #0x4] - ldr r4, [r0, #0x10] -_020068A8: - ldr r0, [sp, #0x20] - lsl r1, r5, #0x18 - str r0, [sp, #0x0] - ldr r2, [sp, #0x4] - add r0, r6, #0x0 - ldr r2, [r2, #0x14] - lsr r1, r1, #0x18 - add r3, r4, #0x0 - bl FUN_02017E14 -_020068BC: - add r0, r7, #0x0 - bl FreeToHeap -_020068C2: - add r0, r4, #0x0 - add sp, #0x8 - pop {r3-r7, pc} - - thumb_func_start FUN_020068C8 -FUN_020068C8: ; 0x020068C8 - push {r3-r7, lr} - sub sp, #0x8 - add r6, r2, #0x0 - mov r2, #0x1 - add r5, r3, #0x0 - str r2, [sp, #0x0] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x2c] - ldr r4, [sp, #0x24] - bl UncompressFromNarc - add r7, r0, #0x0 - beq _0200692C - add r1, sp, #0x4 - bl NNS_G2dGetUnpackedScreenData - cmp r0, #0x0 - beq _02006926 - cmp r4, #0x0 - bne _020068F4 - ldr r0, [sp, #0x4] - ldr r4, [r0, #0x8] -_020068F4: - lsl r1, r5, #0x18 - add r0, r6, #0x0 - lsr r1, r1, #0x18 - bl FUN_0201886C - cmp r0, #0x0 - beq _02006912 - ldr r2, [sp, #0x4] - lsl r1, r5, #0x18 - add r0, r6, #0x0 - lsr r1, r1, #0x18 - add r2, #0xc - add r3, r4, #0x0 - bl FUN_02017DFC -_02006912: - ldr r0, [sp, #0x20] - lsl r1, r5, #0x18 - str r0, [sp, #0x0] - ldr r2, [sp, #0x4] - add r0, r6, #0x0 - lsr r1, r1, #0x18 - add r2, #0xc - add r3, r4, #0x0 - bl FUN_02017CE8 -_02006926: - add r0, r7, #0x0 - bl FreeToHeap -_0200692C: - add sp, #0x8 - pop {r3-r7, pc} - thumb_func_start FUN_02006930 FUN_02006930: ; 0x02006930 push {lr} diff --git a/arm9/lib/include/GX_ioreg.h b/arm9/lib/include/GX_ioreg.h new file mode 100644 index 00000000..81055b0a --- /dev/null +++ b/arm9/lib/include/GX_ioreg.h @@ -0,0 +1,84 @@ +#ifndef NITRO_GX_IOREG_H +#define NITRO_GX_IOREG_H + +#define REG_GX_DISPCNT_O_SHIFT 31 +#define REG_GX_DISPCNT_O_SIZE 1 +#define REG_GX_DISPCNT_O_MASK 0x80000000 + +#define REG_GX_DISPCNT_BG_SHIFT 30 +#define REG_GX_DISPCNT_BG_SIZE 1 +#define REG_GX_DISPCNT_BG_MASK 0x40000000 + +#define REG_GX_DISPCNT_BGSCREENOFFSET_SHIFT 27 +#define REG_GX_DISPCNT_BGSCREENOFFSET_SIZE 3 +#define REG_GX_DISPCNT_BGSCREENOFFSET_MASK 0x38000000 + +#define REG_GX_DISPCNT_BGCHAROFFSET_SHIFT 24 +#define REG_GX_DISPCNT_BGCHAROFFSET_SIZE 3 +#define REG_GX_DISPCNT_BGCHAROFFSET_MASK 0x07000000 + +#define REG_GX_DISPCNT_OH_SHIFT 23 +#define REG_GX_DISPCNT_OH_SIZE 1 +#define REG_GX_DISPCNT_OH_MASK 0x00800000 + +#define REG_GX_DISPCNT_EXOBJ_SHIFT 20 +#define REG_GX_DISPCNT_EXOBJ_SIZE 3 +#define REG_GX_DISPCNT_EXOBJ_MASK 0x00700000 + +#define REG_GX_DISPCNT_VRAM_SHIFT 18 +#define REG_GX_DISPCNT_VRAM_SIZE 2 +#define REG_GX_DISPCNT_VRAM_MASK 0x000c0000 + +#define REG_GX_DISPCNT_MODE_SHIFT 16 +#define REG_GX_DISPCNT_MODE_SIZE 2 +#define REG_GX_DISPCNT_MODE_MASK 0x00030000 + +#define REG_GX_DISPCNT_OW_SHIFT 15 +#define REG_GX_DISPCNT_OW_SIZE 1 +#define REG_GX_DISPCNT_OW_MASK 0x00008000 + +#define REG_GX_DISPCNT_W1_SHIFT 14 +#define REG_GX_DISPCNT_W1_SIZE 1 +#define REG_GX_DISPCNT_W1_MASK 0x00004000 + +#define REG_GX_DISPCNT_W0_SHIFT 13 +#define REG_GX_DISPCNT_W0_SIZE 1 +#define REG_GX_DISPCNT_W0_MASK 0x00002000 + +#define REG_GX_DISPCNT_DISPLAY_SHIFT 8 +#define REG_GX_DISPCNT_DISPLAY_SIZE 5 +#define REG_GX_DISPCNT_DISPLAY_MASK 0x00001f00 + +#define REG_GX_DISPCNT_BLANK_SHIFT 7 +#define REG_GX_DISPCNT_BLANK_SIZE 1 +#define REG_GX_DISPCNT_BLANK_MASK 0x00000080 + +#define REG_GX_DISPCNT_OBJMAP_SHIFT 4 +#define REG_GX_DISPCNT_OBJMAP_SIZE 3 +#define REG_GX_DISPCNT_OBJMAP_MASK 0x00000070 + +#define REG_GX_DISPCNT_BG02D3D_SHIFT 3 +#define REG_GX_DISPCNT_BG02D3D_SIZE 1 +#define REG_GX_DISPCNT_BG02D3D_MASK 0x00000008 + +#define REG_GX_DISPCNT_BGMODE_SHIFT 0 +#define REG_GX_DISPCNT_BGMODE_SIZE 3 +#define REG_GX_DISPCNT_BGMODE_MASK 0x00000007 + +#define REG_GX_DISPCNT_OBJMAP_CH_SHIFT 4 +#define REG_GX_DISPCNT_OBJMAP_CH_SIZE 1 +#define REG_GX_DISPCNT_OBJMAP_CH_MASK 0x00000010 + +#define REG_GX_DISPCNT_OBJMAP_BM_SHIFT 5 +#define REG_GX_DISPCNT_OBJMAP_BM_SIZE 2 +#define REG_GX_DISPCNT_OBJMAP_BM_MASK 0x00000060 + +#define REG_GX_DISPCNT_EXOBJ_CH_SHIFT 20 +#define REG_GX_DISPCNT_EXOBJ_CH_SIZE 2 +#define REG_GX_DISPCNT_EXOBJ_CH_MASK 0x00300000 + +#define REG_GX_DISPCNT_EXOBJ_BM_SHIFT 22 +#define REG_GX_DISPCNT_EXOBJ_BM_SIZE 1 +#define REG_GX_DISPCNT_EXOBJ_BM_MASK 0x00400000 + +#endif //NITRO_GX_IOREG_H diff --git a/arm9/lib/include/NNS_g2d.h b/arm9/lib/include/NNS_g2d.h new file mode 100644 index 00000000..e7852744 --- /dev/null +++ b/arm9/lib/include/NNS_g2d.h @@ -0,0 +1,39 @@ +#ifndef NNSYS_NNS_G2D_H +#define NNSYS_NNS_G2D_H +#include "gx.h" + +typedef struct NNSG2dCharacterData +{ + + u16 H; + u16 W; + + GXTexFmt pixelFmt; // GXTexFmt + + GXOBJVRamModeChar mapingType; // GXOBJVRamModeChar + u32 characterFmt;// 31 ..... 10 ...........9 8 ................ 0 + // Reserved VramTransfer NNSG2dCharacterFmt + u32 szByte; + void* pRawData; // offset addr of the content. + +} +NNSG2dCharacterData; + +typedef struct NNSG2dScreenData +{ + + u16 screenWidth; // screen width (pixels) of rawData + u16 screenHeight; // screen height (pixels) of rawData + u16 colorMode; // character data color mode + u16 screenFormat; // screen data format + u32 szByte; // size of rawData + u32 rawData[1]; // screen data (variable length) + +} +NNSG2dScreenData; + + +extern BOOL NNS_G2dGetUnpackedBGCharacterData( void* pNcgrFile, NNSG2dCharacterData** ppCharData ); +extern BOOL NNS_G2dGetUnpackedScreenData( void* pNscrFile, NNSG2dScreenData** ppScrData ); + +#endif //NNSYS_NNS_G2D_H diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h index 26f6cfaf..210d61f4 100644 --- a/arm9/lib/include/gx.h +++ b/arm9/lib/include/gx.h @@ -5,6 +5,7 @@ #include "MI_memory.h" #include "MI_dma.h" #include "OS_vramExclusive.h" +#include "GX_ioreg.h" //temporary while other files aren't decompiled @@ -166,4 +167,18 @@ typedef enum } GXDispSelect; +typedef enum +{ + GX_OBJVRAMMODE_CHAR_2D = (0 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_32K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (0 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_64K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (1 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_128K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (2 << REG_GX_DISPCNT_EXOBJ_SHIFT), + GX_OBJVRAMMODE_CHAR_1D_256K = + (1 << REG_GX_DISPCNT_OBJMAP_SHIFT) | (3 << REG_GX_DISPCNT_EXOBJ_SHIFT) +} + GXOBJVRamModeChar; + #endif //GUARD_GX_H diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c new file mode 100644 index 00000000..db2614ab --- /dev/null +++ b/arm9/src/gf_gfx_loader.c @@ -0,0 +1,41 @@ +#include "global.h" +#include "filesystem.h" +#include "NNS_g2d.h" +#include "unk_02016B94.h" + +void * UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL isCompressed, u32 heap_id, BOOL allocAtEnd); + +THUMB_FUNC u32 FUN_0200687C(NarcId narcId, s32 memberNo, struct UnkStruct_02016B94_2 * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id) +{ + NNSG2dCharacterData * pCharData; + void * r7 = UncompressFromNarc(narcId, memberNo, isCompressed, heap_id, FALSE); + if (r7 != NULL) + { + if (NNS_G2dGetUnpackedBGCharacterData(r7, &pCharData)) + { + if (szByte == 0) + szByte = pCharData->szByte; + FUN_02017E14(unkStruct02016B94_2, (u8)a3, pCharData->pRawData, szByte, a4); + } + FreeToHeap(r7); + } + return szByte; +} + +THUMB_FUNC void FUN_020068C8(NarcId narcId, s32 memberNo, struct UnkStruct_02016B94_2 * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id) +{ + NNSG2dScreenData * pScreenData; + void * r7 = UncompressFromNarc(narcId, memberNo, isCompressed, heap_id, TRUE); + if (r7 != NULL) + { + if (NNS_G2dGetUnpackedScreenData(r7, &pScreenData)) + { + if (szByte == 0) + szByte = pScreenData->szByte; + if (FUN_0201886C(unkStruct02016B94_2, a3) != NULL) + FUN_02017DFC(unkStruct02016B94_2, (u8)a3, pScreenData->rawData, szByte); + FUN_02017CE8(unkStruct02016B94_2, (u8)a3, pScreenData->rawData, szByte, a4); + } + FreeToHeap(r7); + } +} diff --git a/arm9/src/unk_02016B94.c b/arm9/src/unk_02016B94.c index e01b3133..6a9dd194 100644 --- a/arm9/src/unk_02016B94.c +++ b/arm9/src/unk_02016B94.c @@ -3361,7 +3361,7 @@ THUMB_FUNC u8 (*FUN_02018848(u8 *param0, u32 param1, u8 param2, u32 heap_id))[2] return ptr; } -THUMB_FUNC void *FUN_0201886C(struct UnkStruct_02016B94_2 *param0, u32 param1) +THUMB_FUNC void *FUN_0201886C(struct UnkStruct_02016B94_2 *param0, u8 param1) { return param0->unk08[param1].unk08; } diff --git a/include/unk_02016B94.h b/include/unk_02016B94.h index a13f1634..fec45cd8 100644 --- a/include/unk_02016B94.h +++ b/include/unk_02016B94.h @@ -219,7 +219,7 @@ void FUN_0201878C(struct UnkStruct_02016B94_2 *param0, u32 param1, u16 param2); void *FUN_020187B0(u32 param0); void FUN_02018808(u8 *param0, u32 param1, u8 (*param2)[2], u8 param3); u8 (*FUN_02018848(u8 *param0, u32 param1, u8 param2, u32 heap_id))[2]; -void *FUN_0201886C(struct UnkStruct_02016B94_2 *param0, u32 param1); +void *FUN_0201886C(struct UnkStruct_02016B94_2 *param0, u8 param1); u16 FUN_02018878(struct UnkStruct_02016B94_2 *param0, u32 param1); u8 FUN_02018884(struct UnkStruct_02016B94_2 *param0, u32 param1); void BlitBitmapRect4Bit(struct UnkStruct_02016B94_3 *param0, -- cgit v1.2.3