webstation-broker
Emulators

RetroArch core manifest

Which libretro core each RomM platform maps to, and whether it needs a BIOS, firmware, or key file before it will boot.

retroarch_platforms.json lists every RomM platform this repo supports and the libretro core RetroArch uses to run it. (A libretro core is a plugin that lets RetroArch emulate one specific system.) Most cores work as soon as you download them. Some need a BIOS, firmware, or key file dropped into RetroArch's system directory first, or the game just sits on a black screen instead of booting.

This page is a summary specific to this repo, not a replacement for libretro's own documentation. For anything not covered here, or for exact file names and where to get them for each core, check libretro's core-specific BIOS documentation, the authoritative source this table was cross-referenced against.

Setup tiers used below:

  • Required: the core will not boot a real game without this file in place.
  • Optional: the core runs on a built-in HLE (High-Level Emulation) implementation instead of real firmware; a real file only improves accuracy or fixes specific titles.
  • None: nothing to source for this platform.

A few rows are flagged because libretro's hub doesn't list this repo's exact core name (sometimes the core is newer, or just named differently than what the hub uses). Treat those as "check it yourself the first time you run into that platform," not as settled fact.

Nintendo, cartridge and handheld

PlatformCoreSetupDetails
NES / FamicommesenNoneCart dumps boot with nothing extra.
Famicom Disk SystemmesenRequireddisksys.rom in the system dir. Only this platform needs it; plain NES/Famicom carts don't.
SNES / Super Famicomsnes9xNoneNo BIOS concept for this core.
Nintendo 64mupen64plus_nextNone
Game Boy / ColorgambatteOptionalA real boot ROM only changes splash timing; every game plays identically without one.
Game Boy AdvancemgbaOptionalgba_bios.bin fixes a handful of titles that rely on exact BIOS timing; HLE covers the rest.
Virtual Boymednafen_vbNone
Nintendo DSmelondsdsOptionalReal firmware plus bios7.bin/bios9.bin is recommended; the core falls back to a built-in HLE BIOS. The original melonds core is unmaintained and crashes on launch on current buildbot builds, so don't switch back to it.
Nintendo DSimelondsdsRequiredOnly for games that need a DSi. The core picks DSi mode for a DSi-exclusive card or DSiWare and boots anything that also runs on a DS in DS mode, which needs none of these. DSi mode has no built-in fallback and refuses to boot without dsi_bios7.bin, dsi_bios9.bin, bios7.bin and bios9.bin, plus a DSi firmware dump and a DSi NAND dump. The core finds those two by size, not by name, and lists them in its core options. Everything goes in the system dir or a melonDS DS/ folder inside it.

Nintendo, disc and 3D

PlatformCoreSetupDetails
GameCube / WiidolphinOptionalHLE boot by default; a real IPL.bin improves accuracy. Uses a custom save-subtree layout.
3DSazaharOptionalMost dumps boot with nothing extra; encrypted .3ds/.cci files need decryption keys (boot9.bin/boot11.bin) in the system dir. This core comes from a GitHub release instead of libretro's usual build server (the buildbot), and it uses a custom save-subtree layout. This is the only way the broker supports 3DS: standalone Azahar has no IPC (a way for another program to send it commands), so there's no way for the broker to control it (see Azahar setup).

Sega

PlatformCoreSetupDetails
Genesis/MD, Master System, Game Gear, SG-1000genesis_plus_gxNoneAll four cart platforms on this core boot with nothing extra.
Sega Picogenesis_plus_gxNoneCarts boot with nothing extra, but this core's Pico support is incomplete: it plays no ADPCM voice samples.
Sega CDgenesis_plus_gxRequiredRegion CD BIOS (e.g. bios_CD_U.bin). Same core as the row above; only this platform needs it.
32XpicodriveNoneBoot code lives on the cartridge itself.
DreamcastflycastRequireddc_boot.bin and dc_flash.bin, matching the standalone Flycast module's requirement (see Flycast setup).
SaturnyabasanshiroRequiredRegion Saturn BIOS.
Model 3supermodelNoneNo separate BIOS file. Gun games such as L.A. Machineguns need calibrating in the game's Test Menu first.

