KNULLI's RetroArch is Batocera's build with its core downloader on.
Its armv7 hard-float boards (atm7039, r16, rk3128) fetch from buildbot
linux/armhf: atm7039's shipped retroarch.cfg hides the menu entry but
leaves the URL, and Settings offers the entry back. Its aarch64 boards
get no buildbot URL. ecwolf, squirreljme, stella2014 and vemulator come
back as installable cores, and openmsx, which no buildbot list carries,
stays out.
Batocera builds RetroArch with its core downloader (configure defaults,
qb/config.params.sh:149-150), shown in the menu since it is no Lakka
build (config.def.h:743-745), and configgen sets no URL, so the compiled
one applies: buildbot linux/x86_64 or linux/armhf, none on aarch64
(config.def.h:1855-1861). The targets scraper names that list per board
(downloads, an armv7-A CPU read from arch/Config.in.arm), the builder
and the published target lists add it, and the platform names the union
as installable_cores. applewin, gong, squirreljme and vemulator come
back that way. A build option that compiles the downloader out, or a
shipped retroarch.cfg that blanks its URL, turns it off.
ROCKNIX listed retroarch, which stood for every libretro profile (351
resolved), while its devices build 124 libretro packages. The platform
list now names the cores those packages install on at least one device.
The targets scraper read a package's name as its core: vice-lr installs
vice_x128, vice_x64, vice_xpet, vice_xplus4 and vice_xvic, which reached
no device. It now reads each package's makeinstall_target, the file
copied to ${INSTALL}/usr/lib/libretro under its target name, through
TARGET_ARCH and ENABLE_32BIT (pcsx_rearmed-lr, desmume-lr). 155
profiles resolve, each built by a device, and no device loses one.
No Batocera board turns on BATOCERA_CORES_STILL_COMMERCIALIZED or
BATOCERA_CORES_EXPERIMENTAL (Config.in:109, 1670), so citron, ryujinx,
applewin and eka2l1 are not built, and freej2me, gong, squirreljme, uqm
and vemulator are selected by no Kconfig file at batocera-43.1. Read
with every sourced Kconfig file, the Pi 4 boards gain dxx-rebirth,
sonic2013, soniccd and xroar (mesa3d-rpi4 gives them OpenGL).
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.
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.
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.
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.
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.
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.
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.
- The installer speaks without "you": the first screen asks "Where
to install?", rows read "Copy the BIOS files from an old card or a
folder", a close match reads "Close matches: ...". The handheld
launchers and their port text follow, and the pronoun guard no
longer lists any installer message.
- A setup that runs as an app opens on its one-line command, the
folder table after it; a setup that runs on its own device keeps
the network folder first, which its ZIP route needs.
- The home steps say what to do: "Its page gives one line to copy",
"Paste it, press Enter".
RetroPie 427e7621, ROCKNIX 20261101 (ES f6c54287 from the
ui/emulationstation package.mk) and RomM 5.4.1, the revisions the
platform files were scraped at. RetroPie now builds pico-8 with
lr-fake08, ROCKNIX adds SDM845 to three device conditions.
- The installer says "Every file on the list is in place." where it
said "Everything is in place.": a check covers the files the
collection holds, and the required ones it lacks follow.
- The FAQ, first install, legal and home pages state only what the
code shows (PlayStation 1 and Saturn run without a BIOS on some
emulators, save files are never touched, records are added).
- MinUI and MyMinUI show their own boot logos, and the Android,
Linux handheld and iPhone tiles show the Android robot, Tux and a
plain device icon, each credited in sources.json.
- Each Markdown copy, llms.txt and llms-full.txt name the commit
they were built from, version.json the current one, and the
answering rules tell assistants to fetch a stale copy again.
- The deploy lists the pages whose words changed (digests.json) and
posts them to IndexNow once the site is live.
--installed-cores treated a core with no profile as one that reads no
file, and dropped dc/dc_boot.bin for parallel_dc without a word (issue 87).
Such a core is now named, and the firmware its RetroArch .info declares is
kept. core_names lists every core a platform runs, so a profile with no
file is not reported unknown.
parallel_dc (libretro/flycast renamed), hyperscanemu, hypseushw, n64emu
and odin reached the RetroArch buildbot after the last targets scrape and
resolved to no profile. Targets rescraped, each core profiled from its
source.
ArkOS ran the GBA with gpsp_ezode_mod and dArkOS with mgba_rumble: no
profile named them, so an install for the card's games kept every GBA
core's files, FBNeo's 3,472 data files among them. Each rename proven
from the OS build (same code base, same BIOS loading) joins its
profile's cores. The resolver folds either separator, and falls back to
the emulator column when the core names a mode, a machine or a plugin
of that program, only where its profile declares the folder's system:
MAME documents no GameKing ROM. 109 unresolved names are 56, each one
recorded with why in tests/test_games_index.py.
--yes alone installed the whole list, 6.4 GB on a dArkOS card holding
two games, while the screen offers what the games need first. A run that
asks nothing now takes that first choice when the card holds games, and
says so. --all-files installs the whole list. A run given its list
(the screen's own runs) or narrowed by name is unchanged.
The manifest names the cores that read a tree no platform system
declares, every reader of a shared tree included. An install for the
games of a card keeps such a tree only when its plan runs one of them:
a SNES game on ArkOS (snes9x) no longer takes FBNeo's cheats and samples.
A system no setup names a core for keeps every core's tree.
The name step reused one variable for paths and for (path, md5, size)
tuples, the standalone copies reused targets inside its own loop, and
the WSL state read as object. Ten baseline entries no longer occur.
Main changed install.py without the launcher index, so --add-app
refused every launcher and nine tests failed on main itself. The demo
script added a list without a type, and an archive-size test still
built the data-tree refs without the needed flag the builder reads.
--for-games --required-only on a dArkOS card from a computer kept every
file of the list: --dest skipped the card's detection, so its rom
folders were never found. The games part beside the BIOS folder now
names them. The manifest marks a data tree every core runs without
(optional), and --required-only leaves it out: one GBA and one SNES game
took FBNeo's cheats and samples, 3,472 files no game opened.
Mini vMac opens no MinivMacBootv2.dsk at babdf7b5: disks come from a .cmd
(libretro-core.c:181-195) or disk1.dsk to disk9.dsk
(OSGLUERETRO.c:563-579). The name is the one Recalbox's configgen writes
into its .cmd, already recorded in its launchers: layer. Nine manifests
no longer send the 24 MB image to platforms that never open it.
dsi_bios7.bin and dsi_bios9.bin hold the DSi Panda devkit boot ROMs, eMMC
key-Y zeroed. Every md5 and crc32 declared under those names designates
a retail dump in the same directory, yet hashless entries (RetroBat,
dsperate) got the devkit ROMs by name. by_proven_name maps such a name to
the proven primaries beside it. kick13.rom, dsi_firmware.bin and
spectrum.zip follow the same rule.