Skip to content

RetroXR v0.4.0: link cables that carry real data

Full changelog · Download · SideQuest · Discord

Two machines in the room can now be cabled together, and the data really crosses the wire. This needed a piece that did not exist: a core-agnostic serial link API, which went upstream to RetroArch. The cores carrying the other half are forks the core manager downloads for you.

A GameCube with two Game Boy Advances on link cables — each handheld running its own screen, every machine emulated at once in the same room. Recorded on PCVR.

What each fork brings:

  • mGBA — GameCube link with Dolphin (up to four GBAs on GC-GBA cables, BIOS required), up to four players single-pak and multi-pak over three link cables, and the 1st/2nd gen link protocol for Game Boy and Game Boy Color. For single-pak, the purple end goes into the host — the machine holding the cartridge.
  • Dolphin — the GameCube side of that cable, plus raw memory card files and Nunchuk accelerometer support.
  • pcsx_rearmed — a serial cable between two PlayStations, and it now notices when memory card 1 is pulled while a game is running.
  • gambatte — a Game Boy link cable between cores. It will happily link a gambatte Game Boy to an mGBA one.

Use this on PCVR if you can. A link is several cores running at once, which is more than a standalone headset comfortably carries. It runs on a Quest — but the recording above is PCVR for a reason.

Full detail on the new link cables page.

Save and load state, at any moment, on any core that supports it. Each state is stored with a screenshot of what was on screen when you took it, so the list reads as pictures rather than timestamps — and states back up to RomM with those screenshots intact. See game saves and backups.

The PlayStation has stopped being a grey box.

The PlayStation. The lid springs, the buttons press, and both card slots and controller ports take real objects.

Both pads are modelled too, and which one you plug in is what selects the controller type — the original pad picks the standard controller, the DualShock picks dual-shock. No menu involved.

The DualShock. Its ANALOG button works — press it with a fingertip and the pad drops back to behaving as a standard controller.

🕹️ Wii: a remodel, and Nunchuk motion at last

Section titled “🕹️ Wii: a remodel, and Nunchuk motion at last”

The Nunchuk’s own accelerometer works. That had been blocked upstream rather than here — libretro had no way to express a second motion sensor on one controller port — so it took a sensor sub-index added to libretro before RetroXR’s Dolphin fork could report it.

Both accessories were remodelled while that was in flight. The Nunchuk is based on a laser scan of the real thing (everything but the stick) — thanks to Wesk of the BitBuilt forums for it.

The remodelled Nunchuk — and it now reports its own motion.
The remodelled Wii Remote. The POWER button works now — one second on, four seconds off.

The remote also picked up three things:

  • SYNC, under the battery tray, is now an ordinary poke rather than a trigger press. The cover is the safety.
  • POWER works — hold one second to turn the console on, four to turn it off.
  • It can be held sideways in two hands, the NES-pad grip a lot of Wii games assumed.

On Meta Quest Touch controllers, RetroXR now reads the capacitive sensors, so your fingers sit where they really are on the controller instead of snapping between canned poses. On PCVR use SteamVR as the runtime for this — the Horizon link does not pass capsense through.

The poke interactor moved to your index fingertip, off the cone that used to stick out of the controller. Everything you press with a finger is now reached from where the finger actually is.

Both the XR controllers and any external gamepad can carry a different map per platform, set from the CONTROLS menu. A per-platform map is a whole map rather than a patch, so a platform you have customised keeps what it had and does not pick up later global edits. See setting up your controls.

Cores that support disc control no longer switch off when the disc is pulled, and multi-disc games can be swapped from disc 1 to disc 2 mid-game.

The NES got recorded hardware sounds from a real NES-001 — the power and reset buttons, the controller buttons, a controller plug seating, the CH3/CH4 switch, a cartridge going in and out, and the cradle latching.

Its interactions changed with it: the lid is now a poke, the power button gives off its own light, and the cartridge cradle has to be pressed down before the console can see the game, exactly as the sprung bay demanded.

The cable simulator was rewritten to be more stable — far less jitter in the leads hanging off everything.

  • If a BIOS is on the device, the core’s show BIOS startup option is turned on for you, so a machine with no game boots to its own firmware screen.
  • Posters: drop an image into posters/ and stick it on things.
  • Cartridges in the spawn menu is now Games.
  • Default world scale is 0.85×, up from 0.8×.
  • A TV’s source is recalled when a saved room is loaded.
  • Cores and BIOS files can be deleted in-headset, and orphaned metadata cleared from the storage screen.

Still experimental — only use it if you want to help test it. Many object-sync fixes and under-the-hood netcode changes went in this release, but the warning stands.

Collision on handheld cartridges, the scraper picking the wrong region for images with no disc number, frame stuttering from Godot over-allocating frame culling threads, a row of pixels blowing across the seam on dual-screen handhelds, BIOS files inside folders on RomM, object position recall when loading a scene, and the cd/cassette player’s menu failing to appear — plus a great many more.

  • Desktop interaction struggles to select socketed objects — controller plugs and memory cards — when they sit near each other.
  • Pressing the NES cradle with no cartridge in presses a phantom cartridge.
  • The NES lid still shows a trigger glyph, though it is a poke now.
  • Crashes can happen between loading scenes.
  • Four GBAs with three of them empty can stutter at first.