Commit Graph
4936 Commits
Author SHA1 Message Date
Abdessamad Derraz 513384fa4d feat: read recalbox's amiberry rom_path 2026-11-09 21:55:32 +01:00
Abdessamad Derraz a41fb285ed feat: profile amiberry 7.1.1-332 for batocera 2026-11-09 21:55:32 +01:00
Abdessamad Derraz 42f78ec8ff feat: profile amiberry 6.3.3 built by retropie 2026-11-09 21:55:32 +01:00
Abdessamad Derraz ab5016852f feat: profile amiberry 5.7.2 built by retropie 2026-11-09 21:55:32 +01:00
Abdessamad Derraz ea2ba7c6db chore: collect each amiberry build's whdboot files
WHDLoad, boot-data.zip, the game databases and AROS as shipped by the
Amiberry revisions Batocera, KNULLI, Recalbox, RetroBat and RetroPie build.
2026-11-09 21:55:25 +01:00
Abdessamad Derraz aeccdf6e11 chore: merge amiberry builds 2026-11-09 20:59:15 +01:00
Abdessamad Derraz bc386e0561 feat: profile amiberry 8.0.0 built by EmuELEC
EmuELEC 4.8 builds amiberry 452783a (CMakeLists.txt declares 8.0.0).
Same paths as 7.1.1, a ROM database with the PPC flash images, which
the scan hashes with their config bytes cleared, so no file hash is
declared for them. Tests check that ROCKNIX, AmberELEC and EmuELEC
resolve their own build, the other platforms the 8.5.0 profile, and
that ROCKNIX places its kickstarts at the BIOS root.
2026-11-09 20:58:25 +01:00
Abdessamad Derraz c182cfa948 feat: profile amiberry 7.1.1 built by AmberELEC
AmberELEC builds amiberry c53d6db (CMakeLists.txt declares 7.1.1). Its
ROM path is rom_path, else roms/ below the home directory
(AMIBERRY_HOME_DIR, ~/Amiberry, or the working directory in portable
mode), scanned at its root by the ROM database. The WHDLoad booter
reads whdboot/ below $XDG_DATA_HOME/amiberry. EmuELEC's 452783a adds
13 PPC board ROMs to the database and hashes flash images otherwise,
so it gets its own profile. AmberELEC reaches its Kickstarts through
the .uae kickstart_rom_file paths, the fixed_name records.
2026-11-09 20:58:25 +01:00
Abdessamad Derraz 9d72fe4546 feat: profile amiberry 5.6.5 built by ROCKNIX
ROCKNIX builds amiberry 5c54536 (target.h declares 5.6.5). Every file
it reads lies below its start path, the working directory: the ROM
database dumps, aros-ext.bin, aros-rom.bin and rom.key in kickstarts/,
the WHDLoad booter files in whdboot/. Profiled from that revision,
pin_frozen with pin_build on ROCKNIX's package.mk.

