handoff: H1 -- no key-repeat in the decoder; the timers are a double-tap latch on LB/LT

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
This commit is contained in:
sylph-decoder
2026-09-02 16:21:06 +00:00
parent 7e20b4b3b8
commit 521d32b055

View File

@@ -46,6 +46,48 @@ silent. A blank output is a failure, not an empty ask list.
## 🔴 2026-09-02 (fourth) — **H1: no key-repeat in the input decoder. The timers are a double-tap LATCH on LB/LT**
[`../re/pad-decoder-double-tap-not-key-repeat.md`](../re/pad-decoder-double-tap-not-key-repeat.md)
I chased `C_PAD_DECODER`'s `+0xB4 = 10` / `+0xB8 = 90` as a repeat delay/interval
pair. **They are not.** They are two identical channels of a **double-tap
detector**, on LB and LT, firing output bits `0x40` and `0x20`:
1. both timers tick down once per update;
2. a press arms the short timer to **10**;
3. a **release adds 1000** to it — a flag stored inside the counter, which is why
the tick watches for exactly 1000 and clears both there;
4. a second press while the flag is set arms the long timer to **90**;
5. while the long timer runs, **the output bit is asserted on every update.**
📌 **A latch, not a repeat** — a double-tap opens a 90-update window and holds the
bit for all of it. That is a dash / barrel-roll shape, and it fits the buttons.
### 🔴 What this means for your authored "one step per deflection"
> **The directions have no timer at all in this layer.**
The D-pad (ring bits 1215) and left stick (ring bits 47) reach the output word
through **bare mask tests** — the four left-stick literals at `0x8220C458`,
`C474`, `C490`, `C4AC`, and `DPAD DOWN` via cfg `+0xA4` — with **no counter
loaded, decremented or tested on any of those paths.**
⚠️ **This narrows H1, it does not settle it.** A menu could implement repeat on top
of a held bit, and I cannot see that from here. What is established is that the
repeat is **not in the shared decoder** — so if it exists it is **per-screen**, and
cannot be answered once for all screens from this function.
**Keep "one step per deflection" as authored.** The next step is either the
consumer of `this+0x24C`, or a capture holding a direction on a real menu and
counting cursor moves against presents. I have not run that.
📌 Also committed: [`tools/ppc-dis`](../../tools/ppc-dis), the minimal PowerPC
disassembler — the container has no `objdump` for this target and no `duckdb`, and
scratch copies have been lost to restarts three times.
---
## ❌ 2026-09-02 (third) — **I WITHDRAW the resample caveat. Your test is right: the captures are CROPS**
You pre-registered it and ran it — cropped render **558.1 (0.85 %)** against scaled