Skip to content

RustyNES v3.0.1 — "Mortar" (the open items closed, one game's graphics fixed, the last MMC3 rule exception tested in the MiSTer core, Rust 1.99 everywhere, every unanswered bot review answered, and a roadmap to v4.0.0)

Choose a tag to compare

@github-actions github-actions released this 07 Oct 14:47
48173a3

RustyNES v3.0.1 — "Mortar"

A maintenance release on v3.0.0. It fixes one game's graphics, reaches the last untested exception of the MMC3 timing rule in the MiSTer core (and fixes the one-cycle defect that found), moves the toolchain and every dependency to its newest release, answers every bot review left unanswered since PR #1, settles two provenance questions, and writes the plan to v4.0.0. Movies recorded with v3.0.0, and netplay peers running it, are refused: the emulation epoch rises to 2. Save states are unaffected.

Breaking change

  • Movies and netplay from v3.0.0 are refused. The mapper 45 fix below changes what Famicom Yarou Vol.1 produces, so EMULATION_EPOCH rises from 1 to 2 (ADR 0045). The refusal names both epochs. Save states load as before.

Fixed

  • Famicom Yarou Vol.1 7-in-1 draws its menu. Mapper 45 (GA23C) addresses a cartridge's CHR-RAM unbanked, as the board does; the emulator had banked it like CHR-ROM and drew noise (T-GA23C-CHRRAM).
  • The MiSTer core's MMC3 timing, one cycle on odd frames. v3.0.0's dot-0 rule for the background's A12 had an exception for the dot the odd-frame skip replaces, and nothing ever reached it. A new generated test ROM does, and found that a $2001 write taking effect one dot late still applied the rule, so the MMC3 interrupt came one CPU cycle early. The rule now asks whether cycle 0 was rendering. The core and the emulator agree on all 2,978,055 cycles of the new test, and a new comparison of the cycle on which each interrupt rises catches the exception's mutant, which the bus comparison alone could not.
  • Every unanswered bot review, back to PR #1, answered. 290 unanswered review threads, review-body findings and Antigravity reviews across both repositories got 473 verdicts; the 80 still valid were fixed. Among them: the Bisqwit NTSC filter kept showing the last game frame after a ROM was closed; a mapper-0 override saved from the ROM Database panel vanished on restart; the release tooling could exit 0 on a stale lockfile; three release audits could pass on prose they should fail; and Dependabot's egui holds blocked every future egui and wgpu update (now a group that moves them together).

Provenance

  • The shared Bisqwit NTSC pass is recorded as derived. Its documentation called it an independent implementation, but it is a generated copy of the desktop filter, whose tables were long recorded as ported from Bisqwit's C via Mesen2. It now carries the same attribution, and the audit lost the exception that hid it.
  • The TriCNES source moved out of the repository. TriCNES (MIT, by the AccuracyCoin author) stays the one reference whose source may be consulted, for AccuracyCoin work and always attributed. The committed cross-diff evidence stays.
  • A softened comment in the Sunsoft 5B mixer says "derived from" again.

Toolchain and dependencies

  • Rust 1.99, everywhere. The libretro buildbot moves too: the release first held it on 1.96 because its build image passed a flag Rust 1.97 rejects, then found the image had dropped it, and a test branch built all 15 buildbot jobs on 1.99, Apple included. CI now fails if the two toolchains ever differ.
  • Every dependency at its newest release: crates, GitHub Actions (macOS jobs move to macos-15), Android (cargo-ndk 4, NDK r30), the web build (wasm-opt now pinned), the documentation build, and Docker images (Rust 1.99, Debian 13).

The MiSTer core

  • Release candidate, not hardware-verified. No hardware has run either bitstream.
  • The co-simulation ladder is 200 passed, 0 failed, 1 expected failure on-die and 201 passed, 0 failed, 1 expected failure off-die, each from one run of a frozen tree, with nothing skipped. The one new gate is the odd-frame A12 test above.
  • New bitstreams, because the fix is RTL. Both builds are compiled at fitter seed 2, chosen from eight seeds swept on one build date (261007), every one of which closes on both builds. Each was compiled twice to the same bytes:
    • on-die RustyNES_MiSTer-v3.0.1.rbf, md5 7e81a71869760b35a2fd04e6309c5c39 (timing margin +0.448 ns setup, +0.113 ns hold);
    • off-die RustyNES_MiSTer-v3.0.1-offdie.rbf, md5 88d1dfa53a94996a92c0f768b3be3039 (+0.401 / +0.096 ns; the SDRAM read +0.447 / +1.184 ns, assuming zero board delay).
  • The bitstreams carry the sweep's build date, which may be earlier than the release date.

The road to v4.0.0

The plan from v3.1.0 to v4.0.0 is written (to-dos/plans/v3.1-to-v4.0-line-plan.md), from 29 maintainer decisions. v4.0.0 makes the remaining public enums #[non_exhaustive] and brings the MiSTer core to feature parity. The hardware-verification release (the SuperStation One board session and the mobile device run) comes at the end of the v3.9.x line, so it tests the near-final core.

Verification

  • --features test-roms: 3,234 passed, 0 failed, 11 ignored.
  • The local commercial suites: external_real_games 60/0, external_extended 137/0, external_coverage 6/0 over every staged ROM. The one moved baseline is Famicom Yarou Vol.1, which now draws its menu.
  • AccuracyCoin 144/144, nestest 0-diff.
  • The libretro buildbot: all 15 jobs on Rust 1.99 before the pin was lifted.

Install

  • Download the pre-built binaries for Linux, macOS, and Windows below.
  • The MiSTer core bitstreams are attached below, as a release candidate, not hardware-verified. The on-die build is RustyNES_MiSTer-v3.0.1.rbf, also attached under its datecoded name RustyNES_20261007.rbf, and the off-die build is RustyNES_MiSTer-v3.0.1-offdie.rbf.
  • The WebAssembly build is live at doublegate.github.io/RustyNES.
  • The RetroArch core is in RetroArch's Online Updater on the platforms the libretro buildbot publishes to.
  • Licensed under GPL-3.0-or-later.