Files
BFM-decomp/config/splat.ov_MAIN_012.yaml
T
Drew T 50dd6b3c3f feat(phase-30 S48-T6): wave 3 — 27 exemplars banked, 0 drafts lost
Wave 3 (wf_2680d8ff-539, 74 agents, 8.08M tok): 39 targets -> 35 agent-MATCH,
0 refuted, 4 NEAR, 0 FAIL -> 27 BANKED on the whole-binary gate (69%).

THE HARDENED HARNESS HELD: 0 drafts missing on disk (wave 2 lost 21 of 26 to a
shared output dir). Per-agent dirs + "never touch anything outside your own
directory" + a verifier that re-runs sha1sum LAST.

PRIOR-NOTES SEEDING IS THE SESSION'S BEST LEVER: 7 of 9 seeded targets
converted, including all three wave-2 whole-binary-gate misses and both big
NEARs — func_80189540 (551 ins, was NEAR +2) and func_8017C3BC (407 ins, was
NEAR 17). func_8017C294 (the x16 family) went 18 -> 11 ins: narrowing, not a
wall.

func_80189540 also required the one host edit its agent byte-probed:
  src/ov_SC04_018/ov_SC04_018_jr_80188E1C.c:3093
  extern s32 func_80189540(s32 a0, s16 a1)  ->  (s16 a0, s16 a1)
That TU has no call site, so the edit is inert; the OTHER TUs' (s32,s16) decls
are deliberately left alone (real call sites, and an s16 prototype there would
force caller-side truncation and could de-match banked callers).

Its agent also recovered a better draft that already existed at
.run/backlog_drafts/func_80189540.c — a 551-ins MATCH that had been DE-matched
to 549 by "fixing" the definition's s16 first parameter to s32, the exact
inverse of that draft's own warning. Restoring s16 recovered the match.
2026-08-11 22:51:32 -06:00

151 lines
8.3 KiB
YAML

