From 48a00e50b32f22e4199d0eeb8f7498145fbe379f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 25 Jan 2021 17:58:29 +1000 Subject: [PATCH] Decompile lldiv and ldiv --- ld/libfiles.inc | 2 +- src/include/lib/lib_4a680.h | 9 --- src/include/lib/libc/ldiv.h | 19 ++++++ src/lib/lib_04a80.c | 4 +- src/lib/lib_4a680.c | 127 ------------------------------------ src/lib/lib_520c0.c | 2 +- src/lib/libc/ldiv.c | 31 +++++++++ 7 files changed, 54 insertions(+), 140 deletions(-) delete mode 100644 src/include/lib/lib_4a680.h create mode 100644 src/include/lib/libc/ldiv.h delete mode 100644 src/lib/lib_4a680.c create mode 100644 src/lib/libc/ldiv.c diff --git a/ld/libfiles.inc b/ld/libfiles.inc index 8f5cbc864..d88b77f25 100644 --- a/ld/libfiles.inc +++ b/ld/libfiles.inc @@ -115,7 +115,7 @@ build/ROMID/lib/ultra/os/destroythread.o (section); \ build/ROMID/lib/lib_4a360.o (section); \ build/ROMID/lib/lib_4a5e0.o (section); \ - build/ROMID/lib/lib_4a680.o (section); \ + build/ROMID/lib/libc/ldiv.o (section); \ build/ROMID/lib/ultra/io/siacs.o (section); \ build/ROMID/lib/ultra/io/sirawdma.o (section); \ build/ROMID/lib/ultra/io/controller.o (section); \ diff --git a/src/include/lib/lib_4a680.h b/src/include/lib/lib_4a680.h deleted file mode 100644 index bffcdf178..000000000 --- a/src/include/lib/lib_4a680.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _IN_LIB_LIB_4A680_H -#define _IN_LIB_LIB_4A680_H -#include -#include "types.h" - -u32 func0004a680(void); -u32 func0004a780(void); - -#endif diff --git a/src/include/lib/libc/ldiv.h b/src/include/lib/libc/ldiv.h new file mode 100644 index 000000000..e4f86c292 --- /dev/null +++ b/src/include/lib/libc/ldiv.h @@ -0,0 +1,19 @@ +#ifndef _IN_LIB_LIBC_LDIV_H +#define _IN_LIB_LIBC_LDIV_H + +typedef struct lldiv_t +{ + long long quot; + long long rem; +} lldiv_t; + +typedef struct ldiv_t +{ + long quot; + long rem; +} ldiv_t; + +lldiv_t lldiv(long long num, long long denom); +ldiv_t ldiv(long num, long denom); + +#endif diff --git a/src/lib/lib_04a80.c b/src/lib/lib_04a80.c index 208cfd870..38f35c30e 100644 --- a/src/lib/lib_04a80.c +++ b/src/lib/lib_04a80.c @@ -15,7 +15,7 @@ #include "lib/lib_48150.h" #include "lib/lib_4a360.h" #include "lib/lib_4a5e0.h" -#include "lib/lib_4a680.h" +#include "lib/libc/ldiv.h" #include "lib/libc/ll.h" #include "types.h" @@ -367,7 +367,7 @@ glabel func00004c50 /* 4ef8: 02602025 */ or $a0,$s3,$zero .L00004efc: /* 4efc: 02202825 */ or $a1,$s1,$zero -/* 4f00: 0c0129e0 */ jal func0004a780 +/* 4f00: 0c0129e0 */ jal ldiv /* 4f04: 2406000a */ addiu $a2,$zero,0xa /* 4f08: 8fa80070 */ lw $t0,0x70($sp) /* 4f0c: 2652ffff */ addiu $s2,$s2,-1 diff --git a/src/lib/lib_4a680.c b/src/lib/lib_4a680.c deleted file mode 100644 index caef48d4e..000000000 --- a/src/lib/lib_4a680.c +++ /dev/null @@ -1,127 +0,0 @@ -#include -#include "constants.h" -#include "game/data/data_000000.h" -#include "game/data/data_0083d0.h" -#include "game/data/data_00e460.h" -#include "game/data/data_0160b0.h" -#include "game/data/data_01a3a0.h" -#include "game/data/data_020df0.h" -#include "game/data/data_02da90.h" -#include "gvars/gvars.h" -#include "lib/libc/ll.h" -#include "types.h" - -GLOBAL_ASM( -glabel func0004a680 -/* 4a680: 27bdffd0 */ addiu $sp,$sp,-48 -/* 4a684: afa40030 */ sw $a0,0x30($sp) -/* 4a688: afbf0014 */ sw $ra,0x14($sp) -/* 4a68c: afa60038 */ sw $a2,0x38($sp) -/* 4a690: afa7003c */ sw $a3,0x3c($sp) -/* 4a694: 00c02025 */ or $a0,$a2,$zero -/* 4a698: 00e02825 */ or $a1,$a3,$zero -/* 4a69c: 8fa70044 */ lw $a3,0x44($sp) -/* 4a6a0: 0c012bc3 */ jal __ll_div -/* 4a6a4: 8fa60040 */ lw $a2,0x40($sp) -/* 4a6a8: afa20020 */ sw $v0,0x20($sp) -/* 4a6ac: afa30024 */ sw $v1,0x24($sp) -/* 4a6b0: 8fa40040 */ lw $a0,0x40($sp) -/* 4a6b4: 8fa50044 */ lw $a1,0x44($sp) -/* 4a6b8: 00403025 */ or $a2,$v0,$zero -/* 4a6bc: 0c012bda */ jal __ll_mul -/* 4a6c0: 00603825 */ or $a3,$v1,$zero -/* 4a6c4: 8fae0038 */ lw $t6,0x38($sp) -/* 4a6c8: 8faf003c */ lw $t7,0x3c($sp) -/* 4a6cc: 8fa80020 */ lw $t0,0x20($sp) -/* 4a6d0: 01c2c023 */ subu $t8,$t6,$v0 -/* 4a6d4: 01e3082b */ sltu $at,$t7,$v1 -/* 4a6d8: 0301c023 */ subu $t8,$t8,$at -/* 4a6dc: 01e3c823 */ subu $t9,$t7,$v1 -/* 4a6e0: afb9002c */ sw $t9,0x2c($sp) -/* 4a6e4: afb80028 */ sw $t8,0x28($sp) -/* 4a6e8: 1d000017 */ bgtz $t0,.L0004a748 -/* 4a6ec: 8fa90024 */ lw $t1,0x24($sp) -/* 4a6f0: 05000003 */ bltz $t0,.L0004a700 -/* 4a6f4: 00000000 */ nop -/* 4a6f8: 10000014 */ b .L0004a74c -/* 4a6fc: 27a80020 */ addiu $t0,$sp,0x20 -.L0004a700: -/* 4a700: 07020012 */ bltzl $t8,.L0004a74c -/* 4a704: 27a80020 */ addiu $t0,$sp,0x20 -/* 4a708: 1f000003 */ bgtz $t8,.L0004a718 -/* 4a70c: 252b0001 */ addiu $t3,$t1,0x1 -/* 4a710: 5320000e */ beqzl $t9,.L0004a74c -/* 4a714: 27a80020 */ addiu $t0,$sp,0x20 -.L0004a718: -/* 4a718: 8fac0040 */ lw $t4,0x40($sp) -/* 4a71c: 8fad0044 */ lw $t5,0x44($sp) -/* 4a720: 2d610001 */ sltiu $at,$t3,0x1 -/* 4a724: 01015021 */ addu $t2,$t0,$at -/* 4a728: 030c7023 */ subu $t6,$t8,$t4 -/* 4a72c: 032d082b */ sltu $at,$t9,$t5 -/* 4a730: 01c17023 */ subu $t6,$t6,$at -/* 4a734: 032d7823 */ subu $t7,$t9,$t5 -/* 4a738: afaa0020 */ sw $t2,0x20($sp) -/* 4a73c: afab0024 */ sw $t3,0x24($sp) -/* 4a740: afaf002c */ sw $t7,0x2c($sp) -/* 4a744: afae0028 */ sw $t6,0x28($sp) -.L0004a748: -/* 4a748: 27a80020 */ addiu $t0,$sp,0x20 -.L0004a74c: -/* 4a74c: 8fa20030 */ lw $v0,0x30($sp) -/* 4a750: 8d010000 */ lw $at,0x0($t0) -/* 4a754: ac410000 */ sw $at,0x0($v0) -/* 4a758: 8d0b0004 */ lw $t3,0x4($t0) -/* 4a75c: ac4b0004 */ sw $t3,0x4($v0) -/* 4a760: 8d010008 */ lw $at,0x8($t0) -/* 4a764: ac410008 */ sw $at,0x8($v0) -/* 4a768: 8d0b000c */ lw $t3,0xc($t0) -/* 4a76c: ac4b000c */ sw $t3,0xc($v0) -/* 4a770: 8fbf0014 */ lw $ra,0x14($sp) -/* 4a774: 27bd0030 */ addiu $sp,$sp,0x30 -/* 4a778: 03e00008 */ jr $ra -/* 4a77c: 00000000 */ nop -); - -GLOBAL_ASM( -glabel func0004a780 -/* 4a780: 00a6001a */ div $zero,$a1,$a2 -/* 4a784: 00001012 */ mflo $v0 -/* 4a788: 27bdfff8 */ addiu $sp,$sp,-8 -/* 4a78c: 14c00002 */ bnez $a2,.L0004a798 -/* 4a790: 00000000 */ nop -/* 4a794: 0007000d */ break 0x7 -.L0004a798: -/* 4a798: 2401ffff */ addiu $at,$zero,-1 -/* 4a79c: 14c10004 */ bne $a2,$at,.L0004a7b0 -/* 4a7a0: 3c018000 */ lui $at,0x8000 -/* 4a7a4: 14a10002 */ bne $a1,$at,.L0004a7b0 -/* 4a7a8: 00000000 */ nop -/* 4a7ac: 0006000d */ break 0x6 -.L0004a7b0: -/* 4a7b0: 00c20019 */ multu $a2,$v0 -/* 4a7b4: afa20000 */ sw $v0,0x0($sp) -/* 4a7b8: 27af0000 */ addiu $t7,$sp,0x0 -/* 4a7bc: 00007012 */ mflo $t6 -/* 4a7c0: 00ae1823 */ subu $v1,$a1,$t6 -/* 4a7c4: 04410008 */ bgez $v0,.L0004a7e8 -/* 4a7c8: afa30004 */ sw $v1,0x4($sp) -/* 4a7cc: afa20000 */ sw $v0,0x0($sp) -/* 4a7d0: 18600005 */ blez $v1,.L0004a7e8 -/* 4a7d4: afa30004 */ sw $v1,0x4($sp) -/* 4a7d8: 24420001 */ addiu $v0,$v0,0x1 -/* 4a7dc: 00661823 */ subu $v1,$v1,$a2 -/* 4a7e0: afa30004 */ sw $v1,0x4($sp) -/* 4a7e4: afa20000 */ sw $v0,0x0($sp) -.L0004a7e8: -/* 4a7e8: 8de10000 */ lw $at,0x0($t7) -/* 4a7ec: 00801025 */ or $v0,$a0,$zero -/* 4a7f0: ac810000 */ sw $at,0x0($a0) -/* 4a7f4: 8de80004 */ lw $t0,0x4($t7) -/* 4a7f8: 27bd0008 */ addiu $sp,$sp,0x8 -/* 4a7fc: 03e00008 */ jr $ra -/* 4a800: ac880004 */ sw $t0,0x4($a0) -/* 4a804: 00000000 */ nop -/* 4a808: 00000000 */ nop -/* 4a80c: 00000000 */ nop -); \ No newline at end of file diff --git a/src/lib/lib_520c0.c b/src/lib/lib_520c0.c index f222aa915..6443d9f99 100644 --- a/src/lib/lib_520c0.c +++ b/src/lib/lib_520c0.c @@ -122,7 +122,7 @@ glabel func000520c0 /* 52260: 8fa60040 */ lw $a2,0x40($sp) /* 52264: 8fa70044 */ lw $a3,0x44($sp) /* 52268: afae0010 */ sw $t6,0x10($sp) -/* 5226c: 0c0129a0 */ jal func0004a680 +/* 5226c: 0c0129a0 */ jal lldiv /* 52270: afaf0014 */ sw $t7,0x14($sp) /* 52274: 8fb80050 */ lw $t8,0x50($sp) /* 52278: 8fb90054 */ lw $t9,0x54($sp) diff --git a/src/lib/libc/ldiv.c b/src/lib/libc/ldiv.c new file mode 100644 index 000000000..3eda0aa29 --- /dev/null +++ b/src/lib/libc/ldiv.c @@ -0,0 +1,31 @@ +#include "lib/libc/ldiv.h" + +lldiv_t lldiv(long long num, long long denom) +{ + lldiv_t ret; + + ret.quot = num / denom; + ret.rem = num - denom * ret.quot; + + if (ret.quot < 0 && ret.rem > 0) { + ret.quot++; + ret.rem -= denom; + } + + return ret; +} + +ldiv_t ldiv(long num, long denom) +{ + ldiv_t ret; + + ret.quot = num / denom; + ret.rem = num - denom * ret.quot; + + if (ret.quot < 0 && ret.rem > 0) { + ret.quot++; + ret.rem -= denom; + } + + return ret; +}