Sony

PlatformCoreSetupDetails
PlayStationswanstationRequiredRegion BIOS (e.g. scph5501.bin). This core isn't listed on libretro's hub under this exact name because it's a newer core based on DuckStation, but every PS1 core needs a real BIOS file.
PSPppssppNoneThe recommended way to run PSP games, better than the standalone PPSSPP module. PPSSPP emulates the PSP's firmware itself (the HLE from above), so there's no BIOS file to find. The broker automatically links the container's standalone PPSSPP asset tree (/usr/share/ppsspp/assets) into RetroArch's system directory, because the core won't boot without it. This only works if that package is included in your image.

NEC PC Engine

PlatformCoreSetupDetails
PC Engine / TurboGrafx-16mednafen_pceNoneCart dumps boot with nothing extra.
TurboGrafx-CD / PCE-CDmednafen_pceRequiredSystem Card BIOS (e.g. syscard3.pce). Same core as the row above; only the CD add-on needs it.
SuperGrafxmednafen_supergrafxOptionalMost cart dumps run without it; a real SuperGrafx BIOS exists but is not a hard requirement.
PC-FXmednafen_pcfxRequiredpcfx.rom.

SNK and arcade

PlatformCoreSetupDetails
Neo Geo AES / MVSfbneoRequiredneogeo.zip in the system dir, on top of a correct romset (the matching bundle of ROM files the arcade core expects for that game).
Arcade, CPS1, CPS2, CPS3fbneoRequiredNeeds correctly-built, MAME-compatible "non-merged" romsets: each game's own zip file, with the right BIOS files bundled inside it rather than shared across games. This is the hardest platform to get right, because a romset only works if it matches the exact MAME version FBNeo was built against, not just if it has the right files in it.
Neo Geo CDneocdRequiredNeo Geo CD BIOS plus font ROM. Not on libretro's flat BIOS hub table, so double-check the exact filename yourself before assuming one.
Neo Geo Pocket / Colormednafen_ngpNoneFully HLE'd.

Atari

PlatformCoreSetupDetails
Atari 2600stellaNone
Atari 5200a5200Required5200.rom. Libretro's hub doesn't list a core by this exact name (only the generic Atari800 core), but this file is well documented elsewhere.
Atari 7800prosystemOptionalEnables cart-encryption and high-score-save support a few games expect; most run fine without it.
LynxhandyOptionallynxboot.img, only a handful of titles need it.
JaguarvirtualjaguarNoneThe core has no savestates (savestate: false in the platform config), so a session keeps only its .srm.
Jaguar CDvirtualjaguarNoneThe CD BIOS is embedded in the core. Boots a .cue, .chd or .cdi; a folder of a .cue and its .bin tracks boots the .cue. No savestates, and no .srm sync (save_ram: false) until the Memory Track save has been checked.
Atari SThatariRequiredTOS ROM (e.g. tos.img).
Atari 8-bitatari800OptionalReal OS and BASIC ROMs (ATARIXL.ROM, ATARIOSA.ROM, ATARIOSB.ROM, ATARIBAS.ROM) are all optional in the core's own firmware list.

Other handhelds and consoles

PlatformCoreSetupDetails
WonderSwan / Color, Benesse Pocket Challenge V2mednafen_wswanNoneFully HLE'd.
3DOoperaRequiredSystem boot ROM (e.g. panafz10.bin). This system has no HLE fallback, so you need a real boot ROM to play anything.
ColecoVisiongearcolecoRequiredcoleco.rom.
IntellivisionfreeintvRequiredexec.bin plus grom.bin.
VectrexvecxOptionalThe built-in minimal BIOS works; a real bios.bin improves a few titles.
Odyssey2 / Videopaco2emRequiredo2rom.bin, or c52.bin for Videopac+ titles.
Pokémon MinipokeminiOptionalbios.min.
Watara SupervisionpotatorNone
Arcadia 2001amiarcadiaNone
Fairchild Channel FfreechafRequiredsl31253.bin, sl31254.bin and sl90025.bin.
Epoch Super Cassette VisionemuscvRequiredupd7801g.s01. A cartridge dumped in several parts loads from its .0 file, with .1, .2 and .3 beside it. A .cart file showing up in the save directory after a launch is the converted cartridge, and is expected.
Philips CD-isame_cdiRequiredcdimono1.zip in same_cdi/bios/ under the system dir. The core has no savestates, so a session keeps only the per-game NVRAM saves it writes. Boot from a .chd, .cue or .iso.
TI-83numeroRequiredOne of ti83se.rom, ti83plus.rom or ti83.rom in the system dir. Without one the core has nothing to run the .8xp program on. The calculator memory is saved with each game, so every game starts from its own calculator.

