-
-
Notifications
You must be signed in to change notification settings - Fork 2
chore(release): cut v2.6.5 "Muster" — rung 5 closes, all 146 AccuracyCoin entries identical #475
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
b8b2b0a
docs(plan): v2.6.5 closes rung 5, and the planned rung-6 work defers
doublegate fa2fd55
docs(plan): record what v2.6.5's two tasks actually returned
doublegate 5e1bc5a
fix(core): clock the controller on the CLK edge that ENDS a read, not…
doublegate 3c00638
docs(accuracy): triage AccuracyCoin's sixteen coded passes
doublegate 2bf4c74
docs: the agy destructive-replace note was stale, and it was repeated…
doublegate 150372f
fix(core): only an actual STROBE drops an owed controller shift
doublegate 8906428
chore(gitignore): add *.dut.bin, the fifth golden suffix this list la…
doublegate 63c7c69
docs: fold v2.6.5's findings into the standing rules and the plan
doublegate 2f8dfcd
feat(cosim): export the per-dot PPU state fixture as an opt-in diagno…
doublegate 32624fd
feat(ppu): carry the $2007 read buffer in the per-dot state trace (sc…
doublegate 96134c0
docs(plan): $2007 Stress Test closes; rung 5 is 4 of 146 differing
doublegate a7f9d91
test(roms): build ALE + Read and Hybrid Addresses sub-test ROMs
doublegate 69b8bde
feat(ppu): stamp each state-trace record with its CPU cycle (schema 4)
doublegate abe9262
test(roms): build the Sprite 0 Hit behavior sub-test, and record why …
doublegate 18ccbf9
ci(cosim): run the excluded crate's tests under ppu-state-trace too
doublegate 9f4aa3b
chore(release): cut v2.6.5 "Muster"
doublegate c45078b
docs(plan): rung 5 closed; rung 6 re-scoped from v2.6.5 to v2.6.6
doublegate 7e19780
fix(ci): three failures the local run missed, and the grep that hid one
doublegate 6ae7554
fix: six CodeRabbit findings, and a stale test one of them exposed
doublegate 3cb4b30
fix(bus): the Four Score chain clocks with the pads, not on every read
doublegate 2edf0f5
style(test): line continuations in the trace_cpu_cycle exclusion reason
doublegate 44e39e5
style(cosim): rustfmt the excluded crate
doublegate File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| # RustyNES v2.6.5 "Muster" | ||
|
|
||
| Rung 5 closes: the AccuracyCoin status vector is identical entry for entry across all 146 entries, with 146 of 146 executed on both sides and none `NotRun`. | ||
|
|
||
| A muster is a roll call where every name is called **and answered**. That is this release's acceptance exactly, in two clauses: the vector agrees entry for entry, *and* no entry is unrun on both sides. The second clause is v2.6.4's addition — without it, an identical vector over entries that never executed is a pass, and was one. | ||
|
|
||
| ## The gate | ||
|
|
||
| ```text | ||
| coverage: 146 of 146 entries executed on both sides (0 on neither, 0 on one side only) | ||
| status vectors are IDENTICAL entry for entry across all 146 entries. | ||
| ``` | ||
|
|
||
| Measured over the 4500-frame golden, 134,012,761 cycles. At the version's start the same gate read **5 of 146 executed** and 22 differing. | ||
|
|
||
| ## Five defects, and the shape they share | ||
|
|
||
| Four of the five were invisible to every gate that existed when the version opened, and the recurring shape is **a gate agreeing about a question it was never asked**. | ||
|
|
||
| **The background shift registers' reload and their shift clock need separate gates.** With one shared gate `BG Serial In` was not merely failing, it was *arithmetically unreachable*: reload dots are absolute, so on a render re-enable the next reload is at most seven dots away, and the reload discards the low seven bits — a serial-in one can never reach bit 7, on any alignment, for any stimulus. Modelling both structures reproduces **both** measured shifter values, the oracle's `F807` falling out of the split model without being fitted to it. | ||
|
|
||
| **That fix alone left the gate red.** The sprite X counters are **not** gated on rendering, and AccuracyCoin's `Stale Sprite Shift Registers` test 2 states it outright — "Rendering was disabled for 18 ppu cycles, but the sprite counters were NOT halted during that time". This core froze them, so a disable/enable pair pushed every sprite right by the width of the window. **The ROM that states the rule passes either way**: it expects no hit at X=254, and a sprite shoved 18 dots further right is also off the end of the line. | ||
|
|
||
| **The PPUADDR second-write `v <- t` copy is delayed**, and the wiki says so inside the write sequence itself — "wait 1 to 1.5 dots after the write completes". This core committed it in the write's own edge. Swept 1 to 4 dots (all close `Hybrid Addresses`) against a control at 8 and 12 (both fail, which is what proves the parameter reached the compiler); the documented minimum ships. | ||
|
|
||
| **The pre-render line clears secondary OAM.** The whole evaluation block — *including* the clear — was gated on `scanline < 240`, so the pre-render line kept what scanline 239 had left and the next frame's scanline 0 drew it. **No sprite can ever render on scanline 0**, because OAM Y is stored one less than the display row. A sprite-0 probe over the full battery named it in one run: 24 hits in 134 M cycles, four of them at scanline 0, one per frame. | ||
|
|
||
| The fifth, the octal latch holding across the read dot, is verified by exactly one gate and was unverifiable until the fourth landed — the two compose the hybrid address together and neither produces it alone. | ||
|
|
||
| ## A diagnosis retracted | ||
|
|
||
| The residual was read as a **two-dot CPU/PPU alignment error**, from comparing per-dot record spans across two instruments. Three configurations refute it: at the committed alignment the two consoles execute identical `pc`, `bus_addr` and `bus_access` for **1,695,131 cycles**, while a two-dot power-on shift moves the first divergence back to 593,228 and takes the differing share from 5.13% to 66.80%. The "two dots" was two instruments stamping their records at different points in the cycle — the v2.5.7 lesson, third occurrence. | ||
|
|
||
| ## Also | ||
|
|
||
| `rustynes-cosim`'s `state_trace_records_carry_their_cpu_cycle` was gated on a feature no CI step enabled, so it **ran nowhere** — a regression test the gate could not reach, which is the shape the surrounding CI steps exist to prevent. It now runs, and the test that is genuinely inapplicable under that feature is gated out with its reason rather than left failing. | ||
|
|
||
| **The oracle changes on the default path** (a `Controller::write_strobe` owed-shift fix), so **AccuracyCoin 141/141 (RAM decoder)** and nestest 0-diff are **verified, not asserted**. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.