sub_80A3908

This commit is contained in:
DizzyEggg 2025-06-05 17:54:56 +02:00
parent 8e7f66a450
commit 3c29ff0535
3 changed files with 159 additions and 547 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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;
}
//