Home computers

PlatformCoreSetupDetails
DOSdosbox_pureNoneDOSBox provides its own virtual BIOS.
AmigapuaeRequiredKickstart ROM matching the emulated model (e.g. kick13.rom/kick31.rom).
Amiga CD32puaeRequiredkick40060.CD32 and kick40060.CD32.ext.
Commodore CDTVpuaeRequiredkick34005.A500 and kick34005.CDTV. The broker pins puae_model to CDTV, since PUAE's automatic model boots any disc without an uppercase "CDTV" in its path as a CD32.
Commodore 64vice_x64NoneVICE ships open-licensed replacement ROMs by default; real Kernal/Basic ROMs are optional.
Commodore Plus/4vice_xplus4NoneVICE ships the system ROMs with the core. A folder's .m3u boots ahead of the files beside it.
Commodore VIC-20vice_xvicNoneVICE ships the system ROMs with the core. A folder's .m3u boots ahead of the files beside it.
MSX / MSX2bluemsxRequiredMachine-specific system ROMs (e.g. MSX.ROM, MSX2.ROM, MSX2EXT.ROM, DISK.ROM). Which ones you need varies by region.
ZX SpectrumfuseNoneROM ships bundled with the core.
Apple IIapplewinNone
NEC PC-8801quasi88Requiredquasi88/n88.rom and quasi88/n88_0.rom in the system dir; the other files in that folder (n88_1.rom to n88_3.rom, n88n.rom, disk.rom, the kanji ROMs) are optional.
NEC PC-9801np2kaiOptionalbios.rom, FONT.ROM, itf.rom, sound.rom and the 2608_*.WAV drum samples, in np2kai/ under the system dir. Every one is optional in the core's firmware list.
Sharp X68000px68kRequiredkeropi/iplrom.dat and keropi/cgrom.dat in the system dir; keropi/iplrom30.dat is optional.

Saves, states and imports

RetroArch sorts each core's files into a folder named for the core. The folder takes the name the core reports about itself, which isn't always the core's file name: the dolphin core reports dolphin-emu and the azahar core reports Azahar.

  • In-game saves (SRAM) go in saves/<core name>/<game>.srm.
  • Save states go in states/<core name>/.

The azahar core is the one exception: it nests its own Azahar/ folder under the one RetroArch already sorted it into, landing its SD card and NAND one level deeper, at saves/Azahar/Azahar/. See the 3DS bullet below.

The broker states these settings on every launch, so a setting in your own retroarch.cfg can't move saves away from where every save archive already keeps them. The platform table records each core's reported name as library_name.

A declared import can bring one .srm save into a session only on a platform whose core loads one. The platform table records this as save_ram, taken from a check of each core's source. These 25 platforms take one:

nes, famicom, snes, sfam, n64, gb, gbc, gba, virtualboy, nds, nintendo-dsi, genesis, sms, gamegear, sg1000, sega32, tg16, turbografx-cd, supergrafx, neo-geo-cd, wonderswan, wonderswan-color, jaguar, colecovision and psx.

On nds, the .srm is the melondsds core's NDS cart SRAM, exposed through the standard RETRO_MEMORY_SAVE_RAM libretro call. The older, unmaintained melonds core doesn't expose this; it manages its own .sav file instead.

