From f1698ca5553076fac36b5a568558e41d691b4c32 Mon Sep 17 00:00:00 2001 From: David Benepe Date: Fri, 3 Jul 2020 21:52:45 -0500 Subject: [PATCH] Decompiled 4 functions in unknown_0B8920.c --- .../unknown_072E50/func_80076C58.s | 2 +- .../unknown_07B870/func_8007AE74.s | 2 +- .../unknown_07B870/func_8007C57C.s | 2 +- .../unknown_0B8920/func_800C6170.s | 17 --- .../unknown_0B8920/func_800C61AC.s | 14 --- .../unknown_0B8920/func_800C61DC.s | 2 +- .../unknown_0B8920/func_800C6218.s | 27 ----- .../unknown_0B8920/func_800C68C0.s | 10 +- .../unknown_0B8920/func_800C69AC.s | 8 -- src/mips1/unknown_0B8920.c | 111 +++++++++++++++++- 10 files changed, 118 insertions(+), 77 deletions(-) delete mode 100644 asm/non_matchings/unknown_0B8920/func_800C6170.s delete mode 100644 asm/non_matchings/unknown_0B8920/func_800C61AC.s delete mode 100644 asm/non_matchings/unknown_0B8920/func_800C6218.s delete mode 100644 asm/non_matchings/unknown_0B8920/func_800C69AC.s diff --git a/asm/non_matchings/unknown_072E50/func_80076C58.s b/asm/non_matchings/unknown_072E50/func_80076C58.s index beecd549..65bc3f6b 100644 --- a/asm/non_matchings/unknown_072E50/func_80076C58.s +++ b/asm/non_matchings/unknown_072E50/func_80076C58.s @@ -74,7 +74,7 @@ glabel func_80076C58 /* 077964 80076D64 0C01DBDE */ jal func_80076F78 /* 077968 80076D68 24060008 */ li $a2, 8 /* 07796C 80076D6C 8FA40028 */ lw $a0, 0x28($sp) -/* 077970 80076D70 0C03186B */ jal func_800C61AC +/* 077970 80076D70 0C03186B */ jal byteswap32 /* 077974 80076D74 00000000 */ nop /* 077978 80076D78 8FA9003C */ lw $t1, 0x3c($sp) /* 07797C 80076D7C 8FA40028 */ lw $a0, 0x28($sp) diff --git a/asm/non_matchings/unknown_07B870/func_8007AE74.s b/asm/non_matchings/unknown_07B870/func_8007AE74.s index 79a169c4..1cc8f646 100644 --- a/asm/non_matchings/unknown_07B870/func_8007AE74.s +++ b/asm/non_matchings/unknown_07B870/func_8007AE74.s @@ -100,7 +100,7 @@ glabel func_8007AE74 /* 07BBE0 8007AFE0 1000002A */ b .L8007B08C /* 07BBE4 8007AFE4 00000000 */ nop .L8007AFE8: -/* 07BBE8 8007AFE8 0C03186B */ jal func_800C61AC +/* 07BBE8 8007AFE8 0C03186B */ jal byteswap32 /* 07BBEC 8007AFEC 24640020 */ addiu $a0, $v1, 0x20 /* 07BBF0 8007AFF0 0011C080 */ sll $t8, $s1, 2 /* 07BBF4 8007AFF4 0311C023 */ subu $t8, $t8, $s1 diff --git a/asm/non_matchings/unknown_07B870/func_8007C57C.s b/asm/non_matchings/unknown_07B870/func_8007C57C.s index c1d85c50..ffc1e09d 100644 --- a/asm/non_matchings/unknown_07B870/func_8007C57C.s +++ b/asm/non_matchings/unknown_07B870/func_8007C57C.s @@ -42,7 +42,7 @@ glabel func_8007C57C /* 07D210 8007C610 24070028 */ li $a3, 40 /* 07D214 8007C614 3C038012 */ lui $v1, %hi(D_8012636C) # $v1, 0x8012 /* 07D218 8007C618 8C63636C */ lw $v1, %lo(D_8012636C)($v1) -/* 07D21C 8007C61C 0C03186B */ jal func_800C61AC +/* 07D21C 8007C61C 0C03186B */ jal byteswap32 /* 07D220 8007C620 24640020 */ addiu $a0, $v1, 0x20 /* 07D224 8007C624 3C058012 */ lui $a1, %hi(D_8012636C) # $a1, 0x8012 /* 07D228 8007C628 8CA5636C */ lw $a1, %lo(D_8012636C)($a1) diff --git a/asm/non_matchings/unknown_0B8920/func_800C6170.s b/asm/non_matchings/unknown_0B8920/func_800C6170.s deleted file mode 100644 index 51d25dc7..00000000 --- a/asm/non_matchings/unknown_0B8920/func_800C6170.s +++ /dev/null @@ -1,17 +0,0 @@ -glabel func_800C6170 -/* 0C6D70 800C6170 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0C6D74 800C6174 AFBF0014 */ sw $ra, 0x14($sp) -/* 0C6D78 800C6178 24042800 */ li $a0, 10240 -/* 0C6D7C 800C617C 0C01C327 */ jal func_80070C9C -/* 0C6D80 800C6180 240500FF */ li $a1, 255 -/* 0C6D84 800C6184 3C01800E */ lui $at, %hi(D_800E3760) # $at, 0x800e -/* 0C6D88 800C6188 AC223760 */ sw $v0, %lo(D_800E3760)($at) -/* 0C6D8C 800C618C 24040010 */ li $a0, 16 -/* 0C6D90 800C6190 0C01C327 */ jal func_80070C9C -/* 0C6D94 800C6194 240500FF */ li $a1, 255 -/* 0C6D98 800C6198 8FBF0014 */ lw $ra, 0x14($sp) -/* 0C6D9C 800C619C 3C01800E */ lui $at, %hi(D_800E3764) # $at, 0x800e -/* 0C6DA0 800C61A0 AC223764 */ sw $v0, %lo(D_800E3764)($at) -/* 0C6DA4 800C61A4 03E00008 */ jr $ra -/* 0C6DA8 800C61A8 27BD0018 */ addiu $sp, $sp, 0x18 - diff --git a/asm/non_matchings/unknown_0B8920/func_800C61AC.s b/asm/non_matchings/unknown_0B8920/func_800C61AC.s deleted file mode 100644 index ba5d4076..00000000 --- a/asm/non_matchings/unknown_0B8920/func_800C61AC.s +++ /dev/null @@ -1,14 +0,0 @@ -glabel func_800C61AC -/* 0C6DAC 800C61AC 908E0001 */ lbu $t6, 1($a0) -/* 0C6DB0 800C61B0 90830000 */ lbu $v1, ($a0) -/* 0C6DB4 800C61B4 90980002 */ lbu $t8, 2($a0) -/* 0C6DB8 800C61B8 90880003 */ lbu $t0, 3($a0) -/* 0C6DBC 800C61BC 000E7A00 */ sll $t7, $t6, 8 -/* 0C6DC0 800C61C0 006F1825 */ or $v1, $v1, $t7 -/* 0C6DC4 800C61C4 0018CC00 */ sll $t9, $t8, 0x10 -/* 0C6DC8 800C61C8 00791825 */ or $v1, $v1, $t9 -/* 0C6DCC 800C61CC 00084E00 */ sll $t1, $t0, 0x18 -/* 0C6DD0 800C61D0 24840003 */ addiu $a0, $a0, 3 -/* 0C6DD4 800C61D4 03E00008 */ jr $ra -/* 0C6DD8 800C61D8 00691025 */ or $v0, $v1, $t1 - diff --git a/asm/non_matchings/unknown_0B8920/func_800C61DC.s b/asm/non_matchings/unknown_0B8920/func_800C61DC.s index e8c6cd6f..4649ec6d 100644 --- a/asm/non_matchings/unknown_0B8920/func_800C61DC.s +++ b/asm/non_matchings/unknown_0B8920/func_800C61DC.s @@ -8,7 +8,7 @@ glabel func_800C61DC /* 0C6DF4 800C61F4 24070008 */ li $a3, 8 /* 0C6DF8 800C61F8 3C04800E */ lui $a0, %hi(D_800E3764) # $a0, 0x800e /* 0C6DFC 800C61FC 8C843764 */ lw $a0, %lo(D_800E3764)($a0) -/* 0C6E00 800C6200 0C03186B */ jal func_800C61AC +/* 0C6E00 800C6200 0C03186B */ jal byteswap32 /* 0C6E04 800C6204 00000000 */ nop /* 0C6E08 800C6208 8FBF0014 */ lw $ra, 0x14($sp) /* 0C6E0C 800C620C 27BD0018 */ addiu $sp, $sp, 0x18 diff --git a/asm/non_matchings/unknown_0B8920/func_800C6218.s b/asm/non_matchings/unknown_0B8920/func_800C6218.s deleted file mode 100644 index b27c1ee6..00000000 --- a/asm/non_matchings/unknown_0B8920/func_800C6218.s +++ /dev/null @@ -1,27 +0,0 @@ -glabel func_800C6218 -/* 0C6E18 800C6218 248E0005 */ addiu $t6, $a0, 5 -/* 0C6E1C 800C621C 3C01800E */ lui $at, %hi(D_800E3768) # $at, 0x800e -/* 0C6E20 800C6220 AC2E3768 */ sw $t6, %lo(D_800E3768)($at) -/* 0C6E24 800C6224 3C01800E */ lui $at, %hi(D_800E376C) # $at, 0x800e -/* 0C6E28 800C6228 AC25376C */ sw $a1, %lo(D_800E376C)($at) -/* 0C6E2C 800C622C 3C018013 */ lui $at, %hi(D_8012AAD4) # $at, 0x8013 -/* 0C6E30 800C6230 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0C6E34 800C6234 AC20AAD4 */ sw $zero, %lo(D_8012AAD4)($at) -/* 0C6E38 800C6238 AFBF0014 */ sw $ra, 0x14($sp) -/* 0C6E3C 800C623C 3C018013 */ lui $at, %hi(D_8012AAD0) # $at, 0x8013 -/* 0C6E40 800C6240 AFA5001C */ sw $a1, 0x1c($sp) -/* 0C6E44 800C6244 0C031A30 */ jal func_800C68C0 -/* 0C6E48 800C6248 AC20AAD0 */ sw $zero, %lo(D_8012AAD0)($at) -/* 0C6E4C 800C624C 10400006 */ beqz $v0, .L800C6268 -/* 0C6E50 800C6250 8FBF0014 */ lw $ra, 0x14($sp) -.L800C6254: -/* 0C6E54 800C6254 0C031A30 */ jal func_800C68C0 -/* 0C6E58 800C6258 00000000 */ nop -/* 0C6E5C 800C625C 1440FFFD */ bnez $v0, .L800C6254 -/* 0C6E60 800C6260 00000000 */ nop -/* 0C6E64 800C6264 8FBF0014 */ lw $ra, 0x14($sp) -.L800C6268: -/* 0C6E68 800C6268 8FA2001C */ lw $v0, 0x1c($sp) -/* 0C6E6C 800C626C 03E00008 */ jr $ra -/* 0C6E70 800C6270 27BD0018 */ addiu $sp, $sp, 0x18 - diff --git a/asm/non_matchings/unknown_0B8920/func_800C68C0.s b/asm/non_matchings/unknown_0B8920/func_800C68C0.s index 4699b8e8..6aba56a4 100644 --- a/asm/non_matchings/unknown_0B8920/func_800C68C0.s +++ b/asm/non_matchings/unknown_0B8920/func_800C68C0.s @@ -56,13 +56,19 @@ glabel func_800C68C0 /* 0C7588 800C6988 00000000 */ nop /* 0C758C 800C698C 08031A6B */ j func_800C69AC /* 0C7590 800C6990 00000000 */ nop - .L800C6994: /* 0C7594 800C6994 0C031B77 */ jal func_800C6DDC /* 0C7598 800C6998 00000000 */ nop /* 0C759C 800C699C 08031A6B */ j func_800C69AC /* 0C75A0 800C69A0 00000000 */ nop - .L800C69A4: /* 0C75A4 800C69A4 0C031A71 */ jal func_800C69C4 /* 0C75A8 800C69A8 00000000 */ nop +glabel func_800C69AC +/* 0C75AC 800C69AC 8FBF001C */ lw $ra, 0x1c($sp) +/* 0C75B0 800C69B0 24020001 */ li $v0, 1 +/* 0C75B4 800C69B4 00501022 */ sub $v0, $v0, $s0 +/* 0C75B8 800C69B8 8FB00018 */ lw $s0, 0x18($sp) +/* 0C75BC 800C69BC 03E00008 */ jr $ra +/* 0C75C0 800C69C0 27BD0020 */ addiu $sp, $sp, 0x20 + diff --git a/asm/non_matchings/unknown_0B8920/func_800C69AC.s b/asm/non_matchings/unknown_0B8920/func_800C69AC.s deleted file mode 100644 index ffe5e936..00000000 --- a/asm/non_matchings/unknown_0B8920/func_800C69AC.s +++ /dev/null @@ -1,8 +0,0 @@ -glabel func_800C69AC -/* 0C75AC 800C69AC 8FBF001C */ lw $ra, 0x1c($sp) -/* 0C75B0 800C69B0 24020001 */ li $v0, 1 -/* 0C75B4 800C69B4 00501022 */ sub $v0, $v0, $s0 -/* 0C75B8 800C69B8 8FB00018 */ lw $s0, 0x18($sp) -/* 0C75BC 800C69BC 03E00008 */ jr $ra -/* 0C75C0 800C69C0 27BD0020 */ addiu $sp, $sp, 0x20 - diff --git a/src/mips1/unknown_0B8920.c b/src/mips1/unknown_0B8920.c index 6f7bdef6..8914c18e 100644 --- a/src/mips1/unknown_0B8920.c +++ b/src/mips1/unknown_0B8920.c @@ -4,7 +4,80 @@ #include "types.h" #include "macros.h" -GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800B7D20.s") +extern s32 D_800E3760; +extern s32 D_800E3764; +extern s32 D_800E3768; +extern s32 D_800E376C; +extern s32 D_8012AAD8; +extern s32 D_8012AAD4; +extern s32 D_8012AAD0; + +s32 func_80070C9C(s32 arg0, s32 arg1); +void func_80071140(s32* arg0); +void func_8007B2BC(s32* arg0); + +extern s32* D_800E3040; +extern s32* D_800E3044; +extern s32* D_800E3048; +extern s32* D_800E304C; +extern s32* D_800E3070; +extern s32* D_800E3080; +extern s32* D_800E30D0; +extern s32* D_800E30D4; +extern s32* D_800E30D8; +extern s32* D_800E3178; +extern s32* D_800E3184; +extern s32* D_800E3188; +extern s32* D_800E3190; +extern s32* D_800E3194; + +void func_800B7D20(void) { + if (D_800E3040 != NULL) { + func_80071140(D_800E3040); + D_800E3040 = NULL; + } + if (D_800E3044 != NULL) { + func_80071140(D_800E3044); + D_800E3044 = NULL; + } + if (D_800E3048 != NULL) { + func_80071140(D_800E3048); + D_800E3048 = NULL; + } + if (D_800E304C != NULL) { + func_80071140(D_800E304C); + D_800E304C = NULL; + } + if (D_800E3070 != NULL) { + func_80071140(D_800E3070); + D_800E3070 = NULL; + } + if (D_800E3080 != NULL) { + func_80071140(D_800E3080); + D_800E3080 = NULL; + } + if (D_800E30D0 != NULL) { + func_8007B2BC(D_800E30D0); + D_800E30D0 = NULL; + } + if (D_800E30D4 != NULL) { + func_80071140(D_800E30D4); + D_800E30D4 = NULL; + } + if (D_800E30D8 != NULL) { + func_80071140(D_800E30D8); + D_800E30D8 = NULL; + } + if (D_800E3178 != NULL) { + func_80071140(D_800E3178); + D_800E3178 = NULL; + } + D_800E3190 = NULL; + D_800E3194 = NULL; + D_800E3184 = NULL; + D_800E3188 = NULL; +} + GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800B7EB4.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800B8134.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800B82B4.s") @@ -96,13 +169,41 @@ GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C5AA0.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C5B58.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C5F60.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6000.s") -GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6170.s") -GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C61AC.s") + +void func_800C6170(void) { + D_800E3760 = func_80070C9C(0x2800, 0xFF); + D_800E3764 = func_80070C9C(0x10, 0xFF); +} + +// Returns the little-endian value from a byte array. +s32 byteswap32(u8* arg0) { + s32 value; + value = *arg0++; + value |= (*arg0++ << 8); + value |= (*arg0++ << 16); + value |= (*arg0++ << 24); + return value; +} + + GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C61DC.s") -GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6218.s") + +s32 func_800C68C0(void); + +s32 func_800C6218(s32 arg0, s32 arg1) { + // The compression header is 5 bytes. Maybe this is part of the decompression routine? + D_800E3768 = (s32) (arg0 + 5); + D_800E376C = arg1; + D_8012AAD4 = 0; + D_8012AAD0 = 0; + while(func_800C68C0() != 0) {} // Keep calling func_800C68C0() until it returns 0. + return arg1; +} + GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6274.s") + GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C68C0.s") -GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C69AC.s") + GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C69C4.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6B90.s") GLOBAL_ASM("asm/non_matchings/unknown_0B8920/func_800C6DDC.s")