validate_schemas now refuses a files[] source_ref whose parts are all data or build files (a table, a makefile, meson.build, the file itself). A ref passes when one part names a source file or a binary with an address. The closed-source profiles whose refs are still prose about the shipped binary are listed in DATA_ONLY_REF_EXCEPTIONS with a reason each.
The record's page text took first-install.md 31 words over its 400. It now says only that one setup opens on Install. RETROBIOS_TUI_RECORDED is an internal marker of the full screen's own runs, like RETROBIOS_TUI_LIST.
The release page is public text like the site. render() said "finds
your setup", "file for your system" and "your BIOS folder". The
pronoun test now renders the notes from release.json, once more with
a pack in parts, and fails on any pronoun the script writes.
AdvanceMAME reads its sets from dir_rom, a list of folders
(advance/osd/fileio.c:74, doc/advmame.d:680,699-701). EmuELEC's
advmame.rc sets dir_rom /storage/roms/mame (advmame.rc:11), and
advmame.sh rewrites /roms/mame to /roms/arcade when it is started for
the arcade system (advmame.sh:26-30). The extractor kept the keys under
the BIOS root alone: it now records those under the roms root too, and
a key the script rewrites gives one record for arcade and one for every
other system. A configgen record carries the systems it is written for.
The profile lays its 29 sets out at the top of dir_rom. On EmuELEC they
land in roms/mame. The 12 root archives AdvanceMAME alone claimed there
now hold the copies of the cores that also declare them (mame, geolith),
none of them lost.
A destination outside the BIOS tree is no proof of content: the moved
entry resolves by its layout path alone. roms/mame/konamigv.zip took
bios/Arcade/MAME/konamigv.zip, MAME 0.289's set, by that tail.
GZDoom collects its IWAD candidates from [IWADSearch.Directories], reads
the support WAD there and the Load files from the IWAD's own folder
(src/d_iwad.cpp:456-476, 593-624, 862-901). RetroDECK lists
RETRODECKROMSDIR/doom there (gzdoom/rd_assets/rd_config/gzdoom.ini:9),
which component_prepare.sh:27 rewrites to $roms_path/doom. The extractor
read only the BIOS placeholder of a preset: it now records every line
naming the BIOS or the roms folder the script rewrites, with that sed
line in its source. $roms_path, whose default is the roms root
(config/retrodeck/retrodeck.json:5), is read as that root.
The profile names IWADSearch.Directories as a pool and lays its IWADs
and their support and Load files out at its top. On RetroDECK the 20
held IWADs land in roms/doom, the 23 others are named missing there.
The root copies stay for prboom and uzdoom, which claim them. No other
platform hands GZDoom that list, so none changes.
MAME splits rompath, samplepath, hashpath and pluginspath on semicolons
and tries each directory in turn (src/emu/fileio.cpp:53-58, 330-392,
src/emu/emuopts.cpp:44-46, 53). The launcher records spell those lists
with the game's own folder in them, which handed_directories skipped:
- RetroBat passes -rp bios;<rom directory> (Mame64.Generator.cs:93-96)
and -rompath bios/psxmame/bios;<rom directory> to pSxMAME
(PSXMame.Generator.cs:38-48).
- KNULLI passes -rompath <romDirname>;/userdata/bios/mame;/userdata/bios
(mameGenerator.py:116-122).
- RetroPie writes rompath $romdir/mame;$romdir/arcade;$biosdir/mame
(mame.sh:133).
A semicolon list now gives each directory but the game's folder. A pool
that already lists the folder the files take keeps them there, and a
pool standing for the whole layout holds its files, never its folders.
The MAME profile names its sets at the top of the rompath and its
search settings as pools, pSxMAME its sets and rompath.
RetroBat's -sp and -hash records split on `bool hbmame = emulator ==
"hbmame"` (Mame64.Generator.cs:30): bios/mame/samples for mame64,
bios/hbmame/samples for hbmame.
Manifests: RetroBat gains the 12 pSxMAME sets in psxmame/bios and drops
samples/bbc.zip, read by nobody, which mame/samples/bbc.zip already
serves. KNULLI drops the same copy. RetroPie gains the 1427 MAME sets
in BIOS/mame, the root copies staying for the libretro cores. EmuDeck
names samples/bbc.zip as read outside the BIOS folder. RetroDECK's
samplepath is $bios_path/mame-sa/samples (mame/component_prepare.sh:94,
117): bbc.zip moves there from bios/samples/. Its MAME runs with the
-rompath ES-DE passes, %GAMEDIR%;%ROMPATH%/<system>, so the standalone
sets are named as read outside the BIOS folder and the root copies stay
for the libretro core. The 1427 sets
of RetroBat, KNULLI and EmuDeck stay at the BIOS root, listed in their
rompath. No file of any manifest is lost.
validation: [romdir] walks a PS2 ROM directory the way the profile's
fork reads it, masked_sha1 hashes a file with a byte range cleared, and
size_multiple bounds a size to a granule. The resolver name steps, the
pack and manifest scans, the emulator expansion and verify call the same
content_fits. A PCSX2 companion is taken only beside an image that
passes, and a companion placeholder no longer seeds a scan of its own.
Dolphin reads its User folder at $XDG_DATA_HOME/dolphin-emu, else
~/.local/share/dolphin-emu (Source/Core/UICommon/UICommon.cpp:449-477).
The profile names both, so a launcher handing that folder places the
layout:
- EmuELEC starts Dolphin with XDG_DATA_HOME=/storage/roms/dolphin
(dolphinSA/scripts/dolphin.sh:28): its 30 files move from the BIOS
root to dolphin/dolphin-emu/ of the install tree.
- RetroDECK links User/Triforce to bios/Triforce
(dolphin/component_prepare.sh:30, 49), where its list already puts
segaboot.gcm. The rest of the User folder sits in the Flatpak's data
directory and is named as read outside the BIOS folder.
An entry only the standalone build reads, path and no standalone_path,
now takes that path as its layout path (Load/Firmware/rtl_bt/), and
the pass copying a name the platform declares elsewhere reaches an
unprefixed path: gba_bios.bin lands in dolphin/dolphin-emu/GBA/.
RetroDECK sets mlc_path to $bios_path/cemu (cemu/component_prepare.sh:14,
29), which replaces the MLC Cemu reads under its user data directory
(src/config/CemuConfig.cpp:25-26, ActiveSettings.cpp:295-320). The
profile names that key, so the layout's mlc01/ folder is placed in
bios/cemu. Two readers kept the binding from reaching the manifest:
- a moved entry kept its standalone load_from, data_dir, and the gap
report set the MLC aside as read outside the system directory. The
platform's folder now replaces the build's own root.
- an entry read outside the BIOS tree was no longer offered to the
launcher layer, so RetroDECK's link of keys.txt to bios/cemu/keys.txt
went unserved. It is offered again, fills no destination by its own
path, and a launcher place it fills settles it.
The RetroDECK manifest gains the 55 MLC files under bios/cemu/. It
drops the root copies of keys.txt, otp.bin, seeprom.bin,
shareddata.bin, cafeLibs/ and resources/sharedFonts/, which standalone
Cemu reads in the Flatpak's $XDG_DATA_HOME/Cemu and names them as read
outside the BIOS folder. The libretro copies under bios/Cemu/ stay.
EKA2L1 keeps its devices under the data-storage folder, data by
default and relative to the working directory
(src/emu/config/include/config/options.inl:45). RetroBat writes
data-storage = bios/eka2l1/data (Eka2l1.Generator.cs:153, 156), so the
layout's data/ folder is placed there.
The SYM.ROM extra at data/roms/nem-4/ of the BIOS root, read by
nobody, leaves the RetroBat manifest: RetroBat declares the file at
eka2l1/data/roms/NEM-4/SYM.ROM, the same slot on its case-folding
filesystem. The files shipped beside the executable are named as read
in the emulator folder.
A record's choice holds only the options of the choice and their
values, or the whole record is said once and ignored: it no longer reaches
the commands printed for the user. A recorded games folder is kept only
under the folder that holds the BIOS folder. A recorded option the list
can no longer apply is left out in one line, never refused. The record is
read only when it is a regular file of at most 16 MiB, its day is unknown
when no clock can show it, one a newer installer wrote is left as it is,
and a setup that cannot be used is dropped alone. The plan opened on the
one setup found keeps that screen's notes under Details.
EmuELEC links /storage/.local/share/flycast to /storage/roms/bios/dc
(flycast.sh:11-14 at v4.8), and Flycast reads
$HOME/.local/share/flycast. Root's home there is /storage
(packages/sysutils/busybox/package.mk:168, profile.d/98-busybox.conf:4,
sourced by flycast.sh:7), which nothing recorded, so the link bound
nothing and flycastsa's files went to the BIOS root.
The registry's home_directory now spells that directory as ~ in the
handles and directories of launcher records. flycastsa's ten files
land in bios/dc, where the libretro build already reads them. The
manifest drops dc_boot.bin and dc_nvmem.bin from the BIOS root, which
no emulator reads there, and six arcade archives at the root go back
to the MAME sets the mame cores claim.
Recalbox 10.1.1 builds the wxWidgets-era libretro PCSX2 for x86_64 at
408e3b2 with 0003-bios-path.patch, which moves the BIOS scan from
pcsx2/bios to ps2, and lists it as the libretro core pcsx2 of the ps2
system. Since lrps2-9485a53 took the ps2 name no profile described it.
pcsx2-libretro-408e3b2 is built_by recalbox under the name pcsx2, beside
standalone PCSX2 and LRPS2. It reads <bios>.rom1, rom2, erom, nvm and
mec beside the selected image. GameIndex.yaml and the patch archives are
compiled in.
Two filename-agnostic cores reading one BIOS folder each scan the same
images. The second scan stopped at an image the first had placed, so a
companion only the second core opens never reached the pack: Recalbox's
libretro PCSX2 reads <bios>.erom beside the images LRPS2 placed in ps2/.
The notes open on the command and the handheld app, then the full packs
for a device without internet, the setups the command alone serves, what
changed, everyone who helped since the start (read with gh, --thanks FILE
for a checked list) in a folded block, and the full changelog from the
previous release's record commit.
check_release reports a launcher in the checksum list as unrecorded and
one attached as extra, as it does for install.py. The release steps no
longer run build_port, and the checksum and upload globs name the packs
(*_BIOS_Pack*.zip) so a launcher left in dist/ is never caught.
-romdir replaces the ROM directory (src/getconf.cpp:282-290, 529),
and RetroPie writes -romdir $biosdir/pc88 into quasi88.ini
(scriptmodules/emulators/quasi88.sh:67). Its 19 ROMs move from rom/
to pc88/ in the RetroPie pack, manifest and verify.
build_port's four archives carry install.py pinned by SHA-256, so they
change with the installer, not with the packs. The site now builds them
from its own commit and serves them under get/handheld/. Each get/ page
of Batocera, KNULLI, ROCKNIX and AmberELEC names its file, size, hash,
folder and menu, and get/linux-handhelds/ does the same for muOS, ArkOS,
dArkOS and JELOS. The installer's handheld section opens on a download
table, both tables written from sitehandheld.LAUNCHERS.
An install writes retrobios-backup/<folder>.install.json beside the BIOS
folder: each file it placed with its sha1, size and source, and the choice
it made. The next run for the same setup and folder takes that choice when
the command line chose nothing, in line mode and on the full screen, and
says so. A record that cannot be read is said once and ignored. A record
event reports it.
With one setup found, the full screen opens on its plan, Change where one
row away. The plan's Install row says the size its headline says.
KNULLI sets AetherSX2's [Folders] Bios to bios/ps2
(aethersx2Generator.py:219), yet its 112 PS2 BIOS files went to the
BIOS root. Three causes:
- a record's passes_to was split into words, so "[Folders] Bios"
could not be told from "[Filenames] BIOS". ini_keys() adds the
section-qualified key a profile names in standalone_directories.
- scans_dir records hand a folder too (ROCKNIX's bios/armsx2,
EmuDeck's PCSX2 and ARMSX2) and were not read as handed.
- the agnostic scan looked its seeds up by the id of the profile's
entries, while it walks the copies platform_layouts makes: any
bound layout scanned nothing. Copies map back to the profile's
entries by position.
An agnostic profile's entry the layout reads outside the BIOS tree
is now named by the gap report (outside_bios_folder) instead of
dropped: ARMSX2's arcade/proverb.zip on ROCKNIX and EmuDeck.
Batocera 43.1 builds libretro/ps2 at 416291a with 001.bios-dir.patch and
Recalbox 10.1.1 builds it at 9485a53 with 0001-recalbox-paths.patch. Both
patches move the BIOS scan from pcsx2/bios to ps2, and Recalbox also moves
the data root to system/ps2. Each build gets its own built_by profile:
lrps2-416291a under Batocera's pcsx2 name, lrps2-9485a53 under Recalbox's
ps2 name.
A platform's own build now answers for its own build mode only on a
dual_mode_cores name, so Batocera keeps standalone PCSX2 beside its
libretro build.
A profile standalone copy was dropped when the manifest held its file
under two destinations. With the libretro PS2 cores' pcsx2/bios/ scan,
DuckStation's ps2_scph50006.bin and ps2_scph50008.bin copies left the
Batocera, Recalbox and RetroBat manifests. Same bytes at every path
are one source: the copy whose cores name the emulator, else the
shortest path.
LRPS2 and PCEE2 name their BIOS <bios>.bin, which resolves to no
file, so the platform pack's agnostic scan never anchored pcsx2/bios/
for them. On RetroArch yaps2 anchored it and the files carried only
yaps2 as their core. On Batocera and RetroBat, where yaps2 does not
run, pcsx2/bios/ stayed empty or held only the platform's own list.
The scan now takes the folders where the system's other profiles
resolve a hashed dump of that shape, the evidence the emulator pack
already used, and a companion (<bios>.nvm) looks where its image is
proven.
The release carries the packs, the handheld launchers and the signed checksum list. The installer and the file lists are pinned from the tag (installer page, For packagers), and check_release.py now refuses them as unrecorded files. The notes link each pack's files on the release itself, in a beginner's page: one idea per line. The handheld section links the latest release.
--verbose set it and no run cleared it, so a later run in the same process ended its clock message with the raw SSL text. Also: --target named again in its refusal, three names mypy read as another type, a semicolon and a tooling file named in test comments.
A query word matches the start of a longer word. Since the index grew,
the "2" of "playstation 2 bios" matched the 2026 of every page's date
line and the "u" of "wii u bios" the "use" of Next steps, so the
PlayStation and Nintendo pages held every query word and ranked above
the PlayStation 2 and Wii U pages. Both blocks carry
data-pagefind-ignore now: search_gate answers 58 of 58 queries, the
four console pairs by 9 to 14 percent. Batocera's pages weigh 882
bytes more for it.
KNULLI builds amiberry from Batocera's package through its batocera
submodule: the reference now names knulli-linux at 20260511, the tag
platforms/knulli.yml is read at, and the package file below the
submodule. check_freshness follows a path .gitmodules declares to the
commit the tree pins, which reads AMIBERRY_VERSION = v7.1.0 there.
RetroBat pins amiberry 8.3.0.0 only in emulators/versions.xml on its
download server, read by emulatorLauncher/Installer.cs. No repository
holds it, so amiberry-8.3.0 keeps pin_frozen, which says so, and no
pin_build.
The Batocera pages name its Amiberry build twice, now as 'Amiberry
8.0.0 (facaaeb, Batocera)': 20 more bytes each on the 1,356,360
measured at 27c33b966, so the byte budget is 1,356,400.
Batocera's pages now name the cores its x86_64 RetroArch downloads.
Each file lists every core reading it with its citations, the Game
Boy Advance going from 4 readers to 10, and Elektronika BK, FM Towns
and Nintendo DS passed the part budget. On the gate's built site at
27c33b966 the platform weighs 13 pages, 15,662 elements (under the old
18,854) and 1,356,360 bytes, 145,243 more than the 1,211,117 recorded.
The page and byte budgets take those measured values.
The PlayStation section opened on psxonpsp660.bin under 'every
region': since sets carry the requirement, ARMSX1's region-free member
of its required BIOS set counts as required, and the world line came
first, above the scph files most emulators read, and its card first.
A file read for every region is a stand-in for each region's BIOS, so
that line now follows the territories.
The Apple II start now leads on BizHawk's and Mednafen's files, a tie
of two readers with CLK's and POM2's apple2e.rom. The test named that
one file. It now checks that every start file is a link, its intent.
The parity test cut each MISSING line at the first space. openMSX's
ROM names hold spaces (Japanese MSX-Write (1986) (Ascii) (J).rom), so
the msx pack's list read 'Japanese' where verify named the file. Both
sides now name the same 81 files.
The amiberry profiles written today name the A2000 keyboard MCU ROM
by the hashes amiberry's ROM table gives (crc32 c23d280e, sha1
b5c4b8c3, rommgr.cpp:141-142), and openmsx-libretro names
nms8245_disk.rom by the two sha1 openMSX's machine file accepts. The
collection holds neither: its D8039HLC.rom is crc32 fb92a773 and its
nms8245_disk.rom is sha1 c3f3ca45. Both are real gaps, recorded with
their reason.
ROCKNIX's folder rows naming yabadabadoo now resolve to its profile,
since the platform lists the libretro cores it installs and yabadabadoo
is a build it makes. The reason recorded for it outlived its row.
A release asset absent from the checkout is omitted from the install
list. That omission named only the first core reading it: harm1.wad,
action2.wad and delaweare.wad named gzdoom, so install.py --target
rpi1, where lzdoom runs, kept nothing the builder's list for rpi1
omits. The omission now names the cores of the claims folded onto the
entry too.
test_install loads its own install module. Its free-space test ran
main() in process without naming the OS, so on a WSL host main()
entered WSL mode and left _WSL active in that module, for the rest of
the process. Any test of the module run after it, as when the module
is named twice on one command line, read D:\bios as /mnt/d/bios. The
test now runs as Linux and restores _WSL on exit.
An executable is refused unless an emulator profile pins its exact bytes by sha1 or sha256. PICO-8's pico8.exe and SDL2.dll, from the official 0.2.7 archive, are pinned by the lexaloffle profile; md5 and crc32 never vouch for code.