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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user