feat: shared groups, scraper subdir prefixes, arcade + emulator profiles

shared groups in _shared.yml: np2kai, keropi, quasi88, kronos, ep128emu
with source references for each subdirectory requirement.

libretro_scraper: CORE_SUBDIR_MAP applies subdirectory prefixes at
generation time (np2kai/, keropi/, dc/). EXTRA_SYSTEMS adds QUASI88.
SYSTEM_SHARED_GROUPS injects includes for kronos/np2kai/keropi.

new BIOS: CPS3 (23 ZIPs), Cannonball OutRun (40 ROMs), PCem PC BIOS
(73 files), VICE Commodore ROMs, Spectrum ZIPs, dc_bios.bin, X1 fonts.

new emulator profiles: redream, melonds_ds, lrps2 with doc vs source
notes. platforms/README.md documents shared groups architecture.
This commit is contained in:
Abdessamad Derraz
2026-03-18 13:49:59 +01:00
parent 7653d5d108
commit c71378a71c
207 changed files with 3074 additions and 44 deletions

77
platforms/README.md Normal file
View File

@@ -0,0 +1,77 @@
# 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.
## 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` |