re: four ISL built-ins are tutorial-only, and 96 encodes the tutorial index

96, 97, 98 and 104 were unnamed. Measured over all 28 stages they form a
family that appears nowhere outside the six tutorials:

  96    8 sites   S18-S23 only
  97   38 sites   S18-S23 only, followed by start_coroutine 27/38
  98    0 sites   never called anywhere
  104  39 sites   S18-S23 only, followed by wait_s 39/39,
                  preceded by end_coroutine 37/39

104's adjacency is a textbook poll loop with no exceptions: coroutine starts,
tests the predicate, waits, repeats.

96's operand is the giveaway. Its eight payloads in stage order are
S18 -> 101, 102, 103; S19 -> 201; S20 -> 301; S21 -> 401; S22 -> 501;
S23 -> 601, i.e. (stage - 17) * 100 + section. Tutorial 1 has three sections
and the other five have one each, and the tutorial index is encoded in the
argument.

Names are deliberately NOT applied. tutorial_begin / tutorial_end /
tutorial_message_pending fit the shape, and [phase+340]/[phase+344] are said
to carry the state and payload, but I have not read that handler myself and
this file has already had to withdraw five names guessed from shape. The
distribution and the argument encoding are established and are what a port
needs; the labels can wait for someone to read the code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Sylpheed RE agent
2026-08-26 00:50:24 +00:00
parent cb830e233e
commit fa20db3db8

View File

@@ -140,6 +140,39 @@ and spread checks but its maximum *exceeds* the table — flag indices run 0..31
against symbol tables as small as 40 — so it is excluded, and the disassembler
now declines to resolve it rather than printing an invented name.
### ✅ Four built-ins are TUTORIAL-ONLY — 85 sites, every one in S18S23
`96`, `97`, `98` and `104` were unnamed. Measured over all 28 stages, they form a
family that appears **nowhere outside the six tutorials**:
| id | sites | stages | shape |
|---|---|---|---|
| **96** | 8 | S18S23 only | one call per tutorial *section* |
| **97** | 38 | S18S23 only | followed by `start_coroutine` (27/38) |
| **98** | **0** | — | never called anywhere |
| **104** | 39 | S18S23 only | **followed by `wait_s` 39/39**, preceded by `end_coroutine` 37/39 |
`104`'s adjacency is a textbook poll loop: a coroutine starts, tests the
predicate, waits, and goes round again — 39 sites, no exceptions.
`96`'s operand is the giveaway. Its eight payloads are, in stage order:
```
Stage18 → 101, 102, 103 Stage19 → 201 Stage20 → 301
Stage21 → 401 Stage22 → 501 Stage23 → 601
```
That is `(stage 17) * 100 + section`: tutorial 1 has three sections, the other
five have one each. The tutorial index is encoded in the argument.
🟡 **Names are NOT applied.** `tutorial_begin` / `tutorial_end` /
`tutorial_message_pending` fit the shape, and `sub_82260710` reportedly suspends
while `[phase+340] == 2` with the payload latched at `[phase+344]` — but I have
not read that myself, and this file has already had to withdraw five names
guessed from shape. What is established here is the **distribution and the
argument encoding**, which is what a port actually needs; the labels can wait for
someone to read the handler.
### ✅ Five built-ins are the mission banners — named from usage, not from a guess
`77`, `78`, `81`, `82` and `135` were unnamed. The engine has five contiguous