From 78140fb73f72a131bce8f35a427e32fb8084764b Mon Sep 17 00:00:00 2001 From: DoubleGate Date: Fri, 18 Sep 2026 01:31:22 -0400 Subject: [PATCH] docs: the v2.6.19 notes described a design the same release reverted The published release body is the CHANGELOG's `[2.6.19]` section verbatim, and that section contradicted itself. Its first bullet asserted: "`oam2_overflowed` and `oam2_fetch_frozen` are TWO states with the dot-257 latch between them, because a wrap after 257 must not disturb the fetch already in progress." while the seed bullet forty lines below recorded "removing the dot-257 freeze latch" as one of the two RTL changes that superseded the release's own first seed table. Both statements shipped. The second is correct: 197da5b deleted the latch, no such signal is declared, and all four read sites take the live flag. This is the defect this project records most often -- prose asserting an intent the code no longer has -- and it reached users, because the bullet was written while the latch existed and nothing re-read it after the latch was removed later in the same release. An RTL reviewer caught the identical claim in the source comment beside the code; nobody re-checked the release notes for it. Corrected in place with the reason stated, rather than quietly replaced: the entry now says there is ONE live flag, why the latch was wrong (a single sample at dot 257 misses every re-enable later than 257, which is exactly the case the ROM names), why it was unnecessary once the increment window became the 32 even dots 258..320, and that the counter is NOT yet the read pointer -- which is what the one remaining divergence tests. Also adds the verification the entry never stated: ladder 147 of 147 with 0 failed, AccuracyCoin on the DUT 148 of 149 with fail=0 and coverage 149 of 149 on both sides, the unchanged emulation core holding 144/144 and nestest 0-diff by construction, the shipped `.rbf` named with its seed and size, and the standing disclosure that no hardware has run it and what the gates cannot reach. The GitHub release body is updated to match in the same change. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_014qfTKi2M3swo7qnwvYCkDj --- CHANGELOG.md | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7619644..994b8b6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,9 +35,24 @@ cycle-accurate core later replaced. OAM-corruption seed: no 63/255/339 reset, no overflow flag, no dot-257 latch. All three land, written from AccuracyCoin's own prose — a test ROM is stimulus, not a reference implementation, and no third-party core was read - (ADR 0037 applies). `oam2_overflowed` and `oam2_fetch_frozen` are **two** - states with the dot-257 latch between them, because a wrap after 257 must not - disturb the fetch already in progress. + (ADR 0037 applies). **There is ONE live flag, `oam2_overflowed`, and sprite + fetch reads it directly at all four read sites.** An earlier draft of this + release latched it at dot 257 into a second `oam2_fetch_frozen`, on the + reasoning that a wrap after 257 must not disturb a fetch already in progress + — and this entry described that design until after it had been published, + which is corrected here rather than quietly replaced. The latch is wrong + about the rule it implements: AccuracyCoin says rendering re-enabled ON OR + AFTER dot 256 leaves the fetch reading index 0, and a single sample at 257 + misses every re-enable later than 257 — one at dot 260 found the flag clear + and fetched normally. It is also unnecessary once the increment window is the + 32 even dots 258..320 rather than 33 from 256, because the counter can then no + longer wrap before the fetch window ENDS. Two defects, and the latch was + masking the other one. + + The counter is live and carried across scanlines and **is not yet the read + pointer** — the fetch still indexes by dot except when the flag forces index + 0. That gap is this release's one declared divergence, and making the fetch + read `oam2_fetch_addr` directly is the remaining work. - **`RustyNES.srf`**, the message-suppression file the MiSTer template ships and the contributing wiki lists among a core's standard files. Four rules, one per @@ -157,6 +172,23 @@ cycle-accurate core later replaced. Every error here was invisible in any single run and obvious the moment two runs were compared. +- **What this release was verified against.** The co-simulation ladder is + **147 of 147, 0 failed**, with no skipped rows. AccuracyCoin on the DUT is + **148 of 149** — `fail=0`, coverage 149 of 149 entries executed on both sides + — and the single differing entry is `Misaligned OAM2 Address`, the one that + tests the read-pointer half above. Both were re-run on the FINAL RTL rather + than inherited from earlier in the release. The emulation core is unchanged, + so **AccuracyCoin 144/144 and nestest 0-diff hold by construction**. The + bitstream ships as `RustyNES_20260917.rbf` (seed 3, 4,018,912 bytes), + attached to the GitHub release on **both** repositories, and it is the one + built from the final RTL — an earlier staged copy predated three later + commits and was rebuilt before merging. + + **No hardware has run it.** The PPU gate compares the pre-palette index and + the APU gate per-channel integer levels, so the palette, the video timing + constants, the absolute audio level and its band-limiting sit downstream of + every gate, unverified by construction. + - **`cpu_interrupts_v2` is ticked, three releases late.** `to-dos/mister/TASKS.md` read "DEFERRED — not started" while `docs/mister.md` had said since v2.6.15 that the five ROMs are verdict gates. Settled by running the ladder rather than