mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-28 06:49:47 -04:00
feat(phase-30): T2 carve-within-a-carve PROVEN end-to-end; Arm-A does not bite; 3 -O0 fns banked
T2's central unknown is resolved, and it is NOT what the phase plan predicted. The plan
named the Arm-A splat `%lo +0x20` defect as T2's real substance. Four probes, each
isolating ONE variable, SHA vs config/check from a clean tree (SS125 rules):
1. sub-split the jr object at ARBITRARY addresses, pure -O2 -> BYTE-IDENTICAL
** the re-carve is NEUTRAL; Arm-A does not bite here **
2. same split, middle region routed to -O0 -> DIVERGED (2 vars at once)
3. same NAME as probe 1, only the -O0 flag added -> DIVERGED
** therefore the FLAG, not the subseg name **
4. -O0 regions cut to EXCLUDE the matched bodies -> BYTE-IDENTICAL
** route PROVEN end-to-end **
THE REAL OBSTACLE: an address range is not an optimization region. Interleaved among the
15 -O0 stubs at 0x80183CF0..0x80184920 are TWO already-MATCHED functions (func_80184440,
func_801848E4) that expand from engine_core.h and compile at -O2. Flipping the FILE to -O0
recompiles them too. Cut around them and it is byte-clean.
MY EARLIER "15 contiguous -O0 fns, clean cut" WAS AN UNDER-COUNT (R14 on myself): I derived
it by scanning asm/**/*.s for the frame-pointer prologue, and a MATCHED function emits no
.s -- so the scan was structurally blind to exactly the bodies that break the flip. Same
shape as SS124. Any T2 driver must derive -O0 bounds as (address range MINUS already-matched
bodies), never from an asm scan.
BANKED (3, whole-binary gate the sole arbiter): func_801846E4 + siblings func_8018473C /
func_80184794. Each global DERIVED FROM THE ASM (%hi/%lo operands), not taken from the
draft's comment; 3/3 match_one --o0 MATCH (22 ins) with a -O2 control showing the mismatch;
3/3 verified through harvest_verify; bank truth read from the SOURCE (SS55b trap 4).
MAKEFILE: the -O0 glob widened `ov_*_o0b.c` -> `ov_*_o0?.c` so ANY lettered -O0 sub-split is
covered by one rule. A MISSED rule is silent -- the region would compile -O2 and every
residual it produced would be a pure artifact (SS116). corpus.o0_sources() re-verified: 137
sources, resolves `?` via glob, both pre-existing rules intact.
CONFIG: ov_SC03_014_jr_8017EB7C sub-split into 5 regions (pre / _o0c / matched-O2 /
_o0d / post), reusing jr_isolate_all's plan+build_new_config+validation verbatim so the
carve-repoint and source-repartition semantics are the proven ones.
R22 CLEAN-FLEET: extract-all 139/139 (+main) ; check-all 140 passed, 0 failed of 140.
This commit is contained in:
@@ -579,7 +579,15 @@ build/src/ov_SC01_077/ov_SC01_077_o0.o: CC1FLAGS := -quiet -O0 -G0 -mips1 -mcpu=
|
||||
# overlay (reach-134), carved into its own object <ov>_o0b by each overlay's splat config; the
|
||||
# struct-assign memcpy matches only at -O0. One wildcard rule -O0-compiles all overlays' _o0b.o
|
||||
# (the ×134 rollout; tools/rollout_whale_o0.py). All share src/shared/func_80144B9C.h.
|
||||
WHALE_O0B_OBJS := $(patsubst src/%.c,build/src/%.o,$(wildcard src/ov_*/ov_*_o0b.c))
|
||||
#
|
||||
# P30 T2: the glob is `_o0?` (was `_o0b`) so ANY lettered -O0 sub-split is covered by this one rule.
|
||||
# A 4th -O0 region was found inside an -O2 jr split (0x80183CF0..0x80184920, 15 contiguous fns in
|
||||
# ov_SC03_014 + ov_SC03_015) — the "carve within a carve": the containing object is sub-split into
|
||||
# pre/-O0/post and the middle region named <ov>_o0c. Without the widened glob each new region would
|
||||
# need its own hand-added rule, and a MISSED rule is silent: the region compiles at -O2 and every
|
||||
# residual it produces is a pure artifact (§116 — opt level is a property of the FILE).
|
||||
# corpus.o0_sources() parses this rule and resolves `?` via glob, so the -O0 oracle stays correct.
|
||||
WHALE_O0B_OBJS := $(patsubst src/%.c,build/src/%.o,$(wildcard src/ov_*/ov_*_o0?.c))
|
||||
$(WHALE_O0B_OBJS): CC1FLAGS := -quiet -O0 -G0 -mips1 -mcpu=3000 -mgas -msoft-float -fgnu-linker
|
||||
|
||||
# Phase-29 T2 Arm A: the -O0 cluster (0x8013B568..0x8013C98C) carved per single-file overlay into
|
||||
@@ -751,3 +759,4 @@ clean:
|
||||
@rm -rf build expected asm assets undefined_syms_auto.txt undefined_funcs_auto.txt
|
||||
@rm -f include/include_asm.h include/macro.inc include/labels.inc include/gte_macros.inc
|
||||
@echo "clean: removed build/, expected/, and the regenerated splat tree (asm/, assets/, include macros, undefined_*_auto.txt)."
|
||||
|
||||
|
||||
@@ -119,6 +119,10 @@ segments:
|
||||
- [0x52354, c, ov_SC03_014_jr_8017A4AC]
|
||||
- [0x52cd4, c, ov_SC03_014_jr_8017AE2C]
|
||||
- [0x56a24, c, ov_SC03_014_jr_8017EB7C]
|
||||
- [0x5bb98, c, ov_SC03_014_o0c]
|
||||
- [0x5c2e8, c, ov_SC03_014_jr_80184440]
|
||||
- [0x5c31c, c, ov_SC03_014_o0d]
|
||||
- [0x5c78c, c, ov_SC03_014_jr_801848E4]
|
||||
- [0x633c8, data, tail]
|
||||
- [0xc0050, .rodata, ov_SC03_014] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||||
- [0xc012c, .rodata, ov_SC03_014_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||||
|
||||
@@ -4388,746 +4388,3 @@ void func_80183B58(s32 param_1, s16 *param_2) {
|
||||
*(s32 *)(param_1 + 0x40) = (s32)svec_out.vy;
|
||||
*(s32 *)(param_1 + 0x44) = (s32)svec_out.vz;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80183CF0);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80183D50);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80183F28);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184028);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184058);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184264);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801842E0);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184354);
|
||||
|
||||
DEFINE_func_80184440() /* dedup: shared engine-core @0x80184440 (src/shared) */
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184474);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184538);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801846E4);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018473C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184794);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801847EC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184868);
|
||||
|
||||
DEFINE_func_801848E4() /* dedup: shared engine-core @0x801848E4 (src/shared) */
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184920);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184A08);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184D1C);
|
||||
|
||||
#include "common.h"
|
||||
|
||||
extern u8 D_801CF780[];
|
||||
extern void func_800183E0(s32 a0);
|
||||
|
||||
void func_80184DA4(s32 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 u16 D_800B99DA;
|
||||
extern u8 D_8018FE40[];
|
||||
*(u8 *)(*(s32 *)(param_1 + 0xCC) + 0x27) = 0x8A;
|
||||
func_800183E0((s32)&D_801CF780[D_8018FE40[D_800B99DA & 0x1F] * 16]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern void func_800183E0(s32 a0);
|
||||
|
||||
void func_80184DF8(s32 param_1) {
|
||||
|
||||
extern u16 D_800B99DA;
|
||||
extern u8 D_8018FE40[];
|
||||
extern u8 D_801CF680[];
|
||||
*(u8 *)(*(s32 *)(param_1 + 0xD0) + 0x27) = 0x8B;
|
||||
func_800183E0((s32)&D_801CF680[D_8018FE40[D_800B99DA & 0x1F] * 16]);
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184E4C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80184F14);
|
||||
|
||||
|
||||
extern void (*D_80190008[])(void);
|
||||
|
||||
void func_80185144(void *a0) {
|
||||
D_80190008[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185180);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185380);
|
||||
|
||||
DEFINE_func_8018553C() /* dedup: shared engine-core @0x8018553C (src/shared) */
|
||||
|
||||
|
||||
|
||||
extern s32 D_801EAEE4;
|
||||
s32 func_80185578(void) {
|
||||
return 0x2 - D_801EAEE4;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018558C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801855A0);
|
||||
|
||||
DEFINE_func_801856B4() /* dedup: shared engine-core @0x801856B4 (src/shared) */
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801856C4);
|
||||
|
||||
|
||||
extern s32 func_8001AAA0(s32 arg);
|
||||
s32 func_80185744(void) {
|
||||
return func_8001AAA0(0x51) != 0;
|
||||
}
|
||||
|
||||
|
||||
extern s32 func_8001AAA0(s32 arg);
|
||||
s32 func_80185764(void) {
|
||||
return func_8001AAA0(0x52) != 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern s32 func_8001AAA0(s32 arg);
|
||||
s32 func_80185784(void) {
|
||||
return func_8001AAA0(0x56) != 0;
|
||||
}
|
||||
|
||||
|
||||
extern s32 func_80184868(void);
|
||||
s32 func_801857A4(void) {
|
||||
return func_80184868() != 0;
|
||||
}
|
||||
|
||||
|
||||
extern void func_800D0C48(int);
|
||||
void func_801857C4(void) {
|
||||
func_800D0C48(0x1);
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801857E4);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185858);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801858D4);
|
||||
|
||||
|
||||
extern s32 func_80184868(void);
|
||||
void func_8018597C(void *a0) {
|
||||
if (((s32 (*)(s32))func_80184868)((s32)a0)) {
|
||||
*(s16 *)((u8 *)a0 + 0x2) = 0x3;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801859B0);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185A0C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185B44);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80185EF8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801863B8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018655C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801867F8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80186A74);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80186C4C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187090);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187300);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801874C0);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187884);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187A98);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187CA8);
|
||||
|
||||
|
||||
extern void (*D_80191890[])(void);
|
||||
|
||||
void func_80187D80(void *a0) {
|
||||
D_80191890[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187DBC);
|
||||
|
||||
DEFINE_func_80187E28() /* dedup: shared engine-core @0x80187E28 (src/shared) */
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187E3C);
|
||||
|
||||
extern void func_80187EE8(s32 a0);
|
||||
extern s32 func_8012BEE8(s32 a0);
|
||||
extern void func_8012C218(void*);
|
||||
void func_80187EA8(s32 a0) {
|
||||
func_80187EE8(a0);
|
||||
if (func_8012BEE8(a0)) {
|
||||
((void (*)(s32))func_8012C218)(a0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80187EE8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801880F8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188118);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188168);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801881CC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188290);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188350);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801883AC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188404);
|
||||
|
||||
DEFINE_func_80188470() /* dedup: shared engine-core @0x80188470 (src/shared) */
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188478);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018858C);
|
||||
|
||||
|
||||
extern void (*D_801918B0[])(void);
|
||||
|
||||
void func_80188634(void *a0) {
|
||||
D_801918B0[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188670);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188828);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801889B4);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188A80);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188B94);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188C0C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188C60);
|
||||
|
||||
|
||||
s32 func_80188CA0(s32 arg0) {
|
||||
return *(u16*)(arg0 + 0x2) == 0x6;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188CB4);
|
||||
|
||||
extern void func_8012AD44(s32 *a0, s16 a1);
|
||||
void func_80188D64(void *arg0) {
|
||||
((void (*)(s32, s32))func_8012AD44)((s32)arg0, 0x8);
|
||||
}
|
||||
|
||||
|
||||
extern void func_8018473C(void);
|
||||
void func_80188D84(void) {
|
||||
func_8018473C();
|
||||
}
|
||||
|
||||
|
||||
extern s32 func_8013CAE8(void);
|
||||
void func_80188DA4(void) {
|
||||
func_8013CAE8();
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern void (*D_80191B84[])(void);
|
||||
|
||||
void func_80188DC4(void *a0) {
|
||||
D_80191B84[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188E00);
|
||||
|
||||
DEFINE_func_80188F18() /* dedup: shared engine-core @0x80188F18 (src/shared) */
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188F28);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188F80);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80188FB4);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189050);
|
||||
|
||||
extern void func_8017BEBC(void);
|
||||
void func_801890B8(void) {
|
||||
func_8017BEBC();
|
||||
}
|
||||
|
||||
|
||||
extern void func_8017BFA0(void);
|
||||
void func_801890D8(void) {
|
||||
func_8017BFA0();
|
||||
}
|
||||
|
||||
|
||||
DEFINE_func_801890F8() /* dedup: shared engine-core @0x801890F8 (src/shared) */
|
||||
|
||||
DEFINE_func_80189104() /* dedup: shared engine-core @0x80189104 (src/shared) */
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189110);
|
||||
|
||||
|
||||
extern void func_8002D4C8(s32 arg0, s32 arg1);
|
||||
void func_80189160(void *a0) {
|
||||
*(s16 *)((s32)a0 + 0x2) = 0x4;
|
||||
func_8002D4C8(0x87C, 0);
|
||||
}
|
||||
|
||||
|
||||
DEFINE_func_8018918C() /* dedup: shared engine-core @0x8018918C (src/shared) */
|
||||
|
||||
|
||||
|
||||
// @class: struct
|
||||
// @stuck: none — MATCH expected; param_1 survives jal in $s0, table fp-call with %lo-fold
|
||||
extern void func_801891E8(u8 *a0);
|
||||
extern void (*D_80191BD4[])(int);
|
||||
|
||||
void func_8018919C(int param_1)
|
||||
{
|
||||
((void (*)(void))func_801891E8)();
|
||||
D_80191BD4[*(unsigned short *)(param_1 + 2)](param_1);
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801891E8);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189238);
|
||||
|
||||
DEFINE_func_801892D4() /* dedup: shared engine-core @0x801892D4 (src/shared) */
|
||||
|
||||
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_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189310);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801893BC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018942C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801894BC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018950C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801895BC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189630);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189680);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018973C);
|
||||
|
||||
extern s32 func_80189110(void);
|
||||
void func_801897A4(void) {
|
||||
func_80189110();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801897C4);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189824);
|
||||
|
||||
#include "common.h"
|
||||
|
||||
DEFINE_func_801898BC() /* dedup: shared engine-core @0x801898BC (src/shared) */
|
||||
|
||||
|
||||
|
||||
extern void (*D_80191C0C[])(void);
|
||||
|
||||
void func_80189970(void *a0) {
|
||||
D_80191C0C[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_801899AC);
|
||||
|
||||
|
||||
// @class: plumbing
|
||||
// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call
|
||||
|
||||
extern void func_8012C1B8(void);
|
||||
extern void func_8012CAE4(void *a0);
|
||||
extern void func_8001C214(int, int);
|
||||
extern int D_80191BFC;
|
||||
|
||||
void func_801899F4(int param_1)
|
||||
{
|
||||
int v0;
|
||||
|
||||
v0 = ((int (*)(void))func_8012C1B8)();
|
||||
*(int *)(param_1 + 0x20) = v0;
|
||||
if (v0 == 0) {
|
||||
((void (*)(int))func_8012CAE4)(param_1);
|
||||
} else {
|
||||
func_8001C214(v0, 0);
|
||||
*(int *)(param_1 + 0x58) = (int)&D_80191BFC;
|
||||
*(short *)(param_1 + 0x5c) = 0x80;
|
||||
*(unsigned short *)(param_1 + 2) += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189A60);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189AC4);
|
||||
|
||||
|
||||
extern void (*D_801E3298[])(void);
|
||||
|
||||
void func_80189B3C(void *a0) {
|
||||
D_801E3298[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189B78);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189C4C);
|
||||
|
||||
DEFINE_func_80189C74() /* dedup: shared engine-core @0x80189C74 (src/shared) */
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189C7C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189DC8);
|
||||
|
||||
|
||||
extern void func_8012C218(void *a0);
|
||||
s32 func_80189EE8(void * arg0)
|
||||
{
|
||||
*(short *)((char *)arg0 + 0x2) = 2;
|
||||
((void (*)(s32 *))func_8012C218)(*(s32 **)((char *)arg0 + 0xcc));
|
||||
}
|
||||
|
||||
|
||||
void func_80189F14(void *a0) {
|
||||
*(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 1;
|
||||
}
|
||||
|
||||
|
||||
void func_80189F24(void *a0) {
|
||||
*(short *)(*(int *)((char *)a0 + 0x6c) + 0xfe) = 2;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189F34);
|
||||
|
||||
|
||||
extern s32 D_80126B58;
|
||||
extern void func_8014ADA8(s32 a0, s32 a1);
|
||||
|
||||
void func_80189F74(void * arg0) {
|
||||
s32 temp_v0;
|
||||
|
||||
temp_v0 = *(s32 *)((s32)arg0 + 0xdc);
|
||||
((void (*)(s32 *, s32))func_8014ADA8)((s32 *)&D_80126B58, *(u16 *)(temp_v0 + 0xc));
|
||||
}
|
||||
|
||||
|
||||
extern s16 func_80174764(void);
|
||||
s32 func_80189FA8(void) {
|
||||
return ((s32 (*)(void))func_80174764)() == 1;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_80189FCC);
|
||||
|
||||
|
||||
extern void (*D_801E32C0[])(void);
|
||||
|
||||
void func_8018A030(void *a0) {
|
||||
D_801E32C0[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A06C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A0F4);
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* func_8018A1B4 — guarded state-kick: if the s16 at 0x98 is clear, set the
|
||||
* state word at 0x02 to 1, hand the entity to func_8012A828 with one of two
|
||||
* script tables selected by the s16 flag at 0xFE (== 1 -> D_801E3980, else
|
||||
* D_801E3760), then clear that flag.
|
||||
*
|
||||
* §71 sibling-first: func_8018A06C (same TU, 0x148 bytes earlier) is the same
|
||||
* two-arm `func_8012A828(entity, D_801E3980 / D_801E3760)` selector and pins
|
||||
* the widths: `lh` at 0x98/0xFE, `sh` at 0x02.
|
||||
*/
|
||||
|
||||
extern void func_8012A828(s32 a0, void *a1);
|
||||
extern u8 D_801E3980[];
|
||||
extern u8 D_801E3760[];
|
||||
|
||||
void func_8018A1B4(void *a0) {
|
||||
if (*(s16 *)((s32)a0 + 0x98) == 0) {
|
||||
*(s16 *)((s32)a0 + 0x2) = 1;
|
||||
if (*(s16 *)((s32)a0 + 0xFE) == 1) {
|
||||
func_8012A828((s32)a0, D_801E3980);
|
||||
} else {
|
||||
func_8012A828((s32)a0, D_801E3760);
|
||||
}
|
||||
*(s16 *)((s32)a0 + 0xFE) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A224);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A31C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A390);
|
||||
|
||||
|
||||
extern void (*D_801E3A24[])(void);
|
||||
|
||||
void func_8018A5B0(void *a0) {
|
||||
D_801E3A24[*(u16 *)((s32)a0 + 0x2)]();
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A5EC);
|
||||
|
||||
void func_8018A680(void) {
|
||||
|
||||
extern s16 D_801EADEC;
|
||||
s16 *p = &D_801EADEC;
|
||||
s32 i = 0xF;
|
||||
do {
|
||||
*p = 0;
|
||||
p = (s16 *)((s32)p + 0xe);
|
||||
i--;
|
||||
} while (i >= 0);
|
||||
}
|
||||
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* func_8018A6A4 — cookbook §71 (sibling-first).
|
||||
* func_8018A744 is ALREADY MATCHED in the same TU
|
||||
* (src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c L4221) as a 3-arg
|
||||
* `void func_8018A744(s32, s32, s32)`, so the untouched $a3 at the first
|
||||
* jal is just the incoming arg3 living on, not a 4th argument.
|
||||
* func_8018A860 (asm, same TU) reads its 2nd arg as lhu+0 / lhu+2 / lh+4 /
|
||||
* lh+6 => the sp+0x10 local is a 4 x s16 record.
|
||||
*
|
||||
* Two levers took it 32 -> 2 -> 0 (match_one MATCH, rtu_match MATCH):
|
||||
* 1. LENGTH-DRIFT (-2, cookbook §78): writing `sp10.unk2 = i * 0x100`
|
||||
* leaves gcc-2.7.2 recomputing `sll v0,s1,8` instead of building the
|
||||
* strength-reduced giv, so only s0..s3 get saved and the frame is two
|
||||
* instructions short. An EXPLICIT accumulator (`ang += 0x100`) forces
|
||||
* the second callee-saved register ($s2) and restores sw/lw $s4.
|
||||
* 2. REGALLOC-PERM $s1>$s2 (cookbook §3-T2, source order drives emission):
|
||||
* `ang = 0;` on its own line before the loop emits the $s2 zero-init
|
||||
* FIRST. Folding it into the for-init (`for (i = 0, ang = 0; ...)`)
|
||||
* puts $s1's zero-init first, which is the target order.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
s16 unk0;
|
||||
s16 unk2;
|
||||
s16 unk4;
|
||||
s16 unk6;
|
||||
} Rec_8018A6A4;
|
||||
|
||||
extern void func_8018A744(s32 arg0, s32 arg1, s32 arg2);
|
||||
extern void func_8018A860(s32 arg0, Rec_8018A6A4 *arg1, s32 arg2, s32 arg3);
|
||||
|
||||
void func_8018A6A4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) {
|
||||
Rec_8018A6A4 sp10;
|
||||
s32 i;
|
||||
s32 ang;
|
||||
|
||||
func_8018A744(arg0, 0x1000, 0);
|
||||
sp10.unk0 = *(u16 *)(arg3 + 0x0);
|
||||
sp10.unk4 = *(u16 *)(arg3 + 0x2);
|
||||
sp10.unk6 = 1;
|
||||
for (i = 0, ang = 0; i < 16; i++) {
|
||||
sp10.unk2 = ang;
|
||||
func_8018A860(i, &sp10, arg1, arg2);
|
||||
ang += 0x100;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern s16 D_801EADE4;
|
||||
extern s16 D_801EADE6;
|
||||
extern s16 D_801EADE8;
|
||||
extern s16 D_801EADEA;
|
||||
void func_8018A744(s32 arg0, s32 arg1, s32 arg2) {
|
||||
D_801EADE4 = *(u16 *)((s32)arg0 + 0x0);
|
||||
D_801EADE6 = *(u16 *)((s32)arg0 + 0x2);
|
||||
D_801EADE8 = arg1;
|
||||
D_801EADEA = arg2;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A774);
|
||||
|
||||
extern s16 D_801EADEA;
|
||||
void func_8018A7EC(s32 arg0) {
|
||||
M2C_FIELD(&D_801EADEA, s16 *, 0) += arg0;
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A808);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A860);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A934);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018A970);
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/* func_8018A9BC — 16-entry table walk, stride 0xE, over D_801EADEC.
|
||||
* §71 sibling: func_8018A680 (same TU, L4199) already matched the
|
||||
* `extern s16 D_801EADEC; s16 *p = &D_801EADEC; p = (s16*)((s32)p+0xe)`
|
||||
* shape over the very same array — copy that walker verbatim.
|
||||
*
|
||||
* Two induction registers in the target ($s1 = base+0, $s0 = base+4) are NOT
|
||||
* two source pointers: $s1 is the user pointer (the biv, used for the +0
|
||||
* accesses) and $s0 is loop.c's single COMBINED address giv for the
|
||||
* {+4, +9, +13} group (offsets 0/5/9 off $s0). Declaring a second pointer
|
||||
* splits that group and costs a third register (iter 1: 53 mismatches).
|
||||
*/
|
||||
|
||||
extern s16 D_801EADEC;
|
||||
extern void func_8018AA98(s32 arg0);
|
||||
|
||||
void func_8018A9BC(void) {
|
||||
s16 *p = &D_801EADEC;
|
||||
s32 i = 0;
|
||||
s16 t;
|
||||
|
||||
do {
|
||||
if (*(u16 *)p != 0) {
|
||||
func_8018AA98(i);
|
||||
switch (*(u8 *)((s32)p + 9)) {
|
||||
case 1:
|
||||
if (*(s16 *)((s32)p + 4) < *(u8 *)((s32)p + 13)) {
|
||||
*(s16 *)((s32)p + 4) = *(s16 *)((s32)p + 4) + 8;
|
||||
} else {
|
||||
*(u8 *)((s32)p + 9) = 0;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
t = *(s16 *)((s32)p + 4);
|
||||
if (t != 0) {
|
||||
t -= 0x10;
|
||||
*(s16 *)((s32)p + 4) = t;
|
||||
if (t > 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
*p = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
p = (s16 *)((s32)p + 0xe);
|
||||
} while (i < 0x10);
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AA98);
|
||||
|
||||
void func_8018AD5C(void) {
|
||||
|
||||
extern s16 D_801EACE4;
|
||||
s16 *p = &D_801EACE4;
|
||||
s32 i = 0xF;
|
||||
do {
|
||||
*p = 0;
|
||||
p = (s16 *)((s32)p + 0x10);
|
||||
i--;
|
||||
} while (i >= 0);
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AD80);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018ADA8);
|
||||
|
||||
extern void func_8018AE9C(void *a0, void *a1, s16 a2);
|
||||
extern void func_8018AFD0(s32 a0, s16 a1, u16 a2);
|
||||
|
||||
void func_8018AE30(void *arg0, void *arg1, s32 arg2, s32 arg3) {
|
||||
/* The target frame is 0x30: 0x10 outgoing-arg area + 0x10 var_size +
|
||||
* 0x10 saved regs (s0/s1/s2/ra at 0x20..0x2C). gcc-2.7.2 allocates a
|
||||
* declared aggregate even when it is never referenced, so this 16-byte
|
||||
* local reproduces the original's var_size exactly. */
|
||||
s32 unused[4];
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
func_8018AE9C(arg0, arg1, arg2);
|
||||
for (i = 0, j = 0; i < 0x10; i++, j += 0x100) {
|
||||
func_8018AFD0(i, j, arg3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AE9C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AF0C);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AF84);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018AFD0);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018B0EC);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018B128);
|
||||
|
||||
INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017EB7C", func_8018B23C);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user