mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-28 06:49:47 -04:00
f5498c3c66
⚠️ R22 CLEAN-FLEET OWED (two agents still reading asm/, so `make clean` is unsafe). Each of the 12
was gated whole-binary AND independently re-checked against its own config/check.<bin>.sha (12/12),
stubs confirmed replaced — but incremental (§130). Treat as UNCONFIRMED until the clean run.
- THREE isolated cheap-Opus agents, briefed with §150/§151 + the mandatory all-drafts scan,
CONVERGED INDEPENDENTLY: func_8017C6F4's 947-ins body exists in 12 OVERLAYS under 5 DIFFERENT
NAMES at 6 DIFFERENT ADDRESSES, each differing by exactly TWO per-overlay symbols (screen-rect
helper + 64x64 cell table). Gated 12/12, 0 failed. 11,364 ins from this morning's single crack.
- WHY IT HID ~30 PHASES (cookbook §152): name-keyed grouping scattered it across 5 names,
address-keyed across 6 addresses (and the address collides with an unrelated 15-ins body in 3
other overlays), and h_seq-keyed scattered it too — which is why the Phase-26 sweeps missed it.
THE KEY IS BYTE SIZE: `grep -rl 'nonmatching .*, 0xECC' asm/*/nonmatchings/*/` returns exactly
the 12, reads the asm (cannot go stale like family_hseq.json), no false positives. Refines the
Phase-26 "h_seq is spent" finding: h_seq is worth exactly ONE size-keyed sweep behind each FRESH
core crack — here it paid 11:1.
- TWO CAUTIONS THAT TRAVEL WITH IT: (1) a MASKED tool cannot validate a remap — match_one and
rtu_match both mask jal/%hi/%lo, exactly the fields a remap edits, so a wrong symbol map still
reports MATCH; gate remaps by the whole-binary SHA only. (2) a stale residual is NOT evidence two
functions differ — I briefed "func_8017C59C scores 340, different body"; refuted in one command
(that 340 came from a pre-§150-fix draft, which scores nonzero against its own target too).
- OPEN TOOL DEFECT (R32): family_remap's unit backscan halts at the first #define, so it carried
16/16 gte macros and 0/10 typedefs, silently — the §146 gap from the other side.
- MY ERROR, RETRACTED IN THE LOG (S43-9): I reported the 263x5 cluster as "5 byte-identical, 1,315
ins". FALSE — the drafts had been reverted, so I measured the INCLUDE_ASM STUB BASELINE, which is
byte-identical by construction. R34's trap, self-inflicted by hand-building instead of using
harvest_verify. Nothing was banked there; the cluster is UNRESOLVED. ("41 behemoth drafts" was
likewise a file count — 79 files, 20 distinct functions.)
171 lines
9.6 KiB
YAML
171 lines
9.6 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_SC03_007 binary alias, ov_<SCxx>_<nnn> e.g. ov_SC01_077
|
|
# extracted/retail/SC03.CD.dir/FILE_007.dir/0.4.dec extracted 0.4.dec payload path e.g. extracted/retail/SC01.CD.dir/FILE_077.dir/0.4.dec
|
|
# 077dc4cb378288478d006a936e656488ddfc321a 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)
|
|
# 0x5F234 file offset where code ends -> data tail begins (iterated vs the byte check, T1b)
|
|
# 0xC316F 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 0x5F234 against `make check BINARY=ov_SC03_007` (Phase-5/10
|
|
# precedent). LZSS is NOT in the verify path — we match the DECOMPRESSED 0.4.dec (repack is Gen3).
|
|
name: ov_SC03_007
|
|
sha1: 077dc4cb378288478d006a936e656488ddfc321a
|
|
options:
|
|
basename: ov_SC03_007
|
|
target_path: extracted/retail/SC03.CD.dir/FILE_007.dir/0.4.dec
|
|
elf_path: build/ov_SC03_007/ov_SC03_007.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_SC03_007
|
|
src_path: src/ov_SC03_007
|
|
# asset_path scoped per-alias so a `bin` subseg (the trailing-partial-word carve, below) lands at
|
|
# assets/ov_SC03_007/*.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_SC03_007
|
|
# 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_SC03_007/ov_SC03_007.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_SC03_007/undefined_syms_auto.txt
|
|
undefined_funcs_auto_path: build/ov_SC03_007/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_SC03_007.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_SC03_007
|
|
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_SC03_007]
|
|
- [0x2b88, c, ov_SC03_007_jr_8012ACE0]
|
|
- [0xd730, c, ov_SC03_007_jr_80135888]
|
|
- [0xd8f4, c, ov_SC03_007_jr_80135A4C]
|
|
- [0xdbc8, c, ov_SC03_007_jr_80135D20]
|
|
- [0xff88, c, ov_SC03_007_jr_801380E0]
|
|
- [0x13410, c, ov_SC03_007_o0c]
|
|
- [0x14834, c, ov_SC03_007_jr_8013C98C]
|
|
- [0x171f8, c, ov_SC03_007_jr_8013F350]
|
|
- [0x17e80, c, ov_SC03_007_jr_8013FFD8]
|
|
- [0x184b0, c, ov_SC03_007_jr_80140608]
|
|
- [0x1CA44, c, ov_SC03_007_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C)
|
|
- [0x1d64c, c, ov_SC03_007_after]
|
|
- [0x2c2f4, c, ov_SC03_007_jr_8015444C]
|
|
- [0x2cacc, c, ov_SC03_007_jr_80154C24]
|
|
- [0x30774, c, ov_SC03_007_jr_801588CC]
|
|
- [0x31b2c, c, ov_SC03_007_jr_80159C84]
|
|
- [0x32270, c, ov_SC03_007_jr_8015A3C8]
|
|
- [0x32cd4, c, ov_SC03_007_jr_8015AE2C]
|
|
- [0x341d4, c, ov_SC03_007_jr_8015C32C]
|
|
- [0x42a14, c, ov_SC03_007_jr_8016AB6C]
|
|
- [0x499f4, c, ov_SC03_007_jr_80171B4C]
|
|
- [0x4b364, c, ov_SC03_007_jr_801734BC]
|
|
- [0x50854, c, ov_SC03_007_jr_801789AC]
|
|
- [0x50be8, c, ov_SC03_007_jr_80178D40]
|
|
- [0x52354, c, ov_SC03_007_jr_8017A4AC]
|
|
- [0x52cd4, c, ov_SC03_007_jr_8017AE2C]
|
|
- [0x5f234, data, tail]
|
|
- [0xbf63c, .rodata, ov_SC03_007] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf718, .rodata, ov_SC03_007_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf80c, data, tail2]
|
|
- [0xbf810, .rodata, ov_SC03_007_jr_80135888] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf824, data, tail3]
|
|
- [0xbf828, .rodata, ov_SC03_007_jr_80135A4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf83c, data, tail4]
|
|
- [0xbf840, .rodata, ov_SC03_007_jr_80135D20] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf884, data, tail5]
|
|
- [0xbf890, .rodata, ov_SC03_007_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbf8f4, .rodata, ov_SC03_007_o0c] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbfa78, data, tail6]
|
|
- [0xbff00, .rodata, ov_SC03_007_jr_8013F350] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbff34, data, tail7]
|
|
- [0xbff38, .rodata, ov_SC03_007_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbffa4, data, tail8]
|
|
- [0xbffa8, .rodata, ov_SC03_007_jr_80140608] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xbffbc, data, tail9]
|
|
- [0xbffd4, .rodata, ov_SC03_007_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc00b0, .rodata, ov_SC03_007_jr_80154C24] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc00f4, .rodata, ov_SC03_007_jr_801588CC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc019c, .rodata, ov_SC03_007_jr_80159C84] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc01d0, data, tail10]
|
|
- [0xc01d4, .rodata, ov_SC03_007_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc01f0, data, tail11]
|
|
- [0xc01f4, .rodata, ov_SC03_007_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc0230, data, tail12]
|
|
- [0xc0234, .rodata, ov_SC03_007_jr_8015C32C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc0250, data, tail13]
|
|
- [0xc0268, .rodata, ov_SC03_007_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc02a8, data, tail14]
|
|
- [0xc02e8, .rodata, ov_SC03_007_jr_80171B4C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc0308, .rodata, ov_SC03_007_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc031c, data, tail15]
|
|
- [0xc04ac, .rodata, ov_SC03_007_jr_801789AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc04c4, .rodata, ov_SC03_007_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc06c8, data, tail16]
|
|
- [0xc06cc, .rodata, ov_SC03_007_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc0758, data, tail17]
|
|
- [0xc075c, .rodata, ov_SC03_007_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
|
|
- [0xc0790, data, tail18]
|
|
- [0xC316C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word)
|
|
- [0xC316F] # 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.
|