diff --git a/config/overlays.mk b/config/overlays.mk index 6692236e72..7e044b7b7a 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -4513,7 +4513,7 @@ build/src/ov_SC06_025/ov_SC06_025_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC06_025/ov_SC06_025_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_025/ov_SC06_025_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_025/ov_SC06_025_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 +build/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38 build/src/ov_SC06_025/ov_SC06_025_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC06_025_CHECK_SHA := config/check.ov_SC06_025.sha ov_SC06_025_SYMBOLS := config/symbols.ov_SC06_025.txt diff --git a/config/splat.ov_SC06_025.yaml b/config/splat.ov_SC06_025.yaml index b88faeac4f..c6e65def6f 100644 --- a/config/splat.ov_SC06_025.yaml +++ b/config/splat.ov_SC06_025.yaml @@ -166,7 +166,7 @@ segments: - [0x87dc4, .rodata, ov_SC06_025_jr_8017BEBC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x87de4, data, tail18] - [0x87dec, .rodata, ov_SC06_025_jr_8017EEC4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87e20, data, tail19] + - [0x87e48, data, tail19] - [0x8A12C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8A12F] # 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/ov_SC03_089/ov_SC03_089_jr_8017CA80.c b/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c index 54b299b3ac..3b72031209 100644 --- a/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c +++ b/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c @@ -4640,7 +4640,59 @@ void func_80181F60(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_80181F9C); +extern u8 D_801202A0[]; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80181F9C(s32 a0) +{ + s32 a3; + u8 *a2; + s32 t0; + s32 t1; + s32 v1p; + s32 va; + + if (*(s16 *)(a0 + 0xFE) != 0) { + return; + } + + a3 = 0; + a2 = D_801202A0; + t1 = 0x12C; + t0 = 1; + for (; a3 < 0x60; a3++, a2 += 0x10C) { + if (*(u16 *)a2 == t1) { + va = *(s16 *)(a2 + 0xA); + if ((u32)(va - *(s16 *)(a0 + 0xA) + 0x30) < 0x51) { + va = *(s16 *)(a2 + 0x6); + if ((u32)(va - *(s16 *)(a0 + 0x6) + 0x80) < 0x101) { + va = *(s16 *)(a2 + 0xE); + if ((u32)(va - *(s16 *)(a0 + 0xE) + 0x80) < 0x101) { + goto found; + } + } + } + } + } + t0 = 0; + +found: + if (t0 != 1) { + return; + } + + v1p = *(s32 *)(a0 + 0xCC); + if (v1p != 0) { + *(s16 *)(v1p + 0xFC) = 0xC; + } + v1p = *(s32 *)(a0 + 0xD0); + if (v1p != 0) { + *(s16 *)(v1p + 0xFC) = 0xC; + } + *(s16 *)(a0 + 0xFE) = 1; + func_8002D4C8(0x6EB, 0); +} + extern s32 func_8012C354(s32 a0, s32 a1); extern void func_8012A828(s32 a0, s32 a1); diff --git a/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c b/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c index 41bbd0c766..a021e96bdd 100644 --- a/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c +++ b/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c @@ -5984,7 +5984,35 @@ void func_80181448(s32 arg0) { } -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8017BEBC", func_801814F4); +#include "common.h" + +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern u8 D_801152A8[]; + +s32 aF801814F4(s32 arg0, s32 arg1) __asm__("func_801814F4"); +s32 aF801814F4(s32 arg0, s32 arg1) +{ + extern s32 *D_80126B78; + extern u8 D_801A8D8C[]; + s32 buf1[2]; + s32 buf2[2]; + s32 flag; + + ((void (*)(s32, s32, s32))func_8012F14C)((s32)D_80126B78 + 0x34, (s32)D_801A8D8C, (s32)buf1); + ((void (*)(s32, s32, s32))func_8012F14C)((s32)D_80126B78 + 0x34, (s32)(D_801A8D8C + 8), (s32)buf2); + if (func_80135888(*(s32 *)(arg0 + 0x20), *(s32 *)(arg0 + 0x58), (s32)buf1, (s32)buf2) != 0) { + flag = 1; + if ((*(u16 *)(arg0 + 0x70) & 0xF) != 0) { + flag = 0x2001; + } + func_8012F568(1, flag, *(s16 *)(*(s32 *)(arg0 + 0x20) + 0x12), arg1, (s32)buf2, (s32)D_801152A8); + return 1; + } + return 0; +} + extern s32 func_8012CC88(s32 a0, s32 a1, s32 a2); typedef struct { diff --git a/src/ov_SC03_105/ov_SC03_105_jr_8017C8D0.c b/src/ov_SC03_105/ov_SC03_105_jr_8017C8D0.c index 7cc8a1b8b6..e18b478d85 100644 --- a/src/ov_SC03_105/ov_SC03_105_jr_8017C8D0.c +++ b/src/ov_SC03_105/ov_SC03_105_jr_8017C8D0.c @@ -4260,7 +4260,7 @@ extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); extern void func_8012F14C(s32 a0, s32 a1, s32 a2); extern s32 func_80047948(s32 a0); extern s32 func_8017FA90(s32 a0, s16 a1, s32 a2); -extern void func_8017FAE8(void *a0); +extern void func_8017FAE8(); typedef struct { u16 vx, vy, vz, pad; } UVEC_8017F55C; @@ -4472,7 +4472,53 @@ s32 func_8017FA90(s32 a0, s16 a1, s32 a2) { } -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8017C8D0", func_8017FAE8); +#include "common.h" + +extern void func_8012EFB8(s32 a0); +extern void func_8002D4C8(s32 a0, s32 a1); + +typedef struct { s16 vx, vy, vz, pad; } SVec_8017FAE8; + +void func_8017FAE8(s32 a0) { + SVec_8017FAE8 pos; + SVec_8017FAE8 out; + register s32 base __asm__("$16"); + s32 q; + + pos.vx = *(s16 *)(a0 + 0x6); + pos.vy = *(s16 *)(a0 + 0xA); + pos.vz = *(s16 *)(a0 + 0xE); + ((void (*)(void *, void *))func_8012EFB8)(&pos, &out); + + base = 0x40; + + if (out.vx < 0) { + if (-out.vx >= 0xA1) { + return; + } + } else { + if (out.vx >= 0xA1) { + return; + } + } + + if (out.vy < 0) { + if (-out.vy >= 0x79) { + return; + } + } else { + if (out.vy >= 0x79) { + return; + } + } + + q = out.vx * 63 / 160; + { + register s32 r __asm__("$5") = base + q; + func_8002D4C8(0x72B, ((r | 0x2000) & 0xFFFF)); + } +} + extern void (*D_8018E270[])(void); @@ -6537,7 +6583,47 @@ void func_80185660(s32 *a0, s32 *a1, s32 a2) { } -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8017C8D0", func_80185680); +s32 func_80185680(void *a0, void *a1) { + s32 frame_pad[1]; + s32 base; + s16 cnt; + s32 ret; + register s32 idx __asm__("$2"); + register s32 idc __asm__("$6"); + u8 val; + (void)&frame_pad; + + cnt = *(s16 *)((u8 *)a1 + 6); + base = *(s32 *)a1; + if (cnt == 0) { + return 1; + } + cnt = cnt - 1; + *(s16 *)((u8 *)a1 + 6) = cnt; + ret = 0; + if (cnt <= 0) { + idx = *(s16 *)((u8 *)a1 + 4); + val = *(u8 *)(base + idx * 12); + idc = idx; + if ((val & 0x40) != 0) { + *(s16 *)((u8 *)a1 + 6) = 0; + return 1; + } + if ((val & 0x80) != 0) { + *(s16 *)((u8 *)a1 + 4) = 0; + ret = 1; + } else { + idx = idc + 1; + *(s16 *)((u8 *)a1 + 4) = idx; + } + *(s16 *)((u8 *)a1 + 6) = + *(u8 *)(base + (*(s16 *)((u8 *)a1 + 4)) * 12) & 0x3F; + *(s32 *)((u8 *)a0 + 0x24) = + base + (*(s16 *)((u8 *)a1 + 4)) * 12; + } + return ret; +} + extern s32 rand(void); extern void func_8012F214(s32 a0, s32 a1, s32 a2); diff --git a/src/ov_SC03_118/ov_SC03_118_o0d.c b/src/ov_SC03_118/ov_SC03_118_o0d.c index f797caff82..818acf287e 100644 --- a/src/ov_SC03_118/ov_SC03_118_o0d.c +++ b/src/ov_SC03_118/ov_SC03_118_o0d.c @@ -2889,7 +2889,45 @@ void func_80183280(Ent_80183280 *arg) { } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801832E0); +extern void func_8013C0F8(s32 arg0); +extern s32 func_80029178(s32 arg0); +extern void func_8013373C(s32 a0); + +typedef struct { + u8 pad0[2]; + u16 f002; + u8 pad1[0xD8]; + struct { + s16 f0DC; + u16 f0DE; + union { + struct { s32 f0E0; s32 f0E4; } l; + struct { u8 p[2]; s16 f0E2; u8 q[2]; s16 f0E6; } h; + } u; + u16 f0E8; + } f; +} Work_801832E0; + +void func_801832E0(Work_801832E0 *work) +{ + + extern s32 D_801B5D38; + extern s32 D_801B86B4; + func_8013C0F8((s32)&D_801B5D38); + func_8013C0F8((s32)&D_801B86B4); + work->f.f0DC = 0; + work->f.u.l.f0E0 = 0; + work->f.u.l.f0E4 = 0; + work->f.f0E8 = 0; + if ((func_80029178(0xB8) & 0xFF) == 0) { + work->f002++; + } else { + func_8013373C(0); + work->f.u.h.f0E2 = -0xF7; + work->f002 = 4; + } +} + void func_801833C4(s32 arg0) diff --git a/src/ov_SC05_001/ov_SC05_001_jr_8017BEBC.c b/src/ov_SC05_001/ov_SC05_001_jr_8017BEBC.c index b686946123..6bbdd200fc 100644 --- a/src/ov_SC05_001/ov_SC05_001_jr_8017BEBC.c +++ b/src/ov_SC05_001/ov_SC05_001_jr_8017BEBC.c @@ -5888,7 +5888,37 @@ extern s32 D_80126CD4; } -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8017BEBC", func_801809B8); +extern s32 func_8012BEE8(s32 a0); +extern u16 D_80126B62; +extern void func_80180304(s32 param_1); + +void func_801809B8(s32 param_1) { + s32 v1; + s32 q; + s16 t; + + if (func_8012BEE8(param_1) != 0) { + *(s32 *)(param_1 + 0x1C) = 2; + *(u16 *)(param_1 + 0xA) += 8; + D_80126B62 += 8; + v1 = *(s32 *)(param_1 + 0x6C); + if (v1 != 0) { + *(u16 *)(v1 + 0xA) -= 8; + } + *(u16 *)(*(s32 *)(*(s32 *)(param_1 + 0x64) + 0x20) + 0x14) -= 0x60; + q = *(s32 *)(*(s32 *)(param_1 + 0x64) + 0x6C); + if (q != 0) { + *(u16 *)(*(s32 *)(q + 0x20) + 0x14) -= 0x60; + } + t = *(u16 *)(param_1 + 0xFE) - 1; + *(u16 *)(param_1 + 0xFE) = t; + if (t != 0) { + return; + } + func_80180304(param_1); + } +} + void func_80180AA4(void) { } diff --git a/src/ov_SC05_008/ov_SC05_008_jr_8017AE2C.c b/src/ov_SC05_008/ov_SC05_008_jr_8017AE2C.c index e710a2edad..2f34bacce6 100644 --- a/src/ov_SC05_008/ov_SC05_008_jr_8017AE2C.c +++ b/src/ov_SC05_008/ov_SC05_008_jr_8017AE2C.c @@ -6038,7 +6038,42 @@ void *arg0; } -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8017AE2C", func_80180E84); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); + +void func_80180E84(s32 a0) +{ + extern s32 func_801823B8(void*, s32, void*); + extern s32 func_80182334(void); + extern void func_8012C098(void); + + s32 s1 = a0; + s32 s0; + s32 pad[1]; + u16 u0; + + u0 = *(u16 *)((s32)s1 + 0x6); + u0 = (u16)(u0 - 0x50); + *(u16 *)((s32)s1 + 0x6) = u0; + if ((s16)u0 < *(s16 *)((s32)s1 + 0x88)) { + if (*(s16 *)((s32)s1 + 0xFE) == 0) { + *(s16 *)((s32)s1 + 0xFE) += 1; + func_8002D4C8(0x892, 0); + } + *(u16 *)((s32)s1 + 0x6) = *(u16 *)((s32)s1 + 0x88); + } + s0 = ((s32 (*)(s32, s32, s32))func_801823B8)(s1, 1, 0) | + ((s32 (*)(s32, s32, s32))func_801823B8)(s1, 1, -1); + s0 |= ((s32 (*)(s32, s32, s32))func_801823B8)(s1, 1, -2); + if (s0 != 0) { + func_8012C658(0x209, 4, s1); + *(s32 *)(*(s32 *)((s32)s1 + 0x20) + 4) |= 0x80000000; + } + if (((s32 (*)(s32))func_80182334)(s1) == 0) { + ((void (*)(s32))func_8012C098)(s1); + } +} + extern s32 func_80013328(s32 a0, s32 a1); diff --git a/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.c b/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.c index 78cd54d321..486a06f276 100644 --- a/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.c +++ b/src/ov_SC06_025/ov_SC06_025_jr_8017EEC4.c @@ -5053,7 +5053,54 @@ void func_80182148(void) { } -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8017EEC4", func_80182170); +extern void func_8017DB6C(s32 a0); +extern void func_80182268(s32 a0, s32 a1, s32 a2, s32 a3); + +void func_80182170(void *a0) +{ + void *s0; + s32 v1; + + s0 = a0; + v1 = *(u16 *)((u8 *)s0 + 0x2); + + switch (v1) { + case 0: + case 1: + case 2: + return; + + case 3: + func_8017DB6C(0); + if (*(u16 *)((u8 *)s0 + 0x34) < 2) { + func_80182268(-0x7000, 0x7000, -0x39, 0x230); + } else { + func_80182268(-0x10, 0x10, 0x1B0, 0x1CA); + } + return; + + case 4: + func_80182268(-0x7000, 0x7000, 0x140, 0x230); + return; + + case 5: + func_80182268(-0x7000, 0x7000, 0x140, 0x230); + return; + + case 6: + func_80182268(-0x7000, 0x7000, -0x39, 0x230); + return; + + case 7: + func_80182268(-0x7000, 0x7000, -0x39, 0x230); + return; + + case 8: + func_80182268(-0x7000, 0x7000, -0x39, 0x3D0); + return; + } +} + #include "common.h" diff --git a/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c b/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c index 0c9afbd31a..7faa0339b1 100644 --- a/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c +++ b/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c @@ -8723,7 +8723,50 @@ void func_80185F4C(s32 a0) } -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8017C8D0", func_80185FB0); +extern s16 D_8011DB1A; +extern s16 D_8011DB18; +extern s16 D_8011DB0C; +extern u16 D_8011DB0C_r __asm__("D_8011DB0C"); +extern s32 func_80029D3C(void); +extern int func_80151204(int arg, int a1); +extern void func_8014BC44(s32 a0, s32 a1); +extern void func_801542A4(s32 *a0, s32 a1); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80146E90(s32 *a0, s32 a1); +extern void func_80146CA0(void *a0); +extern void func_80149020(s32 *a0); +extern u8 D_801988FC[]; +extern u8 D_801989A0[]; + +void func_80185FB0(s32 param_1) { + s32 s0; + s32 sp10[4]; + + func_80149020((s32 *)param_1); + if (D_8011DB0C_r == 0) { + return; + } + { + register s32 arg4 __asm__("$4"); + arg4 = D_8011DB1A; + __asm__ __volatile__("" : "=r"(arg4) : "0"(arg4)); + s0 = func_80029D3C(); + } + func_8014BC44(param_1, s0); + func_80151204(param_1, s0); + *(s16 *)(*(s32 *)(param_1 + 0x20) + 0x10) = 0xC00; + func_801542A4((s32 *)param_1, (s32)&D_801988FC); + func_8001382C(D_8011DB18, (void *)&D_801989A0, (void *)sp10); + func_80146DB8((s32 *)param_1, sp10); + func_801477E8((s32 *)param_1, 0x100000); + D_8011DB0C = 0; + *(u8 *)(param_1 + 0xDE) = 3; + func_80146E90((s32 *)param_1, 0x20); + func_80146CA0((void *)param_1); +} + void func_80186090(s32 param_1) {