feat(phase-29): func_80135A4C family sweep probe — ov_SC01_000 banked (mechanism validated)

This commit is contained in:
Drew T
2026-07-22 00:41:58 -06:00
parent 12a14410f9
commit b70fb3a728
4 changed files with 1234 additions and 445 deletions
+1 -1
View File
@@ -129,7 +129,7 @@ ov_SC01_000_ELF := $(ov_SC01_000_OUT).elf
ov_SC01_000_MAPFILE := $(ov_SC01_000_OUT).map
ov_SC01_000_LD_SCRIPT := $(ov_SC01_000_OUT).ld
ov_SC01_000_SPLAT_YAML := config/splat.ov_SC01_000.yaml
ov_SC01_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_000_jr_8012ACE0.o,tail2.data.o,ov_SC01_000_jr_801380E0.o,tail3.data.o,ov_SC01_000_jr_8013F350.o,tail4.data.o,ov_SC01_000_jr_8013FFD8.o,tail5.data.o,ov_SC01_000_jr_80140608.o,tail6.data.o,ov_SC01_000_jr_8015444C.o,tail7.data.o,ov_SC01_000_jr_80154C24.o,ov_SC01_000_jr_801588CC.o,tail8.data.o,ov_SC01_000_jr_80159C84.o,tail9.data.o,ov_SC01_000_jr_8015A3C8.o,tail10.data.o,ov_SC01_000_jr_8015AE2C.o,tail11.data.o,ov_SC01_000_jr_8015C32C.o,tail12.data.o,ov_SC01_000_jr_8016AB6C.o,tail13.data.o,ov_SC01_000_jr_801734BC.o,tail14.data.o,ov_SC01_000_jr_80178D40.o,tail15.data.o,ov_SC01_000_jr_8017A4AC.o,tail16.data.o,ov_SC01_000_jr_8017AE2C.o,ov_SC01_000_jr_8017BEBC.o,tail17.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC01_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_000_jr_8012ACE0.o,tail2.data.o,ov_SC01_000_jr_80135A4C.o,tail3.data.o,ov_SC01_000_jr_801380E0.o,tail4.data.o,ov_SC01_000_jr_8013F350.o,tail5.data.o,ov_SC01_000_jr_8013FFD8.o,tail6.data.o,ov_SC01_000_jr_80140608.o,tail7.data.o,ov_SC01_000_jr_8015444C.o,tail8.data.o,ov_SC01_000_jr_80154C24.o,ov_SC01_000_jr_801588CC.o,tail9.data.o,ov_SC01_000_jr_80159C84.o,tail10.data.o,ov_SC01_000_jr_8015A3C8.o,tail11.data.o,ov_SC01_000_jr_8015AE2C.o,tail12.data.o,ov_SC01_000_jr_8015C32C.o,tail13.data.o,ov_SC01_000_jr_8016AB6C.o,tail14.data.o,ov_SC01_000_jr_801734BC.o,tail15.data.o,ov_SC01_000_jr_80178D40.o,tail16.data.o,ov_SC01_000_jr_8017A4AC.o,tail17.data.o,ov_SC01_000_jr_8017AE2C.o,ov_SC01_000_jr_8017BEBC.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC01_000/ov_SC01_000_jr_8012ACE0.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py)
build/src/ov_SC01_000/ov_SC01_000_jr_8013F350.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC01_000/ov_SC01_000_jr_80154C24.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x24
+18 -15
View File
@@ -95,6 +95,7 @@ segments:
# - [0x0, rodata, head]
- [0x0, c, ov_SC01_000]
- [0x2b88, c, ov_SC01_000_jr_8012ACE0]
- [0xd8f4, c, ov_SC01_000_jr_80135A4C]
- [0xff88, c, ov_SC01_000_jr_801380E0]
- [0x171f8, c, ov_SC01_000_jr_8013F350]
- [0x17e80, c, ov_SC01_000_jr_8013FFD8]
@@ -117,38 +118,40 @@ segments:
- [0x56a64, data, tail]
- [0x7b1c4, .rodata, ov_SC01_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7b2a4, data, tail2]
- [0x7b2d4, .rodata, ov_SC01_000_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7b2e8, data, tail3]
- [0x7b33c, .rodata, ov_SC01_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7b3a0, data, tail3]
- [0x7b3a0, data, tail4]
- [0x7b9ac, .rodata, ov_SC01_000_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7b9e0, data, tail4]
- [0x7b9e0, data, tail5]
- [0x7b9e4, .rodata, ov_SC01_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7ba18, data, tail5]
- [0x7ba18, data, tail6]
- [0x7ba54, .rodata, ov_SC01_000_jr_80140608] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7ba68, data, tail6]
- [0x7ba68, data, tail7]
- [0x7ba80, .rodata, ov_SC01_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7baec, data, tail7]
- [0x7baec, data, tail8]
- [0x7bb5c, .rodata, ov_SC01_000_jr_80154C24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bba0, .rodata, ov_SC01_000_jr_801588CC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bbe8, data, tail8]
- [0x7bbe8, data, tail9]
- [0x7bc48, .rodata, ov_SC01_000_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bc7c, data, tail9]
- [0x7bc7c, data, tail10]
- [0x7bc80, .rodata, ov_SC01_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bc9c, data, tail10]
- [0x7bc9c, data, tail11]
- [0x7bca0, .rodata, ov_SC01_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bcbc, data, tail11]
- [0x7bcbc, data, tail12]
- [0x7bce0, .rodata, ov_SC01_000_jr_8015C32C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bcfc, data, tail12]
- [0x7bcfc, data, tail13]
- [0x7bd14, .rodata, ov_SC01_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bd34, data, tail13]
- [0x7bd34, data, tail14]
- [0x7bdb4, .rodata, ov_SC01_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7bdc8, data, tail14]
- [0x7bdc8, data, tail15]
- [0x7bf70, .rodata, ov_SC01_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7c0e8, data, tail15]
- [0x7c0e8, data, tail16]
- [0x7c178, .rodata, ov_SC01_000_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7c204, data, tail16]
- [0x7c204, data, tail17]
- [0x7c208, .rodata, ov_SC01_000_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7c21c, .rodata, ov_SC01_000_jr_8017BEBC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x7c23c, data, tail17]
- [0x7c23c, data, tail18]
- [0x7D78C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word)
- [0x7D78F] # 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
-429
View File
@@ -3016,432 +3016,3 @@ s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4)
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80135888);
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80135A4C);
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80135D20);
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80135EB0);
s32 func_80136334(void *arg0, s32 arg1, s32 arg2) {
extern u8 D_801152A8[];
extern s16 D_801152AA;
extern s16 D_801152AC;
extern s16 D_80126722;
extern s16 D_80126724;
register s32 a1v __asm__("$11");
register s32 a2v __asm__("$12");
register s32 n __asm__("$5");
register s16 *b4 __asm__("$7");
s32 d;
s32 dx;
s32 denom;
s32 result;
s32 frame_pad[2];
(void)&frame_pad;
__asm__("" : "=r"(a1v) : "0"(arg1));
a2v = arg2;
if (!(arg1 & 1)) {
dx = (s16) arg2 - (*(s16 **)&D_8017F198)[2];
d = dx;
denom = -(*(s16 **)&D_8017F1A4)[2];
} else {
denom = (*(s16 **)&D_8017F1A4)[2];
d = (*(s16 **)&D_8017F198)[2] - (s16) arg2;
dx = -d;
}
n = -d;
{
register s16 *b8 __asm__("$6") = *(s16 **)&D_8017F1A4;
u16 *ac = *(u16 **)&D_8017F198;
b4 = D_8017F1A0;
b4[0] = ac[0] + n * b8[0] / denom;
b4[1] = ac[1] + n * b8[1] / denom;
b4[2] = ac[2] + dx;
}
if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0;
if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0;
if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0;
if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0;
if (a1v & 0x8000) {
u16 *b0 = *(u16 **)&D_8017F19C;
b4[0] = b0[0];
b4[1] = b0[1];
}
D_801152AA = 0;
(*(s16 *)D_801152A8) = 0;
if (a1v & 1) {
D_8017F1A0[2] = a2v + 2;
__asm__ __volatile__("");
D_801152AC = 0xFFF;
} else {
D_801152AC = -0xFFF;
D_8017F1A0[2] = a2v - 2;
}
__asm__ __volatile__("" :: "r"(a1v), "r"(a2v));
(*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1;
D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1;
result = 1;
D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1;
return result;
}
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801365B8);
// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a)
// D_8017F198/B0/B8 are file-scope `extern u8`, D_8017F1A0 is `extern s32 []`; each HOLDS a
// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym.
// D_8017F1A0 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the
// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar
// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the
// siblings read it once via *(u16**)&sym == direct lw either way).
s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) {
extern u8 D_801152A8[];
extern s16 D_801152AA;
extern s16 D_801152AC;
extern s16 D_80126722;
extern s16 D_80126724;
register u16 *ac __asm__("$4");
register s16 *b8 __asm__("$6");
register s16 *b4 __asm__("$9");
register s32 r __asm__("$3");
register s32 pos __asm__("$12");
register s32 a1v __asm__("$5");
s16 temp_v0;
s16 temp_v1;
s32 var_a3;
s16 var_v0_3;
s32 temp_a1;
s32 var_t0;
s32 var_v1;
s16 *b4b;
u16 *p;
__asm__ ("" : "=r"(a1v) : "0"(arg1));
pos = arg2;
if (!(a1v & 1)) {
var_t0 = (s16) arg2 - (*(s16 **)&D_8017F198)[1];
var_v1 = var_t0;
var_a3 = -(*(s16 **)&D_8017F1A4)[1];
} else {
var_a3 = (*(s16 **)&D_8017F1A4)[1];
var_v1 = (*(s16 **)&D_8017F198)[1] - (s16) arg2;
var_t0 = -var_v1;
}
b8 = (*(s16 **)&D_8017F1A4);
ac = (*(u16 **)&D_8017F198);
b4 = D_8017F1A0;
temp_a1 = -var_v1;
r = (temp_a1 * b8[0]) / var_a3;
b4[0] = ac[0] + r;
b4[1] = ac[1] + var_t0;
r = (temp_a1 * b8[2]) / var_a3;
temp_v0 = ac[2] + r;
b4[2] = temp_v0;
temp_v1 = b4[0];
if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) {
return 0;
}
if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) {
return 0;
}
if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) {
return 0;
}
if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) {
return 0;
}
if (arg1 & 0x8000) {
p = (*(u16 **)&D_8017F19C);
b4[0] = (s16) p[0];
b4[2] = (s16) p[2];
}
D_801152AC = 0;
(*(s16 *)D_801152A8) = 0;
if (arg1 & 1) {
b4b = D_8017F1A0;
D_801152AA = 0xFFF;
__asm__ __volatile__("");
var_v0_3 = pos + 2;
} else {
b4b = D_8017F1A0;
D_801152AA = -0xFFF;
__asm__ __volatile__("");
var_v0_3 = pos - 2;
}
b4b[1] = var_v0_3;
__asm__ __volatile__("" :: "r"(pos));
(*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1);
D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1);
D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1);
return 1;
}
// @class: schedule
// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a
// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE
// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses
// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4]
// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the
// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo;
// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits
// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the
// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers).
extern s16 *D_8017F1A0; /* holds a pointer value (*(u16**)&D_8017F1A0) */
s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) {
extern void ApplyMatrixSV(void *m, void *v0, void *v1);
extern void ApplyRotMatrix(void *v0, void *v1);
extern u16 D_80126722;
extern s16 D_80126724;
extern s16 D_801152AA;
extern s16 D_801152AC;
s32 out[4];
u16 *pb4;
if (a0) {
ApplyMatrixSV((void *)a3, *(void **)&D_8017F1A0, *(void **)&D_8017F1A0);
ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720);
ApplyRotMatrix((void *)D_801152A8, (void *)out);
*(s16 *)D_801152A8 = out[0];
D_801152AA = out[1];
D_801152AC = out[2];
}
pb4 = *(u16 **)&D_8017F1A0;
*(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48);
*(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C);
*(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50);
*(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48);
D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C);
D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50);
}
DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */
DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */
DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */
DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */
DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */
extern unsigned short D_800B99F0;
extern void (*D_8017F1B4[])(void);
void func_80136C54(void)
{
D_8017F1B4[D_800B99F0]();
}
// @class: struct
// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801A3488 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb).
typedef struct { char s[10]; } S10_80136C90;
s32 func_80136C90()
{
extern void func_8001534C(int, void *, int, int, int, int);
extern S10_80136C90 D_801A3488;
S10_80136C90 buf = D_801A3488;
func_8001534C(0, &buf, 0x78, 0x10, 0, 0);
}
DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */
DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */
DEFINE_func_80136DFC() /* dedup: shared engine-core @0x80136DFC (src/shared) */
DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */
DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80136F3C);
DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80137178);
DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */
DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80137614);
DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */
DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801376E8);
DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */
DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801378F0);
DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */
DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */
// @class: regalloc-order (walker-family, §52/§52a) — PIN-FREE
// Role-swap ($s0<->$s2 between loop1 and loops2/3) is driven by DENSITY (K2), not pins:
// - loop1 pointer has an extra ref (p != D_80127524 compare) -> wins $s0; index -> $s2
// - loop2/3 index has >= pointer refs -> wins $s0; pointer -> $s2
// Separate per-loop pointer/index vars => separate pseudos => can take different regs.
extern void func_80138BE0(s32 a0);
extern void func_80137BD8(s32 a0);
extern void func_8013A380(void);
void func_801379FC(void) {
extern s32 D_80127524;
extern s32 D_80127548[];
extern s32 D_801269F0;
extern s16 D_801269F4;
extern s32 D_801269F8;
s32 i;
(*(s32 *)D_80127548) = 0x24;
if ((D_80127524 != 0) && (*(s32 *)D_80127524 != 0)) {
s32 p;
s32 idx;
func_80138BE0(D_80127524);
i = 0;
p = (s32)&D_801269F0;
idx = 0;
do {
if ((p != D_80127524) && (*(s32 *)((s32)&D_801269F0 + idx) != 0)) {
func_80138BE0(p);
}
p = p + 0x4c;
i = i + 1;
idx = idx + 0x4c;
} while (i < 3);
} else {
s32 p;
s32 idx;
i = 0;
p = (s32)&D_801269F0;
idx = 0;
do {
if (*(s32 *)((s32)&D_801269F0 + idx) != 0) {
func_80138BE0(p);
}
p = p + 0x4c;
i = i + 1;
idx = idx + 0x4c;
} while (i < 3);
}
{
s32 p;
s32 idx;
s32 flags;
i = 0;
p = (s32)&D_801269F0;
idx = 0;
do {
if (*(s16 *)((s32)&D_801269F4 + idx) != 0) {
if (*(s32 *)((s32)&D_801269F0 + idx) != 0) {
flags = *(s32 *)((s32)&D_801269F8 + idx);
if ((flags & 0x1000) != 0) {
if ((flags & 0x2000) == 0) {
func_80137BD8(p);
}
}
}
}
p = p + 0x4c;
i = i + 1;
idx = idx + 0x4c;
} while (i < 3);
}
func_8013A380();
}
// @class: remat
// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer
extern s32 D_80127548[];
extern int D_8017F208;
extern int D_801269F0;
extern void func_80138BE0(int p);
void func_80137B80(void) {
int *p = &D_801269F0;
(*(int *)&D_80127548) = 0x24;
if (*p != 0) {
((void (*)(int *))func_80138BE0)(p);
}
D_8017F208 += 1;
}
DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */
// @class: plumbing
// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60.
extern unsigned char D_80126A0E;
extern short D_80126A0A;
extern s16 D_801269F4;
extern int D_800A5E60;
extern int D_8017F208;
extern int D_801269F0;
extern void func_801392FC();
extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2);
extern void func_80139680(s32 a0, u8 *a1);
int func_80137D08(int arg0, int arg1, short arg2)
{
unsigned char buf[3];
D_800A5E60 = arg0;
D_80126A0A = arg2;
((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1);
if ((*(short *)&D_801269F4) == 7) {
buf[0] = 0x39;
buf[1] = 0xFF;
buf[2] = 0x71;
((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1);
} else if ((*(short *)&D_801269F4) == 3) {
if (D_8017F208 & 4) {
((void (*)(void *, int))func_80139680)(&D_801269F0, arg1);
}
}
return D_800A5E60;
}
DEFINE_func_80137DD4() /* dedup: shared engine-core @0x80137DD4 (src/shared) */
DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */
File diff suppressed because it is too large Load Diff