On psx, the .srm is the SwanStation core's first memory card. The core loads it only while its swanstation_MemoryCards_Card1Type option stays at the default, Libretro. The broker doesn't pin this particular option, so an imported save won't load if it has been changed in RetroArch.

The other platforms refuse a .srm:

  • PSP: the PPSSPP core keeps saves as SAVEDATA folders, not a .srm. The refusal names the standalone PPSSPP module instead.
  • Wii and 3DS: these cores keep saves in folders, not a .srm, and a .srm is refused as unrecognised_layout. Imports place folders here instead: Wii title folders in saves/dolphin-emu/User/Wii/title/, and Azahar's SD card and NAND folders as they already sit in saves/Azahar/Azahar/ (the core nests its own Azahar/ folder under the one RetroArch already sorted it into). What each emulator takes lists the shapes.
  • GameCube: the core keeps saves as GCI files in its own folders, which imports don't place yet. The refusal is shape_unverified.
  • The rest: the core keeps its save in a file of its own, or has none, so it would never read a .srm. The paths below are inside the core's saves/ folder unless noted.
Core (platforms)Where the save is
flycast (dc)VMU files in the system folder, dc/vmu_save_<port>.bin, per game. The broker pins flycast_per_content_vmus to All VMUs; its shared-by-default setting would leak saves between games
fbneo (arcade, cps1, cps2, cps3, neogeoaes, neogeomvs)fbneo/<driver>.fs or .nv, named for the driver
mednafen_ngp (neo-geo-pocket, neo-geo-pocket-color)<game>.flash
handy (lynx)<game>.eeprom
bluemsx (msx, msx2)<game>.sram
opera (3do)opera/per_game/<game>.0.srm
dosbox_pure (dos)<game>.pure.zip
stella (atari2600)stella/nvram/
yabasanshiro (saturn)yabasanshiro/backup.bin, shared by every game
genesis_plus_gx (segacd)scd_<region>.brm, shared by every game of that region
mesen (fds)<game>.ips, a patch against the disk
puae (amiga)written to a substitute disk under saves/, not the mounted image. The broker pins puae_floppy_write_redirect to enabled
puae (amiga-cd32, commodore-cdtv)<game>.nvr, the console's NVRAM (CDTV bookmarks, CD32 game saves), per game
vice_x64, vice_xplus4, vice_xvic, hatari (c64, c-plus-4, vic-20, atari-st)written into the disk image by default; see the write-protection note below
a5200, prosystem, freeintv, vecx, o2em, fuse, genesis_plus_gx (sega-pico)no battery save

The broker renames an imported save after the game being launched, whatever it was called before. A save state isn't imported as a save: send it to PUT /api/session/state-file after activate.

.sav battery saves. Handhelds and sync clients often name a battery save .sav. MinUI and NextUI write <rom>.<ext>.sav, and Grout uploads files under whatever name the device gave them. On 15 platforms the core reads that file the same way it reads its own .srm, so the broker renames it to the .srm and copies the bytes unchanged. The platform table records this as sav_is_srm:

snes, sfam, gb, gbc, gba, virtualboy, nds, sms, gamegear, sg1000, sega32, tg16, turbografx-cd, supergrafx and colecovision.

Four of them have a catch:

  • Game Boy and Game Boy Color: mGBA, VBA-M and cartridge dumpers add the real-time clock to the end of the file. RetroArch drops anything past the core's save size, so the save loads and the game's clock resets.
  • GBA: mGBA works out the save type from its own game database, not from the file's size. A 128 KB gpSP save and a 32 KB cartridge dump both load.
  • NDS: melonDS DS sizes the save from its game database. A file shorter than that is padded with zeros.

On the other platforms that take a .srm, a .sav is refused as needs_conversion, because placing it as the .srm would load the wrong data without any error. mupen64plus_next packs every N64 save type into one .srm, Mesen keeps Bandai EEPROM and CHR-battery saves in other files, and a PlayStation .srm has to be a raw memory card. Send the core's .srm on those platforms. A .rtc, .nv, .eep or .mpk file is refused the same way on every platform that takes a .srm. A platform that takes none gives these files its own refusal instead, which declared imports lists.

