Christen RIO 4.3: RIOv4_3.bin is the production firmware

Final gate passed: 120s mash at 549 presses/min sustained (heaviest
stress run of the campaign) — zero wedges, counters flat, NAK 0, all
247 resends healed. RIOv4_3rc1 renamed to RIOv4_3.bin (same bytes,
sha dc59bd51cae3...); README/ANALYSIS promote it, production table
updated (native-game cabinets -> RIOv4_3.bin; FastRIO 4.3 variant is
build-on-demand with the documented flag set + acceptance ladder).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-19 16:53:02 -05:00
co-authored by Claude Fable 5
parent e7869a6d04
commit be70e61d07
5 changed files with 64 additions and 27 deletions
+25 -22
View File
@@ -41,37 +41,40 @@ the SCI state machine (protocol constants FC=ACK FD=NAK FE=RESTART
FF=IDLE, idle-reload-4 patterns), patch the early-ACK/error wedge path or
widen its window, burn a new EPROM, keep this original safe.
## Current work candidate — `RIOv4_3rc1.bin`
## RIO 4.3 — `RIOv4_3.bin` (current production firmware)
Built by `make_patch.py --e0thresh=5 --checkrepaint RIOv4_2.bin
RIOv4_3rc1.bin`; sha256
`dc59bd51cae34781cf42f338e44a020b249a4030acc3c584af916aee9ca881e3`
**Christened 2026-07-19** after full on-hardware certification. Built
by `make_patch.py --e0thresh=5 --checkrepaint RIOv4_2.bin RIOv4_3.bin`;
sha256 `dc59bd51cae34781cf42f338e44a020b249a4030acc3c584af916aee9ca881e3`
(68 bytes changed vs stock). 9600 baud, native-game compatible. On the
stock v4.2 base it carries:
1. **Reply-latch wedge fix** (edits 1-2) — bench-certified.
2. **E0-display threshold, N=5** (edit 5) — bench-certified 2026-07-19
(held `F0000000` sub-threshold, flipped to `E0000105` at the 5th
teardown; mash regression clean).
3. **Check self-test display repaint** (edit 6, NEW) — the CheckRequest
handler previously left a stale `04000000` frame on the display; a
10-byte cave at `$E020` now repaints `F0000000` after every check,
then re-renders the `E0` readout only if a counter is at/over
threshold. **Needs on-hardware verification**: after a burn, any
version+check exchange (tray connect, monitor, mash start) must
leave the display reading `F0000000`, not `04000000`; then re-run
`--e0test` (expect the certified behavior unchanged) and a mash
spot-check.
2. **E0-display threshold, N=5** (edit 5) — certified: display holds
`F0000000` through sub-threshold error events, flips to the live
`E0` readout at the 5th teardown (`E0000105` on the bench).
3. **Check self-test display repaint** (edit 6) — certified both ways:
version+check leaves `F0000000` when healthy, and re-renders the E0
readout when counters are over threshold (`E0000305` on the bench)
instead of stock's stale `04000000`.
Once edit 6 is verified on the cockpit, this image is christened
**RIO 4.3**.
Certification runs (all in `testlogs/` + RIOv4_2-ANALYSIS.md): two
`--e0test` acceptance passes (display verified by eye at each step) and
a 120 s mash at **549 presses/min sustained** — zero wedges, board
counters flat, zero NAK, 247 resends all healed
(`riomash-rio43rc1-9600-20260719-164901.log`).
A FastRIO 4.3 variant does not exist yet; when wanted, build it with
`make_patch.py --baud31250 --widen-ackwait --e0thresh=5 --checkrepaint`
and run the same acceptance ladder before deploying.
## Archive
All prior generations live in [`archive/`](archive/) with their
disassemblies: `RIOv4_2_patched` (wedge fix only), `_31250`/`_31250v2`
(FastRIO speed builds), `_62500`/`_125000` (speed-ladder science runs),
and the `_e0t5` pair (threshold without check-repaint; the 9600 one is
in the socket as of 2026-07-19 until rc1 is burned). Bench verdicts and
per-edit history: RIOv4_2-ANALYSIS.md. The pristine dump `RIOv4_2.bin`
stays at top level — it is the source every patch builds from.
and the `_e0t5` pair (threshold without check-repaint). Bench verdicts
and per-edit history: RIOv4_2-ANALYSIS.md. The pristine dump
`RIOv4_2.bin` stays at top level — it is the source every patch builds
from. RIO 4.3 is in the cockpit socket as of 2026-07-19; the original
AMD chip and the retired e0t5 burn are labeled and preserved.
+11 -5
View File
@@ -394,11 +394,11 @@ awaited exchange (~6-9 ms), so the real cadence is interval+exchange.
Absolute-schedule pacing would approach 40+ Hz; ~94% of actually-issued
polls were answered. Future host tweak, not firmware.
### Production configuration
### Production configuration (updated 2026-07-19: RIO 4.3 christened)
| deployment | chip | config.json |
|---|---|---|
| native-game cabinets | `RIOv4_2_patched.bin` (9600) | defaults (RioBaudRate 9600, AnalogPollMs 55) |
| RIOJoy-only cockpits (FastRIO) | `RIOv4_2_patched_31250v2.bin` | RioBaudRate 31250, AnalogPollMs 20-25, FTDI-class adapter |
| native-game cabinets | **`RIOv4_3.bin`** (9600; supersedes `archive/RIOv4_2_patched.bin`) | defaults (RioBaudRate 9600, AnalogPollMs 55) |
| RIOJoy-only cockpits (FastRIO) | `archive/RIOv4_2_patched_31250v2.bin` until a FastRIO 4.3 is built (`--baud31250 --widen-ackwait --e0thresh=5 --checkrepaint`) + acceptance-tested | RioBaudRate 31250, AnalogPollMs 20-25, FTDI-class adapter |
AppConfig.RioBaudRate + AnalogPollMs are plumbed through RioCoordinator;
stop-and-wait delivery is always on (near-zero cost on clean links).
@@ -544,5 +544,11 @@ frames hit a timeout-retry that our late ACK then rescued — so
subset that exhaust all 5 retransmits), and a timeout-recovered cycle
exits via the success teardown (no `$3185`), while NAK-recovered cycles
tear down through `$DA2F` (`$3185`). Every observation from both bench
sessions fits this model. Remaining for the RIO 4.3 christening: mash
spot-check.
sessions fits this model.
**CHRISTENED RIO 4.3 (2026-07-19).** Final gate: 120 s mash at 549
presses/min sustained (1129 presses — the heaviest stress run of the
campaign), zero wedges, counters flat, NAK 0, 247 resends all healed
(`testlogs/riomash-rio43rc1-9600-20260719-164901.log`). `RIOv4_3rc1`
renamed to **`RIOv4_3.bin`** (same bytes, sha `dc59bd51cae3…`) — the
production firmware for native-game cabinets.
View File
@@ -0,0 +1,28 @@
== RIO mash test :: COM1 @ 9600 8N1, 120s, chip label 'rio43rc1-9600' ==
lamp echo ON (drives reply/lamp collisions), wedge threshold 2.0s, poll 55ms, app auto-recovery DISABLED
log: c:\VWE\riojoy\riomash-rio43rc1-9600-20260719-164901.log
firmware: 4.2
counters before: RestartCount=0 AbandonCount=0 FullBufferCount=0 [board/lamp faults reported!]
>>> MASH NOW: two hands, 8 lamp buttons, as fast as you can. <<<
>>> Test runs 120s. A wedge alarm will beep + banner. <<<
>>> Ctrl+C ends the run early and still prints the summary. <<<
[ 31.92s] progress: presses=258 (258/min) analog=474 maxGap=0.64s wedges=0
[ 61.98s] progress: presses=588 (569/min) analog=918 maxGap=0.64s wedges=0
[ 91.98s] progress: presses=922 (601/min) analog=1356 maxGap=0.64s wedges=0
== MASH SUMMARY [rio43rc1-9600] ==
run : 120s on COM1, lamps on, wedge threshold 2.0s
firmware : 4.2
presses/releases : 1129 / 1118 (549 presses/min)
analog replies : 1811 (~2181 poll slots; 83.0%), sentinels 0
framing / NAK : 298 / 0 (command resends NAK/timeout: 247)
gap histogram : <100ms:1778 100-250ms:29 250-500ms:0 0.5-1s:3 1-2s:0 2-5s:0 >5s:0
longest gaps : 0.68s@121.9s, 0.64s@0.6s, 0.57s@122.6s, 0.15s@32.2s, 0.14s@84.3s, 0.13s@52.3s, 0.13s@51.5s, 0.13s@93.5s, 0.13s@60.1s, 0.13s@15.2s
wedge events : 0
counters before : RestartCount=0 AbandonCount=0 FullBufferCount=0 [board/lamp faults reported!]
counters after : RestartCount=0 AbandonCount=0 FullBufferCount=0 [board/lamp faults reported!]
counter delta : RestartCount=+0 AbandonCount=+0 FullBufferCount=+0
verdict : PASS — no wedge; compare gap histogram + counter delta to baseline
log file : c:\VWE\riojoy\riomash-rio43rc1-9600-20260719-164901.log