The ROCKNIX scraper records the folder its start script enters and the
kickstarts link it carries there by copying /usr/config/amiberry, so
<cwd>/kickstarts binds to the BIOS root. A standalone + libretro profile
under a name the platform's own build answers to no longer resolves
there: ROCKNIX's amiberry is 5.6.5, not 8.5.0.
2026-11-09 20:58:13 +01:00
Abdessamad Derraz 297ec74bd9 chore: merge sudachi folder and ps4 fonts 2026-11-09 20:33:36 +01:00
Abdessamad Derraz b9d0613cc3 feat: collect the shadps4 system fonts
45 fonts from a PS4 firmware 11.00 dump (archive.org item
sony-ps4-system-font), checked against the item's md5 and sha1 and,
for 44 of them, byte for byte against the separate ps4font upload.
Each sits in the folder the console keeps it in: shadPS4 mounts
fonts/font and fonts/font2 as two guest folders (emulator.cpp:640-661),
so the ten font2 fonts move there and the seven font2 files the mount
also serves get entries.
2026-11-09 20:32:54 +01:00
Abdessamad Derraz e93ff86bf1 chore: merge integ configs root and switch folders
The configs root place joins roms and emulator folders in the split
handed directories, and RetroBat's portable folder table keeps both
sides. Batocera, KNULLI and RetroBat records regenerated.
2026-11-09 20:16:41 +01:00
Abdessamad Derraz 4b17bf0460 fix: read xroar coco3 ROMs from RetroBat coco
RetroBat passes XRoar -rompath bios/coco for the coco system, and its
es_features offers the CoCo 3 machines there. The per-system record now
carries those machines (machines:), and an entry whose name the
platform list does not declare is launched for the system offering
its own profile system as a machine, by _norm_system_id. coco3.rom and
coco3p.rom move from bios/dragon to bios/coco. RetroBat offers no
MC-10 machine, so the mc10 ROMs keep the default bios/dragon.
2026-11-09 20:15:47 +01:00
Abdessamad Derraz ada5f01cd1 feat: bind retrobat sudachi portable folder
Sudachi.Generator.cs:28-30 creates user/ beside sudachi.exe, and
sudachi reads it as PORTABLE_DIR (path_util.cpp:92, fs_paths.h:9) in
place of %APPDATA%. Its keys now go below emulators/sudachi/user/.
2026-11-09 20:14:41 +01:00
Abdessamad Derraz 24eab97bc7 chore: merge configs root and switch folders 2026-11-09 20:09:05 +01:00
Abdessamad Derraz 7b90d94ebe chore: merge origin/main 2026-11-09 20:01:25 +01:00
Abdessamad Derraz 339297c75c chore: merge integ-2026-11-09 placement round
Both binding sides kept: roms_place, named handles and environment
variable directories from integ run through the pool and per-system
binding of this branch. Batocera, KNULLI and RetroBat launcher records
regenerated from the merged extractors.
2026-11-09 19:58:11 +01:00
Abdessamad Derraz 111a93440f feat: bind retrobat switch portable folders
RetroBat's generators create user/ beside yuzu.exe and eden.exe and
portable/ beside Ryujinx.exe, which the emulators read in place of
%APPDATA% (PORTABLE_DIR, Ryujinx AppDataManager.cs:12, 60). Their keys
now go below emulators/<key>/.
2026-11-09 19:54:00 +01:00
Abdessamad Derraz 7e22c38113 feat: place shadps4 files below the configs root
Batocera and KNULLI start shadPS4 from CONFIGS/shadps4, so its user
folder sits below /userdata/system/configs. The scrapers read that root
from batoceraPaths and write configs_root with its source_ref. The
manifest names it configs_directory, and install.py honours it through
the same checks as roms_directory: character rules, at most two ups,
the ancestor match and the lexical bound.
2026-11-09 19:53:49 +01:00
Abdessamad Derraz 9d955bb980 feat: add the shadps4 system fonts
The font library opens each SST font by its dumped or PS4 name in
fonts/, fonts/font/ and fonts/font2/ and falls back to the Noto fonts it
embeds, so the 38 entries are optional with an HLE fallback.
2026-11-09 19:53:35 +01:00
Abdessamad Derraz 5bf8aa8a3e fix: place amiberry ROMs in rom_path
The standalone Amiberry scans rom_path, ROMs below its content root by
default, for the ROMs of its database, without descending into
folders, and reads rom.key beside the Kickstart and the MT-32 ROMs
from mt32-roms. Those entries now carry standalone_path relative to
it, the four Kickstart labels holding slashes flattened. The kick*.rom
names stay the libretro build's.

Batocera's config_directories reads its rom_path save, KNULLI reuses
it. On Batocera, KNULLI and RetroPie the ROMs move from the BIOS root
to bios/amiga.
2026-11-09 19:48:22 +01:00
Abdessamad Derraz 8ec0c5482c fix: place xroar ROMs in each rompath
XRoar reads a ROM by name from the directories of rompath. The entries
take their file name as path, relative to ~/.xroar/roms or
${prefix}/share/xroar/roms, and rompath and -rompath are declared as
search lists.

