diff --git a/config/overlays.mk b/config/overlays.mk index 1c502a55d..3c3b7bd7e 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4446,6 +4446,7 @@ build/src/ov_SC06_024/ov_SC06_024_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC06_024/ov_SC06_024_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_024/ov_SC06_024_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_024/ov_SC06_024_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 +build/src/ov_SC06_024/ov_SC06_024_jr_8017BEBC.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_024/ov_SC06_024_jr_801851E0.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC06_024/ov_SC06_024_jr_80186F00.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 build/src/ov_SC06_024/ov_SC06_024_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 diff --git a/config/splat.ov_SC06_024.yaml b/config/splat.ov_SC06_024.yaml index cb5a143a7..80c12462c 100644 --- a/config/splat.ov_SC06_024.yaml +++ b/config/splat.ov_SC06_024.yaml @@ -166,7 +166,7 @@ segments: - [0xb7a8c, data, tail17] - [0xb7a90, .rodata, ov_SC06_024_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb7aa4, .rodata, ov_SC06_024_jr_8017BEBC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7ac4, data, tail18] + - [0xb7aec, data, tail18] - [0xb7b58, .rodata, ov_SC06_024_jr_801851E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb7c38, .rodata, ov_SC06_024_jr_801867DC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb7c50, .rodata, ov_SC06_024_jr_80186F00] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/src/ov_SC02_016/ov_SC02_016_jr_8017DC70.c b/src/ov_SC02_016/ov_SC02_016_jr_8017DC70.c index 58e8888af..9f0847771 100644 --- a/src/ov_SC02_016/ov_SC02_016_jr_8017DC70.c +++ b/src/ov_SC02_016/ov_SC02_016_jr_8017DC70.c @@ -3575,7 +3575,51 @@ extern void func_8017F630(void); INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8017DC70", func_8017F630); -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8017DC70", func_8017F6A4); +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_8017F190(s32 a0); +extern void func_8017F11C(s32 a0); + +void func_8017F6A4(s32 param_1) { + extern u8 D_801A2D40; + extern u8 D_801A2EC4; + s32 v0; + s32 inst; + s32 v1; + s32 t; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + inst = v0; + *(s32 *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + return; + } + ((void (*)(s32, void *))func_8001C214)(inst, &D_801A2D40); + *(s16 *)(inst + 0x1C) = 0x800; + *(s16 *)(inst + 0x1A) = 0x800; + *(s16 *)(inst + 0x18) = 0x800; + *(s16 *)(inst + 0x2C) |= 0x10; + ((void (*)(u8 *, s32))func_8012A8B0)((u8 *)param_1, (s32)&D_801A2EC4); + *(s16 *)(param_1 + 0x84) = 0; + v1 = func_80132EF4(param_1, 0x2A); + *(s32 *)(param_1 + 0xCC) = v1; + if (v1 != 0) { + *(u16 *)(v1 + 0x2C) = *(u8 *)(param_1 + 0x70); + t = *(u16 *)(param_1 + 0x36); + *(s32 *)(v1 + 0x30) = param_1; + *(u16 *)(v1 + 0x2E) = t; + } + if (*(s16 *)(param_1 + 0x70) & 0x8000) { + ((void (*)(s32))func_8017F190)(param_1); + } else { + ((void (*)(s32))func_8017F11C)(param_1); + } +} + INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8017DC70", func_8017F78C); diff --git a/src/ov_SC03_115/ov_SC03_115_jr_8017BEBC.c b/src/ov_SC03_115/ov_SC03_115_jr_8017BEBC.c index 2dd999f5e..a8ab052f8 100644 --- a/src/ov_SC03_115/ov_SC03_115_jr_8017BEBC.c +++ b/src/ov_SC03_115/ov_SC03_115_jr_8017BEBC.c @@ -3610,7 +3610,20 @@ void func_8017D8C8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8017BEBC", func_8017D948); +void func_8017D948(s32 s0) { + extern void func_80178D18(void); + if (func_80178970() == 0) { + return; + } + ((void (*)(s32))func_80178D18)(s0); + *(s16 *)(s0 + 2) = 1; + if (*(s16 *)(s0 + 0x70) == 0) { + *(s32 *)(*(s32 *)(s0 + 0x20) + 4) |= 0x80000000; + } else { + *(s32 *)(*(s32 *)(s0 + 0x20) + 4) &= 0x7FFFFFFF; + } +} + INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8017BEBC", func_8017D9C4); diff --git a/src/ov_SC05_010/ov_SC05_010_jr_80181CDC.c b/src/ov_SC05_010/ov_SC05_010_jr_80181CDC.c index 62e02ea03..43542f9b9 100644 --- a/src/ov_SC05_010/ov_SC05_010_jr_80181CDC.c +++ b/src/ov_SC05_010/ov_SC05_010_jr_80181CDC.c @@ -3272,7 +3272,98 @@ void func_80183C84(void *a0) { } -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_80181CDC", func_80183D5C); +typedef struct { s16 vx, vy, vz, pad; } SV83; + +void func_80183D5C(s32 arg0) +{ + extern void func_8004914C(void *); + extern void func_800491AC(void *); + extern s32 func_8004787C(s32); + extern s32 func_80047948(s32); + extern s32 RotTransPers3(void *, void *, void *, s32 *, s32 *, s32 *, s32 *, s32 *); + extern void *func_80010A08(s32); + extern s32 GetTPage(s32, s32, s32, s32); + extern s32 func_8005A600(s32, s32, s32, s32, s32); + extern s32 AddPrim(s32, void *); + extern u8 D_800AF648; + extern s32 D_800A651C[]; + extern s16 D_800B9A02; + + register u8 *db __asm__("$16"); + register s32 obj __asm__("$17"); + void *q; + SV83 v[3]; + s32 scr[6]; + s32 ret; + s32 tp; + s32 i; + u16 *e; + u8 *r; + s32 ot; + + obj = arg0; + db = &D_800AF648; + func_8004914C(db); + func_800491AC(db); + + v[0].vx = *(u16 *)((char *)obj + 6); + v[0].vy = *(u16 *)((char *)obj + 0xA); + v[0].vz = *(u16 *)((char *)obj + 0xE); + + ret = func_8004787C(*(s16 *)((char *)obj + 0xFC) + 0x40); + v[1].vx = *(u16 *)((char *)obj + 6) - (ret * *(s16 *)((char *)obj + 0x100) >> 7); + v[1].vy = *(u16 *)((char *)obj + 0xA) - (*(u16 *)((char *)obj + 0x100) << 5); + ret = func_80047948(*(s16 *)((char *)obj + 0xFC) + 0x40); + v[1].vz = *(u16 *)((char *)obj + 0xE) - (ret * *(s16 *)((char *)obj + 0x100) >> 7); + ret = func_8004787C(*(s16 *)((char *)obj + 0xFC) - 0x40); + v[2].vx = *(u16 *)((char *)obj + 6) - (ret * *(s16 *)((char *)obj + 0x100) >> 7); + v[2].vy = *(u16 *)((char *)obj + 0xA) - (*(u16 *)((char *)obj + 0x100) << 5); + ret = func_80047948(*(s16 *)((char *)obj + 0xFC) - 0x40); + v[2].vz = *(u16 *)((char *)obj + 0xE) - (ret * *(s16 *)((char *)obj + 0x100) >> 7); + + ret = RotTransPers3(&v[0], &v[1], &v[2], &scr[0], &scr[1], &scr[2], &scr[4], &scr[5]); + if (ret <= 0 || scr[5] < 0) { + *(u16 *)((char *)obj + 0x102) = 0; + *(u16 *)((char *)obj + 0x100) = *(u16 *)((char *)obj + 0x100) - 1; + return; + } + ret -= 0x10; + + ot = D_800A651C[*(u16 *)&D_800B9A02 * 5] + (ret << 2); + + q = func_80010A08(0x30); + if (q == 0) { + return; + } + + tp = GetTPage(0, 1, 0, 0); + func_8005A600((s32)q, 0, 0, (u16)tp, 0); + + r = (u8 *)q + 0xC; + for (i = 0, e = (u16 *)scr; i < 3; i++) { + if (!((u16)(e[0] + 0xA0) < 0x141 && (u16)(e[1] + 0x78) < 0xF1)) { + *(u16 *)((char *)obj + 0x102) = 0; + } + e += 2; + } + + r[0x1C] = r[0x14] = r[0xC] = r[4] = 0xFF; + r[0x1D] = r[0x15] = r[0xD] = r[5] = 0xFF; + r[0x1E] = r[0x16] = r[0xE] = r[6] = 0xFF; + r[3] = 8; + r[7] = 0x3A; + *(u16 *)(r + 8) = *(volatile u16 *)&scr[0]; + *(u16 *)(r + 0x10) = *(volatile u16 *)&scr[0]; + *(u16 *)(r + 0x18) = *(volatile u16 *)&scr[1]; + *(u16 *)(r + 0x20) = *(volatile u16 *)&scr[2]; + *(u16 *)(r + 0xA) = *(volatile u16 *)((u16 *)&scr[0] + 1); + *(u16 *)(r + 0x12) = *(volatile u16 *)((u16 *)&scr[0] + 1); + *(u16 *)(r + 0x1A) = *(volatile u16 *)((u16 *)&scr[1] + 1); + *(u16 *)(r + 0x22) = *(volatile u16 *)((u16 *)&scr[2] + 1); + AddPrim(ot, r); + AddPrim(ot, q); +} + INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_80181CDC", func_80184084); diff --git a/src/ov_SC06_016/ov_SC06_016_jr_8017C8D0.c b/src/ov_SC06_016/ov_SC06_016_jr_8017C8D0.c index e4fc62e70..1d6144cdb 100644 --- a/src/ov_SC06_016/ov_SC06_016_jr_8017C8D0.c +++ b/src/ov_SC06_016/ov_SC06_016_jr_8017C8D0.c @@ -5344,7 +5344,22 @@ void func_80181840(void *s0) { } -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8017C8D0", func_8018191C); +extern void func_8012F568(); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); + +void func_8018191C(s32 a0, void *a1, void *a2, s32 a3) +{ + extern s32 *D_80126B78; + extern s32 *D_80126B90; + extern s16 D_80126B9A; + extern u8 D_801152A8[]; + + if (func_80135888((s32)D_80126B78, (s32)D_80126B90, (s32)a1, (s32)a2) != 0) { + func_8012F568(1, 0x4201, a3, 0x5A, a2, D_801152A8); + D_80126B9A = a3; + } +} + #include "common.h" @@ -5637,7 +5652,38 @@ void func_8018205C(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8017C8D0", func_801820E0); +extern int func_80178970(void); +extern void func_80178D18(void); +extern int func_800D0CE0(void); +extern void func_8017C068(void); +extern s16 D_8019F71C; + +void func_801820E0(s32 a0) { + u16 var = *(u16 *)(a0 + 0x34); + + switch (var) { + case 0: + *(u16 *)(a0 + 0x34) = var + 1; + break; + case 1: + if (((s32 (*)(s32))func_80178970)(a0) != 0) { + ((void (*)(s32))func_80178D18)(a0); + *(s32 *)(a0 + 0xDC) = 0; + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 2: + if (func_800D0CE0() == 1) { + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 3: + func_8017C068(); + D_8019F71C = 1; + break; + } +} + extern u16 D_80188BB4; diff --git a/src/ov_SC06_024/ov_SC06_024_jr_8017BEBC.c b/src/ov_SC06_024/ov_SC06_024_jr_8017BEBC.c index 62f301855..afe314669 100644 --- a/src/ov_SC06_024/ov_SC06_024_jr_8017BEBC.c +++ b/src/ov_SC06_024/ov_SC06_024_jr_8017BEBC.c @@ -3648,7 +3648,240 @@ void func_8017DAE0(s32 param_1) } -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8017BEBC", func_8017DBFC); +extern void func_8012EC04(s32, s32, s32 *); +extern void func_8012F14C(s32, s32, s32); +extern s32 func_80132EF4(s32, s32); +extern s32 func_80128DB4(s32, s32*); +extern s32 func_8012BE54(s32); +extern void func_8017EC4C(s32); +extern void func_8017EADC(s32); +extern s32 func_8012BEE8(s32); +extern s32 func_8012BA10(s32, s32); +extern s32 func_8012BDBC(s32, s32); +extern void func_8002D4C8(s32, s32); +extern void func_80128D60(s32, s32 *, s32 *); + +extern u8 D_80193470; +extern u8 D_80193471; +extern u8 D_80193472; +extern u16 D_80193378[]; +extern u16 D_801933B8[]; +extern void (*D_80193438)(void); +extern u16 D_80193440[]; +extern u16 D_80193442; +extern u16 D_80193444; +extern s32 D_80126B58; +extern s32 D_801E1118; +extern s32 D_801E1120[]; +extern s32 D_801E1158; + +void func_8017DBFC(s32 arg0) +{ + register s32 s0 __asm__("$16"); + s32 s1; + u16 buf[16]; + u16 vec[8]; + + s0 = arg0; + switch (*(u16 *)(s0 + 0x34)) { + case 0: + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + *(s32 *)(s0 + 0xE4) = *(s32 *)(s0 + 0xE4) & ~4; + *(u16 *)(s0 + 0x100) = 0; + *(u16 *)(s0 + 0x102) = 0; + *(s32 *)(s0 + 0x1C) = 0; + break; + case 1: + if (func_8012BEE8(s0) != 0) { + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + } + break; + case 2: + { + s32 v0; + s32 v1; + v0 = func_8012BA10(s0, 8); + v1 = *(s32 *)(s0 + 0x20); + *(s16 *)(v1 + 0x12) = *(s16 *)(v1 + 0x12) + v0; + if (func_8012BDBC(s0, 0x100) != 0) { + *(s32 *)(s0 + 0x1C) = 0x1E; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + func_8002D4C8(0x95A, 0); + } + break; + } + case 3: + { + s32 v0; + s32 v1; + v0 = func_8012BA10(s0, 8); + v1 = *(s32 *)(s0 + 0x20); + *(s16 *)(v1 + 0x12) = *(s16 *)(v1 + 0x12) + v0; + if (func_8012BEE8(s0) != 0) { + *(s32 *)(s0 + 0x1C) = 7; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + func_8002D4C8(4, 0x95A); + } + *(u16 *)(s0 + 0x102) = *(u16 *)(s0 + 0x102) + 0x10; + func_8017EADC(s0); + break; + } + case 4: + { + s32 v0; + s32 v1; + s1 = func_80132EF4(&D_80126B58, 0x5B); + if (s1 != 0) { + v0 = *(s32 *)(s0 + 0x1C); + v1 = *(s32 *)(s1 + 0x20); + *(s16 *)(v1 + 0x1A) = v0 << 12; + *(s16 *)(v1 + 0x18) = v0 << 12; + *(u16 *)(s1 + 0xA) = *(u16 *)(s1 + 0xA) - 0x30; + if (*(s32 *)(s0 + 0x1C) == 7) { + func_8002D4C8(0x95B, 0); + } + } + if (func_8012BEE8(s0) != 0) { + *(u16 *)(s0 + 0x102) = 0; + *(s32 *)(s0 + 0x1C) = 0x1E; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + func_80128D60(0, D_801E1120, D_80193378); + *(s32 *)(*(s32 *)(s0 + 0xD4) + 4) &= 0x7FFFFFFF; + D_80193470 = 0x20; + D_80193471 = 0x20; + D_80193472 = 0x20; + } + break; + } + case 5: + { + u8 *p = &D_80193470; + *p = *p + 7; + D_80193471 = D_80193471 + 7; + D_80193472 = D_80193472 + 7; + if (func_8012BEE8(s0) != 0) { + func_80128D60(0, D_801E1120, D_801933B8); + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + func_8002D4C8(0x95C, 0); + } + break; + } + case 6: + *(u16 *)(s0 + 0x102) = *(u16 *)(s0 + 0x102) + 0x18; + if ((*(s32 *)(s0 + 0xE4) & 4) != 0) { + *(s32 *)(s0 + 0x1C) = 0x20; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + } + func_8017EC4C(s0); + break; + case 7: + { + s32 v1; + *(u16 *)(s0 + 0x102) = *(u16 *)(s0 + 0x102) + 0x18; + if (func_8012BEE8(s0) != 0) { + *(s32 *)(s0 + 0x1C) = 0x60; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + v1 = *(s32 *)(s0 + 0x20); + if ((u32)((*(u16 *)(v1 + 0x12) & 0xFFF) - 0x501) < 0x800) { + func_8002D4C8(0x963, 0); + D_801E1118 = 0; + } else { + func_8002D4C8(0x962, 0); + D_801E1118 = 1; + } + } + func_8017EC4C(s0); + break; + } + case 8: + { + s32 v0; + s32 v1; + *(u16 *)(s0 + 0x102) = *(u16 *)(s0 + 0x102) + 0x18; + v1 = *(s32 *)(s0 + 0x20); + *(s16 *)(v1 + 0x12) = *(s16 *)(v1 + 0x12) + 0x80; + v0 = *(u16 *)(*(s32 *)(s0 + 0x20) + 0x12) & 0xFFF; + if (D_801E1118 != 0) { + if ((u32)(v0 - 0x501) < 0x800) { + func_8002D4C8(0x963, 0); + D_801E1118 = 0; + } + } else { + if ((u32)(v0 - 0x501) >= 0x800) { + func_8002D4C8(0x962, 0); + D_801E1118 = 1; + } + } + if (func_8012BEE8(s0) != 0) { + *(s32 *)(s0 + 0x1C) = 0xA; + *(u16 *)(s0 + 0x34) = *(u16 *)(s0 + 0x34) + 1; + } + if ((*(s32 *)(s0 + 0xE4) & 4) != 0) { + s1 = func_80132EF4(s0, 0x22); + if (s1 != 0) { + func_8012EC04(s0, D_801E1158, buf); + vec[0] = D_80193440[0]; + vec[1] = D_80193442; + vec[2] = D_80193444 - 0xD0; + func_8012F14C(buf, vec, &vec[4]); + *(u16 *)(s1 + 0x34) = 0x3000; + *(u16 *)(s1 + 6) = vec[4]; + *(u16 *)(s1 + 0xA) = vec[5]; + *(u16 *)(s1 + 0xE) = vec[6]; + } + } + func_8017EC4C(s0); + break; + } + case 9: + { + s32 v0; + s32 v1; + u8 *p; + *(u16 *)(s0 + 0x100) = *(u16 *)(s0 + 0x100) + 0x18; + if ((*(s32 *)(s0 + 0xE4) & 4) == 0) { + *(u16 *)(s0 + 0x102) = *(u16 *)(s0 + 0x102) + 0x18; + } + if (func_8012BEE8(s0) == 0) { + p = &D_80193470; + *p = *p - 0x18; + D_80193471 = D_80193471 - 0x18; + D_80193472 = D_80193472 - 0x18; + } + v0 = *(s16 *)(s0 + 0x100) - *(s16 *)(s0 + 0x102); + if (v0 >= 0) { + if (v0 < 0x20) { + goto Ljoin9; + } + goto Lexit9; + } + if (*(s16 *)(s0 + 0x102) - *(s16 *)(s0 + 0x100) >= 0x20) { + goto Lexit9; + } + Ljoin9: + *(u16 *)(s0 + 0x100) = *(u16 *)(s0 + 0x102); + v1 = func_8012BE54(s0); + if (0x2FFFF < v1) { + func_80128D60(0, D_801E1120, ((u16 *)&D_80193438)); + *(u16 *)(s0 + 2) = 1; + } else { + *(u16 *)(s0 + 2) = 3; + } + *(u16 *)(s0 + 0x34) = 0; + *(s32 *)(*(s32 *)(s0 + 0xD4) + 4) |= 0x80000000; + *(s32 *)(*(s32 *)(s0 + 0xD8) + 4) |= 0x80000000; + func_8002D4C8(4, 0x95C); + break; + Lexit9: + func_8017EC4C(s0); + break; + } + default: + break; + } + ((void (*)(s32, s32 *))func_80128DB4)(0, D_801E1120); +} + INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8017BEBC", func_8017E1F0);