From 19701f844ba60c620bdcac6085defd59ac93ce2e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Mar 2025 18:26:04 +0100 Subject: [PATCH] decompile code_8002774 --- asm/code_8002774.s | 226 --------------------------------------------- ld_script.txt | 1 - src/code_8002774.c | 61 ++++++++++++ 3 files changed, 61 insertions(+), 227 deletions(-) delete mode 100644 asm/code_8002774.s diff --git a/asm/code_8002774.s b/asm/code_8002774.s deleted file mode 100644 index 0091081d4..000000000 --- a/asm/code_8002774.s +++ /dev/null @@ -1,226 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8002774 -sub_8002774: - sub sp, 0x4 - str r0, [sp] - mov r0, sp - ldrb r1, [r0, 0x2] - movs r0, 0xF8 - adds r2, r0, 0 - ands r2, r1 - lsls r2, 7 - mov r1, sp - ldrb r3, [r1, 0x1] - adds r1, r0, 0 - ands r1, r3 - lsls r1, 2 - orrs r2, r1 - mov r1, sp - ldrb r1, [r1] - ands r0, r1 - lsrs r0, 3 - orrs r0, r2 - add sp, 0x4 - bx lr - thumb_func_end sub_8002774 - - thumb_func_start sub_80027A0 -sub_80027A0: - push {r4,lr} - sub sp, 0x4 - lsls r0, 16 - lsrs r2, r0, 16 - adds r3, r2, 0 - mov r4, sp - movs r0, 0x1F - ands r0, r2 - lsls r1, r0, 3 - movs r0, 0x1 - ands r0, r2 - cmp r0, 0 - beq _080027BE - movs r0, 0x7 - orrs r1, r0 -_080027BE: - strb r1, [r4] - mov r4, sp - movs r0, 0xF8 - lsls r0, 2 - ands r0, r2 - lsrs r1, r0, 2 - movs r0, 0x20 - ands r0, r2 - cmp r0, 0 - beq _080027D6 - movs r0, 0x7 - orrs r1, r0 -_080027D6: - strb r1, [r4, 0x1] - mov r2, sp - movs r0, 0xF8 - lsls r0, 7 - ands r0, r3 - lsrs r1, r0, 7 - movs r0, 0x80 - lsls r0, 3 - ands r3, r0 - cmp r3, 0 - beq _080027F0 - movs r0, 0x7 - orrs r1, r0 -_080027F0: - strb r1, [r2, 0x2] - mov r0, sp - movs r1, 0 - strb r1, [r0, 0x3] - ldr r0, [sp] - add sp, 0x4 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_80027A0 - - thumb_func_start sub_8002804 -sub_8002804: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - movs r3, 0 -_0800280C: - adds r1, r5, r3 - adds r0, r2, r3 - ldrb r0, [r0] - muls r0, r4 - cmp r0, 0 - bge _0800281A - adds r0, 0xFF -_0800281A: - asrs r0, 8 - strb r0, [r1] - adds r3, 0x1 - cmp r3, 0x3 - ble _0800280C - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8002804 - - thumb_func_start sub_800282C -sub_800282C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x38 - mov r9, r0 - str r1, [sp, 0x20] - adds r7, r2, 0 - mov r8, r3 - adds r0, r1, 0 - bl __floatsisf - adds r1, r0, 0 - ldr r0, _08002904 - bl __divsf3 - str r0, [sp, 0x24] - movs r5, 0 - mov r0, sp - adds r0, 0x10 - str r0, [sp, 0x2C] - str r0, [sp, 0x34] - mov r10, sp -_0800285C: - adds r6, r7, r5 - movs r4, 0 - ldrsb r4, [r6, r4] - adds r0, r4, 0 - bl __floatsisf - cmp r4, 0 - bge _08002872 - ldr r1, _08002908 - bl __addsf3 -_08002872: - mov r1, r10 - adds r1, 0x4 - mov r10, r1 - subs r1, 0x4 - stm r1!, {r0} - mov r1, r8 - adds r0, r1, r5 - ldrb r0, [r0] - ldrb r1, [r6] - subs r0, r1 - bl __floatsisf - ldr r1, [sp, 0x24] - bl __mulsf3 - ldr r1, [sp, 0x34] - stm r1!, {r0} - str r1, [sp, 0x34] - adds r5, 0x1 - cmp r5, 0x3 - ble _0800285C - ldr r0, [r7] - mov r1, r9 - adds r1, 0x4 - mov r9, r1 - subs r1, 0x4 - stm r1!, {r0} - movs r5, 0x1 - ldr r0, [sp, 0x20] - subs r0, 0x1 - str r0, [sp, 0x28] - mov r1, r8 - ldr r1, [r1] - str r1, [sp, 0x30] - cmp r5, r0 - bge _080028EE -_080028BA: - movs r6, 0 - adds r5, 0x1 - mov r10, r5 - movs r0, 0x4 - add r0, r9 - mov r8, r0 - mov r5, sp - ldr r7, [sp, 0x2C] -_080028CA: - mov r1, r9 - adds r4, r1, r6 - ldr r0, [r5] - ldm r7!, {r1} - bl __addsf3 - stm r5!, {r0} - bl __fixunssfsi - strb r0, [r4] - adds r6, 0x1 - cmp r6, 0x3 - ble _080028CA - mov r9, r8 - mov r5, r10 - ldr r0, [sp, 0x28] - cmp r5, r0 - blt _080028BA -_080028EE: - ldr r1, [sp, 0x30] - mov r0, r9 - str r1, [r0] - add sp, 0x38 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08002904: .4byte 0x3f800000 -_08002908: .4byte 0x43800000 - thumb_func_end sub_800282C - - .align 2, 0 @ Don't pad with nop. diff --git a/ld_script.txt b/ld_script.txt index 4148b76df..6db5eedac 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -51,7 +51,6 @@ SECTIONS { asm/arm_func.o(.text); src/main_loops.o(.text); src/event_flag.o(.text); - asm/code_8002774.o(.text); src/code_8002774.o(.text); src/memory.o(.text); asm/code_80035F0.o(.text); diff --git a/src/code_8002774.c b/src/code_8002774.c index 945a3ebc0..3b8ddbcb5 100644 --- a/src/code_8002774.c +++ b/src/code_8002774.c @@ -4,6 +4,67 @@ #include "structs/str_position.h" #include "other_random.h" +#define UNK_STRUCT_ARR_COUNT 4 + +struct S +{ + u8 x0[UNK_STRUCT_ARR_COUNT]; +}; + +u16 sub_8002774(struct S s) +{ + return ((s.x0[2] & 0xF8) << 7) | ((s.x0[1] & 0xF8) << 2) | ((s.x0[0] & 0xF8) >> 3); +} + +struct S sub_80027A0(u16 a0) +{ + struct S ret; + + ret.x0[0] = (a0 & 0x1F) << 3 | ((a0 & 1) ? 7 : 0); + ret.x0[1] = (a0 & 0x3E0) >> 2 | ((a0 & 0x20) ? 7 : 0); + ret.x0[2] = (a0 & 0x7C00) >> 7 | ((a0 & 0x400) ? 7 : 0); + ret.x0[3] = 0; + return ret; +} + +UNUSED static void sub_8002804(struct S *r0, s32 r1, struct S *r2) +{ + s32 i; + + for (i = 0; i < UNK_STRUCT_ARR_COUNT; i++) { + r0->x0[i] = (r1 * r2->x0[i]) / 256; + } +} + +UNUSED static void sub_800282C(struct S *dst, s32 a1, struct S *a2, struct S *a3) +{ + s32 i, j; + float spFloats[4]; + float floatsMul[4]; + float f0 = 1.0f / a1; + + for (i = 0; i < 4; i++) { + s8 asSigned = (s8) a2->x0[i]; + float f = (float)(asSigned); + if (asSigned < 0) { + f += 256.0f; + } + spFloats[i] = f; + floatsMul[i] = (float)(a3->x0[i] - a2->x0[i]) * f0; + } + + *dst++ = *a2; + for (i = 1; i < a1 - 1; dst++, i++) { + for (j = 0; j < 4; j++) { + dst->x0[j] = (unsigned int)((spFloats[j] += floatsMul[j])); + } + } + + *dst = *a3; +} + +// File split here? + extern PixelPos gVectorDirections[8]; void sub_800290C(PixelPos *param_1, s32 param_2)