From 83341f1ec0651df46aeb5692569d7d2413e131ea Mon Sep 17 00:00:00 2001 From: Cyd Date: Sun, 19 Jul 2026 16:29:16 -0500 Subject: [PATCH] e0test: check-exchange acceptance stage for edit 6; record RC1 first-light MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the flip leaves counters over threshold, the tool now sends a CheckRequest (ACKing every status frame) — edit-6 chips must repaint and re-render the E0 readout; 04000000 marks a pre-rc1 chip. Analysis records the stock-chip archaeology (stock also leaves 04000000, but the ungated E0 readout papered over it in period — our fixes exposed it) and RC1's below-threshold first-light PASS (version+check -> F0). Co-Authored-By: Claude Fable 5 --- rio-firmware/RIOv4_2-ANALYSIS.md | 17 ++++++++++++++--- tools/RioSerialMonitor/E0Test.cs | 21 ++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/rio-firmware/RIOv4_2-ANALYSIS.md b/rio-firmware/RIOv4_2-ANALYSIS.md index 6ab2086..5d06d8f 100644 --- a/rio-firmware/RIOv4_2-ANALYSIS.md +++ b/rio-firmware/RIOv4_2-ANALYSIS.md @@ -522,6 +522,17 @@ hooked from the handler's final notify (`$C5E4`): `JSR $C70E` (original notify), `JSR $CB7C` (repaint `F0000000`), `JSR $D5F2` (re-render the E0 readout, which the edit-5 gate suppresses below threshold), `RTS`. Built into **`RIOv4_3rc1.bin`** (with edits 1-2 and 5; sha256 -`dc59bd51cae3…`) — awaiting burn + on-hardware verification, after -which the image is christened RIO 4.3. Prior generations moved to -`archive/`. +`dc59bd51cae3…`); prior generations moved to `archive/`. + +Why `04000000` was never seen in period (user-verified by re-slotting +the ORIGINAL stock chip, 2026-07-19): stock leaves the same stale frame +after every check, but the ungated E0 readout papers over it at the +first counter event — `04000000` flashes momentarily, then `E000000x` +as errors accrue and the reply-latch wedge trips under load. The wedge +fix plus the E0 threshold gate are what exposed the stale frame. + +**RC1 first-light (burned 2026-07-19): PASS on the below-threshold +path** — a version+check exchange now leaves the display at `F0000000`. +Remaining for the RIO 4.3 christening: over-threshold check repaint +(must re-render the E0 readout), `--e0test` regression, mash +spot-check. diff --git a/tools/RioSerialMonitor/E0Test.cs b/tools/RioSerialMonitor/E0Test.cs index 708ddba..c9d7945 100644 --- a/tools/RioSerialMonitor/E0Test.cs +++ b/tools/RioSerialMonitor/E0Test.cs @@ -125,8 +125,10 @@ internal static class E0Test { if (--frameCountdown > 0) continue; repliesSeen++; - if (ackMode == AckMode.Immediate && !ackSent) + if (ackMode == AckMode.Immediate) { + // ACK every completed frame (check replies + // arrive as several 0x85 frames in a row). ackSent = true; respond = 0xFC; } @@ -204,6 +206,23 @@ internal static class E0Test for (int k = 0; k < flipEvents && ok; k++) ok = await RunEvent(AckMode.Never, "flip"); + if (ok) + { + // Edit-6 acceptance (rc1/RIO4.3 chips): a CheckRequest self-test + // must repaint the display afterwards — F0000000 when healthy, + // or the E0 readout when counters are over threshold (they are + // now, after the flip). Chips without edit 6 show 04000000 here. + PhaseReset(AckMode.Immediate, 0x85, 4); // check replies: cmd+2+ck + await transport.WriteAsync(new byte[] { 0x80, 0x00 }, CancellationToken.None); + byte[] chk = await Collect(4000, _ => false); // self-test ~1-2s, lamps flash + int checkReplies = Count(chk, 0x85); + Console.WriteLine($"[check ] CheckRequest sent: self-test ran (lamps flash), {checkReplies} status frame(s)."); + Console.WriteLine($" Edit-6 chips repaint, then re-render the over-threshold E0 readout."); + Console.WriteLine($" >>> DISPLAY SHOULD NOW READ: {Expected(cycles, teardowns)} (may run one higher in the last pair;"); + Console.WriteLine($" 04000000 here = no edit 6 on this chip) <<<"); + await Task.Delay(3000); + } + Console.WriteLine(); Console.WriteLine("== done =="); Console.WriteLine($" final predicted counters: $3184=${cycles:X2} $3185=${teardowns:X2} -> display {Expected(cycles, teardowns)}");