NeoCD's backup RAM has a similar problem even though neo-geo-cd takes a .srm import: the core reads and writes its neocd/neocd.srm in the system directory, shared across every game, before it applies the option that would scope it per game. The broker symlinks that fixed path into SAVE_DIR (save_links in the platform table), which brings it under the same per-game archive isolation as everything else.

VICE and Hatari floppy write protection

Unlike PUAE, neither VICE (c64, c-plus-4, vic-20) nor Hatari (atari-st) has a write-redirect option; they can only be told to refuse writes to the mounted disk outright (vice_floppy_write_protection, vice_easyflash_write_protection, hatari_floppy_write_protection). Pinning that on every launch would permanently block in-game floppy/cartridge saves, so the broker only seeds it: the first time a game on any of these platforms launches with no options file on disk yet, write protection is turned on to protect the ROM library by default. After that, whatever value is already on disk is left alone, including a value a player changed from RetroArch's own Quick Menu, so choosing to re-enable in-game saves (at the cost of the ROM being writable) sticks on later launches. This is core_option_seeds in the platform table, resolved against the broker's own options file by _resolve_core_options, as opposed to core_options, which is pinned on every launch and always wins over a same-named seed.

DOSBox Pure mouse

DOSBox Pure's default virtual mouse only moves while RetroArch grabs the mouse (F11). Under the stream, that grab puts the pointer under a lock that drops the absolute mouse positions selkies sends outside Gaming Mode, so the DOS cursor never moves. The broker seeds dosbox_pure_mouse_input to direct on dos, which follows the cursor position and needs no grab. As a seed it only applies to an options file that has never had it: an install that already launched a DOS game keeps its saved value, and switching to "direct" there is a Quick Menu change. A player who wants the virtual mouse back can pick it there too.

Choosing a core

Every platform above maps to one libretro core, the one listed in its table. An operator can ask for a different core on that platform instead, in RomM's config.yml, shorthand or block form:

platforms:
  snes: retroarch:bsnes      # shorthand: emulator:core, split on the first ':'
  n64:                       # block form
    emulator: retroarch
    core: parallel_n64

snes: retroarch with an indented core: under it is invalid YAML; use one of the two forms above.

core: needs a RomM release newer than 5.3.1. RomM 5.3.1 and older read the shorthand retroarch:bsnes as the emulator's name and send it to the broker whole, and every launch on that platform fails with a 422 unknown emulator naming the upgrade. The block form's core: key is ignored with a warning there, so the platform keeps its default core. Until you upgrade, set the platform to plain retroarch.

Tiers

core: accepts one of four kinds of core:

  • default: the platform's own core from the tables above, the one this repo has tested the most (the "best tested" core in the table below).
  • vetted: an alternate this repo has specifically tested on that platform.
  • untested: any other core in the catalog that shares a file extension with the platform. It launches with every feature a vetted core has, but the broker can't be certain of its save layout ahead of time, so it launches with a warning and a checked, rather than fixed, save/state location. It boots only files with one of those shared extensions, or a .zip or .7z holding one, which RetroArch unpacks before the core sees it.
  • blocked: a core this repo has confirmed is broken on that platform. It refuses to launch unless you opt in: experimental_cores: true on the container or on a platform block in RomM's config.yml (the platform wins), or RETROARCH_EXPERIMENTAL_CORES=true on the broker container. Either is enough, and neither is on by default.

Finding your options

  • GET /api/retroarch/cores?platform=<slug> lists every core offered on a platform, its tier, whether it's verified, and its library_name (the folder it sorts saves and states into, only the catalog's guess for an untested or blocked core, and null for a name activate would leave out); leave platform off to get every platform at once. It needs the X-Broker-Secret header, and a platform RetroArch has no core for answers 404.
  • scripts/sync_core_info.py --tiers [--platform <slug>] prints each core's tier and display name from the command line, for every platform or just one.

