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:
@@ -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 12–15) and left stick (ring bits 4–7) 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
|
||||
|
||||
Reference in New Issue
Block a user