feat: v1.5.0 Workstream C — TASVideos pass + replay/TAS polish + NSF waveform scope - #103
Conversation
There was a problem hiding this comment.
Code Review
This pull request implements the v1.5.0 'Lens' Workstream C, introducing creator, TAS, and speedrun tooling. Key additions include a dedicated Replay / TAS window with device topology, timebase, and deterministic seek-to-frame controls, alongside a per-channel oscilloscope waveform visualizer in the NSF Player window. The test suite is also expanded with the older mmc3_test v1 suite and the dpcmletterbox visual regression test. Feedback on these changes identifies a bug where the seek slider fails to track the live cursor during playback, and a performance regression in the NSF panel where a closure unnecessarily allocates strings on every frame.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Audit RustyNES against the Nesdev "Emulator tests" + "Tricky-to-emulate games" indices and the christopherpow/nes-test-roms aggregator for committable tests beyond the 139 AccuracyCoin battery. - Wire the older `mmc3_test` v1 suite (6 sub-ROMs, blargg/kevtris PD, distinct from the already-wired mmc3_test_2): 1/2/3 strict-PASS; 4/5/6 pinned as documented expected-fail probes. They converge on the SAME ADR-0002 fractional-master-clock scanline-IRQ-cadence residual as mmc3_test_2/4 #3 — no new bug (sub-scanline IRQ cadence, deferred to v2.0). Probes assert the failure shape so a future fix flips them. - Add dpcmletterbox (Damian Yerrick, royalty-free) as a deterministic framebuffer-hash visual smoke — a DMC-IRQ-as-scanline-timer raster split with no mapper IRQ, so a sensitive DMC-IRQ + sprite-0 + NMI/DMC phase sentinel. - LICENSES.md + docs/testing-strategy.md + CHANGELOG [Unreleased] updated. No core change; AccuracyCoin 100% (139/139) and determinism hold. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
C2 — Replay / TAS window (Tools -> Replay / TAS), modelled on GeraNES's ReplayWindowUI: - device-topology read-out (per-port controller/peripheral + Four Score), - timebase read-out (region + whole-Hz + elapsed/total wall-clock), - Record/Play/Branch/Stop controls (mirror F6/F7/F8) + deterministic seek-to-frame (slider + Start/-10/+1/+10). The app pushes a read-only ReplayInfo snapshot each frame and drains a ReplayRequest after the egui pass. Seek re-derives state via MovieUi::seek_playback (seek_to_start + replay recorded inputs), proven bit-identical to linear playback by a new round-trip test — no new determinism surface. C3 — NSF waveform visualizer: a per-channel oscilloscope (pulse1/2, triangle, noise, DMC) in the NSF Player window, fed from the read-only apu_snapshot() DAC levels; surfaces the expansion-audio chip name when present. Output-only eye-candy; no synthesis change. Frontend-only, additive/off-by-default. All clippy flavors (default + scripting,hd-pack + retroachievements + both wasm) + fmt + rustdoc + no_std clean; AccuracyCoin 100% (139/139) and determinism hold. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3722e03 to
5168765
Compare
…no-alloc - replay_panel.rs: the seek slider now tracks the live playback cursor (it was static — `seek_target` only updated when it exceeded `last`, which never happens since the slider clamps to `0..=last`). Added a `seek_dragging` flag so live tracking pauses only while the user drags, then resumes after the seek. - nsf_panel.rs: `show_or_dash` is now a `fn` returning a borrowed `&str` (no per-frame `String` alloc for Title/Artist/Copyright). A `fn` (not a closure) so the return lifetime elides to the input — the closure form Gemini suggested fails borrowck (closures don't elide the return lifetime). Frontend-only, determinism-neutral. clippy (default + scripting,hd-pack + retroachievements + wasm) + fmt + AccuracyCoin 139/139 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.5.0 "Lens" — Workstream C: creator / TAS / speedrun tooling (beta.2)
All additive / off-by-default. Replay stays bit-identical, AccuracyCoin 100% (139/139) holds, and the shipped / native /
no_std/ wasm builds are byte-identical to beta.1 for non-test paths.C1 — TASVideos / extended emulator-test pass
Audited RustyNES against the Nesdev "Emulator tests" + "Tricky-to-emulate games" indices and the
christopherpow/nes-test-romsaggregator for committable tests beyond the 139 AccuracyCoin battery.mmc3_testv1 (6 sub-ROMs, blargg/kevtris PD) wired intotests/mmc3.rs(distinct ROMs from the already-wiredmmc3_test_2, same$6000protocol):#[ignore]'d strict tests +_currently_failsshape-probes. They converge on the same ADR-0002 fractional-master-clock scanline-IRQ-cadence residual as the existingmmc3_test_2/4chore(ci): Bump softprops/action-gh-release from 1 to 2 #3 (4-scanline chore(ci): Bump softprops/action-gh-release from 1 to 2 #3 "IRQ sooner when$2000=$08"; 5-MMC3 chore(ci): Bump actions/checkout from 4 to 6 #2 + 6-MMC6 chore(ci): Bump actions/checkout from 4 to 6 #2 "reload-to-0 IRQ cadence"). No new bug — sub-scanline IRQ cadence, deferred to v2.0 (do-not-grind directive honored).dpcmletterbox(Damian Yerrick, royalty-free) added as a deterministic framebuffer-hash visual smoke (tests/tasvideos_extended.rs) — a DMC-IRQ-as-scanline-timer raster split with no mapper IRQ, so a sensitive DMC-IRQ + sprite-0 + NMI/DMC-phase sentinel.scanline-a1,tvpassfail, etc. — stay in the gitignored local corpus.tests/roms/LICENSES.md+docs/testing-strategy.mdupdated.C2 — Replay / TAS window polish
Tools → Replay / TAS — a dedicated control + read-out surface (per GeraNES
ReplayWindowUI):Frontend-only over the existing
MovieUi/rustynes_core::Moviemachinery. The app pushes a read-onlyReplayInfosnapshot each frame and drains aReplayRequestafter the egui pass. Seek re-derives state (MovieUi::seek_playback=seek_to_start+ replay recorded inputs) — proven bit-identical to linear playback byseek_is_bit_identical_to_linear_playback. No new determinism surface.C3 — NSF waveform visualizer
A per-channel oscilloscope (pulse 1/2, triangle, noise, DMC) in the NSF Player window, fed from the read-only
apu_snapshot()DAC levels; surfaces the expansion-audio chip name (VRC6/VRC7/FME-7/N163/MMC5/FDS) when present. Output-only eye-candy — samples a copy for display, no synthesis change.Gates (all green)
cargo test --workspace --features test-roms— AccuracyCoin 139/139 (RAM 100.00%) + mapper honesty gate + the new C1 suites + all determinism-sensitive suites.cargo clippy --workspace --all-targets -- -D warnings+--features scripting,hd-pack+--features retroachievements+ both wasm flavours.cargo fmt --all --check·RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps·no_stdthumbv7em · markdownlint v0.39.0.Do not merge — for maintainer review.
🤖 Generated with Claude Code