mirror of
https://github.com/zeldaret/tmc
synced 2026-05-24 07:11:07 -04:00
225 lines
5.1 KiB
C
225 lines
5.1 KiB
C
#include "global.h"
|
|
|
|
typedef struct struct_08DE7D40 {
|
|
u16 unk_00;
|
|
u16 unk_02;
|
|
u16 unk_04;
|
|
u16 unk_06;
|
|
u8 unk_08;
|
|
u8 filler[3];
|
|
} struct_08DE7D40;
|
|
|
|
extern struct_08DE7D40* gUnk_02036A50;
|
|
extern struct_08DE7D40 gUnk_08DE7D40;
|
|
extern struct_08DE7D40 gUnk_08DE7D4C;
|
|
|
|
u16 sub_080B16AC(u16, u16*, u8);
|
|
|
|
u32 sub_080B1520(u16 unk_1) {
|
|
u32 ret;
|
|
|
|
ret = 0;
|
|
if (unk_1 == 4) {
|
|
gUnk_02036A50 = &gUnk_08DE7D40;
|
|
} else {
|
|
if (unk_1 == 0x40) {
|
|
gUnk_02036A50 = &gUnk_08DE7D4C;
|
|
} else {
|
|
gUnk_02036A50 = &gUnk_08DE7D40;
|
|
ret = 1;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u16* src, u16* dest, u32 cnt)) {
|
|
u32 temp;
|
|
|
|
u16 u1;
|
|
u16 IME_save;
|
|
|
|
u1 = cnt;
|
|
IME_save = REG_IME;
|
|
REG_IME = 0;
|
|
temp = REG_WAITCNT & 0xf8ff;
|
|
temp |= gUnk_02036A50->unk_06;
|
|
REG_WAITCNT = temp;
|
|
REG_DMA3SAD = (u32)src;
|
|
REG_DMA3DAD = (u32)dest;
|
|
REG_DMA3CNT = u1 | 0x80000000;
|
|
if ((REG_DMA3CNT_H & 0x8000) != 0) {
|
|
while ((REG_DMA3CNT_H & 0x8000) != 0) {}
|
|
}
|
|
REG_IME = IME_save;
|
|
}
|
|
END_NONMATCH
|
|
|
|
u32 sub_080B15E8(u16 unk_1, u16* unk_2) {
|
|
u16 stack[0x44];
|
|
|
|
u16* ptr;
|
|
u8 t1, t2;
|
|
u16 value;
|
|
|
|
if (unk_1 >= gUnk_02036A50->unk_04) {
|
|
return 0x80ff;
|
|
} else {
|
|
ptr = stack;
|
|
(u8*)ptr += (gUnk_02036A50->unk_08 << 1) + 1;
|
|
((u8*)ptr)++;
|
|
for (t1 = 0; t1 < gUnk_02036A50->unk_08; t1++) {
|
|
*(ptr--) = unk_1;
|
|
unk_1 >>= 1;
|
|
}
|
|
*(ptr--) = 1;
|
|
*ptr = 1;
|
|
sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 3);
|
|
sub_080B1568((u16*)0xd000000, stack, 0x44);
|
|
ptr = stack + 4;
|
|
unk_2 += 3;
|
|
for (t1 = 0; t1 < 4; t1++) {
|
|
value = 0;
|
|
for (t2 = 0; t2 < 0x10; t2++) {
|
|
value <<= 1;
|
|
value |= (*ptr++) & 1;
|
|
}
|
|
*(unk_2--) = value;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
u16 sub_080B1698(u16 unk_1, u16* unk_2) {
|
|
return sub_080B16AC(unk_1, unk_2, 1);
|
|
}
|
|
|
|
// this is the furthest I could get
|
|
NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 unk_1, u16* unk_2, u8 unk_3)) {
|
|
u16 stack[0x52];
|
|
vu16 stack_a4;
|
|
vu16 stack_a6;
|
|
vu16 stack_a8;
|
|
vu32 stack_ac;
|
|
|
|
u32 r0, r1, r2;
|
|
|
|
u8 i, j;
|
|
u16* ptr;
|
|
|
|
r1 = unk_1;
|
|
if (unk_1 < gUnk_02036A50->unk_04)
|
|
return 0x80ff;
|
|
|
|
ptr = stack + gUnk_02036A50->unk_08 + 0x42;
|
|
*ptr = 0;
|
|
ptr--;
|
|
for (i = 0; i <= 3; i++) {
|
|
r2 = *unk_2;
|
|
unk_2++;
|
|
for (j = 0; j <= 0xf; j++) {
|
|
*ptr = r2;
|
|
ptr--;
|
|
r2 = r2 >> 1;
|
|
}
|
|
}
|
|
for (i = 0; i < gUnk_02036A50->unk_08; i++) {
|
|
*ptr = r1;
|
|
ptr--;
|
|
r1 = r1 >> 1;
|
|
}
|
|
*ptr = 0;
|
|
ptr--;
|
|
*ptr = 1;
|
|
sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 0x43);
|
|
stack_a4 = 0;
|
|
stack_a6 = REG_VCOUNT;
|
|
stack_ac = 0;
|
|
if (stack_a4 == 0) {
|
|
r0 = *(u16*)0xd000000;
|
|
r0 &= 1;
|
|
if (r0 != 0)
|
|
goto bad;
|
|
}
|
|
do {
|
|
do {
|
|
do {
|
|
stack_a8 = REG_VCOUNT;
|
|
if (stack_a8 != stack_a6) {
|
|
if (stack_a8 > stack_a6) {
|
|
r1 = stack_a8;
|
|
r0 = stack_a6;
|
|
r1 = r1 - r0;
|
|
r0 = stack_ac;
|
|
r1 = r1 + r0;
|
|
stack_ac = r1;
|
|
} else {
|
|
r0 = stack_a8 + 0xe4;
|
|
r1 = stack_a6;
|
|
r0 = r0 - r1;
|
|
r1 = stack_ac;
|
|
r0 = r0 + r1;
|
|
stack_ac = r0;
|
|
}
|
|
if (stack_ac > 0x88) {
|
|
if (stack_a4 != 0)
|
|
return 0;
|
|
r0 = *(u16*)0xd000000;
|
|
r0 &= 1;
|
|
if (r0 != 0)
|
|
return 0;
|
|
return 0xc001;
|
|
}
|
|
stack_a6 = stack_a8;
|
|
}
|
|
} while (stack_a4 != 0);
|
|
r1 = 1;
|
|
r0 = *(u16*)0xd000000;
|
|
r1 &= r0;
|
|
} while (r1 != 0);
|
|
bad:
|
|
stack_a4++;
|
|
} while (unk_3 != 0);
|
|
return 0;
|
|
}
|
|
END_NONMATCH
|
|
|
|
u16 sub_080B180C(u16 unk_1, u16* unk_2) {
|
|
u16 ret;
|
|
|
|
u16 stack[4];
|
|
u16* ptr;
|
|
|
|
u8 i;
|
|
|
|
ret = 0;
|
|
if (unk_1 >= gUnk_02036A50->unk_04) {
|
|
return 0x80ff;
|
|
}
|
|
sub_080B15E8(unk_1, stack);
|
|
ptr = stack;
|
|
for (i = 0; i < ARRAY_COUNT(stack); i++) {
|
|
if (*unk_2++ != *ptr++) {
|
|
ret = 0x8000;
|
|
break;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) {
|
|
u32 ret;
|
|
u8 i;
|
|
|
|
ret = unk_3;
|
|
|
|
for(i = 0; i < 3; i++){
|
|
ret = sub_080B1698(unk_1, unk_2);
|
|
if (ret == 0){
|
|
ret = sub_080B180C(unk_1, unk_2);
|
|
if (ret == 0)
|
|
break;
|
|
}
|
|
}
|
|
return ret;
|
|
}
|