From 4e29e16ad453bfa65a65c65b856b603ae83cb685 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 6 Aug 2025 12:32:45 +0200 Subject: [PATCH] ov11_022EC27C nonmatching --- ...1_022EC27C.inc => overlay_11_022ECD24.inc} | 2 +- ...ay_11_022EC27C.s => overlay_11_022ECD24.s} | 759 +----------------- include/overlay_11_022EBB40.h | 16 +- main.lsf | 2 +- src/overlay_11_022EBB40.c | 440 +++++++++- 5 files changed, 451 insertions(+), 768 deletions(-) rename asm/include/{overlay_11_022EC27C.inc => overlay_11_022ECD24.inc} (99%) rename asm/{overlay_11_022EC27C.s => overlay_11_022ECD24.s} (99%) diff --git a/asm/include/overlay_11_022EC27C.inc b/asm/include/overlay_11_022ECD24.inc similarity index 99% rename from asm/include/overlay_11_022EC27C.inc rename to asm/include/overlay_11_022ECD24.inc index 9dadf2c5..5955568a 100644 --- a/asm/include/overlay_11_022EC27C.inc +++ b/asm/include/overlay_11_022ECD24.inc @@ -328,6 +328,7 @@ .public ov11_022EBFC8 .public ov11_022EC08C .public ov11_022EC240 +.public ov11_022EC27C .public ov11_02316AFC .public ov11_02316B04 .public ov11_02316B14 @@ -1766,7 +1767,6 @@ .public ov11_02320C58 .public ov11_02320C6C .public ov11_02320C80 -.public ov11_02320C94 .public ov11_02320CA8 .public ov11_02320CB8 .public ov11_02320CC8 diff --git a/asm/overlay_11_022EC27C.s b/asm/overlay_11_022ECD24.s similarity index 99% rename from asm/overlay_11_022EC27C.s rename to asm/overlay_11_022ECD24.s index 744900de..6224ae5e 100644 --- a/asm/overlay_11_022EC27C.s +++ b/asm/overlay_11_022ECD24.s @@ -1,765 +1,8 @@ .include "asm/macros.inc" - .include "overlay_11_022EC27C.inc" + .include "overlay_11_022ECD24.inc" .text - arm_func_start ov11_022EC27C -ov11_022EC27C: ; 0x022EC27C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x13c - mov sl, r0 - ldrb r0, [sl, #0x2bc] - mov r4, r1 - cmp r0, #0 - moveq r0, #6 - streq r0, [sp] - movne r0, #0xf - strne r0, [sp] - mvn r0, #0 - cmp r4, r0 - mov r0, sl - bne _022EC2BC - bl ov11_022EC08C - b _022ECCF4 -_022EC2BC: - bl ov11_022EBFC8 - mov r0, #1 - strh r0, [sl] - mov r0, #0 - strb r0, [sl, #0x1c0] - add r0, sl, #0x100 - strh r4, [r0, #0xbe] - ldrsh r1, [r0, #0xbe] - add r0, sp, #0xcc - bl LoadBackgroundAttributes - ldr r1, _022ECCFC ; =ov11_02320C58 - add r0, sp, #0x4c - add r2, sp, #0xcc - bl sprintf - ldr r2, [sp] - add r1, sp, #0x4c - add r0, sl, #0x174 - bl LoadFileFromRom - ldr r1, _022ECD00 ; =ov11_02320C6C - add r0, sp, #0x4c - add r2, sp, #0xd6 - bl sprintf - ldr r2, _022ECD04 ; =0x0000030F - add r0, sl, #0x184 - add r1, sp, #0x4c - bl LoadFileFromRom - ldr r1, _022ECD08 ; =ov11_02320C80 - add r0, sp, #0x4c - add r2, sp, #0xe0 - bl sprintf - ldr r2, _022ECD04 ; =0x0000030F - add r0, sl, #0x18c - add r1, sp, #0x4c - bl LoadFileFromRom - ldr r1, [sl, #0x184] - ldr r0, [sl, #0x174] - ldrh r2, [r1] - str r0, [sp, #0x28] - ldr r5, [sl, #0x18c] - cmp r2, #0 - beq _022EC3A0 - ldrh r0, [r1, #2] - mov r2, r2, lsr #1 - add r2, r1, r2, lsl #1 - cmp r0, #0 - str r2, [sp, #0x44] - moveq r2, #0 - moveq r0, #1 - streq r2, [sp, #0x48] - streq r0, [sl, #0x1c4] - beq _022EC3B0 - mov r0, r0, lsr #1 - add r2, r1, r0, lsl #1 - mov r0, #2 - str r2, [sp, #0x48] - str r0, [sl, #0x1c4] - b _022EC3B0 -_022EC3A0: - mov r0, #0 - str r0, [sp, #0x44] - str r0, [sp, #0x48] - str r0, [sl, #0x1c4] -_022EC3B0: - ldr r0, [sp, #0x28] - add r2, sl, #0xea - ldrb r3, [r0] - add r0, sl, #0x100 - add r1, r1, #4 - strh r3, [r0, #0xea] - ldr r0, [sp, #0x28] - ldrb r3, [r0, #2] - add r0, r2, #0x100 - str r0, [sp, #0x40] - strh r3, [r0, #2] - mov r0, #0 -_022EC3E0: - add r4, sl, #0x1c8 - mov r2, #0xc - add r3, sp, #0x44 - ldr r3, [r3, r0, lsl #2] - mla r4, r0, r2, r4 - cmp r3, #0 - mov r6, #0 - beq _022EC42C - ldrh r2, [r1], #2 - strh r2, [r4] -_022EC408: - ldrh r3, [r1], #2 - add r2, r4, r6, lsl #1 - add r6, r6, #1 - strh r3, [r2, #2] - cmp r6, #4 - blt _022EC408 - ldrh r2, [r1], #2 - strh r2, [r4, #0xa] - b _022EC44C -_022EC42C: - strh r6, [r4] - mov r3, r6 -_022EC434: - add r2, r4, r6, lsl #1 - add r6, r6, #1 - strh r3, [r2, #2] - cmp r6, #4 - blt _022EC434 - strh r3, [r4, #0xa] -_022EC44C: - add r0, r0, #1 - cmp r0, #2 - blt _022EC3E0 - ldrb r1, [r5] - add r0, sl, #0x200 - str r0, [sp, #0x34] - strb r1, [sl, #0x1e0] - ldrb r0, [r5, #1] - add r4, sl, #0x1e0 - ldr r2, _022ECD0C ; =ov11_02324CBC - strb r0, [r4, #1] - ldrb r3, [r5, #4] - ldr r0, [sp, #0x28] - mov r1, #0x28 - add r0, r0, #4 - strb r3, [r4, #2] - str r0, [sp, #0x1c] - ldrb r0, [r5, #5] - mov sb, #0 - strb r0, [r4, #3] - ldrb r0, [r5, #6] - strh r0, [r4, #4] - ldrb r0, [r5, #8] - strh r0, [r4, #6] - ldrb r0, [r5, #0xa] - strh r0, [r4, #8] - ldr r0, [sp, #0x34] - ldrb r3, [sl, #0x2bc] - ldrsh r0, [r0, #0xc2] - ldr r2, [r2] - smulbb r6, r3, r1 - mov r0, r0, lsl #0x14 - add r7, r2, #0x98 - mov r8, r0, lsr #0x10 - b _022EC524 -_022EC4D8: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r1, r8 - mov r8, r0, lsr #0x10 - ldr r2, _022ECD10 ; =ov11_02320BF4 - add r0, r7, r6 - bl sub_0200A590 - ldr r2, [sp, #0x1c] - add r0, r7, r6 - mov r1, r8 - mov r3, #0xf - bl sub_0200A5B0 - add r0, r8, #0xf - mov r0, r0, lsl #0x10 - mov r8, r0, lsr #0x10 - ldr r0, [sp, #0x1c] - add sb, sb, #1 - add r0, r0, #0x3c - str r0, [sp, #0x1c] -_022EC524: - ldr r0, [sp, #0x40] - ldrsh r0, [r0] - cmp sb, r0 - bge _022EC544 - ldr r0, [sp, #0x34] - ldrsh r0, [r0, #0xc4] - cmp sb, r0 - blt _022EC4D8 -_022EC544: - add r0, sl, #0x200 - str r0, [sp, #0x38] - b _022EC5A8 -_022EC550: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r1, r8 - mov r8, r0, lsr #0x10 - ldr r2, _022ECD10 ; =ov11_02320BF4 - add r0, r7, r6 - bl sub_0200A590 - mov r0, #1 - str r0, [sp, #0x18] -_022EC574: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r1, r8 - mov r8, r0, lsr #0x10 - ldr r2, _022ECD14 ; =ov11_02320BE8 - add r0, r7, r6 - bl sub_0200A590 - ldr r0, [sp, #0x18] - add r0, r0, #1 - str r0, [sp, #0x18] - cmp r0, #0x10 - blt _022EC574 - add sb, sb, #1 -_022EC5A8: - ldr r0, [sp, #0x38] - ldrsh r0, [r0, #0xc4] - cmp sb, r0 - blt _022EC550 - add r0, r7, r6 - bl sub_0200A504 - add r0, sl, #0x200 - ldrsh r0, [r0, #0xbe] - mov r8, #0 - str r0, [sp, #0x20] - b _022EC9A0 -_022EC5D4: - add r0, sp, #0x44 - ldr r0, [r0, r8, lsl #2] - str r0, [sp, #0x24] - cmp r0, #0 - beq _022EC990 - mov r0, #0xc - mul r1, r8, r0 - add r0, sl, #0x200 - ldrsh r2, [r0, #0xc6] - add r6, sl, #0x1c8 - add sb, r6, r1 - ldrsh r1, [r6, r1] - ldrb r3, [sl, #0x2bc] - ldr r0, _022ECD18 ; =ov11_02320C18 - mov r7, #0 - add r3, r0, r3, lsl #3 - ldr r0, [sp, #0x20] - ldr r6, [sp, #0x24] - ldr r0, [r3, r0, lsl #2] - str r7, [sp, #0x14] - add fp, r0, r2, lsl #5 - add r0, fp, r1, lsl #5 - str r0, [sp, #0x10] - mov r3, r7 - mov r2, r7 - mov r1, r7 - mov r0, r7 -_022EC640: - strh r0, [fp], #2 - add r1, r1, #1 - cmp r1, #0x10 - blt _022EC640 - b _022EC774 -_022EC654: - ldrb r0, [r6] - add r1, r6, #1 - mov r6, r1 - cmp r0, #0x80 - bge _022EC6D8 - cmp r0, #0x7f - ldreqb ip, [r1, #1] - ldreqb r0, [r1] - addeq r6, r1, #2 - orreq r0, r0, ip, lsl #8 - beq _022EC68C - cmp r0, #0x7e - ldreqb r0, [r1] - addeq r6, r1, #1 -_022EC68C: - cmp r3, #0 - ldrneb r1, [r6], #1 - movne r3, #0 - subne r0, r0, #1 - orrne r1, r2, r1, lsl #8 - strneh r1, [fp], #2 - mov r1, #0 - b _022EC6C4 -_022EC6AC: - ldrb lr, [r6, #1] - ldrb ip, [r6], #2 - add r1, r1, #2 - str ip, [sp, #0x2c] - orr ip, ip, lr, lsl #8 - strh ip, [fp], #2 -_022EC6C4: - cmp r1, r0 - blt _022EC6AC - movle r3, #1 - ldrleb r2, [r6], #1 - b _022EC774 -_022EC6D8: - cmp r0, #0xc0 - bge _022EC6FC - cmp r0, #0xbf - ldreqb r0, [r1] - addeq r6, r1, #1 - str r7, [sp, #0x14] - subne r0, r0, #0x80 - ldrb r7, [r6], #1 - b _022EC734 -_022EC6FC: - cmp r0, #0xe0 - bge _022EC718 - cmp r0, #0xdf - ldreqb r0, [r1] - addeq r6, r1, #1 - subne r0, r0, #0xc0 - b _022EC734 -_022EC718: - cmp r0, #0xff - ldreqb r0, [r1] - addeq r6, r1, #1 - ldr r1, [sp, #0x14] - subne r0, r0, #0xe0 - str r7, [sp, #0x14] - mov r7, r1 -_022EC734: - cmp r3, #0 - orrne r1, r2, r7, lsl #8 - strneh r1, [fp], #2 - orr r1, r7, r7, lsl #8 - mov r1, r1, lsl #0x10 - mov r2, r1, lsr #0x10 - movne r3, #0 - subne r0, r0, #1 - mov r1, #0 - b _022EC764 -_022EC75C: - strh r2, [fp], #2 - add r1, r1, #2 -_022EC764: - cmp r1, r0 - blt _022EC75C - movle r3, #1 - movle r2, r7 -_022EC774: - ldr r0, [sp, #0x10] - cmp fp, r0 - blo _022EC654 - ldr r0, [sp, #0x24] - ldrsh r7, [sb] - sub r0, r6, r0 - tst r0, #1 - addne r6, r6, #1 - add r0, sl, #0x200 - ldr r2, _022ECD1C ; =0x0000FFFF - mov r3, #0 - b _022EC7BC -_022EC7A4: - mov r1, r3 -_022EC7A8: - strh r2, [fp], #2 - add r1, r1, #1 - cmp r1, #0x10 - blt _022EC7A8 - add r7, r7, #1 -_022EC7BC: - ldrsh r1, [r0, #0xc8] - cmp r7, r1 - blt _022EC7A4 - add r0, sl, #0x200 - add r1, sl, r8, lsl #2 - ldr ip, [r1, #0x2dc] - ldrsh r7, [r0, #0xc2] - ldrsh r2, [r0, #0xc6] - mov r1, #1 - mov r3, ip - strh r1, [r0, #0xb8] - orr r0, r2, r7, lsl #12 - mov r0, r0, lsl #0x10 - ldrsh r1, [sb, #0xa] - str r0, [sp, #0x3c] - sub r0, r1, #1 - add r0, r0, r0, lsl #3 - add r7, ip, r0, lsl #1 - mov r0, #0 - b _022EC890 -_022EC80C: - ldrb r1, [r6] - add r2, r6, #1 - mov r6, r2 - cmp r1, #0xc0 - blt _022EC844 - mov r2, #0xc0 - b _022EC838 -_022EC828: - ldrb fp, [r6], #1 - add r2, r2, #1 - mov fp, fp, lsl #8 - strh fp, [r3], #2 -_022EC838: - cmp r2, r1 - ble _022EC828 - b _022EC890 -_022EC844: - cmp r1, #0x80 - blt _022EC878 - ldrb fp, [r2] - add r6, r2, #1 - mov r2, #0x80 - mov fp, fp, lsl #0x18 - mov fp, fp, lsr #0x10 - b _022EC86C -_022EC864: - strh fp, [r3], #2 - add r2, r2, #1 -_022EC86C: - cmp r2, r1 - ble _022EC864 - b _022EC890 -_022EC878: - mov r2, #0 - b _022EC888 -_022EC880: - strh r0, [r3], #2 - add r2, r2, #1 -_022EC888: - cmp r2, r1 - ble _022EC880 -_022EC890: - cmp r3, r7 - blo _022EC80C - mov r3, ip - b _022EC928 -_022EC8A0: - ldrb r2, [r6] - add r0, r6, #1 - mov r6, r0 - cmp r2, #0xc0 - blt _022EC8E4 - mov r0, #0xc0 - b _022EC8D8 -_022EC8BC: - str r3, [sp, #0xc] - ldrh fp, [r3], #2 - ldrb r1, [r6], #1 - add r0, r0, #1 - orr fp, fp, r1 - ldr r1, [sp, #0xc] - strh fp, [r1] -_022EC8D8: - cmp r0, r2 - ble _022EC8BC - b _022EC928 -_022EC8E4: - cmp r2, #0x80 - blt _022EC920 - add r6, r0, #1 - ldrb lr, [r0] - mov fp, #0x80 - b _022EC914 -_022EC8FC: - str r3, [sp, #8] - ldrh r0, [r3], #2 - add fp, fp, #1 - orr r1, r0, lr - ldr r0, [sp, #8] - strh r1, [r0] -_022EC914: - cmp fp, r2 - ble _022EC8FC - b _022EC928 -_022EC920: - add r0, r2, #1 - add r3, r3, r0, lsl #1 -_022EC928: - cmp r3, r7 - blo _022EC8A0 - ldrsh r0, [sb, #0xa] - mov r3, #1 - add r0, r0, r0, lsl #3 - add r1, ip, r0, lsl #1 - mov r0, #0 - b _022EC96C -_022EC948: - mov r2, r0 -_022EC94C: - ldrh fp, [r7, #-2]! - ldr r6, [sp, #0x3c] - add r2, r2, #1 - add r6, fp, r6, lsr #16 - cmp r2, #9 - strh r6, [r1, #-2]! - blt _022EC94C - add r3, r3, #1 -_022EC96C: - ldrsh r2, [sb, #0xa] - cmp r3, r2 - blt _022EC948 - mov r1, #0 - mov r0, r1 -_022EC980: - add r1, r1, #1 - cmp r1, #9 - strh r0, [ip], #2 - blt _022EC980 -_022EC990: - ldr r0, [sp, #0x20] - add r8, r8, #1 - add r0, r0, #1 - str r0, [sp, #0x20] -_022EC9A0: - add r0, sl, #0x200 - ldrsh r0, [r0, #0xc0] - cmp r8, r0 - blt _022EC5D4 - add r0, sl, #0x2e4 - add r1, r5, #0xc - add r2, sl, #0x2bc - add r3, sl, #0x1e0 - bl ov11_022EE2D4 - mov r1, r0 - str r1, [sl, #0x1f0] - ldr r0, [sl, #0x2d8] - cmp r0, #0 - beq _022EC9EC - add r2, sl, #0x200 - ldrsh r3, [r2, #0xce] - ldr r5, [sl, #0x2d4] - mov r2, r4 - blx r5 -_022EC9EC: - mov r1, #0 - ldr r0, [sp, #0x40] - strb r1, [sl, #0x1ee] - ldrsh r2, [r0, #2] - add r0, sl, #4 - cmp r2, #0 - beq _022ECAA4 - ldr r2, [sp, #0x40] - mov r3, #1 - ldrsh r5, [r2] - ldr r2, [sp, #0x28] - mov r7, r1 - add r4, r2, #4 - rsb r2, r5, r5, lsl #4 - add r2, r4, r2, lsl #2 - str r2, [sl, #0x1f4] - strb r3, [sl, #0x1f8] - strb r3, [sl, #0x1f9] - strb r3, [sl, #0x1fa] - strb r3, [sl, #0x1fb] - add r3, r2, r5, lsl #2 - strb r1, [sl, #0x1bc] - add r5, sl, #0x200 - mov r6, r1 - b _022ECA84 -_022ECA50: - ldrsh r4, [r2, #2] - add r1, r1, #1 - cmp r4, #0 - strgt r3, [r0, #4] - ldrgtsh r4, [r2, #2] - add r2, r2, #4 - strle r7, [r0, #4] - strh r6, [r0] - rsbgt r4, r4, r4, lsl #4 - strh r6, [r0, #2] - str r6, [r0, #8] - addgt r3, r3, r4, lsl #2 - add r0, r0, #0xc -_022ECA84: - ldr r4, [sp, #0x40] - ldrsh r4, [r4] - cmp r1, r4 - bge _022ECABC - ldrsh r4, [r5, #0xc4] - cmp r1, r4 - blt _022ECA50 - b _022ECABC -_022ECAA4: - str r1, [sl, #0x1f4] - strb r1, [sl, #0x1f8] - strb r1, [sl, #0x1f9] - strb r1, [sl, #0x1fa] - strb r1, [sl, #0x1fb] - strb r1, [sl, #0x1bc] -_022ECABC: - mov r2, #0 - b _022ECADC -_022ECAC4: - strh r2, [r0] - strh r2, [r0, #2] - str r2, [r0, #8] - str r2, [r0, #4] - add r1, r1, #1 - add r0, r0, #0xc -_022ECADC: - cmp r1, #0x10 - blt _022ECAC4 - mov r7, #0 - add r4, sl, #0xc4 - mov sb, r7 - mov r5, r7 - mov r8, #0x2c -_022ECAF8: - mul r0, r7, r8 - add r6, r4, r0 - strb sb, [r4, r0] - strb sb, [r6, #1] - strh sb, [r6, #4] - strh sb, [r6, #2] - add r0, r6, #8 - bl ZInit8 - str r5, [r6, #0x10] - str r5, [r6, #0x18] - str r5, [r6, #0x14] - str r5, [r6, #0x20] - str r5, [r6, #0x1c] - add r7, r7, #1 - str r5, [r6, #0x24] - str r5, [r6, #0x28] - cmp r7, #4 - blt _022ECAF8 - add r0, sl, #0x200 - ldrsh r7, [r0, #0xbe] - b _022ECC80 -_022ECB4C: - mov r0, #0xc - mul r2, r5, r0 - add r0, sl, #0x200 - add r3, sl, #0x1c8 - ldrsh r1, [r0, #0xc6] - ldrsh r0, [r3, r2] - cmp r5, #0 - moveq r8, #0 - add r1, r1, r0 - add r0, r3, r2 - movne r8, #2 - cmp r5, #0 - moveq sb, #0 - str r0, [sp, #4] - add r0, sl, #0xc4 - ldrb r6, [sl, #0x2bc] - ldr r4, _022ECD18 ; =ov11_02320C18 - movne sb, #4 - add r4, r4, r6, lsl #3 - ldr r4, [r4, r7, lsl #2] - mov r6, #0 - add fp, r4, r1, lsl #5 - str r0, [sp, #0x30] -_022ECBA8: - ldr r0, [sp, #0x30] - mov r1, #0x2c - mla r4, r8, r1, r0 - mov r0, #0xa - mul r0, sb, r0 - add r1, sp, #0xcc - add r1, r1, r0 - ldrsb r1, [r1, #0x1e] - cmp r1, #0 - beq _022ECC64 - ldrb r1, [sl, #0x2bc] - cmp r1, #0 - bne _022ECC64 - add r1, sp, #0xea - add r2, r1, r0 - ldr r1, _022ECD20 ; =ov11_02320C94 - add r0, sp, #0x4c - bl sprintf - ldr r2, [sp] - add r0, r4, #8 - add r1, sp, #0x4c - bl LoadFileFromRom - mov r0, #1 - strb r0, [r4] - strb r0, [r4, #1] - ldr r3, [r4, #8] - ldr r0, [sp, #4] - str r3, [r4, #0x10] - add r1, r0, r6, lsl #1 - ldrsh r0, [r3, #2] - add r2, r3, #4 - str r2, [r4, #0x18] - add r0, r2, r0, lsl #2 - str r2, [r4, #0x14] - str r0, [r4, #0x20] - str r0, [r4, #0x1c] - mov r0, #0 - strh r0, [r4, #2] - ldr r0, [r4, #0x18] - ldr r0, [r0] - strh r0, [r4, #4] - str fp, [r4, #0x24] - ldrsh r0, [r1, #2] - mov r0, r0, lsl #5 - str r0, [r4, #0x28] - ldrsh r0, [r1, #2] - add fp, fp, r0, lsl #5 -_022ECC64: - add r6, r6, #1 - cmp r6, #2 - add sb, sb, #1 - add r8, r8, #1 - blt _022ECBA8 - add r5, r5, #1 - add r7, r7, #1 -_022ECC80: - add r0, sl, #0x200 - ldrsh r0, [r0, #0xc0] - cmp r5, r0 - blt _022ECB4C - cmp r0, #0 - mov r0, sl - ble _022ECCA8 - mov r1, #1 - bl ov11_022EE620 - b _022ECCB0 -_022ECCA8: - mov r1, #0 - bl ov11_022EE620 -_022ECCB0: - ldr r1, [sl, #0x228] - add r0, sl, #0x210 - blx r1 - mov r1, #1 - add r0, sl, #0x184 - strb r1, [sl, #0x2ba] - bl PointsToZero - cmp r0, #0 - bne _022ECCDC - add r0, sl, #0x184 - bl UnloadFile -_022ECCDC: - add r0, sl, #0x18c - bl PointsToZero - cmp r0, #0 - bne _022ECCF4 - add r0, sl, #0x18c - bl UnloadFile -_022ECCF4: - add sp, sp, #0x13c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022ECCFC: .word ov11_02320C58 -_022ECD00: .word ov11_02320C6C -_022ECD04: .word 0x0000030F -_022ECD08: .word ov11_02320C80 -_022ECD0C: .word ov11_02324CBC -_022ECD10: .word ov11_02320BF4 -_022ECD14: .word ov11_02320BE8 -_022ECD18: .word ov11_02320C18 -_022ECD1C: .word 0x0000FFFF -_022ECD20: .word ov11_02320C94 - arm_func_end ov11_022EC27C - arm_func_start LoadMapType10 LoadMapType10: ; 0x022ECD24 stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} diff --git a/include/overlay_11_022EBB40.h b/include/overlay_11_022EBB40.h index 1413e258..048e0a18 100644 --- a/include/overlay_11_022EBB40.h +++ b/include/overlay_11_022EBB40.h @@ -48,6 +48,14 @@ typedef struct SubStruct_0 //u8 fillC; // Filler byte removed in Sky, present in Red } SubStruct_0; +struct BpaHeader +{ + u8 numTiles; // The number of individual tiles. + s16 numFrames; // The number of frames for each tile. + s32 durationPerFrame[0]; // Settings for each frame. One entry per frame. + // Tiles data below +}; + // Was 0x24 in Red... typedef struct SubStruct_3E0 { @@ -56,13 +64,12 @@ typedef struct SubStruct_3E0 s16 unk2; s16 unk4; struct iovec bpaFile; - //const struct BpaHeader *unkC; hm... - const void *unk10; + const struct BpaHeader *unk10; const void *unk14; const void *unk18; const void *unk1C; void *unk20; - u32 unk24; + void *unk24; u32 unk28; } SubStruct_3E0; @@ -80,7 +87,7 @@ typedef struct SubStruct_52C s16 unk12; // 0x53E s16 unk14; s16 unk16; - void *unk18; // Maybe void (*unk14)(void *, const void *, BmaHeader *, s32); // TODO: fix void * to proper ptr types 0x540 + void (*unk18)(void *, const void *, void *, s32); // TODO: fix void * to proper ptr types 0x540 } SubStruct_52C; struct UnkGroundBg_1A0 @@ -243,5 +250,6 @@ void ov11_022EBF60(GroundBg *groundBg); void ov11_022EBFC8(GroundBg *groundBg); void ov11_022EC08C(GroundBg *groundBg); void ov11_022EC240(GroundBg *groundBg, s32 bgId); +void ov11_022EC27C(GroundBg *groundBg, s32 bgId); #endif //PMDSKY_OVERLAY_11_022EBB40_H diff --git a/main.lsf b/main.lsf index 6e56f47f..b8a47569 100644 --- a/main.lsf +++ b/main.lsf @@ -185,7 +185,7 @@ Overlay OVY_11 After OVY_10 Object asm/overlay_11.o Object src/overlay_11_022EBB40.o - Object asm/overlay_11_022EC27C.o + Object asm/overlay_11_022ECD24.o } Overlay OVY_12 { diff --git a/src/overlay_11_022EBB40.c b/src/overlay_11_022EBB40.c index d4e0c108..9761b95b 100644 --- a/src/overlay_11_022EBB40.c +++ b/src/overlay_11_022EBB40.c @@ -8,6 +8,13 @@ #define RGB_UNK 3 #define RGB_FIELDS_COUNT 4 +#define SWAP(a, b, temp) \ +{ \ + temp = a; \ + a = b; \ + b = temp; \ +} + typedef struct RGB_Array { u8 c[RGB_FIELDS_COUNT]; @@ -44,6 +51,9 @@ extern BOOL PointsToZero(struct iovec* ptr); extern void UnloadFile(struct iovec* ptr); extern void sub_0200A590(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src); extern void sub_0200A504(struct UnkStruct_2324CBC_Sub98 *); +extern s32 sprintf(u8* str, const u8* format, ...); +extern void LoadFileFromRom(struct iovec* iov, const char* filepath, u32 flags); +extern void sub_0200A5B0(struct UnkStruct_2324CBC_Sub98 *, s32 id, const RGB_Array *src, s32); #define FREE_AND_SET_NULL(ptr) \ { \ @@ -94,6 +104,7 @@ void sub_0206367C(struct UnkGroundBg_1A0 *); void sub_020635C8(struct UnkGroundBg_194 *); void sub_020635D8(struct UnkGroundBg_194 *); void ov11_022EE620(GroundBg *groundBg, s32 a1); +const u8 *ov11_022EE2D4(u16 **dstArray, const void *bmaData, SubStruct_52C *a2, BmaHeader *bmaHeader); // BmaLayerNrlDecompressor struct ConstFileData { @@ -185,8 +196,8 @@ void ov11_022EBC18(GroundBg *groundBg, const SubStruct_52C *a1) unkPtr->unk18 = 0; unkPtr->unk14 = 0; unkPtr->unk20 = 0; - unkPtr->unk1C = 0; - unkPtr->unk28 = unkPtr->unk24 = 0; + unkPtr->unk24 = unkPtr->unk1C = 0; + unkPtr->unk28 = 0; } for (i = 0; i < NUM_LAYERS; i++) { @@ -304,8 +315,8 @@ void ov11_022EC08C(GroundBg *groundBg) unkPtr->unk18 = 0; unkPtr->unk14 = 0; unkPtr->unk20 = 0; - unkPtr->unk1C = 0; - unkPtr->unk28 = unkPtr->unk24 = 0; + unkPtr->unk24 = unkPtr->unk1C = 0; + unkPtr->unk28 = 0; } unkId = groundBg->unk52C.unk0; @@ -340,3 +351,424 @@ void ov11_022EC240(GroundBg *groundBg, s32 bgId) LoadBackgroundAttributes(&entry, groundBg->unk1BE); // This loads bg attributes and doesn't do anything with them. } } + +extern const char ov11_02320C58[]; +extern const char ov11_02320C94[]; +extern const char ov11_02320C6C[]; +extern const char ov11_02320C80[]; +extern void *ov11_02320C18[][2]; // Vram ptrs + +// Regswaps - https://decomp.me/scratch/0bm90 +void ov11_022EC27C(GroundBg *groundBg, s32 bgId) +{ + u32 flags; + s32 sp20; + void *sp44[2]; + struct bg_list_entry entry; + u8 textBuf[0x80]; + const u16 *bpcData; + const void *bplData; + s32 i, j; + struct UnkStruct_2324CBC_Sub98 *unkSubPtr; + const RGB_Array *rgbPal; + s32 unk0Id; + SubStruct_0 *sub0Ptr; + s32 unk3E0Id; + BmaHeader *bmaHeader; + BplHeader *bplHeader; + const void *bmaData; + u16 palId; + s32 r7; + + flags = (groundBg->unk52C.unk0 == 0) ? 6 : 15; + if (bgId == -1) { + ov11_022EC08C(groundBg); + return; + } + ov11_022EBFC8(groundBg); + groundBg->newUnk0 = 1; + groundBg->unk1C0 = 0; + groundBg->unk1BE = bgId; + LoadBackgroundAttributes(&entry, groundBg->unk1BE); + + sprintf(textBuf, ov11_02320C58, entry.bpl.name); + LoadFileFromRom(&groundBg->bplFile, textBuf, flags); + + sprintf(textBuf, ov11_02320C6C, entry.bpc.name); + LoadFileFromRom(&groundBg->bpcFile, textBuf, 0x30F); + + sprintf(textBuf, ov11_02320C80, entry.bma.name); + LoadFileFromRom(&groundBg->bmaFile, textBuf, 0x30F); + + bplData = groundBg->bplFile.iov_base; + bpcData = groundBg->bpcFile.iov_base; + bmaData = groundBg->bmaFile.iov_base; + + if (bpcData[0] != 0) { + sp44[0] = bpcData + bpcData[0] / 2; + if (bpcData[1] == 0) { + sp44[1] = 0; + groundBg->unk1C4 = 1; + } + else { + sp44[1] = bpcData + bpcData[1] / 2; + groundBg->unk1C4 = 2; + } + } + else { + sp44[0] = 0; + sp44[1] = 0; + groundBg->unk1C4 = 0; + } + bpcData += 2; + + bplHeader = &groundBg->bplHeader; + bplHeader->numPalettes = *(u8 *)(bplData); bplData += 2; + bplHeader->hasPalAnimations = *(u8 *)(bplData); bplData += 2; + + for (i = 0; i < NUM_LAYERS; i++) { + LayerSpecs *layerSpecs = &groundBg->layerSpecs[i]; + s32 r6; + if (sp44[i] != NULL) { + layerSpecs->numTiles = *bpcData++; + for (r6 = 0; r6 < MAX_BPA_SLOTS; r6++) { + layerSpecs->bpaSlotNumTiles[r6] = *bpcData++; + } + layerSpecs->numChunks = *bpcData++; + } + else { + layerSpecs->numTiles = 0; + for (r6 = 0; r6 < MAX_BPA_SLOTS; r6++) { + layerSpecs->bpaSlotNumTiles[r6] = 0; + } + layerSpecs->numChunks = 0; + } + } + + bmaHeader = &groundBg->bmaHeader; + bmaHeader->mapWidthTiles = *(u8 *)(bmaData); bmaData += 1; + bmaHeader->mapHeightTiles = *(u8 *)(bmaData); bmaData += 1; + /*bmaHeader->tilingWidth* = *(u8 *)(bmaData);*/ bmaData += 1; + /*bmaHeader->tilingHeight* = *(u8 *)(bmaData);*/ bmaData += 1; + bmaHeader->mapWidthChunks = *(u8 *)(bmaData); bmaData += 1; + bmaHeader->mapHeightChunks = *(u8 *)(bmaData); bmaData += 1; + bmaHeader->numLayers = *(u8 *)(bmaData); bmaData += 2; + bmaHeader->hasDataLayer = *(u8 *)(bmaData); bmaData += 2; + bmaHeader->hasCollision = *(u8 *)(bmaData); bmaData += 2; + + rgbPal = bplData; + unkSubPtr = &ov11_02324CBC->unk98[groundBg->unk52C.unk0]; + palId = groundBg->unk52C.unk6 * 16; + for (i = 0; i < bplHeader->numPalettes && i < groundBg->unk52C.unk8; i++) { + sub_0200A590(unkSubPtr, palId++, &ov11_02320BF4); + sub_0200A5B0(unkSubPtr, palId, rgbPal, 15); + palId += 15; + rgbPal += 15; + } + for (; i < groundBg->unk52C.unk8; i++) { + sub_0200A590(unkSubPtr, palId++, &ov11_02320BF4); + for (j = 1; j < 16; j++) { + sub_0200A590(unkSubPtr, palId++, &ov11_02320BE8); + } + } + sub_0200A504(unkSubPtr); + + // Bpc decompressor + sp20 = groundBg->unk52C.unk2; + for (i = 0; i < groundBg->unk52C.unk4; sp20++, i++) { + const u8 *srcStart = sp44[i]; + if (srcStart != NULL) { + s32 k; // r1 + u16 unkOrVal; + s32 nbWordsToOutput; + u16 *tilemapR7, *tilemapR3, *tilemapR12; + LayerSpecs *layerSpecs = &groundBg->layerSpecs[i]; // r9 + s32 r3 = groundBg->unk52C.unk0; + u16 *dstR11 = ov11_02320C18[r3][sp20] + groundBg->unk52C.unkA * 32; // r11 fp + u16 *dstSP10 = ov11_02320C18[r3][sp20] + layerSpecs->numTiles * 32; // sp 10 + const u8 *src = srcStart; // r6 + u16 leftoverVal2 = 0; // r7 + u16 leftoverBuf = 0; // sp #0x14 + u16 leftoverVal1 = 0; // r2 + bool8 hasLeftover = FALSE; // r3 + + for (s32 k = 0; k < 16; k++) { + *dstR11++ = 0; + } + + // Copy tiles + while (dstR11 < dstSP10) { + s32 nbbytestocopy; + s32 cmd = *src++; + if (cmd < 0x80) { + if (cmd == 0x7f) { + nbbytestocopy = (src[1] << 8) | src[0]; src += 2; + } + else if (cmd == 0x7e) { + nbbytestocopy = *src++; + } + else { + nbbytestocopy = cmd; + } + + if (hasLeftover) { + *dstR11++ = leftoverVal1 | (*src++ << 8); + hasLeftover = FALSE; + nbbytestocopy--; + } + + for (k = 0; k < nbbytestocopy; k += 2) { + u16 word = (src[1] << 8) | src[0]; src += 2; + *dstR11++ = word; + } + + if (k <= nbbytestocopy) { + hasLeftover = TRUE; + leftoverVal1 = *src++; + } + } + else { + if (cmd < 0xC0) { + if (cmd == 0xBf) { + nbbytestocopy = *src; + src++; + } + else { + nbbytestocopy = cmd - 0x80; + } + + leftoverBuf = leftoverVal2; + leftoverVal2 = *src++; + } + else if (cmd < 0xE0) { + if (cmd == 0xDF) { + nbbytestocopy = *src++; + } + else { + nbbytestocopy = cmd - 0xC0; + } + } + else { + u16 tmp; + if (cmd == 0xFF) { + nbbytestocopy = *src++; + } + else { + nbbytestocopy = cmd - 0xE0; + } + + SWAP(leftoverBuf, leftoverVal2, tmp); + } + + if (hasLeftover) { + *dstR11++ = leftoverVal1 | (leftoverVal2 << 8); + hasLeftover = FALSE; + nbbytestocopy--; + } + leftoverVal1 = leftoverVal2 | (leftoverVal2 << 8); + + for (k = 0; k < nbbytestocopy; k += 2) { + *dstR11++ = leftoverVal1; + } + + if (k <= nbbytestocopy) { + hasLeftover = TRUE; + leftoverVal1 = leftoverVal2; + } + } + } + + // Align by 2 + if ((src - srcStart) & 1) { + src++; + } + + // Copy tilemaps + for (r7 = layerSpecs->numTiles; r7 < groundBg->unk52C.unkC; r7++) { + for (k = 0; k < 16; k++) { + *dstR11++ = 0xFFFF; + } + } + + unkOrVal = (groundBg->unk52C.unk6 << 12) | groundBg->unk52C.unkA; + tilemapR12 = groundBg->unk2DC[i]; + tilemapR3 = tilemapR12; + groundBg->unk2B8 = 1; + nbWordsToOutput = (layerSpecs->numChunks - 1) * 9; + tilemapR7 = tilemapR12 + nbWordsToOutput; + // Decompress and copy upper table + while (tilemapR3 < tilemapR7) { + s32 k; + s32 cmd = *src++; + + if (cmd >= 0xC0) { + for (k = 0xC0; k <= cmd; k++) { + u16 word = *src++ << 8; + *tilemapR3++ = word; + } + } + else if (cmd >= 0x80) { + u16 word = *src++ << 8; + for (k = 0x80; k <= cmd; k++) { + *tilemapR3++ = word; + } + } + else { + for (k = 0; k <= cmd; k++) { + *tilemapR3++ = 0; + } + } + } + // Decompress and copy lower table + tilemapR3 = tilemapR12; + while (tilemapR3 < tilemapR7) { + s32 k; + s32 cmd = *src++; + + if (cmd >= 0xC0) { + for (k = 0xC0; k <= cmd; k++) { + u16 *currDst = tilemapR3++; + *currDst |= *src++; + } + } + else if (cmd >= 0x80) { + u8 param = *src++; + for (k = 0x80; k <= cmd; k++) { + u16 *currDst = tilemapR3++; + *currDst |= param; + } + } + else { + tilemapR3 += cmd + 1; + } + } + + // ? + s32 unk = (layerSpecs->numChunks * 9); + u16 *dst = tilemapR12 + unk; + s32 id; + for (id = 1; id < layerSpecs->numChunks; id++) { + for (k = 0; k < 9; k++) { + *(--dst) = *(--tilemapR7) + unkOrVal; + } + } + + for (k = 0; k < 9; k++) { + *tilemapR12++ = 0; + } + } + } + + bmaData = ov11_022EE2D4(groundBg->unk2E4, bmaData, &groundBg->unk52C, &groundBg->bmaHeader); + groundBg->unk1F0 = bmaData; + if (groundBg->unk2D8 != NULL) { + groundBg->unk52C.unk18(groundBg->unk2D8, bmaData, bmaHeader, groundBg->unk52C.unk12); + } + + groundBg->unk1EE = 0; + sub0Ptr = groundBg->unk0; + unk0Id = 0; + + if (bplHeader->hasPalAnimations) { + s32 numPals = bplHeader->numPalettes * 15; + const AnimationSpecification *animSpecifications = bplData + (numPals * 4); + const RGB_Array *animationPalette = ((void *) animSpecifications) + bplHeader->numPalettes * 4; + + groundBg->animationSpecifications = animSpecifications; + groundBg->unk1F8 = 1; + groundBg->unk1F9 = 1; + groundBg->unk1FA = 1; + groundBg->unk1FB = 1; + groundBg->unk1BC = 0; + for (; unk0Id < bplHeader->numPalettes && unk0Id < groundBg->unk52C.unk8; unk0Id++, sub0Ptr++, animSpecifications++) { + if (animSpecifications->numFrames > 0) { + sub0Ptr->unk4 = animationPalette; + animationPalette += animSpecifications->numFrames * 15; + } + else { + sub0Ptr->unk4 = NULL; + } + sub0Ptr->unk0 = 0; + sub0Ptr->unk2 = 0; + sub0Ptr->unk8 = 0; + } + } + else { + groundBg->animationSpecifications = NULL; + groundBg->unk1F8 = 0; + groundBg->unk1F9 = 0; + groundBg->unk1FA = 0; + groundBg->unk1FB = 0; + groundBg->unk1BC = 0; + } + + for (; unk0Id < UNK_0_ARR_COUNT; unk0Id++, sub0Ptr++) { + sub0Ptr->unk0 = 0; + sub0Ptr->unk2 = 0; + sub0Ptr->unk4 = sub0Ptr->unk8 = 0; + } + + for (unk3E0Id = 0; unk3E0Id < UNK_3E0_ARR_COUNT; unk3E0Id++) { + SubStruct_3E0 *sub3E0 = &groundBg->unk3E0[unk3E0Id]; + sub3E0->unk0 = 0; + sub3E0->unk1 = 0; + sub3E0->unk4 = 0; + sub3E0->unk2 = 0; + ZInit8(&sub3E0->bpaFile); + sub3E0->unk10 = 0; + sub3E0->unk18 = 0; + sub3E0->unk14 = 0; + sub3E0->unk20 = 0; + sub3E0->unk24 = sub3E0->unk1C = 0; + sub3E0->unk28 = 0; + } + + r7 = groundBg->unk52C.unk2; + s32 r5; + for (r5 = 0; r5 < groundBg->unk52C.unk4; r5++, r7++) { + LayerSpecs *layerSpecs = &groundBg->layerSpecs[r5]; + s32 vramId = (groundBg->unk52C.unkA + layerSpecs->numTiles); + void *vramPtr = ov11_02320C18[groundBg->unk52C.unk0][r7] + (vramId * 32); + s32 r8 = (r5 == 0) ? 0 : 2; + s32 r9 = (r5 == 0) ? 0 : 4; + layerSpecs = &groundBg->layerSpecs[r5]; + s32 r6; + + for (r6 = 0; r6 < 2; r6++, r9++, r8++) { + + SubStruct_3E0 *sub3E0 = &groundBg->unk3E0[r8]; + if (entry.others_bpa[r9].name[0] != '\0' && groundBg->unk52C.unk0 == 0) { + const struct BpaHeader *bpaHeader; + const void *r1, *r0; + + sprintf(textBuf, ov11_02320C94, entry.others_bpa[r9].name); + LoadFileFromRom(&sub3E0->bpaFile, textBuf, flags); + sub3E0->unk0 = 1; + sub3E0->unk1 = 1; + bpaHeader = sub3E0->bpaFile.iov_base; + sub3E0->unk10 = bpaHeader; + r1 = &bpaHeader->durationPerFrame; + r0 = r1 + bpaHeader->numFrames * 4; + sub3E0->unk14 = sub3E0->unk18 = r1; + sub3E0->unk1C = sub3E0->unk20 = r0; + sub3E0->unk2 = 0; + sub3E0->unk4 = *((u32 *)sub3E0->unk18); // hm... + sub3E0->unk24 = vramPtr; + sub3E0->unk28 = layerSpecs->bpaSlotNumTiles[r6] * 32; + + vramPtr += layerSpecs->bpaSlotNumTiles[r6] * 32; + } + } + } + + if (groundBg->unk52C.unk4 > 0) { + ov11_022EE620(groundBg, 1); + } + else { + ov11_022EE620(groundBg, 0); + } + groundBg->mapRender[0].tilemapRenderFunc(&groundBg->mapRender[0]); + groundBg->unk2BA = 1; + TRY_CLOSE_FILE(groundBg->bpcFile); + TRY_CLOSE_FILE(groundBg->bmaFile); +}