feat(phase-26a): A9b — bank func_8017A4AC exemplar ×1 (wall re-test payoff)

The 536-ins reach-134 giant listed "blocked on plumbing" since session 8. Re-tested through
bank_exemplar after the audit's recover-path fixes (A3d reconcile_tu wiring / A3e gate): BANKED
at the `recovered` stage (fb.recover / reconcile_tu resolves the D_80126B58 struct + D_801DA75C
fn-ptr conflicts the raw/scoped stages hit). Lazy-isolated into its own jr subseg + jtbl carve.

HONEST ATTRIBUTION (R14): this bank is the payoff of the A3 recover path, NOT A9a — it banked at
`recovered`, before the `reconciled` (canon_sig_reconcile) stage was reached. A9a's fn-ptr
classifier fix is a correctness fix that did NOT independently unblock a bank in the 7-candidate
re-test (the reconciled stage failed on func_8015B950's func-conflicts; the rest hit K&R /
scalar-typedef / non-ov077 / non-contiguous-carve blockers) — the same null-immediate-banking
pattern as A3c/A3d/A3e; its value is protecting all future dispatch-table banking.

R22 clean-fleet: 136 passed, 0 failed of 136. Exemplar ×1 (+536 ins); the ×134 family sweep follows.
This commit is contained in:
Drew T
2026-07-14 20:09:22 -06:00
parent abbedcee8b
commit 97d86fae69
4 changed files with 5493 additions and 2381 deletions
+1 -1
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_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_801380E0.o,tail3.data.o,ov_SC01_077.o,tail4.data.o,ov_SC01_077_jr_8015444C.o,tail5.data.o,ov_SC01_077_jr_8015A3C8.o,tail6.data.o,ov_SC01_077_jr_8015AE2C.o,tail7.data.o,ov_SC01_077_jr_8016AB6C.o,tail8.data.o,ov_SC01_077_jr_801734BC.o,tail9.data.o,ov_SC01_077_jr_80178D40.o,tail10.data.o,ov_SC01_077_jr_80182268.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC01_077_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_077_jr_8012ACE0.o,tail2.data.o,ov_SC01_077_jr_801380E0.o,tail3.data.o,ov_SC01_077.o,tail4.data.o,ov_SC01_077_jr_8015444C.o,tail5.data.o,ov_SC01_077_jr_8015A3C8.o,tail6.data.o,ov_SC01_077_jr_8015AE2C.o,tail7.data.o,ov_SC01_077_jr_8016AB6C.o,tail8.data.o,ov_SC01_077_jr_801734BC.o,tail9.data.o,ov_SC01_077_jr_80178D40.o,tail10.data.o,ov_SC01_077_jr_8017A4AC.o,tail11.data.o,ov_SC01_077_jr_80182268.o,tail12.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC01_077_CHECK_SHA := config/check.ov_SC01_077.sha
ov_SC01_077_SYMBOLS := config/symbols.ov_SC01_077.txt
ov_SC01_077_SIG := .run/sig.ov_SC01_077.jsonl
+4 -1
View File
@@ -73,6 +73,7 @@ segments:
- [0x42a14, c, ov_SC01_077_jr_8016AB6C]
- [0x4b364, c, ov_SC01_077_jr_801734BC]
- [0x50be8, c, ov_SC01_077_jr_80178D40]
- [0x52354, c, ov_SC01_077_jr_8017A4AC]
- [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
@@ -104,8 +105,10 @@ segments:
- [0xb0b24, data, tail9]
- [0xb0ccc, .rodata, ov_SC01_077_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0e44, data, tail10]
- [0xb0ed4, .rodata, ov_SC01_077_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb0f60, data, tail11]
- [0xb1148, .rodata, ov_SC01_077_jr_80182268] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xb1168, data, tail11]
- [0xb1168, data, tail12]
- [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.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff