mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-28 14:59:48 -04:00
c55ad64614
Wave 6 (wf_9729fd89-c16, 76 agents, 6.7M tok): 40 targets -> 35 agent-MATCH, 1 refuted, 0 UNVERIFIED (the new field works), 4 NEAR -> 24 BANKED. *** THE FINDING OF THE CAMPAIGN, and it is not a compiler idiom *** func_8017F2D4 had been "MATCH standalone / DIFF at gate" SEVEN times across five waves. Every attempt hunted codegen. The body was byte-correct the whole time. The fault was that the prior notes named the WRONG DESTINATION TU: ..._jr_8017C340.c holds only a CALLER and a prototype; the INCLUDE_ASM lives in ..._jr_8017ED5C.c. Splicing into the wrong file is a no-op, the binary differs, and harvest recorded its canned string "match_one MATCH but gate rejected (declaration/TU plumbing)" — A GUESS, NOT A MEASUREMENT. No declaration conflict ever existed. NEW LAW (zero-cost oracle): THE SPLAT ASM SUBDIR NAMES THE DESTINATION TU. asm/<overlay>/nonmatchings/<TU_basename>/<fn>.s => the INCLUDE_ASM is in src/<overlay>/<TU_basename>.c, always — the third path component IS the TU stem. Never accept a prose TU citation that disagrees with the --asm-subdir you were handed: a grep for the function name also hits callers and prototypes in OTHER TUs and reads exactly like a destination hit. Corollary: re-derive the TU path from the asm subdir BEFORE hunting codegen on any gate-refused backlog entry. The agent proved it properly: in-situ splice into BOTH TUs, full pinned triple, 279/279 with 0 masked diffs, plus a collateral-drift check (71/71 other sized symbols byte-identical). It also corrected the reach to x2 (only two .s files for that function exist, byte-identical modulo the overlay name). Bank rate across six waves: 67% -> 79% -> 69% -> 68% -> 73% -> 60%.
162 lines
9.5 KiB
YAML
162 lines
9.5 KiB
YAML
# splat config — Brave Fencer Musashi location overlay ov_SC01_077 (SC01.CD/FILE_077/0.4.dec)
|
||
# Phase 13 T1: the milestone overlay (load byte-proven, Phase 3 T6b). Instantiated from
|
||
# config/splat.us.overlay.template.yaml. Flat decompressed blob @ vram 0x80128158 (the shared
|
||
# overlay slot); code at file 0x0; data tail from 0x5E978 (end of the last sig_image function,
|
||
# vram 0x80186AD0) to EOF 0xB29D7 (731,607 B -> end vram 0x801DAB2F). The text/data split is
|
||
# iterated vs `make check BINARY=ov_SC01_077` (Phase-5/10 precedent). Matches the DECOMPRESSED
|
||
# 0.4.dec (sha1 d19c9580…); LZSS repack is Gen3 (not in the verify path).
|
||
name: ov_SC01_077
|
||
sha1: d19c9580a02dc63ba1f0e7e0c770f3b10de35635
|
||
options:
|
||
basename: ov_SC01_077
|
||
target_path: extracted/retail/SC01.CD.dir/FILE_077.dir/0.4.dec
|
||
elf_path: build/ov_SC01_077/ov_SC01_077.elf
|
||
base_path: ..
|
||
platform: psx
|
||
compiler: PSYQ
|
||
|
||
asm_path: asm/ov_SC01_077
|
||
src_path: src/ov_SC01_077
|
||
asset_path: assets/ov_SC01_077 # `bin` subsegs (the trailing carve) -> assets/ov_SC01_077/*.bin
|
||
build_path: build
|
||
ld_script_path: build/ov_SC01_077/ov_SC01_077.ld
|
||
ld_dependencies: True
|
||
|
||
undefined_syms_auto_path: build/ov_SC01_077/undefined_syms_auto.txt
|
||
undefined_funcs_auto_path: build/ov_SC01_077/undefined_funcs_auto.txt
|
||
|
||
find_file_boundaries: False
|
||
|
||
o_as_suffix: True
|
||
use_legacy_include_asm: False
|
||
|
||
section_order: [".rodata", ".text", ".data", ".bss"]
|
||
|
||
symbol_addrs_path:
|
||
- config/symbols.us.txt
|
||
- config/symbols.resident.txt
|
||
- config/symbols.ov_SC01_077.txt
|
||
|
||
subalign: 2
|
||
|
||
string_encoding: ASCII
|
||
data_string_encoding: ASCII
|
||
rodata_string_guesser_level: 2
|
||
data_string_guesser_level: 2
|
||
|
||
segments:
|
||
- name: ov_SC01_077
|
||
type: code
|
||
start: 0x0
|
||
vram: 0x80128158
|
||
align: 4
|
||
subsegments:
|
||
# Phase-19 T1: per-file -O0 split (src/boot.c precedent). The 16 contiguous functions
|
||
# vram 0x8013B568..0x8013C98C were compiled -O0 (prologue sig 21F0A003); gcc-2.7.2 has no
|
||
# per-function optimize pragma, so they need their own -O0 .o (the Makefile forces
|
||
# CC1FLAGS=-O0 on ov_SC01_077_o0.o). A single object's .text can't be split around a middle
|
||
# object, so before/after are DISTINCT objects: before -> ov_SC01_077_a (smaller, asm paths
|
||
# rewritten), after KEEPS the ov_SC01_077 name (the bulk matched C + asm paths unchanged).
|
||
- [0x0, c, ov_SC01_077_a]
|
||
- [0x2b88, c, ov_SC01_077_jr_8012ACE0]
|
||
- [0xd730, c, ov_SC01_077_jr_80135888]
|
||
- [0xd8f4, c, ov_SC01_077_jr_80135A4C]
|
||
- [0xdbc8, c, ov_SC01_077_jr_80135D20]
|
||
- [0xff88, c, ov_SC01_077_jr_801380E0]
|
||
- [0x13410, c, ov_SC01_077_o0] # -O0 cluster: 16 fns vram 0x8013B568..0x8013C98C (file 0x13410..0x14834)
|
||
# Phase-24 whale: func_80144B9C is a SECOND -O0 region (prologue 21F0A003) stranded in the
|
||
# -O2 "after" segment (0x80144B9C..0x801457A4). Carve it into its own -O0 object (o0b), splitting
|
||
# the -O2 "after" into before-whale (keeps the ov_SC01_077 name) and after-whale (ov_SC01_077_after).
|
||
- [0x14834, c, ov_SC01_077] # -O2 after part 1: vram 0x8013C98C..0x80144B9C (file 0x14834..0x1CA44)
|
||
- [0x1CA44, c, ov_SC01_077_o0b] # -O0 WHALE func_80144B9C: vram 0x80144B9C..0x801457A4 (file 0x1CA44..0x1D64C)
|
||
- [0x1d64c, c, ov_SC01_077_after]
|
||
- [0x2c2f4, c, ov_SC01_077_jr_8015444C]
|
||
- [0x2cacc, c, ov_SC01_077_jr_80154C24]
|
||
- [0x30774, c, ov_SC01_077_jr_801588CC]
|
||
- [0x31b2c, c, ov_SC01_077_jr_80159C84]
|
||
- [0x32270, c, ov_SC01_077_jr_8015A3C8]
|
||
- [0x32cd4, c, ov_SC01_077_jr_8015AE2C]
|
||
- [0x341d4, c, ov_SC01_077_jr_8015C32C]
|
||
- [0x42a14, c, ov_SC01_077_jr_8016AB6C]
|
||
- [0x499f4, c, ov_SC01_077_jr_80171B4C]
|
||
- [0x4b364, c, ov_SC01_077_jr_801734BC]
|
||
- [0x50854, c, ov_SC01_077_jr_801789AC]
|
||
- [0x50be8, c, ov_SC01_077_jr_80178D40]
|
||
- [0x52354, c, ov_SC01_077_jr_8017A4AC]
|
||
- [0x52cd4, c, ov_SC01_077_jr_8017AE2C]
|
||
- [0x58a0c, c, ov_SC01_077_jr_80180B64]
|
||
- [0x58ee4, c, ov_SC01_077_jr_8018103C]
|
||
- [0x59a8c, c, ov_SC01_077_jr_80181BE4]
|
||
- [0x59f84, c, ov_SC01_077_jr_801820DC]
|
||
- [0x5a110, c, ov_SC01_077_jr_80182268]
|
||
- [0x5ad24, c, ov_SC01_077_jr_80182E7C]
|
||
- [0x5b1cc, c, ov_SC01_077_jr_80183324]
|
||
- [0x5b998, c, ov_SC01_077_jr_80183AF0]
|
||
- [0x5ba54, c, ov_SC01_077_jr_80183BAC]
|
||
- [0x5bb9c, c, ov_SC01_077_jr_80183CF4]
|
||
# 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
|
||
# (vram 0x801D7F9C..~0x801D9460), between the .data globals and a tiny .data remnant. While every
|
||
# jr-function is INCLUDE_ASM the jtbls emit as in-place .data (byte-fine). But a MATCHED jr-function's
|
||
# C emits its jtbl into .rodata (which section_order floats to the FRONT) while the raw copy stays in
|
||
# the data tail -> duplicate + wrong address. FIX: carve each matched fn's jtbl(s) out of the data tail
|
||
# into a dotted .rodata subseg co-located with its code object; tools/ld_interleave.py --section
|
||
# .ov_SC01_077 then places .data(pre) -> .rodata(jtbls) -> .data(post), reconstructing the island.
|
||
# PoC: func_8012ACE0's single jtbl jtbl_801D8078 (8-aligned, 204B) = vram 0x801D8078..0x801D8144
|
||
# = file 0xAFF20..0xAFFEC. func_8012ACE0 lives in the ov_SC01_077_a subseg. Other functions'
|
||
# jtbls stay raw .data until matched (each matched fn's jtbl gets its own carve — the ×134 tool).
|
||
- [0x5e978, data, tail]
|
||
- [0xafe44, .rodata, ov_SC01_077_a] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xaff20, .rodata, ov_SC01_077_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0014, data, tail2]
|
||
- [0xb0018, .rodata, ov_SC01_077_jr_80135888] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb002c, data, tail3]
|
||
- [0xb0030, .rodata, ov_SC01_077_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0044, data, tail4]
|
||
- [0xb0048, .rodata, ov_SC01_077_jr_80135D20] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb008c, data, tail5]
|
||
- [0xb0098, .rodata, ov_SC01_077_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb00fc, .rodata, ov_SC01_077_o0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0280, data, tail6]
|
||
- [0xb0708, .rodata, ov_SC01_077] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb07c4, data, tail7]
|
||
- [0xb07dc, .rodata, ov_SC01_077_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb08b8, .rodata, ov_SC01_077_jr_80154C24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb08fc, .rodata, ov_SC01_077_jr_801588CC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb09a4, .rodata, ov_SC01_077_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb09d8, data, tail8]
|
||
- [0xb09dc, .rodata, ov_SC01_077_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb09f8, data, tail9]
|
||
- [0xb09fc, .rodata, ov_SC01_077_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0a38, data, tail10]
|
||
- [0xb0a3c, .rodata, ov_SC01_077_jr_8015C32C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0a58, data, tail11]
|
||
- [0xb0a70, .rodata, ov_SC01_077_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0ab0, data, tail12]
|
||
- [0xb0af0, .rodata, ov_SC01_077_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0b10, .rodata, ov_SC01_077_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0b24, data, tail13]
|
||
- [0xb0cb4, .rodata, ov_SC01_077_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0ccc, .rodata, ov_SC01_077_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0ed0, data, tail14]
|
||
- [0xb0ed4, .rodata, ov_SC01_077_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0f60, data, tail15]
|
||
- [0xb0f64, .rodata, ov_SC01_077_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb0f98, data, tail16]
|
||
- [0xb0fa0, .rodata, ov_SC01_077_jr_80180B64] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb1000, .rodata, ov_SC01_077_jr_8018103C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb1098, .rodata, ov_SC01_077_jr_80181BE4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb10ac, data, tail17]
|
||
- [0xb1128, .rodata, ov_SC01_077_jr_801820DC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb1148, .rodata, ov_SC01_077_jr_80182268] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb11a8, .rodata, ov_SC01_077_jr_80182E7C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb11e8, .rodata, ov_SC01_077_jr_80183324] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb12a8, .rodata, ov_SC01_077_jr_80183AF0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb12c8, .rodata, ov_SC01_077_jr_80183BAC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb1308, .rodata, ov_SC01_077_jr_80183CF4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
||
- [0xb1328, 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.
|
||
- [0xB29D7] # EOF (731,607 B) -> end vram 0x801DAB2F
|