summaryrefslogtreecommitdiff
path: root/src/code/z_lib.c
blob: 9d5e32fa505d4fa2304988e232d64087243d5b7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
#include <ultra64.h>
#include <global.h>

#pragma intrinsic (sqrtf)
extern float fabsf(float);
#pragma intrinsic (fabsf)

void* Lib_bcopy(void* dst, void* src, size_t n) {
    _bcopy(src, dst, n);

    return dst;
}

#ifdef NONMATCHING

void* Lib_memset(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 Lib_memset
/* 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 Lib_cos(s16 a0) {
    return coss(a0) * D_801DDA80;
}

f32 Lib_sin(s16 a0) {
    return sins(a0) * D_801DDA84;
}

s32 Lib_StepTowardsGet_i(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 Lib_StepTowards_i(u32* a0, u32 a1, u32 a2) {
    *a0 = Lib_StepTowardsGet_i(*a0, a1, a2);
}

UNK_TYPE Lib_StepTowardsCheck_i(u32* a0, u32 a1, u32 a2) {
    Lib_StepTowards_i(a0, a1, a2);

    return a1 == *a0;
}

UNK_TYPE Lib_StepTowardsCheckFramerateScaled_s(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 Lib_StepTowardsCheck_s(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 Lib_StepTowardsCheck_c(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 Lib_StepTowardsCheck_f(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 Lib_StepTowardsCheck_f
/* 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	atans_flip
/* 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 Lib_rand_s(s16 a0, s16 a1) {
    return (s16)(randZeroOne() * a1) + a0;
}

s16 Lib_randStride_s(s16 a0, s16 a1, s16 a2) {
    return (s16)(randZeroOne() * a2) * a1 + a0;
}

UNK_RET Lib_CopyVec3f(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 Lib_CopyVec3s(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 Lib_ToVec3f(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 Lib_ToVec3s(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 Lib_AddVec3f(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 Lib_SubVec3f(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 Lib_SubVec3sToVec3f(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 Lib_ScaleInPlaceVec3f(z_Vector3D* a0, f32 a1) {
    a0->x *= a1;
    a0->y *= a1;
    a0->z *= a1;
}

UNK_RET Lib_ScaleVec3f(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 Lib_LerpVec3f(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 Lib_AddScaledVec3f(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 Lib_ModifyRandScaled(z_Vector3D* a0, f32 a1, z_Vector3D* a2) {
    a2->x = randPlusMinusPoint5Scaled(a1) + a0->x;
    a2->y = randPlusMinusPoint5Scaled(a1) + a0->y;
    a2->z = randPlusMinusPoint5Scaled(a1) + a0->z;
}

void Lib_ScaledNormalizedDifferenceVec3f(z_Vector3D* a0, z_Vector3D* a1, f32 a2, z_Vector3D* a3) {
    f32 f0 = Lib_DistanceAndDifferenceVec3f(a0, a1, a3);
    f32 f2;

    if (f0 == 0) {
        return;
    }

    f2 = a2 / f0;

    a3->x *= f2;
    a3->y *= f2;
    a3->z *= f2;
}

f32 Lib_DistanceVec3f(z_Vector3D* a0, z_Vector3D* a1) {
    z_Vector3D sp1C;
    Lib_SubVec3f(a1, a0, &sp1C);
    return sqrtf((sp1C.x * sp1C.x) + (sp1C.y * sp1C.y) + (sp1C.z * sp1C.z));
}

f32 Lib_DistanceAndDifferenceVec3f(z_Vector3D* a0, z_Vector3D* a1, z_Vector3D* a2) {
    Lib_SubVec3f(a1, a0, a2);
    return sqrtf((a2->x * a2->x) + (a2->y * a2->y) + (a2->z * a2->z));
}

f32 Lib_DistanceXZVec3f(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 Lib_DistanceAndDifferenceXZVec3f(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 Lib_PushAwayXZVec3f(z_Vector3D* a0, z_Vector3D* a1, f32 a2) {
    f32 sp24;
    f32 sp20;
    f32 f0 = Lib_DistanceAndDifferenceXZVec3f(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 Lib_PushAwayXZVec3f
/* 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	Lib_DistanceAndDifferenceXZVec3f
/* 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 Lib_DistanceYVec3f(z_Vector3D* a0, z_Vector3D* a1) {
    return a1->y - a0->y;
}

UNK_TYPE Lib_YawVec3f(z_Vector3D* a0, z_Vector3D* a1) {
    f32 f14 = a1->x - a0->x;
    f32 f12 = a1->z - a0->z;
    return atans_flip(f12, f14);
}

UNK_TYPE Lib_PitchVec3f(z_Vector3D* a0, z_Vector3D* a1) {
    return atans_flip(Lib_DistanceXZVec3f(a0, a1), a0->y - a1->y);
}

void Lib_ApplyActorInitVars(z_Actor* a0, z_ActorCompInitEntry* a1) {
    do {
        D_801BE960[a1->type]((u8*)a0, a1);
    } while ((a1++)->cont);
}

UNK_RET Lib_ApplyActorInitVarByte1(u8* a0, z_ActorCompInitEntry* a1) {
    *(u8*)(a0 + a1->offset) = (u8)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarByte2(u8* a0, z_ActorCompInitEntry* a1) {
    *(u8*)(a0 + a1->offset) = (u8)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarShort1(u8* a0, z_ActorCompInitEntry* a1) {
    *(u16*)(a0 + a1->offset) = (u16)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarShort2(u8* a0, z_ActorCompInitEntry* a1) {
    *(u16*)(a0 + a1->offset) = (u16)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarWord1(u8* a0, z_ActorCompInitEntry* a1) {
    *(u32*)(a0 + a1->offset) = (u32)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarWord2(u8* a0, z_ActorCompInitEntry* a1) {
    *(u32*)(a0 + a1->offset) = (u32)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarFloat(u8* a0, z_ActorCompInitEntry* a1) {
    *(f32*)(a0 + a1->offset) = (f32)(a1->value);
}

UNK_RET Lib_ApplyActorInitVarFloat1000th(u8* a0, z_ActorCompInitEntry* a1) {
    *(f32*)(a0 + a1->offset) = (f32)(a1->value) / 1000;
}

UNK_RET Lib_ApplyActorInitVarVector3f(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 Lib_ApplyActorInitVarVector3f1000th(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 Lib_ApplyActorInitVarVector3s(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 Lib_ScaleMax_f(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 Lib_Scale_f(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 Lib_ScaleMaxMin_s(s16* a0, s16 a1, s16 a2, s16 a3, s16 a4) {

}

#else

GLOBAL_ASM(
glabel Lib_ScaleMaxMin_s
/* 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 Lib_ScaleMax_s(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 Lib_CopyColor(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 Lib_TranslateAndRotateYVec3f(z_Vector3D* a0, s16 a1, z_Vector3D* a2, z_Vector3D* a3) {
    f32 sp1C;
    f32 f0;

    sp1C = Lib_cos(a1);
    f0 = Lib_sin(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 Lib_LerpRGB(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 Lib_LerpRGB
/* 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 Lib_PushAwayVec3f(z_Vector3D* a0, z_Vector3D* a1, f32 a2) {
    z_Vector3D sp24;
    f32 f2;
    f32 f0;

    Lib_SubVec3f(a1, a0, &sp24);
    f0 = Math3D_Length(&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 {
        Lib_CopyVec3f(a0, a1);
        f0 = 0;
    }

    return f0;
}

void Lib_Nop801004FC(void) {}

UNK_TYPE Lib_PtrSegToPhys(u32 a0) {
    return(D_801F8180[(a0 << 4) >> 28] + (a0 & 0xFFFFFF)) + 0x80000000;
}

UNK_TYPE Lib_PtrSegToPhysNull(u32 a0) {
    if ((a0 >> 28) == 0) {
        return a0;
    }

    return(D_801F8180[(a0 << 4) >> 28] + (a0 & 0xFFFFFF)) + 0x80000000;
}

UNK_TYPE Lib_PtrSegToK0(UNK_TYPE a0) {
    if (a0 == 0) {
        return 0;
    } else {
        return a0 + 0x80000000;
    }
}

UNK_TYPE Lib_PtrSegToK0Null(UNK_TYPE a0) {
    if (a0 == 0) {
        return 0;
    } else {
        return a0 + 0x80000000;
    }
}