diff --git a/config/overlays.mk b/config/overlays.mk index 2cc13beeb4..08cff07460 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -1579,7 +1579,7 @@ ov_SC03_015_ELF := $(ov_SC03_015_OUT).elf ov_SC03_015_MAPFILE := $(ov_SC03_015_OUT).map ov_SC03_015_LD_SCRIPT := $(ov_SC03_015_OUT).ld ov_SC03_015_SPLAT_YAML := config/splat.ov_SC03_015.yaml -ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_80135888.o,tail3.data.o,ov_SC03_015_jr_80135A4C.o,tail4.data.o,ov_SC03_015_jr_80135D20.o,tail5.data.o,ov_SC03_015_jr_801380E0.o,ov_SC03_015_o0e.o,tail6.data.o,ov_SC03_015_jr_8013F350.o,tail7.data.o,ov_SC03_015_jr_8013FFD8.o,tail8.data.o,ov_SC03_015_jr_80140608.o,tail9.data.o,ov_SC03_015_jr_8015444C.o,ov_SC03_015_jr_80154C24.o,ov_SC03_015_jr_801588CC.o,ov_SC03_015_jr_80159C84.o,tail10.data.o,ov_SC03_015_jr_8015A3C8.o,tail11.data.o,ov_SC03_015_jr_8015AE2C.o,tail12.data.o,ov_SC03_015_jr_8015C32C.o,tail13.data.o,ov_SC03_015_jr_8016AB6C.o,tail14.data.o,ov_SC03_015_jr_80171B4C.o,ov_SC03_015_jr_801734BC.o,tail15.data.o,ov_SC03_015_jr_801789AC.o,ov_SC03_015_jr_80178D40.o,tail16.data.o,ov_SC03_015_jr_8017A4AC.o,tail17.data.o,ov_SC03_015_jr_8017AE2C.o,tail18.data.o,ov_SC03_015_jr_8017EB7C.o,tail19.data.o,ov_SC03_015_jr_80184F14.o,ov_SC03_015_jr_80185B44.o,tail20.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_80135888.o,tail3.data.o,ov_SC03_015_jr_80135A4C.o,tail4.data.o,ov_SC03_015_jr_80135D20.o,tail5.data.o,ov_SC03_015_jr_801380E0.o,ov_SC03_015_o0e.o,tail6.data.o,ov_SC03_015_jr_8013F350.o,tail7.data.o,ov_SC03_015_jr_8013FFD8.o,tail8.data.o,ov_SC03_015_jr_80140608.o,tail9.data.o,ov_SC03_015_jr_8015444C.o,ov_SC03_015_jr_80154C24.o,ov_SC03_015_jr_801588CC.o,ov_SC03_015_jr_80159C84.o,tail10.data.o,ov_SC03_015_jr_8015A3C8.o,tail11.data.o,ov_SC03_015_jr_8015AE2C.o,tail12.data.o,ov_SC03_015_jr_8015C32C.o,tail13.data.o,ov_SC03_015_jr_8016AB6C.o,tail14.data.o,ov_SC03_015_jr_80171B4C.o,ov_SC03_015_jr_801734BC.o,tail15.data.o,ov_SC03_015_jr_801789AC.o,ov_SC03_015_jr_80178D40.o,tail16.data.o,ov_SC03_015_jr_8017A4AC.o,tail17.data.o,ov_SC03_015_jr_8017AE2C.o,ov_SC03_015_jr_8017EB7C.o,tail18.data.o,ov_SC03_015_jr_80184F14.o,ov_SC03_015_jr_80185B44.o,tail19.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC03_015/ov_SC03_015.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0 build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18 @@ -1592,7 +1592,7 @@ build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 +build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c build/src/ov_SC03_015/ov_SC03_015_jr_80185B44.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38 build/src/ov_SC03_015/ov_SC03_015_o0e.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 ov_SC03_015_CHECK_SHA := config/check.ov_SC03_015.sha diff --git a/config/splat.ov_SC03_015.yaml b/config/splat.ov_SC03_015.yaml index d048362ae2..a3afb59279 100644 --- a/config/splat.ov_SC03_015.yaml +++ b/config/splat.ov_SC03_015.yaml @@ -168,12 +168,11 @@ segments: - [0xc10e0, .rodata, ov_SC03_015_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc116c, data, tail17] - [0xc1170, .rodata, ov_SC03_015_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1198, data, tail18] - [0xc11b0, .rodata, ov_SC03_015_jr_8017EB7C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc11d0, data, tail19] + - [0xc11d0, data, tail18] - [0xc1308, .rodata, ov_SC03_015_jr_80184F14] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc1338, .rodata, ov_SC03_015_jr_80185B44] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc139c, data, tail20] + - [0xc139c, data, tail19] - [0xC2EE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC2EE7] # 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_015/ov_SC03_015_jr_8017AE2C.c b/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.c index 92c3b315ce..077827cb17 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.c @@ -3317,7 +3317,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_015/nonmatchings/ov_SC03_015_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_8018EF58[])(void); @@ -3337,7 +3344,22 @@ void func_8017BF20(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017BF58); + + +extern s32 func_80184794(void); +extern void func_80171A1C(u8 *a0); +extern s32 func_80174650(s32); + +void func_8017BF58(void *a0) { + s32 v0; + + v0 = func_80184794(); + if (v0 != 0) { + func_80171A1C((u8 *)a0); + func_80174650((s32)a0); + } +} + DEFINE_func_8017BF98() /* dedup: shared engine-core @0x8017BF98 (src/shared) */ @@ -3370,7 +3392,21 @@ void func_8017C004(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017C03C); + + +extern s32 func_8018473C(void); +extern void func_80171A1C(u8 *a0); +extern s32 func_80174650(s32 a0); + +void func_8017C03C(void *a0) { + s32 s0 = (s32)a0; + if (func_8018473C() == 0) { + return; + } + func_80171A1C((u8 *)s0); + func_80174650(s0); +} + DEFINE_func_8017C07C() /* dedup: shared engine-core @0x8017C07C (src/shared) */ @@ -4674,7 +4710,52 @@ DEFINE_func_8017DDBC() /* dedup: shared engine-core @0x8017DDBC (src/shared) */ INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017DE24); -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017DE8C); + +extern s16 D_8011F9C8; +extern s16 D_80126B3A; +extern s32 func_80174650(s32); +extern void func_80029124(s32, s32); +extern void func_80029514(s32); +extern void func_80147060(u8 * a0); +extern void func_80147324(s32 arg0); +extern void func_80171A1C(u8 *a0); + +void func_8017DE8C(a0) +u8 *a0; +{ + u16 flags = *(u16 *)(a0 + 0xB8); + + if (flags & 0x4000) { + func_80147324(0x445); + return; + } + if (!(flags & 0x8000)) { + return; + } + func_80147060(a0); + switch ((s16)(*(u16 *)&D_80126B3A - 2)) { + case 0: + func_80029124(0x16, 1); + func_80029514(0x85); + break; + case 1: + func_80029124(0x17, 1); + break; + case 2: + func_80029124(0x18, 1); + break; + case 3: + func_80029124(0x19, 1); + break; + case 4: + func_80029124(0x1A, 1); + break; + } + (*(s32 *)&D_8011F9C8) = 1; + func_80174650((s32)a0); + func_80171A1C(a0); +} + DEFINE_func_8017DF7C() /* dedup: shared engine-core @0x8017DF7C (src/shared) */ diff --git a/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.c b/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.c index f509b4c21e..d56ca0d844 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.c @@ -3798,7 +3798,25 @@ void func_8018089C(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017EB7C", func_80180A68); + + +extern void func_80146CA0(void *a0); +extern s16 D_8018F544; +extern s16 D_8018F542; +extern s16 D_8018F540; + +void func_80180A68(void) { + s16 sVar1; + + sVar1 = *(u16 *)&D_8018F544 + 8; + D_8018F544 = sVar1; + D_8018F542 = sVar1; + D_8018F540 = sVar1; + if (sVar1 >= 0x101) { + ((void (*)(void))func_80146CA0)(); + } +} + extern s16 D_8018F540; extern s16 D_8018F542; diff --git a/src/ov_SC03_015/ov_SC03_015_jr_801848E4.c b/src/ov_SC03_015/ov_SC03_015_jr_801848E4.c index 26558abfd4..040aa4f9ba 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_801848E4.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_801848E4.c @@ -2750,7 +2750,118 @@ DEFINE_func_801848E4() /* dedup: shared engine-core @0x801848E4 (src/shared) */ INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801848E4", func_80184920); -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801848E4", func_80184A08); + + +extern s32 func_80029178(s32 arg); +extern s32 func_801789AC(s32 arg0); +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern void func_80178D18(void); +extern s32 func_8014CB58(void); +extern s32 func_8014CB2C(void); +extern void func_8014B598(s32 a0, s32 a1); +extern s32 func_8016F1AC(void); +extern void func_80175454(void); +extern void func_800D0C48(s32 a0); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80184DA4(s32 param_1); +extern void func_80184DF8(s32 param_1); +extern void func_80029124(s32, s32); +extern void func_80175414(s32 _arg0); /* TU-canonical (ov_SC03_014_jr_801848E4.c L1954) */ +extern u16 D_8018FE60; +extern u16 D_8018FE70; +extern M2C_UNK D_8018F4F8; + +void func_80184A08(s32 a0) { + extern s32 func_8012BD14(); + extern s32 func_801842E0(); + extern void func_8002959C(); + u16 t34; + + if (func_8012BD14() < 0x401 || *(u16 *)(a0 + 0x34) == 1 || *(u16 *)(a0 + 0x34) == 2) { + switch (*(u16 *)(a0 + 0x34)) { + case 0: + if ((func_80029178(0x8B) & 0xFF) == 0) { + func_80178B18(a0, (s32)&D_8018FE60); + *(u16 *)(a0 + 0x34) = 2; + } else { + func_80178B18(a0, (s32)&D_8018FE70); + *(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1; + } + break; + case 1: + if (func_801789AC(a0) == 1) { + ((void (*)(s32))func_80178D18)(a0); + *(u16 *)(a0 + 0x34) = 3; + } + break; + case 2: + if (func_801789AC(a0) == 1) { + ((void (*)(s32))func_80178D18)(a0); + *(u16 *)(a0 + 0x34) = 4; + } + break; + case 3: + if ((func_80029178(0xB9) & 0xFF) == 0 && func_8014CB58() == 3) { + func_8014B598(3, (s32)&D_8018F4F8); + if (func_8016F1AC() != 0 && (*(u16 *)(a0 + 0x100) & 4) == 0) { + *(u16 *)(a0 + 0x100) |= 4; + *(s32 *)(a0 + 0x1C) = 0; + func_80175454(); + } + if (*(u16 *)(a0 + 0x100) & 4) { + *(s32 *)(a0 + 0x1C) = *(s32 *)(a0 + 0x1C) + 1; + } + if ((*(u16 *)(a0 + 0x100) & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x5A) { + *(u16 *)(a0 + 0x100) |= 2; + func_800D0C48(0); + } + if ((*(u16 *)(a0 + 0x100) & 1) == 0 && + (func_8014CB2C() & 0x8000007F) == 0x80000003) { + t34 = *(u16 *)(a0 + 0x34) + 1; + *(u16 *)(a0 + 0x100) |= 1; + *(u16 *)(a0 + 0x34) = t34; + func_8002D4C8(0xBD8, 0); + } + } + break; + } + if ((func_80029178(0x8B) & 0xFF) == 0) { + return; + } + /* §165-24: func_80184DF8(a0) is written out on all three paths — gcc cross-jumps the + common tail but leaves the three $a0 arg-setups, which then fill the three branch + delay slots (a single shared call puts the move in the jal's own slot instead). */ + if (func_8014CB58() == 3) { + func_80184DA4(a0); + func_80184DF8(a0); + } else { + *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88; + func_80184DF8(a0); + } + } else { + if ((func_80029178(0x8B) & 0xFF) == 0) { + return; + } + *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88; + func_80184DF8(a0); + } + if (*(u16 *)(a0 + 0x100) & 1) { + if (func_801842E0() != 0) { + func_80029124(0xB9, 1); + *(u16 *)(a0 + 0x2) = 2; + *(u16 *)(a0 + 0x100) &= ~1; + *(u16 *)(a0 + 0x34) = 0; + *(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88; + *(u8 *)(*(s32 *)(a0 + 0xD0) + 0x27) = 0x89; + func_8002959C(); + /* the TU carries `extern void func_80175414(s32 _arg0);` at file scope, + but the .s calls it with an EMPTY delay slot => zero arguments; call + through a cast so the carried decl stays untouched (house style). */ + ((void (*)(void))func_80175414)(); + } + } +} + extern s32 func_801847EC(void); extern s32 func_8001AAA0(s32 arg); diff --git a/src/ov_SC03_015/ov_SC03_015_jr_80184F14.c b/src/ov_SC03_015/ov_SC03_015_jr_80184F14.c index b25991362c..528f89d93e 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_80184F14.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_80184F14.c @@ -3044,7 +3044,55 @@ s32 func_8018558C(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_801855A0); + + +/* TU-canonical (src/ov_SC03_014/ov_SC03_014_jr_801848E4.c) */ +extern s32 func_8012C354(s32 a0, s32 a1); /* L2928 */ +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); /* L2929 / L2524 */ +extern void func_8012A828(s32 a0, void *a1); /* L2930 */ +extern s32 func_80029504(void); /* L24 */ +extern void func_8012C218(void *a0); /* L2712/3290 */ +extern s32 func_801788B8(s32 arg0, s32 arg1); /* L2527 */ +extern void func_8012B2CC(s32 a0); /* L2526 */ +extern s32 func_801859B0(void *a0); /* L2902, defined earlier in this TU */ + +extern u8 D_8018B898[]; /* L3981, TU-canonical */ + +/* Not declared elsewhere in the TU; used only as a bare base address here. */ +extern u8 D_8018FEAC[]; +extern u8 D_8018FE9C[]; + +void func_801855A0(s32 a0) { + s32 v1; + + if (func_8012C354(a0, (s32)D_8018FEAC) == 0) { + return; + } + + if ((u32)func_80029504() >= 0x2C6) { + func_8012C218((void *)a0); + return; + } + + *(s16 *)(a0 + 0x2) = 1; + func_8012A828(a0, D_8018B898); + v1 = *(s32 *)(a0 + 0x20); + *(u16 *)(v1 + 0x2C) |= 0x10; + + *(u8 *)(a0 + 0x75) = 0; + if (*(s16 *)(a0 + 0x70) == 0) { + *(s32 *)(a0 + 0xD0) = func_801788B8(a0, (s32)func_801859B0); + *(s32 *)(a0 + 0xCC) = func_8012C658(0x241, 1, a0); + return; + } + + *(s32 *)(a0 + 0x58) = (s32)D_8018FE9C | 0x40000000 | 0x20000000; + *(s16 *)(a0 + 0xA) -= 0xC0; + *(s16 *)(a0 + 0xE) += 0x80; + *(u32 *)(*(s32 *)(a0 + 0x20) + 4) |= 0x80000000; + func_8012B2CC(a0); +} + DEFINE_func_801856B4() /* dedup: shared engine-core @0x801856B4 (src/shared) */ @@ -3150,7 +3198,32 @@ void func_80185858(s32 arg0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_801858D4); + + +extern s32 func_80184028(); +extern u16 D_80126B66; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_801858D4(s32 a0) { + s32 v0 = *(s16 *)(a0 + 0x84); + if (v0 != 0) { + v0 = func_80184028(); + if (v0 == 0x18) { + *(s16 *)(a0 + 0x84) = 0; + } + } else { + s32 a1; + v0 = func_80184028(); + if (v0 == 0xF) { + *(s16 *)(a0 + 0x84) = 1; + a1 = -(s16)D_80126B66 >> 3; + if (a1 < 0) a1 = 0; + if (a1 > 0x7F) a1 = 0x7F; + func_8002D4C8(0xBAB, (u16)(a1 | 0x1000)); + } + } +} + extern s32 func_80184868(s32 arg); void func_8018597C(void *a0) { @@ -3178,4 +3251,76 @@ s32 func_801859B0(void *a0) } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_80185A0C); + + +extern void func_8001C2C4(s32 a0); +extern void func_80049CAC(s32 a0, s32 a1); /* TU L2637 verbatim */ +extern void func_8004914C(void *a0); /* TU L2638 verbatim */ +extern void func_800491AC(void *a0); /* TU L2639 verbatim */ +extern void RotTransSV(void *a0, void *a1, void *a2); /* TU L2640 verbatim */ +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); /* TU L323 verbatim */ + +extern SV4 D_80190470; +extern SV4 D_80190478; +extern SV4 D_801EAC70; +extern SV4 D_801EAC78; + +typedef struct { + s16 m[3][3]; + s16 pad; + s32 t[3]; +} MtxLocal; + +/* The target's stack frame (0xC8) is bigger than the visible locals below account + * for on their own: two byte-ranges (sp+0x28..0x44 and sp+0x64..0x98) never surface + * as a load/store in the target .s, yet the surrounding fields' absolute offsets + * prove the space is reserved. A struct's TOTAL size is BIGGEST_ALIGNMENT(8)-rounded + * as ONE unit (function.c assign_stack_local), but a MEMBER's offset inside that + * struct follows plain C layout rules (no forced 8-byte-per-member rounding) -- so + * folding v0 + the dead region + mtx + the second dead region into ONE aggregate + * local reproduces the exact absolute offsets with a single outer rounding, instead + * of each dead region getting its own independent 8-round (which cannot land on + * mtx's true 0x44 start -- 0x44-0x20=0x24, not a multiple of 8). + */ +typedef struct { + s16 a, b, c, d; /* sp+0x20 : func_80049CAC arg0 (SV4; only a,b,c written) */ + u8 _gap1[28]; /* sp+0x28..0x44 : never referenced by an instruction */ + MtxLocal mtx; /* sp+0x44 : MATRIX out, t[] at sp+0x58 */ + u8 _gap2[52]; /* sp+0x64..0x98 : never referenced by an instruction */ +} Frame1; + +void func_80185A0C(s32 arg0) +{ + s8 unused_buf[16]; /* sp+0x10 : func_8001C2C4 out, never re-read */ + Frame1 f; /* sp+0x20 */ + SV4 buf1; /* sp+0x98 : RotTransSV #1 out */ + SV4 buf2; /* sp+0xA0 : RotTransSV #2 out */ + SV4 buf3; /* sp+0xA8 : shared scratch a2 for both RotTransSV */ + u8 *p; + + func_8001C2C4((s32)&unused_buf[0]); + + p = (u8 *)(*(s32 *)(*(s32 *)(arg0 + 0x20) + 0x20) & 0xFEFFFFFF); + p = p + 0x70; + __asm__("" : "=r"(p) : "0"(p)); + + f.a = *(u16 *)(p + 6); + f.b = p[1] | ((p[0] & 0xF) << 8); + f.c = p[2] | ((p[0] & 0xF0) << 4); + + ((void (*)(void *, void *))func_80049CAC)(&f, &f.mtx); + + f.mtx.t[0] = *(s8 *)(p + 3); + f.mtx.t[1] = *(s8 *)(p + 4); + f.mtx.t[2] = *(s8 *)(p + 5); + + func_8004914C(&f.mtx); + func_800491AC(&f.mtx); + + RotTransSV(&D_80190470, &buf1, &buf3); + RotTransSV(&D_80190478, &buf2, &buf3); + + func_8012F14C(*(s32 *)(arg0 + 0x20) + 0x34, (s32)&buf1, (s32)&D_801EAC70); + func_8012F14C(*(s32 *)(arg0 + 0x20) + 0x34, (s32)&buf2, (s32)&D_801EAC78); +} + diff --git a/src/ov_SC03_015/ov_SC03_015_jr_80185B44.c b/src/ov_SC03_015/ov_SC03_015_jr_80185B44.c index 8da7a2ec3c..dcba3b10bf 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_80185B44.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_80185B44.c @@ -3713,7 +3713,29 @@ void func_80187884(s32 a0) { INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80187A98); -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80187CA8); + +void func_80187CA8(s32 a0) { + extern void (*D_801906F8[])(void); + extern void (*D_80190700[])(void); + extern void (*D_80191848[])(void *); + extern s32 D_801EAC80; + extern void func_800599B8(); + extern void func_8012B2CC(s32 a0); + extern void func_80185A0C(s32 a0); + s32 idx; + + if ((*(s16 *)(a0 + 0x70) == 0) && (D_801EAC80 != 0)) { + idx = (*(u16 *)(a0 + 0x100) + 1) & 7; + *(u16 *)(a0 + 0x100) = idx; + func_800599B8(D_801906F8, D_80190700[idx]); + } + D_80191848[*(u16 *)(a0 + 2)](a0); + if ((*(s16 *)(a0 + 0x70) == 0) && (*(u16 *)(a0 + 2) != 0) && (*(u16 *)(a0 + 2) < 0xD)) { + func_8012B2CC(a0); + func_80185A0C(a0); + } +} + extern void (*D_80191890[])(void); @@ -4250,7 +4272,16 @@ void func_80188F28(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80188F80); + + +void func_80188F80(void* arg0) +{ + s32 *p = *(s32 **)((s32)arg0 + 0xcc); + *(u16 *)((s32)p + 0x8) = *(u16 *)((s32)arg0 + 0x6); + *(s16 *)((s32)p + 0xa) = *(u16 *)((s32)arg0 + 0xa) - 0xe4; + *(s16 *)((s32)p + 0xc) = *(u16 *)((s32)arg0 + 0xe) - 0x8; + } + @@ -4421,7 +4452,31 @@ DEFINE_func_801892DC() /* dedup: shared engine-core @0x801892DC (src/shared) */ DEFINE_func_801892E4() /* dedup: shared engine-core @0x801892E4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189310); + + +extern void func_80188B94(void*); +extern int func_80178970(void); + +void func_80189310(s32 *a0) { + if (*(u16 *)((s32)a0 + 0x34) == 0) { + func_8012AD80((s32)a0); + if (func_8012BEE8((s32)a0) != 0) { + *(u16 *)((s32)a0 + 0x100) = 0x80; + *(s32 *)((s32)a0 + 0x1C) = 0x30; + (*(u16 *)((s32)a0 + 0x34))++; + func_80188F18(a0); + } + } else { + if (func_8012BEE8((s32)a0) != 0) { + ((void (*)(s32))func_80188B94)((s32)a0); + } else { + func_80188F28((s32)a0); + } + } + ((int (*)(s32))func_80178970)((s32)a0); + func_8018B128(); +} + extern int func_80178970(void); extern s32 func_8012BEE8(s32 a0); @@ -4618,7 +4673,31 @@ void func_801897C4(s32 param_1) { } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189824); + + +extern u8 D_801EAC94; +extern u8 D_801EAC95; +extern u8 D_801EAC96; + +void func_80189824(void *arg0) { + s16 *p; + u8 *q; + + p = *(s16 **)((s32)arg0 + 0x20); + if (*(s16 *)((s32)p + 0x18) > 0x800) { + *(s16 *)((s32)p + 0x18) = *(s16 *)((s32)p + 0x18) - 0x200; + } + if (*(s16 *)((s32)p + 0x1A) > 0x800) { + *(s16 *)((s32)p + 0x1A) = *(s16 *)((s32)p + 0x1A) - 0x200; + } + q = &D_801EAC94; + if (*q >= 0xC1) { + *q -= 4; + D_801EAC95 -= 8; + D_801EAC96 -= 8; + } +} + DEFINE_func_801898BC() /* dedup: shared engine-core @0x801898BC (src/shared) */ @@ -4679,7 +4758,25 @@ void func_801899F4(int param_1) } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189A60); + + + + +extern SV4 D_80191BEC; +extern s32 func_80029504(void); +extern s32 func_80029178(s32 arg); +extern void func_80029124(s32, s32); +extern s32 func_801899AC(void *a0, s32 *p); + +void func_80189A60(void *a0) { + if (func_80029504() == 0x2DA) { + if ((func_80029178(0x11F) & 0xFF) == 0) { + func_80029124(0x11F, 1); + *(s32 *)((s32)a0 + 0xDC) = func_801899AC(a0, (s32 *)&D_80191BEC); + } + } +} + extern u8 D_80078EAF; s32 func_80189AC4(s32 arg) { @@ -5114,7 +5211,20 @@ s32 aF8018A224(param_1) } -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_8018A31C); + + +typedef struct { s16 x; u16 y; u16 z; s16 w; } Rec8_8018A31C; +void func_8018A31C(s32 a0) { + extern Rec8_8018A31C D_801E3990[]; + s32 i = 0; + if (D_801E3990[0].x != 0) { + do { + func_8012C658(0x10D, i, a0); + i++; + } while (D_801E3990[i].x != 0); + } +} + /* func_8018A390 — allocates a GTE-projection slot, seeds a random spread