verified against source: fuse flat (not fuse/), ep128emu/roms/ (not rom/). added xrick system, np2kai FONT.ROM uppercase variant, coleco.rom alias. quasi88 alt naming verified in quasi88-libretro/src/LIBRETRO/libretro.c:108-117. 61 systems, 445 files, 0 missing on all platforms.
Platform Configs
How platform YAML files work and where subdirectory requirements come from.
Files
_registry.yml-- platform metadata (name, status, display order)_shared.yml-- shared file groups with canonical destinations<platform>.yml-- per-platform BIOS declarations- Inheritance:
lakka.ymlinheritsretroarch,retropie.ymlinheritsretroarch
Shared groups (_shared.yml)
The subdirectory a BIOS goes into is determined by the libretro core, not
the platform. NP2kai expects np2kai/BIOS.ROM whether you're on RetroArch,
Batocera, or Recalbox. Only base_destination varies (system/ vs bios/).
Shared groups define files with correct destinations once. Platforms
reference them via includes: [group_name] in their system definitions.
load_platform_config() in common.py resolves includes at load time,
deduplicating by filename.
When to use shared groups: whenever 2+ platforms share files that a core expects in a specific subdirectory. The group carries the correct destination so platforms can't drift.
For RetroArch specifically, libretro_scraper.py injects includes:
references and applies subdirectory prefixes via CORE_SUBDIR_MAP during
generation. Manual edits to retroarch.yml will be overwritten on next scrape.
Subdirectory reference
Each entry documents where the requirement comes from. Check these source files to verify or update the paths.
| Core | Subdirectory | Source |
|---|---|---|
| NP2kai | np2kai/ |
libretro-np2kai/sdl/libretro.c |
| PX68k | keropi/ |
px68k/libretro/libretro.c |
| QUASI88 | quasi88/ |
quasi88/src/libretro.c |
| Kronos | kronos/ |
libretro-kronos/libretro/libretro.c |
| ep128emu | ep128emu/rom/ |
ep128emu-core/src/libretro.cpp |
| Flycast | dc/ |
flycast/shell/libretro/libretro.cpp |
| FBNeo NeoCD | neocd/ |
fbneo/src/burn/drv/neogeo/neo_run.cpp |
| Fuse | fuse/ |
fuse-libretro/fuse/settings.c |
| hatari | hatari/tos/ |
hatari/src/tos.c |
Full libretro docs: https://docs.libretro.com/library/<core>/
Adding a platform
- Create
platforms/<name>.yml - Set
base_destination(systemorbios),verification_mode,hash_type - Use
includes: [group]for systems with subdirectory requirements - Use
inherits: retroarchto share RetroArch's file set - Add platform-specific overrides in
overrides.systems - Test:
python scripts/verify.py --platform <name>
Adding a shared group
- Add the group to
_shared.ymlwith a source ref comment - Include: filename, destination with subdirectory prefix, required flag, hashes
- Reference via
includes: [group_name]in platform system definitions - For scraper-generated platforms, add the mapping in the scraper's
SYSTEM_SHARED_GROUPSdict so it persists across regeneration
Verification modes
| Platform | Mode | Native logic | Upstream source |
|---|---|---|---|
| RetroArch | existence | path_is_valid() -- file exists |
core_info.c |
| Lakka | existence | inherits RetroArch | idem |
| RetroPie | existence | inherits RetroArch | idem |
| Batocera | md5 | md5sum() + checkInsideZip() |
batocera-systems |
| RetroBat | md5 | MD5 check via JSON config | batocera-systems.json |
| EmuDeck | md5 | MD5 whitelist per system | checkBIOS.sh |
| Recalbox | md5 | multi-hash comma-separated | es_bios.xml + Bios.cpp |