From 039d5c05cbb8cf855571de93771a89ad9c13ac50 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 25 May 2025 20:59:12 +0200 Subject: [PATCH] Decompile code_8009804 --- asm/code_8009804.s | 269 --------------------------------------------- ld_script.ld | 1 - src/code_8009804.c | 105 ++++++++++++++++++ 3 files changed, 105 insertions(+), 270 deletions(-) delete mode 100644 asm/code_8009804.s diff --git a/asm/code_8009804.s b/asm/code_8009804.s deleted file mode 100644 index 417ff23df..000000000 --- a/asm/code_8009804.s +++ /dev/null @@ -1,269 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8009A7C -sub_8009A7C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x18 - str r0, [sp] - adds r5, r1, 0 - str r2, [sp, 0x4] - str r3, [sp, 0x8] - ldr r0, [sp, 0x38] - ldr r3, [sp, 0x40] - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _08009AB4 - ldr r1, [r0] - movs r2, 0 - str r2, [sp, 0x10] - cmp r1, 0 - bne _08009AA8 - movs r7, 0x1 - str r7, [sp, 0x10] -_08009AA8: - ldr r1, [sp] - ldr r0, [r1] - cmp r5, r0 - blt _08009AB8 - movs r0, 0 - b _08009BCE - .align 2, 0 -_08009AB4: .4byte gUnknown_202D2A0 -_08009AB8: - lsls r5, 2 - mov r8, r5 - cmp r4, 0 - beq _08009AFA - movs r0, 0 - ldr r2, _08009B74 - mov r10, r2 - ldr r4, _08009B78 - mov r9, r4 - ldr r1, [sp, 0x10] - lsls r7, r1, 1 -_08009ACE: - ldr r2, [sp, 0x10] - adds r4, r0, 0x1 - mov r12, r4 - cmp r2, 0x1D - bgt _08009AF4 - mov r6, r10 - mov r5, r9 - movs r4, 0 - lsls r0, 6 - adds r1, r7, r0 -_08009AE2: - ldr r0, [r5] - lsls r0, 11 - adds r0, r1, r0 - adds r0, r6 - strh r4, [r0] - adds r1, 0x2 - adds r2, 0x1 - cmp r2, 0x1D - ble _08009AE2 -_08009AF4: - mov r0, r12 - cmp r0, 0x13 - ble _08009ACE -_08009AFA: - ldr r7, [sp] - ldr r0, [r7, 0x4] - add r0, r8 - ldr r5, [r0] - ldrh r0, [r5, 0x4] - mov r9, r0 - ldrh r1, [r5, 0x6] - str r1, [sp, 0xC] - ldr r2, [sp, 0x3C] - cmp r2, 0 - beq _08009B14 - ldrh r0, [r5, 0x8] - str r0, [r2] -_08009B14: - cmp r3, 0 - beq _08009B28 - ldrh r0, [r5, 0xA] - strh r0, [r3] - ldrh r0, [r5, 0xC] - strh r0, [r3, 0x2] - ldrh r0, [r5, 0xE] - strh r0, [r3, 0x4] - ldrh r0, [r5, 0x10] - strh r0, [r3, 0x6] -_08009B28: - adds r5, 0x14 - ldr r4, [sp, 0x8] - str r4, [sp, 0x14] - movs r6, 0 - movs r0, 0 - ldr r7, [sp, 0xC] - cmp r0, r7 - bge _08009BC4 - cmp r4, 0x13 - bgt _08009BC4 -_08009B3C: - ldr r3, [sp, 0x4] - adds r0, 0x1 - mov r12, r0 - ldr r0, [sp, 0x14] - adds r0, 0x1 - mov r8, r0 - mov r1, r9 - cmp r1, 0 - beq _08009BB4 - ldr r2, _08009B74 - mov r10, r2 - mov r2, r9 -_08009B54: - cmp r6, 0 - bne _08009B80 - ldrh r1, [r5] - adds r5, 0x2 - adds r0, r1, 0 - movs r4, 0xF0 - lsls r4, 8 - ands r0, r4 - cmp r0, 0 - bne _08009B6E - ldr r6, _08009B7C - ands r6, r1 - movs r1, 0 -_08009B6E: - adds r4, r1, 0 - b _08009B82 - .align 2, 0 -_08009B74: .4byte gBgTilemaps -_08009B78: .4byte gUnknown_202D2A0 -_08009B7C: .4byte 0x000003ff -_08009B80: - movs r4, 0 -_08009B82: - cmp r6, 0 - beq _08009B88 - subs r6, 0x1 -_08009B88: - ldr r7, [sp, 0x10] - cmp r3, r7 - blt _08009BAC - cmp r3, 0x1D - bgt _08009BAC - ldr r0, [sp, 0x14] - cmp r0, 0 - blt _08009BAC - lsls r0, r3, 1 - ldr r7, [sp, 0x14] - lsls r1, r7, 6 - adds r0, r1 - ldr r7, _08009BE0 - ldr r1, [r7] - lsls r1, 11 - adds r0, r1 - add r0, r10 - strh r4, [r0] -_08009BAC: - subs r2, 0x1 - adds r3, 0x1 - cmp r2, 0 - bne _08009B54 -_08009BB4: - mov r0, r12 - mov r1, r8 - str r1, [sp, 0x14] - ldr r2, [sp, 0xC] - cmp r0, r2 - bge _08009BC4 - cmp r1, 0x13 - ble _08009B3C -_08009BC4: - ldr r4, _08009BE0 - ldr r0, [r4] - bl sub_80098F8 - movs r0, 0x1 -_08009BCE: - add sp, 0x18 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08009BE0: .4byte gUnknown_202D2A0 - thumb_func_end sub_8009A7C - - thumb_func_start sub_8009BE4 -sub_8009BE4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - movs r0, 0x20 - mov r12, r0 - ldr r0, _08009C54 - ldr r1, [r0] - movs r2, 0 - mov r10, r2 - mov r9, r0 - cmp r1, 0 - bne _08009C04 - movs r7, 0x1 - mov r10, r7 -_08009C04: - movs r0, 0 - mov r1, r10 - lsls r1, 1 - mov r8, r1 -_08009C0C: - mov r1, r10 - adds r3, r0, 0x1 - cmp r1, r12 - bge _08009C36 - ldr r6, _08009C58 - ldr r5, _08009C54 - movs r4, 0 - lsls r0, 6 - mov r7, r8 - adds r2, r7, r0 - mov r0, r12 - subs r1, r0, r1 -_08009C24: - ldr r0, [r5] - lsls r0, 11 - adds r0, r2, r0 - adds r0, r6 - strh r4, [r0] - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bne _08009C24 -_08009C36: - adds r0, r3, 0 - cmp r0, 0x1F - ble _08009C0C - mov r1, r9 - ldr r0, [r1] - bl sub_80098F8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08009C54: .4byte gUnknown_202D2A0 -_08009C58: .4byte gBgTilemaps - thumb_func_end sub_8009BE4 - diff --git a/ld_script.ld b/ld_script.ld index 2f5955147..91d6b46ad 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -67,7 +67,6 @@ SECTIONS { src/text_3.o(.text); src/text_4.o(.text); src/code_8009804.o(.text); - asm/code_8009804.o(.text); src/math.o(.text); src/file_system.o(.text); src/decompress_sir.o(.text); diff --git a/src/code_8009804.c b/src/code_8009804.c index 7701d407a..b6fcc6358 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -238,3 +238,108 @@ void sub_8009A1C(const EfoFileData *r0, u32 palId, u32 vramDstOffset, u32 r3) SetBGPaletteBufferColorArray(i + 0xE0, &r0->unk10->pal[i + palId * 16]); } } + +// Todo: Merge this struct with others once sub_800DE8C is decompiled(if possible) +struct Struct_8009A7C +{ + s32 unk0; + u16 **unk4; +}; + +bool8 sub_8009A7C(struct Struct_8009A7C *a0, s32 a1, s32 a2, s32 a3, bool8 a4, s32 *a5, u16 *a6) +{ + s32 countY; + s32 yId; + s32 i, j; + s32 jStart; + s32 countX; + s32 r6; + u16 *r5; + + if (gUnknown_202D2A0 == 0) { + jStart = 1; + } + else { + jStart = 0; + } + + if (a1 >= a0->unk0) + return FALSE; + + if (a4) { + for (i = 0; i < 20; i++) { + for (j = jStart; j < 30; j++) { + gBgTilemaps[gUnknown_202D2A0][i][j] = 0; + } + } + } + + r5 = a0->unk4[a1]; + countX = r5[2]; + countY = r5[3]; + if (a5 != NULL) { + *a5 = r5[4]; + } + if (a6 != NULL) { + a6[0] = r5[5]; + a6[1] = r5[6]; + a6[2] = r5[7]; + a6[3] = r5[8]; + } + + r5 += 10; + yId = a3; + r6 = 0; + for (i = 0; i < countY && yId < 20; i++, yId++) { + s32 xId = a2; + + for (j = 0; j < countX; j++, xId++) { + u16 r4; + + if (r6 == 0) { + u16 curr = *(r5++); + if (!(curr & 0xF000)) { + r6 = curr & 0x3FF; + curr = 0; + } + r4 = curr; + } + else { + r4 = 0; + } + + if (r6 != 0) { + r6--; + } + + if (xId >= jStart && xId < 30 && yId >= 0) { + gBgTilemaps[gUnknown_202D2A0][yId][xId] = r4; + } + } + } + + sub_80098F8(gUnknown_202D2A0); + return TRUE; +} + +void sub_8009BE4(void) +{ + s32 i, j; + s32 jStart; + s32 n = 32; + + if (gUnknown_202D2A0 == 0) { + jStart = 1; + } + else { + jStart = 0; + } + + for (i = 0; i < 32; i++) { + for (j = jStart; j < n; j++) { + gBgTilemaps[gUnknown_202D2A0][i][j] = 0; + } + } + + sub_80098F8(gUnknown_202D2A0); +}