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.
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.
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.
The gap report never offers an entry the platform's list settles, so
AmberELEC's amiberry configs, which pass kick34005.A500.rom and
kick40068.A1200.rom beside a declared kick34005.A500, got nothing. The
launcher layer now reads the entries it was not offered, through the
setting or the extended name only: by its own name an entry left out of
the report was left out for a reason.
A record naming several files of one config lists their keys in the
same order (describe_keys). Each launcher place now carries its own
key, so AmberELEC's 5200a.rom receives the ROM_5200_A file.
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.
MAME and libretro MAME pass /userdata/bios/<bootdisk>.img with -flop1
when the option is in the generator's list, else <bootdisk>.chd with
-hard. Each branch is a {bootdisk} template: the list the code tests
for the floppy, and for the hard disk the choices es_features.yml
offers that the list does not take. The menu offers macos3 while the
code tests macos30, so System 3.0 is passed as macos3.chd.
configureINI writes [Folders] Bios = ../../../bios/ps2 into
inis/PCSX2.ini, which PCSX2 and AetherSX2 resolve against the config
folder configgen hands it. relative_folders reads the call, the ini
path and the value, and records the resolved /userdata/bios/ps2 as a
passes_path for pcsx2 and aethersx2.
A copies record names its files under search_dir, the folder the code
copies from, and passes_to is the target, as the schema and RetroPie,
RetroDECK and AmberELEC already write it. KNULLI listed patches.zip
under the BIOS folder it is copied into, and KNULLI and RetroBat wrote
the target as prose with the condition. The condition of a copy now
goes in depends_on_option. Only launcher records change in knulli.yml
and retrobat.yml.
RetroDECK sets LRPS2's pcsx2_bios to scph10000.bin. The record names
the frontend, so the core is the one whose entry reads that setting.
Its entry is a placeholder, and the name spells a model: the held dump
the catalogues describe as SCPH-10000 goes in under that name in the
entry's directory, primaries first, then the earliest Redump revision
(ps2-0100j-20000117).
A launcher name that a reader's profile entry declares unsourceable is
no file left to find. Its row carries the reason and both reports
print it under its own count, never mixed with the names to acquire.
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.
knulli_launchers reads KNULLI's configgen and the PICO-8 installer at
the tag the scraper pins: Batocera's extractors where the generator is
still Batocera's code, KNULLI's own for lexaloffle, libretroOptions and
knulli-install-pico8, and one AST reader for the BIOS paths the other
generators pass on a command line, in a config key or the environment,
copy or test for. 52 records.
Configgen takes the configgen package path and whether the importer has
a legacy map, so KNULLI's copy at package/system/knulli-configgen reads
with the same extractors. hatari accepts the bare filename KNULLI builds
and joins to BIOS, and options read by subscript or isOptSet. melonds
accepts a console type read by subscript. Batocera's records are
unchanged at batocera-43.1.
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.
ROCKNIX's Amiberry configs pass kick34005.A500.rom and
kick40068.A1200.rom, Amiberry's names for Kickstart 1.3 and 3.1 with
.rom appended. Amiberry opens the path as given and boots AROS without
it, so the pack now ships the held ROM under the launcher's name.
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.
A core that loads the first of several names (yabause: saturn_bios.bin,
sega_101.bin, mpr-17933.bin) needs one of them. Profiles wrote this as
required on the first name and optional on the others, so verify and
the gap report called saturn_bios.bin a missing required file while
sega_101.bin was held, and a set held only through a name marked
optional read as a need met by an optional file.
Model: an explicit group on the file entry, mirroring the platform
field. priority was not reused: it is a rank, read by slot.py, region.py
and truth.py inside a (system, region) slot, and that slot is not the
set. px68k-sdl ranks its IPL list and its font list each from 1 in one
system, pom2 ranks one list per machine model, DuckStation ranks 105
images across every region and takes any of them. A rank cannot say
where one list ends. priority stays the order inside a group.
Readers, through alternatives.settle_sets:
- verify --emulator and the emulator pack: a held member fills the
set, the others leave the report, a set nobody holds is one gap
under its first member naming the others.
- find_undeclared_files (verify platform, core complement of packs and
manifests): same rule, a platform declaration or launcher counts as
answering the set.
- cross_reference: excused members are set aside as other versions.
- slot.py: ranks compare members of one set only.
- archive members: a required set inside an archive is met by one.
- truth: a member gives no requirement of its own, one_of and
one_of_required carry the set, and the exporters and the diff leave
such a line's required as the platform wrote it.
- validate_schemas: members of a group share required.
Each blob is TWLCFG 0x88-0x1AF, HWINFO_N 0x88-0x9B and HWINFO_S 0x88-0x9F, read from a retail NAND dump by DSperate's own nand_boot_blobs at ddf2910e. The primary comes from dsi_nand.bin, the seven others from the regional dumps and the dsi_nand.bin variant.
emuelec_launchers.py reads emuelecRunEmu.sh and the scripts and
configs it starts at the tag batocera-systems is read at (v4.8): 36
records for RetroArch, retrorun, freej2me, MAME, PICO-8, Flycast,
Amiberry, DuckStation, Yabasanshiro, jzIntv, Mupen64Plus, Hatari,
AdvanceMAME, ScummVM, Dolphin and the MIDI synths.
The note named freej2me-lr.jar only in its ROCKNIX sentence, so a
launcher record naming the jar read as a platform choice.
freej2me_libretro.c:488 joins it to the system directory.
sdltrs reads its three ROM slots from the romfile1, romfile3 and
romfile4p options (src/trs_options.c:323-325). RetroPie passes
-romfile4p $biosdir/level4p.rom under the emulator id sdltrs-model4p,
so the pack ships the 4 KB Model 4P boot ROM under that name.
ares binds each firmware path to <system>/Firmware/<type>.<region>
(desktop-ui/settings/settings.cpp:263-264, 280-283). EmuDeck writes a
No-Intro name into NeoGeoPocket and NeoGeoPocketColor BIOS.World, so
the pack now ships the held BIOS under that name.
A search a launcher stops at the first held name of is filled, and a
copy from the platform's own package or script brings its own file:
neither is a name the collection lacks. A launcher that writes its
file into the setting a profile entry is read from (config_key) now
receives that entry's held file under its own name, in the report and
in the pack.
standalone_bindings maps each subfolder of a standalone layout to the
folder of the BIOS tree a platform's links and passed directories give
it, followed through a working directory. platform_layouts applies it,
so the pack, the manifest, verify and slots read one destination.
uae4all paths are now what the emulator reads, kickstarts/<name> below
its working directory, and RetroPie still receives them in amiga/.