feat(phase-30 S38): wave-6 propagation — func_8017EA84 x2 sibling slots

jtbl_family_bank (the §53 carve path; family_sweep --hseq refuses has_mid_jr
families by design). Each sibling individually byte-gated: carve -> extract ->
remap -> whole-binary build, kept iff byte-identical else reverted. Committed here
because jtbl_family_bank requires a clean tree between families (its per-sibling
revert restores from HEAD). R22 clean-fleet runs once over the whole batch.
This commit is contained in:
Drew T
2026-08-04 17:55:31 -06:00
parent 81c5cc559a
commit 7247c68b60
7 changed files with 6914 additions and 100 deletions
+4 -2
View File
@@ -21,7 +21,7 @@ ov_SC01_077_ELF := $(ov_SC01_077_OUT).elf
ov_SC01_077_MAPFILE := $(ov_SC01_077_OUT).map
ov_SC01_077_LD_SCRIPT := $(ov_SC01_077_OUT).ld
ov_SC01_077_SPLAT_YAML := config/splat.ov_SC01_077.yaml
ov_SC01_077_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_077_a.o,ov_SC01_077_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_80135888.o,tail3.data.o,ov_SC01_077_jr_80135A4C.o,tail4.data.o,ov_SC01_077_jr_80135D20.o,tail5.data.o,ov_SC01_077_jr_801380E0.o,ov_SC01_077_o0.o,tail6.data.o,ov_SC01_077.o,tail7.data.o,ov_SC01_077_jr_8015444C.o,ov_SC01_077_jr_80154C24.o,ov_SC01_077_jr_801588CC.o,ov_SC01_077_jr_80159C84.o,tail8.data.o,ov_SC01_077_jr_8015A3C8.o,tail9.data.o,ov_SC01_077_jr_8015AE2C.o,tail10.data.o,ov_SC01_077_jr_8015C32C.o,tail11.data.o,ov_SC01_077_jr_8016AB6C.o,tail12.data.o,ov_SC01_077_jr_80171B4C.o,ov_SC01_077_jr_801734BC.o,tail13.data.o,ov_SC01_077_jr_801789AC.o,ov_SC01_077_jr_80178D40.o,tail14.data.o,ov_SC01_077_jr_8017A4AC.o,tail15.data.o,ov_SC01_077_jr_8017AE2C.o,tail16.data.o,ov_SC01_077_jr_80182268.o,tail17.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC01_077_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_077_a.o,ov_SC01_077_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_80135888.o,tail3.data.o,ov_SC01_077_jr_80135A4C.o,tail4.data.o,ov_SC01_077_jr_80135D20.o,tail5.data.o,ov_SC01_077_jr_801380E0.o,ov_SC01_077_o0.o,tail6.data.o,ov_SC01_077.o,tail7.data.o,ov_SC01_077_jr_8015444C.o,ov_SC01_077_jr_80154C24.o,ov_SC01_077_jr_801588CC.o,ov_SC01_077_jr_80159C84.o,tail8.data.o,ov_SC01_077_jr_8015A3C8.o,tail9.data.o,ov_SC01_077_jr_8015AE2C.o,tail10.data.o,ov_SC01_077_jr_8015C32C.o,tail11.data.o,ov_SC01_077_jr_8016AB6C.o,tail12.data.o,ov_SC01_077_jr_80171B4C.o,ov_SC01_077_jr_801734BC.o,tail13.data.o,ov_SC01_077_jr_801789AC.o,ov_SC01_077_jr_80178D40.o,tail14.data.o,ov_SC01_077_jr_8017A4AC.o,tail15.data.o,ov_SC01_077_jr_8017AE2C.o,tail16.data.o,ov_SC01_077_jr_8018103C.o,tail17.data.o,ov_SC01_077_jr_80182268.o,tail18.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC01_077/ov_SC01_077.o: JTBL_PADS := 0,0,4,0,4,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38,+0x58,+0x70,+0x90,+0xa8
build/src/ov_SC01_077/ov_SC01_077_a.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14
build/src/ov_SC01_077/ov_SC01_077_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0
@@ -33,6 +33,7 @@ build/src/ov_SC01_077/ov_SC01_077_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (
build/src/ov_SC01_077/ov_SC01_077_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC01_077/ov_SC01_077_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC01_077/ov_SC01_077_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178
build/src/ov_SC01_077/ov_SC01_077_jr_8018103C.o: JTBL_PADS := 0,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x38,+0x58
build/src/ov_SC01_077/ov_SC01_077_o0.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118
ov_SC01_077_CHECK_SHA := config/check.ov_SC01_077.sha
ov_SC01_077_SYMBOLS := config/symbols.ov_SC01_077.txt
@@ -267,7 +268,7 @@ ov_SC02_003_ELF := $(ov_SC02_003_OUT).elf
ov_SC02_003_MAPFILE := $(ov_SC02_003_OUT).map
ov_SC02_003_LD_SCRIPT := $(ov_SC02_003_OUT).ld
ov_SC02_003_SPLAT_YAML := config/splat.ov_SC02_003.yaml
ov_SC02_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_003.o,ov_SC02_003_jr_8012ACE0.o,tail2.data.o,ov_SC02_003_jr_80135888.o,tail3.data.o,ov_SC02_003_jr_80135A4C.o,tail4.data.o,ov_SC02_003_jr_80135D20.o,tail5.data.o,ov_SC02_003_jr_801380E0.o,ov_SC02_003_o0c.o,tail6.data.o,ov_SC02_003_jr_8013F350.o,tail7.data.o,ov_SC02_003_jr_8013FFD8.o,tail8.data.o,ov_SC02_003_jr_80140608.o,tail9.data.o,ov_SC02_003_jr_8015444C.o,ov_SC02_003_jr_80154C24.o,ov_SC02_003_jr_801588CC.o,ov_SC02_003_jr_80159C84.o,tail10.data.o,ov_SC02_003_jr_8015A3C8.o,tail11.data.o,ov_SC02_003_jr_8015AE2C.o,tail12.data.o,ov_SC02_003_jr_8015C32C.o,tail13.data.o,ov_SC02_003_jr_8016AB6C.o,tail14.data.o,ov_SC02_003_jr_80171B4C.o,ov_SC02_003_jr_801734BC.o,tail15.data.o,ov_SC02_003_jr_801789AC.o,ov_SC02_003_jr_80178D40.o,tail16.data.o,ov_SC02_003_jr_8017A4AC.o,tail17.data.o,ov_SC02_003_jr_8017AE2C.o,tail18.data.o,ov_SC02_003_jr_8017FCB0.o,tail19.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC02_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_003.o,ov_SC02_003_jr_8012ACE0.o,tail2.data.o,ov_SC02_003_jr_80135888.o,tail3.data.o,ov_SC02_003_jr_80135A4C.o,tail4.data.o,ov_SC02_003_jr_80135D20.o,tail5.data.o,ov_SC02_003_jr_801380E0.o,ov_SC02_003_o0c.o,tail6.data.o,ov_SC02_003_jr_8013F350.o,tail7.data.o,ov_SC02_003_jr_8013FFD8.o,tail8.data.o,ov_SC02_003_jr_80140608.o,tail9.data.o,ov_SC02_003_jr_8015444C.o,ov_SC02_003_jr_80154C24.o,ov_SC02_003_jr_801588CC.o,ov_SC02_003_jr_80159C84.o,tail10.data.o,ov_SC02_003_jr_8015A3C8.o,tail11.data.o,ov_SC02_003_jr_8015AE2C.o,tail12.data.o,ov_SC02_003_jr_8015C32C.o,tail13.data.o,ov_SC02_003_jr_8016AB6C.o,tail14.data.o,ov_SC02_003_jr_80171B4C.o,ov_SC02_003_jr_801734BC.o,tail15.data.o,ov_SC02_003_jr_801789AC.o,ov_SC02_003_jr_80178D40.o,tail16.data.o,ov_SC02_003_jr_8017A4AC.o,tail17.data.o,ov_SC02_003_jr_8017AE2C.o,tail18.data.o,ov_SC02_003_jr_8017EA84.o,tail19.data.o,ov_SC02_003_jr_8017FCB0.o,tail20.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC02_003/ov_SC02_003.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14
build/src/ov_SC02_003/ov_SC02_003_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0
build/src/ov_SC02_003/ov_SC02_003_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18
@@ -280,6 +281,7 @@ build/src/ov_SC02_003/ov_SC02_003_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (
build/src/ov_SC02_003/ov_SC02_003_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC02_003/ov_SC02_003_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC02_003/ov_SC02_003_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178
build/src/ov_SC02_003/ov_SC02_003_jr_8017EA84.o: JTBL_PADS := 0,4,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18,+0x38,+0x58
build/src/ov_SC02_003/ov_SC02_003_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118
ov_SC02_003_CHECK_SHA := config/check.ov_SC02_003.sha
ov_SC02_003_SYMBOLS := config/symbols.ov_SC02_003.txt
+4 -1
View File
@@ -84,6 +84,7 @@ segments:
- [0x50be8, c, ov_SC01_077_jr_80178D40]
- [0x52354, c, ov_SC01_077_jr_8017A4AC]
- [0x52cd4, c, ov_SC01_077_jr_8017AE2C]
- [0x58ee4, c, ov_SC01_077_jr_8018103C]
- [0x5a110, c, ov_SC01_077_jr_80182268]
# Phase-26 §8 jtbl-rodata carve (cookbook §8, the LZSS precedent adapted to a flat overlay).
# gcc emits each `switch` jump table into .rodata; this overlay's jtbl island sits at the TAIL
@@ -134,8 +135,10 @@ segments:
- [0xb0f60, data, tail15]
- [0xb0f64, .rodata, ov_SC01_077_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0f78, data, tail16]
- [0xb1000, .rodata, ov_SC01_077_jr_8018103C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1078, data, tail17]
- [0xb1148, .rodata, ov_SC01_077_jr_80182268] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1168, data, tail17]
- [0xb1168, data, tail18]
- [0xB29D4, bin, trailing] # final 3 bytes (EOF 0xB29D7 not word-aligned; spimdisasm drops
# a trailing partial word and a <4-byte `data` carve emits nothing,
# so use `bin` = raw .incbin, byte-exact). Word-aligned overlays omit this.
+4 -1
View File
@@ -120,6 +120,7 @@ segments:
- [0x50be8, c, ov_SC02_003_jr_80178D40]
- [0x52354, c, ov_SC02_003_jr_8017A4AC]
- [0x52cd4, c, ov_SC02_003_jr_8017AE2C]
- [0x5692c, c, ov_SC02_003_jr_8017EA84]
- [0x57b58, c, ov_SC02_003_jr_8017FCB0]
- [0x62a58, data, tail]
- [0xbd648, .rodata, ov_SC02_003] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
@@ -163,8 +164,10 @@ segments:
- [0xbe764, data, tail17]
- [0xbe768, .rodata, ov_SC02_003_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xbe77c, data, tail18]
- [0xbe7fc, .rodata, ov_SC02_003_jr_8017EA84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xbe874, data, tail19]
- [0xbe944, .rodata, ov_SC02_003_jr_8017FCB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xbe964, data, tail19]
- [0xbe964, data, tail20]
- [0xC070C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word)
- [0xC070F] # 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
-48
View File
@@ -5169,51 +5169,3 @@ s32 func_80180F10(s32 param_1, s32 param_2) {
}
return 0;
}
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8017AE2C", func_8018103C);
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8017AE2C", func_80181948);
// @class: plumbing
// @stuck: none — MATCH expected; simple param-survives-call store sequence
extern void func_8012A828(s32 a0, void *a1);
extern char D_801B0118[];
void func_80181B58(int param_1)
{
*(short *)(param_1 + 2) = 2;
*(short *)(param_1 + 0x34) = 0;
func_8012A828(param_1, &D_801B0118);
*(int *)(param_1 + 0x1c) = 0x14;
}
// @class: plumbing
// @stuck: none — MATCH expected; param_1 survives call in $s0 naturally (single global allocno)
extern void func_8012A828(s32 a0, void *a1);
extern s32 D_801B0D50;
void func_80181B9C(s32 param_1) {
*(s16 *)(param_1 + 2) = 2;
*(s16 *)(param_1 + 0x34) = 3;
func_8012A828(param_1, &D_801B0D50);
*(s32 *)(param_1 + 0x1c) = 0x1e;
}
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8017AE2C", func_80181BE4);
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8017AE2C", func_80181F08);
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_jr_8017AE2C", func_801820DC);
void func_80182254(s32 a0) {
*(s16 *)(a0 + 0x2) = 4;
*(s16 *)(a0 + 0x98) = 0;
*(s32 *)(a0 + 0x1C) = 0;
}
File diff suppressed because it is too large Load Diff
-48
View File
@@ -4164,51 +4164,3 @@ s32 func_8017E958(s32 param_1, s32 param_2) {
}
return 0;
}
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017AE2C", func_8017EA84);
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017AE2C", func_8017F390);
// @class: plumbing
// @stuck: none — MATCH expected; simple param-survives-call store sequence
extern void func_8012A828(s32 a0, void *a1);
extern char D_801A668C[];
void func_8017F5A0(int param_1)
{
*(short *)(param_1 + 2) = 2;
*(short *)(param_1 + 0x34) = 0;
func_8012A828(param_1, &D_801A668C);
*(int *)(param_1 + 0x1c) = 0x14;
}
// @class: plumbing
// @stuck: none — MATCH expected; param_1 survives call in $s0 naturally (single global allocno)
extern void func_8012A828(s32 a0, void *a1);
extern s32 D_801A72C4;
void func_8017F5E4(s32 param_1) {
*(s16 *)(param_1 + 2) = 2;
*(s16 *)(param_1 + 0x34) = 3;
func_8012A828(param_1, &D_801A72C4);
*(s32 *)(param_1 + 0x1c) = 0x1e;
}
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017AE2C", func_8017F62C);
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017AE2C", func_8017F950);
INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8017AE2C", func_8017FB24);
DEFINE_func_8017FC9C() /* dedup: shared engine-core @0x8017FC9C (src/shared) */
File diff suppressed because it is too large Load Diff