re: AA_/AV_ are one interleaved block; the selection is still unfound

sub_822F9498 (the unit-definition loader, called only from sub_821A6CF0) is the
only function referencing the AA_/AV_ name strings.  Mapping each name to the
stfs that follows gives an exact interleave: AV_ at X, AA_ at X+8, for all five
axes -- PitchPlus 196/204, PitchMinus 212/220, Yaw 228/236, Roll 244/252,
AxisMode 320/328.  A selector is an offset of 0 or 8, not two lookups.

The 20 strings exist twice in the image; the first block is referenced by
nothing.  Data control: the ten suffixes match exactly between families.

The selection stays a reading: functions loading two or more of 196/204/320/328
number 39 image-wide, and only two are call-graph-reachable from the loader.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Claude (auto)
2026-08-27 17:54:53 +00:00
parent 36f97c6322
commit 4ffbd39a01
3 changed files with 88 additions and 3 deletions

View File

@@ -4432,3 +4432,47 @@ was designed, not before. The rule says grep the doc that owns the DATA first;
here the data was "wingman", the owning doc was `isl-condition-builtins.md`, and
reading it first would have reframed the iteration rather than corrected it
afterwards.
---
## ✅🔴 2026-08-27 — `AA_`/`AV_` are one interleaved block; the selection is still unfound
**Docs greped BEFORE designing the experiment** (the rule that cost me last
iteration): `unit-datasheet-static.md` **owns the field family** and already says
🟡 "anti-air vs anti-vessel is the obvious reading — **not adopted**, nothing here
shows the selection"; `live-unit-definitions.md` owns the runtime field map and
records that `AA_AxisMode_*`/`AV_AxisMode_*` default to 0;
`unit-struct-runtime.md` owns the `Maneuver` declaration-order result;
`flight-speed-law.md` and `isl-builtins.md` mention the prefixes in passing.
**What none of them says is which code reads them.**
✅ **Exactly one function references the names.** `sub_822F9498` — the
unit-definition loader, called only from `sub_821A6CF0` — reads 78 named float
fields; nothing else in the image touches an `AA_`/`AV_` string.
✅ **The layout is an exact interleave: `AV_` at `X`, `AA_` at `X+8`.**
PitchPlus `+196/+200` vs `+204/+208`; PitchMinus `+212/+216` vs `+220/+224`;
Yaw `+228/+232` vs `+236/+240`; Roll `+244/+248` vs `+252/+256`; AxisMode
`+320/+324` vs `+328/+332`. **The constant +8 is the finding** — a selector is an
offset of 0 or 8, not two lookups.
✅ **Data control:** the ten suffixes match **exactly** between families (list
equality, not a count); 690 records each for the eight rate fields, 36 each for
`AxisMode`. `AA_` is usually the larger value (`AA_AxisMode_Min` 100 vs 35;
`AA_Yaw_Max` 50 vs 25) — but `AA_PitchPlus_Min` 100 vs `AV_` 200 goes the other
way, so that is a description, not a rule.
⚠️ **The 20 strings exist twice** (`0x82085B98…` and `0x8209F674…`); the loader
uses the second block and **the first 20 are referenced by nothing**.
🔴 **The selection is NOT settled, and the offset route failed again.** Functions
loading two or more of `+196`/`+204`/`+320`/`+328` number **39** across the image
— those offsets are far too common to identify a consumer. Only two are
call-graph-reachable from the loader's owner (`sub_821A6CF0`, `sub_821AB650`);
that is the next handle. **"Anti-air vs anti-vessel" stays a reading**, exactly as
`unit-datasheet-static.md` had it.
**Method slip to record:** I dumped ~1 100 disassembled instructions to find the
name→offset mapping when a scripted `addi`→`stfs` pairing (which I then wrote
anyway) gave the same 20 lines. Script the extraction first; never eyeball a
4.5 KB function.