Skip to content

RustyNES v3.1.0 — "Bellwether" (the AccuracyCoin re-sync and an honest 146/146, the CPU overclock and the sprite-limit option in movies and netplay, PAL emphasis, the alternate MMC3, rewind and run-ahead on the Vs. cabinet, and the MiSTer core matched to all of it)

Latest

Choose a tag to compare

@github-actions github-actions released this 08 Oct 12:46
0caf45d

RustyNES v3.1.0 — "Bellwether"

The first release of the v3.1 to v4.0 line. AccuracyCoin is re-synced to its newest upstream, and the new ROM showed that every earlier 100% score included a failure the old ROM hid; both defects it found are fixed. Two long-shown options now work and travel with movies and netplay: a CPU overclock and the sprite-limit switch. PAL and Dendy emphasis is right, the alternate MMC3 revision is selectable and correct, the NTSC decode gains differential phase, and the two-screen Vs. cabinet gets rewind and run-ahead. The MiSTer core (RTL-1) now matches the emulator when a $2006 write meets the PPU's address pipeline. Save states, movies and netplay from v3.0.1 are refused.

Breaking changes

  • Save states from v3.0.1 do not load: BUS section 3 (the DMC write-refusal latch and the overclock's position) and PPU_SNAPSHOT_VERSION 13 (the sprite-limit option's pending sprites).
  • Movies from v3.0.1 are refused: .rnm format 6, whose options record carries the CPU overclock, the sprite-limit switch and the MMC3 revision. EMULATION_EPOCH rises from 2 to 3, because the two AccuracyCoin fixes change bus cycles and sprite evaluation.
  • Netplay: protocol 7 ("RNE7"). A v3.0.x peer is refused as another emulator version, naming its epoch.

AccuracyCoin, and an overstated score

AccuracyCoin is re-synced to upstream f5f41dc2: 151 rows, 146 scored, 146 of 146 pass. The old ROM had a bug: when Misaligned OAM behavior failed part-way, its fail path returned into the test instead of exiting, and the test recorded a pass. Upstream fixed it. On the fixed ROM RustyNES failed parts of that test, and so did every earlier release. Every AccuracyCoin 100% reported before v3.1.0 (144/144, and 141/141 before it) included that masked failure. v3.1.0 fixes it, and the DMC load-on-write defect the new DMA Landing on Write test found, so this 146/146 is the first without it.

Fixed

  • Misaligned sprite evaluation: evaluation starts from OAMADDR as of dot 65, copies four bytes from a start at a slot's last byte, and stays misaligned after an in-range X.
  • A DMC load DMA refused by a write takes four cycles, not three.
  • PAL and Dendy colour emphasis: PPUMASK bits 5 and 6 swap meaning on the 2C07 and the Dendy, so every PAL game that set emphasis was tinted the wrong way.
  • The alternate MMC3 revision fires on a $C001 reload to 0, the single IRQ the NESdev page documents; blargg's 6-MMC3_alt now passes under it.
  • The pattern viewer and HD packs no longer change the game on MMC2 / MMC4 boards (Punch-Out!!, Fire Emblem) or three others: their "side-effect-free" CHR read flipped the board's CHR latch.

Added

  • CPU overclock, 2 to 4 times, against the same picture and sound: the APU, mapper counters and PPU stay at the stock rate. Movies record it; netplay peers must match.
  • "Disable 8-sprite-per-scanline limit" works. It draws the dropped sprites behind the eight the console shows and changes nothing the game can see.
  • MMC3 IRQ revision setting (Auto / Sharp / Alternate), carried in movies and netplay.
  • Differential phase in the raw NTSC decode, display only, off by default.
  • Rewind and run-ahead on the Vs. DualSystem cabinet, on the whole cabinet, so the two consoles never fall out of step.
  • The emulation-epoch rule is a test (T-EPOCH-FINGERPRINT): output that moves without an epoch rise fails CI.

The MiSTer core

  • Release candidate, not hardware-verified. No hardware has run either bitstream.
  • It matches the re-synced AccuracyCoin, all 146 entries. The new ROM found the core's version of both defects: a misaligned sprite evaluation now masks the address after an out-of-range X byte, and a $4010 write on the DMC timer's reload edge sets that reload's period. The old Misaligned OAM behavior sub-test ROM, whose fail path fell through to a pass, is rebuilt from the new source; on it the core without the fix fails.
  • A $2006 write that meets the PPU's address pipeline matches the emulator (RTL-1). A new test ROM lands the copy on every dot of a rendering line: the core diverged on 28,129 of 331,838 background fetches and now matches all of them. One of the three rules involved, a copy delay that depends on where in the line the write lands, is the emulator's and is not documented (NESdev says a constant "1 to 1.5 dots"); it is provisional until a board can settle it.
  • 30 of 34 AccuracyCoin sub-test ROMs now gate the core, the other four out for stated reasons, and the core's oracle pin moves to v3.1.0: every golden that changed is attributed, and the other 646 artifacts are byte-identical.
  • The co-simulation ladder is 212 passed, 0 failed, 1 expected failure on-die and 213 passed, 0 failed, 1 expected failure off-die, each from one run of a frozen tree with nothing skipped: v3.0.1's 200 / 201 plus twelve new gates, and no existing gate moved.
  • New bitstreams, because the fixes are RTL. Both builds are compiled at fitter seed 1, chosen from eight seeds swept on one build date (261008), every one of which closes on both builds. Each was compiled twice to the same bytes:
    • on-die RustyNES_MiSTer-v3.1.0.rbf, md5 4afffd23f6c6d2577c2ead24fa2e6f54 (timing margin +0.255 ns setup, +0.100 ns hold, the largest on-die hold of the eight seeds);
    • off-die RustyNES_MiSTer-v3.1.0-offdie.rbf, md5 7b48198cc3b6a822e71ce54e53d2adbc (+0.188 / +0.001 ns; the SDRAM read +0.449 / +1.184 ns, assuming zero board delay). The off-die build shares the on-die build's seed, and at it closes by one picosecond of hold, its thinnest of the eight.
  • The bitstreams carry the sweep's build date, which may be earlier than the release date.
  • A self-hosted workflow now runs the whole ladder on the maintainer's runner, on manual dispatch.

Records

The MiSTer contribution page was rewritten in September; the new page and what it means for the submission are recorded, and the checklist re-scoped. Nine stale documents were corrected against the code, and the v1.8.x Android checklist is folded into the mobile run sheet.

Verification

  • --features test-roms: 3,269 passed, 0 failed, 11 ignored.
  • The local commercial suites: external_real_games 60/0, external_extended 137/0, external_coverage 6/0 over 744 staged ROMs. The one moved baseline is Millionaire (Sachen), a PAL game whose emphasis colours the PAL fix corrected.
  • AccuracyCoin 146/146 at upstream f5f41dc2, nestest 0-diff.
  • The epoch fingerprint gate passes at epoch 3, now recorded as the released epoch.

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.1.0.rbf, also attached under its datecoded name RustyNES_20261008.rbf, and the off-die build is RustyNES_MiSTer-v3.1.0-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.