From 2b7d9ed708d474187c7e1e6dd237db5a5fcb5dbd Mon Sep 17 00:00:00 2001 From: rozlette Date: Wed, 6 Mar 2019 21:48:32 -0600 Subject: [PATCH] Do most of code_0x800FEC90 --- Makefile | 6 +- codescript.txt | 2 +- functions.py | 17 +- include/functions.h | 32 +- include/structs.h | 10 +- include/variables.h | 15 +- src/code/code_0x800FEC90.c | 1323 ++++++++++++++++++++++++++++++++++++ variables.py | 5 + 8 files changed, 1377 insertions(+), 33 deletions(-) create mode 100644 src/code/code_0x800FEC90.c diff --git a/Makefile b/Makefile index 96a18750ff..f6b0c44108 100644 --- a/Makefile +++ b/Makefile @@ -25,14 +25,16 @@ build/src/libultra/%: CC := $(QEMU_IRIX) -L $(IRIX_53_ROOT) $(IRIX_53_ROOT)/usr/ build/src/libultra/%: CFLAGS := $(CFLAGS) -Wab,-r4300_mul build/src/boot_O1/%: OPTIMIZATION := -O1 build/src/boot_O2_g3/%: OPTIMIZATION := -O2 -g3 -#test.txt: OPTIMIZATION := -O2 -#test.txt: CC := $(QEMU_IRIX) -L $(IRIX_53_ROOT) $(IRIX_53_ROOT)/usr/bin/cc +build/src/code/%: CFLAGS := $(CFLAGS) -Wab,-r4300_mul +test.txt: OPTIMIZATION := -O2 -g3 +test.txt: CC := $(QEMU_IRIX) -L $(IRIX_71_ROOT) $(IRIX_71_ROOT)/usr/bin/cc test.txt: CFLAGS := $(CFLAGS) -Wab,-r4300_mul CC := $(QEMU_IRIX) -L $(IRIX_71_ROOT) $(IRIX_71_ROOT)/usr/bin/cc test.txt: CC := python3 preprocess.py $(CC) -- $(AS) $(ASFLAGS) -- build/src/boot_O2_g3/%: CC := python3 preprocess.py $(CC) -- $(AS) $(ASFLAGS) -- +build/src/code/%: CC := python3 preprocess.py $(CC) -- $(AS) $(ASFLAGS) -- BASEROM_FILES := $(wildcard baserom/*) BASEROM_O_FILES := $(BASEROM_FILES:baserom/%=build/baserom/%.o) diff --git a/codescript.txt b/codescript.txt index ab711a821d..9195a11396 100644 --- a/codescript.txt +++ b/codescript.txt @@ -221,7 +221,7 @@ SECTIONS build/asm/code_0x800F42A0.o(.text) build/asm/code_0x800F4F40.o(.text) build/asm/code_0x800F5090.o(.text) - build/asm/code_0x800FEC90.o(.text) + build/src/code/code_0x800FEC90.o(.text) build/asm/code_0x801005C0.o(.text) build/asm/code_0x80102C60.o(.text) build/asm/code_0x80102E40.o(.text) diff --git a/functions.py b/functions.py index 446b2fe719..6a17b2b81c 100644 --- a/functions.py +++ b/functions.py @@ -85,7 +85,7 @@ known_funcs = { 0x80089420:("__osCleanupThread","UNK_RET","UNK_ARGS"), 0x80089430:("__osDequeueThread","UNK_RET","OSThread**, OSThread*"), 0x80089470:("osDestroyThread","void","OSThread* t"), - 0x80089630:("_blkclr","UNK_RET","u8*, u32"), # multiple names? bzero/_bzero/blkclr/_blkclr + 0x80089630:("_blkclr","UNK_RET","void*, size_t"), # multiple names? bzero/_bzero/blkclr/_blkclr 0x80089AA0:("__osSiCreateAccessQueue","void","void"), 0x80089AF0:("__osSiGetAccess","void","void"), 0x80089B34:("__osSiRelAccess","void","void"), @@ -122,7 +122,7 @@ known_funcs = { 0x8008D2C0:("osGetCount","u32","void"), 0x8008D350:("func_8008D350","UNK_TYPE","void"), 0x8008D640:("osSetEventMesg","void","OSEvent e, OSMesgQueue* mq, OSMesg m"), - 0x8008D700:("sqrtf","UNK_RET","UNK_ARGS"), + 0x8008D700:("sqrtf","f32","f32"), 0x8008D730:("osContStartQuery","s32","OSMesgQueue* mq"), 0x8008D7AC:("osContGetQuery","void","OSContStatus* data"), 0x8008E050:("_Printf","int","void* (*pfn)(void*), void* arg, const unsigned char* fmt, va_list ap"), @@ -283,9 +283,10 @@ known_funcs = { 0x800FED44:("func_800FED44","f32","s16"), 0x800FED84:("func_800FED84","f32","s16"), 0x800FFADC:("func_800FFADC","void","z_Actor*, z_ActorCompInitEntry*"), # Compact Instance Initializer - 0x800FFCD8:("func_800FFCD8","UNK_RET","f32*, f32, f32, f32, f32"), - 0x800FFEBC:("func_800FFEBC","UNK_TYPE","s16*, s16, UNK_TYPE, UNK_TYPE, UNK_TYPE"), - 0x80100504:("func_80100504","UNK_TYPE","UNK_TYPE"), + 0x800FF8D4:("func_800FF8D4","f32","z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2"), + 0x800FFCD8:("func_800FFCD8","f32","f32*, f32, f32, f32, f32"), + 0x800FFEBC:("func_800FFEBC","s16","s16*, s16, s16, s16, s16"), + 0x80100504:("func_80100504","UNK_TYPE","u32"), 0x80112E80:("func_80112E80","UNK_RET","z_GlobalContext*, UNK_TYPE"), 0x80115908:("func_80115908","UNK_RET","z_GlobalContext*, UNK_TYPE"), 0x8012C28C:("func_8012C28C","UNK_RET","z_GraphicsContext*"), @@ -300,11 +301,15 @@ known_funcs = { 0x801660B8:("func_801660B8","u32*","z_GlobalContext*, u32*, UNK_TYPE"), 0x80174BF0:("func_80174BF0","UNK_RET","UNK_TYPE"), 0x801795C0:("func_801795C0","f32","f32"), + 0x8017A6D4:("func_8017A6D4","f32","z_Vector3D*"), + 0x80180100:("func_80180100","UNK_TYPE","f32, f32"), 0x8018039C:("func_8018039C","UNK_RET","f32, f32, f32, UNK_TYPE"), 0x80181A40:("func_80181A40","UNK_TYPE","z_GraphicsContext*"), 0x80183070:("func_80183070","void","void"), 0x8018349C:("func_8018349C","UNK_RET","UNK_TYPE, UNK_TYPE"), - 0x8019F0C8:("func_8019F0C8","UNK_RET","UNK_TYPE"), + 0x8019F0C8:("func_8019F0C8","UNK_RET","u16"), + 0x8019F128:("func_8019F128","UNK_RET","u16"), + 0x8019F1C0:("func_8019F1C0","UNK_RET","UNK_TYPE, u16"), 0x8019FAD8:("func_8019FAD8","UNK_RET","UNK_PTR, UNK_TYPE, f32"), # ovl_En_Test diff --git a/include/functions.h b/include/functions.h index ecabcbd4ad..755416b1c3 100644 --- a/include/functions.h +++ b/include/functions.h @@ -252,7 +252,7 @@ UNK_RET __osCleanupThread(UNK_ARGS); // func_80089420 UNK_RET __osDequeueThread(OSThread**, OSThread*); // func_80089430 void osDestroyThread(OSThread* t); // func_80089470 // UNK_RET func_80089580(UNK_ARGS); -UNK_RET _blkclr(u8*, u32); // func_80089630 +UNK_RET _blkclr(void*, size_t); // func_80089630 // UNK_RET func_800896D0(UNK_ARGS); // UNK_RET func_80089838(UNK_ARGS); // UNK_RET func_80089944(UNK_ARGS); @@ -319,7 +319,7 @@ u32 osGetCount(void); // func_8008D2C0 UNK_TYPE func_8008D350(void); // func_8008D350 // UNK_RET func_8008D470(UNK_ARGS); void osSetEventMesg(OSEvent e, OSMesgQueue* mq, OSMesg m); // func_8008D640 -UNK_RET sqrtf(UNK_ARGS); // func_8008D700 +f32 sqrtf(f32); // func_8008D700 // UNK_RET func_8008D710(UNK_ARGS); s32 osContStartQuery(OSMesgQueue* mq); // func_8008D730 void osContGetQuery(OSContStatus* data); // func_8008D7AC @@ -1016,13 +1016,13 @@ void func_800BE03C(z_GlobalContext*, UNK_TYPE); // func_800BE03C UNK_TYPE func_800C6024(UNK_TYPE); // func_800C6024 // UNK_RET func_800C6044(UNK_ARGS); // UNK_RET func_800C6098(UNK_ARGS); -UNK_TYPE func_800C6188(z_GlobalContext*, UNK_PTR, z_Actor*, UNK_TYPE); +UNK_TYPE func_800C6188(z_GlobalContext*, UNK_PTR, z_Actor*, UNK_TYPE); // func_800C6188 UNK_TYPE func_800C6248(UNK_TYPE, UNK_TYPE); // func_800C6248 // UNK_RET func_800C62BC(UNK_ARGS); // UNK_RET func_800C6314(UNK_ARGS); // UNK_RET func_800C636C(UNK_ARGS); // UNK_RET func_800C641C(UNK_ARGS); -UNK_RET func_800C64CC(z_GlobalContext*, UNK_PTR, UNK_TYPE); +UNK_RET func_800C64CC(z_GlobalContext*, UNK_PTR, UNK_TYPE); // func_800C64CC // UNK_RET func_800C6554(UNK_ARGS); // UNK_RET func_800C656C(UNK_ARGS); // UNK_RET func_800C6838(UNK_ARGS); @@ -1042,7 +1042,7 @@ UNK_RET func_800C64CC(z_GlobalContext*, UNK_PTR, UNK_TYPE); // UNK_RET func_800C921C(UNK_ARGS); // UNK_RET func_800C9380(UNK_ARGS); // UNK_RET func_800C94E0(UNK_ARGS); -UNK_RET func_800C9564(UNK_TYPE, UNK_PTR); +UNK_RET func_800C9564(UNK_TYPE, UNK_PTR); // func_800C9564 // UNK_RET func_800C9640(UNK_ARGS); // UNK_RET func_800C9694(UNK_ARGS); // UNK_RET func_800C9704(UNK_ARGS); @@ -1080,7 +1080,7 @@ UNK_RET func_800CAAD0(UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800CAAD0 UNK_RET func_800CAC0C(UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800CAC0C UNK_RET func_800CACA0(UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800CACA0 UNK_TYPE func_800CAD2C(UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800CAD2C -UNK_RET func_800CAE10(z_Actor*, UNK_TYPE); +UNK_RET func_800CAE10(z_Actor*, UNK_TYPE); // func_800CAE10 // UNK_RET func_800CAE34(UNK_ARGS); // UNK_RET func_800CAE7C(UNK_ARGS); UNK_RET func_800CAE88(UNK_TYPE); // func_800CAE88 @@ -1921,7 +1921,7 @@ f32 func_800FED84(s16); // func_800FED84 // UNK_RET func_800FF6C4(UNK_ARGS); // UNK_RET func_800FF6F8(UNK_ARGS); // UNK_RET func_800FF884(UNK_ARGS); -// UNK_RET func_800FF8D4(UNK_ARGS); +f32 func_800FF8D4(z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2); // func_800FF8D4 // UNK_RET func_800FF92C(UNK_ARGS); // UNK_RET func_800FF960(UNK_ARGS); // UNK_RET func_800FF9A4(UNK_ARGS); @@ -1940,10 +1940,10 @@ void func_800FFADC(z_Actor*, z_ActorCompInitEntry*); // func_800FFADC // UNK_RET func_800FFC50(UNK_ARGS); // UNK_RET func_800FFC7C(UNK_ARGS); // UNK_RET func_800FFCB4(UNK_ARGS); -UNK_RET func_800FFCD8(f32*, f32, f32, f32, f32); // func_800FFCD8 +f32 func_800FFCD8(f32*, f32, f32, f32, f32); // func_800FFCD8 // UNK_RET func_800FFDF8(UNK_ARGS); // UNK_RET func_800FFE68(UNK_ARGS); -UNK_TYPE func_800FFEBC(s16*, s16, UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800FFEBC +s16 func_800FFEBC(s16*, s16, s16, s16, s16); // func_800FFEBC // UNK_RET func_800FFFD8(UNK_ARGS); // UNK_RET func_80100009(UNK_ARGS); // UNK_RET func_80100030(UNK_ARGS); @@ -1954,7 +1954,7 @@ UNK_TYPE func_800FFEBC(s16*, s16, UNK_TYPE, UNK_TYPE, UNK_TYPE); // func_800FFEB // UNK_RET func_8010011C(UNK_ARGS); // UNK_RET func_801001B8(UNK_ARGS); // UNK_RET func_80100448(UNK_ARGS); -UNK_TYPE func_80100504(UNK_TYPE); // func_80100504 +UNK_TYPE func_80100504(u32); // func_80100504 // UNK_RET func_80100584(UNK_ARGS); // UNK_RET func_801005A0(UNK_ARGS); // UNK_RET func_801005C0(UNK_ARGS); @@ -3466,7 +3466,7 @@ f32 func_801795C0(f32); // func_801795C0 // UNK_RET func_8017A634(UNK_ARGS); // UNK_RET func_8017A678(UNK_ARGS); // UNK_RET func_8017A6A8(UNK_ARGS); -// UNK_RET func_8017A6D4(UNK_ARGS); +f32 func_8017A6D4(z_Vector3D*); // func_8017A6D4 // UNK_RET func_8017A6F8(UNK_ARGS); // UNK_RET func_8017A720(UNK_ARGS); // UNK_RET func_8017A740(UNK_ARGS); @@ -3530,7 +3530,7 @@ f32 func_801795C0(f32); // func_801795C0 // UNK_RET func_8017FEB0(UNK_ARGS); // UNK_RET func_8017FEE4(UNK_ARGS); // UNK_RET func_801800CC(UNK_ARGS); -// UNK_RET func_80180100(UNK_ARGS); +UNK_TYPE func_80180100(f32, f32); // func_80180100 // UNK_RET func_8018012C(UNK_ARGS); // UNK_RET func_80180160(UNK_ARGS); // UNK_RET func_8018019C(UNK_ARGS); @@ -4203,10 +4203,10 @@ UNK_RET func_8018349C(UNK_TYPE, UNK_TYPE); // func_8018349C // UNK_RET func_8019EE88(UNK_ARGS); // UNK_RET func_8019F024(UNK_ARGS); // UNK_RET func_8019F05C(UNK_ARGS); -UNK_RET func_8019F0C8(UNK_TYPE); // func_8019F0C8 -// UNK_RET func_8019F128(UNK_ARGS); +UNK_RET func_8019F0C8(u16); // func_8019F0C8 +UNK_RET func_8019F128(u16); // func_8019F128 // UNK_RET func_8019F170(UNK_ARGS); -// UNK_RET func_8019F1C0(UNK_ARGS); +UNK_RET func_8019F1C0(UNK_TYPE, u16); // func_8019F1C0 // UNK_RET func_8019F208(UNK_ARGS); // UNK_RET func_8019F230(UNK_ARGS); // UNK_RET func_8019F258(UNK_ARGS); @@ -4219,7 +4219,7 @@ UNK_RET func_8019F0C8(UNK_TYPE); // func_8019F0C8 // UNK_RET func_8019F88C(UNK_ARGS); // UNK_RET func_8019F900(UNK_ARGS); // UNK_RET func_8019FA18(UNK_ARGS); -UNK_RET func_8019FAD8(UNK_PTR, UNK_TYPE, f32); +UNK_RET func_8019FAD8(UNK_PTR, UNK_TYPE, f32); // func_8019FAD8 // UNK_RET func_8019FB0C(UNK_ARGS); // UNK_RET func_8019FC20(UNK_ARGS); // UNK_RET func_8019FCB8(UNK_ARGS); diff --git a/include/structs.h b/include/structs.h index 6e2d1383bc..9bdb672cff 100644 --- a/include/structs.h +++ b/include/structs.h @@ -111,6 +111,14 @@ typedef struct { /* 0x8 */ f32 z; } z_Vector3D; +// Rotation? +// 3D Vector of s16? +typedef struct { + /* 0x0 */ s16 x; + /* 0x2 */ s16 y; + /* 0x4 */ s16 z; +} z_Vector3Ds16; + struct z_Actor; typedef void(*z_ActorFunc)(struct z_Actor*, void*); @@ -183,7 +191,7 @@ typedef struct { u32 cont : 1; u32 type : 4; u32 offset : 11; - u32 value : 16; + s32 value : 16; } z_ActorCompInitEntry; typedef struct { diff --git a/include/variables.h b/include/variables.h index b92e5178d6..885d812887 100644 --- a/include/variables.h +++ b/include/variables.h @@ -698,7 +698,7 @@ extern UNK_TYPE D_00C7A4E0; // D_00C7A4E0 //extern UNK_TYPE D_060005C0; //extern UNK_TYPE D_060005C4; //extern UNK_TYPE D_060005C8; -extern UNK_TYPE D_060005D0; +extern UNK_TYPE D_060005D0; // D_060005D0 //extern UNK_TYPE D_060005D4; //extern UNK_TYPE D_060005F8; //extern UNK_TYPE D_060005FC; @@ -1058,7 +1058,7 @@ extern UNK_TYPE D_06001228; // D_06001228 //extern UNK_TYPE D_06002CD0; //extern UNK_TYPE D_06002CE0; //extern UNK_TYPE D_06002D28; -extern UNK_TYPE D_06002D30; +extern UNK_TYPE D_06002D30; // D_06002D30 //extern UNK_TYPE D_06002D84; //extern UNK_TYPE D_06002DD4; //extern UNK_TYPE D_06002DE8; @@ -3140,7 +3140,7 @@ extern u8 D_801C207E; // D_801C207E //extern UNK_TYPE D_801D14F0; //extern UNK_TYPE D_801D1500; //extern UNK_TYPE D_801D1504; -//extern UNK_TYPE D_801D1508; +extern f32 D_801D1508; // D_801D1508 //extern UNK_TYPE D_801D150C; //extern UNK_TYPE D_801D1510; //extern UNK_TYPE D_801D1514; @@ -3864,8 +3864,8 @@ extern UNK_TYPE D_801DCBFC; // D_801DCBFC //extern UNK_TYPE D_801DD9FC; //extern UNK_TYPE D_801DDA00; //extern UNK_TYPE D_801DDA7C; -//extern UNK_TYPE D_801DDA80; -//extern UNK_TYPE D_801DDA84; +extern f32 D_801DDA80; // D_801DDA80 +extern f32 D_801DDA84; // D_801DDA84 //extern UNK_TYPE D_801DDA90; //extern UNK_TYPE D_801DDA94; //extern UNK_TYPE D_801DDA98; @@ -4887,7 +4887,7 @@ extern u8 D_801EF677; // D_801EF677 //extern UNK_TYPE D_801F8154; //extern UNK_TYPE D_801F8160; //extern UNK_TYPE D_801F8178; -//extern UNK_TYPE D_801F8180; +extern UNK_TYPE D_801F8180[]; // D_801F8180 //extern UNK_TYPE D_801F8188; //extern UNK_TYPE D_801F818C; //extern UNK_TYPE D_801F8190; @@ -11194,7 +11194,7 @@ extern f32 D_808637D0; // D_808637D0 //extern UNK_TYPE D_80ACA9F0; //extern UNK_TYPE D_80ACB140; //extern UNK_TYPE D_80ACB3B0; -extern f32 D_80ACB650; +extern f32 D_80ACB650; // D_80ACB650 //extern UNK_TYPE D_80ACC2C0; //extern UNK_TYPE D_80ACC2EC; //extern UNK_TYPE D_80ACC308; @@ -14311,5 +14311,6 @@ extern UNK_PTR D_800980D0_; extern UNK_TYPE D_80099AD0_; extern UNK_TYPE D_8009A670_; extern UNK_TYPE D_8009B140_; +extern (*D_801BE960[12])(u8*, z_ActorCompInitEntry*); #endif diff --git a/src/code/code_0x800FEC90.c b/src/code/code_0x800FEC90.c new file mode 100644 index 0000000000..a8527c5888 --- /dev/null +++ b/src/code/code_0x800FEC90.c @@ -0,0 +1,1323 @@ +#include +#include + +#pragma intrinsic (sqrtf) +extern float fabsf(float); +#pragma intrinsic (fabsf) + +void* func_800FEC90(void* dst, void* src, size_t n) { + _bcopy(src, dst, n); + + return dst; +} + +#ifdef NONMATCHING + +void* func_800FECC0(u8* a0, u32 a1, u32 a2) { + u8* v0; + + // XXX: realloc is messed up + if (a1 == 0) { + _blkclr((void*)a0, (u32)a2); + + return a0; + } + + for (v0 = a0; a2 != 0; a2--) { + *v0++ = a1; + } + + return a0; +} + +#else + +GLOBAL_ASM( +glabel func_800FECC0 +/* 091264 0x800FECC0 27BDFFE8 */ addiu $sp, $sp, -24 +/* 091265 0x800FECC4 AFBF0014 */ sw $ra, 0X14($sp) +/* 091266 0x800FECC8 AFA40018 */ sw $a0, 0X18($sp) +/* 091267 0x800FECCC 14A00006 */ bnez $a1, .L_800FECE8 +/* 091268 0x800FECD0 8FA20018 */ lw $v0, 0X18($sp) +/* 091269 0x800FECD4 8FA40018 */ lw $a0, 0X18($sp) +/* 091270 0x800FECD8 0C02258C */ jal _blkclr +/* 091271 0x800FECDC 00C02825 */ move $a1, $a2 +/* 091272 0x800FECE0 10000014 */ b .L_800FED34 +/* 091273 0x800FECE4 8FA20018 */ lw $v0, 0X18($sp) +.L_800FECE8: +/* 091274 0x800FECE8 18C00011 */ blez $a2, .L_800FED30 +/* 091275 0x800FECEC 00C01825 */ move $v1, $a2 +/* 091276 0x800FECF0 30C70003 */ andi $a3, $a2, 0X3 +/* 091277 0x800FECF4 00073823 */ negu $a3, $a3 +/* 091278 0x800FECF8 10E00006 */ beqz $a3, .L_800FED14 +/* 091279 0x800FECFC 00E62021 */ addu $a0, $a3, $a2 +.L_800FED00: +/* 091280 0x800FED00 2463FFFF */ addiu $v1, $v1, -1 +/* 091281 0x800FED04 A0450000 */ sb $a1, 0X0($v0) +/* 091282 0x800FED08 1483FFFD */ bne $a0, $v1, .L_800FED00 +/* 091283 0x800FED0C 24420001 */ addiu $v0, $v0, 1 +/* 091284 0x800FED10 10600007 */ beqz $v1, .L_800FED30 +.L_800FED14: +/* 091285 0x800FED14 2463FFFC */ addiu $v1, $v1, -4 +/* 091286 0x800FED18 A0450001 */ sb $a1, 0X1($v0) +/* 091287 0x800FED1C A0450002 */ sb $a1, 0X2($v0) +/* 091288 0x800FED20 A0450003 */ sb $a1, 0X3($v0) +/* 091289 0x800FED24 24420004 */ addiu $v0, $v0, 4 +/* 091290 0x800FED28 1460FFFA */ bnez $v1, .L_800FED14 +/* 091291 0x800FED2C A045FFFC */ sb $a1, -0X4($v0) +.L_800FED30: +/* 091292 0x800FED30 8FA20018 */ lw $v0, 0X18($sp) +.L_800FED34: +/* 091293 0x800FED34 8FBF0014 */ lw $ra, 0X14($sp) +/* 091294 0x800FED38 27BD0018 */ addiu $sp, $sp, 24 +/* 091295 0x800FED3C 03E00008 */ jr $ra +/* 091296 0x800FED40 00000000 */ nop +) + +#endif + +f32 func_800FED44(s16 a0) { + return coss(a0) * D_801DDA80; +} + +f32 func_800FED84(s16 a0) { + return sins(a0) * D_801DDA84; +} + +s32 func_800FEDC4(s32 a0, s32 a1, s32 a2) { + s32 v1; + + if (a1 >= a0) { + v1 = a0 + a2; + if (a1 >= v1) { + return v1; + } + } else { + v1 = a0 - a2; + if (v1 >= a1) { + return v1; + } + } + return a1; +} + +UNK_RET func_800FEE08(u32* a0, u32 a1, u32 a2) { + *a0 = func_800FEDC4(*a0, a1, a2); +} + +UNK_TYPE func_800FEE34(u32* a0, u32 a1, u32 a2) { + func_800FEE08(a0, a1, a2); + + return a1 == *a0; +} + +UNK_TYPE func_800FEE70(s16* a0, s16 a1, s16 a2) { + f32 f0; + + if (a2 != 0) { + f0 = D_801D1508; + + if ((s16)(*a0 - a1) > 0) { + a2 = -a2; + } + + *a0 += (s16)(a2 * f0); + + if (((s16)(*a0 - a1) * a2) >= 0) { + *a0 = a1; + + return 1; + } + } else if (a1 == *a0) { + return 1; + } + + return 0; +} + +UNK_TYPE func_800FEF2C(s16* a0, s16 a1, s16 a2) { + if (a2 != 0) { + if (a1 < *a0) { + a2 = -a2; + } + + *a0 += a2; + + if (((*a0 - a1) * a2) >= 0) { + *a0 = a1; + + return 1; + } + } else if (a1 == *a0) { + return 1; + } + + return 0; +} + +UNK_TYPE func_800FEFB4(s8* a0, s8 a1, s8 a2) { + if (a2 != 0) { + if (a1 < *a0) { + a2 = -a2; + } + + *a0 += a2; + + if (((*a0 - a1) * a2) >= 0) { + *a0 = a1; + + return 1; + } + } else if (a1 == *a0) { + return 1; + } + + return 0; +} + +#ifdef NONMATCHING + +UNK_TYPE func_800FF03C(f32* a0, f32 a1, f32 a2) { + if (a2 != 0) { + // XXX: regalloc is messed up + if (a1 < *a0) { + a2 = -a2; + } + + *a0 += a2; + + if (((*a0 - a1) * a2) >= 0) { + *a0 = a1; + + return 1; + } + } else if (a1 != *a0) { + return 1; + } + + return 0; +} + +#else + +GLOBAL_ASM( +glabel func_800FF03C +/* 091487 0x800FF03C 44857000 */ mtc1 $a1, $f14 +/* 091488 0x800FF040 44866000 */ mtc1 $a2, $f12 +/* 091489 0x800FF044 44802000 */ mtc1 $zero, $f4 +/* 091490 0x800FF048 00000000 */ nop +/* 091491 0x800FF04C 46046032 */ c.eq.s $f12, $f4 +/* 091492 0x800FF050 00000000 */ nop +/* 091493 0x800FF054 45030015 */ bc1tl .L_800FF0AC +/* 091494 0x800FF058 C4840000 */ lwc1 $f4, 0X0($a0) +/* 091495 0x800FF05C C4800000 */ lwc1 $f0, 0X0($a0) +/* 091496 0x800FF060 24020001 */ li $v0, 1 +/* 091497 0x800FF064 4600703C */ c.lt.s $f14, $f0 +/* 091498 0x800FF068 00000000 */ nop +/* 091499 0x800FF06C 45020003 */ bc1fl .L_800FF07C +/* 091500 0x800FF070 460C0180 */ add.s $f6, $f0, $f12 +/* 091501 0x800FF074 46006307 */ neg.s $f12, $f12 +/* 091502 0x800FF078 460C0180 */ add.s $f6, $f0, $f12 +.L_800FF07C: +/* 091503 0x800FF07C 44809000 */ mtc1 $zero, $f18 +/* 091504 0x800FF080 E4860000 */ swc1 $f6, 0X0($a0) +/* 091505 0x800FF084 C4880000 */ lwc1 $f8, 0X0($a0) +/* 091506 0x800FF088 460E4281 */ sub.s $f10, $f8, $f14 +/* 091507 0x800FF08C 460C5402 */ mul.s $f16, $f10, $f12 +/* 091508 0x800FF090 4610903E */ c.le.s $f18, $f16 +/* 091509 0x800FF094 00000000 */ nop +/* 091510 0x800FF098 4502000B */ bc1fl .L_800FF0C8 +/* 091511 0x800FF09C 00001025 */ move $v0, $zero +/* 091512 0x800FF0A0 03E00008 */ jr $ra +/* 091513 0x800FF0A4 E48E0000 */ swc1 $f14, 0X0($a0) +/* 091514 0x800FF0A8 C4840000 */ lwc1 $f4, 0X0($a0) +.L_800FF0AC: +/* 091515 0x800FF0AC 46047032 */ c.eq.s $f14, $f4 +/* 091516 0x800FF0B0 00000000 */ nop +/* 091517 0x800FF0B4 45020004 */ bc1fl .L_800FF0C8 +/* 091518 0x800FF0B8 00001025 */ move $v0, $zero +/* 091519 0x800FF0BC 03E00008 */ jr $ra +/* 091520 0x800FF0C0 24020001 */ li $v0, 1 +/* 091521 0x800FF0C4 00001025 */ move $v0, $zero +.L_800FF0C8: +/* 091522 0x800FF0C8 03E00008 */ jr $ra +/* 091523 0x800FF0CC 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_TYPE func_800FF0D0(s16* a0, s16 a1, s16 a2) { + s32 v0 = *a0; + + // XXX: regalloc is messed up + *a0 += a2; + + if (((*a0 - a1) * (v0 - a1)) <= 0) { + *a0 = a1; + + return 1; + } + + return 0; +} + +#else + +GLOBAL_ASM( +glabel func_800FF0D0 +/* 091524 0x800FF0D0 AFA50004 */ sw $a1, 0X4($sp) +/* 091525 0x800FF0D4 AFA60008 */ sw $a2, 0X8($sp) +/* 091526 0x800FF0D8 00063400 */ sll $a2, $a2, 16 +/* 091527 0x800FF0DC 00052C00 */ sll $a1, $a1, 16 +/* 091528 0x800FF0E0 00052C03 */ sra $a1, $a1, 16 +/* 091529 0x800FF0E4 00063403 */ sra $a2, $a2, 16 +/* 091530 0x800FF0E8 84820000 */ lh $v0, 0X0($a0) +/* 091531 0x800FF0EC 00467021 */ addu $t6, $v0, $a2 +/* 091532 0x800FF0F0 A48E0000 */ sh $t6, 0X0($a0) +/* 091533 0x800FF0F4 848F0000 */ lh $t7, 0X0($a0) +/* 091534 0x800FF0F8 00454823 */ subu $t1, $v0, $a1 +/* 091535 0x800FF0FC 00095400 */ sll $t2, $t1, 16 +/* 091536 0x800FF100 01E5C023 */ subu $t8, $t7, $a1 +/* 091537 0x800FF104 0018CC00 */ sll $t9, $t8, 16 +/* 091538 0x800FF108 00194403 */ sra $t0, $t9, 16 +/* 091539 0x800FF10C 000A5C03 */ sra $t3, $t2, 16 +/* 091540 0x800FF110 010B0019 */ multu $t0, $t3 +/* 091541 0x800FF114 00001025 */ move $v0, $zero +/* 091542 0x800FF118 00006012 */ mflo $t4 +/* 091543 0x800FF11C 1D800004 */ bgtz $t4, .L_800FF130 +/* 091544 0x800FF120 00000000 */ nop +/* 091545 0x800FF124 A4850000 */ sh $a1, 0X0($a0) +/* 091546 0x800FF128 03E00008 */ jr $ra +/* 091547 0x800FF12C 24020001 */ li $v0, 1 +.L_800FF130: +/* 091548 0x800FF130 03E00008 */ jr $ra +/* 091549 0x800FF134 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_RET func_800FF138() { + +} + +#else + +GLOBAL_ASM( +glabel func_800FF138 +/* 091550 0x800FF138 AFA50004 */ sw $a1, 0X4($sp) +/* 091551 0x800FF13C AFA60008 */ sw $a2, 0X8($sp) +/* 091552 0x800FF140 00063400 */ sll $a2, $a2, 16 +/* 091553 0x800FF144 00052C00 */ sll $a1, $a1, 16 +/* 091554 0x800FF148 00052C03 */ sra $a1, $a1, 16 +/* 091555 0x800FF14C 00063403 */ sra $a2, $a2, 16 +/* 091556 0x800FF150 84830000 */ lh $v1, 0X0($a0) +/* 091557 0x800FF154 34018000 */ ori $at, $zero, 0X8000 +/* 091558 0x800FF158 3C0FFFFF */ lui $t7, 0xFFFF +/* 091559 0x800FF15C 00A31023 */ subu $v0, $a1, $v1 +/* 091560 0x800FF160 04410004 */ bgez $v0, .L_800FF174 +/* 091561 0x800FF164 0041082A */ slt $at, $v0, $at +/* 091562 0x800FF168 00063023 */ negu $a2, $a2 +/* 091563 0x800FF16C 00063400 */ sll $a2, $a2, 16 +/* 091564 0x800FF170 00063403 */ sra $a2, $a2, 16 +.L_800FF174: +/* 091565 0x800FF174 14200007 */ bnez $at, .L_800FF194 +/* 091566 0x800FF178 00027023 */ negu $t6, $v0 +/* 091567 0x800FF17C 00063023 */ negu $a2, $a2 +/* 091568 0x800FF180 00063400 */ sll $a2, $a2, 16 +/* 091569 0x800FF184 35EF0001 */ ori $t7, $t7, 0X1 +/* 091570 0x800FF188 00063403 */ sra $a2, $a2, 16 +/* 091571 0x800FF18C 10000009 */ b .L_800FF1B4 +/* 091572 0x800FF190 01EE1023 */ subu $v0, $t7, $t6 +.L_800FF194: +/* 091573 0x800FF194 28418001 */ slti $at, $v0, -32767 +/* 091574 0x800FF198 10200006 */ beqz $at, .L_800FF1B4 +/* 091575 0x800FF19C 00000000 */ nop +/* 091576 0x800FF1A0 00063023 */ negu $a2, $a2 +/* 091577 0x800FF1A4 3401FFFF */ ori $at, $zero, 0XFFFF +/* 091578 0x800FF1A8 00063400 */ sll $a2, $a2, 16 +/* 091579 0x800FF1AC 00411021 */ addu $v0, $v0, $at +/* 091580 0x800FF1B0 00063403 */ sra $a2, $a2, 16 +.L_800FF1B4: +/* 091581 0x800FF1B4 10C0000A */ beqz $a2, .L_800FF1E0 +/* 091582 0x800FF1B8 00000000 */ nop +/* 091583 0x800FF1BC 00C20019 */ multu $a2, $v0 +/* 091584 0x800FF1C0 0066C021 */ addu $t8, $v1, $a2 +/* 091585 0x800FF1C4 A4980000 */ sh $t8, 0X0($a0) +/* 091586 0x800FF1C8 24020001 */ li $v0, 1 +/* 091587 0x800FF1CC 0000C812 */ mflo $t9 +/* 091588 0x800FF1D0 5F200008 */ bgtzl $t9, .L_800FF1F4 +/* 091589 0x800FF1D4 00001025 */ move $v0, $zero +/* 091590 0x800FF1D8 03E00008 */ jr $ra +/* 091591 0x800FF1DC A4850000 */ sh $a1, 0X0($a0) +.L_800FF1E0: +/* 091592 0x800FF1E0 54A30004 */ bnel $a1, $v1, .L_800FF1F4 +/* 091593 0x800FF1E4 00001025 */ move $v0, $zero +/* 091594 0x800FF1E8 03E00008 */ jr $ra +/* 091595 0x800FF1EC 24020001 */ li $v0, 1 +/* 091596 0x800FF1F0 00001025 */ move $v0, $zero +.L_800FF1F4: +/* 091597 0x800FF1F4 03E00008 */ jr $ra +/* 091598 0x800FF1F8 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_RET func_800FF1FC() { + +} + +#else + +GLOBAL_ASM( +glabel func_800FF1FC +/* 091599 0x800FF1FC AFA50004 */ sw $a1, 0X4($sp) +/* 091600 0x800FF200 AFA60008 */ sw $a2, 0X8($sp) +/* 091601 0x800FF204 AFA7000C */ sw $a3, 0XC($sp) +/* 091602 0x800FF208 00073C00 */ sll $a3, $a3, 16 +/* 091603 0x800FF20C 00063400 */ sll $a2, $a2, 16 +/* 091604 0x800FF210 00052C00 */ sll $a1, $a1, 16 +/* 091605 0x800FF214 00052C03 */ sra $a1, $a1, 16 +/* 091606 0x800FF218 00063403 */ sra $a2, $a2, 16 +/* 091607 0x800FF21C 00073C03 */ sra $a3, $a3, 16 +/* 091608 0x800FF220 84820000 */ lh $v0, 0X0($a0) +/* 091609 0x800FF224 00071C00 */ sll $v1, $a3, 16 +/* 091610 0x800FF228 00031C03 */ sra $v1, $v1, 16 +/* 091611 0x800FF22C 00A27023 */ subu $t6, $a1, $v0 +/* 091612 0x800FF230 05C00004 */ bltz $t6, .L_800FF244 +/* 091613 0x800FF234 00A2082A */ slt $at, $a1, $v0 +/* 091614 0x800FF238 00061C00 */ sll $v1, $a2, 16 +/* 091615 0x800FF23C 10000001 */ b .L_800FF244 +/* 091616 0x800FF240 00031C03 */ sra $v1, $v1, 16 +.L_800FF244: +/* 091617 0x800FF244 10600011 */ beqz $v1, .L_800FF28C +/* 091618 0x800FF248 00000000 */ nop +/* 091619 0x800FF24C 50200005 */ beqzl $at, .L_800FF264 +/* 091620 0x800FF250 00437821 */ addu $t7, $v0, $v1 +/* 091621 0x800FF254 00031823 */ negu $v1, $v1 +/* 091622 0x800FF258 00031C00 */ sll $v1, $v1, 16 +/* 091623 0x800FF25C 00031C03 */ sra $v1, $v1, 16 +/* 091624 0x800FF260 00437821 */ addu $t7, $v0, $v1 +.L_800FF264: +/* 091625 0x800FF264 A48F0000 */ sh $t7, 0X0($a0) +/* 091626 0x800FF268 84980000 */ lh $t8, 0X0($a0) +/* 091627 0x800FF26C 24020001 */ li $v0, 1 +/* 091628 0x800FF270 0305C823 */ subu $t9, $t8, $a1 +/* 091629 0x800FF274 03230019 */ multu $t9, $v1 +/* 091630 0x800FF278 00004012 */ mflo $t0 +/* 091631 0x800FF27C 05020008 */ bltzl $t0, .L_800FF2A0 +/* 091632 0x800FF280 00001025 */ move $v0, $zero +/* 091633 0x800FF284 03E00008 */ jr $ra +/* 091634 0x800FF288 A4850000 */ sh $a1, 0X0($a0) +.L_800FF28C: +/* 091635 0x800FF28C 54A20004 */ bnel $a1, $v0, .L_800FF2A0 +/* 091636 0x800FF290 00001025 */ move $v0, $zero +/* 091637 0x800FF294 03E00008 */ jr $ra +/* 091638 0x800FF298 24020001 */ li $v0, 1 +/* 091639 0x800FF29C 00001025 */ move $v0, $zero +.L_800FF2A0: +/* 091640 0x800FF2A0 03E00008 */ jr $ra +/* 091641 0x800FF2A4 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_RET func_800FF2A8() { + +} + +#else + +GLOBAL_ASM( +glabel func_800FF2A8 +/* 091642 0x800FF2A8 44857000 */ mtc1 $a1, $f14 +/* 091643 0x800FF2AC 44866000 */ mtc1 $a2, $f12 +/* 091644 0x800FF2B0 00001025 */ move $v0, $zero +/* 091645 0x800FF2B4 C4820000 */ lwc1 $f2, 0X0($a0) +/* 091646 0x800FF2B8 44803000 */ mtc1 $zero, $f6 +/* 091647 0x800FF2BC 460C1100 */ add.s $f4, $f2, $f12 +/* 091648 0x800FF2C0 460E1401 */ sub.s $f16, $f2, $f14 +/* 091649 0x800FF2C4 E4840000 */ swc1 $f4, 0X0($a0) +/* 091650 0x800FF2C8 C4880000 */ lwc1 $f8, 0X0($a0) +/* 091651 0x800FF2CC 460E4281 */ sub.s $f10, $f8, $f14 +/* 091652 0x800FF2D0 46105482 */ mul.s $f18, $f10, $f16 +/* 091653 0x800FF2D4 4606903E */ c.le.s $f18, $f6 +/* 091654 0x800FF2D8 00000000 */ nop +/* 091655 0x800FF2DC 45000004 */ bc1f .L_800FF2F0 +/* 091656 0x800FF2E0 00000000 */ nop +/* 091657 0x800FF2E4 E48E0000 */ swc1 $f14, 0X0($a0) +/* 091658 0x800FF2E8 03E00008 */ jr $ra +/* 091659 0x800FF2EC 24020001 */ li $v0, 1 +.L_800FF2F0: +/* 091660 0x800FF2F0 03E00008 */ jr $ra +/* 091661 0x800FF2F4 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_RET func_800FF2F8() { + +} + +#else + +GLOBAL_ASM( +glabel func_800FF2F8 +/* 091662 0x800FF2F8 44856000 */ mtc1 $a1, $f12 +/* 091663 0x800FF2FC 44867000 */ mtc1 $a2, $f14 +/* 091664 0x800FF300 AFA7000C */ sw $a3, 0XC($sp) +/* 091665 0x800FF304 C4800000 */ lwc1 $f0, 0X0($a0) +/* 091666 0x800FF308 C7A2000C */ lwc1 $f2, 0XC($sp) +/* 091667 0x800FF30C 460C003E */ c.le.s $f0, $f12 +/* 091668 0x800FF310 00000000 */ nop +/* 091669 0x800FF314 45000003 */ bc1f .L_800FF324 +/* 091670 0x800FF318 00000000 */ nop +/* 091671 0x800FF31C 10000001 */ b .L_800FF324 +/* 091672 0x800FF320 46007086 */ mov.s $f2, $f14 +.L_800FF324: +/* 091673 0x800FF324 44807000 */ mtc1 $zero, $f14 +/* 091674 0x800FF328 00000000 */ nop +/* 091675 0x800FF32C 460E1032 */ c.eq.s $f2, $f14 +/* 091676 0x800FF330 00000000 */ nop +/* 091677 0x800FF334 45030012 */ bc1tl .L_800FF380 +/* 091678 0x800FF338 46006032 */ c.eq.s $f12, $f0 +/* 091679 0x800FF33C 4600603C */ c.lt.s $f12, $f0 +/* 091680 0x800FF340 24020001 */ li $v0, 1 +/* 091681 0x800FF344 45020003 */ bc1fl .L_800FF354 +/* 091682 0x800FF348 46020100 */ add.s $f4, $f0, $f2 +/* 091683 0x800FF34C 46001087 */ neg.s $f2, $f2 +/* 091684 0x800FF350 46020100 */ add.s $f4, $f0, $f2 +.L_800FF354: +/* 091685 0x800FF354 E4840000 */ swc1 $f4, 0X0($a0) +/* 091686 0x800FF358 C4860000 */ lwc1 $f6, 0X0($a0) +/* 091687 0x800FF35C 460C3201 */ sub.s $f8, $f6, $f12 +/* 091688 0x800FF360 46024282 */ mul.s $f10, $f8, $f2 +/* 091689 0x800FF364 460A703E */ c.le.s $f14, $f10 +/* 091690 0x800FF368 00000000 */ nop +/* 091691 0x800FF36C 4502000A */ bc1fl .L_800FF398 +/* 091692 0x800FF370 00001025 */ move $v0, $zero +/* 091693 0x800FF374 03E00008 */ jr $ra +/* 091694 0x800FF378 E48C0000 */ swc1 $f12, 0X0($a0) +/* 091695 0x800FF37C 46006032 */ c.eq.s $f12, $f0 +.L_800FF380: +/* 091696 0x800FF380 00000000 */ nop +/* 091697 0x800FF384 45020004 */ bc1fl .L_800FF398 +/* 091698 0x800FF388 00001025 */ move $v0, $zero +/* 091699 0x800FF38C 03E00008 */ jr $ra +/* 091700 0x800FF390 24020001 */ li $v0, 1 +/* 091701 0x800FF394 00001025 */ move $v0, $zero +.L_800FF398: +/* 091702 0x800FF398 03E00008 */ jr $ra +/* 091703 0x800FF39C 00000000 */ nop +) + +#endif + +#ifdef NONMATCHING + +UNK_RET func_800FF3A0() { + +} + +#else + +GLOBAL_ASM( +glabel func_800FF3A0 +/* 091704 0x800FF3A0 3C014270 */ lui $at, 0x4270 +/* 091705 0x800FF3A4 27BDFFE8 */ addiu $sp, $sp, -24 +/* 091706 0x800FF3A8 44817000 */ mtc1 $at, $f14 +/* 091707 0x800FF3AC AFBF0014 */ sw $ra, 0X14($sp) +/* 091708 0x800FF3B0 80CE0014 */ lb $t6, 0X14($a2) +/* 091709 0x800FF3B4 80CF0015 */ lb $t7, 0X15($a2) +/* 091710 0x800FF3B8 44808000 */ mtc1 $zero, $f16 +/* 091711 0x800FF3BC 448E2000 */ mtc1 $t6, $f4 +/* 091712 0x800FF3C0 448F3000 */ mtc1 $t7, $f6 +/* 091713 0x800FF3C4 468020A0 */ cvt.s.w $f2, $f4 +/* 091714 0x800FF3C8 46803320 */ cvt.s.w $f12, $f6 +/* 091715 0x800FF3CC 46021202 */ mul.s $f8, $f2, $f2 +/* 091716 0x800FF3D0 00000000 */ nop +/* 091717 0x800FF3D4 460C6282 */ mul.s $f10, $f12, $f12 +/* 091718 0x800FF3D8 460A4000 */ add.s $f0, $f8, $f10 +/* 091719 0x800FF3DC 46000004 */ sqrt.s $f0, $f0 +/* 091720 0x800FF3E0 4600703C */ c.lt.s $f14, $f0 +/* 091721 0x800FF3E4 00000000 */ nop +/* 091722 0x800FF3E8 45000003 */ bc1f .L_800FF3F8 +/* 091723 0x800FF3EC 00000000 */ nop +/* 091724 0x800FF3F0 10000002 */ b .L_800FF3FC +/* 091725 0x800FF3F4 E48E0000 */ swc1 $f14, 0X0($a0) +.L_800FF3F8: +/* 091726 0x800FF3F8 E4800000 */ swc1 $f0, 0X0($a0) +.L_800FF3FC: +/* 091727 0x800FF3FC 4600803C */ c.lt.s $f16, $f0 +/* 091728 0x800FF400 00000000 */ nop +/* 091729 0x800FF404 4502000E */ bc1fl .L_800FF440 +/* 091730 0x800FF408 A4A00000 */ sh $zero, 0X0($a1) +/* 091731 0x800FF40C 80D80002 */ lb $t8, 0X2($a2) +/* 091732 0x800FF410 80D90003 */ lb $t9, 0X3($a2) +/* 091733 0x800FF414 AFA5001C */ sw $a1, 0X1C($sp) +/* 091734 0x800FF418 44989000 */ mtc1 $t8, $f18 +/* 091735 0x800FF41C 44992000 */ mtc1 $t9, $f4 +/* 091736 0x800FF420 468090A0 */ cvt.s.w $f2, $f18 +/* 091737 0x800FF424 46802320 */ cvt.s.w $f12, $f4 +/* 091738 0x800FF428 0C060040 */ jal func_80180100 +/* 091739 0x800FF42C 46001387 */ neg.s $f14, $f2 +/* 091740 0x800FF430 8FA5001C */ lw $a1, 0X1C($sp) +/* 091741 0x800FF434 10000002 */ b .L_800FF440 +/* 091742 0x800FF438 A4A20000 */ sh $v0, 0X0($a1) +/* 091743 0x800FF43C A4A00000 */ sh $zero, 0X0($a1) +.L_800FF440: +/* 091744 0x800FF440 8FBF0014 */ lw $ra, 0X14($sp) +/* 091745 0x800FF444 27BD0018 */ addiu $sp, $sp, 24 +/* 091746 0x800FF448 03E00008 */ jr $ra +/* 091747 0x800FF44C 00000000 */ nop +) + +#endif + +s16 func_800FF450(s16 a0, s16 a1) { + return (s16)(func_80086FDC() * a1) + a0; +} + +s16 func_800FF4A4(s16 a0, s16 a1, s16 a2) { + return (s16)(func_80086FDC() * a2) * a1 + a0; +} + +UNK_RET func_800FF50C(z_Vector3D* dst, z_Vector3D* src) { + f32 x = src->x; + f32 y = src->y; + f32 z = src->z; + + dst->x = x; + dst->y = y; + dst->z = z; +} + +UNK_RET func_800FF52C(z_Vector3Ds16* dst, z_Vector3Ds16* src) { + s16 x = src->x; + s16 y = src->y; + s16 z = src->z; + + dst->x = x; + dst->y = y; + dst->z = z; +} + +UNK_RET func_800FF54C(z_Vector3D* dst, z_Vector3Ds16* src) { + f32 x = src->x; + f32 y = src->y; + f32 z = src->z; + + dst->x = x; + dst->y = y; + dst->z = z; +} + +UNK_RET func_800FF584(z_Vector3Ds16* dst, z_Vector3D* src) { + f32 x = src->x; + f32 y = src->y; + f32 z = src->z; + + dst->x = x; + dst->y = y; + dst->z = z; +} + +UNK_RET func_800FF5BC(z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2) { + a2->x = a0->x + a1->x; + a2->y = a0->y + a1->y; + a2->z = a0->z + a1->z; +} + +UNK_RET func_800FF5F4(z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2) { + a2->x = a0->x - a1->x; + a2->y = a0->y - a1->y; + a2->z = a0->z - a1->z; +} + +UNK_RET func_800FF62C(z_Vector3D* a0, z_Vector3Ds16* a1, z_Vector3Ds16* a2) { + a0->x = a1->x - a2->x; + a0->y = a1->y - a2->y; + a0->z = a1->z - a2->z; +} + +UNK_RET func_800FF688(z_Vector3D* a0, f32 a1) { + a0->x *= a1; + a0->y *= a1; + a0->z *= a1; +} + +UNK_RET func_800FF6C4(z_Vector3D* a0, f32 a1, z_Vector3D* a2) { + a2->x = a0->x * a1; + a2->y = a0->y * a1; + a2->z = a0->z * a1; +} + +UNK_RET func_800FF6F8(z_Vector3D* a0, z_Vector3D* a1, f32 a2, z_Vector3D* a3) { + a3->x = (a1->x - a0->x) * a2 + a0->x; + a3->y = (a1->y - a0->y) * a2 + a0->y; + a3->z = (a1->z - a0->z) * a2 + a0->z; +} + +UNK_RET func_800FF750(z_Vector3D* a0, z_Vector3D* a1, f32 a2, z_Vector3D* a3) { + a3->x = a1->x * a2 + a0->x; + a3->y = a1->y * a2 + a0->y; + a3->z = a1->z * a2 + a0->z; +} + +UNK_RET func_800FF79C(z_Vector3D* a0, f32 a1, z_Vector3D* a2) { + a2->x = func_801795C0(a1) + a0->x; + a2->y = func_801795C0(a1) + a0->y; + a2->z = func_801795C0(a1) + a0->z; +} + +void func_800FF810(z_Vector3D* a0, z_Vector3D* a1, f32 a2, z_Vector3D* a3) { + f32 f0 = func_800FF8D4(a0, a1, a3); + f32 f2; + + if (f0 == 0) { + return; + } + + f2 = a2 / f0; + + a3->x *= f2; + a3->y *= f2; + a3->z *= f2; +} + +f32 func_800FF884(z_Vector3D* a0, z_Vector3D* a1) { + z_Vector3D sp1C; + func_800FF5F4(a1, a0, &sp1C); + return sqrtf((sp1C.x * sp1C.x) + (sp1C.y * sp1C.y) + (sp1C.z * sp1C.z)); +} + +f32 func_800FF8D4(z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2) { + func_800FF5F4(a1, a0, a2); + return sqrtf((a2->x * a2->x) + (a2->y * a2->y) + (a2->z * a2->z)); +} + +f32 func_800FF92C(z_Vector3D* a0, z_Vector3D* a1) { + f32 dx = a1->x - a0->x; + f32 dz = a1->z - a0->z; + return sqrtf((dx * dx) + (dz * dz)); +} + +f32 func_800FF960(z_Vector3D* a0, z_Vector3D* a1, f32* a2, f32* a3) { + *a2 = a1->x - a0->x; + *a3 = a1->z - a0->z; + return sqrtf((*a2 * *a2) + (*a3 * *a3)); +} + +#ifdef NONMATCHING + +UNK_RET func_800FF9A4(z_Vector3D* a0, z_Vector3D* a1, f32 a2) { + f32 sp24; + f32 sp20; + f32 f0 = func_800FF960(a1, a0, &sp24, &sp20); + f32 f2 = f0 - a2; + + if ((f0 >= a2) && (f2 != 0)) { + f2 /= f0; + } else { + f2 = 0; + } + + a0->x = a1->x + sp24 * f2; + a0->z = a1->z + sp20 * f2; +} + +#else + +GLOBAL_ASM( +glabel func_800FF9A4 +/* 092089 0x800FF9A4 27BDFFD8 */ addiu $sp, $sp, -40 +/* 092090 0x800FF9A8 AFA5002C */ sw $a1, 0X2C($sp) +/* 092091 0x800FF9AC 00802825 */ move $a1, $a0 +/* 092092 0x800FF9B0 AFBF0014 */ sw $ra, 0X14($sp) +/* 092093 0x800FF9B4 AFA40028 */ sw $a0, 0X28($sp) +/* 092094 0x800FF9B8 AFA60030 */ sw $a2, 0X30($sp) +/* 092095 0x800FF9BC 8FA4002C */ lw $a0, 0X2C($sp) +/* 092096 0x800FF9C0 27A60024 */ addiu $a2, $sp, 36 +/* 092097 0x800FF9C4 27A70020 */ addiu $a3, $sp, 32 +/* 092098 0x800FF9C8 0C03FE58 */ jal func_800FF960 +/* 092099 0x800FF9CC AFA50028 */ sw $a1, 0X28($sp) +/* 092100 0x800FF9D0 C7A20030 */ lwc1 $f2, 0X30($sp) +/* 092101 0x800FF9D4 44807000 */ mtc1 $zero, $f14 +/* 092102 0x800FF9D8 8FA2002C */ lw $v0, 0X2C($sp) +/* 092103 0x800FF9DC 4602003C */ c.lt.s $f0, $f2 +/* 092104 0x800FF9E0 8FA50028 */ lw $a1, 0X28($sp) +/* 092105 0x800FF9E4 C7A60024 */ lwc1 $f6, 0X24($sp) +/* 092106 0x800FF9E8 46020301 */ sub.s $f12, $f0, $f2 +/* 092107 0x800FF9EC 45020004 */ bc1fl .L_800FFA00 +/* 092108 0x800FF9F0 460E6032 */ c.eq.s $f12, $f14 +/* 092109 0x800FF9F4 44806000 */ mtc1 $zero, $f12 +/* 092110 0x800FF9F8 00000000 */ nop +/* 092111 0x800FF9FC 460E6032 */ c.eq.s $f12, $f14 +.L_800FFA00: +/* 092112 0x800FFA00 00000000 */ nop +/* 092113 0x800FFA04 45020004 */ bc1fl .L_800FFA18 +/* 092114 0x800FFA08 46006083 */ div.s $f2, $f12, $f0 +/* 092115 0x800FFA0C 10000002 */ b .L_800FFA18 +/* 092116 0x800FFA10 46007086 */ mov.s $f2, $f14 +/* 092117 0x800FFA14 46006083 */ div.s $f2, $f12, $f0 +.L_800FFA18: +/* 092118 0x800FFA18 46023202 */ mul.s $f8, $f6, $f2 +/* 092119 0x800FFA1C C4440000 */ lwc1 $f4, 0X0($v0) +/* 092120 0x800FFA20 46006006 */ mov.s $f0, $f12 +/* 092121 0x800FFA24 46082280 */ add.s $f10, $f4, $f8 +/* 092122 0x800FFA28 E4AA0000 */ swc1 $f10, 0X0($a1) +/* 092123 0x800FFA2C C7B20020 */ lwc1 $f18, 0X20($sp) +/* 092124 0x800FFA30 C4500008 */ lwc1 $f16, 0X8($v0) +/* 092125 0x800FFA34 46029182 */ mul.s $f6, $f18, $f2 +/* 092126 0x800FFA38 46068100 */ add.s $f4, $f16, $f6 +/* 092127 0x800FFA3C E4A40008 */ swc1 $f4, 0X8($a1) +/* 092128 0x800FFA40 8FBF0014 */ lw $ra, 0X14($sp) +/* 092129 0x800FFA44 03E00008 */ jr $ra +/* 092130 0x800FFA48 27BD0028 */ addiu $sp, $sp, 40 +) + +#endif + +f32 func_800FFA4C(z_Vector3D* a0, z_Vector3D* a1) { + return a1->y - a0->y; +} + +UNK_TYPE func_800FFA60(z_Vector3D* a0, z_Vector3D* a1) { + f32 f14 = a1->x - a0->x; + f32 f12 = a1->z - a0->z; + return func_80180100(f12, f14); +} + +UNK_TYPE func_800FFA94(z_Vector3D* a0, z_Vector3D* a1) { + return func_80180100(func_800FF92C(a0, a1), a0->y - a1->y); +} + +void func_800FFADC(z_Actor* a0, z_ActorCompInitEntry* a1) { + do { + D_801BE960[a1->type]((u8*)a0, a1); + } while ((a1++)->cont); +} + +UNK_RET func_800FFB54(u8* a0, z_ActorCompInitEntry* a1) { + *(u8*)(a0 + a1->offset) = (u8)(a1->value); +} + +UNK_RET func_800FFB70(u8* a0, z_ActorCompInitEntry* a1) { + *(u8*)(a0 + a1->offset) = (u8)(a1->value); +} + +UNK_RET func_800FFB8C(u8* a0, z_ActorCompInitEntry* a1) { + *(u16*)(a0 + a1->offset) = (u16)(a1->value); +} + +UNK_RET func_800FFBA8(u8* a0, z_ActorCompInitEntry* a1) { + *(u16*)(a0 + a1->offset) = (u16)(a1->value); +} + +UNK_RET func_800FFBC4(u8* a0, z_ActorCompInitEntry* a1) { + *(u32*)(a0 + a1->offset) = (u32)(a1->value); +} + +UNK_RET func_800FFBE0(u8* a0, z_ActorCompInitEntry* a1) { + *(u32*)(a0 + a1->offset) = (u32)(a1->value); +} + +UNK_RET func_800FFBFC(u8* a0, z_ActorCompInitEntry* a1) { + *(f32*)(a0 + a1->offset) = (f32)(a1->value); +} + +UNK_RET func_800FFC20(u8* a0, z_ActorCompInitEntry* a1) { + *(f32*)(a0 + a1->offset) = (f32)(a1->value) / 1000; +} + +UNK_RET func_800FFC50(u8* a0, z_ActorCompInitEntry* a1) { + z_Vector3D* v0 = (z_Vector3D*)(a0 + a1->offset); + f32 f0 = (f32)(a1->value); + + v0->z = f0; + v0->y = f0; + v0->x = f0; +} + +UNK_RET func_800FFC7C(u8* a0, z_ActorCompInitEntry* a1) { + z_Vector3D* v0 = (z_Vector3D*)(a0 + a1->offset); + f32 f0 = (f32)(a1->value) / 1000; + + v0->z = f0; + v0->y = f0; + v0->x = f0; +} + +UNK_RET func_800FFCB4(u8* a0, z_ActorCompInitEntry* a1) { + z_Vector3Ds16* v0 = (z_Vector3Ds16*)(a0 + a1->offset); + s16 v1 = (s16)(a1->value); + + v0->z = v1; + v0->y = v1; + v0->x = v1; +} + +f32 func_800FFCD8(f32* a0, f32 a1, f32 a2, f32 a3, f32 a4) { + f32 f0; + + if (*a0 != a1) { + f0 = (a1 - *a0) * a2; + + if ((f0 >= a4) || (f0 <= -a4)) { + if (f0 > a3) { + f0 = a3; + } + + if (f0 < -a3) { + f0 = -a3; + } + + *a0 += f0; + } else { + if (f0 > 0) { + if (f0 < a4) { + *a0 += a4; + + if (a1 < *a0) { + *a0 = a1; + } + } + } else { + if (-a4 < f0) { + *a0 += -a4; + + if (*a0 < a1) { + *a0 = a1; + } + } + } + } + } + + return fabsf(a1 - *a0); +} + +UNK_RET func_800FFDF8(f32* a0, f32 a1, f32 a2, f32 a3) { + f32 f2; + + if (*a0 != a1) { + f2 = (a1 - *a0) * a2; + + if (f2 > a3) { + f2 = a3; + } else if (f2 < -a3) { + f2 = -a3; + } + + *a0 += f2; + } +} + +void func_800FFE68(f32* a0, f32 a1, f32 a2) { + f32 f0 = *a0 * a1; + + if (a2 < f0) { + f0 = a2; + } else if (f0 < -a2) { + f0 = -a2; + } + + *a0 = *a0 - f0; +} + +#ifdef NONMATCHING + +s16 func_800FFEBC(s16* a0, s16 a1, s16 a2, s16 a3, s16 a4) { + +} + +#else + +GLOBAL_ASM( +glabel func_800FFEBC +/* 092415 0x800FFEBC AFA50004 */ sw $a1, 0X4($sp) +/* 092416 0x800FFEC0 AFA60008 */ sw $a2, 0X8($sp) +/* 092417 0x800FFEC4 00063400 */ sll $a2, $a2, 16 +/* 092418 0x800FFEC8 00052C00 */ sll $a1, $a1, 16 +/* 092419 0x800FFECC 00052C03 */ sra $a1, $a1, 16 +/* 092420 0x800FFED0 00063403 */ sra $a2, $a2, 16 +/* 092421 0x800FFED4 AFA7000C */ sw $a3, 0XC($sp) +/* 092422 0x800FFED8 84880000 */ lh $t0, 0X0($a0) +/* 092423 0x800FFEDC 87A90012 */ lh $t1, 0X12($sp) +/* 092424 0x800FFEE0 00A81823 */ subu $v1, $a1, $t0 +/* 092425 0x800FFEE4 00031C00 */ sll $v1, $v1, 16 +/* 092426 0x800FFEE8 10A80038 */ beq $a1, $t0, .L_800FFFCC +/* 092427 0x800FFEEC 00031C03 */ sra $v1, $v1, 16 +/* 092428 0x800FFEF0 0066001A */ div $zero, $v1, $a2 +/* 092429 0x800FFEF4 14C00002 */ bnez $a2, .L_800FFF00 +/* 092430 0x800FFEF8 00000000 */ nop +/* 092431 0x800FFEFC 0007000D */ break 0x00007 +.L_800FFF00: +/* 092432 0x800FFF00 2401FFFF */ li $at, -1 +/* 092433 0x800FFF04 14C10004 */ bne $a2, $at, .L_800FFF18 +/* 092434 0x800FFF08 3C018000 */ lui $at, 0x8000 +/* 092435 0x800FFF0C 14610002 */ bne $v1, $at, .L_800FFF18 +/* 092436 0x800FFF10 00000000 */ nop +/* 092437 0x800FFF14 0006000D */ break 0x00006 +.L_800FFF18: +/* 092438 0x800FFF18 00003812 */ mflo $a3 +/* 092439 0x800FFF1C 00075400 */ sll $t2, $a3, 16 +/* 092440 0x800FFF20 000A5403 */ sra $t2, $t2, 16 +/* 092441 0x800FFF24 00071400 */ sll $v0, $a3, 16 +/* 092442 0x800FFF28 012A082A */ slt $at, $t1, $t2 +/* 092443 0x800FFF2C 14200005 */ bnez $at, .L_800FFF44 +/* 092444 0x800FFF30 00021403 */ sra $v0, $v0, 16 +/* 092445 0x800FFF34 00097023 */ negu $t6, $t1 +/* 092446 0x800FFF38 014E082A */ slt $at, $t2, $t6 +/* 092447 0x800FFF3C 1020000F */ beqz $at, .L_800FFF7C +/* 092448 0x800FFF40 00000000 */ nop +.L_800FFF44: +/* 092449 0x800FFF44 87AF000E */ lh $t7, 0XE($sp) +/* 092450 0x800FFF48 87A5000E */ lh $a1, 0XE($sp) +/* 092451 0x800FFF4C 01EA082A */ slt $at, $t7, $t2 +/* 092452 0x800FFF50 10200002 */ beqz $at, .L_800FFF5C +/* 092453 0x800FFF54 00052823 */ negu $a1, $a1 +/* 092454 0x800FFF58 01E01025 */ move $v0, $t7 +.L_800FFF5C: +/* 092455 0x800FFF5C 0045082A */ slt $at, $v0, $a1 +/* 092456 0x800FFF60 50200004 */ beqzl $at, .L_800FFF74 +/* 092457 0x800FFF64 0102C021 */ addu $t8, $t0, $v0 +/* 092458 0x800FFF68 00051400 */ sll $v0, $a1, 16 +/* 092459 0x800FFF6C 00021403 */ sra $v0, $v0, 16 +/* 092460 0x800FFF70 0102C021 */ addu $t8, $t0, $v0 +.L_800FFF74: +/* 092461 0x800FFF74 10000015 */ b .L_800FFFCC +/* 092462 0x800FFF78 A4980000 */ sh $t8, 0X0($a0) +.L_800FFF7C: +/* 092463 0x800FFF7C 0460000B */ bltz $v1, .L_800FFFAC +/* 092464 0x800FFF80 01097823 */ subu $t7, $t0, $t1 +/* 092465 0x800FFF84 0109C821 */ addu $t9, $t0, $t1 +/* 092466 0x800FFF88 A4990000 */ sh $t9, 0X0($a0) +/* 092467 0x800FFF8C 848B0000 */ lh $t3, 0X0($a0) +/* 092468 0x800FFF90 00AB6023 */ subu $t4, $a1, $t3 +/* 092469 0x800FFF94 000C6C00 */ sll $t5, $t4, 16 +/* 092470 0x800FFF98 000D7403 */ sra $t6, $t5, 16 +/* 092471 0x800FFF9C 5DC0000C */ bgtzl $t6, .L_800FFFD0 +/* 092472 0x800FFFA0 00601025 */ move $v0, $v1 +/* 092473 0x800FFFA4 10000009 */ b .L_800FFFCC +/* 092474 0x800FFFA8 A4850000 */ sh $a1, 0X0($a0) +.L_800FFFAC: +/* 092475 0x800FFFAC A48F0000 */ sh $t7, 0X0($a0) +/* 092476 0x800FFFB0 84980000 */ lh $t8, 0X0($a0) +/* 092477 0x800FFFB4 00B8C823 */ subu $t9, $a1, $t8 +/* 092478 0x800FFFB8 00195C00 */ sll $t3, $t9, 16 +/* 092479 0x800FFFBC 000B6403 */ sra $t4, $t3, 16 +/* 092480 0x800FFFC0 05820003 */ bltzl $t4, .L_800FFFD0 +/* 092481 0x800FFFC4 00601025 */ move $v0, $v1 +/* 092482 0x800FFFC8 A4850000 */ sh $a1, 0X0($a0) +.L_800FFFCC: +/* 092483 0x800FFFCC 00601025 */ move $v0, $v1 +.L_800FFFD0: +/* 092484 0x800FFFD0 03E00008 */ jr $ra +/* 092485 0x800FFFD4 00000000 */ nop +) + +#endif + +void func_800FFFD8(s16* a0, s16 a1, s16 a2, s16 a3) { + s16 v0 = a1 - *a0; + v0 /= a2; + + if (v0 > a3) { + *a0 += a3; + return; + } + + if (v0 < -a3) { + *a0 -= a3; + return; + } + + *a0 += v0; +} + +UNK_RET func_8010007C(u8* a0, u8* a1) { + a0[0] = a1[0]; + a0[1] = a1[1]; + a0[2] = a1[2]; + a0[3] = a1[3]; +} + +UNK_RET func_801000A4(u16 a0) { + func_8019F0C8(a0); +} + +UNK_RET func_801000CC(u16 a0) { + func_8019F128(a0); +} + +UNK_RET func_801000F4(UNK_TYPE a0, u16 a1) { + func_8019F1C0(a0, a1); +} + +void func_8010011C(z_Vector3D* a0, s16 a1, z_Vector3D* a2, z_Vector3D* a3) { + f32 sp1C; + f32 f0; + + sp1C = func_800FED44(a1); + f0 = func_800FED84(a1); + a3->x = a0->x + (a2->x * sp1C + a2->z * f0); + a3->y = a0->y + a2->y; + a3->z = a0->z + (a2->z * sp1C - a2->x * f0); +} + +#ifdef NONMATCHING + +void func_801001B8(u8* a0, u8* a1, f32 a2, u8* a3) { + // XXX regalloc is slightly off + a3[0] = (f32)a0[0] + ((f32)a1[0] - (f32)a0[0]) * a2; + a3[1] = (f32)a0[1] + ((f32)a1[1] - (f32)a0[1]) * a2; + a3[2] = (f32)a0[2] + ((f32)a1[2] - (f32)a0[2]) * a2; +} + +#else + +GLOBAL_ASM( +glabel func_801001B8 +/* 092606 0x801001B8 44866000 */ mtc1 $a2, $f12 +/* 092607 0x801001BC 00000000 */ nop +/* 092608 0x801001C0 908E0000 */ lbu $t6, 0X0($a0) +/* 092609 0x801001C4 3C014F80 */ lui $at, 0x4F80 +/* 092610 0x801001C8 448E2000 */ mtc1 $t6, $f4 +/* 092611 0x801001CC 05C10004 */ bgez $t6, .L_801001E0 +/* 092612 0x801001D0 46802020 */ cvt.s.w $f0, $f4 +/* 092613 0x801001D4 44813000 */ mtc1 $at, $f6 +/* 092614 0x801001D8 00000000 */ nop +/* 092615 0x801001DC 46060000 */ add.s $f0, $f0, $f6 +.L_801001E0: +/* 092616 0x801001E0 90AF0000 */ lbu $t7, 0X0($a1) +/* 092617 0x801001E4 3C014F80 */ lui $at, 0x4F80 +/* 092618 0x801001E8 448F4000 */ mtc1 $t7, $f8 +/* 092619 0x801001EC 05E10004 */ bgez $t7, .L_80100200 +/* 092620 0x801001F0 468042A0 */ cvt.s.w $f10, $f8 +/* 092621 0x801001F4 44818000 */ mtc1 $at, $f16 +/* 092622 0x801001F8 00000000 */ nop +/* 092623 0x801001FC 46105280 */ add.s $f10, $f10, $f16 +.L_80100200: +/* 092624 0x80100200 46005481 */ sub.s $f18, $f10, $f0 +/* 092625 0x80100204 24190001 */ li $t9, 1 +/* 092626 0x80100208 3C014F00 */ lui $at, 0x4F00 +/* 092627 0x8010020C 460C9102 */ mul.s $f4, $f18, $f12 +/* 092628 0x80100210 46002180 */ add.s $f6, $f4, $f0 +/* 092629 0x80100214 4458F800 */ cfc1 $t8, $31 +/* 092630 0x80100218 44D9F800 */ ctc1 $t9, $31 +/* 092631 0x8010021C 00000000 */ nop +/* 092632 0x80100220 46003224 */ cvt.w.s $f8, $f6 +/* 092633 0x80100224 4459F800 */ cfc1 $t9, $31 +/* 092634 0x80100228 00000000 */ nop +/* 092635 0x8010022C 33390078 */ andi $t9, $t9, 0X78 +/* 092636 0x80100230 53200013 */ beqzl $t9, .L_80100280 +/* 092637 0x80100234 44194000 */ mfc1 $t9, $f8 +/* 092638 0x80100238 44814000 */ mtc1 $at, $f8 +/* 092639 0x8010023C 24190001 */ li $t9, 1 +/* 092640 0x80100240 46083201 */ sub.s $f8, $f6, $f8 +/* 092641 0x80100244 44D9F800 */ ctc1 $t9, $31 +/* 092642 0x80100248 00000000 */ nop +/* 092643 0x8010024C 46004224 */ cvt.w.s $f8, $f8 +/* 092644 0x80100250 4459F800 */ cfc1 $t9, $31 +/* 092645 0x80100254 00000000 */ nop +/* 092646 0x80100258 33390078 */ andi $t9, $t9, 0X78 +/* 092647 0x8010025C 17200005 */ bnez $t9, .L_80100274 +/* 092648 0x80100260 00000000 */ nop +/* 092649 0x80100264 44194000 */ mfc1 $t9, $f8 +/* 092650 0x80100268 3C018000 */ lui $at, 0x8000 +/* 092651 0x8010026C 10000007 */ b .L_8010028C +/* 092652 0x80100270 0321C825 */ or $t9, $t9, $at +.L_80100274: +/* 092653 0x80100274 10000005 */ b .L_8010028C +/* 092654 0x80100278 2419FFFF */ li $t9, -1 +/* 092655 0x8010027C 44194000 */ mfc1 $t9, $f8 +.L_80100280: +/* 092656 0x80100280 00000000 */ nop +/* 092657 0x80100284 0720FFFB */ bltz $t9, .L_80100274 +/* 092658 0x80100288 00000000 */ nop +.L_8010028C: +/* 092659 0x8010028C A0F90000 */ sb $t9, 0X0($a3) +/* 092660 0x80100290 90880001 */ lbu $t0, 0X1($a0) +/* 092661 0x80100294 44D8F800 */ ctc1 $t8, $31 +/* 092662 0x80100298 3C014F80 */ lui $at, 0x4F80 +/* 092663 0x8010029C 44888000 */ mtc1 $t0, $f16 +/* 092664 0x801002A0 05010004 */ bgez $t0, .L_801002B4 +/* 092665 0x801002A4 46808020 */ cvt.s.w $f0, $f16 +/* 092666 0x801002A8 44815000 */ mtc1 $at, $f10 +/* 092667 0x801002AC 00000000 */ nop +/* 092668 0x801002B0 460A0000 */ add.s $f0, $f0, $f10 +.L_801002B4: +/* 092669 0x801002B4 90A90001 */ lbu $t1, 0X1($a1) +/* 092670 0x801002B8 3C014F80 */ lui $at, 0x4F80 +/* 092671 0x801002BC 44899000 */ mtc1 $t1, $f18 +/* 092672 0x801002C0 05210004 */ bgez $t1, .L_801002D4 +/* 092673 0x801002C4 46809120 */ cvt.s.w $f4, $f18 +/* 092674 0x801002C8 44813000 */ mtc1 $at, $f6 +/* 092675 0x801002CC 00000000 */ nop +/* 092676 0x801002D0 46062100 */ add.s $f4, $f4, $f6 +.L_801002D4: +/* 092677 0x801002D4 46002201 */ sub.s $f8, $f4, $f0 +/* 092678 0x801002D8 240B0001 */ li $t3, 1 +/* 092679 0x801002DC 3C014F00 */ lui $at, 0x4F00 +/* 092680 0x801002E0 460C4402 */ mul.s $f16, $f8, $f12 +/* 092681 0x801002E4 46008280 */ add.s $f10, $f16, $f0 +/* 092682 0x801002E8 444AF800 */ cfc1 $t2, $31 +/* 092683 0x801002EC 44CBF800 */ ctc1 $t3, $31 +/* 092684 0x801002F0 00000000 */ nop +/* 092685 0x801002F4 460054A4 */ cvt.w.s $f18, $f10 +/* 092686 0x801002F8 444BF800 */ cfc1 $t3, $31 +/* 092687 0x801002FC 00000000 */ nop +/* 092688 0x80100300 316B0078 */ andi $t3, $t3, 0X78 +/* 092689 0x80100304 51600013 */ beqzl $t3, .L_80100354 +/* 092690 0x80100308 440B9000 */ mfc1 $t3, $f18 +/* 092691 0x8010030C 44819000 */ mtc1 $at, $f18 +/* 092692 0x80100310 240B0001 */ li $t3, 1 +/* 092693 0x80100314 46125481 */ sub.s $f18, $f10, $f18 +/* 092694 0x80100318 44CBF800 */ ctc1 $t3, $31 +/* 092695 0x8010031C 00000000 */ nop +/* 092696 0x80100320 460094A4 */ cvt.w.s $f18, $f18 +/* 092697 0x80100324 444BF800 */ cfc1 $t3, $31 +/* 092698 0x80100328 00000000 */ nop +/* 092699 0x8010032C 316B0078 */ andi $t3, $t3, 0X78 +/* 092700 0x80100330 15600005 */ bnez $t3, .L_80100348 +/* 092701 0x80100334 00000000 */ nop +/* 092702 0x80100338 440B9000 */ mfc1 $t3, $f18 +/* 092703 0x8010033C 3C018000 */ lui $at, 0x8000 +/* 092704 0x80100340 10000007 */ b .L_80100360 +/* 092705 0x80100344 01615825 */ or $t3, $t3, $at +.L_80100348: +/* 092706 0x80100348 10000005 */ b .L_80100360 +/* 092707 0x8010034C 240BFFFF */ li $t3, -1 +/* 092708 0x80100350 440B9000 */ mfc1 $t3, $f18 +.L_80100354: +/* 092709 0x80100354 00000000 */ nop +/* 092710 0x80100358 0560FFFB */ bltz $t3, .L_80100348 +/* 092711 0x8010035C 00000000 */ nop +.L_80100360: +/* 092712 0x80100360 A0EB0001 */ sb $t3, 0X1($a3) +/* 092713 0x80100364 908C0002 */ lbu $t4, 0X2($a0) +/* 092714 0x80100368 44CAF800 */ ctc1 $t2, $31 +/* 092715 0x8010036C 3C014F80 */ lui $at, 0x4F80 +/* 092716 0x80100370 448C3000 */ mtc1 $t4, $f6 +/* 092717 0x80100374 05810004 */ bgez $t4, .L_80100388 +/* 092718 0x80100378 46803020 */ cvt.s.w $f0, $f6 +/* 092719 0x8010037C 44812000 */ mtc1 $at, $f4 +/* 092720 0x80100380 00000000 */ nop +/* 092721 0x80100384 46040000 */ add.s $f0, $f0, $f4 +.L_80100388: +/* 092722 0x80100388 90AD0002 */ lbu $t5, 0X2($a1) +/* 092723 0x8010038C 3C014F80 */ lui $at, 0x4F80 +/* 092724 0x80100390 448D4000 */ mtc1 $t5, $f8 +/* 092725 0x80100394 05A10004 */ bgez $t5, .L_801003A8 +/* 092726 0x80100398 46804420 */ cvt.s.w $f16, $f8 +/* 092727 0x8010039C 44815000 */ mtc1 $at, $f10 +/* 092728 0x801003A0 00000000 */ nop +/* 092729 0x801003A4 460A8400 */ add.s $f16, $f16, $f10 +.L_801003A8: +/* 092730 0x801003A8 46008481 */ sub.s $f18, $f16, $f0 +/* 092731 0x801003AC 240F0001 */ li $t7, 1 +/* 092732 0x801003B0 3C014F00 */ lui $at, 0x4F00 +/* 092733 0x801003B4 460C9182 */ mul.s $f6, $f18, $f12 +/* 092734 0x801003B8 46003100 */ add.s $f4, $f6, $f0 +/* 092735 0x801003BC 444EF800 */ cfc1 $t6, $31 +/* 092736 0x801003C0 44CFF800 */ ctc1 $t7, $31 +/* 092737 0x801003C4 00000000 */ nop +/* 092738 0x801003C8 46002224 */ cvt.w.s $f8, $f4 +/* 092739 0x801003CC 444FF800 */ cfc1 $t7, $31 +/* 092740 0x801003D0 00000000 */ nop +/* 092741 0x801003D4 31EF0078 */ andi $t7, $t7, 0X78 +/* 092742 0x801003D8 51E00013 */ beqzl $t7, .L_80100428 +/* 092743 0x801003DC 440F4000 */ mfc1 $t7, $f8 +/* 092744 0x801003E0 44814000 */ mtc1 $at, $f8 +/* 092745 0x801003E4 240F0001 */ li $t7, 1 +/* 092746 0x801003E8 46082201 */ sub.s $f8, $f4, $f8 +/* 092747 0x801003EC 44CFF800 */ ctc1 $t7, $31 +/* 092748 0x801003F0 00000000 */ nop +/* 092749 0x801003F4 46004224 */ cvt.w.s $f8, $f8 +/* 092750 0x801003F8 444FF800 */ cfc1 $t7, $31 +/* 092751 0x801003FC 00000000 */ nop +/* 092752 0x80100400 31EF0078 */ andi $t7, $t7, 0X78 +/* 092753 0x80100404 15E00005 */ bnez $t7, .L_8010041C +/* 092754 0x80100408 00000000 */ nop +/* 092755 0x8010040C 440F4000 */ mfc1 $t7, $f8 +/* 092756 0x80100410 3C018000 */ lui $at, 0x8000 +/* 092757 0x80100414 10000007 */ b .L_80100434 +/* 092758 0x80100418 01E17825 */ or $t7, $t7, $at +.L_8010041C: +/* 092759 0x8010041C 10000005 */ b .L_80100434 +/* 092760 0x80100420 240FFFFF */ li $t7, -1 +/* 092761 0x80100424 440F4000 */ mfc1 $t7, $f8 +.L_80100428: +/* 092762 0x80100428 00000000 */ nop +/* 092763 0x8010042C 05E0FFFB */ bltz $t7, .L_8010041C +/* 092764 0x80100430 00000000 */ nop +.L_80100434: +/* 092765 0x80100434 44CEF800 */ ctc1 $t6, $31 +/* 092766 0x80100438 A0EF0002 */ sb $t7, 0X2($a3) +/* 092767 0x8010043C 00000000 */ nop +/* 092768 0x80100440 03E00008 */ jr $ra +/* 092769 0x80100444 00000000 */ nop +) + +#endif + +f32 func_80100448(z_Vector3D* a0, z_Vector3D* a1, f32 a2) { + z_Vector3D sp24; + f32 f2; + f32 f0; + + func_800FF5F4(a1, a0, &sp24); + f0 = func_8017A6D4(&sp24); + if (a2 < f0) { + f2 = a2 / f0; + f0 = f0 - a2; + a0->x = a0->x + f2 * sp24.x; + a0->y = a0->y + f2 * sp24.y; + a0->z = a0->z + f2 * sp24.z; + } else { + func_800FF50C(a0, a1); + f0 = 0; + } + + return f0; +} + +void func_801004FC(void) {} + +UNK_TYPE func_80100504(u32 a0) { + return(D_801F8180[(a0 << 4) >> 28] + (a0 & 0xFFFFFF)) + 0x80000000; +} + +UNK_TYPE func_8010053C(u32 a0) { + if ((a0 >> 28) == 0) { + return a0; + } + + return(D_801F8180[(a0 << 4) >> 28] + (a0 & 0xFFFFFF)) + 0x80000000; +} + +UNK_TYPE func_80100584(UNK_TYPE a0) { + if (a0 == 0) { + return 0; + } else { + return a0 + 0x80000000; + } +} + +UNK_TYPE func_801005A0(UNK_TYPE a0) { + if (a0 == 0) { + return 0; + } else { + return a0 + 0x80000000; + } +} \ No newline at end of file diff --git a/variables.py b/variables.py index 0577a48a35..4ec51c5503 100644 --- a/variables.py +++ b/variables.py @@ -157,6 +157,7 @@ known_vars = { 0x801C2078:("D_801C2078","u8",True), 0x801C2079:("D_801C2079","u8",False), 0x801C207E:("D_801C207E","u8",False), + 0x801D1508:("D_801D1508","f32",False), 0x801DBE68:("D_801DBE68","f32",False), 0x801DBE6C:("D_801DBE6C","f32",False), 0x801DBE70:("D_801DBE70","f32",False), @@ -185,11 +186,14 @@ known_vars = { 0x801DCBC4:("","UNK_TYPE",False), 0x801DCBE4:("","UNK_TYPE",False), 0x801DCBFC:("","UNK_TYPE",False), + 0x801DDA80:("","f32",False), + 0x801DDA84:("","f32",False), 0x801E3FA0:("","UNK_TYPE",False), 0x801ED930:("","UNK_TYPE",False), 0x801ED940:("","UNK_TYPE",False), 0x801EF670:("D_801EF670","u8",False), # save info/link struct? 0x801EF677:("D_801EF677","u8",False), # part of save info/link struct? + 0x801F8180:("D_801F8180","UNK_TYPE",True), 0x80208EA0:("","UNK_TYPE",False), # En_Test @@ -209,4 +213,5 @@ extra_vars = ( ("D_80099AD0_","UNK_TYPE"), # needed to match? ("D_8009A670_","UNK_TYPE"), # needed to match? ("D_8009B140_","UNK_TYPE"), # needed to match? + ("(*D_801BE960[12])(u8*, z_ActorCompInitEntry*)",""), # TODO better function pointer representation )