Skip to content

v2.3.0 "Full Catalogue"

Choose a tag to compare

@doublegate doublegate released this 02 Jul 14:15

Rusty2600 v2.3.0 "Full Catalogue"

Closes the cart bankswitch catalogue to 26 of 26 schemes and lands three
more /goal follow-up items: DPC+ music-mode audio, script overlay
compositing, and a live-tested netplay STUN client.

CDF/CDFJ/CDFJ+ (T-0401-006, BestEffort tier)

BankCdf wires the last unimplemented scheme into rusty2600-cart::detect()
— one struct covering all four sub-versions (CDF0/CDF1/CDFJ/CDFJ+) via
a CdfVersion const table, ported from Gopher2600's Go cdf package.

Reuses BankDpcPlus's synchronous CALLFN-to-ProgramEnded ARM entry shape,
plus genuinely new mechanics DPC+ never needed:

  • FastJMP — redirects a JMP absolute instruction's own opcode fetch
    (not just an operand) through a data-fetcher stream, guarded by a countdown
    state machine ported to close a real, documented false-positive hazard in
    the reference.
  • A real ARMinterrupt fault-servicing dispatch — unlike DPC+'s no-op
    stub equivalent (DPC+'s driver never triggers it), CDF's driver ROM makes
    genuine host-serviced calls via a BX to a fixed non-Thumb address. Caught
    through rusty2600-thumb's existing Fault::UnimplementedPeripheral
    path — zero changes needed to that crate: Arm7Tdmi::instruction_pc()
    already reported the correct call-site address, and set_register's
    existing PC-storage convention already produced the correct resume target.
    Verified with a real hand-assembled Thumb-1 program that plants an
    actual BX instruction at the documented call-site offset and asserts the
    dispatch loop set the targeted music fetcher's frequency field — not just
    that a fault was caught.
  • CDFJ+'s version constants are derived via a runtime byte-pattern scan of
    the driver ROM (not a fixed table, per the reference).

DPC+ music-mode audio

BankDpcPlus gains a Board::tick() override advancing its 3 music
fetchers' phase accumulators every 59th call. Turned out to be a fully
self-contained rusty2600-cart fix — the hook it needed already existed and
was already called at the right rate, contrary to v2.2.0's own speculation
that this would need a rusty2600-tia change.

Script overlay compositing (scripting feature)

take_overlay()'s accumulated drawText/drawRect/drawPixel output now
actually reaches the screen — piggybacked on the frontend's existing egui
pass rather than a new render pipeline, reusing egui's own font
rasterization for text. Closes the v1.9.0 overlay-compositing gap.

Netplay STUN client (netplay feature)

A real RFC 5389 STUN client (via stun_codec, sans-IO, fitting this
codebase's 100%-synchronous convention) discovers this machine's public
NAT-mapped address, plus a best-effort UDP hole-punch and a "Connect via
STUN" dialog button. Live-verified — a genuine round trip against a real
public STUN server, confirmed passing and independently re-run during
release verification.

WebRTC (browser or native) remains explicitly deferred — it would need
either browser-only web-sys bindings or a native Rust WebRTC stack that
would pull an async runtime into an otherwise 100% synchronous codebase.

Documentation correction (no code change)

docs/cart.md carried a stale "E7... not yet implemented" claim this entire
session — BankE7 has actually been implemented and wired into detect()
since commit 94ca3a4 (2026-07-01), before the v1.1.0 release line even
began. This bug was silently copied into v2.1.0's and v2.2.0's own
CHANGELOG/STATUS entries without independently verifying it against the
code. Both prior entries stay published as-is (this project never rewrites
CHANGELOG history) — corrected here.

Test count

313 tests passing on default features (317 with --features test-roms), up
from 295 at v2.2.0. Full CI green — Linux/macOS/Windows + the no_std
gate.

What's next

Open follow-up work: real Xcode-verified iOS build/run (no Mac in this
sandbox), netplay's WebRTC transport and real cross-NAT verification, and
per-player console-switch/paddle modeling for DPC+/CDF-family games. See
CHANGELOG.md's [2.3.0] entry and to-dos/ROADMAP.md's "Beyond v2.0.0"
section for full detail.