v3.0.0 delivers:
- Jaguar CD support: all 10 locally-available titles boot to game code, in both HLE and real-BIOS mode
- Jaguar Link networking: real link-cable multiplayer over TCP and RetroArch netplay, up to multi-console hubs
- Memory Track saves: CD games save settings, progress, and high scores like real hardware
- 100+ compatibility fixes: Wolfenstein 3D music, Pitfall, Tempest 2000, Alien vs Predator, Brutal Sports Football, and a full CD-title cluster
- Reorganized options menu: 9 categories, content-aware, translation pipeline wired
- A hardware-referenced test suite: acid conformance tests, screenshot regression baselines, and CI gates that actually block
Now the parts worth telling.
Ten discs, two boot modes, one gate
The corpus is Baldies, Battle Morph, BrainDead 13, Dragon’s Lair, Highlander, Hover Strike, Iron Soldier 2, Primal Rage, Space Ace and Myst, across 11 images. Every one reaches GAME_CODE under HLE and under a real BIOS, and docs/cd-boot-matrix.md gates it in CI so it stays that way.
Getting there meant fixing bugs that only exist on a machine with a CD drive bolted to a 68000. Hover Strike locked up because CD_read completed instantly and overwrote the polling code still in flight waiting for it; reads stream at drive rate now. Battle Morph’s HLE ISR leaked a stream status base across calls, so it’s latched per CD_read. Iron Soldier 2 booted to black because an unaligned CD_read tail padded instead of carrying the next disc bytes. Primal Rage rendered a black bottom third during fights because GPU objects weren’t halting the Object Processor until the GPU released OBF.
Memory Track NVM is HLE’d (_NVM at $2400, alongside the $900000 flash window), so Vid Grid saves again (#258). virtualjaguar_cd_read_speed gives 1x/2x/4x/8x/instant on the HLE path, deliberately not on the real-BIOS path: scaling that FIFO/DSA cadence reopens the DSA-steal and FIFO-storm race classes those constants encode.
One breaking change. .iso is refused now, because a bare 2048-byte-sector ISO cannot represent a Jaguar CD’s multi-session layout, no retail disc boots from one, and BigPEmu doesn’t accept them either. Failing at load with an explanation beats a BIOS screen that goes nowhere. Savestates move to v7; v2.x states still load.
The link cable
JERRY’s asynchronous serial UART is emulated at the register level (ASIDATA/ASICTRL/ASISTAT/ASICLK at $F10030-$F10035), verified against the JTRM rather than against source comments. Three transports ride on it: a direct TCP link that works in frontends with no netplay support, the libretro netpacket interface for real RetroArch netplay, and a CatNet-style hub for more than two consoles.
Doom deathmatch is playable over TCP, host and client. AirCars runs 2-player direct and across a 3-console hub. BattleSphere Gold is validated to networked-lobby entry, and I say that precisely because a sustained dogfight isn’t verified yet. AirCars under netpacket is untested. The iOS path isn’t device-tested.
Wi-Fi netplay lag turned out to be netpacket TX batching, fixed in #248. Hostnames resolve now (#263), not just dotted-quad addresses.
The gates that weren’t gates
Best bug of the cycle wasn’t in the emulator.
Three acid tests were live regressions on develop while test/acid/BASELINE.txt recorded all three as PASS. The gate that should have caught them piped check-baseline.py | tee acid-summary.txt without set -o pipefail. Bash reports the last command in the pipe, tee exits 0 almost unconditionally, and the step could never fail. One completed CI run logged FAIL: regressions or missing tests detected. in its own output and reported success.
All three turned out to be bugs in the tests, checked against the JTRM, not in the emulator. pit_countdown_rate acked TOM’s INT1 copy but never cleared JERRY’s own latch. unaligned_word skipped the addq.l #8,sp a group-0 frame needs before rte. op_gpu_int_object never started the GPU before checking its IRQ latch. A gate that can’t fail hides which side is wrong.
Same cycle, same class: the screenshot comparison had no committed baselines, so a fresh runner reported NEW for every ROM, printed a helpful cp command, and passed. Pixel-exact baselines for the two in-repo homebrew ROMs turned it into a zero-pixel gate. 10 passed, 0 failed, 0 new.
Every gate needs a proof that it can fail. Break something on purpose, watch the job go red, revert. Cheap, once, per gate.
Known issues, stated plainly
- Doom runs combat pacing ~1.5x fast, 2x in heavy scenes. This release measured the gap against real-hardware footage and identified GPU/DSP instruction timing as the fix path.
docs/doom-pace-calibration.mdhas the full analysis, and the deep dive on measuring a 1993 console from YouTube captures is the next post. In-level music silence is authentic to original hardware. - FMV scene-jump drift in Dragon’s Lair, Space Ace and BrainDead 13 under HLE. Their delivery-clock counters drift against our transfer pacing. Reproducible, understood, real-BIOS mode unaffected.
- Battle Sphere Gold menu text renders too dark to read. The glyphs arrive already dark from the game’s own pre-shading path, so the blitter is exonerated and the writer routine is next.
- Iron Soldier (cart) is still missing its wireframe tank under the fast blitter. The accurate blitter is unaffected.
- CDI images with a damaged boot header are refused (#269). 10 of 14 in the local CDI corpus pass.
- Alien vs Predator has a green-dot artifact (#266) and a red-background report (#267) open, split out of the otherwise-resolved #178.
- Tempest 2000 and the AvP fixes are not independently device-verified this cycle. Believed fixed.
Why any of this
The core is GPLv3 and stays that way. Nothing here is for sale. A console that sold poorly in 1993 has a shrinking number of people who can still read its silicon, and every documented register behavior, every acid test, every hardware-referenced measurement outlives whoever wrote it down. 16 platforms this release, PS Vita and Switch included. Somebody will still run these discs after the drives are dead.
One stopwatch closes the biggest open number
Neither real-hardware Doom capture used in the calibration contains the attract demo, so its wall-clock duration on silicon is the one number the footage couldn’t give us. Our core measures the first demo at 27.6 s and the second at 35.0 s, timed from the first rendered demo frame to the cut back to the title.
If you own a Jaguar and a copy of Doom: let it sit at the title until the attract demo starts, then time from the first frame of demo gameplay to the moment it cuts back. Both demos if you can. That number decides which timing model is right and reprioritizes the next round of work. Donated hardware works too.
Release: github.com/libretro/virtualjaguar-libretro/releases/tag/v3.0.0. 16 platforms, each with a matching debug artifact, SHA256 checksums in SHA256SUMS.txt.