From d951c64c1a8e5f974fb460af63ceae707424d096 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 25 Jan 2021 17:43:41 +1000 Subject: [PATCH] Decompile __f_to_ll, __ull_to_d and __ull_to_f --- Makefile | 7 +++ ld/libfiles.inc | 2 +- src/game/camdraw.c | 2 +- src/game/chr/chraction.c | 2 +- src/game/chr/chraicommands.c | 3 +- src/include/lib/lib_05a60.h | 11 ---- src/include/lib/libc/llcvt.h | 9 +++ src/lib/lib_05a60.c | 104 ----------------------------------- src/lib/lib_233c0.c | 14 ++--- src/lib/libc/llcvt.c | 67 ++++++++++++++++++++++ 10 files changed, 94 insertions(+), 127 deletions(-) delete mode 100644 src/include/lib/lib_05a60.h create mode 100644 src/include/lib/libc/llcvt.h delete mode 100644 src/lib/lib_05a60.c create mode 100644 src/lib/libc/llcvt.c diff --git a/Makefile b/Makefile index d731d9c45..e6ee9e0a2 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,7 @@ endif MIPSISET := -mips2 -32 +$(B_DIR)/lib/libc/llcvt.o: MIPSISET := -mips3 -o32 $(B_DIR)/lib/libc/ll.o: MIPSISET := -mips3 -o32 CFLAGS = -DVERSION=$(VERSION) \ @@ -351,6 +352,12 @@ $(B_DIR)/boot/%.o: src/boot/%.c /usr/bin/env python3 tools/asmpreproc/asm-processor.py -O2 $< | $(IDOCC) -c $(CFLAGS) tools/asmpreproc/include-stdin.c -o $@ -O2 /usr/bin/env python3 tools/asmpreproc/asm-processor.py -O2 $< --post-process $@ --assembler "$(TOOLCHAIN)-as -march=vr4300 -mabi=32" --asm-prelude tools/asmpreproc/prelude.s +$(B_DIR)/lib/libc/llcvt.o: src/lib/libc/llcvt.c + @mkdir -p $(dir $@) + /usr/bin/env python3 tools/asmpreproc/asm-processor.py -O2 $< | $(IDOCC) -c $(CFLAGS) tools/asmpreproc/include-stdin.c -o $@ -O1 + /usr/bin/env python3 tools/asmpreproc/asm-processor.py -O2 $< --post-process $@ --assembler "$(TOOLCHAIN)-as -march=vr4300 -mabi=32" --asm-prelude tools/asmpreproc/prelude.s + tools/patchmips3 $@ || rm $@ + $(B_DIR)/lib/libc/ll.o: src/lib/libc/ll.c @mkdir -p $(dir $@) $(IDOCC) -c $(CFLAGS) $< -o $@ -O1 diff --git a/ld/libfiles.inc b/ld/libfiles.inc index e7f3047c7..8f5cbc864 100644 --- a/ld/libfiles.inc +++ b/ld/libfiles.inc @@ -11,7 +11,7 @@ build/ROMID/lib/lib_04840.o (section); \ build/ROMID/lib/lib_04a80.o (section); \ build/ROMID/lib/ultra/io/pfsisplug.o (section); \ - build/ROMID/lib/lib_05a60.o (section); \ + build/ROMID/lib/libc/llcvt.o (section); \ build/ROMID/lib/ultra/os/initialize.o (section); \ build/ROMID/lib/lib_05dc0.o (section); \ build/ROMID/lib/lib_05e40.o (section); \ diff --git a/src/game/camdraw.c b/src/game/camdraw.c index 90f51e678..c4639c23e 100644 --- a/src/game/camdraw.c +++ b/src/game/camdraw.c @@ -4927,7 +4927,7 @@ glabel func0f14dac0 /* f14dbac: 461a6302 */ mul.s $f12,$f12,$f26 /* f14dbb0: 52c0000a */ beqzl $s6,.L0f14dbdc /* f14dbb4: 26b50001 */ addiu $s5,$s5,0x1 -/* f14dbb8: 0c00169f */ jal func00005a7c +/* f14dbb8: 0c00169f */ jal __f_to_ull /* f14dbbc: 0117a023 */ subu $s4,$t0,$s7 /* f14dbc0: 02c02025 */ or $a0,$s6,$zero /* f14dbc4: 02802825 */ or $a1,$s4,$zero diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index 7b9622e47..000570983 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -26390,7 +26390,7 @@ glabel func0f04ba34 /* f04bdb4: 4502000d */ bc1fl .L0f04bdec /* f04bdb8: 8fae0078 */ lw $t6,0x78($sp) .L0f04bdbc: -/* f04bdbc: 0c00169f */ jal func00005a7c +/* f04bdbc: 0c00169f */ jal __f_to_ull /* f04bdc0: afa40050 */ sw $a0,0x50($sp) /* f04bdc4: 8fa40050 */ lw $a0,0x50($sp) /* f04bdc8: 8e4a0000 */ lw $t2,0x0($s2) diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 01e5f0fbd..28b227f1c 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -10905,8 +10905,7 @@ bool aiRemoveWeaponFromInventory(void) */ bool ai01dd(void) { - u64 value = (u64)osGetCount() * 64; - func00005b30(value / 3000); + f32 value = (u64)osGetCount() * 64 / 3000; if (var800840c4) { g_Vars.aioffset += 4; diff --git a/src/include/lib/lib_05a60.h b/src/include/lib/lib_05a60.h deleted file mode 100644 index 222c106aa..000000000 --- a/src/include/lib/lib_05a60.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _IN_LIB_LIB_05A60_H -#define _IN_LIB_LIB_05A60_H -#include -#include "types.h" - -u32 func00005a60(void); -u32 func00005a7c(void); -u32 func00005b18(void); -void func00005b30(u64 arg0); - -#endif diff --git a/src/include/lib/libc/llcvt.h b/src/include/lib/libc/llcvt.h new file mode 100644 index 000000000..216a0e004 --- /dev/null +++ b/src/include/lib/libc/llcvt.h @@ -0,0 +1,9 @@ +#ifndef _IN_LIB_LIBC_LLCVT_H +#define _IN_LIB_LIBC_LLCVT_H + +long long __f_to_ll(float f); +unsigned long long __f_to_ull(float f); +double __ll_to_d(long long s); +float __ull_to_f(unsigned long long u); + +#endif diff --git a/src/lib/lib_05a60.c b/src/lib/lib_05a60.c deleted file mode 100644 index e88405f2d..000000000 --- a/src/lib/lib_05a60.c +++ /dev/null @@ -1,104 +0,0 @@ -#include -#include "boot/boot.h" -#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/lib_04790.h" -#include "lib/lib_04a80.h" -#include "lib/lib_16110.h" -#include "lib/lib_48150.h" -#include "lib/lib_4a360.h" -#include "lib/lib_4a5e0.h" -#include "lib/lib_4a680.h" -#include "lib/libc/ll.h" -#include "types.h" - -GLOBAL_ASM( -glabel func00005a60 -/* 5a60: 46006109 */ trunc.l.s $f4,$f12 -/* 5a64: 44222000 */ dmfc1 $v0,$f4 -/* 5a68: 00000000 */ nop -/* 5a6c: 0002183c */ dsll32 $v1,$v0,0x0 -/* 5a70: 0003183f */ dsra32 $v1,$v1,0x0 -/* 5a74: 03e00008 */ jr $ra -/* 5a78: 0002103f */ dsra32 $v0,$v0,0x0 -); - -GLOBAL_ASM( -glabel func00005a7c -/* 5a7c: 444ef800 */ cfc1 $t6,$31 -/* 5a80: 24020001 */ addiu $v0,$zero,0x1 -/* 5a84: 44c2f800 */ ctc1 $v0,$31 -/* 5a88: 00000000 */ nop -/* 5a8c: 46006125 */ cvt.l.s $f4,$f12 -/* 5a90: 4442f800 */ cfc1 $v0,$31 -/* 5a94: 00000000 */ nop -/* 5a98: 30410004 */ andi $at,$v0,0x4 -/* 5a9c: 30420078 */ andi $v0,$v0,0x78 -/* 5aa0: 10400014 */ beqz $v0,.L00005af4 -/* 5aa4: 3c015f00 */ lui $at,0x5f00 -/* 5aa8: 44812000 */ mtc1 $at,$f4 -/* 5aac: 24020001 */ addiu $v0,$zero,0x1 -/* 5ab0: 46046101 */ sub.s $f4,$f12,$f4 -/* 5ab4: 44c2f800 */ ctc1 $v0,$31 -/* 5ab8: 00000000 */ nop -/* 5abc: 46002125 */ cvt.l.s $f4,$f4 -/* 5ac0: 4442f800 */ cfc1 $v0,$31 -/* 5ac4: 00000000 */ nop -/* 5ac8: 30410004 */ andi $at,$v0,0x4 -/* 5acc: 30420078 */ andi $v0,$v0,0x78 -/* 5ad0: 14400006 */ bnez $v0,.L00005aec -/* 5ad4: 00000000 */ nop -/* 5ad8: 3c0f8000 */ lui $t7,0x8000 -/* 5adc: 000f783c */ dsll32 $t7,$t7,0x0 -/* 5ae0: 44222000 */ dmfc1 $v0,$f4 -/* 5ae4: 10000007 */ b .L00005b04 -/* 5ae8: 004f1025 */ or $v0,$v0,$t7 -.L00005aec: -/* 5aec: 10000005 */ b .L00005b04 -/* 5af0: 2402ffff */ addiu $v0,$zero,-1 -.L00005af4: -/* 5af4: 44222000 */ dmfc1 $v0,$f4 -/* 5af8: 00000000 */ nop -/* 5afc: 0440fffb */ bltz $v0,.L00005aec -/* 5b00: 00000000 */ nop -.L00005b04: -/* 5b04: 44cef800 */ ctc1 $t6,$31 -/* 5b08: 0002183c */ dsll32 $v1,$v0,0x0 -/* 5b0c: 0003183f */ dsra32 $v1,$v1,0x0 -/* 5b10: 03e00008 */ jr $ra -/* 5b14: 0002103f */ dsra32 $v0,$v0,0x0 -); - -GLOBAL_ASM( -glabel func00005b18 -/* 5b18: afa40000 */ sw $a0,0x0($sp) -/* 5b1c: afa50004 */ sw $a1,0x4($sp) -/* 5b20: dfae0000 */ ld $t6,0x0($sp) -/* 5b24: 44ae2000 */ dmtc1 $t6,$f4 -/* 5b28: 03e00008 */ jr $ra -/* 5b2c: 46a02021 */ cvt.d.l $f0,$f4 -); - -GLOBAL_ASM( -glabel func00005b30 -/* 5b30: afa40000 */ sw $a0,0x0($sp) -/* 5b34: afa50004 */ sw $a1,0x4($sp) -/* 5b38: dfae0000 */ ld $t6,0x0($sp) -/* 5b3c: 44ae2000 */ dmtc1 $t6,$f4 -/* 5b40: 05c10005 */ bgez $t6,.L00005b58 -/* 5b44: 46a02020 */ cvt.s.l $f0,$f4 -/* 5b48: 3c014f80 */ lui $at,0x4f80 -/* 5b4c: 44813000 */ mtc1 $at,$f6 -/* 5b50: 00000000 */ nop -/* 5b54: 46060000 */ add.s $f0,$f0,$f6 -.L00005b58: -/* 5b58: 03e00008 */ jr $ra -/* 5b5c: 00000000 */ nop -); diff --git a/src/lib/lib_233c0.c b/src/lib/lib_233c0.c index 7ae403d7e..48f207c29 100644 --- a/src/lib/lib_233c0.c +++ b/src/lib/lib_233c0.c @@ -2995,7 +2995,7 @@ glabel func00025c74 /* 25d94: 46085282 */ mul.s $f10,$f10,$f8 /* 25d98: e7a80078 */ swc1 $f8,0x78($sp) /* 25d9c: 46062202 */ mul.s $f8,$f4,$f6 -/* 25da0: 0c001698 */ jal func00005a60 +/* 25da0: 0c001698 */ jal __f_to_ll /* 25da4: 46085301 */ sub.s $f12,$f10,$f8 /* 25da8: c7a40084 */ lwc1 $f4,0x84($sp) /* 25dac: c7a60070 */ lwc1 $f6,0x70($sp) @@ -3005,7 +3005,7 @@ glabel func00025c74 /* 25dbc: c7a4007c */ lwc1 $f4,0x7c($sp) /* 25dc0: afa3005c */ sw $v1,0x5c($sp) /* 25dc4: 46044182 */ mul.s $f6,$f8,$f4 -/* 25dc8: 0c001698 */ jal func00005a60 +/* 25dc8: 0c001698 */ jal __f_to_ll /* 25dcc: 46065301 */ sub.s $f12,$f10,$f6 /* 25dd0: c7a8007c */ lwc1 $f8,0x7c($sp) /* 25dd4: c7a40074 */ lwc1 $f4,0x74($sp) @@ -3015,7 +3015,7 @@ glabel func00025c74 /* 25de4: c7a80080 */ lwc1 $f8,0x80($sp) /* 25de8: afa30064 */ sw $v1,0x64($sp) /* 25dec: 46083102 */ mul.s $f4,$f6,$f8 -/* 25df0: 0c001698 */ jal func00005a60 +/* 25df0: 0c001698 */ jal __f_to_ll /* 25df4: 46045301 */ sub.s $f12,$f10,$f4 /* 25df8: afa20068 */ sw $v0,0x68($sp) /* 25dfc: afa3006c */ sw $v1,0x6c($sp) @@ -3066,19 +3066,19 @@ glabel func00025c74 .L00025eb0: /* 25eb0: 8fa40068 */ lw $a0,0x68($sp) .L00025eb4: -/* 25eb4: 0c0016c6 */ jal func00005b18 +/* 25eb4: 0c0016c6 */ jal __ll_to_d /* 25eb8: 8fa5006c */ lw $a1,0x6c($sp) /* 25ebc: f7a00020 */ sdc1 $f0,0x20($sp) /* 25ec0: 8fa40058 */ lw $a0,0x58($sp) -/* 25ec4: 0c0016c6 */ jal func00005b18 +/* 25ec4: 0c0016c6 */ jal __ll_to_d /* 25ec8: 8fa5005c */ lw $a1,0x5c($sp) /* 25ecc: 8fa40050 */ lw $a0,0x50($sp) /* 25ed0: 8fa50054 */ lw $a1,0x54($sp) -/* 25ed4: 0c0016c6 */ jal func00005b18 +/* 25ed4: 0c0016c6 */ jal __ll_to_d /* 25ed8: f7a00028 */ sdc1 $f0,0x28($sp) /* 25edc: 8fa40060 */ lw $a0,0x60($sp) /* 25ee0: 8fa50064 */ lw $a1,0x64($sp) -/* 25ee4: 0c0016c6 */ jal func00005b18 +/* 25ee4: 0c0016c6 */ jal __ll_to_d /* 25ee8: f7a00030 */ sdc1 $f0,0x30($sp) /* 25eec: c7a80090 */ lwc1 $f8,0x90($sp) /* 25ef0: d7a40020 */ ldc1 $f4,0x20($sp) diff --git a/src/lib/libc/llcvt.c b/src/lib/libc/llcvt.c new file mode 100644 index 000000000..1d879c433 --- /dev/null +++ b/src/lib/libc/llcvt.c @@ -0,0 +1,67 @@ +long long __f_to_ll(float f) +{ + return f; +} + +GLOBAL_ASM( +glabel __f_to_ull +/* 5a7c: 444ef800 */ cfc1 $t6,$31 +/* 5a80: 24020001 */ addiu $v0,$zero,0x1 +/* 5a84: 44c2f800 */ ctc1 $v0,$31 +/* 5a88: 00000000 */ nop +/* 5a8c: 46006125 */ cvt.l.s $f4,$f12 +/* 5a90: 4442f800 */ cfc1 $v0,$31 +/* 5a94: 00000000 */ nop +/* 5a98: 30410004 */ andi $at,$v0,0x4 +/* 5a9c: 30420078 */ andi $v0,$v0,0x78 +/* 5aa0: 10400014 */ beqz $v0,.L00005af4 +/* 5aa4: 3c015f00 */ lui $at,0x5f00 +/* 5aa8: 44812000 */ mtc1 $at,$f4 +/* 5aac: 24020001 */ addiu $v0,$zero,0x1 +/* 5ab0: 46046101 */ sub.s $f4,$f12,$f4 +/* 5ab4: 44c2f800 */ ctc1 $v0,$31 +/* 5ab8: 00000000 */ nop +/* 5abc: 46002125 */ cvt.l.s $f4,$f4 +/* 5ac0: 4442f800 */ cfc1 $v0,$31 +/* 5ac4: 00000000 */ nop +/* 5ac8: 30410004 */ andi $at,$v0,0x4 +/* 5acc: 30420078 */ andi $v0,$v0,0x78 +/* 5ad0: 14400006 */ bnez $v0,.L00005aec +/* 5ad4: 00000000 */ nop +/* 5ad8: 3c0f8000 */ lui $t7,0x8000 +/* 5adc: 000f783c */ dsll32 $t7,$t7,0x0 +/* 5ae0: 44222000 */ dmfc1 $v0,$f4 +/* 5ae4: 10000007 */ b .L00005b04 +/* 5ae8: 004f1025 */ or $v0,$v0,$t7 +.L00005aec: +/* 5aec: 10000005 */ b .L00005b04 +/* 5af0: 2402ffff */ addiu $v0,$zero,-1 +.L00005af4: +/* 5af4: 44222000 */ dmfc1 $v0,$f4 +/* 5af8: 00000000 */ nop +/* 5afc: 0440fffb */ bltz $v0,.L00005aec +/* 5b00: 00000000 */ nop +.L00005b04: +/* 5b04: 44cef800 */ ctc1 $t6,$31 +/* 5b08: 0002183c */ dsll32 $v1,$v0,0x0 +/* 5b0c: 0003183f */ dsra32 $v1,$v1,0x0 +/* 5b10: 03e00008 */ jr $ra +/* 5b14: 0002103f */ dsra32 $v0,$v0,0x0 +); + +// Mismatch: Goal loads 0x80000000 then shifts it left by 32, +// while the below stores it in .rodata and loads it. +//unsigned long long __f_to_ull(float f) +//{ +// return f; +//} + +double __ll_to_d(long long s) +{ + return s; +} + +float __ull_to_f(unsigned long long u) +{ + return u; +}