Skip to content

ROM library & emulators (ES-DE on av)

The single source of truth for game ROMs on the gaming box is /opt/games/roms-flat/, owned by guest (group gamers). ES-DE reads it via ~guest/ROMs/opt/games/roms-flat (ES-DE's ROMDirectory is empty, so it defaults to ~/ROMs). Standalone RetroArch (guest-only) reads the same tree. Session/host wiring is in session-setup.md; PS3/RPCS3 specifics in rpcs3.md.

/opt/games/                      (root:gamers, setgid)
└── roms-flat/                   (guest:gamers)  ← the only ROM tree
    ├── arcade/  gb/  gbc/  gba/  gc/  genesis/  n64/  nes/
    ├── ps3/  psx/  snes/  steam/  xbox/
    └── lost-cart-roms-2026-07-26.tsv   ← manifest of ROMs lost in the incident below

Ownership model

Everything under roms-flat is guest-owned. There is intentionally one tree — no skill-lava-owned duplicate. RetroArch is only ever run as guest.

Per-system emulators

System dir Emulator (how) Notes
nes RetroArch mesen pacman /usr/lib/libretro
snes RetroArch snes9x pacman
gb gbc gba RetroArch mgba pacman
genesis RetroArch genesis_plus_gx pacman
n64 RetroArch mupen64plus_next pacman
psx RetroArch mednafen_psx_hw (beetle) pacman
gc Dolphin pacman dolphin
ps3 RPCS3 (standalone AppImage) see rpcs3.md
steam Steam launchers see session-setup.md
arcade RetroArch mame (current) see below
xbox xemu (standalone) see below

Emulator install policy on this box: system packages via pacman/AUR (paru), not loose AppImages. The one sanctioned exception is RetroArch's own core downloader (libretro buildbot → ~guest/.config/retroarch/cores). RPCS3 is a pre-existing AppImage exception documented in rpcs3.md.

RetroArch (guest-only)

  • Cores: pacman libretro-* in /usr/lib/libretro, plus the MAME core in ~guest/.config/retroarch/cores (see below). libretro_directory points at the latter; ES-DE's CORE_RETROARCH search path includes both.
  • Playlists (~guest/.config/retroarch/playlists/*.lpl) and rgui_browser_directory point at /opt/games/roms-flat. Pre-consolidation backups: playlists.bak-20260726020955 and retroarch.cfg.bak-20260726020955.

MAME / Arcade

  • 572 curated classic-arcade romsets in roms-flat/arcade/ (parents; a merged set keeps clones inside the parent zip). Extracted from ~skill-lava/Downloads/mame.tar (the full MAME 0.257 merged set, 14,345 romsets — mostly unplayable fruit/mechanical machines, so it is not wired in wholesale).
  • Core: mame_libretro.so (MAME 0.287) from the libretro buildbot in ~guest/.config/retroarch/cores. ES-DE's arcade system defaults to "MAME - Current" → this core.
  • ⚠️ Version gap: core is 0.287, romsets are 0.257 (~30 versions). Most classic parents boot fine; a handful may fail audit. Swap individual sets if needed.
  • Names: ES-DE auto-translates romnames → real titles via its bundled /usr/share/es-de/resources/MAME/mamenames.xml (no gamelist/scrape needed).
  • BIOS: neogeo.zip, pgm.zip, decocass.zip live in arcade/ (needed by Neo Geo / PGM / DECO games) and are hidden from the menu via ~guest/ES-DE/gamelists/arcade/gamelist.xml.
  • Add more: the curated 572-romname set is recorded in mame-arcade-set.txt; to add a title, extract its zip from mame.tar into roms-flat/arcade/ as guest.

Xbox / xemu

  • xemu installed from the AUR (xemu-bin, via paru), system-wide at /usr/bin/xemu. ES-DE's xbox system launches xemu -dvd_path <iso>.
  • BIOS/HDD (user-supplied, copyrighted — from Xbox-Emulator-Files.zip) live in ~guest/.local/share/xemu/xemu/: mcpx_1.0.bin (MCPX boot ROM), Complex_4627.bin (1 MB flash BIOS), xbox_hdd.qcow2 (pre-formatted FATX HDD). eeprom.bin is auto-generated. Wired via xemu.toml [sys.files] in the same dir.
  • Games: roms-flat/xbox/*.iso (XISO). Currently: Fuzion Frenzy (USA).iso.
  • Add more: drop the .iso in roms-flat/xbox/ as guest.

⚠️ Incident 2026-07-26 — cartridge ROMs lost during consolidation

The pre-consolidation layout had two trees: /opt/games/roms (skill-lava-owned, folder-per-game — the real files) and /opt/games/roms-flat (guest-owned). For the cartridge systems, roms-flat entries were symlinks into roms, not copies. While consolidating to a single guest-owned tree, /opt/games/roms was deleted — which destroyed the real files behind those symlinks: 3,618 ROMs across gb gbc gba nes snes genesis n64 psx (~11 GB). GameCube, PS3, Steam, and the new Arcade/Xbox sets were unaffected (real files).

  • No btrfs snapshots existed (no snapper/timeshift) → no restore point.
  • The 3,618 dangling symlinks are intentionally left in place (user's choice) as an in-tree marker; a full manifest (system + No-Intro filename + original path) is saved durably at /opt/games/lost-cart-roms-2026-07-26.tsv and in docs/gaming/recovery/.
  • Recovery plan: re-download the standard No-Intro sets and drop real files into roms-flat/<system>/ matching the manifest's flat_filename. The dangling symlinks should be cleared first (they'd shadow the new files).

Lesson: before deleting a tree that another is "a copy/flatten of", verify the other tree's entries are real files, not symlinks pointing into it (find … -xtype l); a name-only presence check (os.listdir) counts symlink names as present and hides exactly this failure.