Saves and states when switching cores

  • An in-game save (.srm) carries over automatically when one exists for the old core and the new core also takes one; RetroArch writes it into the new core's own save folder from then on. Switching back later carries it the other way.
  • On an untested or blocked core the save is copied, not moved, because that core's save folder is a guess until it writes there. The original stays in the old core's folder.
  • A carry never replaces a save that is as new as the incoming one. When the incoming save is newer, the one it replaces is kept beside it as <game>.srm.bak.
  • A save state never carries over. A state left behind by another core is never loaded, even if one still exists on disk for it.
  • The pre-switch archive isn't deleted: it stays in RomM's own save picker, so switching cores never loses access to what was there before.

Report how a core works

Tried a core, or want to know how it did for someone else first? File a report: Report how a core works.

A core moves from untested to vetted once it passes this repo's own vetting test and has a few reports backing it up. A core moves to blocked once a report confirms it's actually broken on that platform.

A default core tagged (untested) in the table below belongs to a platform nobody has booted a real game on yet. It launches like any other, but the broker logs a warning each time and the cores route reports it as unverified. The tag comes off once a report confirms it works.

Core tiers

Generated by scripts/sync_core_info.py --docs; run it after changing retroarch_core_tiers.json or the platform table, and commit the result.

PlatformDefault (best tested)VettedBlockedUntested
3doopera--87
3dsazahar--12
amigapuae--43
amiga-cd32puae--88
appleiiapplewin--18
arcadefbneo--81
arcadia-2001amiarcadia--97
atari-jaguar-cdvirtualjaguar--41
atari-sthatari--52
atari2600stella--58
atari5200a5200--59
atari7800prosystem--58
atari8bitatari800--102
benesse-pocket-challenge-v2mednafen_wswan--57
c-plus-4vice_xplus4 (untested)--107
c64vice_x64--44
colecovisiongearcoleco--63
commodore-cdtvpuae (untested)--88
cps1fbneo--55
cps2fbneo--55
cps3fbneo--55
dcflycast--96
dosdosbox_pure--98
epoch-super-cassette-visionemuscv--63
fairchild-channel-ffreechaf--97
famicommesen--7
fdsmesen--5
gamegeargenesis_plus_gx--60
gbgambatte--20
gbamgba--9
gbcgambatte--20
genesisgenesis_plus_gx--80
intellivisionfreeintv--63
jaguarvirtualjaguar--64
lynxhandy--5
model3supermodel--55
msxbluemsx--56
msx2bluemsx--56
n64mupen64plus_next--17
ndsmelondsds-melonds5
neo-geo-cdneocd--41
neo-geo-pocketmednafen_ngp--1
neo-geo-pocket-colormednafen_ngp--1
neogeoaesfbneo--55
neogeomvsfbneo--55
nesmesen--7
ngcdolphin--48
nintendo-dsimelondsds-melonds5
odyssey-2o2em--58
pc-8800-seriesquasi88--42
pc-9800-seriesnp2kai--59
pc-fxmednafen_pcfx--63
philips-cd-isame_cdi (untested)--45
pokemon-minipokemini--0
pspppsspp--47
psxswanstation--105
saturnyabasanshiro--96
sega-picogenesis_plus_gx (untested)--59
sega32picodrive--59
segacdgenesis_plus_gx--66
sfamsnes9x--80
sg1000genesis_plus_gx--61
sharp-x68000px68k--78
smsgenesis_plus_gx--60
snessnes9x--80
supergrafxmednafen_supergrafx--42
supervisionpotator--97
tg16mednafen_pce--5
ti-83numero (untested)--0
turbografx-cdmednafen_pce--63
vectrexvecx--59
vic-20vice_xvic (untested)--110
videopac-g7000o2em--58
virtualboymednafen_vb--59
wiidolphin--48
wonderswanmednafen_wswan--2
wonderswan-colormednafen_wswan--2
zxsfuse--20

Source

Generated from webstation_broker/emulators/retroarch_platforms.json and webstation_broker/emulators/retroarch.py, cross-referenced against libretro's BIOS Information Hub. Update this table if platform mappings, core_source overrides, assets, save_subtrees, library_name, save_ram, sav_is_srm, savestate, core_options, core_option_seeds, or save_links fields change in retroarch_platforms.json.

On this page