v2026.04.02/platforms
Abdessamad Derraz 36f6ad1379 fix: correct stale scummvm.zip and cpc464.rom hashes
RetroDECK had stale buildbot hash a17e0e01 for scummvm.zip
(from old 9.5MB build, current is 79MB) copied to cpc464.rom.
RomM had same stale hash. Updated to current verified values.
All 8 platforms now 100% OK, 0 untested.
2026-03-29 09:52:32 +02:00
..
targets feat: add batocera standalone overrides for wine-dependent emulators 2026-03-27 12:18:08 +01:00
_data_dirs.yml feat: complete fbneo samples (49 small + 3 large) 2026-03-29 01:24:25 +01:00
_registry.yml feat: add install metadata to platform registry 2026-03-28 17:58:05 +01:00
_shared.yml feat: platform-core registry for exact pack generation 2026-03-19 16:10:43 +01:00
batocera.yml fix: correct sc3000, plus3 and plus3e hashes in platform configs 2026-03-27 17:47:39 +01:00
bizhawk.yml fix: bizhawk scraper lowercase sha1 + complete bios 2026-03-28 11:49:52 +01:00
emudeck.yml fix: emudeck scraper outputs cores field, base_scraper uses generate_platform_yaml 2026-03-27 12:27:51 +01:00
emulatorjs.yml feat: add doom engine wad files, emulatorjs base config 2026-03-25 23:12:53 +01:00
lakka.yml v2: automated BIOS platform with full pipeline 2026-03-17 10:54:39 +01:00
README.md feat: add doom engine wad files, emulatorjs base config 2026-03-25 23:12:53 +01:00
recalbox.yml feat: platform-core registry for exact pack generation 2026-03-19 16:10:43 +01:00
retroarch.yml fix: fbneo data dir paths (hiscore, samples) 2026-03-29 06:50:36 +02:00
retrobat.yml fix: case-sensitive packs for linux platforms, remove empty bios placeholder 2026-03-27 12:58:08 +01:00
retrodeck.yml fix: correct stale scummvm.zip and cpc464.rom hashes 2026-03-29 09:52:32 +02:00
retropie.yml v2: automated BIOS platform with full pipeline 2026-03-17 10:54:39 +01:00
romm.yml fix: correct stale scummvm.zip and cpc464.rom hashes 2026-03-29 09:52:32 +02:00

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.yml inherits retroarch, retropie.yml inherits retroarch

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.

Data directories (_data_dirs.yml)

Some cores need entire directory trees, not just individual BIOS files. Dolphin needs dolphin-emu/Sys/ (GameSettings, DSP firmware, fonts), PPSSPP needs PPSSPP/ (font assets, shaders), blueMSX needs Databases/ and Machines/ (machine configs).

These are defined in _data_dirs.yml as a central registry with upstream source URLs. The pack generator auto-refreshes from upstream before building (use --offline to skip). Data directories live in data/ (not bios/) and are NOT indexed in database.json.

Adding a data directory:

  1. Add entry to _data_dirs.yml with source URL, extraction path, cache location
  2. Reference via data_directories: [{ref: key, destination: path}] in platform systems
  3. For scraper-generated platforms, add to SYSTEM_DATA_DIRS in the scraper
  4. Run python scripts/refresh_data_dirs.py --key <name> to populate the cache

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

  1. Create platforms/<name>.yml
  2. Set base_destination (system or bios), verification_mode, hash_type
  3. Use includes: [group] for systems with subdirectory requirements
  4. Use inherits: retroarch to share RetroArch's file set
  5. Add platform-specific overrides in overrides.systems
  6. Test: python scripts/verify.py --platform <name>

Adding a shared group

  1. Add the group to _shared.yml with a source ref comment
  2. Include: filename, destination with subdirectory prefix, required flag, hashes
  3. Reference via includes: [group_name] in platform system definitions
  4. For scraper-generated platforms, add the mapping in the scraper's SYSTEM_SHARED_GROUPS dict 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
RetroDECK md5 MD5 per file via component manifests api_data_processing.sh
RomM md5 size + any hash (MD5/SHA1/CRC32) firmware.py