diff --git a/config/overlays.mk b/config/overlays.mk index 154fb139b..423697c5c 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4950,7 +4950,7 @@ build/src/ov_SC07_010/ov_SC07_010_jr_8015A3C8.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC07_010/ov_SC07_010_jr_80171B4C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC07_010/ov_SC07_010_jr_801789AC.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC07_010/ov_SC07_010_jr_80179B74.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x90 -build/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x34 +build/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.o: JTBL_PADS := 0,0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x34,+0x4c build/src/ov_SC07_010/ov_SC07_010_o0.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC07_010_CHECK_SHA := config/check.ov_SC07_010.sha ov_SC07_010_SYMBOLS := config/symbols.ov_SC07_010.txt diff --git a/config/splat.ov_SC07_010.yaml b/config/splat.ov_SC07_010.yaml index cb452242d..c5bd555a3 100644 --- a/config/splat.ov_SC07_010.yaml +++ b/config/splat.ov_SC07_010.yaml @@ -158,7 +158,7 @@ segments: - [0x7e6dc, .rodata, ov_SC07_010_jr_80179B74] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7e7f8, data, tail16] - [0x7e7fc, .rodata, ov_SC07_010_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7e844, data, tail17] + - [0x7e85c, data, tail17] - [0x813EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x813EF] # EOF marker = the 0.4.dec byte length # @TRAILING@ (above) is replaced by tools/new_overlay.sh: for a non-4-aligned overlay it becomes diff --git a/src/md_MAIN_025/md_MAIN_025.c b/src/md_MAIN_025/md_MAIN_025.c index 562bcf3f3..164408234 100644 --- a/src/md_MAIN_025/md_MAIN_025.c +++ b/src/md_MAIN_025/md_MAIN_025.c @@ -206,7 +206,139 @@ void func_800CB23C(void *a0) { } -INCLUDE_ASM("asm/md_MAIN_025/nonmatchings/md_MAIN_025", func_800CB300); +void func_800CB300(s32 arg0) { + typedef struct { u8 b[8]; } W8; + typedef struct { s32 w[4]; } M16; + + extern u8 D_800CAE0C[]; + extern s16 D_800CBEA0; + extern u16 D_800B99DA; + extern s16 D_800CBEA2; + extern u8 D_800CBEB0[]; + extern u8 D_80114EB0[]; + extern s16 D_80126B18; + extern s16 D_80126B1A; + extern s16 D_80126B1C; + extern u8 D_80114EC8[]; + extern s32 D_801151D8; + + extern s32 func_80146E98(s32 a0); + extern void func_80013F3C(void *a0); + extern void func_800126C4(s32 a0, s32 a1); + extern void func_800123F0(s32 a0, s32 a1); + extern void func_80012558(s32 a0, s32 a1); + extern void func_80163194(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg4); + extern void func_80162FC0(s32 *a0); + extern s32 func_80163950(s32 a0); + extern void func_8016345C(s32 a0, u16 a1, s32 a2, u16 a3, s32 a4); + extern void func_80163328(s32 a0); + extern u32 func_801633A8(s32 a0); + extern void func_80019064(void *a0); + extern void func_80013E94(void *a0, void *a1); + extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); + extern s32 func_801632E0(s32 a0); + extern s32 func_800CB7B0(s32 a0); + extern void func_800CB760(void *a0, s16 a1); + extern s32 func_8016380C(s32 a0, s32 a1); + extern void func_80146E90(s32 *a0, s16 a1); + extern void func_80147364(u16 a0, s32 a1); + extern void func_80147324(s32 arg0); + extern void func_80146CA0(void *a0); + + s32 mat[8]; + W8 work[3]; + s32 s1; + s32 s2; + s32 s0; + s32 hv; + s32 bit; + s32 flags; + s32 st; + + s1 = arg0; + s0 = *(s32 *)(s1 + 0x20); + work[0] = *(W8 *)D_800CAE0C; + s2 = (s32)&work; + if (func_80146E98(s1) != 0) { + goto L6A8; + } + func_80013F3C(&mat); + func_800126C4((s32)&mat, *(s16 *)(s0 + 0x10)); + func_800123F0((s32)&mat, *(s16 *)(s0 + 0x14)); + func_80012558((s32)&mat, *(s16 *)(s0 + 0x12)); + *(M16 *)(s0 + 0x34) = *(M16 *)&mat[0]; + *(M16 *)(s0 + 0x44) = *(M16 *)&mat[4]; + *(u16 *)(s0 + 0x2C) = *(u16 *)(s0 + 0x2C) | 1; + func_80163194(s1, -(((*(s32 *)(s1 + 0x50) - 0x28) << 14) / 40), 0, 0, (s32)&mat); + func_80162FC0((s32 *)s1); + func_80163950(s1); + hv = *(u16 *)(s0 + 0x1A) + 0x200; + *(u16 *)(s0 + 0x18) = *(u16 *)(s0 + 0x1A) = hv; + if ((s16)hv > 0x2000) { + *(u16 *)(s0 + 0x1A) = 0x2000; + *(u16 *)(s0 + 0x18) = 0x2000; + } + bit = D_800B99DA & 1; + D_800CBEA0 = bit - 0x10; + D_800CBEA2 = -0x20 - bit; + func_8016345C(s1, 0x26, 0, 0x8000, s2); + func_80163328(s1); + switch (func_801633A8(s1)) { + case 1: + func_80019064(D_800CBEB0); + func_80013E94(D_80114EB0, &work[2]); + *(s32 *)&work[2] |= 0x80000000; + func_80146A6C(0x1F, (void *)s1, D_80126B18, D_80126B1A, D_80126B1C, + *(s32 *)&work[2], 0); + s0 = func_801632E0(s1); + if (s0 != 0) { + if (func_800CB7B0(s1) == 0) { + if (*(u16 *)s0 == 0x151) { + func_800CB760((void *)s1, 0x7B3); + } else { + func_800CB760((void *)s1, 0x648); + } + } + } + break; + case 4: + func_80013E94(D_80114EC8, &work[2]); + *(s32 *)&work[2] |= 0x80000000; + func_80146A6C(7, (void *)s1, D_80126B18, D_80126B1A, D_80126B1C, + *(s32 *)&work[2], 0); + goto L6A8; + case 2: + break; + } + flags = func_8016380C(s1, (s32)&work[1]); + if (flags & 0x8000) { + goto L6A8; + } + if (!(flags & 0x2000)) { + return; + } + st = work[1].b[6]; + if (st == 0x19) { + if (D_801151D8 != 0) { + if (func_800CB7B0(s1) == 0) { + func_800CB760((void *)s1, 0x6DE); + } + } + goto L6A8; + } + if (st != 2) { + return; + } + func_80146A6C(0x10, (void *)s1, *(s16 *)(s1 + 6), *(s16 *)(s1 + 0xA), + *(s16 *)(s1 + 0xE), 0, 0); + func_80146E90((s32 *)s1, 0x1E); + func_80147364(4, 0x649); + func_80147324(0x441); + func_80146CA0((void *)s1); +L6A8: + func_80146CA0((void *)s1); +} + extern void func_8016634C(void *a0); extern void func_80147364(u16 a0, s32 a1); diff --git a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c index e11db3e0f..6adc1c571 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_8017DF98.c @@ -4792,7 +4792,147 @@ void func_80181D4C(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_80181EBC); +#include "common.h" + +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(void *a0, void *a1, void *a2); +extern s32 func_800133E4(s16 *a0, s16 *a1); +extern u8 D_8018F9A0[]; +extern u8 D_800AF648; + +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) + +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern u8 D_8018F990[]; +extern u8 D_8018F998[]; +extern void (*D_8018F9CC)(void *); +extern u8 D_801AE824[]; +extern s32 D_801AE99C[]; +extern u8 D_80126B5C; +extern s32 D_80126B64; +extern u8 D_8018F8E4[]; +extern void func_8012A828(s32 a0, void *a1); +extern void func_8012B2CC(s32 a0); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B23C(s32 a0); +extern s32 func_8014CB2C(void); +extern s32 ratan2(s32 dx, s32 dy); + +void func_80181EBC(s32 a0) +{ + s16 sv[4]; + s32 flag; + s32 type; + s32 ang; + s32 e; + register s32 pv __asm__("$3"); + register s32 id __asm__("$18"); + s32 r; + + if (*(s32 *)(a0 + 0x94) == 4) { + func_8012DEB8(a0, (s32)D_8018F990, (s32)D_8018F998); + type = 0xA; + ang = *(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) + 0x800; + e = func_8012DE2C(a0); + id = 0x1D; + if (e != 0) { + gte_SetRotMatrix(*(s32 *)(a0 + 0x20) + 0x34); + gte_SetTransMatrix(*(s32 *)(a0 + 0x20) + 0x34); + RotTransSV(D_8018F9A0, sv, &flag); + { + u8 *q = &D_800AF648; + func_8004914C(q); + __asm__ __volatile__("" : "=r"(q)); + } + func_800491AC(&D_800AF648); + do { + if ((*(u16 *)(e + 0x5C) & 0x8000) && *(u16 *)(e + 0x5E) != id) { + if (func_800133E4(sv, (s16 *)(e + 4)) < 0x1E40) { + *(u16 *)(e + 0x60) = type; + *(u16 *)(e + 0x62) = ang; + *(u16 *)(e + 0x5E) = id; + *(u16 *)(e + 0x5C) |= 1; + } + } + e = func_8012DDA4(); + } while (e != 0); + } + } + + if (*(s16 *)(a0 + 0x98) == 0) { + volatile s32 z1; + if (*(s16 *)(a0 + 0xFE) == 0) { + register s32 w __asm__("$16"); + *(s16 *)(a0 + 0xFE) += 1; + pv = *(s32 *)(a0 + 0x20); + w = *(u16 *)(pv + 0x12); + r = w & 0xFFF; + __asm__("addu %0, %1, $zero" : "=r"(w) : "r"(r)); + if (r >= 0x801) { + r = ratan2(*(s16 *)(a0 + 0xE) - 0x3F0, -0x178 - *(s16 *)(a0 + 6)); + } else { + r = ratan2(*(s16 *)(a0 + 0xE) - 0x390, 0x178 - *(s16 *)(a0 + 6)); + } + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = (r - 0x400) & 0xFFF; + __asm__ __volatile__(""); + func_8012B2CC(a0); + func_8012B1B4(a0, (s32)&D_8018F9CC); + *(s16 *)(a0 + 0x16) = -0x10; + *(u16 *)(a0 + 0xFC) = *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = w; + func_8012B2CC(a0); + *(s16 *)(a0 + 2) = 0x14; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x1C) = 0x1000; + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x2C) |= 0x10; + *(s32 *)(a0 + 0x1C) = 0x1000; + } else { + *(s16 *)(a0 + 2) = 0x16; + func_8012A828(a0, D_801AE824); + func_8012B23C(a0); + *(s16 *)(a0 + 0x16) = -0x10; + *(s32 *)(a0 + 0x10) = (*(s32 *)&D_80126B5C - *(s32 *)(a0 + 4)) >> 5; + *(s32 *)(a0 + 0x18) = (D_80126B64 - *(s32 *)(a0 + 0xC)) >> 5; + *(s32 *)(a0 + 0x58) = (s32)D_8018F8E4 | 0x40000000 | 0x20000000; + } + } + + if ((func_8014CB2C() & 0x7FFFFFFF) == 2) { + func_8012A828(a0, D_801AE99C); + *(s16 *)(a0 + 2) = 0x1B; + *(s32 *)(a0 + 0x1C) = 0; + *(s16 *)(a0 + 0x12) = -*(s16 *)(a0 + 6) >> 6; + *(s16 *)(a0 + 0x16) = -0x10; + *(s16 *)(a0 + 0x1A) = (0x3C0 - *(s16 *)(a0 + 0xE)) >> 6; + *(s16 *)(a0 + 0xFC) = (-*(s16 *)(a0 + 0xA) - 0x40) / 5; + } +} + #include "common.h" diff --git a/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.c b/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.c index 1a392e914..85e559b45 100644 --- a/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.c +++ b/src/ov_SC07_010/ov_SC07_010_jr_8017AE2C.c @@ -5858,7 +5858,55 @@ void func_8017FFB4(void *a0, void *a1, SVECTOR_80182800 *a2, s32 *a3, SVECTOR_80 } -INCLUDE_ASM("asm/ov_SC07_010/nonmatchings/ov_SC07_010_jr_8017AE2C", func_80180138); +extern s32 func_80029178(s32 a0); +extern s32 func_8002AE60(void); +extern s32 func_80014C54(s32 a0, s32 a1, s32 a2); +extern s32 func_800CF8B4(); +extern void func_800D1724(s32 a0); +extern void func_8012B2CC(s32 a0); + +void func_80180138(short *a0) { + + extern void (*D_801859D0)(void *); + extern void (*D_80185ED8[])(void *); + extern void (*D_80185EFC[])(void *); + extern void (*D_80185F10[])(void *); + extern void (*D_80185F28[])(void *); + extern void (*D_80185F34[])(void *); + + switch (*(s16 *)(a0 + 0x38)) { + case 0: + D_80185ED8[*(u16 *)(a0 + 1)](a0); + break; + case 1: + D_80185EFC[*(u16 *)(a0 + 1)](a0); + break; + case 2: + if (func_80029178(0x123) & 0xFF) { + if (((short (*)(void))func_8002AE60)() << 16 == 0) { + if ((func_80014C54(0, 0, 0x800) << 16 != 0) || + (func_80014C54(0, 0, 0x40) << 16 != 0)) { + if (func_800CF8B4() != 0) { + func_800D1724((s32)&D_801859D0); + } + } + } + } + D_80185F10[*(u16 *)(a0 + 1)](a0); + break; + case 3: + D_80185F28[*(u16 *)(a0 + 1)](a0); + break; + case 4: + D_80185F34[*(u16 *)(a0 + 1)](a0); + break; + } + + if ((*(u16 *)a0 != 0) && (*(s32 *)(a0 + 0x10) != 0)) { + func_8012B2CC((s32)a0); + } +} + extern void func_8012C1B8(void); extern void func_8012CAE4(void *a0);