Skip to content

Save File Extensions

Research results for which save file extensions RetroDECK cores produce, and what our plugin needs to support. This informs the implementation of #196.

Historical — the extension table this page designed no longer exists

The plugin held a per-system list of save extensions, and this page is the research behind it. That list is retired. The plugin now asks the machine which files a game's save consists of, per game and per the emulator that will launch it, and reads the answer fresh on every sync — see Save File Discovery, Save sync coverage and ADR-0034.

Measuring the same systems against that live reading showed the table was wrong in both directions, and wrong in a way a table cannot fix: the answer depends on the game file's own extension. An Amiga .adf keeps its save inside the disk image, so there is no .nvr to find; an Amiga .hdf establishes nothing at all. A Sega CD .chd is a shared card that no per-game sync can carry, while a .bin is a per-game .srm. 3DO's real name carries a version digit (<rom>.0.srm) the table never had, and Saturn's third extension turned out to be console configuration rather than progress, and is no longer synced.

What stays here is the research: which extensions each core writes, and what was recommended for each at the time. Do not use it to predict what syncs today — the Save sync support matrix is the broader view, and your own machine is the authority.

How RetroArch Save Extensions Work

RetroArch has two save mechanisms:

  1. Standard libretro saves (libretro_saves = "true" in core info): RetroArch handles all file I/O. The extension is hardcoded to .srm (SRAM) and .rtc (real-time clock). The core exposes memory via RETRO_MEMORY_SAVE_RAM / RETRO_MEMORY_RTC, and RetroArch writes the files. Every core using this mechanism produces identical extensions.

  2. Core-managed saves (libretro_saves = "false" or absent): The core handles its own file I/O, writing to RetroArch's save directory with custom extensions. RetroArch has no control over these filenames.

This means .srm/.rtc covers the vast majority of cores. Only a handful of cores use custom extensions.

RetroDECK Core Inventory

Checked against RetroDECK's installed cores (March 2026). Only cores relevant to save file sync are listed.

Cores Using Standard .srm/.rtc (libretro_saves = true)

These cores all produce .srm (and optionally .rtc). No additional extensions needed.

Platform Cores Notes
GB/GBC gambatte, sameboy, gearboy, tgbdual, fixgb, DoubleCherryGB .rtc used by the cartridges that carry a real-time clock
GBA mgba, vbam, vba_next, skyemu All GBA save types (EEPROM, SRAM, Flash) packed into single .srm
NES fceumm, nestopia, mesen Battery-backed saves
SNES snes9x (all variants), bsnes (all variants), supafaust, mednafen_snes, mesen-s Standard SRAM
N64 mupen64plus_next, parallel_n64 Packed format: EEPROM + 4 Memory Paks + SRAM + FlashRAM all in one .srm (290KB)
Genesis/MD genesis_plus_gx, genesis_plus_gx_wide, picodrive, blastem, clownmdemu Cartridge backup
PSX mednafen_psx_hw, mednafen_psx, pcsx_rearmed, swanstation Memory card 0 as raw 128KB .srm
Saturn mednafen_saturn, kronos, yabasanshiro, yabause Standard save
DS desmume, desmume2015, melondsds, melonds See DeSmuME special case below
PC Engine mednafen_pce_fast, mednafen_pce, mednafen_supergrafx Standard save
Lynx handy Standard save
NGP/NGPC mednafen_ngp, race Standard save
Virtual Boy mednafen_vb Standard save
WonderSwan mednafen_wswan Standard save
3DO opera NVRAM
Jaguar virtualjaguar Standard save
Pokemon Mini pokemini Standard save

Cores With Special Extension Behavior

DeSmuME (DS) -- .dsv

  • libretro_saves = "true", so default is .srm
  • However, DeSmuME has a dual-mode: its BackupDevice class can write .dsv (DeSmuME's native format) when configured in Mednafen-compatibility mode
  • The core will also fall back to loading .sav files if .dsv is not found
  • Action: Add .dsv as platform override for DS, so we pick up saves from users who switched modes

Genesis Plus GX (Sega CD) -- .brm

  • libretro_saves = "true" for cartridge SRAM (standard .srm)
  • But Sega CD BRAM (backup RAM) is managed by the core separately as .brm files
  • These include: cart.brm (cartridge backup RAM) and region-specific system BRAM (scd_U.brm, scd_E.brm, scd_J.brm)
  • The per-game BRAM uses the standard rom-name .brm pattern
  • Action: Add .brm as platform override for Sega CD

Flycast (Dreamcast) -- .bin

  • No libretro_saves field in core info -- uses its own VMU format
  • Produces vmu_save_{A1-D1}.bin files and dc_nvmem.bin
  • Multi-slot VMU support (games can produce multiple .bin files)
  • Action: Not included in extension expansion. Syncing a shared card is #901; switching Flycast onto per-game VMUs is #1645.

MAME / FBNeo (Arcade) -- .nv

  • libretro_saves = "false" for all MAME/FBNeo cores
  • MAME manages its own NVRAM system (writes to SAVEDIR/mame/NVRAM/)
  • Not using RetroArch's standard save path at all
  • Action: Not relevant for save sync. MAME saves use a completely different directory structure.

gpsp (GBA) -- no libretro_saves

  • libretro_saves = "false" -- manages its own saves
  • In practice, gpsp writes .sav files in its own format
  • However, mgba/vbam are the recommended GBA cores in RetroDECK
  • Action: Add .sav defensively to GBA overrides for gpsp users

mednafen_gba (Beetle GBA) -- custom format

  • No libretro_saves field -- uses Mednafen's native format
  • Can write .{md5}.sav and .{md5}.eep with MD5 hash in filename
  • Has a dual mode: Mednafen method (own files) vs libretro method (.srm)
  • Rarely used in RetroDECK (mgba is the default)
  • Action: Not worth supporting the MD5-hashed filenames. Users of this core should use libretro mode.

Comparison With Other RomM Clients

Grout (Go client)

Uses a flat global allowlist of 11 extensions with no per-platform mapping:

.srm, .sav, .dsv, .mcr, .mcd, .brm, .eep, .sra, .fla, .mpk, .nv

This is intentionally broad -- Grout targets multiple CFWs (muOS, NextUI, MinUI) where standalone emulators produce these formats. For RetroArch-only setups like RetroDECK, most of these are unnecessary.

Argosy (Android client)

Uses a per-emulator mapping:

Emulator Extensions
RetroArch .srm, .sav
Mupen64Plus FZ (standalone) .sra, .eep, .fla, .mpk
DraStic (standalone DS) .dsv, .sav
melonDS (standalone) .sav
DuckStation (standalone) .mcd
MAME .nv

Again, standalone emulator formats that don't apply to RetroDECK's RetroArch-based setup.