From c7571a802833242c2f2185a085b6e93e310127f6 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:27:34 +0100 Subject: [PATCH 1/9] feat: document the eduke32 libretro build --- emulators/eduke32.yml | 77 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/emulators/eduke32.yml b/emulators/eduke32.yml index 0c781d974..a54010c5f 100644 --- a/emulators/eduke32.yml +++ b/emulators/eduke32.yml @@ -1,19 +1,30 @@ emulator: EDuke32 -type: standalone +type: standalone + libretro core_classification: game_engine -source: "https://voidpoint.io/terminx/eduke32" +source: + standalone: "https://voidpoint.io/terminx/eduke32" + libretro: "https://git.libretro.com/libretro/eduke32-libretro" upstream: "https://voidpoint.io/terminx/eduke32" version_source: url: "https://dukeworld.com/eduke32/synthesis/latest/" pattern: 'eduke32_src_(\d{8}-\d+-[0-9a-f]+)\.tar' -profiled_date: "2026-10-04" -source_commit: "ec5824db81817866f70da326d3811bb0f52b3517" -core_version: "20260807-10669-ec5824db8" +profiled_date: "2026-11-09" +source_commit: + standalone: "ec5824db81817866f70da326d3811bb0f52b3517" + libretro: "b5918d5cf3fc698700c86693fce3ce5200c28b96" +core_version: + standalone: "20260807-10669-ec5824db8" + libretro: "1.0.0" version_basis: - kind: package - url: "https://dukeworld.com/eduke32/synthesis/20260807-10669-ec5824db8/eduke32_src_20260807-10669-ec5824db8.tar.xz" - pattern: 'eduke32_src_(\d{8}-\d+-[0-9a-f]+)\.tar' - artifact: "eduke32_src_20260807-10669-ec5824db8.tar.xz" + standalone: + kind: package + url: "https://dukeworld.com/eduke32/synthesis/20260807-10669-ec5824db8/eduke32_src_20260807-10669-ec5824db8.tar.xz" + pattern: 'eduke32_src_(\d{8}-\d+-[0-9a-f]+)\.tar' + artifact: "eduke32_src_20260807-10669-ec5824db8.tar.xz" + libretro: + kind: file + path: "platform/Libretro/core.cpp" + pattern: 'info->library_version\s*=\s*"([^"]+)"' display_name: "EDuke32" cores: [eduke32] systems: [duke3d, nam, napalm, ww2gi] @@ -43,6 +54,20 @@ notes: | An addon whose dependency is not found is removed from the list (source/duke3d/src/grpscan.cpp:503-517). + The libretro build is the same tree at ec5824db with platform/Libretro/ + added and the file access routed through the frontend VFS. The content + is a GRP, ZIP, PK3 or PK4 opened by full path + (platform/Libretro/core.cpp:615-623). It is mounted as the first group, + and the folder that holds it is the search path the core adds + (platform/Libretro/core.cpp:652-670). G_AddSearchPaths is never called. + The scan then runs over that folder and keeps the GRP named DUKE3D.GRP, else the first one it + recognises, which sets the game type and its CON, DEF and RTS names + (source/duke3d/src/common.cpp:339-358, 420-443). Every file below is + therefore read beside the content, never from the system directory. + Relative paths, the config and the GRP cache among them, resolve below + the save directory (platform/Libretro/core.cpp:486-489, + platform/Libretro/vfs_libretro.cpp:31-40). + files: # ================================================================ # Duke Nukem 3D (base game, GAMEFLAG_DUKE) @@ -50,6 +75,8 @@ files: - name: "DUKE3D.GRP" category: game_data + load_from: + libretro: content_dir system: duke3d required: false installed_on: [retropie] @@ -69,6 +96,8 @@ files: - name: "EDUKE.CON" category: game_data + load_from: + libretro: content_dir system: duke3d required: false source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_DUKE)" @@ -76,6 +105,8 @@ files: - name: "DUKE.RTS" category: game_data + load_from: + libretro: content_dir system: duke3d required: false installed_on: [retropie] @@ -86,12 +117,16 @@ files: - name: "DUKEDC.GRP" category: game_data + load_from: + libretro: content_dir system: duke3d required: false source_ref: "source/duke3d/src/grpscan.cpp:56-59 (Duke it out in D.C., GAMEFLAG_ADDON)" - name: "VACATION.GRP" category: game_data + load_from: + libretro: content_dir system: duke3d required: false source_ref: "source/duke3d/src/grpscan.cpp:60-64 (Duke Caribbean: Life's a Beach, GAMEFLAG_ADDON)" @@ -99,6 +134,8 @@ files: - name: "NWINTER.GRP" description: "Duke: Nuclear Winter" category: game_data + load_from: + libretro: content_dir system: duke3d required: false size: 16169365 @@ -109,6 +146,8 @@ files: - name: "NWINTER.GRP" description: "Duke: Nuclear Winter Demo" category: game_data + load_from: + libretro: content_dir system: duke3d required: false size: 10965909 @@ -119,6 +158,8 @@ files: - name: "DZ2.GRP" category: game_data + load_from: + libretro: content_dir system: duke3d required: false source_ref: "source/duke3d/src/grpscan.cpp:67-69 (Duke!ZONE II, GAMEFLAG_ADDON)" @@ -126,6 +167,8 @@ files: - name: "penthous.zip" description: "Duke Nukem's Penthouse Paradise" category: game_data + load_from: + libretro: content_dir system: duke3d required: false size: 2112419 @@ -137,6 +180,8 @@ files: - name: "PENTP.GRP" description: "Duke Nukem's Penthouse Paradise" category: game_data + load_from: + libretro: content_dir system: duke3d required: false size: 4247491 @@ -150,6 +195,8 @@ files: - name: "NAM.GRP" category: game_data + load_from: + libretro: content_dir system: nam size: 43448927 required: false @@ -157,6 +204,8 @@ files: - name: "NAM.CON" category: game_data + load_from: + libretro: content_dir system: nam required: false source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_NAM)" @@ -167,6 +216,8 @@ files: - name: "NAPALM.GRP" category: game_data + load_from: + libretro: content_dir system: napalm size: 44365728 required: false @@ -174,6 +225,8 @@ files: - name: "NAPALM.CON" category: game_data + load_from: + libretro: content_dir system: napalm required: false source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_NAPALM)" @@ -184,6 +237,8 @@ files: - name: "WW2GI.GRP" category: game_data + load_from: + libretro: content_dir system: ww2gi size: 77939508 required: false @@ -191,12 +246,16 @@ files: - name: "WW2GI.CON" category: game_data + load_from: + libretro: content_dir system: ww2gi required: false source_ref: "source/duke3d/src/common.cpp:38 (defaultgameconfilename GAME_WW2GI)" - name: "PLATOONL.GRP" category: game_data + load_from: + libretro: content_dir system: ww2gi size: 37852572 required: false From d9b788787cd1f21ee425cc21ce9c6becfebea2df Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:34:26 +0100 Subject: [PATCH 2/9] fix: read keyed source and version in profile_sync --- scripts/profile_sync.py | 22 +++++++++++++++++----- tests/test_profile_sync.py | 11 +++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/scripts/profile_sync.py b/scripts/profile_sync.py index b72787608..abe7b5bf8 100644 --- a/scripts/profile_sync.py +++ b/scripts/profile_sync.py @@ -1097,11 +1097,19 @@ def triage_state(report: ProfileReport) -> str: def select_repo(profile: dict) -> upstream.Repo | None: - """Repository the profile was read from: source first, then upstream.""" + """Repository the profile was read from: source first, then upstream. + + A source keyed by build mode with no upstream (uzdoom) names its + repositories only in the dict, which a plain string read never parses. + """ for field in ("source", "upstream"): repo = upstream.parse_repo(str(profile.get(field) or "")) if repo is not None: return repo + for _, _, url in declared_repositories(profile): + repo = upstream.parse_repo(url) + if repo is not None: + return repo return None @@ -1496,14 +1504,18 @@ def detect_pinned_tag( def tag_pinned_views( profile: dict, views: list[RepoView], cache_dir: str, offline: bool ) -> dict[tuple[str, str], str]: - """Views whose pin is the tag `core_version` names, keyed by repository.""" + """Views whose pin is the tag `core_version` names, keyed by repository. + + A core_version keyed by build mode names the tag of the view's own mode: + uzdoom's standalone sits on 5.0.3 while its libretro branch moves. + """ tagged: dict[tuple[str, str], str] = {} + declared = profile.get("core_version") for view in views: if view.pin == view.head: continue - for tag in version_tag_candidates( - profile.get("core_version"), view.repo.name - ): + version = declared.get(view.mode) if isinstance(declared, dict) else declared + for tag in version_tag_candidates(version, view.repo.name): if upstream.tag_commit(view.repo, tag, cache_dir, offline) == view.pin: tagged[(view.repo.host, view.repo.slug)] = tag break diff --git a/tests/test_profile_sync.py b/tests/test_profile_sync.py index 6711b143e..67b48ca29 100644 --- a/tests/test_profile_sync.py +++ b/tests/test_profile_sync.py @@ -1254,6 +1254,17 @@ class TestSelectRepo(unittest.TestCase): def test_none_when_no_supported_host(self): self.assertIsNone(select_repo({"source": "https://www.6809.org.uk/"})) + def test_source_keyed_by_mode_without_upstream(self): + repo = select_repo( + { + "source": { + "standalone": "https://github.com/UZDoom/UZDoom", + "libretro": "https://github.com/libretro/uzdoom", + }, + } + ) + self.assertEqual(repo.name, "UZDoom") + class TestBuildReport(unittest.TestCase): def setUp(self): From 9bfda459ae5c897b4f5fb3145266a08f676f9858 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:34:26 +0100 Subject: [PATCH 3/9] feat: document the uzdoom libretro build --- emulators/uzdoom.yml | 114 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 106 insertions(+), 8 deletions(-) diff --git a/emulators/uzdoom.yml b/emulators/uzdoom.yml index 3d44c59b1..05ee783ff 100644 --- a/emulators/uzdoom.yml +++ b/emulators/uzdoom.yml @@ -1,14 +1,25 @@ emulator: UZDoom -type: standalone +type: standalone + libretro core_classification: game_engine -source: "https://github.com/UZDoom/UZDoom" -profiled_date: "2026-10-20" -source_commit: "7910df7102033fd7754a317f3254f24101135926" -core_version: "5.0.3" +source: + standalone: "https://github.com/UZDoom/UZDoom" + libretro: "https://git.libretro.com/libretro/uzdoom" +profiled_date: "2026-11-09" +source_commit: + standalone: "7910df7102033fd7754a317f3254f24101135926" + libretro: "829f29959d01203c1971f75ee784912edc2297e8" +core_version: + standalone: "5.0.3" + libretro: "5.1.0-pre" version_basis: - kind: tag - tag: "5.0.3" - distance: 0 + standalone: + kind: tag + tag: "5.0.3" + distance: 0 + libretro: + kind: file + path: "src/version.h" + pattern: '#define\s+VERSIONSTR\s+"([^"]+)"' display_name: "UZDoom" cores: - uzdoom @@ -52,6 +63,34 @@ notes: | 3a41131845415bc4bb5474f8de301a77736bd858e2ab489926325a2675e8263f, built from this commit). They are rebuilt with every release. + The libretro build lives on the libretro branch of libretro's copy of + the project, which carries UZDoom trunk of 2026-10-28 (67bdb4b, after + the 5.0.3 branch point) and adds src/common/platform/libretro/. The core + takes a .wad or .iwad by full path and starts the engine with -iwad on + it, the configuration uzdoom-libretro.ini and the savegames in the save + directory, and $PROGDIR set to the system directory. A frontend without + a system directory or a save directory gets no game. + ref: src/common/platform/libretro/retro_core.cpp:57-66, + src/common/platform/libretro/retro_core.cpp:296-299, + src/common/platform/libretro/retro_core.cpp:317-331, + src/common/platform/libretro/retro_paths.cpp:4-17 + + uzdoom.pk3 and game_support.pk3 are compiled into the libretro binary + and served under uzdoom-internal:/ whenever BaseFileSearch asks for + those names, so no copy on disk is read. The other engine resources + are not: lights.pk3, brightmaps.pk3 and game_widescreen_gfx.pk3 are + looked for in $PROGDIR first, and the soundfont directories are + $PROGDIR/soundfonts and $PROGDIR/fm_banks, both below the system + directory. + ref: src/common/platform/libretro/embedded_pk3.S.in:1-39, + src/common/platform/libretro/retro_resources.h:7-26 + + The IWAD is the content, and the files an IWAD entry loads from its own + folder (voices.wad, extras.wad, soundtrack, nerve.wad, nerveunity.wad) + are read beside it. A Required IWAD (hexen.wad under hexdd.wad, + strife1.wad under sve.wad) and id24res.wad are looked for in the IWAD + search paths, which hold "." and $PROGDIR and never the content folder. + files: # ================================================================ # Engine resources (shipped with the port, add_pk3 in CMakeLists) @@ -59,6 +98,7 @@ files: - name: "uzdoom.pk3" category: game_data + mode: standalone bundled: true required: true size: 7159816 @@ -69,6 +109,7 @@ files: - name: "game_support.pk3" category: game_data + mode: standalone bundled: true required: false size: 2918075 @@ -79,6 +120,7 @@ files: - name: "lights.pk3" category: game_data + mode: standalone bundled: true required: false size: 23637 @@ -86,8 +128,17 @@ files: sha1: "aad904eec722503845348fdf9fa47586d58df5df" source_ref: "src/d_main.cpp:2394-2399, wadsrc_lights/CMakeLists.txt:1" + - name: "lights.pk3" + category: game_data + mode: libretro + required: false + source_ref: + libretro: "src/d_main.cpp:2422-2429, src/common/utility/findfile.cpp:248-262, src/common/platform/libretro/retro_core.cpp:59" + note: "Read from the system directory, the core's $PROGDIR. Built from wadsrc_lights/." + - name: "brightmaps.pk3" category: game_data + mode: standalone bundled: true required: false size: 246507 @@ -95,8 +146,17 @@ files: sha1: "b47d9397c4dc00a4ea079053167d317118c26b0a" source_ref: "src/d_main.cpp:2400-2405, wadsrc_bm/CMakeLists.txt:1-2" + - name: "brightmaps.pk3" + category: game_data + mode: libretro + required: false + source_ref: + libretro: "src/d_main.cpp:2430-2435, src/common/utility/findfile.cpp:248-262, src/common/platform/libretro/retro_core.cpp:59" + note: "Read from the system directory, the core's $PROGDIR. Built from wadsrc_bm/." + - name: "game_widescreen_gfx.pk3" category: game_data + mode: standalone bundled: true required: false size: 5565904 @@ -104,8 +164,17 @@ files: sha1: "457494b0d6961773686bf1a3555c0bc595ef8ec4" source_ref: "src/d_main.cpp:2406-2411, wadsrc_widepix/CMakeLists.txt:1-2" + - name: "game_widescreen_gfx.pk3" + category: game_data + mode: libretro + required: false + source_ref: + libretro: "src/d_main.cpp:2436-2441, src/common/utility/findfile.cpp:248-262, src/common/platform/libretro/retro_core.cpp:59" + note: "Read from the system directory, the core's $PROGDIR. Built from wadsrc_widepix/." + - name: "uzdoom.sf2" category: game_data + mode: standalone bundled: true path: "soundfonts/uzdoom.sf2" required: false @@ -115,8 +184,18 @@ files: source_ref: "src/common/audio/music/i_soundfont.cpp:323-347, 435-439, src/common/audio/music/music_config.cpp:137, src/CMakeLists.txt:1445-1451" note: "Default soundfont, used when the soundfont directories hold none. Every file of those directories is taken by its content. fluid_patchset defaults to uzdoom, and when no soundfont carries that name the first SF2 found is used." + - name: "uzdoom.sf2" + category: game_data + mode: libretro + path: "soundfonts/uzdoom.sf2" + required: false + source_ref: + libretro: "src/common/audio/music/i_soundfont.cpp:435-439, src/gameconfigfile.cpp:226-233, src/common/platform/libretro/retro_core.cpp:59" + note: "Read below the system directory, the core's $PROGDIR. Built from soundfont/ in the tree." + - name: "GENMIDI.GS.wopl" category: game_data + mode: standalone bundled: true path: "fm_banks/GENMIDI.GS.wopl" required: false @@ -126,8 +205,18 @@ files: source_ref: "src/CMakeLists.txt:1453-1455, src/gameconfigfile.cpp:223-230, src/common/audio/music/i_soundfont.cpp:349-354" note: "OPL3 bank copied next to the executable. fm_banks is one of the scanned soundfont directories." + - name: "GENMIDI.GS.wopl" + category: game_data + mode: libretro + path: "fm_banks/GENMIDI.GS.wopl" + required: false + source_ref: + libretro: "src/gameconfigfile.cpp:226-233, src/common/platform/libretro/retro_core.cpp:59" + note: "fm_banks below the system directory is one of the scanned soundfont directories." + - name: "gs-by-papiezak-and-sneakernets.wopn" category: game_data + mode: standalone bundled: true path: "fm_banks/gs-by-papiezak-and-sneakernets.wopn" required: false @@ -144,6 +233,15 @@ files: # ---- Doom ---- + - name: "gs-by-papiezak-and-sneakernets.wopn" + category: game_data + mode: libretro + path: "fm_banks/gs-by-papiezak-and-sneakernets.wopn" + required: false + source_ref: + libretro: "src/gameconfigfile.cpp:226-233, src/common/platform/libretro/retro_core.cpp:59" + note: "fm_banks below the system directory is one of the scanned soundfont directories." + - name: "doom.wad" category: game_data system: doom From 5ecf318c4ae80f7d87034ac91e04bd74a3e67602 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:36:34 +0100 Subject: [PATCH 4/9] feat: document the vita3k libretro build --- emulators/vita3k.yml | 85 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 11 deletions(-) diff --git a/emulators/vita3k.yml b/emulators/vita3k.yml index 19be9d94f..747bb064e 100644 --- a/emulators/vita3k.yml +++ b/emulators/vita3k.yml @@ -1,22 +1,33 @@ emulator: Vita3K -type: standalone -source: "https://github.com/Vita3K/Vita3K" +type: standalone + libretro +source: + standalone: "https://github.com/Vita3K/Vita3K" + libretro: "https://git.libretro.com/libretro/vita3k-libretro" upstream: "https://github.com/Vita3K/Vita3K" -profiled_date: "2026-10-23" -source_commit: "6ec8e6ce31f3d6099b14eb9dd0320c09ef6386b6" -core_version: "v0.2.1" +profiled_date: "2026-11-09" +source_commit: + standalone: "6ec8e6ce31f3d6099b14eb9dd0320c09ef6386b6" + libretro: "87666afd9e84e1a59ec07d495bab4dc114f0798a" +core_version: + standalone: "v0.2.1" + libretro: "v0.2.1" version_basis: - kind: file - path: "vita3k/CMakeLists.txt" - pattern: 'set\(VITA3K_APP_VER_HI (\d+)\)\nset\(VITA3K_APP_VER_MID (\d+)\)\nset\(VITA3K_APP_VER_LO (\d+)\)\nset\(VITA3K_APP_VERSION "v' - format: "v{1}.{2}.{3}" + standalone: + kind: file + path: "vita3k/CMakeLists.txt" + pattern: 'set\(VITA3K_APP_VER_HI (\d+)\)\nset\(VITA3K_APP_VER_MID (\d+)\)\nset\(VITA3K_APP_VER_LO (\d+)\)\nset\(VITA3K_APP_VERSION "v' + format: "v{1}.{2}.{3}" + libretro: + kind: file + path: "vita3k/CMakeLists.txt" + pattern: 'set\(VITA3K_APP_VER_HI (\d+)\)\nset\(VITA3K_APP_VER_MID (\d+)\)\nset\(VITA3K_APP_VER_LO (\d+)\)\nset\(VITA3K_APP_VERSION "v' + format: "v{1}.{2}.{3}" display_name: "Vita3K (PS Vita)" cores: - vita3k - "vita3k-sa" systems: [sony-playstation-vita] -# Standalone emulator, no libretro core exists. # Firmware PUP files are one-time installations: install_pup() decrypts and # extracts partition images (os0, vs0, sa0, pd0) into the emulator data directory. # The PUP file itself is deleted after extraction. @@ -29,6 +40,7 @@ systems: [sony-playstation-vita] files: - name: PSVUPDAT.PUP + mode: standalone path: "psvita/PSVUPDAT.PUP" required: true hle_fallback: true @@ -41,6 +53,7 @@ files: source_ref: "vita3k/packages/src/pup.cpp:260-314, vita3k/app/src/app.cpp:176, vita3k/module/src/load_module.cpp:142-161, 187" - name: PSP2UPDAT.PUP + mode: standalone path: "psvita/PSP2UPDAT.PUP" required: false hle_fallback: true @@ -50,8 +63,47 @@ files: font directory when the partition holds content. source_ref: "vita3k/packages/src/pup.cpp:296-297, vita3k/app/src/app.cpp:177, vita3k/renderer/src/renderer.cpp:161-167" + # The libretro build installs each part from a .pup it finds itself. The + # code names no file: a .pup is told apart by its name alone, so the + # labels below carry the word the code looks for. + - name: "PSVUPDAT.PUP" + mode: libretro + path: "vita3k/PSVUPDAT.PUP" + required: true + note: > + System firmware, installed into vs0 at the first start that finds it + missing. Any .pup in system/vita3k whose name holds neither preinst + nor font is taken for it, and psp2updat.pup or psvupdat.pup at the + root of the system directory too. The core starts a game without it, + and games do not run. + source_ref: + libretro: "vita3k/libretro/libretro_installer.cpp:188-195, vita3k/libretro/libretro_installer.cpp:201-222, vita3k/libretro/libretro_installer.cpp:271-278, vita3k/libretro/libretro_installer.cpp:295-345, vita3k/libretro/libretro_vita3k.cpp:873-877, vita3k/libretro/libretro_vita3k.cpp:2793-2796" + + - name: "preinst.pup" + mode: libretro + path: "vita3k/preinst.pup" + required: false + note: > + Preinstalled package, installed into pd0. Any .pup in system/vita3k + with preinst in its name, whatever the case. Sony serves it as + PSP2UPDAT.PUP, which this build would take for the system firmware. + source_ref: + libretro: "vita3k/libretro/libretro_installer.cpp:188-195, vita3k/libretro/libretro_installer.cpp:271-278, vita3k/libretro/libretro_installer.cpp:318-345" + + - name: "font.pup" + mode: libretro + path: "vita3k/font.pup" + required: false + note: > + Font package, installed into sa0. Any .pup in system/vita3k with font + in its name, whatever the case. Sony serves it as PSP2UPDAT.PUP, which + this build would take for the system firmware. + source_ref: + libretro: "vita3k/libretro/libretro_installer.cpp:188-195, vita3k/libretro/libretro_installer.cpp:271-278, vita3k/libretro/libretro_installer.cpp:318-345" + notes: | - Standalone PS Vita emulator. No libretro core. + Standalone PS Vita emulator, with a libretro build kept on the libretro + branch of libretro's copy of the project, which merges upstream master. Firmware installed via File > Install Firmware or CLI --firmware flag. PUP files validated by SCEUF magic header only (vita3k/packages/src/pup.cpp:119), no hash check. After install, four partitions are extracted: @@ -64,3 +116,14 @@ notes: | libsceavplayer, libSceJson, and more (vita3k/module/src/load_module.cpp:142-162). A third optional preinst firmware PUP (pd0 partition: system BGM, resources) is available from Sony but not commonly required for game compatibility. + + The libretro build reads the three firmware packages from + system/vita3k and installs each part still missing into its storage at + load, the system firmware detected by its modules in + vs0/sys/external. A .pup loaded as content is installed the same way. + data/, the built-in shaders and the dialog icons are compiled into the + core and written into system/vita3k when the copy there is not this + build's (vita3k/libretro/embed_system_files.cmake:1-9). + ref: vita3k/libretro/libretro_installer.cpp:60-67, + vita3k/libretro/libretro_installer.cpp:159-177, + vita3k/libretro/libretro_vita3k.cpp:2414-2420 From daae431dd3d6f0f390236ef11ef22e14331c1d07 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:38:43 +0100 Subject: [PATCH 5/9] feat: document the jgenesis libretro build --- emulators/jgenesis.yml | 95 ++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 21 deletions(-) diff --git a/emulators/jgenesis.yml b/emulators/jgenesis.yml index 20fe6fdad..89e6fe29a 100644 --- a/emulators/jgenesis.yml +++ b/emulators/jgenesis.yml @@ -1,15 +1,26 @@ emulator: jgenesis -type: standalone +type: standalone + libretro core_classification: other -source: "https://github.com/jsgroth/jgenesis" +source: + standalone: "https://github.com/jsgroth/jgenesis" + libretro: "https://github.com/RobLoach/libretro-jgenesis" upstream: "https://github.com/jsgroth/jgenesis" -profiled_date: "2026-08-08" -source_commit: "0a00c47ba7a16bd6e77ef7e0b6c8fab2fc603cba" -core_version: "0.14.1" +profiled_date: "2026-11-09" +source_commit: + standalone: "0a00c47ba7a16bd6e77ef7e0b6c8fab2fc603cba" + libretro: "c92ff9269594b44e2f9ecfca5ff943e5bea49fb7" +core_version: + standalone: "0.14.1" + libretro: "0.14.1" version_basis: - kind: file - path: "Cargo.toml" - pattern: 'version\s+=\s+"([^"]+)' + standalone: + kind: file + path: "Cargo.toml" + pattern: 'version\s+=\s+"([^"]+)' + libretro: + kind: file + path: "Cargo.toml" + pattern: 'version\s+=\s+"([^"]+)' display_name: "Multi-System (jgenesis)" cores: - jgenesis @@ -27,7 +38,6 @@ systems: - nintendo-gba - nec-pc-engine - nec-pc-engine-cd -mode: standalone notes: | Multi-system emulator written in Rust by James Groth. One binary covers @@ -81,6 +91,20 @@ notes: | tested for existence only, to keep the settings beside the executable (frontend/jgenesis-native-config/src/paths.rs:57-64). + The libretro build is a separate frontend, libretro-jgenesis, that + builds the jgenesis backend crates at the same revision 0a00c47, the + rev its Cargo.toml pins for each of them. It opens fixed names in the + system directory, or beside the content when the frontend gives none: + bios_CD_U.bin, bios_CD_E.bin or bios_CD_J.bin by region, gba_bios.bin, + syscard3.pce and the seven SNES coprocessor ROMs. The Sega CD region is + the core option, else the disc header, else Americas. A missing BIOS + fails the load, except for a Mode 1 cartridge loaded alone, which + runs without the Sega CD. It never passes a Master System, Game Gear or Game Boy boot + ROM to the backend, and reads no palette file. + ref: src/load.rs:30-34, src/load.rs:48-56, src/load.rs:140-144, + src/load.rs:329-336, src/load.rs:386-400, src/load.rs:413, + src/load.rs:445 + files: # ------------------------------------------------------- # Sega CD @@ -92,7 +116,9 @@ files: required: true size: 131072 validation: [size] - source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:43-53 (read), frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (bios_path_for_region), backend/segacd-core/src/api.rs:77-79 (BIOS_LEN check)" + source_ref: + standalone: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:43-53 (read), frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (bios_path_for_region), backend/segacd-core/src/api.rs:77-79 (BIOS_LEN check)" + libretro: "src/load.rs:30, src/load.rs:48-56, src/load.rs:329-349" note: "Selected when the disc region is Americas, and for every region when per_region_bios is off." - name: "bios_CD_E.bin" @@ -102,7 +128,9 @@ files: required: true size: 131072 validation: [size] - source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (eu_bios_path), backend/segacd-core/src/api.rs:77-79" + source_ref: + standalone: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (eu_bios_path), backend/segacd-core/src/api.rs:77-79" + libretro: "src/load.rs:31, src/load.rs:48-56, src/load.rs:329-349" note: "Selected when the header area at 0x1F0 holds E and not U or J, as Australian discs do (backend/genesis-components/src/cartridge.rs:362-377, backend/segacd-core/src/api.rs:339-369)." - name: "bios_CD_J.bin" @@ -112,7 +140,9 @@ files: required: true size: 131072 validation: [size] - source_ref: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (jp_bios_path), backend/segacd-core/src/api.rs:77-79" + source_ref: + standalone: "frontend/jgenesis-native-driver/src/mainloop/genesis.rs:234-240 (jp_bios_path), backend/segacd-core/src/api.rs:77-79" + libretro: "src/load.rs:32, src/load.rs:48-56, src/load.rs:329-349" # ------------------------------------------------------- # Game Boy Advance @@ -123,7 +153,9 @@ files: required: true size: 16384 validation: [size] - source_ref: "frontend/jgenesis-native-driver/src/mainloop/gba.rs:32-36 (GbaNoBios), backend/gba-core/src/memory.rs:10, 102-107 (BIOS_ROM_LEN check)" + source_ref: + standalone: "frontend/jgenesis-native-driver/src/mainloop/gba.rs:32-36 (GbaNoBios), backend/gba-core/src/memory.rs:10, 102-107 (BIOS_ROM_LEN check)" + libretro: "src/load.rs:33, src/load.rs:48-56, src/load.rs:450" note: "Every GBA load fails without it. skip_bios_animation only skips the intro, the BIOS is still mapped and read for SWI calls." # ------------------------------------------------------- @@ -135,7 +167,9 @@ files: description: "NEC uPD77C25 firmware for DSP-1" required: true size: 8192 - source_ref: "backend/snes-core/src/memory/cartridge.rs:336-353 (MissingDsp1Rom), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38,382-390" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:336-353 (MissingDsp1Rom), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38,382-390" + libretro: "src/load.rs:477-491" note: "0x1800 program plus 0x800 data. Also used by DSP-1B titles, which have no separate slot. Layout is sliced at a fixed offset, size is not checked." - name: "dsp2.rom" @@ -144,7 +178,9 @@ files: description: "NEC uPD77C25 firmware for DSP-2" required: true size: 8192 - source_ref: "backend/snes-core/src/memory/cartridge.rs:340-342 (MissingDsp2Rom), :929 (Dungeon Master CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:340-342 (MissingDsp2Rom), :929 (Dungeon Master CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + libretro: "src/load.rs:477-491" - name: "dsp3.rom" aliases: ["SNES_dsp3.rom"] @@ -152,7 +188,9 @@ files: description: "NEC uPD77C25 firmware for DSP-3" required: true size: 8192 - source_ref: "backend/snes-core/src/memory/cartridge.rs:343-345 (MissingDsp3Rom), :931 (SD Gundam GX CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:343-345 (MissingDsp3Rom), :931 (SD Gundam GX CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + libretro: "src/load.rs:477-491" - name: "dsp4.rom" aliases: ["SNES_dsp4.rom"] @@ -160,7 +198,9 @@ files: description: "NEC uPD77C25 firmware for DSP-4" required: true size: 8192 - source_ref: "backend/snes-core/src/memory/cartridge.rs:346-348 (MissingDsp4Rom), :933 (Top Gear 3000 CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:346-348 (MissingDsp4Rom), :933 (Top Gear 3000 CRC32 match), backend/snes-coprocessors/src/upd77c25.rs:382-390" + libretro: "src/load.rs:477-491" - name: "st010.rom" aliases: ["SNES_st010.rom"] @@ -168,7 +208,9 @@ files: description: "NEC uPD96050 firmware for ST010" required: true size: 53248 - source_ref: "backend/snes-core/src/memory/cartridge.rs:294-305 (MissingSt010Rom), :938-943 (variant detection), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:294-305 (MissingSt010Rom), :938-943 (variant detection), backend/snes-coprocessors/src/upd77c25.rs:28-31,35-38" + libretro: "src/load.rs:477-491" note: "0xC000 program plus 0x1000 data. Used by F1 ROC II." - name: "st011.rom" @@ -177,7 +219,9 @@ files: description: "NEC uPD96050 firmware for ST011" required: true size: 53248 - source_ref: "backend/snes-core/src/memory/cartridge.rs:298-300 (MissingSt011Rom), :938-943 (Hayazashi Nidan Morita Shougi CRC32 match)" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:298-300 (MissingSt011Rom), :938-943 (Hayazashi Nidan Morita Shougi CRC32 match)" + libretro: "src/load.rs:477-491" - name: "st018.rom" aliases: ["SNES_st018.rom"] @@ -186,7 +230,9 @@ files: required: true min_size: 163840 validation: [size] - source_ref: "backend/snes-core/src/memory/cartridge.rs:310-320 (MissingSt018Rom), backend/snes-coprocessors/src/st018.rs:18-22,346-352 (TOTAL_ROM_LEN check)" + source_ref: + standalone: "backend/snes-core/src/memory/cartridge.rs:310-320 (MissingSt018Rom), backend/snes-coprocessors/src/st018.rs:18-22,346-352 (TOTAL_ROM_LEN check)" + libretro: "src/load.rs:477-491" note: "0x20000 program plus 0x8000 data. Used by Hayazashi Nidan Morita Shougi 2. Files larger than the expected length are accepted, shorter ones are rejected." # ------------------------------------------------------- @@ -196,13 +242,16 @@ files: system: nec-pc-engine-cd description: "Super CD-ROM² System Card 3.0" required: true - source_ref: "frontend/jgenesis-native-driver/src/mainloop/pce.rs:29-50 (PceCdNoBios), frontend/jgenesis-native-config/src/pce.rs:15, 44, backend/pce-core/src/cartridge.rs:84-101, config/pce-config/src/lib.rs:60-65" + source_ref: + standalone: "frontend/jgenesis-native-driver/src/mainloop/pce.rs:29-50 (PceCdNoBios), frontend/jgenesis-native-config/src/pce.rs:15, 44, backend/pce-core/src/cartridge.rs:84-101, config/pce-config/src/lib.rs:60-65" + libretro: "src/load.rs:34, src/load.rs:48-56, src/load.rs:317" note: "Every disc fails to load without it. One slot accepts any System Card dump, no size or content check, but the default Arcade Card and the Super System Card need a v3.0 ROM. A file over 512 KiB is mapped as a plain HuCard." # ------------------------------------------------------- # Master System / Game Gear # ------------------------------------------------------- - name: "bios.sms" + mode: standalone system: sega-mastersystem description: "Master System BIOS" required: false @@ -210,6 +259,7 @@ files: note: "Read only when sms_boot_from_bios is enabled or the emulator runs without a cartridge, both off by default. One slot accepts any regional dump, no size or content check." - name: "bios.gg" + mode: standalone system: sega-gamegear description: "Game Gear BIOS" required: false @@ -220,6 +270,7 @@ files: # Game Boy / Game Boy Color # ------------------------------------------------------- - name: "dmg_boot.bin" + mode: standalone system: nintendo-gb description: "Game Boy boot ROM" required: false @@ -229,6 +280,7 @@ files: note: "Loaded only when dmg_boot_rom is enabled, off by default. Without it the CPU starts post-boot." - name: "cgb_boot.bin" + mode: standalone system: nintendo-gbc description: "Game Boy Color boot ROM" required: false @@ -242,6 +294,7 @@ files: # NES # ------------------------------------------------------- - name: "nes.pal" + mode: standalone aliases: ["nespalette.pal"] system: nintendo-nes description: "External NES color palette" From 52421772252659a9b3f0b57718bc0f25497d97d9 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:42:53 +0100 Subject: [PATCH 6/9] feat: follow the xemu core on git.libretro.com --- emulators/xemu.yml | 195 +++++++++++++++++++++++++++++++++------------ 1 file changed, 146 insertions(+), 49 deletions(-) diff --git a/emulators/xemu.yml b/emulators/xemu.yml index f242bd2f3..96a4e006c 100644 --- a/emulators/xemu.yml +++ b/emulators/xemu.yml @@ -3,16 +3,16 @@ type: standalone + libretro core_classification: community_fork source: standalone: "https://github.com/xemu-project/xemu" - libretro: "https://github.com/LibretroAdmin/xemu-libretro" + libretro: "https://git.libretro.com/libretro/xemu-libretro" upstream: "https://github.com/xemu-project/xemu" logo: "https://raw.githubusercontent.com/xemu-project/xemu/master/data/xemu_64x64.png" -profiled_date: "2026-09-17" +profiled_date: "2026-11-09" source_commit: standalone: "25e1ee2fd59a451f2ab57e825b4f8a5414220c8b" - libretro: "d9804db79f87f6a6a5548b14ca4a8d5164390338" + libretro: "50fc538657f44704e0d1d0906bdc9ef6e435dffe" core_version: standalone: "v0.8.139-2-g25e1ee2" - libretro: "libretro-experimental" + libretro: "0.8.136-53" version_basis: standalone: kind: tag @@ -21,14 +21,15 @@ version_basis: distance: 2 libretro: kind: file - path: "ui/xemu-libretro.c" - pattern: 'info->library_version\s*=\s*"([^"]+)"' -display_name: "Microsoft - Xbox (xemu)" + path: "upstream.version" + pattern: '^(\S+)' +display_name: "Microsoft - Xbox / Sega Chihiro (xemu)" cores: - xemu - "xemu-sa" systems: - microsoft-xbox + - sega-chihiro data_root: windows: @@ -45,16 +46,14 @@ data_root: note: "xemu.toml beside the executable makes its folder the root" notes: | - Full-system Xbox emulator built on QEMU. One tree builds the standalone - application and, with the libretro build option, a core in which a shim - replaces ui/xemu.c: the QEMU machine runs on its own thread, retro_run pumps - the RetroPads into the Duke controllers and blits the NV2A surface into the - frontend's framebuffer through an OpenGL 4.0 core context, and content is a - .iso or .xiso image that QEMU opens from its full path. Save states are not - implemented, and game saves live inside the hard disk image. - ref: meson_options.txt:52-53, ui/xemu-libretro.c:1-27, - ui/xemu-libretro.c:609-617, ui/xemu-libretro.c:680-697, - ui/xemu-libretro.c:874-876 + Full-system Xbox emulator built on QEMU. The libretro core is built from + libretro's xemu-libretro tree on its libretro branch, which merges + Tovarichtch's xemu fork (xemu master with Chihiro support) and keeps the + core alone: the standalone UI and packaging are removed. upstream.version + names the upstream version merged. Content is an Xbox disc image (.iso, + .xiso) or a Chihiro netboot image (.bin), opened from its full path. An + Xbox disc boots an Xbox, any other image a Chihiro. + ref: ui/libretro.c:3117-3123, ui/libretro.c:3312-3320 Four files feed the machine through the sys.files block of the configuration: the MCPX boot ROM, the flash ROM, the EEPROM and the hard disk @@ -69,14 +68,27 @@ notes: | ui/xemu-settings.cc:70-133, ui/xemu.c:1373-1393, ui/xui/main-menu.cc:1553-1575 - The core reads the same four files from the frontend system directory, each - under a name picked by a core option that offers a default and a few - alternatives, and keeps its configuration as xemu-libretro.toml in that - directory. The boot ROM, the flash ROM and the disk image are opened before - the machine starts, and a missing one fails the load with a message naming - the file. The EEPROM is left to the machine, which generates one. - ref: ui/xemu-libretro.c:112-127, ui/xemu-libretro.c:139-145, - ui/xemu-libretro.c:178-236 + The core has no option for these paths. It looks for each file in + system/xemu/, then at the root of the system directory, and keeps the + first it opens; when none is there the path stays in system/xemu/. The + flash ROM is tried as Complex_4627v1.03.bin, then Complex_4627.bin. A + missing boot ROM or flash ROM fails the load. A missing hard disk image + is written there from the formatted image the core carries + (data/xbox_hdd.qcow2), and the EEPROM is left to the machine, which + generates one. Shader caches and patches live in system/xemu/ too. + ref: ui/libretro.c:3044-3049, ui/libretro.c:3370-3449, + ui/libretro.c:2088-2105, ui/libretro.c:3361-3367, + ui/libretro.c:2485 + + A Chihiro boots only its own BIOS, system/xemu/Chihiro/chihiro_xbox_bios.bin, + which has to be MAME's 512 KiB image (sha1 b700b004). The media board + flash and the three EEPROMs are read beside it by their MAME names, and a + missing one, or a BIOS that is not that image, leaves the machine paused + with a message naming it. The network firmware ver1305.bin is read from + the same folder when it is there, and only a linked cabinet needs it. + ref: ui/libretro.c:1782-1795, hw/xbox/chihiro/chihiro.c:2280-2292, + hw/xbox/chihiro/chihiro.c:2294-2334, hw/xbox/chihiro/chihiro.c:2376-2402, + hw/xbox/chihiro/chihiro.c:365-380, hw/xbox/chihiro/chihiro.c:490-505 The standalone boots whatever it can. An unreadable flash file or a rejected EEPROM clears autostart and queues an error for the HUD, an @@ -87,7 +99,8 @@ notes: | files: - name: mcpx_1.0.bin - path: mcpx_1.0.bin + path: "xemu/mcpx_1.0.bin" + standalone_path: mcpx_1.0.bin required: true size: 512 validation: [size] @@ -98,16 +111,17 @@ files: of the flash image, which the machine maps as a writable overlay at the top of the address space. qemu_init drops the path with an error when the file cannot be opened or is not 512 bytes, and the machine then runs - the flash alone. The core option xemu_bootrom names the file, default - mcpx_1.0.bin, with mcpx.bin, MCPX_1.0.bin and boot_rom.bin offered as - alternatives. The core refuses to load when the chosen file is absent. + the flash alone. The core reads system/xemu/mcpx_1.0.bin, else + mcpx_1.0.bin at the root of the system directory, and refuses to load + when neither is there. source_ref: standalone: "system/vl.c:2983-3006, hw/xbox/xbox.c:143-171, hw/xbox/xbox.c:468-470" - libretro: "ui/xemu-libretro.c:113-114, ui/xemu-libretro.c:192-193, ui/xemu-libretro.c:210-236" + libretro: "ui/libretro.c:3370-3415, ui/libretro.c:3418-3427" - name: Complex_4627.bin - path: Complex_4627.bin - aliases: [Complex.bin, cerbios.bin] + path: "xemu/Complex_4627.bin" + standalone_path: Complex_4627.bin + aliases: [Complex_4627v1.03.bin] required: true size: [262144, 524288, 1048576] validation: [size] @@ -118,17 +132,17 @@ files: Passed as -bios and opened through qemu_find_file. An image whose size is not a multiple of 65536 bytes counts as a failed load, like a missing file: the 256 KB region is filled with 0xFF and the machine starts - anyway. An unreadable path clears autostart in the standalone. The core - option xemu_flashrom names the file, default Complex_4627.bin, with - Complex_4627_v1.03.bin, complex_4627.bin, cerbios.bin, Cerbios.bin, - bios.bin, xbox_bios.bin and Complex.bin offered as alternatives. The - core refuses to load when the chosen file is absent. + anyway. An unreadable path clears autostart in the standalone, which + takes any file the settings name. The core tries + Complex_4627v1.03.bin, then Complex_4627.bin, in system/xemu/ and + then at the root of the system directory, and refuses to load when + none is there. source_ref: standalone: "system/vl.c:3041-3053, hw/xbox/xbox.c:63-123" - libretro: "ui/xemu-libretro.c:115-118, ui/xemu-libretro.c:195-196, ui/xemu-libretro.c:210-236" + libretro: "ui/libretro.c:3370-3415, ui/libretro.c:3429-3436" - name: xbox_eeprom.bin - path: xbox_eeprom.bin + path: "xemu/xbox_eeprom.bin" standalone_path: eeprom.bin aliases: [eeprom.bin] required: false @@ -144,14 +158,15 @@ files: disk key and online key, the North American region and the NTSC-M video standard. A file of any size other than 256 bytes is rejected and autostart is cleared. The standalone defaults to eeprom.bin next to - xemu.toml. The core option xemu_eeprom names the file, default - xbox_eeprom.bin, with eeprom.bin and EEPROM.bin offered as alternatives, - and does not check for it before the machine starts. + xemu.toml. The core reads system/xemu/xbox_eeprom.bin, else + xbox_eeprom.bin at the root of the system directory, and leaves the + machine to generate system/xemu/xbox_eeprom.bin when neither is there. source_ref: standalone: "system/vl.c:2909-2949, system/vl.c:3030-3039, ui/xemu-settings.cc:135-146, hw/xbox/smbus_storage.c:56-87, hw/xbox/smbus_storage.c:90-128, hw/xbox/smbus_storage.c:155-160, hw/xbox/eeprom_generation.c:93-140" - libretro: "ui/xemu-libretro.c:119-120, ui/xemu-libretro.c:198-199, ui/xemu-libretro.c:204-209" + libretro: "ui/libretro.c:3370-3415, ui/libretro.c:1778-1780" - name: xbox_hdd.qcow2 + mode: standalone path: xbox_hdd.qcow2 required: true installed_on: [batocera, emudeck, recalbox, retrodeck, rocknix] @@ -162,19 +177,101 @@ files: and the file opens. An unreadable file only queues an error and an empty path attaches no drive. Snapshots are stored inside the image. The project publishes a formatted image carrying its own unsigned dashboard - and empty TDATA and UDATA folders. The core option xemu_hdd names the - file, default xbox_hdd.qcow2, with xbox_hdd_8gb.qcow2, hdd.qcow2 and - xbox_hdd.img offered as alternatives. The core refuses to load when the - chosen file is absent. + and empty TDATA and UDATA folders. The xemu release does not carry the image. Batocera and Recalbox package the 1.0 xemu-hdd-image and copy it into the saves folder at launch when none is there, RetroDECK copies its packaged copy into the BIOS folder during setup, and EmuDeck downloads it while setting xemu up. ROCKNIX packages the same image and unzips it at launch into bios/xemu/hdd/, the path its xemu.toml gives hdd_path. + source_ref: "system/vl.c:3060-3074, ui/xemu-snapshots.c:156" + + - name: xbox_hdd.qcow2 + mode: libretro + path: "xemu/xbox_hdd.qcow2" + required: false + has_builtin: true + description: "Xbox hard disk image, 8 GB with the retail partition layout" + note: >- + Read from system/xemu/, else from the root of the system directory. + When neither holds one, the core writes the formatted xemu-dashboard + image it carries to system/xemu/xbox_hdd.qcow2. Game saves live in + the image. source_ref: - standalone: "system/vl.c:3060-3074, ui/xemu-snapshots.c:156" - libretro: "ui/xemu-libretro.c:121-123, ui/xemu-libretro.c:200-202, ui/xemu-libretro.c:210-236" + libretro: "ui/libretro.c:3370-3415, ui/libretro.c:3438-3448, ui/libretro.c:2088-2105" + + # Sega Chihiro, libretro build: system/xemu/Chihiro/, MAME's names. + - name: "chihiro_xbox_bios.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/chihiro_xbox_bios.bin" + required: true + size: 524288 + sha1: "b700b0041af8f84835e45d1d1250247bf7077188" + validation: [size, sha1] + description: "Chihiro BIOS" + note: "The only flash image a Chihiro boots. Any other file, or none, leaves the machine paused with a message." + source_ref: + libretro: "ui/libretro.c:1785-1789, hw/xbox/chihiro/chihiro.c:2280-2292, system/vl.c:3325-3398" + + - name: "fpr21042_m29w160et.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/fpr21042_m29w160et.bin" + aliases: ["fpr-23887_29lv160te.ic4", "fpr-23887.bin"] + required: true + max_size: 4194304 + validation: [size] + description: "Chihiro media board flash" + note: "Read beside the BIOS, then in its parent folder, under these three names in turn. Up to 4 MiB is accepted. Without it the machine stays paused." + source_ref: + libretro: "hw/xbox/chihiro/chihiro.c:2259-2278, hw/xbox/chihiro/chihiro.c:2294-2334, system/vl.c:3325-3398" + + - name: "ic10_g24lc64.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/ic10_g24lc64.bin" + required: true + size: 8192 + validation: [size] + description: "Chihiro QC EEPROM" + note: "Read beside the BIOS and refused at any other size. Without it the machine stays paused." + source_ref: + libretro: "hw/xbox/chihiro/chihiro.c:2376-2402, system/vl.c:3325-3398" + + - name: "ic11_24lc024.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/ic11_24lc024.bin" + required: true + size: 128 + validation: [size] + description: "Chihiro baseboard EEPROM" + note: "Read beside the BIOS and refused at any other size. Without it the machine stays paused." + source_ref: + libretro: "hw/xbox/chihiro/chihiro.c:2376-2402, system/vl.c:3325-3398" + + - name: "pc20_g24lc64.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/pc20_g24lc64.bin" + required: true + size: 8192 + validation: [size] + description: "Chihiro SC EEPROM" + note: "Read beside the BIOS and refused at any other size. Without it the machine stays paused." + source_ref: + libretro: "hw/xbox/chihiro/chihiro.c:2376-2402, system/vl.c:3325-3398" + + - name: "ver1305.bin" + mode: libretro + system: sega-chihiro + path: "xemu/Chihiro/ver1305.bin" + required: false + description: "Chihiro network board firmware 13.05" + note: "Read when present. The media board reports its version from it, and a linked cabinet runs it on the network board, which cannot start without it." + source_ref: + libretro: "ui/libretro.c:1790-1794, hw/xbox/chihiro/chihiro.c:365-380, hw/xbox/chihiro/chihiro.c:490-505" - name: wpcap.dll required: false From 9ccf2485c1373a53c9847a16974a72357c16fbab Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:48:58 +0100 Subject: [PATCH 7/9] feat: follow emuscv on git.libretro.com --- emulators/emuscv.yml | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/emulators/emuscv.yml b/emulators/emuscv.yml index 589361b3b..d1f335701 100644 --- a/emulators/emuscv.yml +++ b/emulators/emuscv.yml @@ -1,17 +1,17 @@ emulator: EmuSCV type: libretro core_classification: community_fork -source: "https://github.com/wzcwzc/emuscv" +source: "https://git.libretro.com/libretro/libretro-emuscv" upstream: "http://takeda-toshiya.my.coocan.jp/" -profiled_date: "2026-03-23" -source_commit: "6d6e4594d79862dd5c2ff7f725c109e4266f0b03" -core_version: "0.12.20220726135800" +profiled_date: "2026-11-09" +source_commit: "33900ce24f45c429b533fdae7844e04d64a9a1b9" +core_version: "0.15.20260921084155" version_basis: kind: file - path: "Makefile.libretro" - pattern: '^EMUSCV_VERSION_MAJOR := (\d+)\s*\nEMUSCV_VERSION_MINOR := (\d+)\s*\n(?:#.*\n)*EMUSCV_VERSION_DATETIME := \u0027?(\d+)' + path: "src/emuscv.h" + pattern: 'EMUSCV_VERSION_MAJOR\s+"(\d+)"\n#define EMUSCV_VERSION_MINOR\s+"(\d+)"\n#define EMUSCV_VERSION_DATETIME\s+"(\d+)"' format: "{1}.{2}.{3}" -display_name: "EPOCH/YENO Super Cassette Vision" +display_name: "EPOCH/YENO Super Cassette Vision (EmuSCV)" cores: - emuscv systems: @@ -20,9 +20,11 @@ systems: notes: | Libretro port of eSCV by Takeda Toshiya (Common Source Code Project), ported to libretro by MARCONATO Maxime. Upstream source mirrored at - https://github.com/tautologico/common-src-project (src/vm/scv/). + https://github.com/tautologico/common-src-project (src/vm/scv/). The + buildbot builds libretro's copy on git.libretro.com, which carries the + history of the former GitHub repository and continues it. - BIOS loading in src/vm/scv/memory.cpp:initialize() (lines 74-243). + BIOS loading in src/vm/scv/memory.cpp:initialize() (lines 84-250). Tries filenames in order: upd7801g.s01, upd7801g.bin, upd7801g.bios, bios.rom, bios.bin. First successful open wins. Upstream eSCV uses only BIOS.ROM (uppercase), and the libretro port renamed and added @@ -31,13 +33,12 @@ notes: | The BIOS is read as 0x1000 (4096) bytes into the bios[] array, mapped read-only at CPU address 0x0000-0x0FFF (UPD7801 internal ROM area). - When CHECKBIOS core option is YES, the core computes MD5 of the loaded - data and compares against 635a978fd40db9a18ee44eff449fc126. If the - hash does not match, the BIOS is rejected (filled with 0xFF, - bios_present=false). When CHECKBIOS is AUTO (default) or NO, any file - content is accepted. With AUTO the log says "automatic (yes)", and the - MD5 comparison runs only when the option equals YES_VAL - (src/vm/scv/memory.cpp:80), so AUTO accepts any content. + upd7801g.s01 is checked against MD5 635a978fd40db9a18ee44eff449fc126 + unless the CHECKBIOS core option is NO, so with the default AUTO a + file of other content under that name is rejected (filled with 0xFF, + bios_loaded=false) and the next name is tried. The four other names are + checked only when CHECKBIOS is YES, and AUTO accepts any content under + them (src/vm/scv/memory.cpp:84-112, 115-148, src/emuscv.cpp:3459-3472). The font/character data is embedded within the BIOS at offset 0x200 (memory.h get_font() returns bios + 0x200). No separate font ROM file. @@ -55,8 +56,8 @@ files: size: 4096 md5: 635a978fd40db9a18ee44eff449fc126 validation: [md5] - note: "UPD7801G internal ROM (BIOS). Mapped at 0x0000-0x0FFF. Contains character font at offset 0x200." - source_ref: "src/vm/scv/memory.cpp:74-243" + note: "UPD7801G internal ROM (BIOS). The MD5 is checked by default under this name only. Mapped at 0x0000-0x0FFF. Contains character font at offset 0x200." + source_ref: "src/vm/scv/memory.cpp:84-250" aliases: - "upd7801g.bin" - "upd7801g.bios" @@ -69,7 +70,7 @@ platform_details: upd7801g: target: "0x0000-0x0FFF (CPU internal ROM, 4 KB)" format: "raw binary" - source_ref: "src/vm/scv/memory.cpp:249-254" + source_ref: "src/vm/scv/memory.cpp:259-264" notes: | Memory map from memory.cpp:initialize(): 0x0000-0x0FFF BIOS ROM (read-only) From bc5a2c7309da9f3ee5ac891999df8cff22a683f4 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:57:02 +0100 Subject: [PATCH 8/9] feat: add the gearboy SGB cartridge ROMs --- emulators/gearboy.yml | 47 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/emulators/gearboy.yml b/emulators/gearboy.yml index e8b472e38..f623d78f5 100644 --- a/emulators/gearboy.yml +++ b/emulators/gearboy.yml @@ -3,19 +3,20 @@ type: libretro core_classification: official_port source: "https://github.com/drhelius/Gearboy" upstream: "https://github.com/drhelius/Gearboy" -profiled_date: "2026-03-23" -source_commit: "b0a5fcaf68009c288d6b8016164a21af452d81b5" -core_version: "3.8.19-10-gb0a5fca" +profiled_date: "2026-11-09" +source_commit: "c2beeea6e202a41f796c4026fa0caaee1b904662" +core_version: "3.8.20-11-gc2beeea" version_basis: kind: tag - tag: "3.8.19" - distance: 10 -display_name: "Nintendo - Game Boy / Color (Gearboy)" + tag: "3.8.20" + distance: 11 +display_name: "Nintendo - Game Boy / Color / Super Game Boy (Gearboy)" cores: - gearboy systems: - nintendo-gb - nintendo-gbc + - nintendo-sgb notes: | Gearboy is a Game Boy / Game Boy Color emulator by drhelius (Ignacio Sanchez). @@ -25,6 +26,14 @@ notes: | Bootrom loading is gated behind core options (disabled by default). Without bootroms, the core HLE-skips the boot animation. + Super Game Boy mode (core option gearboy_sgb, enabled by default, one + instance only) reads the SNES cartridge ROM of the Super Game Boy, + SGB1.sfc then SGB2.sfc in the system directory. Only its default border + and palettes are taken from it, and SGB games run without it on the + built-in defaults. The ROM is identified by CRC32 and size against four + known dumps, whichever of the two names it carries, and an unknown dump + is refused (src/SGB.cpp:38-44, 200-223, 1096-1105). + files: - name: dmg_boot.bin description: Game Boy DMG bootrom @@ -32,7 +41,7 @@ files: required: false hle_fallback: true validation: [size] - source_ref: "platforms/libretro/libretro.cpp:1043, platforms/libretro/libretro.cpp:474, platforms/libretro/libretro.cpp:474" + source_ref: "platforms/libretro/libretro.cpp:1036-1045, platforms/libretro/libretro.cpp:474-479" - name: cgb_boot.bin description: Game Boy Color bootrom @@ -40,4 +49,26 @@ files: required: false hle_fallback: true validation: [size] - source_ref: "platforms/libretro/libretro.cpp:1044, platforms/libretro/libretro.cpp:475, platforms/libretro/libretro.cpp:475" + source_ref: "platforms/libretro/libretro.cpp:1047-1056, platforms/libretro/libretro.cpp:475-480" + + - name: "SGB1.sfc" + system: nintendo-sgb + description: "Super Game Boy SNES cartridge ROM" + size: 262144 + crc32: ["2e35edbb", "27a03c98", "8a4a174f"] + validation: [size, crc32] + required: false + hle_fallback: true + note: "Tried first. Any of the four known dumps loads under this name, the 512 KiB SGB2 one included. Read only with Super Game Boy mode on and a single instance." + source_ref: "platforms/libretro/libretro.cpp:447-467, platforms/libretro/libretro.cpp:879-885, src/SGB.cpp:38-44, src/SGB.cpp:200-223" + + - name: "SGB2.sfc" + system: nintendo-sgb + description: "Super Game Boy 2 SNES cartridge ROM" + size: 524288 + crc32: "cb176e45" + validation: [size, crc32] + required: false + hle_fallback: true + note: "Tried when SGB1.sfc is absent or refused. Any of the four known dumps loads under this name." + source_ref: "platforms/libretro/libretro.cpp:447-467, src/SGB.cpp:38-44, src/SGB.cpp:200-223" From 9ad023eef6b2236142782c4c0d5b293ae4849fcb Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 07:57:02 +0100 Subject: [PATCH 9/9] chore: record thirty reviewed core-info files --- platforms/_core_info.json | 49 ++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/platforms/_core_info.json b/platforms/_core_info.json index 5bfe14310..5b3444539 100644 --- a/platforms/_core_info.json +++ b/platforms/_core_info.json @@ -11,19 +11,19 @@ "advanced_tests": "a13ebba9e3d4b1f70f882d824268152026ff184a", "amiarcadia": "73e48e85824950f30df26673219cd5ca4548496a", "amiberry": "e5d1f0f9a143594d893031caed9aa760ff34ce0a", - "anarch": "f06701967498ab0a5dfc0c7ca50c3aeea6c9e6e6", + "anarch": "b8fa81cda3b6e08423b27c2a919493a43dfd69e1", "applewin": "c999c4b73ff48409acecb0239214c74f3464bcd1", "ardens": "938877e6a867441fbab2edfd19acc3d85f4b0277", "arduous": "cb6f0917fa4454126fdb93714eadb6d6cfab1a9f", "armsx2": "c8a763b3d75e84997218323350a22cc79fe8e39a", "atari800": "07b87e91cf4577db7791188399f1cc1f320932f0", - "azahar": "1173e2e8a919d578cc589545cb3c0c71dc4e1188", + "azahar": "88fa072675ff483b8affca41569543abc7defce9", "b2": "140b31e2d829f094fbf81856f63acd8f3c97f9e8", "bbkemu": "ee36e46bfcff3ec6f66da3e35bc249d398d962ca", "beetle_saturn": "d0364ee2ba9f0ba1e676dcf397cc66aad5204f8d", "bennugd": "620191828ed5ac08426aa132a7e15dabfe78b702", "bk": "7025d150c3265eaaabf8c1863a7fe367402f2dc1", - "blastem": "0850a1ce3c92ed115ea42d7df89741c26e46907a", + "blastem": "51f458b542f618e71ef3c2282606f69adae7aee7", "bluemsx": "8ea8ac764e50f2618e4936dcf7d8dc43952488c1", "bnes": "fcd6e352d4949a876014c516d9afc86fd25ae92c", "boom3": "f7c3290aa476e2fa724b97974713bdfb9d9594d9", @@ -70,9 +70,10 @@ "duckstation": "7113d3c62a314cc6da7ef3bc12efec29f415ed6b", "easyrpg": "d057e86ecc3482bc41dd88e5af75a59dea3360c6", "ecwolf": "514cca6aa6df9f5552e9119d6173d3ff0d4e1a4a", + "eduke32": "12b0ac4a97c2279620f3ff5173753e82cd80bc35", "eka2l1": "b6a0192caf919ef988bef44653153eb4815b3852", "emucv": "1cf170a6eea802ed5f58d51482b06098f20ee7d6", - "emuscv": "37ca60ffca2affc6e2a264184cf16b64a5a9d1d1", + "emuscv": "0be7ab4a28cb8cd68c77622d71bc893aaa8eca5f", "emux_chip8": "76b0e06041b05ebbf723b101c04e0016729919cc", "emux_gb": "ea951760e5ade5fb20dc4ca56f12e36bfd0a65fd", "emux_nes": "043810ea5c9b3dcd4e82df1427c504331d3fc297", @@ -105,11 +106,12 @@ "galaksija": "f27a232f8ae2ac12bae8436ed8fd220b745e8264", "gam4980": "3d757498a3c9fa728c9df1ee18dd88faf73432fa", "gambatte": "fc1e4e3b8f0ae047fab73ab516c5a0276370303d", - "gearboy": "670b1b90974ab6487b792fbeeddf5736afa4318f", - "gearcoleco": "2126bdabe8d1d8bb7d6dbcf3d1956502777bbc49", - "geargrafx": "79fe02a2840a276d1c834e31910ec91b3d9aa8b0", - "gearlynx": "624951f9e137ad27af7eabbf02550bc615a78dd2", - "gearsystem": "90d34a245aa2b6ac69a23a9af7952043f5d34425", + "gametank": "7342fd10425dfd8f0c646228408cd45c0495c1a6", + "gearboy": "ccf4bde10740c71fb86b943b72326c47010c40c6", + "gearcoleco": "2d1bbb7a43b720b645263ce94479f5fbfeadccb9", + "geargrafx": "9027529ce6014924824872253b6e07cc133cf933", + "gearlynx": "4ed786f46c7ebda13bade51446653161013b24ca", + "gearsystem": "4c32f3e20dfb72456cb8f71dde1666c569ae7ac9", "genesis_plus_gx": "ae18384f5f4ba3e8417d430419d5fb4c1da02349", "genesis_plus_gx_wide": "7a0deff1895e84f7475928814cdcdc9795471405", "geolith": "e130b2796ea18dcce8cb8dcc6e35361d7c4c1682", @@ -120,14 +122,17 @@ "handy": "e9f0c36320a31642202201bce0031f8a73c5a49e", "hatari": "7641a27200948c97d046b7e0d559401894cc24ae", "hatari2014": "54fde5cfffa09ec45d7a27a9b37978b7742677c2", - "hatarib": "9b2901327080b1c81406ba053dc1887fece953f3", + "hatarib": "6b670077662ea2283853283b89761d1ba4acfa16", "hbmame": "54c043535e2635e936a8ac20912ab125394adf89", "higan_sfc": "9bdcf2d0e92f0e9509b0bd91872c84c3562b9040", "holani": "ec099eecd2d31c2c9355ca0f2b057c877d75e58a", + "hyperscanemu": "d137163bbd41e7fd81c1944979a795cf2a46b31a", + "hypseushw": "efdcb86be9467cdf3ef49dd9077ba6b6ad1d195b", "imageviewer": "5eeb8e208aed6bec71427f6d6ac6bc9c93bb3365", "irogb": "fd57733234d7219ff1758464406d5c67201b8c4e", "ishiiruka": "d8c8c6c016451cb7c0d340eb51f150bf6f0983b3", "jaxe": "5bb4cd5077edf0fce90a51116130894612460d2e", + "jgenesis": "86b9c9b8a7ff91962608a85bba560d7b91710e15", "jollycv": "598b90e899a7d7d46f555c77c89c3a888d8eafb9", "jumpnbump": "ed1a11061c6c53045f3b0d8c10128f719d5ea113", "kronos": "e9711a1019be483c0d994ad1f3109e5ab06d0f2d", @@ -135,12 +140,12 @@ "lutro": "7a5e1ba0d29c909b24f4da77296e0b794323fddd", "m2000": "5a93b6679ed203a68db5cd8478a2fdfd03c86bf0", "mame": "ae3a33aec0981c37c8caa63a7d8c86cbccbbc11c", - "mame2000": "326d7666692086df51e77f6ec89438872604ed18", + "mame2000": "962b4e8a6b6761158ab3fa0238fb3adb3caba4ab", "mame2003": "f3ed8c023d555151e4d2cfce389ffdd2e50dab6e", "mame2003_midway": "aa36dcb2e9295ff7d39a1c44fd641ab127c8d5d0", "mame2003_plus": "07d5ae3f3857d574a19a67a4feb5e382bd419f79", - "mame2009": "1b673833aca392291e9643b24cda35539e2f7273", - "mame2010": "8f6b8d900859ce2f7f01bff1be5c60946076b829", + "mame2009": "d616c022fda2568b7e57310449c55fc436349d3b", + "mame2010": "a56aea04232f735f1de54b78bea2494484f1cc0d", "mame2015": "8abad707dd5c0206eb6f0889adb9b46128ea0975", "mame2016": "6231bcc43590a3adc36fa4c14ddefe4d373fa440", "mamearcade": "86f27948d45ed51bf9c6d523ebc1d63d5d92e840", @@ -161,13 +166,14 @@ "mednafen_vb": "0d3399122790f3e72d25abaab995622474e720e2", "mednafen_wswan": "24cf8e85a0d027d464afd71612bbdc2a1aa86c65", "melonds": "ba1e3762404c290082ca202183704e3c711bb49c", - "melondsds": "82c511d23dfa7b8a3f3bb43b38c6598cd835740b", + "melondsds": "510ce789c11a92ab54e140ebd1c7e8a1e8c6b056", "mesen": "82871f69374e2e9a4e8ac52009bed1a9c26a3c94", "mesen-s": "e9d19eb873e5d1dc8c65f409c7603413f5c99a32", "mesen2": "cb556adf4cca53da9d7bad80fc63cc92fb37bf34", "mess2015": "b9260d933fae4b78c34c45ed1b3e6f12cddae7d5", "meteor": "871d3b256cff96544ee8866e860c5f5afb293ef1", "mgba": "90e1425af4bf9b1cfcef189d51b596e19c793ffd", + "mgba_splitscreen": "d7fc431fade83166922e8c4d2bcdb4899c6771a4", "minivmac": "224fc445e6ffaa2b1ec2805fd5a8bf54daadc273", "mkxp-z": "a5a54cb7c2001afe6fcdd9a782584a3ee8f020df", "mojozork": "131fd6fe964349afd49b77a3d1b7e3712ad7aca9", @@ -200,6 +206,7 @@ "opentyrian": "5f3bae87cddae1c5cb5f51cef3ea43e3a45c0a2b", "opera": "d8447c579efd7425edc06b6e03697abfeebee062", "panda3ds": "f95daaa5e6e68dabe71e825655f09a7e3c7b17fd", + "parallel_dc": "4c40bc45cbe50c468d0538e443b9da9ec1d30598", "parallel_n64": "320b88d1032d3caa5ae3b39469dacc005ccae59b", "parallel_n64_debug": "96611a7235f47b06075d237ef8e5d33207d195a2", "pascal_pong": "a1810d465843e18701c208c9ec2a92d783195fe3", @@ -214,6 +221,7 @@ "picodrive": "9e539d30e23a7ee469a6780500fb1400de00c976", "piece": "0fbc5df982831b9ac3b2e327c41f4d68d42c3620", "play": "b91e6d04d33a86694d1e14ed8f3cddd962805f33", + "playdiaemu": "f37bff0b3a374d0080fb29524a80612fed433c4a", "pocketcdg": "9a7a9606dfc265ced4e6b8d0356b245bff076fc2", "pokemini": "07cabab917a3b8040d80538b843de778f006820e", "pokketstation": "90f40d6c9c3dc0dd347db21afa07d47c1407f032", @@ -237,10 +245,11 @@ "retrodream": "0544849053aa85007b3a4a4162501fa8ad259d9a", "romcleaner": "6c9181472df165dab7449100f01cf6def1d9d707", "rp6502": "128440e0c79671b0bdd13bad6b04f05ccd12492f", + "rust_dos": "c50392af047e750dc6ae535f791fd3a4ff4e6be9", "rustation": "01fdab0903e30a19a0ca299fc15b8aa241843417", - "rustynes": "c231a5836ff48970ada68f39cb002ebba190dbb8", + "rustynes": "c1407f2957ffac8caf674a5fb0ce178c4f27bce5", "rvvm": "5fe5334df5112ff14bee0009f2de55656fb815a4", - "same_cdi": "2bc8421aef357ccb70d320a113045b1bc2f8aff1", + "same_cdi": "82470bf9c8a7321f2f4abd46f00c40bdf41c8237", "sameboy": "900d258764ec864fdae7b33d26ccb1f261023193", "sameduck": "7625ddea334c4f1747b10e3ab92459ee2a3b05d7", "scummvm": "17d120c360629463b535c6c872ec7d4faf94fd1c", @@ -290,6 +299,7 @@ "ume2015": "cc668cd200e31492ac09f6b7f3e77e338f8f10aa", "uw8": "c920638e44627f5ea9fb5a66cd05b925d3fa7744", "uxn": "ae7f7069dd14125875d1474c97eba70c916e3b99", + "uzdoom": "56c8fe493db262a75474c5dc7e13f03999717aa4", "uzem": "e3cec8c8a0ccee9fba3884a80c8a3c909d513355", "vaporspec": "390f79a6b346d6aa32afb5f5e6356b079a05578b", "vba_next": "edbdb88f64a85755f2085f2cb80d232429f4848b", @@ -308,9 +318,10 @@ "vice_xvic": "33f3689b881367a2400cdead1d7b542a311b4dc2", "video_processor": "5bdc74ff749976a560a534af0d06277153a5c206", "vidtest": "4d8fe9a3f3033d06b5ec8ac28327965dcf951f0b", - "vircon32": "66d770352a9a1da119e8f766df17b0bfcbf7d757", - "virtualjaguar": "fc434223e248d32c38e46fcd84eae40116d1bbb6", + "vircon32": "1fbaa79426989703455aa5e04c669e983bf970af", + "virtualjaguar": "f78c0b179cb494e7debf68c4a794bf4c5c1f3e89", "virtualxt": "0f078c4357c3f6196faea56951930491455b47b8", + "vita3k": "d6d2a56d045fbc80ca63c0449a8bf39dba48953a", "vitaquake2": "18ae56936e0857d726df6b1805bcaf39f649e1c8", "vitaquake2-rogue": "5740238c8c868c1bd77278565deb4d0380bff1f9", "vitaquake2-xatrix": "9457b624a2ef954d8a956a9dbb1cade98a4f8535", @@ -321,7 +332,7 @@ "wqxemu": "75b6fd2d3726386ebf3e2839ab1facbe87df3f7a", "x1": "81e99f41eb8a048defc206383fbabdf281e53b6f", "x64sdl": "4171f40c8a70256a2c5cb70db6a2b8fa733d9b3d", - "xemu": "e6033c0002a3311d6f0ba2bd6c1f399324d65e96", + "xemu": "723ba3f04f24dfd148ab2ddb8318cd85ad7553ab", "xrick": "2bb032e72b1432fa2c428d186db4ce55dfec8e2f", "yabasanshiro": "bc1d40f813591ab89fb3c69af143976b636a6d89", "yabause": "3b4247a760bff675b05f8436ce0b648cf4ea9e21",