Skip to content

RustyNES v3.3.0 — "Plumbline" (v3.2.0's leftovers settled and its claims re-measured: CHR-RAM writes banked on seven boards, mapper 71's decode, Bandai and Somari states, a withdrawn performance figure, IRQ trace goldens that gate, and two off-die MiSTer fixes)

Latest

Choose a tag to compare

@github-actions github-actions released this 16 Oct 20:02
8611421

RustyNES v3.3.0 — "Plumbline"

v3.2.0's leftovers settled, and its claims re-measured. CHR-RAM writes now go through the bank registers on seven boards, mapper 71 decodes its bank select the way the documentation says, and v3.1.x save states of Bandai FCG games load again. One of v3.2.0's performance figures is withdrawn: the MMC3 read was never measurably faster, and the difference was where the linker placed the code. The IRQ-timing trace goldens, which had been rewritten on every run and compared against nothing, are a test now. On the MiSTer core, in simulation, the off-die build reads CHR-RAM back through $2007 and writes each downloaded CHR byte once. This release does not include the MiSTer Phase F2 work (the SDRAM arbiter, DDR3, save states, rewind) or the wgpu 31 / egui 0.37 upgrade that the v3.3.0 slot had planned; both move to v3.4.0. Movies and netplay from v3.2.x are refused.

Breaking changes

  • Movies and netplay from v3.2.x are refused: EMULATION_EPOCH rises from 4 to 5, because the CHR-RAM and mapper 71 fixes change what the bus sees. A v3.2.x peer or movie is refused as another emulator version, naming its epoch. Save states are not affected by the epoch.

Fixed

  • CHR-RAM writes go through the bank registers on seven boards: VRC2 and VRC4 (mappers 21-23 and 25), VRC6 (24, 26), Namco 163 (19), FME-7 (69), VRC1 (75, 151) and NINA-001 (34, submapper 1). Each read CHR-RAM through its bank registers but wrote it unbanked, so a CHR-RAM game could not read back the tiles it had uploaded. A new test asks every board and submapper the same question, and each of the seven fixes was shown to fail it alone. The one staged image this reaches, the TwinBee Yahoo!! Over the Sea music demo, drew a black screen and now draws its display.
  • Mapper 71 (Camerica) selects its PRG bank only at $C000-$FFFF, as the NESdev page and Kevin Horton's notes on the Camerica chips describe; a write to $8000-$BFFF no longer selects it. Fire Hawk's mirroring register answers across $8000-$9FFF. The MiSTer core already decoded it this way.
  • v3.1.x save states of Bandai FCG games load again (mappers 16, 153 and 159). v3.2.0 refused them; the EEPROM now comes back idle with its contents intact, as v3.1.x restored it, tested against states a v3.1.0 build actually wrote.
  • An FDS disk swap starts a fresh history timeline on the desktop, as a reset or a state load does, because a swap is not in a movie's input stream.

Changed

  • Mapper 116 (Somari) states are 4,168 bytes instead of 22,600, in every state, rewind frame, run-ahead step and netplay snapshot. A v3.2.0 state still loads.
  • A self-flashable board's battery save is compared only after it changes (GTROM, flashable UNROM 512; desktop and web). v3.2.0's change flag was never reset, so the comparison ran every second again after the first change.
  • Correction to v3.2.0: the MMC3 cartridge read is not measurably faster. v3.2.0 reported it about 9% faster. Built with forced code alignment, it measures the same before and after; in plain builds the same comparison now shows it 22% slower, with no change to its code. The MMC5 and FME-7 slowdowns v3.2.0 reported have the same cause and also vanish aligned. v3.2.0's run-ahead figure stands: aligned, run-ahead on an MMC3 game measures 6-7% faster, in three runs.
  • The IRQ-timing trace goldens are a test (the irq-timing-trace developer feature). The fixture rewrote its 21 traces on every run and compared nothing; 19 no longer matched the emulator, and 16 had never been produced by any RustyNES commit. A run now compares and fails on any difference. They were re-recorded once, with every difference traced to a release: v2.9.8's $4017 change, v3.0.0's MMC3 IRQ timing, and this release's NMI labels.
  • The Round 2 audit's leftovers are triaged: two fixed, two rejected on their bounds, two performance candidates rejected on aligned A/Bs (one is consistently 0.8-3.6% slower), four netplay findings deferred to a rollback-window ticket.

The MiSTer core

  • Release candidate, not hardware-verified. No hardware has run either bitstream.
  • Off-die: a $2007 read of CHR-RAM returns the byte written. The read's address was captured a dot late, so it read the next byte. The two expected failures it caused now pass.
  • Off-die: a ROM download writes each CHR byte once. The cartridge echoed every CHR byte of a download onto the SDRAM's CHR-RAM write path a console clock later, aimed at the address the reset-held PPU presented rather than the byte's own, so a CHR-ROM game's CHR could be corrupted (which byte, on hardware, was not measured). The simulation's loader shape hid it; a module gate now drives both loader shapes.
  • Mapper 185's CHR disable reaches the "more than eight sprites" option, so an extra sprite on a disabled board reads the floating bus like the line's other sprites.
  • The oracle pin moves to v3.3.0 (this release's merge): all 848 golden artifacts from 189 stems reproduce byte for byte.
  • The co-simulation ladder: 260 passed, 0 failed, 3 expected failures on-die and 263 / 0 / 3 off-die (v3.2.0: 259 / 0 / 3 and 260 / 0 / 5), each one run of a frozen tree, nothing skipped. The two off-die expected failures that v3.2.0 carried are the $2007 read-back above, and both pass. The loader echo does not show on the ladder, whose loader shape hid it; a module gate covers it.
  • New bitstreams at fitter seed 7, chosen from eight seeds swept on build date 261016 by the rule both builds share: the on-die build's binding margin chooses, and the off-die build must close at the chosen seed. Seed 8 leads on-die but misses setup off-die; seed 7 is next and closes both. Each was compiled twice to the same bytes:
    • on-die RustyNES_MiSTer-v3.3.0.rbf, md5 072838d7c1ccdf42bfbff48c37d12ff0 (+0.341 ns setup, +0.094 ns hold);
    • off-die RustyNES_MiSTer-v3.3.0-offdie.rbf, md5 b763153661f5830f44706ed08f228f52 (+0.123 / +0.111 ns). The SDRAM read capture has +0.439 ns setup and +1.176 ns hold over all four timing corners, assuming zero board delay.

Verification

  • cargo test --workspace: 3,068 passed, 0 failed, 7 ignored. --features test-roms: 1,624 passed, 0 failed, 4 ignored. --features test-roms,commercial-roms: 757 passed, 0 failed, 9 ignored.
  • The local commercial suites: external_real_games 60/0, external_extended 169/0, external_coverage 6/0 over every staged dump.
  • Every clippy, rustdoc, no_std and wasm invocation CI runs, clean.
  • AccuracyCoin 146/146, nestest 0-diff, the epoch fingerprint at epoch 5, 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.3.0.rbf, also attached under its datecoded name, and the off-die build is RustyNES_MiSTer-v3.3.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.