# splat config TEMPLATE — Brave Fencer Musashi location overlays (SCxx.CD/FILE_nnn/0.4.dec)
# =============================================================================
# Phase 13: the reusable flat-blob splat config for a LOCATION OVERLAY. ~134 overlays
# all stream into the SAME RAM slot (vram 0x80128158) and chain into the resident engine
# (0x800CEDF8) + the EXE. This is a TEMPLATE: the @TOKEN@ placeholders are substituted to
# produce config/splat.<alias>.yaml — by tools/new_overlay.sh (Phase 13 T4), or by hand
# (Phase 13 T1a for the first overlay). It is NOT a valid splat config until instantiated.
#
# Placeholders:
# ov_MAIN_012 binary alias, ov_<SCxx>_<nnn> e.g. ov_SC01_077
# extracted/retail/MAIN.CD.dir/FILE_012.dir/1.1 extracted 0.4.dec payload path e.g. extracted/retail/SC01.CD.dir/FILE_077.dir/0.4.dec
# d6b3e8b971cdd6c53aea8c4f265afb82b363283c sha1 of the 0.4.dec (the build-identity target; also -> config/check.<alias>.sha)
# 0x80128158 load vram (the shared overlay slot) e.g. 0x80128158 (constant across overlays today;
# parameterized so a future non-0x80128158 overlay needs no template edit)
# 0x561E0 file offset where code ends -> data tail begins (iterated vs the byte check, T1b)
# 0x5DB27 file size in bytes (the EOF marker; = the 0.4.dec length)
#
# Modeled on config/splat.resident.yaml (the Phase-10 flat-blob recipe), with overlays'
# differences: (1) code at file offset 0x0 (overlays open with a function prologue, NOT a
# leading data word like the resident — so NO leading-rodata trick by default; see the
# commented `head` slot for the rare pre-code-data overlay); (2) symbol_addrs_path ALSO
# stacks config/symbols.resident.txt because overlays reference resident engine globals;
# (3) vram is the overlay slot. Everything else matches the resident options verbatim.
#
# Byte-match is robust to the exact text/data split (splat round-trips the bytes — the
# resident precedent); iterate 0x561E0 against `make check BINARY=ov_MAIN_012` (Phase-5/10
# precedent). LZSS is NOT in the verify path — we match the DECOMPRESSED 0.4.dec (repack is Gen3).
name: ov_MAIN_012
sha1: d6b3e8b971cdd6c53aea8c4f265afb82b363283c
options:
basename: ov_MAIN_012
target_path: extracted/retail/MAIN.CD.dir/FILE_012.dir/1.1
elf_path: build/ov_MAIN_012/ov_MAIN_012.elf
# base_path is resolved relative to THIS yaml's dir (config/), so `..` = repo root
base_path: ..
platform: psx
compiler: PSYQ
asm_path: asm/ov_MAIN_012
src_path: src/ov_MAIN_012
# asset_path scoped per-alias so a `bin` subseg (the trailing-partial-word carve, below) lands at
# assets/ov_MAIN_012/*.bin and never collides with another overlay's same-named asset. The Makefile's
# build/assets/%.o rule incbin's it into a linkable object.
asset_path: assets/ov_MAIN_012
# build_path = build (NOT build/<alias>): splat writes the .ld's object paths under
# $(build_path), and the Makefile's pattern rules build them at build/asm/** + build/src/**.
# Only the elf/ld/output live in build/<alias>/.
build_path: build
ld_script_path: build/ov_MAIN_012/ov_MAIN_012.ld
ld_dependencies: True
# Per-binary undefined-symbol outputs (under build/<alias>/), so `make clean`'s `rm -rf build`
# covers them and binaries never share a stale file.
undefined_syms_auto_path: build/ov_MAIN_012/undefined_syms_auto.txt
undefined_funcs_auto_path: build/ov_MAIN_012/undefined_funcs_auto.txt
find_file_boundaries: False
# NO gp_value: overlays are -G0 (verify zero ($gp)/%gp_rel in the disasm). Omitting it -> no _gp.
o_as_suffix: True
use_legacy_include_asm: False
section_order: [".rodata", ".text", ".data", ".bss"]
# Stacked symbols: shared engine globals (symbols.us.txt) + resident engine globals the overlay
# calls (symbols.resident.txt) + the overlay-local names/boundaries (symbols.<alias>.txt, seeded
# T1c from sig_image + duplicates.cross.md; R13/R15-tagged, overlay-region only).
symbol_addrs_path:
- config/symbols.us.txt
- config/symbols.resident.txt
- config/symbols.ov_MAIN_012.txt
subalign: 2
string_encoding: ASCII
data_string_encoding: ASCII
rodata_string_guesser_level: 2
data_string_guesser_level: 2
# Enable if maspsx reorders INCLUDE_ASM output in c-mode (unused for the EXE/resident):
# include_asm_macro_style: maspsx_hack
segments:
- name: ov_MAIN_012
type: code
start: 0x0
vram: 0x80128158
# align 4 (not the code default 16): MIPS is word-aligned; mirrors the EXE/resident choice.
align: 4
subsegments:
# OPTIONAL leading pre-code data/rodata island (rare): if an overlay begins with a data
# word BEFORE its first function (the resident's case), uncomment a `head` subseg here and
# shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at
# 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave).
# - [0x0, rodata, head]
- [0x0, c, ov_MAIN_012]
- [0x91e8, c, ov_MAIN_012_jr_80131340]
- [0xd8f4, c, ov_MAIN_012_jr_80135A4C]
- [0xdd58, c, ov_MAIN_012_jr_80135EB0]
- [0xff88, c, ov_MAIN_012_jr_801380E0]
- [0x171f8, c, ov_MAIN_012_jr_8013F350]
- [0x2c8a0, c, ov_MAIN_012_jr_801549F8]
- [0x2d49c, c, ov_MAIN_012_jr_801555F4]
- [0x31390, c, ov_MAIN_012_jr_801594E8]
- [0x31b2c, c, ov_MAIN_012_jr_80159C84]
- [0x32270, c, ov_MAIN_012_jr_8015A3C8]
- [0x42d04, c, ov_MAIN_012_jr_8016AE5C]
- [0x499f4, c, ov_MAIN_012_jr_80171B4C]
- [0x50854, c, ov_MAIN_012_jr_801789AC]
- [0x54264, c, ov_MAIN_012_jr_8017C3BC]
- [0x548c0, c, ov_MAIN_012_jr_8017CA18]
- [0x54de4, c, ov_MAIN_012_jr_8017CF3C]
- [0x561e0, data, tail]
- [0x5abd0, .rodata, ov_MAIN_012] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5ad78, .rodata, ov_MAIN_012_jr_80131340] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5adb8, data, tail2]
- [0x5adbc, .rodata, ov_MAIN_012_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5ade8, data, tail3]
- [0x5adec, .rodata, ov_MAIN_012_jr_80135EB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5ae18, data, tail4]
- [0x5ae24, .rodata, ov_MAIN_012_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5ae88, data, tail5]
- [0x5b494, .rodata, ov_MAIN_012_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b550, data, tail6]
- [0x5b5d8, .rodata, ov_MAIN_012_jr_801549F8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b668, .rodata, ov_MAIN_012_jr_801555F4] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b688, data, tail7]
- [0x5b6b0, .rodata, ov_MAIN_012_jr_801594E8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b730, .rodata, ov_MAIN_012_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b764, data, tail8]
- [0x5b768, .rodata, ov_MAIN_012_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b7e4, data, tail9]
- [0x5b81c, .rodata, ov_MAIN_012_jr_8016AE5C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b83c, data, tail10]
- [0x5b87c, .rodata, ov_MAIN_012_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5b8b0, data, tail11]
- [0x5ba40, .rodata, ov_MAIN_012_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5bd04, data, tail12]
- [0x5be44, .rodata, ov_MAIN_012_jr_8017C3BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5beb0, data, tail13]
- [0x5beb4, .rodata, ov_MAIN_012_jr_8017CA18] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5bee8, data, tail14]
- [0x5beec, .rodata, ov_MAIN_012_jr_8017CF3C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0x5bf58, data, tail15]
- [0x5DB24, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word)
- [0x5DB27] # 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
# ` - [0x<word_floor>, bin, trailing]` (the final 1-3 bytes spimdisasm's data path drops);
# for a 4-aligned overlay the marker line is removed. The Makefile build/assets/%.o rule + the
# objcopy end-align TRIM finish the job. Hand-instantiated configs (ov_SC01_077) inline the carve.