From 3c29ff0535d60605ad59857398e3430cea18dcd0 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 5 Jun 2025 17:54:56 +0200 Subject: [PATCH] sub_80A3908 --- asm/code_80A26CC_1.s | 535 ------------------------------------------- include/ground_map.h | 4 +- src/code_80A26CC.c | 167 +++++++++++++- 3 files changed, 159 insertions(+), 547 deletions(-) diff --git a/asm/code_80A26CC_1.s b/asm/code_80A26CC_1.s index f13a348b7..b05cd0c45 100644 --- a/asm/code_80A26CC_1.s +++ b/asm/code_80A26CC_1.s @@ -7,541 +7,6 @@ - thumb_func_start sub_80A37C4 -sub_80A37C4: - push {r4-r6,lr} - adds r6, r2, 0 - adds r4, r1, 0 - adds r2, r0, 0 - movs r0, 0 - movs r1, 0xF -_080A37D0: - strh r0, [r2] - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _080A37D0 - movs r0, 0x1 - movs r1, 0x4 - ldrsh r3, [r3, r1] - cmp r0, r3 - bge _080A37FE - adds r5, r3, 0 -_080A37E6: - adds r3, r0, 0x1 - movs r1, 0xF -_080A37EA: - ldrh r0, [r4] - strh r0, [r2] - adds r4, 0x2 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _080A37EA - adds r0, r3, 0 - cmp r0, r5 - blt _080A37E6 -_080A37FE: - movs r3, 0x6 - ldrsh r1, [r6, r3] - cmp r0, r1 - bge _080A3820 - ldr r3, _080A3828 - adds r4, r3, 0 - adds r5, r1, 0 -_080A380C: - adds r3, r0, 0x1 - movs r1, 0xF -_080A3810: - strh r4, [r2] - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _080A3810 - adds r0, r3, 0 - cmp r0, r5 - blt _080A380C -_080A3820: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080A3828: .4byte 0x0000ffff - thumb_func_end sub_80A37C4 - - thumb_func_start _UncompressCell -_UncompressCell: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r5, r1, 0 - mov r8, r3 - ldr r3, [sp, 0x18] - adds r4, r2, 0 - adds r2, r0, 0 - mov r1, r8 - ldrh r0, [r1] - lsls r0, 12 - ldrh r1, [r1, 0x4] - orrs r0, r1 - lsls r0, 16 - lsrs r6, r0, 16 - ldr r1, [r3] - ldr r0, _080A385C - cmp r1, r0 - bne _080A3860 - movs r0, 0x1 - strh r0, [r5] - movs r5, 0x4 - b _080A3890 - .align 2, 0 -_080A385C: .4byte 0x00020002 -_080A3860: - ldr r0, _080A3870 - cmp r1, r0 - bne _080A3874 - movs r0, 0x2 - strh r0, [r5] - movs r5, 0x9 - b _080A3890 - .align 2, 0 -_080A3870: .4byte 0x00030003 -_080A3874: - movs r0, 0 - strh r0, [r5] - ldr r0, _080A3888 - ldr r1, _080A388C - movs r4, 0 - ldrsh r2, [r3, r4] - movs r6, 0x2 - ldrsh r3, [r3, r6] - bl FatalError - .align 2, 0 -_080A3888: .4byte gUnknown_81172E8 -_080A388C: .4byte gUnknown_81172F4 -_080A3890: - movs r0, 0 - movs r1, 0x8 -_080A3894: - strh r0, [r2] - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _080A3894 - movs r0, 0x1 - movs r7, 0xE - ldrsh r1, [r3, r7] - cmp r0, r1 - bge _080A38DC - mov r12, r1 -_080A38AA: - movs r1, 0 - adds r3, r0, 0x1 - cmp r1, r5 - bge _080A38C6 - adds r1, r5, 0 -_080A38B4: - ldrh r0, [r4] - adds r0, r6, r0 - strh r0, [r2] - adds r4, 0x2 - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bne _080A38B4 - adds r1, r5, 0 -_080A38C6: - cmp r1, 0x8 - bgt _080A38D6 - movs r0, 0 -_080A38CC: - strh r0, [r2] - adds r2, 0x2 - adds r1, 0x1 - cmp r1, 0x8 - ble _080A38CC -_080A38D6: - adds r0, r3, 0 - cmp r0, r12 - blt _080A38AA -_080A38DC: - mov r1, r8 - movs r4, 0x8 - ldrsh r3, [r1, r4] - cmp r0, r3 - bge _080A38FE - movs r4, 0 - adds r5, r3, 0 -_080A38EA: - adds r3, r0, 0x1 - movs r1, 0x8 -_080A38EE: - strh r4, [r2] - adds r2, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _080A38EE - adds r0, r3, 0 - cmp r0, r5 - blt _080A38EA -_080A38FE: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end _UncompressCell - - thumb_func_start sub_80A3908 -sub_80A3908: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - str r0, [sp] - str r2, [sp, 0x4] - mov r9, r3 - adds r6, r1, 0 - movs r2, 0 - ldr r1, [sp, 0x4] - movs r3, 0xC - ldrsh r0, [r1, r3] - cmp r2, r0 - blt _080A392A - b _080A3B6C -_080A392A: - lsls r0, r2, 2 - ldr r4, [sp] - adds r0, r4 - ldr r0, [r0] - mov r12, r0 - movs r1, 0 - adds r2, 0x1 - str r2, [sp, 0x8] - mov r5, r9 - ldrb r5, [r5, 0x5] - cmp r1, r5 - blt _080A3944 - b _080A3B2A -_080A3944: - ldr r0, _080A39A4 - mov r10, r0 -_080A3948: - movs r2, 0 - mov r8, r2 - cmp r1, 0 - bne _080A3A18 - movs r3, 0x1 - str r3, [sp, 0xC] - mov r4, r9 - ldrb r4, [r4, 0x4] - cmp r1, r4 - blt _080A395E - b _080A3B04 -_080A395E: - ldrb r1, [r6] - adds r6, 0x1 - cmp r1, 0xBF - ble _080A39A8 - adds r2, r1, 0 - subs r2, 0xBF - cmp r1, 0xBF - ble _080A39A0 - ldr r5, _080A39A4 - adds r4, r5, 0 - adds r3, r2, 0 -_080A3974: - ldrb r1, [r6] - ldrb r0, [r6, 0x1] - lsls r0, 8 - orrs r1, r0 - ldrb r0, [r6, 0x2] - lsls r0, 16 - orrs r1, r0 - adds r6, 0x3 - adds r0, r1, 0 - ands r0, r4 - mov r5, r12 - strh r0, [r5] - movs r0, 0x2 - add r12, r0 - asrs r1, 12 - ands r1, r4 - mov r5, r12 - strh r1, [r5] - add r12, r0 - subs r3, 0x1 - cmp r3, 0 - bne _080A3974 -_080A39A0: - lsls r0, r2, 1 - b _080A3A0C - .align 2, 0 -_080A39A4: .4byte 0x00000fff -_080A39A8: - cmp r1, 0x7F - ble _080A39EA - ldrb r2, [r6] - ldrb r0, [r6, 0x1] - lsls r0, 8 - orrs r2, r0 - ldrb r0, [r6, 0x2] - lsls r0, 16 - orrs r2, r0 - adds r6, 0x3 - adds r4, r1, 0 - subs r4, 0x7F - cmp r1, 0x7F - ble _080A39E6 - adds r0, r2, 0 - mov r1, r10 - ands r0, r1 - asrs r1, r2, 12 - mov r2, r10 - ands r1, r2 - adds r3, r4, 0 -_080A39D2: - mov r5, r12 - strh r0, [r5] - movs r2, 0x2 - add r12, r2 - mov r5, r12 - strh r1, [r5] - add r12, r2 - subs r3, 0x1 - cmp r3, 0 - bne _080A39D2 -_080A39E6: - lsls r0, r4, 1 - b _080A3A0C -_080A39EA: - movs r3, 0 - adds r0, r1, 0x1 - cmp r3, r1 - bgt _080A3A0A - movs r1, 0 - adds r3, r0, 0 -_080A39F6: - mov r2, r12 - strh r1, [r2] - movs r4, 0x2 - add r12, r4 - mov r5, r12 - strh r1, [r5] - add r12, r4 - subs r3, 0x1 - cmp r3, 0 - bne _080A39F6 -_080A3A0A: - lsls r0, 1 -_080A3A0C: - add r8, r0 - mov r0, r9 - ldrb r0, [r0, 0x4] - cmp r8, r0 - blt _080A395E - b _080A3B04 -_080A3A18: - mov r4, r12 - subs r4, 0x80 - adds r1, 0x1 - str r1, [sp, 0xC] - mov r1, r9 - ldrb r1, [r1, 0x4] - cmp r8, r1 - bge _080A3B04 -_080A3A28: - ldrb r1, [r6] - adds r6, 0x1 - cmp r1, 0xBF - ble _080A3A80 - adds r5, r1, 0 - subs r5, 0xBF - cmp r1, 0xBF - ble _080A3A78 - ldr r2, _080A3A7C - adds r7, r2, 0 - adds r3, r5, 0 -_080A3A3E: - ldrb r2, [r6] - ldrb r0, [r6, 0x1] - lsls r0, 8 - orrs r2, r0 - ldrb r0, [r6, 0x2] - lsls r0, 16 - orrs r2, r0 - adds r6, 0x3 - adds r0, r2, 0 - ands r0, r7 - ldrh r1, [r4] - eors r0, r1 - mov r1, r12 - strh r0, [r1] - adds r4, 0x2 - movs r0, 0x2 - add r12, r0 - asrs r2, 12 - ands r2, r7 - ldrh r0, [r4] - eors r2, r0 - mov r1, r12 - strh r2, [r1] - adds r4, 0x2 - movs r2, 0x2 - add r12, r2 - subs r3, 0x1 - cmp r3, 0 - bne _080A3A3E -_080A3A78: - lsls r0, r5, 1 - b _080A3AFA - .align 2, 0 -_080A3A7C: .4byte 0x00000fff -_080A3A80: - cmp r1, 0x7F - ble _080A3AD2 - ldrb r2, [r6] - ldrb r0, [r6, 0x1] - lsls r0, 8 - orrs r2, r0 - ldrb r0, [r6, 0x2] - lsls r0, 16 - orrs r2, r0 - adds r6, 0x3 - adds r7, r1, 0 - subs r7, 0x7F - cmp r1, 0x7F - ble _080A3ACE - adds r5, r2, 0 - mov r3, r10 - ands r5, r3 - asrs r2, 12 - ands r2, r3 - adds r3, r7, 0 -_080A3AA8: - ldrh r1, [r4] - adds r0, r5, 0 - eors r0, r1 - mov r1, r12 - strh r0, [r1] - adds r4, 0x2 - movs r0, 0x2 - add r12, r0 - ldrh r1, [r4] - adds r0, r2, 0 - eors r0, r1 - mov r1, r12 - strh r0, [r1] - adds r4, 0x2 - movs r0, 0x2 - add r12, r0 - subs r3, 0x1 - cmp r3, 0 - bne _080A3AA8 -_080A3ACE: - lsls r0, r7, 1 - b _080A3AFA -_080A3AD2: - movs r3, 0 - adds r2, r1, 0x1 - cmp r3, r1 - bgt _080A3AF8 - adds r3, r2, 0 -_080A3ADC: - ldrh r0, [r4] - mov r1, r12 - strh r0, [r1] - adds r4, 0x2 - movs r5, 0x2 - add r12, r5 - ldrh r0, [r4] - mov r1, r12 - strh r0, [r1] - adds r4, 0x2 - add r12, r5 - subs r3, 0x1 - cmp r3, 0 - bne _080A3ADC -_080A3AF8: - lsls r0, r2, 1 -_080A3AFA: - add r8, r0 - mov r2, r9 - ldrb r2, [r2, 0x4] - cmp r8, r2 - blt _080A3A28 -_080A3B04: - mov r3, r8 - cmp r3, 0x3F - bgt _080A3B1E - movs r0, 0 -_080A3B0C: - mov r4, r12 - strh r0, [r4] - movs r5, 0x2 - add r12, r5 - movs r1, 0x1 - add r8, r1 - mov r2, r8 - cmp r2, 0x3F - ble _080A3B0C -_080A3B1E: - ldr r1, [sp, 0xC] - mov r3, r9 - ldrb r3, [r3, 0x5] - cmp r1, r3 - bge _080A3B2A - b _080A3948 -_080A3B2A: - ldr r4, [sp, 0x4] - movs r5, 0x10 - ldrsh r0, [r4, r5] - cmp r1, r0 - bge _080A3B5E - movs r2, 0 -_080A3B36: - adds r1, 0x1 - str r1, [sp, 0xC] - movs r0, 0x3F - mov r8, r0 -_080A3B3E: - mov r1, r12 - strh r2, [r1] - movs r3, 0x2 - add r12, r3 - movs r4, 0x1 - negs r4, r4 - add r8, r4 - mov r5, r8 - cmp r5, 0 - bge _080A3B3E - ldr r1, [sp, 0xC] - ldr r3, [sp, 0x4] - movs r4, 0x10 - ldrsh r0, [r3, r4] - cmp r1, r0 - blt _080A3B36 -_080A3B5E: - ldr r2, [sp, 0x8] - ldr r5, [sp, 0x4] - movs r1, 0xC - ldrsh r0, [r5, r1] - cmp r2, r0 - bge _080A3B6C - b _080A392A -_080A3B6C: - adds r0, r6, 0 - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80A3908 thumb_func_start sub_80A3B80 sub_80A3B80: diff --git a/include/ground_map.h b/include/ground_map.h index bb9fd7de7..4ec83ee36 100644 --- a/include/ground_map.h +++ b/include/ground_map.h @@ -68,15 +68,15 @@ typedef struct SubStruct_448 #define UNK_0_ARR_COUNT 14 #define UNK_E0_ARR_COUNT 32 #define UNK_3E0_ARR_COUNT 2 - #define UNK_54C_ARR_COUNT 2 +#define UNK_545_UNK6_ARR_COUNT 4 typedef struct SubStruct_545 { s16 unk0; s16 unk2; s16 unk4; - s16 unk6[4]; + s16 unk6[UNK_545_UNK6_ARR_COUNT]; s16 unkE; } SubStruct_545; diff --git a/src/code_80A26CC.c b/src/code_80A26CC.c index 04fd190e8..eb4381a38 100644 --- a/src/code_80A26CC.c +++ b/src/code_80A26CC.c @@ -472,6 +472,7 @@ UNUSED static const u8 *sub_80A2B28(u16 r0) #include "code_8002774.h" #include "code_801D9E4.h" #include "code_8004AA0.h" +#include "debug.h" #include "unk_dungeon_load.h" #include "constants/dungeon.h" @@ -660,9 +661,8 @@ void sub_80A2E64(unkStruct_3001B70 *mapPtr) mapPtr->unk52A = 1; } -// RGB? -u8* sub_80A3908(void * a0, const void * a1, SubStruct_52C * a2, SubStruct_448 *); -void sub_80A37C4(u16 * a0, const u16 *a1, SubStruct_52C *a2, SubStruct_545 *a3); +const u8 *sub_80A3908(u16 **dstArray, const void *src_, SubStruct_52C *a2, SubStruct_448 *a3); +void sub_80A37C4(void *vramDst, const u16 *src_, SubStruct_52C *a2, SubStruct_545 *a3); void _UncompressCell(void * a0, u16 *a1, const void * a2, SubStruct_52C *a3, SubStruct_545 *a4); extern const struct unkStruct_81188F0 gUnknown_81188F0[10]; @@ -724,7 +724,7 @@ void sub_80A2FBC(unkStruct_3001B70 *mapPtr, s32 a1_) mapPtr_454->unk4 = *file_434++; sum = mapPtr_454->unk4; - for (k = 0; k < 4; k++) { + for (k = 0; k < UNK_545_UNK6_ARR_COUNT; k++) { mapPtr_454->unk6[k] = *file_434++; sum += mapPtr_454->unk6[k]; } @@ -762,7 +762,7 @@ void sub_80A2FBC(unkStruct_3001B70 *mapPtr, s32 a1_) sub_80A37C4((void *)(VRAM + 0x8000 + mapPtr->unk52C.unk4 * 32), file_434, &mapPtr->unk52C, &mapPtr->unk454); _UncompressCell(mapPtr->unk548, &mapPtr->unk528, file_434 + ((mapPtr_454->unk4 - 1) * 16), &mapPtr->unk52C, &mapPtr->unk454); - file_438 = sub_80A3908(&mapPtr->unk54C, file_438, &mapPtr->unk52C, &mapPtr->unk448); + file_438 = sub_80A3908(mapPtr->unk54C, file_438, &mapPtr->unk52C, &mapPtr->unk448); mapPtr->unk468 = file_438; if (mapPtr->unk544 != NULL) { mapPtr->unk52C.unk14(mapPtr->unk544, file_438, mapPtr_448, mapPtr->unk52C.unkE); @@ -866,7 +866,7 @@ void sub_80A2FBC(unkStruct_3001B70 *mapPtr, s32 a1_) void sub_80A3440(unkStruct_3001B70 *mapPtr, s32 a1_, DungeonLocation *dungLoc, s32 a3) { SubStruct_0 *sub0Ptr; - s32 k; + s32 i; SubStruct_545 *mapPtr_454; const u16 *file_434; const void *file_438; @@ -904,8 +904,8 @@ void sub_80A3440(unkStruct_3001B70 *mapPtr, s32 a1_, DungeonLocation *dungLoc, s mapPtr_454->unk2 = *file_434++; mapPtr_454->unk4 = *file_434++; - for (k = 0; k < 4; k++) { - mapPtr_454->unk6[k] = *file_434++; + for (i = 0; i < UNK_545_UNK6_ARR_COUNT; i++) { + mapPtr_454->unk6[i] = *file_434++; } mapPtr_454->unkE = *file_434++; @@ -930,8 +930,8 @@ void sub_80A3440(unkStruct_3001B70 *mapPtr, s32 a1_, DungeonLocation *dungLoc, s mapPtr->unk52C.unk14(mapPtr->unk544, file_438, mapPtr_448, mapPtr->unk52C.unkE); mapPtr_454->unk4 = 0x200; - for (k = 0; k < 4; k++) { - mapPtr_454->unk6[k] = 0; + for (i = 0; i < UNK_545_UNK6_ARR_COUNT; i++) { + mapPtr_454->unk6[i] = 0; } mapPtr_454->unkE = 250; @@ -1002,4 +1002,151 @@ void sub_80A3440(unkStruct_3001B70 *mapPtr, s32 a1_, DungeonLocation *dungLoc, s ASM_MATCH_TRICK(mapPtr_454->unk6[0]); } +void sub_80A37C4(void *vramDst, const u16 *src_, SubStruct_52C *a2, SubStruct_545 *a3) +{ + const u16 *src = src_; + u16 *dst = vramDst; + s32 id, i; + + for (i = 0; i < 16; i++) { + *dst++ = 0; + } + for (id = 1; id < a3->unk4; id++) { + for (i = 0; i < 16; i++) { + *dst++ = *src++; + } + } + for (; id < a2->unk6; id++) { + for (i = 0; i < 16; i++) { + *dst++ = 0xFFFF; + } + } +} + +extern const DebugLocation gUnknown_81172E8; +extern const char gUnknown_81172F4[]; + +void _UncompressCell(void *dst_, u16 *a1, const void *src_, SubStruct_52C *a3, SubStruct_545 *a4) +{ + s32 id, i; + s32 n; + + const u16 *src = src_; + u16 *dst = dst_; + u16 r6 = (a3->unk0 << 12) | a3->unk4; + + if (a4->unk0 == 2 && a4->unk2 == 2) { + *a1 = 1; + n = 4; + } + else if (a4->unk0 == 3 && a4->unk2 == 3) { + *a1 = 2; + n = 9; + } + else { + *a1 = 0; + FatalError(&gUnknown_81172E8, gUnknown_81172F4, a4->unk0, a4->unk2); + } + + for (i = 0; i < 9; i++) { + *dst++ = 0; + } + for (id = 1; id < a4->unkE; id++) { + for (i = 0; i < n; i++) { + *dst++ = *src++ + r6; + } + for (; i < 9; i++) { + *dst++ = 0; + } + } + for (; id < a3->unk8; id++) { + for (i = 0; i < 9; i++) { + *dst++ = 0; + } + } +} + +// Tilemap decompression algorhitm? +const u8 *sub_80A3908(u16 **dstArray, const void *src_, SubStruct_52C *a2, SubStruct_448 *a3) +{ + s32 i, j, k, l; + const u8 *src = src_; + + for (i = 0; i < a2->unkC; i++) { + u16 *dst = dstArray[i]; + + for (j = 0; j < a3->unk5; j++) { + k = 0; + if (j == 0) { + while (k < a3->unk4) { + s32 val = *src++; + if (val > 191) { + for (l = 191; l < val; l++) { + s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; + *dst++ = dstVal & 0xFFF; + *dst++ = (dstVal >> 12) & 0xFFF; + } + k += (val - 191) * 2; + } + else if (val > 127) { + s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; + for (l = 127; l < val; l++) { + *dst++ = dstVal & 0xFFF; + *dst++ = (dstVal >> 12) & 0xFFF; + } + k += (val - 127) * 2; + } + else { + for (l = 0; l <= val; l++) { + *dst++ = 0; + *dst++ = 0; + } + k += (val + 1) * 2; + } + } + } + else { + u16 *ptrVal = dst - 64; + while (k < a3->unk4) { + s32 val = *src++; + if (val > 191) { + for (l = 191; l < val; l++) { + s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; + *dst++ = (dstVal & 0xFFF) ^ *ptrVal++; + *dst++ = ((dstVal >> 12) & 0xFFF) ^ *ptrVal++; + } + k += (val - 191) * 2; + } + else if (val > 127) { + s32 dstVal = src[0] | (src[1] << 8) | (src[2] << 16); src += 3; + for (l = 127; l < val; l++) { + *dst++ = (dstVal & 0xFFF) ^ *ptrVal++; + *dst++ = ((dstVal >> 12) & 0xFFF) ^ *ptrVal++; + } + k += (val - 127) * 2; + } + else { + for (l = 0; l <= val; l++) { + *dst++ = *ptrVal++; + *dst++ = *ptrVal++; + } + k += (val + 1) * 2; + } + } + } + + for (; k < 64; k++) { + *dst++ = 0; + } + } + for (; j < a2->unk10; j++) { + for (k = 0; k < 64; k++) { + *dst++ = 0; + } + } + } + + return src; +} + //