From 67ca7f5bfd308a16dc89e55b7b1f7c0ba361aac8 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Wed, 30 Aug 2023 23:52:50 -0400 Subject: [PATCH] Match all of code_800558C.s --- asm/code_800558C.s | 276 --------------------------------------- include/axdata.h | 2 +- include/code_800558C_1.h | 12 ++ include/sprite.h | 1 + ld_script.txt | 2 - src/code_800558C.c | 4 +- src/code_800558C_1.c | 139 ++++++++++++++++++-- src/code_800DAC0.c | 2 +- src/sprite.c | 4 +- 9 files changed, 150 insertions(+), 292 deletions(-) delete mode 100644 asm/code_800558C.s diff --git a/asm/code_800558C.s b/asm/code_800558C.s deleted file mode 100644 index edf18bd86..000000000 --- a/asm/code_800558C.s +++ /dev/null @@ -1,276 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start DoAxFrame_800558C -DoAxFrame_800558C: - push {r4-r7,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - adds r7, r3, 0 - ldrh r0, [r5] - lsrs r0, 15 - cmp r0, 0 - beq _08005602 - movs r1, 0x20 - ldrsh r0, [r5, r1] - cmp r0, 0 - bge _080055AE - adds r0, r5, 0 - bl sub_80054BC -_080055AE: - ldrh r0, [r5] - lsrs r0, 15 - cmp r0, 0 - beq _08005602 - ldrh r0, [r5, 0xC] - adds r0, r4 - strh r0, [r5, 0x8] - ldrh r0, [r5, 0xE] - adds r0, r6 - strh r0, [r5, 0xA] - adds r1, r5, 0 - adds r1, 0x26 - ldr r0, [sp, 0x18] - strb r0, [r1] - strh r7, [r5, 0x1E] - ldr r0, [r5, 0x34] - ldr r1, [r5, 0x38] - adds r2, r5, 0 - adds r2, 0x8 - movs r3, 0x22 - ldrsh r4, [r5, r3] - movs r6, 0x20 - ldrsh r3, [r5, r6] - eors r4, r3 - negs r3, r4 - orrs r3, r4 - lsrs r3, 31 - str r3, [sp] - ldr r3, [sp, 0x1C] - bl sub_800533C - ldrh r0, [r5, 0x20] - strh r0, [r5, 0x22] - ldrh r1, [r5] - movs r0, 0x80 - lsls r0, 4 - ands r0, r1 - cmp r0, 0 - beq _08005602 - ldr r0, _0800560C - ands r0, r1 - strh r0, [r5] -_08005602: - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0800560C: .4byte 0x0000f7ff - thumb_func_end DoAxFrame_800558C - - thumb_func_start sub_8005610 -sub_8005610: - push {lr} - ldr r0, [r0, 0x4] - bl sub_800561C - pop {r0} - bx r0 - thumb_func_end sub_8005610 - - thumb_func_start sub_800561C -sub_800561C: - push {r4-r7,lr} - adds r5, r0, 0 - adds r0, r1, 0 - adds r7, r2, 0 - adds r6, r3, 0 - ldr r1, [r5, 0x14] - cmp r1, 0 - beq _0800563A - lsls r0, 5 - ldr r2, _08005664 - adds r0, r2 - ldr r2, [r5, 0x1C] - lsls r2, 5 - bl CpuCopy -_0800563A: - ldr r0, [r5, 0x18] - cmp r0, 0 - beq _0800565C - movs r4, 0 -_08005642: - movs r1, 0xF0 - lsls r1, 1 - adds r0, r4, r1 - lsls r2, r4, 2 - ldr r1, [r5, 0x18] - adds r1, r2 - adds r2, r7, 0 - adds r3, r6, 0 - bl SetBGPaletteBufferColorRGB - adds r4, 0x1 - cmp r4, 0xF - ble _08005642 -_0800565C: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08005664: .4byte 0x06010000 - thumb_func_end sub_800561C - - thumb_func_start sub_8005668 -sub_8005668: - push {lr} - ldr r0, [r0, 0x4] - bl sub_8005674 - pop {r1} - bx r1 - thumb_func_end sub_8005668 - - thumb_func_start sub_8005674 -sub_8005674: - push {r4,lr} - adds r4, r0, 0 - ldr r3, [r4, 0x14] - cmp r3, 0 - beq _0800568E - lsls r0, r1, 5 - ldr r1, _08005698 - adds r0, r1 - ldr r2, [r4, 0x1C] - lsls r2, 5 - adds r1, r3, 0 - bl CpuCopy -_0800568E: - ldr r0, [r4, 0x18] - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08005698: .4byte 0x06010000 - thumb_func_end sub_8005674 - - thumb_func_start sub_800569C -sub_800569C: - push {r4-r6,lr} - adds r3, r0, 0 - adds r4, r1, 0 - lsls r2, 24 - lsrs r2, 24 - movs r0, 0 - strh r0, [r3] - strh r0, [r3, 0x2] - ldrh r0, [r4] - lsrs r0, 15 - cmp r0, 0 - beq _080056F8 - cmp r2, 0x3 - bhi _080056F8 - ldr r1, [r4, 0x30] - cmp r1, 0 - beq _080056F2 - movs r5, 0x20 - ldrsh r0, [r4, r5] - lsls r0, 4 - adds r5, r1, r0 - lsls r0, r2, 2 - adds r2, r5, r0 - movs r6, 0 - ldrsh r1, [r2, r6] - cmp r1, 0x63 - bne _080056E0 - movs r6, 0x2 - ldrsh r1, [r2, r6] - cmp r1, 0x63 - bne _080056E0 - strh r1, [r3] - strh r1, [r3, 0x2] - b _080056F8 -_080056E0: - adds r0, r5, r0 - ldrh r1, [r0] - ldrh r2, [r4, 0xC] - adds r1, r2 - strh r1, [r3] - ldrh r0, [r0, 0x2] - ldrh r4, [r4, 0xE] - adds r0, r4 - b _080056F6 -_080056F2: - movs r0, 0x63 - strh r0, [r3] -_080056F6: - strh r0, [r3, 0x2] -_080056F8: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_800569C - - thumb_func_start sub_8005700 -sub_8005700: - push {r4,r5,lr} - adds r3, r0, 0 - ldrh r0, [r1] - lsrs r0, 15 - cmp r0, 0 - beq _0800575C - ldr r2, [r1, 0x30] - cmp r2, 0 - beq _0800574C - movs r4, 0x20 - ldrsh r0, [r1, r4] - lsls r0, 4 - adds r2, r0 - adds r4, r2, 0 - adds r4, 0xC -_0800571E: - movs r5, 0 - ldrsh r0, [r2, r5] - cmp r0, 0x63 - bne _08005732 - movs r5, 0x2 - ldrsh r0, [r2, r5] - cmp r0, 0x63 - bne _08005732 - strh r0, [r3] - b _08005740 -_08005732: - ldrh r0, [r2] - ldrh r5, [r1, 0xC] - adds r0, r5 - strh r0, [r3] - ldrh r0, [r2, 0x2] - ldrh r5, [r1, 0xE] - adds r0, r5 -_08005740: - strh r0, [r3, 0x2] - adds r3, 0x4 - adds r2, 0x4 - cmp r2, r4 - ble _0800571E - b _0800575C -_0800574C: - movs r1, 0x63 - movs r0, 0x3 -_08005750: - strh r1, [r3] - strh r1, [r3, 0x2] - adds r3, 0x4 - subs r0, 0x1 - cmp r0, 0 - bge _08005750 -_0800575C: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8005700 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/axdata.h b/include/axdata.h index e570f0e9a..34fedd240 100644 --- a/include/axdata.h +++ b/include/axdata.h @@ -62,7 +62,7 @@ struct axdata /* 0x28 */ struct ax_anim *nextAnimData; // next animation data (if flags&0x1000) /* 0x2C */ struct ax_anim *activeAnimData; // current animation data /* 0x30 */ void *paletteData; // ? - /* 0x34 */ struct ax_pose *poseData; + /* 0x34 */ struct ax_pose **poseData; /* 0x38 */ struct UnkSpriteMem **spriteData; }; diff --git a/include/code_800558C_1.h b/include/code_800558C_1.h index 2e058ebb0..2d6e74d9a 100644 --- a/include/code_800558C_1.h +++ b/include/code_800558C_1.h @@ -1,12 +1,24 @@ #ifndef GUARD_CODE_800558C_1_H #define GUARD_CODE_800558C_1_H +#include "file_system.h" + +// size: ? 0x20 for now +struct unkStructFor800561C +{ + u8 fill0[0x14 - 0x0]; + void *unk14; + s32 *unk18; + s32 unk1C; +}; + void nullsub_7(s16 *); void nullsub_9(void); void nullsub_10(bool8); void nullsub_12(void); void nullsub_13(void); void nullsub_14(void); +void sub_8005610(struct OpenedFile *, s32, s32, u8 *); void sub_8005770(s32, u8 *, s32, u8 *); void sub_80057E8(void); diff --git a/include/sprite.h b/include/sprite.h index 1e217b36e..f4e4ce738 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -83,6 +83,7 @@ void SetSavingIconCoords(struct Position *); void sub_8004E8C(struct unkStruct_2039DB0 *); void sub_8005180(void); void sub_8005304(void); +void sub_800533C(struct ax_pose **, struct UnkSpriteMem **, struct axdata1 *, u16 *, bool8); void sub_80053AC(struct EntitySpriteInfo *, struct OpenedFile *, u32, u32, u32, u32, bool8); void sub_80053D0(struct EntitySpriteInfo *, struct Dungeon_ax *, u32, u32, u32, u32, bool8); void sub_800543C(struct EntitySpriteInfo *, struct OpenedFile *, u32, u32, u32, bool8); diff --git a/ld_script.txt b/ld_script.txt index 26feccc15..040c47603 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -61,7 +61,6 @@ SECTIONS { src/input.o(.text); src/code_8004AA0.o(.text); src/sprite.o(.text); - asm/code_800558C.o(.text); src/code_800558C_1.o(.text); asm/code_8005838.o(.text); src/code_800558C.o(.text); @@ -196,7 +195,6 @@ SECTIONS { asm/code_80521D0.o(.text); src/charge_move.o(.text); src/move_util.o(.text); - asm/code_805744C.o(.text); src/code_8057824.o(.text); asm/code_8057824.o(.text); src/code_805A120.o(.text); diff --git a/src/code_800558C.c b/src/code_800558C.c index e144d84d0..cd553cfa5 100644 --- a/src/code_800558C.c +++ b/src/code_800558C.c @@ -3,11 +3,11 @@ #include "code_800558C.h" extern u8 gUnknown_2026E38; -extern u32 gUnknown_2026E3C; +extern u32 *gUnknown_2026E3C; extern u16 gUnknown_2026E4E; extern bool32 gUnknown_2026E50; extern bool32 gUnknown_2026E54; -extern u32 gUnknown_2026E58; +extern u32 *gUnknown_2026E58; UNUSED static void sub_80060A8(void) { diff --git a/src/code_800558C_1.c b/src/code_800558C_1.c index 1650d92fa..c0566d7d8 100644 --- a/src/code_800558C_1.c +++ b/src/code_800558C_1.c @@ -1,17 +1,140 @@ #include "global.h" #include "bg_palette_buffer.h" #include "code_800558C_1.h" -#include "file_system.h" +#include "cpu.h" +#include "sprite.h" extern u8 gUnknown_2026E38; -extern u32 gUnknown_2026E3C; -extern u8 gUnknown_2026E4C; +extern u32 *gUnknown_2026E3C; +extern bool8 gUnknown_2026E4C; extern u16 gUnknown_2026E4E; extern bool32 gUnknown_2026E50; extern bool32 gUnknown_2026E54; -extern u32 gUnknown_2026E58; +extern u32 *gUnknown_2026E58; extern u32 gUnknown_203B078; +static void sub_800561C(struct unkStructFor800561C *, s32, s32, u8 *); +s32 *sub_8005674(struct unkStructFor800561C *a0, s32 a1); + +void DoAxFrame_800558C(struct axPokemon *a0, s32 spriteX, s32 spriteY, u32 a3, u32 paletteNum, u16 *spriteMasks) +{ + if (!(a0->axdata.flags >> 15)) + return; + + if (a0->axdata.sub1.poseId < 0) + sub_80054BC(a0); + + if (!(a0->axdata.flags >> 15)) + return; + + a0->axdata.sub1.xPos = a0->axdata.sub1.xOffset + spriteX; + a0->axdata.sub1.yPos = a0->axdata.sub1.yOffset + spriteY; + a0->axdata.sub1.paletteNum = paletteNum; + a0->axdata.sub1.unk16 = a3; + sub_800533C(a0->axdata.poseData, a0->axdata.spriteData, &a0->axdata.sub1, spriteMasks, !!(a0->axdata.sub1.lastPoseId ^ a0->axdata.sub1.poseId)); + a0->axdata.sub1.lastPoseId = a0->axdata.sub1.poseId; + + if (a0->axdata.flags & 0x800) + a0->axdata.flags &= 0xF7FF; +} + +void sub_8005610(struct OpenedFile *a0, s32 a1, s32 a2, u8 *a3) +{ + sub_800561C((struct unkStructFor800561C *)a0->data, a1, a2, a3); +} + +static void sub_800561C(struct unkStructFor800561C *a0, s32 a1, s32 a2, u8 *a3) +{ + s32 i; + + if (a0->unk14 != NULL) + CpuCopy(OBJ_VRAM0 + a1 * 0x20, a0->unk14, a0->unk1C << 5); + + if (a0->unk18 != NULL) { + for (i = 0; i < 16; i++) + SetBGPaletteBufferColorRGB(i + 480, (u8 *)&a0->unk18[i], a2, a3); + } +} + +UNUSED static s32 *sub_8005668(struct OpenedFile *a0, s32 a1) +{ + return sub_8005674((struct unkStructFor800561C *)a0->data, a1); +} + +s32 *sub_8005674(struct unkStructFor800561C *a0, s32 a1) +{ + if (a0->unk14 != NULL) + CpuCopy(OBJ_VRAM0 + a1 * 0x20, a0->unk14, a0->unk1C << 5); + + return a0->unk18; +} + +// a0 is an s16[2] and a1 is not confirmed to be (struct axPokemon *) yet +void sub_800569C(s16 *a0, struct axPokemon *a1, u8 a2) +{ + s16 *ptr; + s16 *ptr2; + s16 *ptr3; + + a0[0] = 0; + a0[1] = 0; + + if (!(a1->axdata.flags >> 15) || a2 >= 4) + return; + + if (a1->axdata.paletteData != NULL) { + ptr = (s16 *)a1->axdata.paletteData; + ptr += a1->axdata.sub1.poseId * 8; + ptr2 = ptr + (a2 * 2); + if (ptr2[0] == 99 && ptr2[1] == 99) { + a0[0] = 99; + a0[1] = 99; + } + else { + ptr3 = ptr + (a2 * 2); + a0[0] = a1->axdata.sub1.xOffset + ptr3[0]; + a0[1] = a1->axdata.sub1.yOffset + ptr3[1]; + } + } + else { + a0[0] = 99; + a0[1] = 99; + } +} + +// a0 is an s16[12] and a1 is not confirmed to be (struct axPokemon *) yet +void sub_8005700(s16 *a0, struct axPokemon *a1) +{ + s32 i; + s16 *ptr; + + if (!(a1->axdata.flags >> 15)) + return; + + if (a1->axdata.paletteData != NULL) { + ptr = (s16 *)a1->axdata.paletteData; + ptr += a1->axdata.sub1.poseId * 8; + for (i = 0; i <= 6; i += 2) { + if (ptr[i] == 99 && ptr[i + 1] == 99) { + a0[0] = 99; + a0[1] = 99; + } + else { + a0[0] = a1->axdata.sub1.xOffset + ptr[i]; + a0[1] = a1->axdata.sub1.yOffset + ptr[i + 1]; + } + a0 += 2; + } + } + else { + for (i = 0; i < 4; i++) { + a0[0] = 99; + a0[1] = 99; + a0 += 2; + } + } +} + UNUSED static void sub_8005764(s32 a0, struct OpenedFile *file, s32 a2, u8 *a3) { sub_8005770(a0, file->data, a2, a3); @@ -86,11 +209,11 @@ UNUSED static void nullsub_151(void) void sub_80057E8(void) { - gUnknown_2026E4C = 1; - gUnknown_2026E54 = 0; + gUnknown_2026E4C = TRUE; + gUnknown_2026E54 = FALSE; gUnknown_2026E50 = 1; - gUnknown_2026E58 = 0; - gUnknown_2026E3C = 0; + gUnknown_2026E58 = NULL; + gUnknown_2026E3C = NULL; gUnknown_2026E38 = 0; gUnknown_2026E4E = 0x60C; gUnknown_203B078 = 0; diff --git a/src/code_800DAC0.c b/src/code_800DAC0.c index b95e4a7e5..36347076a 100644 --- a/src/code_800DAC0.c +++ b/src/code_800DAC0.c @@ -1,5 +1,6 @@ #include "global.h" #include "bg_control.h" +#include "code_800558C_1.h" #include "code_800DAC0.h" #include "code_80118A4.h" #include "file_system.h" @@ -56,7 +57,6 @@ extern u8 gefob000_string[]; extern u8 gefob001_string[]; extern struct FileArchive gEffectFileArchive; -extern void sub_8005610(struct OpenedFile *, u32, u32,u32); extern void sub_800F034(void); extern void sub_800ED38(u32); extern void sub_800DC14(void); diff --git a/src/sprite.c b/src/sprite.c index e80999b93..1b4e2a3ba 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -870,8 +870,8 @@ void sub_8005304(void) } } -// spriteMasks is a u16[6]. a4 might be a bool8 -void sub_800533C(struct ax_pose **a0, struct UnkSpriteMem **a1, struct axdata1 *a2, u16 *spriteMasks, char a4) +// spriteMasks is a u16[6] +void sub_800533C(struct ax_pose **a0, struct UnkSpriteMem **a1, struct axdata1 *a2, u16 *spriteMasks, bool8 a4) { struct UnkSpriteMem *mem; struct ax_pose *r4;