diff --git a/src/ov_SC03_118/ov_SC03_118_jr_8017AE2C.c b/src/ov_SC03_118/ov_SC03_118_jr_8017AE2C.c index 4b8395f27..ce5aef8eb 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_8017AE2C.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_8017AE2C.c @@ -3315,7 +3315,14 @@ DEFINE_func_8017BEAC() /* dedup: shared engine-core @0x8017BEAC (src/shared) */ DEFINE_func_8017BEB4() /* dedup: shared engine-core @0x8017BEB4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8017AE2C", func_8017BEBC); + +extern void func_80174684(void *); +extern void func_8017BEE4(void *); + +void func_8017BEBC(void) { + func_80174684((void *)func_8017BEE4); +} + extern void (*D_8018D354[])(void); diff --git a/src/ov_SC03_118/ov_SC03_118_jr_80183830.c b/src/ov_SC03_118/ov_SC03_118_jr_80183830.c index 1167238c6..5c7065c0c 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_80183830.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_80183830.c @@ -3017,7 +3017,42 @@ void func_80183C58(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_80183C94); + + +void func_80183C94(s32 param_1) +{ + extern u8 D_8018E8A8[]; + extern s32 func_80184214(s32 a0, s32 a1, s16 a2, s16 a3, s32 a4); + extern void func_80016714(void *a0, s32 a1); + extern void func_8012CAE4(void *a0); + extern s32 func_80029178(s32 a0); + s32 v0; + s32 p; + + v0 = func_80184214(param_1, (s32)D_8018E8A8, 0x300, 0x140, 0x88); + *(s32 *)((s32)param_1 + 0xCC) = v0; + if (v0 == 0) { + goto fail; + } + v0 = func_80184214(param_1, (s32)D_8018E8A8, 0x310, 0x140, 0x89); + *(s32 *)((s32)param_1 + 0xD0) = v0; + if (v0 == 0) { + func_80016714((void *)*(s32 *)((s32)param_1 + 0xCC), 0x38); + fail: + func_8012CAE4((void *)param_1); + return; + } + p = *(s32 *)((s32)param_1 + 0x68); + *(u16 *)(*(s32 *)((s32)param_1 + 0xCC) + 0x12) = *(u16 *)(p + 0xC); + p = *(s32 *)((s32)param_1 + 0x68); + *(u16 *)(*(s32 *)((s32)param_1 + 0xD0) + 0x12) = *(u16 *)(p + 0xC); + if ((func_80029178(0xB8) & 0xFF) == 0) { + *(s16 *)((s32)param_1 + 2) = 1; + } else { + *(s16 *)((s32)param_1 + 2) = 2; + } +} + #include "common.h" @@ -3231,7 +3266,27 @@ s32 func_80184214(s32 a0, s32 a1, s16 a2, s16 a3, s32 a4) { } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_801842DC); + + +extern s32 D_801D4358; +extern s32 D_801D435C; + +void func_801842DC(s32 arg0) { + s16 *a; + s16 *b; + s32 t; + + a = (s16 *) D_801D4358; + *(s32 *) (arg0 + 0x48) = a[0]; + *(s32 *) (arg0 + 0x4C) = a[1]; + t = a[2]; + b = (s16 *) D_801D435C; + *(s32 *) (arg0 + 0x50) = t; + *(s32 *) (arg0 + 0x3C) = b[0]; + *(s32 *) (arg0 + 0x40) = b[1]; + *(s32 *) (arg0 + 0x44) = b[2]; +} + extern s32 D_801D4358; extern s32 D_801D435C; @@ -3269,9 +3324,67 @@ void func_8018446C(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_801844A8); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_80184540); + +extern s32 func_8012C51C(void *a0, s32 a1); +extern void func_8012C218(void *a0); +extern void func_8012CAE4(void *a0); +extern s32 func_80178B18(s32 a0, s32 a1); + +void func_801844A8(void *param_1) +{ + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_8018EC18[]; + extern void (*D_8018EC98[])(void); + s32 s0; + s32 v0; + + s0 = (s32)param_1; + v0 = func_8012C51C(D_8018EC18, (s32)param_1); + *(s32 *)(s0 + 0xCC) = v0; + if (v0 != 0) { + v0 = func_8012C51C(&D_8018EC18[0x14], (s32)param_1); + *(s32 *)(s0 + 0xD0) = v0; + if (v0 != 0) { + goto success; + } + func_8012C218((void *)*(s32 *)(s0 + 0xCC)); + } + func_8012CAE4(param_1); + return; +success: + func_80178B18((s32)param_1, (s32)D_8018EC98); + *(u16 *)(s0 + 2) += 1; +} + + + + +extern s32 func_801789AC(s32 arg0); +extern void func_80178D18(void); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012C218(void *a0); +extern void func_800D0C48(s32 a0); +extern void func_8002AC00(s32 a0); +extern void func_80181A64(void); + +void func_80184540(s32 a0) { + s32 s0 = a0; + s32 v0 = func_801789AC(a0); + if (v0 == 1) { + ((void (*)(s32))func_80178D18)(s0); + func_8012A568(&func_80181A64); + func_8012C218((void *)*(s32 *)(s0 + 0xCC)); + func_8012C218((void *)*(s32 *)(s0 + 0xD0)); + func_800D0C48(1); + *(s32 *)(s0 + 0x1C) = 0x1F; + *(s16 *)(s0 + 2) = *(s16 *)(s0 + 2) + 1; + func_8002AC00(0x1B); + } +} + extern int func_8001AAA0(void); extern s32 func_8012BEE8(s32 a0); @@ -3440,7 +3553,12 @@ __asm__ __volatile__("" ::: "memory"); } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_8018490C); + +void func_8018490C(s32 arg0) { + *(s32 *)((u8 *)*(s32 **)(arg0 + 0xCC) + 0xE0) &= 0xDFFFFFFF; + *(s32 *)((u8 *)*(s32 **)(arg0 + 0xD0) + 0xE0) &= 0xDFFFFFFF; +} + extern void (*D_8018EF74[])(void); @@ -3450,7 +3568,34 @@ void func_80184940(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_80183830", func_8018497C); + + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern s32 func_8012A828(void*, void*); +extern void func_80143994(s32 a0, s32 a1); + +extern void (*D_8018EF44[])(void); +extern void (*D_8018EF4C[])(void); + +void func_8018497C(void *a0) +{ + s32 v0; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)a0 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(a0); + return; + } + + func_8001C214(v0, D_8018EF44[*(u16 *)((s32)a0 + 0x70) & 0xF]); + ((void (*)(void *, void *))func_8012A828)(a0, D_8018EF4C[*(u16 *)((s32)a0 + 0x70) & 0xF]); + func_80143994((s32)a0, 0x2000); + *(u16 *)((s32)a0 + 2) = 1; +} + #include "common.h" diff --git a/src/ov_SC03_118/ov_SC03_118_o0d.c b/src/ov_SC03_118/ov_SC03_118_o0d.c index 04e589856..4a2121b83 100644 --- a/src/ov_SC03_118/ov_SC03_118_o0d.c +++ b/src/ov_SC03_118/ov_SC03_118_o0d.c @@ -2856,7 +2856,16 @@ extern void func_801830C4(void *a0); /* ==== end §8b carried decl layer ==== */ -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_80183178); + + + extern s32 func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); + extern u8 D_800AF058; + s32 func_80183178(void) { + s32 ret; + ret = func_8001ABBC(0, 0, &D_800AF058, 0, 0); + return ret; + } + INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801831D0); @@ -2882,10 +2891,104 @@ void func_80183280(Ent_80183280 *arg) { INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801832E0); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801833C4); + +void func_801833C4(s32 arg0) +{ + extern u8 D_801D47E0[]; + extern u8 D_801B5D38[]; + extern u8 D_801B86B4[]; + extern s32 D_801270C8; + + typedef struct { + u8 pad0[2]; + union { s16 s; u16 u; } f02; + u8 pad1[0xD8]; + union { s16 s; u16 u; } fDC; + u8 pad2[4]; + s16 fE2; + u8 pad3[2]; + s16 fE6; + u8 pad4[4]; + u16 fEC; + u16 fEE; + } St; + +#define P ((St *)arg0) + + func_80180A64(D_801D47E0, D_801B5D38, P->fDC.s, P->fE2); + func_80180A64(D_801D47E0, D_801B86B4, P->fDC.s, P->fE6); + P->fDC.u = P->fDC.u + 8; + if (D_801270C8 != 0) { + func_8002D4C8(0x77B, 0); + P->fEC = 1; + P->fEE = 0x3C; + P->f02.u++; + } +} + INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801834DC); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_80183634); -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_o0d", func_801837B0); +extern s32 D_801D47E0; +extern s32 D_801B5D38; +extern s32 D_801B86B4; +extern s32 D_801270C8; +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_80183634; + +void func_80183634(Work_80183634 *work) +{ + func_80180A64(&D_801D47E0, &D_801B5D38, work->f.f0DC, work->f.u.h.f0E2); + func_80180A64(&D_801D47E0, &D_801B86B4, work->f.f0DC, work->f.u.h.f0E6); + work->f.u.l.f0E0 = work->f.u.l.f0E0 + -0x252E5; + work->f.u.l.f0E4 = work->f.u.l.f0E4 + 0x168D6; + work->f.f0DC = work->f.f0DC + 0xC; + if ((s16)(++work->f.f0E8) >= 0x6A) { + func_8002D4C8(4, 0x77B); + D_801270C8 = 2; + func_8013373C(0); + ++work->f002; + } +} + + + + +void func_801837B0(s32 arg0) +{ + typedef struct { + u8 _[0xDC]; + s16 fDC; + u8 _2[4]; + s16 fE2; + } Args_801837B0; + typedef struct { + u8 _[0xDC]; + u16 fDC; + } Rmw_801837B0; + + extern s32 D_801D47E0; + extern s32 D_801B5D38; + extern void func_80180A64(s32 arg0, s32 arg1, s32 arg2, s32 arg3); + + func_80180A64(&D_801D47E0, &D_801B5D38, + ((Args_801837B0 *)arg0)->fDC, + ((Args_801837B0 *)arg0)->fE2); + ((Rmw_801837B0 *)arg0)->fDC += 7; +} +