Repository navigation
v3.6.0
Virtual Jaguar libretro v3.6.0
Debugger & libretro surface. A GDB remote stub you can attach a real
m68k-elf-gdb to, the disk-control interface that makes booting with no content
and swapping a disc mid-session possible, a user-authorable patch/hook file, and
a broad SIMD pass that speeds up the parts of the emulator that were actually
hot.
91 commits since v3.5.1.
Debugging
GDB remote serial protocol stub (#652). Attach m68k-elf-gdb (or lldb) to a
running core over TCP and debug Jaguar code the way you would any other target:
- Breakpoints, single-step, register and memory access.
- The GPU and DSP appear as GDB threads, so you can inspect all three
processors from one session. - Connect scripts, editor plugins, and an installer ship in the repo; see
docs/gdb-stub-design.md.
The per-instruction cost of the stub was measured, attributed per processor, and
reduced — see "Performance" below.
libretro surface
Disk control interface (#651). The core now implements
SET_DISK_CONTROL_EXT_INTERFACE, which was the shared blocker behind two
features:
- Launch the core with no content and insert a disc afterwards.
- Reach the Virtual Light Machine by putting in an audio CD.
Two things to know about how it behaves. Inserting a disc restarts the
console — the boot strategy is derived from the disc itself (its session layout
decides HLE versus real BIOS), so the core has to re-read and boot it; real
hardware does not need to, so a swap here is a restart rather than a continuous
session. And eject is a frontend-level flag, not an emulated tray: the Jaguar
CD unit has no modelled disc-present line, so the previously mounted disc stays
readable until an insert replaces it.
Savestates are now tied to the disc they were taken on. Since a disc can be
swapped mid-session, a state records which disc was mounted (session count, track
count, total sectors) and is refused against a different one, naming both in the
log. States written by earlier versions carry no such record and load exactly as
before.
Auto frameskip driven by audio buffer status (#690), and an enhancement
profile option (#706) — auto / quality / performance — deciding whether
the per-title database may switch on expensive visual enhancements by default.
No-content boot (#646): the core can launch with no cartridge or disc and
show the boot ROM, as real hardware does with an empty slot.
Patching a game
One routing doc (#637). We shipped three overlapping ways to modify a game
with no single door: cheats, soft patching, and enhancement hooks. There is now a
single page — docs/patching-a-game.md — that routes between them, linked from
the README and from each of the three existing docs.
User-authorable hooks. Drop a vj_hooks.txt in your system directory:
crc=DC187F82
hook=my-patch 0x0012A4 4E71 4E75
Turn on the Enhancement Hooks core option (off by default; a hook file cannot
switch on its own gate). Every fence from the built-in table applies: the
expect bytes are mandatory and checked, application is all-or-nothing, and any
malformed line discards the whole file rather than applying a patch set we only
partly understood.
Performance
RISC idle-loop fast-forward is now on by default (#608). Previously opt-in
while the compatibility corpus grew; a sweep of 148 cart images plus 6 CD
spot-checks came back byte-identical off-versus-on across framebuffer, audio and
savestate hash streams, so the largest single speed-up the core offers now reaches
everyone. It was also ported to the GPU interpreter (#699), not just the DSP.
SIMD. NEON and SSE2 fast paths for the parts that measurement said were hot:
Object Processor phrase stores and 16bpp fixed bitmaps, TOM scanline converters
(direct/24bpp/RGB16), the hi-res Stage-1 store and line resolve, and the voice-chat
mixer. Plus ARMv8 hardware CRC32 with runtime dispatch, and byte-swap
intrinsics for the GET/SET macros.
Per-SoC ARM tuning and LTO by default for ELF targets.
GDB stub overhead measured and fixed. The hooks cost 4.5%, not the ~0% first
reported; caching the armed flag in a slice-entry local took that to 2.7% with the
GPU's share to zero. The measurement gates are permanent and listed in
BUILD_AXES, so the attribution can be repeated on any target in four runs.
Game fixes
White Men Can't Jump (#635) — froze at its menus and produced no audio at
all, in both BIOS modes. The game stops its DSP by raising a CPU interrupt whose
handler is a shutdown routine; delivering that interrupt to an already-stopped DSP
left it pending, so the freshly reloaded DSP program serviced it during its own
init and shut itself down. The 68K then waited forever on a mailbox nothing would
ever clear. Audio went from zero non-silent samples to 1.8M.
Audio-only CDs route through the real CD BIOS (#683), whose player front-end
is the VLM — HLE cannot boot an audio disc, since it synthesizes its boot stub
from session-2 data a music CD does not have.
Object Processor: the object window is clamped to the visible window rather
than VBB; object processing stops at VBB when VDE runs past the end of the field
(#641); scaled 24bpp line-buffer writes are clamped to tomRam8 (#604).
Blitter: a nested blit dispatched from inside a running one is refused and
logged (#663, #677).
Widescreen statics reset per load (#605).
Build and packaging
Package.swift ships in this repo (#614), so Apple frontends no longer need
to vendor a fork. It is guarded: a CI job builds it, and a second fails if its
source list drifts from Makefile.common.
Cross-platform core installer (#640) for getting the core into RetroArch.
SPM builds no longer inline the scalar blitter on arm64 (#612) — the arch
autodetect now tests for actual SSE2/NEON availability rather than the arch alone.
Documentation
A settings and performance tuning guide (docs/settings-and-performance-guide.md)
covering what each option costs and when to turn it on, plus a site page. The
timing-accuracy work is documented as a non-versioned ongoing campaign rather than
being promised for a particular release.
Known limitations
- Inserting a disc restarts the console (see above). A continuous swap depends on
CD BIOS disc-presence polling that has not been verified. - The enhancement profile governs
internal_resolutionandtrue_coloronly —
performance-oriented per-title defaults such as idle-skip are unaffected by it,
deliberately. docs/WHATSNEWhas no sections for v3.1.0 through v3.5.1; the per-release
notes indocs/RELEASE_NOTES_v*.mdare complete and authoritative for those.
Artifacts in this release
SHA256SUMS.txt
cue2cdi-linux-x86_64
cue2cdi-macos-universal
cue2cdi-windows-x86_64.exe
jagcd-tools-linux-x64.zip
jagcd-tools-macos.zip
jagcd-tools-windows-x64.zip
virtualjaguar_libretro-android-arm64-v8a-debug.tar.gz
virtualjaguar_libretro-android-arm64-v8a.so
virtualjaguar_libretro-android-armeabi-v7a-debug.tar.gz
virtualjaguar_libretro-android-armeabi-v7a.so
virtualjaguar_libretro-android-x86-debug.tar.gz
virtualjaguar_libretro-android-x86.so
virtualjaguar_libretro-android-x86_64-debug.tar.gz
virtualjaguar_libretro-android-x86_64.so
virtualjaguar_libretro-emscripten-wasm-debug.tar.gz
virtualjaguar_libretro-emscripten-wasm.bc
virtualjaguar_libretro-ios-arm64-debug.tar.gz
virtualjaguar_libretro-ios-arm64.dylib
virtualjaguar_libretro-linux-aarch64-debug.tar.gz
virtualjaguar_libretro-linux-aarch64.so
virtualjaguar_libretro-linux-i686-debug.tar.gz
virtualjaguar_libretro-linux-i686.so
virtualjaguar_libretro-linux-rpi1-armv6-debug.tar.gz
virtualjaguar_libretro-linux-rpi1-armv6.so
virtualjaguar_libretro-linux-rpi2-cortex-a7-debug.tar.gz
virtualjaguar_libretro-linux-rpi2-cortex-a7.so
virtualjaguar_libretro-linux-rpi3-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3-cortex-a53.so
virtualjaguar_libretro-linux-rpi3_64-cortex-a53-debug.tar.gz
virtualjaguar_libretro-linux-rpi3_64-cortex-a53.so
virtualjaguar_libretro-linux-rpi4-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4-cortex-a72.so
virtualjaguar_libretro-linux-rpi4_64-cortex-a72-debug.tar.gz
virtualjaguar_libretro-linux-rpi4_64-cortex-a72.so
virtualjaguar_libretro-linux-rpi5-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5-cortex-a76.so
virtualjaguar_libretro-linux-rpi5_64-cortex-a76-debug.tar.gz
virtualjaguar_libretro-linux-rpi5_64-cortex-a76.so
virtualjaguar_libretro-linux-x86_64-debug.tar.gz
virtualjaguar_libretro-linux-x86_64.so
virtualjaguar_libretro-macos-arm64-debug.tar.gz
virtualjaguar_libretro-macos-arm64.dylib
virtualjaguar_libretro-macos-x86_64-debug.tar.gz
virtualjaguar_libretro-macos-x86_64.dylib
virtualjaguar_libretro-switch-debug.tar.gz
virtualjaguar_libretro-switch.a
virtualjaguar_libretro-tvos-arm64-debug.tar.gz
virtualjaguar_libretro-tvos-arm64.dylib
virtualjaguar_libretro-vita-debug.tar.gz
virtualjaguar_libretro-vita.a
virtualjaguar_libretro-windows-i686-debug.tar.gz
virtualjaguar_libretro-windows-i686.dll
virtualjaguar_libretro-windows-x86_64-debug.tar.gz
virtualjaguar_libretro-windows-x86_64.dll
virtualjaguar_libretro.info
SHA-256 checksums
Verify with sha256sum --check SHA256SUMS.txt (Linux) or
shasum -a 256 --check SHA256SUMS.txt (macOS).
See SECURITY.md
for full verification instructions and antivirus false-positive guidance.
b926e41185057ee9204aaa0aaafff53ceec2cbb6d4f37e478edf7a7ddb353332 cue2cdi-linux-x86_64
c19f65c1be0eab40e58f0a4d619704dcfc4632858d00eef78a737d0f26e7a134 cue2cdi-macos-universal
c2922f76ef94e2c6c15e503a49cefb2e39fd1e4dbe4b60a1eddd6bbc60830602 cue2cdi-windows-x86_64.exe
f761a5b2a6f97cead86f488ef26af57d7897d0c61f48ee9ef7c98bb6514b3866 jagcd-tools-linux-x64.zip
71e17ca7b79a81540235beb8b978373afc03bc665fea17bebc161220892b3323 jagcd-tools-macos.zip
7e975a520daab28967a8b8233b6955a3341e2247d53f4bbad4e21e900771a12d jagcd-tools-windows-x64.zip
118cd064ef9d29e9e67a51d790b5a1db65dd21196a4be3a5c0a98c6fa33e90c0 virtualjaguar_libretro-android-arm64-v8a-debug.tar.gz
5e482913bc4b0ed2aaac8aea02367c71b4ffe6adc983bfd8bbf38870b7164dc3 virtualjaguar_libretro-android-arm64-v8a.so
8206554f5e3dde441c1441b9339eb746a9f16a4698fe15707eda69565f59e67f virtualjaguar_libretro-android-armeabi-v7a-debug.tar.gz
eea3c51f021f55711f6722a1b73c47220b0b909a22f96e82bc95ab84a8412439 virtualjaguar_libretro-android-armeabi-v7a.so
dafc150147ca4cb8c0656ba4458b4e0eabfc72ca78600dcd713884b6003963d1 virtualjaguar_libretro-android-x86-debug.tar.gz
d9f748292ae93c9cfe8115a560feae0d258d5123b59906e0757ddef2de05591b virtualjaguar_libretro-android-x86.so
362ba7a617376d76fcac48d7435b3a19b1036b23bd78e5651279912f21e90e77 virtualjaguar_libretro-android-x86_64-debug.tar.gz
c4993f319621b665faa46a18d0c0d55906956ecf288760dbb380bef91e4df839 virtualjaguar_libretro-android-x86_64.so
d7f6a8762679683438feddc041e4453113b62e02f6092aba0b39f376bd8dc00a virtualjaguar_libretro-emscripten-wasm-debug.tar.gz
c1357f10028f209ab08d6242d64e2de9548781955415ad58f4ef285c09bcda10 virtualjaguar_libretro-emscripten-wasm.bc
37d8a14417d0377653c9c68a83b03e0e1a2a1d4624e9ec2a2c050f6af88e4bfe virtualjaguar_libretro-ios-arm64-debug.tar.gz
b46a218b4d8e6d940309c6238c7dddae3b5d5f5b7ac677de3305483df1405fde virtualjaguar_libretro-ios-arm64.dylib
43c3c6536d73d75e9d1a94736b9aa7e533eebad232a76e1276c7c4e755c0f50c virtualjaguar_libretro-linux-aarch64-debug.tar.gz
5d2af95d130b6ced108a3415f1b32201ecbdf81ba0020bb2d51f9615756d31ae virtualjaguar_libretro-linux-aarch64.so
9ea04b48d4c38d82f5599ac50a5b5dc4cd66eaecae5268691bb193714f972f4c virtualjaguar_libretro-linux-i686-debug.tar.gz
905409541b8b59b137ef110d0f926963ced4ed8d8de0d089ab467b0b3d06e689 virtualjaguar_libretro-linux-i686.so
13b437b3ed5973cbc7c8bec0dd552357441b268974b3867050ade4a8f1c61cb1 virtualjaguar_libretro-linux-rpi1-armv6-debug.tar.gz
c67c30364dbbeff7e5d5a7a2d2bd10c48990f931cbabf3a2ca8bfe270ef6f4cc virtualjaguar_libretro-linux-rpi1-armv6.so
3cebc3379bd2ecd68389e50acbb0d5c2fe6ecfc8ed0fdbe998873bce7df3ae75 virtualjaguar_libretro-linux-rpi2-cortex-a7-debug.tar.gz
d018f34ce42a9c3230e1bd2d5fc821b601bd4f7be5baac0fcdd0f59e81d50f8c virtualjaguar_libretro-linux-rpi2-cortex-a7.so
1b344a57565dfb3f20a2b5a4e82e10fef0b60e0c70ce9794c390becb52f20b8f virtualjaguar_libretro-linux-rpi3-cortex-a53-debug.tar.gz
119f0ab08ae1f8c604f18a581f6d83e7398980e163699253639803971caf53b3 virtualjaguar_libretro-linux-rpi3-cortex-a53.so
778d23d79d646388567a74c12874e7c1808c49270e7f9510966c3baa48482ba8 virtualjaguar_libretro-linux-rpi3_64-cortex-a53-debug.tar.gz
eabc7c354a67566f51cb74b35665dd47ad360d5a8e17de5e1ebec5ef7c0bc8e9 virtualjaguar_libretro-linux-rpi3_64-cortex-a53.so
ded46ee10145466ec158f18bbe1af2f45c13ad7f70ae87b1a3f25dd14503c337 virtualjaguar_libretro-linux-rpi4-cortex-a72-debug.tar.gz
702c0561c73fbe3b21e5c5562f36523b2d1cf0fddedf79d767e92049693d7358 virtualjaguar_libretro-linux-rpi4-cortex-a72.so
ec66af678df9d9092bda45df0e008b33a15acbbb724473d109f1c7756b624313 virtualjaguar_libretro-linux-rpi4_64-cortex-a72-debug.tar.gz
257eb39c4bd99e3a64c4d0651b4c1fb2ccb3cbb0d4ecb10d68bfa02a479ea7cc virtualjaguar_libretro-linux-rpi4_64-cortex-a72.so
17ad9f33df4ef6db9fe82beb5eb3e50380f7857b04b48337816cebabda0d7971 virtualjaguar_libretro-linux-rpi5-cortex-a76-debug.tar.gz
a85f145a23c210e30e146c2f80543988d70d73f83e08913d070a738111c8cc20 virtualjaguar_libretro-linux-rpi5-cortex-a76.so
fbe8d5029b15ea7ca9ed291ba98bf681663ee83ec803aca3a8632974bee245a7 virtualjaguar_libretro-linux-rpi5_64-cortex-a76-debug.tar.gz
0549eb048a291ecfc7719b1df354c76107ce1e2fbb268fdc304b88de0fdcd6d4 virtualjaguar_libretro-linux-rpi5_64-cortex-a76.so
4833dff2bc413a5626f2b0f89912c1c5175a7ce36f2cf98e4f03eb0d88de925e virtualjaguar_libretro-linux-x86_64-debug.tar.gz
c3882b83a1a71acee4eed184fd37d7ee9ab196c74b302fb23ef25d09f68b72c5 virtualjaguar_libretro-linux-x86_64.so
c7c230b442ac0049a5f5e749cbe9f1a92e17dc98eaffff896a772d62e072007c virtualjaguar_libretro-macos-arm64-debug.tar.gz
cd2ec2206c370a145b1692ee33e5fa416b652b7c56e3fed83299ca09fcb8f002 virtualjaguar_libretro-macos-arm64.dylib
81dfd7f467d7987d25b61f71f8ebf482e0a8892c95cf4e0c176b4d1b4514c63e virtualjaguar_libretro-macos-x86_64-debug.tar.gz
26bd6e48f898c5992cf97d8ff5cc34427a8b967ac03340a9b360678c037d1145 virtualjaguar_libretro-macos-x86_64.dylib
5109308330ff7cd3f3dc4f2c5896411b4845198d52b53c929411946e7a7d2a3b virtualjaguar_libretro-switch-debug.tar.gz
0ee23f1e8bdddfa81bd5e067579fc046dfdeaaab775ac05552d202cac4366de0 virtualjaguar_libretro-switch.a
9ed4fcc4902102696aa198d86852e92efa0c2bc9aefa728f0bfd0454ed69d821 virtualjaguar_libretro-tvos-arm64-debug.tar.gz
7aaad193f87c3139190e8ace013989a3be7831c94b28b664992f7301418ea3e2 virtualjaguar_libretro-tvos-arm64.dylib
268be5abd72dfb8ace6ad4da6002a72d5ef3317dc1dba68e6acfb9d0ec4139a7 virtualjaguar_libretro-vita-debug.tar.gz
bc0b92841f13708db79730d209cfe39ae37c5f17d19e625fa7de423ebe768e44 virtualjaguar_libretro-vita.a
4dfb9da4de5ad7fc3e3e93b0540b790e3c54a7a5688bffb692b2f3b3e4526e27 virtualjaguar_libretro-windows-i686-debug.tar.gz
c66dd07042410277f3b6c19134252a8e23c347c65133c8694d9e2e9a58502389 virtualjaguar_libretro-windows-i686.dll
3fa8bb8eaa32a10be53d17ed6309da92ba51b9f38adc7f8f4b9b431434fb018c virtualjaguar_libretro-windows-x86_64-debug.tar.gz
7e44dbb37804407becaeb0cb4e67b17fa55f47f8840046fa0d97f853929a9f7a virtualjaguar_libretro-windows-x86_64.dll
3f22232c5fb86dfe040212583eacea73776fc25b445f399d8cee2a759e1f671e virtualjaguar_libretro.info