re: the unit loader was already in the corpus (sub_82341A20), and 0-xref does not mean no reader
Item "what loads the 114 unit Maneuver records" -- the corpus already answers it,
and I should have found that before framing it as new. My own error, corrected:
I claimed live-unit-definitions.md did not exist. It does, at docs/re/, not under
structures/. Looking in one directory is not looking.
sub_82341A20 is the unit-definition loader, documented in unit-struct-runtime.md
with a checked-in 177-line layout at
crates/sylpheed-formats/data/unit_definition_layout.txt. Verified independently:
3969 instructions, 227 of its 236 "addi rX, r30, -N" displacements resolve to
strings -- the unit schema in order, Generic, UncertainName, IsDestructible,
NamePlate, Size_X/Y/Z ... Maneuver sits at exactly 0x82088F94 - 13404.
Record keys are tag_hash, confirmed on the data side: the Maneuver record's key is
0x43FAA517 = tag_hash("Maneuver"), not name_hash (0x63A248D7), x114 records.
That explains the 0-xref phenomenon and softens my own verdict from last
iteration. Maneuver's string has 0 xrefs AND a known reader: the loader takes its
address as a register-passed base plus a displacement, which no static xref can
see. So the AnalogRevice/Tweak verdict goes from RED to AMBER -- a
base-plus-displacement sweep over the 2283 functions forming the 0x820A high half
reaches it 0 times, but run against the unit block as a control the same sweep
recovers only 5 references and misses sub_82341A20 itself. The measurement
stands; "the reader is unreachable" does not.
Also fixed: player-tuning-tables.md credited live-unit-definitions.md with
documenting sub_822F9498. It documents sub_82341A20, a different function.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
@@ -135,7 +135,7 @@ unit `Maneuver` 100 / 350 / 1 200 at a flat ~1.25 and misses `Booster`'s
|
||||
runtime one:** watch which of the two constant sets reaches the live flight
|
||||
struct, and re-measure with the afterburner held.
|
||||
|
||||
## 🔴 BLOCKED: the analog-curve block is referenced by nothing
|
||||
## 🟡 The analog-curve block is referenced by nothing *that I can see* — verdict softened
|
||||
|
||||
The `AnalogRevice_*` / `Tweak` schema is a second contiguous block at
|
||||
**`0x820A119C–0x820A1378`**, in the object's own order:
|
||||
@@ -148,10 +148,22 @@ minimum_side_s receipt_match_spd order_cancel_time YawMagForNormal
|
||||
AnalogRevice_adv_roll … AnalogRevice_throttle (8 curve names)
|
||||
```
|
||||
|
||||
**0 of its 28 strings has a code xref, and no instruction anywhere in the
|
||||
disassembly names a `0x820A1xxx` operand.** Control: the neighbouring block that
|
||||
`sub_822F9498` reads scores **36/36**. So this is a real absence, not a query
|
||||
mistake — but its cause is unexplained, and the reader is 🔴 unreachable this way.
|
||||
**0 of its 28 strings has a code xref**, no instruction names a `0x820A1xxx`
|
||||
operand, and a base-plus-displacement sweep (2 283 functions that form the
|
||||
`0x820A` high half) reaches it **0** times.
|
||||
|
||||
🟡 **But "no xref" does not mean "no reader", and the corpus proves it.** The
|
||||
*unit*-definition name block at `0x82085B38` — which includes `Maneuver` — also
|
||||
has **0 xrefs**, and it is read by `sub_82341A20`, which builds every key as
|
||||
`addi rX, r30, -N` from a base **passed in a register** (`Maneuver` sits at
|
||||
`0x82088F94 − 13404`). No static xref can see that, and my base-tracking sweep
|
||||
cannot either: run against that known-read block as a **control**, it recovers
|
||||
only **5** references and misses `sub_82341A20` itself.
|
||||
|
||||
⇒ The measurement stands; last iteration's 🔴 "the reader is unreachable" was too
|
||||
strong. The honest verdict is **🟡 not found by xref or by naive base tracking,
|
||||
both of which have a demonstrated blind spot** for register-passed bases. A
|
||||
runtime watch is still the cheap way in.
|
||||
|
||||
⚠️ **The twin-string-block trap, in the flesh.** `mov_stick_play` and
|
||||
`eye_stick_play` each exist **twice**; only the *second* copy (`0x820AA630`,
|
||||
|
||||
Reference in New Issue
Block a user