From d61b81ee53aa27a862c3afe77c72c4963f68e5ad Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 12 Mar 2025 20:23:07 +0100 Subject: [PATCH 1/3] sub_800EF64 --- asm/code_800ED38.s | 112 ----------------------------------------- include/code_800558C.h | 22 +++++--- include/code_8009804.h | 8 ++- ld_script.txt | 1 - src/code_800558C.c | 11 ++-- src/code_8009804.c | 32 +++--------- src/code_800ED38.c | 95 +++++++++++++++++++++++++++------- 7 files changed, 110 insertions(+), 171 deletions(-) delete mode 100644 asm/code_800ED38.s diff --git a/asm/code_800ED38.s b/asm/code_800ED38.s deleted file mode 100644 index 9757a96b6..000000000 --- a/asm/code_800ED38.s +++ /dev/null @@ -1,112 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_800EF64 -sub_800EF64: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - ldr r0, _0800EF9C - mov r9, r0 - movs r1, 0x4 - mov r8, r1 - movs r7, 0 - movs r6, 0 - movs r5, 0x1 -_0800EF7A: - mov r0, r9 - ldr r1, [r0] - adds r0, r1, 0x4 - adds r0, r7 - ldr r0, [r0] - cmp r0, 0 - beq _0800F01A - mov r0, r8 - adds r4, r1, r0 - ldr r0, [r4] - cmp r0, 0x3 - beq _0800EFA0 - cmp r0, 0x3 - bls _0800F018 - cmp r0, 0x4 - beq _0800EFDA - b _0800F018 - .align 2, 0 -_0800EF9C: .4byte gUnknown_203B0D0 -_0800EFA0: - ldr r0, [r4, 0x8] - ldr r1, [r4, 0x18] - bl sub_8005674 - mov r1, r9 - ldr r0, [r1] - ldr r0, [r0] - cmp r0, 0 - beq _0800EFCA - cmp r0, 0x1 - bne _0800F00C - ldr r0, [r4, 0x8] - ldr r1, [r0, 0x18] - ldr r0, [r4, 0xC] - adds r0, 0x10 - lsls r0, 20 - lsrs r0, 16 - movs r2, 0x10 - bl sub_809971C - b _0800F00C -_0800EFCA: - ldr r0, [r4, 0xC] - ldr r1, [r4, 0x8] - ldr r1, [r1, 0x18] - ldr r2, [r4, 0x1C] - ldr r3, [r4, 0x20] - bl sub_8005770 - b _0800F00C -_0800EFDA: - bl sub_8000728 - cmp r0, 0x1 - bne _0800F000 - movs r0, 0 - movs r1, 0x1 - bl sub_800CD64 - movs r0, 0 - bl sub_8052210 - movs r0, 0x5 - movs r1, 0 - bl sub_803EAF0 - bl sub_800CB20 - bl xxx_call_update_bg_vram -_0800F000: - ldr r0, [r4, 0x8] - ldr r1, [r4, 0xC] - ldr r2, [r4, 0x10] - ldr r3, [r4, 0x14] - bl sub_8009A1C -_0800F00C: - ldr r0, [r4, 0x4] - cmp r0, 0 - beq _0800F018 - bl sub_800F204 - str r6, [r4, 0x4] -_0800F018: - str r6, [r4] -_0800F01A: - movs r0, 0x24 - add r8, r0 - adds r7, 0x24 - subs r5, 0x1 - cmp r5, 0 - bge _0800EF7A - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_800EF64 - - .align 2,0 diff --git a/include/code_800558C.h b/include/code_800558C.h index 463e0e2b1..ae8f120a7 100644 --- a/include/code_800558C.h +++ b/include/code_800558C.h @@ -5,13 +5,22 @@ #include "structs/axdata.h" #include "file_system.h" -// size: 0x20 -struct axMapSprite +typedef struct Palette256 { - axmain axmain; - const u32 *tiles; - const RGB *pal; - s32 tileCount; + RGB pal[256]; +} Palette256; + +// size: 0x20 +struct EfoFileData +{ + /* 0x0 */ ax_pose **poses; // TODO: Verify if these fields' names are actually valid + /* 0x4 */ ax_anim ***animations; + /* 0x8 */ s32 animCount; + /* 0xC */ void *spriteData; // ? + /* 0x10 */ Palette256 *unk10; // ? + /* 0x14 */const u32 *tiles; + /* 0x18 */const RGB *pal; + /* 0x1C */s32 tileCount; }; extern s16 *gUnknown_203B078; @@ -24,6 +33,7 @@ void nullsub_12(void); void nullsub_13(void); void nullsub_14(void); void sub_8005610(OpenedFile *, s32, s32, const RGB *); +const RGB *sub_8005674(const struct EfoFileData *a0, s32 vramIdx); void sub_8005770(s32, const RGB *color, s32, const RGB *ramp); void sub_80057E8(void); void sub_8005838(s32 *, u8 kind); diff --git a/include/code_8009804.h b/include/code_8009804.h index b388eb0ee..7f868fd5f 100644 --- a/include/code_8009804.h +++ b/include/code_8009804.h @@ -13,8 +13,14 @@ struct unkStruct_202D240 u32 size; }; -void vram_related_8009804(void); +struct unkStruct_8009A1C_ptr +{ + u8 fill0; + struct EfoFileData *ptr; +}; +void vram_related_8009804(void); +void sub_8009A1C(const struct EfoFileData *r0, u32 palId, u32 vramDstOffset, u32 r3); void InitFontPalette(void); void sub_80098A0(void); void sub_80098BC(u32 *, const u32 *, u32); diff --git a/ld_script.txt b/ld_script.txt index 2ae9cabea..23ebbca85 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -84,7 +84,6 @@ SECTIONS { src/code_800E9A8.o(.text); src/code_800E9E4.o(.text); src/code_800ED38.o(.text); - asm/code_800ED38.o(.text); src/code_800F034.o(.text); src/code_800F958.o(.text); src/friend_areas_map.o(.text); diff --git a/src/code_800558C.c b/src/code_800558C.c index 590b875a5..6a7adcfb5 100644 --- a/src/code_800558C.c +++ b/src/code_800558C.c @@ -29,15 +29,14 @@ extern const s16 gUnknown_80B816A[16 * 10]; extern const s16 gUnknown_80B82AA[16 * 10]; extern const s16 gUnknown_80B83EA[16 * 10]; -static void sub_800561C(struct axMapSprite *, s32, s32, const RGB *); -const RGB *sub_8005674(struct axMapSprite *, s32); +static void sub_800561C(struct EfoFileData *, s32, s32, const RGB *); void sub_8005610(OpenedFile *a0, s32 vramIdx, s32 brightness, const RGB *ramp) { - sub_800561C((struct axMapSprite *)a0->data, vramIdx, brightness, ramp); + sub_800561C((struct EfoFileData *)a0->data, vramIdx, brightness, ramp); } -static void sub_800561C(struct axMapSprite *a0, s32 vramIdx, s32 brightness, const RGB *ramp) +static void sub_800561C(struct EfoFileData *a0, s32 vramIdx, s32 brightness, const RGB *ramp) { s32 i; @@ -52,10 +51,10 @@ static void sub_800561C(struct axMapSprite *a0, s32 vramIdx, s32 brightness, con UNUSED static const RGB *sub_8005668(OpenedFile *a0, s32 vramIdx) { - return sub_8005674((struct axMapSprite *)a0->data, vramIdx); + return sub_8005674((struct EfoFileData *)a0->data, vramIdx); } -const RGB *sub_8005674(struct axMapSprite *a0, s32 vramIdx) +const RGB *sub_8005674(const struct EfoFileData *a0, s32 vramIdx) { if (a0->tiles != NULL) CpuCopy(OBJ_VRAM0 + vramIdx * 0x20, a0->tiles, a0->tileCount * 0x20); diff --git a/src/code_8009804.c b/src/code_8009804.c index f0d9f4fae..939421d8c 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -4,6 +4,7 @@ #include "cpu.h" #include "file_system.h" #include "text.h" +#include "code_800558C.h" extern const u8 gUnknown_80B88CC[]; extern const struct FileArchive gSystemFileArchive; // 8300500 @@ -14,27 +15,6 @@ EWRAM_DATA static s32 gUnknown_202D23C = 0; EWRAM_DATA static struct unkStruct_202D240 gUnknown_202D240[8] = {0}; EWRAM_DATA u32 gUnknown_202D2A0 = 0; -typedef struct Palette256 -{ - RGB pal[256]; -} Palette256; - -struct unkStruct_8009A1C -{ - u8 fill0[0x8]; - s32 unk8; - u32 *unkC; - Palette256 *unk10; -}; - -struct unkStruct_8009A1C_ptr -{ - u8 fill0; - struct unkStruct_8009A1C *ptr; -}; - -void sub_8009A1C(struct unkStruct_8009A1C *r0, u32 palId, u32 vramDstOffset, u32 r3); - void InitFontPalette(void) { OpenedFile *fontpalFile; @@ -158,16 +138,16 @@ UNUSED static void sub_8009A10(struct unkStruct_8009A1C_ptr *a0, u32 palId, u32 sub_8009A1C(a0->ptr, palId, vramDstOffset, r3); } -void sub_8009A1C(struct unkStruct_8009A1C *r0, u32 palId, u32 vramDstOffset, u32 r3) +void sub_8009A1C(const struct EfoFileData *r0, u32 palId, u32 vramDstOffset, u32 r3) { - s32 i; + s32 i, palPtrId; u32 *dst, *src; gUnknown_202D2A0 = r3; - src = r0->unkC; + src = r0->spriteData; dst = (void *)(VRAM) + vramDstOffset; - for (i = 0; i <= r0->unk8; i++) { + for (i = 0; i <= r0->animCount; i++) { *dst++ = *src++; *dst++ = *src++; *dst++ = *src++; @@ -178,7 +158,7 @@ void sub_8009A1C(struct unkStruct_8009A1C *r0, u32 palId, u32 vramDstOffset, u32 *dst++ = *src++; } - for (i = 0; i < 16; i++) { + for (i = 0, palPtrId = palId * 64; i < 16; i++) { SetBGPaletteBufferColorArray(i + 0xE0, &r0->unk10->pal[i + palId * 16]); } } diff --git a/src/code_800ED38.c b/src/code_800ED38.c index deb74af12..b5a549ce3 100644 --- a/src/code_800ED38.c +++ b/src/code_800ED38.c @@ -1,23 +1,28 @@ #include "global.h" #include "code_800E9E4.h" #include "dungeon_pokemon_sprites.h" +#include "dungeon_message.h" #include "file_system.h" #include "main_loops.h" #include "memory.h" #include "sprite.h" +#include "code_800C9CC.h" +#include "code_800558C.h" +#include "bg_control.h" +#include "code_8009804.h" struct unkStruct_203B0D0_sub { // size: 0x24 u32 unk0; - struct unkStruct_203B0D0_sub *unk4; - struct unkStruct_203B0D0_sub *unk8; + OpenedFile *file; + const struct EfoFileData *fileData; u32 unkC; s32 unk10; s32 unk14; s32 unk18; s32 unk1C; - u32 unk20; + const RGB *ramp; }; struct unkStruct_203B0D0 { @@ -66,8 +71,8 @@ void sub_800ED80(void) { sub = &gUnknown_203B0D0->unk4[index]; sub->unk0 = 0; - sub->unk4 = 0; - sub->unk8 = 0; + sub->file = NULL; + sub->fileData = NULL; } } @@ -86,9 +91,9 @@ bool8 sub_800EDB0(struct unkStruct_203B0D0_sub *r0) return FALSE; } -void sub_800EDF0(u32 r0, struct unkStruct_203B0D0_sub *r1) { +void sub_800EDF0(u32 r0, OpenedFile *file) +{ struct unkStruct_203B0D0_sub stack; - s32 uVar1; switch(r0) { @@ -96,26 +101,23 @@ void sub_800EDF0(u32 r0, struct unkStruct_203B0D0_sub *r1) { stack.unk0 = 3; stack.unkC = 0xE; stack.unk10 = -1; - stack.unk18 = 0xDC << 2; + stack.unk18 = 0x370; stack.unk1C = 0x1F; - stack.unk14 = -1; - stack.unk4 = r1; + stack.unk14 = -1; + stack.file = file; break; case 1: stack.unk0 = 4; stack.unkC = 0xE; - stack.unk10 = 0xF0 << 4; + stack.unk10 = 0xF00; stack.unk18 = -1; stack.unk1C = -1; - - // TODO: what math op is this again? - uVar1 = sub_8000728(); - stack.unk14 = (((int)(-(uVar1 ^ 2) | (uVar1 ^ 2)) >> 0x1f) & 2); - stack.unk4 = r1; + stack.unk14 = (sub_8000728() != 2) ? 2 : 0; + stack.file = file; break; } - stack.unk8 = r1->unk4; - stack.unk20 = 0; + stack.fileData = (void *) file->data; + stack.ramp = NULL; sub_800EDB0(&stack); } @@ -145,7 +147,7 @@ void sub_800EE5C(s32 r0) else if(ret2 != -2) { sub_800F13C(ret2, file, ret); - sub_800EDF0(ret2, (void *)file); + sub_800EDF0(ret2, file); } else { sub_800F204(file); @@ -202,3 +204,58 @@ void sub_800EF40(u8 r0, u8 r1) } sub_800EE5C(ret); } + +extern void xxx_call_update_bg_vram(void); +extern void sub_803EAF0(u32 a0, u8 *a1); +extern void sub_809971C(u16 a0, const RGB *a1, int a2); + +void sub_800EF64(void) +{ + s32 i; + struct unkStruct_203B0D0_sub *sub; + + for (i = 0; i < 2; i++) { + if (gUnknown_203B0D0->unk4[i].unk0 == 0) + continue; + + sub = &gUnknown_203B0D0->unk4[i]; + switch(sub->unk0) { + case 1: + case 2: + break; + case 3: + sub_8005674(sub->fileData, sub->unk18); + switch(gUnknown_203B0D0->unk0) { + case 1: { + const RGB *pal = sub->fileData->pal; + sub_809971C((sub->unkC + 16) * 16, pal, 0x10); + break; + } + case 0: { + sub_8005770(sub->unkC, sub->fileData->pal, sub->unk1C, sub->ramp); + break; + } + } + if(sub->file != 0) { + sub_800F204(sub->file); + sub->file = NULL; + } + break; + case 4: + if (sub_8000728() == 1) { + sub_800CD64(0, TRUE); + sub_8052210(0); + sub_803EAF0(5, NULL); + sub_800CB20(); + xxx_call_update_bg_vram(); + } + sub_8009A1C(sub->fileData, sub->unkC, sub->unk10, sub->unk14); + if(sub->file != NULL) { + sub_800F204(sub->file); + sub->file = NULL; + } + break; + } + sub->unk0 = 0; + } +} From 3fcae2f28e482be2f3cf57225d7a0af2ade4c4d6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 12 Mar 2025 20:24:57 +0100 Subject: [PATCH 2/3] oops --- src/code_8009804.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code_8009804.c b/src/code_8009804.c index 939421d8c..54d24892a 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -140,7 +140,7 @@ UNUSED static void sub_8009A10(struct unkStruct_8009A1C_ptr *a0, u32 palId, u32 void sub_8009A1C(const struct EfoFileData *r0, u32 palId, u32 vramDstOffset, u32 r3) { - s32 i, palPtrId; + s32 i; u32 *dst, *src; gUnknown_202D2A0 = r3; @@ -158,7 +158,7 @@ void sub_8009A1C(const struct EfoFileData *r0, u32 palId, u32 vramDstOffset, u32 *dst++ = *src++; } - for (i = 0, palPtrId = palId * 64; i < 16; i++) { + for (i = 0; i < 16; i++) { SetBGPaletteBufferColorArray(i + 0xE0, &r0->unk10->pal[i + palId * 16]); } } From 5e7abba7ed44e37463727c1977ec98fb4761fc8d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 13 Mar 2025 20:45:08 +0100 Subject: [PATCH 3/3] missing spaces after slashes --- include/code_800558C.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/code_800558C.h b/include/code_800558C.h index ae8f120a7..057c1bd31 100644 --- a/include/code_800558C.h +++ b/include/code_800558C.h @@ -18,9 +18,9 @@ struct EfoFileData /* 0x8 */ s32 animCount; /* 0xC */ void *spriteData; // ? /* 0x10 */ Palette256 *unk10; // ? - /* 0x14 */const u32 *tiles; - /* 0x18 */const RGB *pal; - /* 0x1C */s32 tileCount; + /* 0x14 */ const u32 *tiles; + /* 0x18 */ const RGB *pal; + /* 0x1C */ s32 tileCount; }; extern s16 *gUnknown_203B078;