v2.3.0 "Full Catalogue"
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 absoluteinstruction'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
ARMinterruptfault-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 aBXto a fixed non-Thumb address. Caught
throughrusty2600-thumb's existingFault::UnimplementedPeripheral
path — zero changes needed to that crate:Arm7Tdmi::instruction_pc()
already reported the correct call-site address, andset_register's
existing PC-storage convention already produced the correct resume target.
Verified with a real hand-assembled Thumb-1 program that plants an
actualBXinstruction 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.