e0test: check-exchange acceptance stage for edit 6; record RC1 first-light

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 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-19 16:29:16 -05:00
co-authored by Claude Fable 5
parent 2ef632a1c2
commit 83341f1ec0
2 changed files with 34 additions and 4 deletions
+14 -3
View File
@@ -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.
+20 -1
View File
@@ -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)}");