mirror of
https://github.com/libretro/virtualjaguar-libretro.git
synced 2026-11-13 05:01:35 -10:00
dependabot/github_actions/develop/actions/setup-python-7
43
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
287bb30190 |
site, installer: fetch the install scripts from master, not develop (#1087)
The site's one-liners pointed at develop, so any installer change went live to users the moment it merged, before a release. Point every installer URL at master: the site's RAW_URL and source links, the README, the scripts' own usage text, the nightly notes, and install.sh's RAW, which --auto-update re-fetches. Co-authored-by: Claude Opus 5.5 <[email protected]> |
||
|
|
33446a784c |
Feature/neuro sdk (#1001)
* feat(app): Neuro API client, so an AI can play as Player 1 Settings > Neuro (or --neuro ws://HOST:PORT) connects the app to a Neuro game API server (https://github.com/VedalAI/neuro-sdk): Neuro-sama, or any backend that speaks the API (Randy, Tony, Gary), plays through registered actions. - Controller actions: press_buttons, button_sequence, hold_buttons, release_all; every schema-valid input fits the 30 s queue. - Game profiles (built-in Tempest 2000, or <data>/neuro/*.json): named button macros, an "about" text sent as context, and RAM watches in the state text. - Forces the next move whenever the last input has played out (never while paused); results are sent on validation, as the API asks. - WebSocket client on a worker thread (no TLS, no new dependencies), with reconnect; MSG_NOSIGNAL / SO_NOSIGPIPE so a dropped server cannot kill the app. - Headless --neuro runs in real time. - Tests: neuro_unit and neuro_loopback (a WebSocket server on a free port). Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: Neuro API guide (actions, profile format, testing with Randy) Co-Authored-By: Claude Opus 5.5 <[email protected]> * refactor(app): Neuro API client in app/src/neuro/, behind VJ_APP_NEURO The neuro_* sources move to app/src/neuro/. The CMake option VJ_APP_NEURO (ON by default) builds them, defines VJ_HAVE_NEURO and adds the neuro_* tests; with it OFF the app has no Settings > Neuro tab and no --neuro. Co-Authored-By: Claude Opus 5.5 <[email protected]> * fix(app): NOMINMAX before winsock2.h in neuro_ws.cpp (MSVC std::min) windows.h's min/max macros broke std::min on MSVC; discord_ipc.cpp guards the same way. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> |
||
|
|
e652c916ed |
ci(macos): sign and notarize every macOS build (#989) (#990)
* ci(macos): sign and notarize every macOS build (#989) Move the keychain import / codesign / notarytool logic into the composite action .github/actions/macos-sign (wrapping app/packaging/macos/codesign.sh) and use it for: the app package (now also on same-repo PRs), the App macOS arm64 binary, the macOS core dylibs, cue2cdi-macos-universal and the macOS chdman/jagcd tools. Bundles are stapled; bare Mach-O files are notarized but unstapled. A notarization failure warns off-tag and fails on a tag. Fork PRs get no secrets and keep the ad-hoc signature plus the warning. Co-Authored-By: Claude Opus 5.5 <[email protected]> * ci(macos): pass app.yml only the five APPLE_* secrets, not inherit SIGNPATH_API_TOKEN would otherwise ride along with sign: true and switch on the Windows SignPath steps for every PR. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> |
||
|
|
5bbbc99de0 |
docs(site): refresh the app gallery (RetroAchievements art, Jaguar CD shots, gdb recipe, even grids) (#959)
* docs(site): refresh the app gallery: RetroAchievements art, Jaguar CD shots, gdb recipe, tighter layout RetroAchievements: the grey badge squares came from the mock session itself, not from a rendering bug. A --ra-mock session never uses the network (updateImageNetwork() forces it off) and the image cache only reads <data-dir>/ra-cache/, so a fresh capture data dir had nothing to draw. The shots are retaken with that cache seeded from the public media.retroachievements.org images of a real Jaguar set (Ultra Vortek, 18 achievements, in the demo library), and a mock fixture dir holding the real public achievement list and Jaguar / Jaguar CD game lists. Account, progress and unlock dates are invented; no real account is involved. Jaguar CD: discs boot and run in the current app, and box art now downloads for the CD tab, so app_library_cd.png is retaken and a Blue Lightning CD gameplay card is added. Galleries now hold an even number of cards (Playing 8, Look & feel 8, RetroAchievements & Discord 4 after dropping the empty-looking Profile card, Developer tools 8) and the grid is fixed at 4 columns (2 below 60rem, 1 below 34rem) in a marked "/* app page */" block at the end of style.css, with tighter gaps and captions and two-column bullet intros. Developer tools gains the gdb recipe and a link to docs/gdb-stub-guide.md. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs(site): scope the app-page h3 spacing, fix CD art and BIOS wording, README alt text The h3 margin override was site-wide; it is now limited to #gallery. The Jaguar CD box art comes from the project's thumbnail mirror (libretro-thumbnails has no Jaguar CD repository), and a CD boots without any BIOS file, so the captions say that instead of naming libretro-thumbnails and the built-in CD BIOS. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]> |
||
|
|
76fcc8b3b0 |
docs(site): retake desktop-app gallery shots for themes, fonts, RetroAchievements, Discord and debug tools
New captures of the v3.9.x app (demo library, fresh temp data dir, no accounts): Light and two custom themes over the same library view, the theme editor, Settings > Interface and the font picker (installed fonts drawn in their own typeface, favorites, recents, debugger font samples), the RetroAchievements sign-in, This game, Jaguar games and Profile views from the built-in mock backend, the Settings > Discord tab with Discord off, and the palette, blitter log, texture browser and audio scope tools. Video settings is retaken now that theme and font moved to the Interface tab. The font shots come from the feat/app-font-picker branch (#943 was not merged yet); the README row and app page get matching cards and captions. Closes #938 Co-Authored-By: Claude Opus 5.5 <[email protected]> |
||
|
|
05c0d7f422 |
Merge master (v3.9.0) back into develop
# Conflicts: # README.md # site/pages/app.html |
||
|
|
7ceacba7e2 |
site: Download page with direct links to every release file (#930)
* site: Download page with direct links to every release file A new Download page, second in the nav, lists the desktop app packages, the RetroArch core for every platform, the tools and checksums, and the nightly, each as a direct link to the asset. The home page's Download button and the app page's "Get it" point at it; the home page no longer hardcodes "latest: v3.7.0". build_site.py takes the release data as --releases FILE or fetches it with --releases-from-github (stdlib urllib, GH_TOKEN/GITHUB_TOKEN sent when set), and dies on a failed fetch so a publisher keeps its previous deployment. With neither flag the page links the release pages instead, so local builds and check_site.py keep working offline. pages.yml uses the fetch flag and gains a 6-hourly schedule, since a new release changes the app package names. The v3.8.0 release carries no app packages, so until the next tag the app section links the nightly's, with a note saying so. Co-Authored-By: Claude Fable 5.1 <[email protected]> * site: signing text matches CI: macOS notarized, Windows installer not signed yet The Download page and the app page say the macOS app is Developer ID-signed and notarized (the release workflow's notarize step now runs and passes), with no right-click > Open caveat. The README and app page from #929 said the Windows installer is signed as well; the SignPath steps are still skipped in every release run, so both now say it is not code-signed yet and SmartScreen may warn. The "SIGNING: confirm" markers are resolved and gone. Co-Authored-By: Claude Fable 5.1 <[email protected]> --------- Co-authored-by: Claude Fable 5.1 <[email protected]> |
||
|
|
92e1c6d6d5 |
docs: refresh the README desktop app section
Concise per-area feature bullets, the Windows ARM64 and Flatpak rows, the signing note (marked for confirmation) and a link to the site gallery. Co-Authored-By: Claude Sonnet 5.5 <[email protected]> |
||
|
|
ad23b8120e |
chore: version v3.9.0 (was v3.8.1)
The release grew from a fix release into the desktop app debut, debug tools and timing work, so it ships as v3.9.0. Version bumped in all three places; release notes renamed. Co-Authored-By: Claude Opus 5.5 <[email protected]> |
||
|
|
e22aa0a2c0 |
docs(site): app page CRT example with an aperture-grille shader, aspect-correct
Regenerate the plain / CRT pair from one saved game moment and one window config (aspect fit, no integer scaling, no stretch; only shader.* differs), and use the bundled crt-gdv-mini-ultra-trinitron preset instead of CRT-Royale's default: visible vertical aperture-grille stripes, mild bloom, not too dark. Co-Authored-By: Claude Sonnet 5.5 <[email protected]> |
||
|
|
56fb08af22 |
docs(app): list the Windows ARM64 and Flatpak packages; install.ps1 picks ARM64
Refs #839 Co-Authored-By: Claude Sonnet 5.5 <[email protected]> |
||
|
|
c1a712cd5c |
docs(site): add the app page with screenshots; README app section and install options
The desktop app ships in v3.8.1. README: "Two ways to play", install bullets for the app and the install.sh / install.ps1 one-liners (--what core|app|both, nightly channel), and a "The desktop app" section with screenshots, features and the package table. app/README.md gains a Netplay section. Site: new App page (Get it, library, shaders, controllers, cheats / achievements / states, netplay), nav entry, home-page hero button and "Two ways to play". Ten screenshots in site/assets/ (1280x860 PNG8, 1.1 MB total) captured from the app on real carts; the netplay shot has the host's address blanked. Refs #833 Co-Authored-By: Claude Sonnet 5.5 <[email protected]> |
||
|
|
75eb401755 |
fix(libretro): expose the Memory Track as SAVE_RAM on no-content boot (#810)
A no-content session never exposed SAVE_RAM (no_game_active), so Memory
Track writes made through a disc inserted via disk control were never
handed to the frontend. Two causes:
1. SAVE_RAM was gated on no_game_active, a #646-era rule ("no cartridge,
no EEPROM"). #726 made no-content boot a CD session with the Memory
Track plugged in from frame 0, so the gate is stale. It now follows
jaguarMemTrackInserted. It is deliberately not keyed on a mounted
disc: frontends size and load SAVE_RAM once after retro_load_game and
libretro has no change notification, so exposing it first after an
insert would write a file that is never read back.
2. The insert path never reinstalled the NVM BIOS module. The boot resets
RAM, wiping the '_NVM' cookie; retro_load_game and retro_reset
reinstall it, disk_set_eject_state did not. Found by the new test.
Tests: test_disk_control cases 6/7/8; test_boot_config's #646 size-0
assertion becomes the new contract. mtMem joins the test export lists.
No savestate change.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
|
||
|
|
93e4097f48 |
docs(readme): cut to a skimmable overview, move BIOS detail to docs/bios.md (#807)
* docs(readme): cut to a skimmable overview, move BIOS detail to docs/bios.md Shrink README from 344 lines to ~80. Drop measurement tables, per-release history, hardware/peripheral tables and test-harness links (all already covered in docs/ or on the website). Fix outdated claims: platform count (24 core builds, not 16), CD read-speed default, idle-skip default, cart matrix existence, iso support, BIOS behaviour. Move the BIOS/boot ROM override reference to docs/bios.md. Co-Authored-By: Claude Sonnet 5.5 <[email protected]> * docs(savestate): version table through v15 (v3.7.0) README links this page; it still said the core writes v8 and listed v8 as unreleased. Table now covers every released layout, from src/core/state.h. Co-Authored-By: Claude Opus 5.5 <[email protected]> * docs: address review on README trim (#807) - README: no-content disk-control Memory Track caveat (#810), complete release platform list, qualify savestate wording - bios.md: jagboot_m.rom accepts >=128 KiB; CD BIOS Type affects file order - savestate-compat.md: format support vs disc-identity refusal; v9/v10 were never written by a release - settings guide: frameskip option exists Co-Authored-By: Claude Sonnet 5.5 <[email protected]> --------- Co-authored-by: Claude Sonnet 5.5 <[email protected]> |
||
|
|
5656c1516f |
feat(hooks): user-supplied hook file + one patching router doc (#637) (#716)
* feat(hooks): user-supplied hook file + one patching router doc (#637) We shipped three overlapping ways to modify a game with no single door, and the question that prompted this ("can users put their own patch files in?") came from someone who works on this core -- so discoverability was the bug. Answer: yes, two ways already (cheats, soft patching); the one thing a user could NOT author was a hook. Both halves fixed. docs/patching-a-game.md routes the four cases -- cheat code, IPS/BPS/UPS, byte patch, "different emulator settings for one game" (which is a per-title default, not a patch at all). Cross-linked from README and the top of rom-patches.md / enhancement-hooks.md so any entry point reaches the router. src/core/hookfile.c parses <system_dir>/vj_hooks.txt: crc=DC187F82 hook=my-patch 0x0012A4 4E71 4E75 Line-based, NOT JSON: libretro-common vendors no JSON parser, and hand-rolling one adds a large parsing surface to a feature whose whole job is writing bytes into a ROM. Same shape as vj_netlink.txt, which this core already reads. Field splitting is hand-rolled rather than strtok_r -- that is POSIX, and msvc05/msvc10 on the GitLab buildbot is exactly where our C89 lint is structurally blind. Every fence from docs/enhancement-hooks.md is inherited, none relaxed: - Same gate, read raw via environ_cb BEFORE the file is parsed, so a file can never switch on its own gate. - expect[] mandatory; all-or-nothing per title in the applier. - Additionally all-or-nothing per FILE: any malformed line discards every hook parsed. A half-understood patch set is worse than none, and the applier's own all-or-nothing rule would otherwise be enforced over hooks we only partly parsed. - Applied once at content load, so nothing enters the savestate blob -- no new field, no version bump. - User file wins over a built-in row for the same CRC, with a LOG_WRN naming both, matching the DB's "user-set values always win" rule. - Nothing allocates. Every bound is a compile-time constant, so a file cannot drive allocation or overrun by declaring a count. - Malformed or absent file never refuses to load the game. 13 new assertions in test/test_titlehook, including the ones that matter: a malformed line discards the whole file, expect/patch length mismatch is refused, over-long hex does not overrun the arena, and >TITLEDB_MAX_HOOKS refuses the file. The parser is pure, so they drive it directly and then feed the parsed set through the real applier against a real buffer. Verified: make TEST_EXPORTS=1 test exit 0, zero FAILs; c89-lint clean on all four touched .c files. Refs #637 Co-Authored-By: Claude Opus 5 <[email protected]> * fix(build): add hookfile.c to Package.swift; guard test fopen results (#637) Three CI failures on the first push, all mine: - Package.swift repeats Makefile.common's source list (SPM cannot read a Makefile), and I updated only one side -- which is exactly what the "duplicated lists in sync" guard exists to catch, and what broke the SwiftPM build job too. One line, both green. - clang-tidy flagged four clang-analyzer-nullability warnings in the new test block: fopen results used without a NULL check. Every fixture write is now guarded, and the first one bails out rather than pretending to test a file it could not create. Verified: check-package-sources.sh OK (70 core sources agree), clang-tidy clean on all four changed files, make TEST_EXPORTS=1 test exit 0. Refs #637 Co-Authored-By: Claude Opus 5 <[email protected]> * fix(hooks): bounded name copy, not strcpy (#637) clang-analyzer-security.insecureAPI.strcpy on the CI runner. The length was already validated one branch earlier, so this was safe in fact -- but the check is right that strcpy is unbounded at the call site regardless of what the caller checked, and a parser reading an attacker-editable file is the last place to argue with that. Local clang-tidy (llvm 21) did not raise it; the CI runner's did. Worth knowing the two disagree. Verified: test_titlehook OK (0 failures), make TEST_EXPORTS=1 test exit 0, c89-lint clean. Refs #637 Co-Authored-By: Claude Opus 5 <[email protected]> --------- Co-authored-by: Claude Opus 5 <[email protected]> |
||
|
|
d54067e5eb |
feat(debug): gdb/lldb tooling for the GDB stub (connect scripts, plugins, installer) (#693)
* feat(debug): GDB remote stub Phase 2/3/4 -- breakpoints, GPU/DSP threads, docs Phase 2: RSP ack/nak byte handling (the gap that stalled every real m68k-elf-gdb on qSupported), Z0-Z4 breakpoints/watchpoints, c/s/vCont, register and memory writes, the blocking halt loop (GDBHalt() freezes retro_run() in place until continue/step/disconnect), a client disconnect that disarms everything and resumes, and the virtualjaguar_gdb_wait / virtualjaguar_gdb_halt_timeout core options. Per-target armed counters (gdbArmed68K/GPU/DSP) plus a 256-entry direct-mapped PC cache gate the three per-instruction hooks (M68KInstructionHook, GPUExec, DSPExec) -- one load and one never-taken branch when nothing is armed, never patching emulated memory. Memory watchpoints ride jaguar.c's pre-existing (but previously dead) bpmActive/bpmAddress1 pair via the new GDBMemWatchHit(), single-slot by design. Phase 3: GPU and DSP as GDB threads 2/3 with a custom org.atari.jaguar.risc target description (R0-R31=0-31, PC=32, FLAGS=33, fixed forever) served over qXfer:features:read, thread enumeration/selection (qfThreadInfo/Hg/Hc/qC), and monitor commands (disasm/regs/halt/trace/watch) via qRcmd. The RISC disassembler is shared, not duplicated: src/debug/gdbdisasm.h is used by both gdbtarget.c (live) and the refactored test/tools/gpu_disasm_dump.c (offline). Phase 4: docs/gdb-stub-guide.md, a user-facing guide covering attach, the frontend-freeze halt model, the RISC disassembly gap, and the symbol-level (not source-level) debugging ceiling. New accessors added or un-gated from VJ_TRACE-only in gpu.c/dsp.c (GPUGetControl, GPUSetReg/PC/Flags, DSPGetPC/Control, DSPSetReg/PC/Flags, DSPGetReg/GPUGetFlags un-gated) so the stub can read and write GPU/DSP state in every build. Verification: make -j4 clean; make TEST_EXPORTS=1 test green (0 failures, 75 suites, including 45/45 gdbstub protocol tests); c89-lint clean on every touched src/ file; savestate digests byte-identical across stub-disabled / enabled-unattached / enabled-attached-zero-breakpoints (test/tools/gdb_determinism_probe); a live RSP client verifies the ack byte and no-ack transition end to end (test/tools/gdb_attach_probe.py) and a real Z0 breakpoint halting real (synthetic, injected) 68K execution at the exact armed PC (test/tools/gdb_breakpoint_probe.py). Perf A/B NOT measured this pass: the host stayed under sustained unrelated load (other processes, load average 10-26 over repeated checks) for the whole session. VJ_GDB_STUB_DISABLE_HOOKS is wired at all three hook sites so the A/B can be run later on an idle machine -- see the PR body. Refs #652 * feat(debug): add gdb/lldb tooling for the GDB stub (connect scripts, plugins, installer) tools/gdb/connect.sh (+ connect.cmd for Windows) finds a gdb on the machine and launches it pre-loaded with jaguar.gdbinit (set defaults plus jconnect/jdisasm/jregs/jhalt/jtrace/jwatch aliases over the stub's `monitor` commands) and jaguar_gdb.py (richer jag-disasm, jag-regs, jag-trace, jag-halt, jag-watch, jag-info-registers commands with argument checking and a pretty-printed, FLAGS-decoded register dump for the GPU/DSP threads). jaguar_lldb.py is the same convenience layer against LLDB's Python API, since LLDB speaks the same RSP wire protocol. install.sh appends an idempotent, clearly-marked block to ~/.gdbinit and ~/.lldbinit (never clobbering existing content, never duplicating on re-run), following tools/install.sh's as_root() guard pattern for the same reason: this user's shell aliases rm/cp/mv to their -i forms, and a prompt with no TTY blocks forever. GPU/DSP register numbering (R0-31=0-31, PC=32, FLAGS=33) is read from src/debug/gdbstub.h, not reinvented. Every command degrades gracefully -- no connection, an older core, or an unsupported monitor subcommand all print a short message instead of a traceback. While testing this against a live core, found and filed two stub-side protocol bugs as follow-up tasks (not fixed here -- out of scope for tooling, and each needs its own test coverage): GDBTargetResetState() never resets gdbSession.noAckMode, breaking the second debugger connection in a session; and unsupported RSP packets get no reply at all instead of the required empty packet, which hangs a real LLDB gdb-remote attach (confirmed via a proxied, byte-logged connection) and plausibly a real gdb too. Refs #652 * docs: point README and the gdb-stub guide at tools/gdb/ README.md's only prior GDB mention was the unrelated Jaguar GameDrive GDBIOS bindings. Add a short section linking docs/gdb-stub-guide.md and the new tools/gdb/ helper scripts. The guide gets a "Faster: tools/gdb/" pointer under Quick start, plus an honest "Known limitations" bullet for a stub-side bug found while building that tooling: an unsupported RSP packet gets no reply at all (should be an empty $#00 packet), which hangs a real LLDB gdb-remote attach and plausibly a real gdb's target remote too -- confirmed via a proxied, byte-logged LLDB connection. Filed separately for a fix; this is a documentation-only change. Refs #652 |
||
|
|
0ae01124c5 |
docs: settings and performance tuning guide, plus a site page
The core ships ~40 options and nothing explained which ones matter. This adds the map: what the defaults do, what the visual enhancements cost, what to change when a game runs slow, and which settings quietly cancel each other out. The load-bearing content is the performance section, and it is sourced rather than folklore: - Where frame time actually goes (DSP 50-67%, blitter 5-17% fast / ~34% AvP accurate, OP ~1%, 68K 0.7-2.6%), from docs/perf-audit-2026-08.md and docs/op-perf-profile.md. Figures are labelled as host arm64 profiles, NOT device measurements, because no on-device A10X capture exists yet (#601). - The compounding trap: DSP idle-skip disables itself under RISC clock scale, dram_timing, gpu_pipeline_timing and blit_memo -- and NOT under the M68K clock scale or blitter timing, which is the counterintuitive half and was verified against the gate in src/jerry/dsp.c rather than taken from any issue text (both #595's body and earlier notes had it wrong in exactly that way). - An ordered "what to try first" list, ending at overclocking rather than starting there, since on a DSP-bound title the RISC overclock trades the bigger win for the smaller one. Also adds site/pages/performance.html (condensed web version, wired into PAGES so it lands in the nav and sitemap) and two README pointers -- the docs index and a "Running slow?" line under Known limitations, which is where someone with a slow game will actually be looking. |
||
|
|
b466c0372f |
fix: address Kimi review findings on PR #594
- nightly-staleness.yml: compare against the `nightly` tag's target commit
date, not the release object's published_at/created_at. release.yml
updates the release in place (gh release edit --clobber), so those
timestamps are stamped once and never move -- the watchdog would have
started crying wolf on every scheduled run ~24h after this merged. The
tag ref IS force-moved on every publish, so it's the correct signal.
- README.md: Team Tap and Pro Controller were still marked "Not emulated"
in the peripheral table, contradicting this release. Fixed both, added
the 6D flight stick and paddle-ADC rows the table was missing entirely,
and named all three in the peripherals intro paragraph.
- docs/RELEASE_NOTES_v3.4.0.md: added a "(Corrected 2026-08-19: ...)"
marker where a prior docs-only fix (
|
||
|
|
153d054248 |
feat(input): emulate the $F17C00 motherboard paddle ADC (#505)
The 8-bit converter fitted to early Jaguar boards -- an ADC0844 at U16 behind JERRY's GPIO5 decode, "Paddle Interface" in TRM rev 8. This is a DIFFERENT device from #437's TR10 bank-switching analog controller: TR10 records the motherboard ADC as deleted and the controller-side one as its replacement. It is also the one analog interface a released game reads -- BattleSphere and BattleSphere Gold. Protocol, pinned by two sources that corroborate each other rather than by a register spec (there is none): - The software. BattleSphere's JERRY Timer 1 handler at $83E75C reads $F17C00 for the completed conversion, stores its LOW BYTE, then writes (channel | 4) to start the next; Club Drive at $811440 writes the same select and never reads back. - The part. TI's ADC0844/ADC0848 datasheet (SNAS523): 8-bit result, 40 us conversion, MUX address MA3..MA0 latched off data bits 3..0, and every single-ended row of its MUX Addressing table is MA3=0 MA2=1 with MA1:MA0 choosing the channel -- exactly the `channel | 4` the ROMs write. Channel -> axis (0/1 = port 1 X/Y, 2/3 = port 2 X/Y) is inferred from the PAD0X/PAD0Y/PAD1X/PAD1Y pin names plus BattleSphere consuming 2 and 3 behind a "2nd Controller" option, and is labelled as inference. Three reading states, all reproduced: no paddle selected -> $FF (retail console, no converter -- unchanged from v3.4.0); selected but that socket empty -> $00; selected -> the live tuned axis, $80 centred. Y is NOT inverted, unlike #437's TR10-mandated inversion. BattleSphere's calibrator at $827DDC..$827E14 uses the channel-3 byte directly as a screen Y coordinate, and screen Y grows downward. No engagement latch either: the paddle does not steal the $F14000 matrix (the pots are separate connector pins, so the port's digital pad stays live), and a latch would make "Align Crosshairs with Joytick Centered" unsatisfiable. Tuning reuses the shared absolute axistune path, so a dead zone means the same thing here as on the bank-switching device. The latched MUX address and completed conversion are machine-visible and ride in a new 2-byte trailing savestate chunk; no STATE_VERSION bump, since retro_serialize zero-fills the tail and zeros are what PaddleReset() would set. Also diverts the BYTE access path for $F17C00-$F17FFF away from the EEPROM catch-all, which v3.4.0 fixed for word access only. Default off. Verified inert with no paddle selected: frame_hash_ab CSVs are byte-identical to a libretro/develop build across BattleSphere (900 frames) and Club Drive (700 frames). New register-level suite test/tools/paddle_decode_test drives the register through BattleSphere's own ISR sequence. Co-Authored-By: Claude Opus 5 <[email protected]> |
||
|
|
988af54764 |
docs: correct the BIOS reference and the peripheral claims for v3.4.0
## BIOS (README) The section three site pages link to had gone factually wrong when v3.4.0 shipped external cart boot ROMs: - "The console boot ROM is always the embedded copy; it is never loaded from disk" -- untrue since 'Cart BIOS Type = Custom', which loads a 128 KB image from the system directory, and since jagboot_m.rom overrides the embedded Model-M image. - "Selection is by filename only -- the core does not verify which BIOS a file actually contains" -- untrue for both loaders. The filename picks what is tried and in what order; the contents decide acceptance. Cart images are identified against biosdb's four known CRC32s and an unrecognized one still loads (custom images being the point); CD images are matched against the retail and developer CRC32s, and an unknown one is accepted only if the run address at $404 falls in $800000-$840000. Documents the Series K / Model M / Custom selector, the custom search list and its filename-beats-depth ordering, and the CD three-group search order, none of which were described anywhere in prose. ## Peripherals The site listed the Team Tap and the Pro Controller among emulated devices. Neither is: the joystick interface models two sockets (joypad0/joypad1, joystick_ram[4]) and there is no six-button plumbing anywhere. docs/lightgun-design.md already recorded "No Team Tap support" as an explicit non-goal, so the site contradicted our own design doc. Removed both claims, and README now carries a peripheral table that says plainly what is and is not emulated, pointing at #513 and #514. README also gains the v3.4.0 entry it was missing, and names the peripherals in the opening summary and feature list. Co-Authored-By: Claude Opus 5 <[email protected]> |
||
|
|
6453b22baa |
feat(cd): load Jaguar CD CHDs that carry CHSE session tags (#322)
Refuse pre-15886 rips, vendor libchdr, and ship pinned chdman helpers on tagged releases and nightlies so users can convert CUE/BIN themselves. Co-authored-by: Cursor <[email protected]> |
||
|
|
ecfba369f5 |
docs(input): mouse user guide, and the evidence that no titledb row should ship (#429) (#450)
* docs(input): user guide for the mouse, and why no titledb row ships PR 4 of 4 of the input-devices track (epic #428), steps 8-9 of the design spec. Step 8 was "titledb: JagDoomEX rows gain {virtualjaguar_p2_device, mouse_st} -- only if step 5 confirmed JagDoomEX reads the mouse". It does not, so no row ships, and the reason is recorded where the next person will look for it. JagDoomEX does not read port 2. Verified by disassembly against every JagDoomEX CRC in titledb (each reproduced by applying the matching IPS patch to the verified retail dump 0x5E2CDBC0), plus the local Doom (World) EX.j64 (0xEE7B84EB) and the newest patch archive (JagDoomEX-ips-250318.7z, which reapplies to the existing 0x35743B9C row). Every build: - writes only the port-1 row selects $81FE/$81FD/$81FB/$81F7 -- the port-2 nibble is $F in all four, so every port-2 row is deselected; - ORs #$F0FFFFFC into the read before folding it into an 8-bit accumulator, so $F14000 bits 12-15 (the lines a mouse adapter drives) cannot reach the result; - accounts for all 11 absolute-long $F14000 references as 8 in that poll, one move.l #$100 at init and two lea $F14000,a0 in the EEPROM driver. There is no third path to the register. A row would therefore disconnect the port-2 RetroPad for a title that reads nothing from port 2, in exchange for no function. #429's "auto-select the mouse for JagDoomEX by CRC" checklist item is not applicable to any released build. Elansar was the other candidate and it cannot have a row either, for a structural reason rather than an evidential one: titledb is keyed on cartridge CRCs and libretro.c deliberately never hashes a disc image, so no CD title can auto-select a device. That dissolves the "which wiring case does Elansar's Atari/Amiga selector mean" question for this PR -- whichever it is, it stays a manual option choice. Defender of the Crown, Gridrunner and Star Wars Arcade are absent from the corpus, so their CRCs are unverifiable and no row is guessed for them. New docs/input-devices-user-guide.md covers the options, the three wiring cases and how to tell you picked the wrong one, why raising sensitivity past the game's poll rate buys lag rather than speed, the mouse-capable titles, the reproduced-not-broken hardware quirks, and the known limitation that real-frontend mouse routing is unverified (RetroArch has historically bound mice to port index 0; #449 deliberately shipped no speculative port-0 fallback). docs/jaguar-mouse-adapter-mapping.md section 8 F is updated: the JagDoomEX half of "not attempted" is now done and negative; Elansar is still not disassembled and item A is still open. No behaviour change -- the joymatrix identity digests are asserted unchanged. Refs #429, #428. Stacked on #446 and #449. Co-Authored-By: Claude Opus 5 <[email protected]> * docs(input): match the guide to what actually merged in #449 The user guide was written against the pre-review mouse snapshot. Three of its claims no longer describe the merged code: - the port-2 pad is not dropped the moment a mouse is selected, only once the frontend has proven it routes mouse state (inputdev_live[]); - a frontend setting JOYPAD/NONE releases its claim back to the core option rather than forcing a pad; - the symptom of the unverified-routing limitation is therefore "mouse does nothing, pad still works", not "port 2 is dead". --------- Co-authored-by: Claude Opus 5 <[email protected]> |
||
|
|
a5c0c0f086 |
docs(readme): catch up to v3.3.0 — hi-res shipped, true color shipped, current what's-new
The README was two releases stale on its own features: true color said 'ships in the next tagged release' (shipped v3.2.0), the hi-res track was 'in design' (shipped and complete in v3.3.0), and What's New led with the v3.1.0 cycle. - Roadmap section replaced by the shipped internal-resolution feature: stage table (Stage 2 / Stage 3 / CLUT / RGB16 with ship versions), the JagDoomEX diff figure inline, measured per-title coverage including Val d'Isere's 0% -> 2.5-7.2%, and the honest zero-list. - New blit memoization section (2,546,482 corpus verifications, zero divergences). - Per-title DB entry count refreshed (21 entries) and names JagDoomEX's alias recognition. - What's New: v3.3.0 and v3.2.0 summaries first; the old since-v3.1.0 bullet list folded into a <details> block. Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
11da4aa9c6 |
docs: ROM soft-patching guide + known-patch catalogue (#409)
Co-Authored-By: Claude Opus 5 <[email protected]> |
||
|
|
041bb0fad1 |
feat(core): per-title enhancement defaults DB (#368) (#377)
* feat(core): per-title enhancement defaults table + lookup (#368) Co-Authored-By: Claude Fable 5 <[email protected]> * feat(core): apply per-title enhancement defaults at option-read time (#368) Co-Authored-By: Claude Fable 5 <[email protected]> * test: per-title defaults E2E — apply, disable, user-override contract (#368) Adds test/tools/test_pertitle_db, a harness-driven E2E test covering the per-title enhancement defaults DB end to end: default options apply the DB (AvP -> internal_resolution=2x + true_color=enabled, with a [titledb] log line as evidence), virtualjaguar_pertitle_defaults=disabled restores stock behaviour on both keys, a disabled gate + explicit user option still honors the user's choice, and an option left at a value equal to its own registered default is (by design) indistinguishable from untouched and gets substituted. A non-DB ROM (yarc.j64) gets no substitution and no log line. One process per --case, since shadowHiresN is fixed for the session at retro_load_game time. Wires into the Makefile `test:` target behind scripts/find-rom.sh + a CRC32 verification of the AvP dump against the seeded 0xDC187F82 (skips, recorded in the ledger, if the corpus ROM doesn't match); the non-DB control uses the in-tree yarc.j64 so it never skips. Also extends exports-test.list / link-test.T with shadowHiresN and shadowFBActive, which the test dlsym's directly to assert on emulator state rather than log text alone. Co-Authored-By: Claude Fable 5 <[email protected]> * docs: per-title enhancement defaults (#368) Co-Authored-By: Claude Fable 5 <[email protected]> * fix(test): clean up partial per-title log capture setup Co-authored-by: JoeMatt <[email protected]> * feat(core): expand per-title defaults from the corpus census (#368) Derives 9 new titledb.c entries (Air Cars, Doom, Hover Strike, I-War, Kasumi Ninja, Missile Command 3D, Skyhammer, Tempest 2000, Towers II) from docs/hires-stage0-census.md section 2, bringing the table to 12 entries covering 11 titles. Policy: true_color=enabled when shaded blits/frame >= 10; 2x internal resolution when QUALIFY16/frame >= 5; either pair requires the census "Scene reached" to be actual gameplay (menu/attract/did-not-render rows excluded); one census measurement maps to every plain retail CRC of that title in filedb.c. Seed entries (AvP, Cybermorph x2) verified to fall out of the same policy unchanged. Co-Authored-By: Claude Fable 5 <[email protected]> --------- Co-authored-by: Claude Fable 5 <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: JoeMatt <[email protected]> |
||
|
|
88eb19b8bf |
docs: rewrite README as the project's primary showcase surface (#345)
* docs: rewrite README as the project's primary showcase surface The GitHub README is the highest-traffic, highest-SEO surface this project has, and the Pages site is currently unreachable (the org-level custom domain points at a Cloudflare-served domain), so the README has to stand alone rather than defer to the site. Reuses the already fact-checked framing and evidence links from site/pages/*.html, with every claim traceable to a committed doc, a merged PR, or the repo itself: - Hero: keyword-natural positioning sentence, CI / release / license / platform badges, and the committed true-color A/B image by relative path (no external image hosts). - "What makes this core different", framed structurally: every RetroArch capability works because this is a libretro core, plus the Jaguar-specific parts (CD in both modes, JagLink, GameDrive, Memory Track, damaged-rip repair, crash watchdog). No claims about other emulators except the single hedged one carried over from why-this-core.html, with its corrections-welcome-in-Discussions invite intact. - Enhancements: true-color with PR #341's real numbers (304 -> 450 unique colors, 45.9% of pixels refined by exactly one quantization step, diff panel amplified 64x) and the honest Checkered Flag no-change note; hi-res upscaling labeled "in design" (#338). - Compatibility: 11/11/11 quoted from docs/cd-boot-matrix.md, with the "disc images, not games" and "regression gate, not a completion certificate" caveats; links to the libretro compatibility list. - Quick start, core-option highlights, where saves live. - What's new: #339/#340/#341/#342/#344 labeled as merged to develop and nightly-only, since all landed after the v3.1.0 tag. Nightlies described as compile-gated, not CI-verified. Keeps the substance: BIOS section (anchor #bios is linked from three site pages), external CD BIOS override table, build/test instructions, platform list, hardware notes, contributors. Verified: every relative path resolves against git ls-files, all 29 external URLs return 200, PR/issue numbers exist, tables and code fences balanced. * docs: note benign watchdog signatures in the CD compat summary Several matrix rows carry a cd_seek_wedge or video_stall line alongside a passing GAME_CODE stage. The matrix doc and the site's compatibility page both explain that the stage column is the regression gate and a lone watchdog line is frequently benign; say so here too rather than letting the 11/11/11 summary read cleaner than the underlying data. * docs: state the v1 savestate exception instead of claiming exactness savestate-compat.md documents that v1 predates four DAC I2S fields and loads them at defaults, so 'exactly, not best-effort' overstated it. Co-Authored-By: Claude Fable 5 <[email protected]> * docs: scope the evidence-linking promise to factual claims Copilot review: 'Every claim below links to...' over-promised — quick start and build steps are instructions, not evidence-backed assertions. Co-Authored-By: Claude Fable 5 <[email protected]> --------- Co-authored-by: Claude Fable 5 <[email protected]> |
||
|
|
36d12d56cb | docs: note audio CDs need the real-BIOS CD boot path | ||
|
|
ee4dd97b35 |
docs: correct stale CHD claim, document JagGD/VLM/clock-scale
CLAUDE.md still listed CHD among cdintf.c's supported image formats; CHD was removed during the CD overhaul (see #322). Also adds the src/core/jaggd.c layout entry and notes Q-subcode in cdrom.c. README's feature list predates v3.1.0's user-visible additions: GameDrive cartridges, audio-CD/VLM playback, clock-scale options. Co-Authored-By: Claude Opus 5 <[email protected]> |
||
|
|
e1c4b26f9f |
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <[email protected]> |
||
|
|
bf47a0773b |
docs: reposition as the actively maintained Virtual Jaguar, tune copy for search
The 'hard fork of an abandoned project' framing read as if THIS project were abandoned. This repository is where Virtual Jaguar development continues; the README headline, intro, credits line and the .info description now say so, with searchable phrasing (Atari Jaguar emulator, Jaguar CD, libretro, RetroArch). Upstream credits unchanged in substance. The GitHub repo description and topics need admin and are updated separately. Co-Authored-By: Claude Opus 5 <[email protected]> |
||
|
|
0ecf924e84 |
docs: note Auto CD boot mode also uses the real-BIOS path
Copilot review: 'Auto' is currently identical to 'Real BIOS', so the external CD BIOS override applies to both non-HLE modes, not just the explicit 'Real BIOS' setting. Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
8d2c486426 |
docs: document embedded BIOS handling and optional CD BIOS override
No BIOS files are required -- the Jaguar boot ROM and both CD BIOSes (retail and developer) are embedded in the core -- but nothing outside the core-option sublabels said so, and users reasonably assumed a BIOS file was needed with no documented filename or location (#294). - README: new BIOS section covering the embedded boot ROM / CD BIOSes, the BIOS-related core options, and the optional external CD BIOS override (accepted filenames, sub-folders, 256 KiB size check, and the filename-only selection caveat). - .info: optional firmware entries for the two canonical CD BIOS names so RetroArch's Core Information screen lists them, plus notes and a description one-liner stating no BIOS files are required. Closes #295 Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
90ecfd1e34 |
docs: README / WHATSNEW / process-doc updates for v3.0.0
Pre-tag scrutiny pass, stale-doc half (brief items 16-19): - README: the CD sentence still said "in flight on a separate branch (PR forthcoming)"; CD support ships in v3.0.0. The supported-format list now matches JAGUAR_VALID_EXTENSIONS in libretro.c (j64|jag|rom|abs|cof|bin|prg|cue|cdi). - docs/WHATSNEW: add the v3.0.0 section at the top, in the file's existing per-version style. - docs/release-process.md: release.yml builds 16 platforms (14 in the build matrix plus Vita and Switch in their own jobs), not 14. Beyond the brief, from fact-checking the format list: the core has NO CHD loader (no libchdr, no `chd` in JAGUAR_VALID_EXTENSIONS, no reader in cdintf.c), so every "use CUE/BIN, CHD, or CDI" claim pointed users at a format the core rejects. Corrected in the .iso refusal message (src/cd/cdintf.c), docs/cd-known-issues.md and the README, and the stale libretro.c comment that promised CD extensions on "a future PR" now describes what is actually accepted. Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
e742cac583 |
docs: qualify TCP platform support; drop hard-coded date (review)
Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
43ced9bc42 |
docs: user-facing network play setup guide
Netplay-vs-direct-TCP came up as genuinely confusing in first-party play testing (which system discovers peers, which needs an IP file, why mixing them can never connect, why an old core build shows no option at all). One page answers it. Co-Authored-By: Claude Fable 5 <[email protected]> |
||
|
|
893516ee8e |
security: add SECURITY.md, embed SHA256 in release body, document AV false positives
Agent-Logs-Url: https://github.com/libretro/virtualjaguar-libretro/sessions/47e22344-f3fa-4f36-93b1-41f389238c04 Co-authored-by: JoeMatt <[email protected]> |
||
|
|
4fcf9582c6 |
Fix emulation accuracy: resolution, 68K instructions, events, RAM init, logging (#119)
* Fix emulation accuracy: resolution, 68K instructions, RAM init, logging General emulation fixes extracted from the CD development branch, with no CD-specific code included. - TOM: Use actual HDB1/HDE/VDB/VDE registers for resolution calculation instead of hardcoded visible area constants. Fixes games that set non-standard display windows (240p test suite, Doom). - 68K: Emulate 68020 MULL/DIVL instructions via IllegalOpcode trap, needed for m68k-atari-mint-gcc / Removers Library toolchain games. - 68K: Fix BSR.L (opcode $61FF) for Atari 'aln' linker which writes absolute addresses instead of PC-relative displacements. - RAM: Skip randomization over loaded executable region during reset, fixing RAM-loaded ABS/COFF files that were destroyed by JaguarReset(). - Logging: Add libretro log interface (src/log.h) with LOG_DBG/INF/WRN/ERR macros routed through retro_log_printf_t, toggleable in RetroArch UI. - JERRY: Disable JERRY_TRACE_DEBUG (was fprintf on every 44kHz interrupt). - GPU: Add GPU_TRACE_DEBUG guard for trace output. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix event system: zero eventTime on init, check all slots for next event GetTimeToNextEvent() was reading slot[0].eventTime unconditionally as the initial minimum, even when slot[0] was invalid—using uninitialized garbage values. This caused periodic execution bursts where the 68K would run for huge timeslices, producing visible stuttering. Start with time=1e30 sentinel and iterate from slot 0 with validity checks. Also zero eventTime in InitializeEventList() to prevent stale values. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Address PR review: DIVL exception PC, strict-aliasing, TOM underflow, GPU stubs - Fix DIVL divide-by-zero exception: advance PC by full instruction length (4 + extra) instead of partial (2 + extra), matching the non-exception path - Fix strict-aliasing violation in JaguarReset RAM randomization: use SET32() macro instead of uint32_t* cast into uint8_t array - Guard TOM width calculation against HDE < HDB1 underflow: validate dispEnd > dispStart before computing width, preventing uint16_t wrap - Add GPUIsRunning() and GPUDumpState() implementations to match gpu.h declarations Co-Authored-By: Claude Opus 4.6 <[email protected]> * Replace Doom resolution hack with proper pwidth pixel replication The Doom res hack was a CRY-only special case that doubled pixels when pwidth=8 and the user enabled a core option. This replaces it with correct pwidth-aware rendering in all 5 scanline renderers. When pwidth >= 8, each line buffer pixel is replicated (pwidth/4) times in the backbuffer, and TOMGetVideoModeWidth returns the scaled display width. This handles Doom (pwidth=8) and any other game using wide pixel modes, without requiring a user-facing hack option. Removes: doom_res_hack variable, virtualjaguar_doom_res_hack core option. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Update yarc regression baseline for pwidth rendering changes Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix DSP execution: run in main loop, dispatch IRQs on INT_ENA enable Two fixes for DSP emulation accuracy: 1. Run DSPExec() in JaguarExecuteNew() main loop alongside GPU. Previously DSP only ran via SoundCallback(), starving games that use the DSP for non-audio work (e.g. WMCJ handshake). 2. Dispatch pending interrupts immediately when a flags write enables INT_ENA while the corresponding INT_LAT is pending. Real hardware fires the IRQ within one cycle of the enable; without this, games that rely on CPU-to-DSP interrupts hang. Also removes temporary debug fprintf instrumentation and adds DSPGetRAM() accessor for the test harness. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix DSP interrupt dispatch ordering, revert DSP in main loop Two corrections to the DSP execution fix: 1. Move DSPHandleIRQsNP() call AFTER CINT latch clearing. When an ISR writes to dsp_flags to clear IMASK and CINT0 simultaneously, dispatching before CINT clearing caused re-entrant interrupts (INT_LAT0 still pending when dispatch checked). Moving dispatch after CINT ensures the latch is cleared before checking. 2. Revert DSPExec() from JaguarExecuteNew(). SoundCallback() in dac.c already runs the DSP each frame. Running it in both places gave the DSP double execution time, causing audio/video glitches. Co-Authored-By: Claude Opus 4.6 <[email protected]> * dsp tests and jaguar.c main rom boot patches Signed-off-by: Joseph Mattiello <[email protected]> * Fix HLE BIOS: prevent video blackout, improve DSP accuracy, add named constants The DSPGO auto-ack threshold of 64 was too aggressive — normal gameplay status checks accumulated across frames and killed legitimate DSP sound programs after ~2 seconds, causing BattleSphere and WMCJ to go black after reaching menus. Raise to 8192 (tight boot-time poll loops still trigger within one frame) and reset the counter on DSP_CTRL writes. Narrow DSP RAM auto-ack from 5KB (offset >= 0x9D0) to the 16-byte BIOS sound command area ($F1B9D0-$F1B9DF) to stop destroying non-command game data. Also: - Replace 30+ inline magic numbers in HLE init and DSP with named #defines - Fix DSP IRQ dispatch: only re-dispatch from external callers (M68K/GPU), not when DSP itself writes flags during ISR return - Fix DSP INT_LAT5 extraction bit shift (>>11 not >>10) - Fix DSP sat32s to use sign-extended 40-bit accumulator - Add TOM video register defaults (HS, HVS, HDB2, VEB, VEE, HEQ, BG) - Add TOM width/height bounds checking to prevent buffer overflows - Zero-fill RAM and DSP RAM in HLE mode (BIOS clears these; games assume it) - Add test_rom_smoke batch tester and WMCJ/HLE boot debug harnesses Tested: BattleSphere and WMCJ maintain video output through 1800 frames (30 seconds) in HLE mode. Full ROM suite: 14 OK, 2 NO_VIDEO (expected), 0 crashes, no regressions. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix BIOS regression, CI failures, and PR review feedback - Revert DSP IRQ dispatch `who != DSP` guard that broke BIOS mode by preventing the DSP from self-dispatching interrupts during ISR return. WMCJ with BIOS dropped from 8.1M to 4.9M pixels at 900 frames; now restored to 8.1M. - Export DSP/GPU/memory symbols in link.T so Linux CI can dlsym them for DSP instruction set tests (was "Missing: DSPReset"). - Remove `inline` from vj_log_stderr in log.h (MSVC compatibility). - Add pack assertion in test_gpu_ops.c (was always-pass). - Fix LEA test comment inconsistency in test_m68k_ops.c. - Add <strings.h> for strcasecmp in test_rom_smoke.c. - Remove tomWidth bounds guard from TOMExecHalfline (already clamped in TOMGetVideoModeWidth). Co-Authored-By: Claude Opus 4.6 <[email protected]> * Fix CI failures: GPU symbol exports, PACK test, regression baselines, DSP IRQ - Export GPU*/gpu_* symbols in link.T so test_gpu_ops can dlsym GPUReset on Linux (was "Missing: GPUReset" in CI) - Fix PACK instruction test: expected value was 0x01E0 but correct result is 0x08E0 (shift arithmetic error in test comment) - Update regression baselines for pwidth resolution changes - Restore DSP INT_LAT5 extraction fix (>>10 → >>11) that was accidentally reverted in |
||
|
|
77e49b4fd1 |
Use POSIX-portable CPU count in build examples
Replace `nproc` (Linux-only) with `getconf _NPROCESSORS_ONLN` which works on all POSIX systems including macOS and BSD. Also update `platform=ios` to `platform=ios-arm64` since armv7 is no longer supported by modern toolchains. Co-Authored-By: Claude Opus 4.6 <[email protected]> |
||
|
|
df5fdda957 |
Update README, fix CI, and add LICENSE
- Rewrite README with features, build instructions, documentation links, contributors, and license sections - Remove broken LGTM badges (service discontinued) - Fix CI failures: update actions/checkout, upload-artifact, and download-artifact from v2 to v4 (v2 deprecated by GitHub) - Remove unnecessary download-artifact step from CI workflow - Add top-level LICENSE file (GPLv3, was only in docs/) - Add CLAUDE.md for Claude Code context Co-Authored-By: Claude Opus 4.6 <[email protected]> |
||
|
|
b484af73fd | Update README, formatting, badges | ||
|
|
73bf95fe66 |
Update VirtualJaguar to latest
Sound now works |
||
|
|
05ca83497c | Initial port | ||
|
|
3943bbb584 | Initial commit |