A platform that builds Amiberry itself runs that revision under the name,
on every board it builds: RetroPie 5.7.2 and 6.3.3, Recalbox 8.2.2,
Batocera 7.1.1-332, KNULLI 7.1.1. The 8.5.0 profile is the buildbot
libretro core. It now names the ROM table's own file names and hashes
the keyboard MCU images.
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.
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.
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.
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.
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.
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/.
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.
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>/.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
atari800 reads each ROM path from its config key (sysrom.c:123-149,
616-623) and identifies a file by the CRC32 of its slot (sysrom.c:89-
108). AmberELEC's atari800.cfg sets ROM_5200_A, ROM_BASIC_A and
ROM_BASIC_B to 5200a.rom, BASIC_Rev_A.rom and BASIC_Rev_B.rom.
RetroBat and Batocera list ps3_ps2_emu_bios.bin, the PS2 BIOS the PS3
carries for ps2_emu. RPCS3 installed the held PS3UPDAT.PUP (4.90,
sha1 093f8698) and decrypted dev_flash/ps2emu/ps2_emu.self, and the
image is the span firmware_bios_claim release 2 cuts, padded to 4 MiB.
Its romdir parses and ROMVER reads 0220JD20121227. Two runs give the
same bytes, sha1 2dc921be.
RetroBat copies bios/scummvm/extra/Roland_SC-88.sf2 to DOSBox Pure and
DOSBox Staging and offers it in the soundfont option
(DosBoxStaging.Generator.cs:246-252, 336-344). No canonical file of
that name exists, and both emulators take any SoundFont
(dosbox_pure_libretro.cpp:1380-1412, fluidsynth.cpp:194-230).
amberelec_launchers reads runemu.py with ast and, at the commit the
scraper pins, the scripts its standalone table runs and the configs
their packages install: RetroArch and retrorun directories, the MAME
-rp path, atari800.cfg, Hatari's default TOS, amiberry's kickstarts
link and defaults, yabasanshiro, PICO-8, piemu, scummvm, freej2me and
easyrpg. 17 records.
The freej2me-lr.jar and pico8_64 notes now name the file in a sentence
about the emulator, as test_launcher_aliases asks once a launcher
records it.
FluidSynth 2.0.6 (EmuELEC fluidsynth-git, PKG_SHA256 matched) loads
any argument whose header is RIFF sfbk and names no SoundFont.
SC-55.sf2 is named only by emuelec-utils:67 and no EmuELEC package
or script installs or fetches it, so the entry is unsourceable: user
supplied, no canonical file.
XM7 plays fddseek.wav, relay_on.wav and relayoff.wav from its data
directory (linux-sdl/sdl/api_snd2.cpp:155-159, 213-267). The three come
from Win32/ of the XM7 V3.4L77SX+z09 final release archive by PI. and
Ryu Takegami, archived on archive.org as xm7tr_3477sxz09.
Amiberry names every Kickstart its ROM table lists by SHA-1, whatever
the file is called (src/rommgr.cpp:144-378), and a model takes the
first ROM id of its list (src/cfgfile.cpp). The profile carried one of
the 58 images. WHDLoad booting links eight of them into its Kickstarts
folder under their kickNNNNN names (amiberry_whdbooter.cpp:368-375),
which the entries now answer to.
Each list read at the profile's pin, every member required: true where
the code needs one of the set, the order left in priority.
- yabause, yabasanshiro, kronos: libretro.c tries saturn_bios.bin,
sega_101.bin, mpr-17933.bin (yabause 1035-1049, yabasanshiro
1048-1071, kronos 1619-1638 after kronos/saturn_bios.bin). kronos
also reads saturn_bios.bin at the system root, now its own entry.
yabasanshiro refuses the game with no file even under forced HLE
(1064-1071), so its hle_fallback is gone.
- yabadabadoo: bios_for_region (libretro.c:262-284) takes any of the
three in an order the disc region picks. One group, no priority:
region keeps that order, no single rank would be true.
- ymir libretro: kBiosFilenames (libretro.cpp:305-309), region first,
else the first found, no game without one (1231-1236).
- duckstation: FindBIOSImageInDirectory (bios.cpp:397-450) keeps any
image of the right size, a region mismatch only warns: one set.
- picodrive: find_bios walks one list per disc region
(libretro.c:1272-1336), three groups.
- px68k: BIOSFILE then cgrom.dat or cgrom.tmp (libretro.c:984-1032).
- px68k-sdl: BIOSFILE and FONTFILE lists (winx68k.cpp:277-331).
- numero: ti83se, ti83plus, ti83 (libretronew.cpp:575-594), no ROM
leaves a blank screen.
- freechaf: sl90025 then sl31253, HLE without either
(libretro.c:186-199), optional set.
- pcsx1: scph1001, scph5501, scph7001 then any scph* (libretro.c:1229),
HLE without, optional set.
- odin: three boot ROMs inside hikaru.zip.