mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-01 23:52:03 -04:00
a8872fa169
First attempt on the game's largest unmatched function. No match (never the goal); the deliverable is the map, and every claim is byte-verified against the target .s. - STRUCTURE: an actor state machine, not a straight-line giant. 21-case switch via jtbl_801F4CE4 (sltiu 0x15); 359 jals to only 37 DISTINCT callees (verified); 48-ins preamble + 19-ins shared tail. - THE FINDING: it decomposes into repeated templates, not 5122 unique instructions — 35 instances of one "spawn-effect" packet (~1400 ins, crack one -> 34 free), 7 "wait/countdown" (already reproduced at 0 skeleton diffs), 12 "HUD/text", plus twin cases (0≈3, 1≈4). Only 3 cross-jump edges couple anything. - TWO GENERAL LAWS FOR GIANTS, measured: (1) register pressure is GLOBAL, so a partial draft gets 10 callee-saved regs instead of 8 and a matching PREFIX is structurally unavailable — write all cases coarsely first, then refine; (2) match_one's global number is meaningless on a partial giant (666 vs 5122) — measure REGION-ALIGNED instead. - NEW REUSABLE TOOL: .run/giants/s18_regions_comparator.py (region-aligned skeleton comparator, works on any giant). Caveat travels with it: masks register numbers + jal targets, so it proves STRUCTURE, never closeness; finish on the whole-binary gate (G3/P9). - 2 idioms cracked in passing (the D_x[t+K] constant-fold needing a separate index statement; the (s16)*(u16*)p + /455 magic-0x90090091 form). - VERDICT: tractable but a ~2000-line WRITE, not a hard puzzle — no scheduler wall, no unsteerable regalloc. Recipe for the next attempt recorded. - artifacts preserved under the tracked .run/giants/ path (.gitignore now allowlists *.py there).
171 lines
7.3 KiB
Plaintext
171 lines
7.3 KiB
Plaintext
# ============================================================
|
|
# ROM-content policy — see PROJECT_CONTEXT.md rule H1
|
|
#
|
|
# While the repo is PRIVATE, ROM-derived content MAY be committed
|
|
# (asm/, assets/, extracted/, decompressed .CD output). Compliance is
|
|
# handled by a pre-public history scrub + a rom->decoder regeneration
|
|
# tool. Two things stay ignored regardless:
|
|
# 1. the raw multi-GB disc dump (GitHub rejects >100 MB files; it is
|
|
# trivially reproducible from the disc), and
|
|
# 2. pure regenerated build churn / large binary caches.
|
|
# Re-add asm/ assets/ extracted/ to this list before going public.
|
|
# ============================================================
|
|
|
|
# Raw disc dump — never committed (size + reproducible)
|
|
/Brave Fencer Musashi (USA)/
|
|
/disks/
|
|
|
|
# RAM-dump corpus (dumps/*.bin) is COMMITTED while private (H1 relaxed; static, not regenerable;
|
|
# off-machine backup). Joins the pre-public ROM-content scrub. INDEX.md documents each.
|
|
|
|
# Project-local runtime scratch (MCP server log + stop sentinel) — replaces /tmp use.
|
|
# Contents-exclude form (the /tools/bin/*.sha256 precedent) so the IRREPLACEABLE recon
|
|
# commits while the regenerable bulk stays ignored (R20 backup vs R12 scratch; Phase-27 T3).
|
|
# Rule of thumb: commit what a rerun CANNOT reproduce (hand/Fable5 analysis, harnesses,
|
|
# ledgers); leave anything a script regenerates (RTL dumps, build logs, drafts) ignored.
|
|
/.run/*
|
|
|
|
# --- Preserved recon (R20) ---
|
|
# Giant crack recon: the Phase-25 *.opus.{c,md} seeds, the byte-verified pf*.c
|
|
# regression ladder, the dump/monitor harnesses, and — cited BY cookbook §45 as its
|
|
# worked example — func_80133CD4.fable.{c,md} + the fable_cd4/ gdb oracle.
|
|
# The d_pf*.i.* / *.s / dumps_*/ gcc RTL scratch beside them is regenerable via
|
|
# dump.sh and stays ignored, as do the permuter/ILS .log files.
|
|
!/.run/giants/
|
|
/.run/giants/*
|
|
!/.run/giants/*.c
|
|
!/.run/giants/*.md
|
|
!/.run/giants/*.sh
|
|
!/.run/giants/*.py
|
|
!/.run/probe_jtbl/
|
|
/.run/probe_jtbl/*
|
|
!/.run/probe_jtbl/verdict.md
|
|
!/.run/probe_jtbl/rodata_verbatim.objdump
|
|
!/.run/probe_jtbl/rodata_filtered.objdump
|
|
!/.run/giants/fable_cd4/
|
|
/.run/giants/fable_cd4/*
|
|
!/.run/giants/fable_cd4/*.c
|
|
!/.run/giants/fable_cd4/*.md
|
|
!/.run/giants/fable_cd4/*.sh
|
|
!/.run/giants/fable_cd4/*.gdb
|
|
!/.run/giants/fable_cd4/*.txt
|
|
|
|
# Phase-26 gdb-on-cc1 oracle harness + proof + draft ladder for func_80178004 (the
|
|
# distilled output of a 477k-token Fable5 pass; the method §52 lever 6 depends on).
|
|
# dumps_*/ are regenerable via runorc.sh + the .gdb scripts -> stay ignored.
|
|
!/.run/fable_80178004/
|
|
/.run/fable_80178004/*
|
|
!/.run/fable_80178004/*.c
|
|
!/.run/fable_80178004/*.md
|
|
!/.run/fable_80178004/*.gdb
|
|
!/.run/fable_80178004/*.sh
|
|
!/.run/fable_80178004/*.py
|
|
!/.run/fable_80178004/*.lst
|
|
|
|
# The frontier ledgers every survey, worklist and plan consumes.
|
|
!/.run/backlog.jsonl
|
|
!/.run/fuel_manifest.json
|
|
|
|
# Phase-27 pin-crash characterization: the minimal repro + gdb harness (the irreplaceable ~KB
|
|
# core; pin_crash_sigabrt.md above is already covered by giants/*.md). The 260M of RTL dumps +
|
|
# bisection .s/.c beside them are regenerable via abort.gdb -> stay ignored (R33).
|
|
!/.run/giants/pincrash/
|
|
/.run/giants/pincrash/*
|
|
!/.run/giants/pincrash/minimal_repro.c
|
|
!/.run/giants/pincrash/*.gdb
|
|
!/.run/giants/pincrash/*.md
|
|
|
|
# Regenerated build output (deterministic churn)
|
|
/build/
|
|
/expected/
|
|
|
|
# Regenerated splat outputs — recreated by `make extract` from the committed
|
|
# config/splat.us.exe.yaml + config/symbols.us.txt + the EXE. The durable RE record
|
|
# is the symbol file, not these (build scaffolding, not committed work).
|
|
/asm/
|
|
/assets/
|
|
/include/include_asm.h
|
|
/include/macro.inc
|
|
/include/labels.inc
|
|
/include/gte_macros.inc
|
|
/undefined_syms_auto.txt
|
|
/undefined_funcs_auto.txt
|
|
|
|
# Ghidra project — COMMITTED as the irreplaceable RE-work backup (private repo; rule R20,
|
|
# Drew 2026-06-15). NOT regenerable by hand (annotations/types/structs beyond symbols.us.txt).
|
|
# Track the project; exclude ONLY live-session transients so a running/restarted MCP server
|
|
# doesn't dirty the tree. Re-commit after significant RE + a Ghidra save. (Ghidra pinned at
|
|
# 12.1 -> the committed .rep restores directly.) Joins the pre-public ROM-content scrub list.
|
|
/ghidra/*.lock
|
|
/ghidra/**/*.lock
|
|
/ghidra/*.lock~
|
|
/ghidra/**/*.lock~
|
|
/ghidra/**/tmp*.ps
|
|
|
|
# Toolchain downloads & caches (not source)
|
|
/.venv/
|
|
__pycache__/
|
|
# Compiler binaries are ignored (regenerable downloads); the committed *.sha256
|
|
# checksum record is re-included so a fresh clone can verify its download (sotn
|
|
# pattern). Contents-exclude form (not /tools/bin/) so the !re-include can apply.
|
|
/tools/bin/*
|
|
!/tools/bin/*.sha256
|
|
# PsyQ SDK — Sony-copyrighted (stays PRIVATE; excluded from the public mirror, like ROM content).
|
|
# Back up the SMALL gathered working artifacts (lib40/ *.LIB, lib40_elf/ *.a, the PsyQ *.EXE tools,
|
|
# psyq-obj-parser, conv47/) — hard to re-source if the upstream archives go down (rule R20). Ignore
|
|
# ONLY the >100MB raw source archives (GitHub rejects them; the working libs are already extracted
|
|
# from them — the disc-dump-equivalent, re-sourceable from redump if ever truly needed).
|
|
/tools/psyq/psyq40usa.zip
|
|
/tools/psyq/*.bin
|
|
/tools/psyq/*.cue
|
|
/tools/pcsx-redux/
|
|
*.tar.gz
|
|
# ...EXCEPT the old-gcc cc1 compiler tarballs — back them up (gathered compilers; small; verified by
|
|
# tools/bin/CHECKSUMS.sha256). Extracted cc1 binaries stay ignored (regenerated by `tar xzf`, SETUP §4.7). R20.
|
|
!/tools/bin/*.tar.gz
|
|
|
|
# Cross-validation scratch: compiled brave oracle + its ROM-derived .dir output
|
|
/tools/brave-CUE/_build/
|
|
|
|
# Phase-18 compiler-quirk research reference repos (gitignored; re-clonable from GitHub, exact SHA
|
|
# recorded in docs/SETUP.md). pmret/gcc-papermario = the gcc-2.7.2 source (read the reload/CSE/
|
|
# scheduling/regalloc passes) + ladysilverberg/xenogears-decomp = our exact compiler's decomp (mine
|
|
# transferable idioms). Research reference, not a build dependency — not committed (avoids repo bloat).
|
|
/tools/reference/
|
|
|
|
# Editor / OS noise
|
|
.vscode/
|
|
Thumbs.db
|
|
|
|
# Asset/EXE extraction: commit the tooling + manifest + the retail EXE, NOT the
|
|
# bulk payloads (deterministically regenerable from the dump; ~hundreds of MB
|
|
# incl. FMV) and NOT the prototype EXEs. Per-ROM subfolders under extracted/:
|
|
# extracted/retail/ — retail SLUS-00726 disc extraction (3 files committed)
|
|
# extracted/proto/ — prototype main EXEs (ROM-derived; fully ignored)
|
|
# Nested allowlist: ignore everything under extracted/, re-include only the 3
|
|
# retail committed files (EXE + manifest + manifest hash — always safe; sotn
|
|
# precedent). This keeps the "zero ROM-derived bulk staged" guarantee.
|
|
/extracted/*
|
|
!/extracted/retail/
|
|
/extracted/retail/*
|
|
!/extracted/retail/SLUS_007.26
|
|
!/extracted/retail/manifest.jsonl
|
|
!/extracted/retail/manifest.sha1
|
|
|
|
# NOTE (H1 relaxed, private phase): assets/ and other ROM-derived content stay
|
|
# committable while the repo is private. asm/ + the splat-generated include macros +
|
|
# undefined_*_auto.txt are IGNORED above: `make extract` regenerates them deterministically
|
|
# from the committed yaml + symbols, so they are build scaffolding, not durable RE work.
|
|
# (Phase 5 refined the earlier "commit asm/" stance once the regeneration flow existed;
|
|
# the durable record is config/symbols.us.txt.)
|
|
|
|
# Gen2 matching-model corpus + weights (R20: large artifacts out of git)
|
|
datasets/
|
|
models/
|
|
*.gguf
|
|
*.safetensors
|
|
.venv-train/
|
|
unsloth_compiled_cache/
|
|
.venv-serve/
|
|
.env
|