Batocera records its rompath line, Recalbox -rompath bios/<system>
(the placeholder its extractor already writes), RetroBat its -rompath
as two records, bios/dragon and bios/coco for coco. An entry whose
name the platform list does not declare follows the launch its
profile system is listed under: Recalbox lists mc10.rom under
trs80coco, so alice.rom is read there.

Batocera ROMs move from the BIOS root to bios/xroar, Recalbox ROMs to
bios/dragon and bios/trs80coco, RetroBat ROMs to bios/dragon and
bios/coco. RetroDECK and RetroPie keep them at the BIOS root.
2026-11-09 19:41:40 +01:00
Abdessamad Derraz de0bdbd84e fix: drop defaults the build has no package for
KNULLI's configgen-defaults.yml picks suyu for the Switch, which its
es_systems.yml does not offer and no package of its tree, its batocera
submodule or its buildroot builds: KNULLI does not ship suyu. A default
es_systems.yml does not offer now counts only when a package of the
build's trees has that name, or when its launcher runs a program from
the BIOS folder (Batocera's lexaloffle). Batocera's lists are unchanged
by the rule. suyu leaves KNULLI's cores, and the XDG_DATA_HOME record
that served it goes.
2026-11-09 19:35:04 +01:00
Abdessamad Derraz e6dbbe69ed fix: place openmsx system ROMs through filepool
openMSX reads share/systemroms below OPENMSX_HOME or ~/.openMSX and
every filepool entry by SHA1. The profile paths drop RetroBat's
openmsx/ prefix and declare those directories and the filepool.

Batocera's config_directories reads the filepool lines its generator
writes, KNULLI reuses it. RetroBat records OPENMSX_HOME, RetroPie the
moveConfigDir of ~/.openMSX that its systemroms link lies in, and the
configure --prefix of xroar that its roms link lies in.

Batocera and KNULLI system ROMs move from openmsx/share/systemroms to
openmsx/, beside the files their own lists declare, RetroPie's to
BIOS/openmsx, the folder linked as share/systemroms.
2026-11-09 19:32:00 +01:00
Abdessamad Derraz cd38b9ed10 feat: bind standalone layouts per system and pool
A launcher record can name the systems it is written for, and then
replaces there what the records naming none hand: RetroBat passes XRoar
-rompath bios/coco for coco and bios/dragon otherwise. An entry is
launched for the systems it names and those the platform declares a
file of its name under. A {system} search_dir gives one directory per
platform system, a colon search path each of its directories.

standalone_pools names settings a program reads as a list of
directories, each searched like a layout subfolder (openMSX filepool,
XRoar rompath). Any entry serves: the one the platform list fills
comes first, then the first of the BIOS tree. A handle above a
declared directory lands it where its link points (configure
--prefix). Record order now survives the standalone set.
2026-11-09 19:30:06 +01:00
Abdessamad Derraz 5c5c7cd79c fix: read shadps4 sys_modules from its user folder
sys_modules/ is below shadPS4's user folder: user/ in the working
directory, else the XDG data folder (path_util.cpp:88-124). Batocera
and KNULLI start it from /userdata/system/configs/shadps4, so their
packs no longer carry bios/shadps4/sys_modules, which nothing read, and
name the modules instead. EmuDeck keeps its link at
bios/shadps4/sys_modules, and RetroBat places them in
emulators/shadps4/user/sys_modules.
2026-11-09 19:29:18 +01:00
Abdessamad Derraz d2546e557f fix: read citron and suyu keys from KeysDir
Both profiles placed their keys in switch/, Batocera's folder. The code
reads them from KeysDir, <data>/keys, so the paths are keys/<name> and the
profiles declare the data folders, the portable user folder and the
KeysDir handle. Batocera and KNULLI keep citron's keys in bios/switch,
EmuDeck places each emulator's in its linked bios/<emulator>/keys,
RetroBat in emulators/citron/user/keys, and KNULLI's suyu, which keeps
its data in /userdata/saves/switch, names them as read outside the BIOS
folder.
2026-11-09 19:29:18 +01:00
Abdessamad Derraz 62f9ea6a76 feat: read the folders launchers hand switch, ps4
Batocera's 002-adjust-paths.patch rewrites Citron's KeysDir to
/userdata/bios/switch: patched_paths reads it from the patch, and KNULLI
from its batocera submodule at the pinned commit. Batocera and KNULLI
start shadPS4 from /userdata/system/configs/shadps4 (os.chdir), KNULLI
sets suyu's XDG_DATA_HOME to /userdata/saves/switch, and RetroBat creates
the portable user folder beside citron.exe and shadPS4.exe. Each platform
file differs from its scraper's full output by these records only.

A profile names a folder a handle rewrites as "<handle> = <subfolder>",
and a record setting a variable or a working directory a declared folder
is spelled from binds the whole layout below it.
2026-11-09 19:29:10 +01:00
Abdessamad Derraz 39778a7359 fix: refuse drive segments in manifest paths
A drive is refused only at the start of a value, so a later segment
such as ../C:x joins as a drive-relative path on Windows. Every
manifest path now refuses a segment Windows reads as a drive and one
ending with a colon. roms_directory, emulators_directory and the dests
below them refuse any colon. Elsewhere a colon inside a name is kept
where the host is not Windows: RetroDECK's ares reads
bios/snes:st018.data.rom and bios/zxs:48.rom on Linux, three dests of
install/retrodeck.json. A Windows host refuses them as alternate data
streams. The roms root is also checked to stay below the BIOS folder's
ancestor it climbs to.
2026-11-09 19:23:41 +01:00
Abdessamad Derraz 10ca8523b5 fix: check manifest roms roots like paths
roms_directory.from_bios and the emulators_directory folders come from a
downloaded list. from_bios now meets the character rules of every
manifest path (shared with _safe_relative_path: no backslash, drive,
empty segment, trailing slash or control), climbs at most two folders
(../../Roms, the deepest the rom folders files record) before plain
names, and its joined form must equal the BIOS folder's ancestor at that
depth: "." is the BIOS folder, null leaves the files out. Every
emulator folder the installer builds goes through _safe_relative_path
and stays below the folder holding the BIOS folder.
2026-11-09 19:13:47 +01:00
Abdessamad Derraz 909a989114 chore: merge origin/main 2026-11-09 19:04:09 +01:00
Abdessamad Derraz b067d27d53 feat: give the package command back in hints
Run from the retrobios package, a hint and --help named python3 install.py, a file that user does not have. The package's launcher sets RETROBIOS_BOOTSTRAP=pypi, and the command is read from the environment it runs in: uvx retrobios from uv's cache, pipx run retrobios from pipx's, retrobios once installed.
2026-11-09 19:04:08 +01:00
Abdessamad Derraz 3db2819150 refactor: read the roms root from romfolders
platforms/romfolders/<platform>.yml records the roms root from the OS's
own source (roms_root path and from_bios), the same fact the registry's
roms_directory restated for ROCKNIX alone. The manifest's roms_directory
now carries from_bios, which the installer follows from a BIOS folder of
the platform's name, and the registry key is gone. A list that installs
above its BIOS folder (AmberELEC) holds its roms root in the install
tree: a file a launcher runs from there is a plain dest. emulators_directory
stays in the registry: no rom folders file names emulator folders.
2026-11-09 19:03:49 +01:00
Abdessamad Derraz 8633db0a22 chore: merge voxatron split and emulator folders 2026-11-09 18:56:51 +01:00
Abdessamad Derraz c8fe8d914d feat: install files into retrobat emulator folders
RetroBat's Pico8 generator runs pico8.exe from AppConfig.GetFullPath:
the emulatorLauncher.cfg key, else the first existing of four folders of
the RetroBat install. The registry describes that search
(emulators_directory) and the manifest writes such a file as
root: emulators. The installer places it only when the BIOS folder sits
beside RetroBat's launcher config and the config does not move the
folder, and names it no_emulators_directory otherwise. Packs skip it as
they skip root: roms.

The PICO-8 0.2.7 Windows build (pico8.exe, SDL2.dll) is collected from
the archive.org copy of pico-8_0.2.7_windows.zip, its pico8.dat being
the 0.2.7 one already held.
2026-11-09 18:55:49 +01:00
Abdessamad Derraz f47c8b8e5a fix: profile voxatron apart from pico-8
lexaloffle documented two programs, so every platform naming PICO-8
received Voxatron's files: ROCKNIX, RetroDECK and RetroBat run PICO-8
only. Voxatron is its own profile, named vox_official. A platform also
runs the emulators its standalone_cores list names: Batocera and KNULLI
list lexaloffle there and nowhere else.
2026-11-09 18:48:13 +01:00
Abdessamad Derraz ad424f796b chore: merge one-of sets 2026-11-09 18:33:21 +01:00
Abdessamad Derraz 50f9b642a0 fix: group the boot ROM slot Pizza Boy SC fills
Read while walking the profile checklist on the profiles the
variant_group conversion touched.

- pizza-boy-sc: the core holds one Mega CD slot and one Master System
  slot, filled through the document picker under any name, and tests
  only the Mega CD length (libsc.so frontend/android/src/lib.rs:475,
  569-648, megacd_main_machine.rs:169-178). Nothing picks by
  territory, so the three images of each are a group, not a selection
  slot: megacd-boot-rom required, mastersystem-boot-rom optional.
- fpse, fpse-ng: the BIOS note pointed at "the other images of the
  group", a set the profile does not list. It now says any 524288-byte
  PlayStation image fills the slot.
2026-11-09 18:32:53 +01:00
Abdessamad Derraz 2fe15e99f9 chore: merge launcher names 2026-11-09 18:29:52 +01:00
Abdessamad Derraz b5f82fdd29 chore: drop the lwmp dedup entry
splitwolf, already in NODEDUP_DIRS, covers bios/Other/splitwolf/lwmp.
2026-11-09 18:27:21 +01:00
Abdessamad Derraz e4ef720e16 fix: identify amiberry's named kickstarts
The libretro core opens its Kickstart candidates by name and checks
nothing more (libretro.cpp:1804-1867), while its ROM table names each
image by CRC32 and size (rommgr.cpp:159-207, 334-359). The ten named
entries now carry the table's values, so they resolve by content:
kick12.rom moves from a 512 KiB file the table does not list to
KS 1.2 rev 33.180 (a6ce1636) in twelve manifests.
2026-11-09 18:27:03 +01:00
Abdessamad Derraz 58735286a7 feat: let an archive join a set
Kronos reads kronos/stvbios.zip, else stvbios.zip at the root of the
system directory, and a ST-V game stops without either
(libretro.c:1608-1617, 1676-1681 at the pin). The archive under
archive_prefix and the root copy are one need, but only loose entries
could be members, so the required-only pack carried both.

An archive's own entry now joins a set like a loose file. verify
--emulator and the emulator pack settle archive units with the loose
entries, the required-only pick covers them, find_undeclared_files
and cross_reference record them, and the unit under archive_prefix
ranks before the same name at the root. Its members still settle the
archive by their contents. Kronos' stvbios.zip is grouped stv-bios.

No other profile reads one archive under two paths: odin and
tgpulse_next_m1 place their own entries at the prefix path, and
flycast's naomi.zip has one path per build.
2026-11-09 18:26:05 +01:00
Abdessamad Derraz 56ed37c3f0 chore: merge launcher placement 2026-11-09 18:23:46 +01:00
Abdessamad Derraz 5794ed4178 fix: drop the atari800 config key aliases
ROM_5200_A, ROM_BASIC_A and six more are atari800.cfg keys, not names
atari800 opens: MatchByName knows only atariosa.rom and its kin
(sysrom.c:278-294), and the keys are config_key since 969907e29. The
twelve labels the scan identifies by CRC32 are found_by: content, and a
platform declaration of a file such an entry accepts by hash, in the
folder the core scans, now meets it: RetroDECK's ROM_BASIC_A answers
atari-basic-rev-a.rom without the alias.
2026-11-09 18:22:55 +01:00
Abdessamad Derraz cf6eb412f1 feat: bind emudeck links for switch and 3ds
yuzu, eden, Ryujinx and Azahar declare the data directories their code
reads, so EmuDeck's links place their keys in bios/<emulator>/keys and
leave the 3DS NAND files it links nowhere named, not at the BIOS root.
2026-11-09 18:22:39 +01:00
Abdessamad Derraz 65e1db9fe1 feat: place files outside the bios tree
A platform that binds part of a standalone layout leaves the entries no
binding covers in a folder outside the BIOS tree: they are no longer
packed at the BIOS root, and the manifest names them (root: emulator,
outside_bios_folder). A launcher that executes a profile's file binds
the program folder: in the BIOS tree, below the roms directory a registry
entry names (root: roms, installed into the folder holding the BIOS
folder), or nowhere a pack reaches. A moved entry resolves by its own
path as well as by its destination.

uae4all gains kick.rom and rom.key in its working directory and loses a
not_bundled_on that named Recalbox, which runs uae4all-rpi. lexaloffle
declares that its programs read beside their executable, lists the
Windows build RetroBat runs and the pico8_dyn ROCKNIX runs on x86_64.
2026-11-09 18:22:34 +01:00
Abdessamad Derraz b5ee4ab09e feat: read pico-8 launchers of rocknix, retrobat
ROCKNIX's start_pico8.sh runs pico8_64 or pico8_dyn from
/storage/roms/pico-8 and RetroBat's Pico8 generator runs pico8.exe from
its pico8 emulator folder. Both are recorded as exec records, read from
the scripts at the revisions the platform files pin.
2026-11-09 18:22:26 +01:00
Abdessamad Derraz ee98949d2c fix: profile the zip and hog probes at the pin
Read while walking the profile checklist on the grouped profiles.

- picodrive: find_bios tries each stem as .bin then as .zip
  (platform/libretro/libretro.c:1316-1326), and pm_open reads the
  first entry of at least 32 KB or with a ROM extension
  (pico/cart.c:122-158). The twelve .zip names join their region's
  set, ranked right after the .bin of the same stem.
- dxx-rebirth: the HOG entries cite the mount and the error that stops
  the game without one (similar/main/inferno.cpp:472, 476, 500-512).
2026-11-09 18:19:47 +01:00
Abdessamad Derraz 315dab82b7 feat: give each set its requirement and one pick
Three changes to the search-list model, one commit because the readers
and the profiles must move together for the schema to hold.

Set requirement in a groups map. pom2 falls back on apple2.rom for the
][ and the ][+, and on apple2e.rom for the //e it boots and for the
unenhanced //e: one required on the file could not say both. A profile
now declares groups: {name: {required}}, a member writes no required
of its own (schema and validate_schemas refuse one) and load_emulator_
profiles derives it, true when one of its sets is. group takes a name,
a list, or a map from set to rank where the rank differs per set. pom2
is grouped from SystemProfile.cpp and MainWindow.cpp:246-296 at its pin.

One member per required set under --required-only. The pick is the
first the code reads among the held members the region filter leaves,
by rank then declaration order; a set the platform declares a member
of is carried by that declaration. The emulator pack, verify
--emulator, the platform pack, its manifest and verify --platform read
alternatives.required_only_spares or core_file_spares.

variant_group is now selection_slot: files a core chooses between by
a rule other than first found (disc territory for PicoDrive and
Pizza Boy SC, the o2em_bios option, a WebAssembly probe in SWF
Player). Where the code takes any one, the field became a group:
ARMSX1 (ArmSxBackend.java:149-157, name order), ePSXe (load_bios
0x433540-0x433621 of the 2.0.5 Linux x64 binary, one configured path,
HLE when BiosHLE is set), FPse and FPse-NG, DXX-Rebirth's HOGs
(inferno.cpp:472-512). odin and zesarux carried it with no effect.
slot.py compares ranks only between candidates that share a set.
2026-11-09 18:19:32 +01:00
Abdessamad Derraz a9fdf6eefc docs: state the scph10000 tie-break
The model fill picks the original revision when two primaries are
equally accepted, so every run ships the same file.
2026-11-09 18:15:48 +01:00