Apollo Save Tool VMC Formats for PS1 and PS2: Complete Format Support Guide
Apollo Save Tool supports 10 PS1 virtual memory card extensions (.VMP, .MCR, .VM1, .BIN, .VMC, .GME, .VGS, .SRM, .MCD) and 7 PS2 VMC extensions (.VM2, .CARD, .PS2, .VMC, .BIN, .MC2, .MCD), handling them through platform-specific import/export functions in source/exec_cmd.c with automatic ECC detection in source/mcio.c.
Apollo Save Tool (bucanero/apollo-ps4) provides comprehensive virtual memory card management for PlayStation 1 and PlayStation 2 saves on PS4 hardware. The tool detects VMC files through extension-based scanning and processes them using dedicated import/export pipelines that handle both raw and ECC-protected formats.
Supported Apollo Save Tool VMC Formats
PS1 Virtual Memory Card Extensions
Apollo Save Tool recognizes 10 distinct file extensions for PS1 virtual memory cards. These formats represent various legacy save types from different emulators and official Sony tools:
- .VMP – Official Sony PS1 VMC format with ECC
- .MCR – Standard raw memory card dump
- .VM1 – Raw PS1 VMC format
- .BIN – Generic binary memory card image
- .VMC – Generic virtual memory card container
- .GME – DexDrive memory card format
- .VGS – Connectix VGS emulator format
- .SRM – RetroArch/libretro save format
- .MCD – Common emulator memory card format
PS2 Virtual Memory Card Extensions
For PlayStation 2 saves, the tool supports 7 extensions with full awareness of ECC (Error Correction Code) variants:
- .VM2 – PS2 virtual memory card format
- .CARD – Standard PS2 memory card image
- .PS2 – Generic PS2 memory card dump
- .VMC – Cross-platform virtual memory card container
- .BIN – Raw binary memory card image
- .MC2 – PS2 memory card format
- .MCD – ECC-aware memory card format
The tool automatically detects whether a PS2 VMC uses ECC protection by examining the CF_USE_ECC flag in the card header.
How Apollo Save Tool Detects VMC Files
When scanning USB or USB-HDD paths, Apollo Save Tool calls scan_vmc_files() in source/saves.c. This function validates filenames against the supported extension list using case-insensitive string matching:
/* source/saves.c – lines 1619-1625 */
if (dir->d_type != DT_REG ||
!(endsWith(dir->d_name, ".CARD") || endsWith(dir->d_name, ".VM2") ||
endsWith(dir->d_name, ".BIN") || endsWith(dir->d_name, ".PS2") ||
endsWith(dir->d_name, ".VMC") || endsWith(dir->d_name, ".MC2") ||
// PS1 VMCs
endsWith(dir->d_name, ".MCD") || endsWith(dir->d_name, ".MCR") ||
endsWith(dir->d_name, ".GME") || endsWith(dir->d_name, ".VM1") ||
endsWith(dir->d_name, ".VMP") || endsWith(dir->d_name, ".VGS") ||
endsWith(dir->d_name, ".SRM")))
continue;
When a match occurs, the tool creates a save entry with the SAVE_FLAG_VMC flag and assigns the generic type FILE_TYPE_VMC (defined in source/saves.c, lines 57-59). These entries appear in the UI under Memory Card Management for the corresponding platform.
PS1 VMC Format Handling
Exporting PS1 VMCs
The Export PS1 VMC command triggers export_ps1vmc() in source/exec_cmd.c. This function supports two output formats controlled by the vmp parameter:
/* source/exec_cmd.c – lines 974-986 */
static void export_ps1vmc(const char* vm1_file, int dst, int vmp) {
/* ... */
snprintf(dstfile, sizeof(dstfile), "%s%s.%s",
dst_path, vm1_file, vmp ? "VMP" : "VM1");
saveMemoryCard(dstfile, vmp ? PS1CARD_VMP : PS1CARD_RAW, 0);
}
Setting vmp = 1 generates a .VMP file with ECC data, while vmp = 0 produces a raw .VM1 image.
Importing Saves into PS1 VMCs
Single PS1 saves (.MCS, .PSV, .PSX) are imported via openSingleSave() in source/ps1card.c. This function reconstructs the VMC header when necessary and writes the save data back to the card image, maintaining compatibility with the target format.
PS2 VMC Format Handling
Exporting PS2 VMC Saves
Apollo Save Tool provides two export paths for PS2 virtual memory cards:
-
exportVmcSave()(lines 52-71 insource/exec_cmd.c) extracts individual saves from a VMC and writes them as .MCS, .PSV, or .PSX files based on the requested output type. -
export_vmc2save()(lines 94-124) converts an entire VMC to .PSU (raw save) or .PSV (virtual save) formats. This function callsvmc_export_psv()orvmc_export_psu()fromsource/psv_resign.c.
/* Export PS2 VMC as PSU */
export_vmc2save(selected_vmc_entry, FILE_TYPE_PSU, dst_usb_id);
Importing Saves into PS2 VMCs
The import_save2vmc() function in source/exec_cmd.c (lines 30-62) handles injection of external saves into PS2 VMCs:
/* source/exec_cmd.c – lines 34-58 */
case FILE_TYPE_PSV: ret = vmc_import_psv(src); break;
case FILE_TYPE_PSU: ret = vmc_import_psu(src); break;
case FILE_TYPE_XPS: ret = ps2_xps2psv(src, ...) && vmc_import_psv(...); break;
/* ... */
For native formats (PSV, PSU), the tool imports directly using vmc_import_psv() or vmc_import_psu() from source/psv_resign.c. For third-party formats (XPS, CBS, MAX), the tool first converts the file to PSV using conversion functions in source/psv_ps2.c (ps2_xps2psv(), ps2_cbs2psv(), ps2_max2psv()), then injects the resulting PSV into the VMC.
ECC Handling in PS2 VMC Formats
The low-level card driver in source/mcio.c manages ECC data through the CF_USE_ECC header flag. When this flag is set, Card_ReadPageData() and Card_WritePageData() (lines 3-13) process an extra spare/ECC block with every page read or write operation.
The UI exposes "Export Memory Card to .VMC format (No ECC)" to force generation of non-ECC images, useful for compatibility with emulators that do not expect error correction data.
Summary
- Apollo Save Tool supports 10 PS1 VMC extensions and 7 PS2 VMC extensions, documented in
README.mdand hard-coded inscan_vmc_files(). - File detection occurs in
source/saves.cthrough extension matching, creating genericFILE_TYPE_VMCentries for the UI. - PS1 operations use
export_ps1vmc()for VMP/VM1 output andopenSingleSave()for single save imports. - PS2 operations rely on
import_save2vmc()andexport_vmc2save(), with automatic conversion of XPS/CBS/MAX formats viasource/psv_ps2.cfunctions. - ECC handling is transparent in
source/mcio.c, with theCF_USE_ECCflag determining whether spare blocks are processed during read/write operations.
Frequently Asked Questions
What file extensions does Apollo Save Tool recognize for PS1 memory cards?
Apollo Save Tool recognizes .VMP, .MCR, .VM1, .BIN, .VMC, .GME, .VGS, .SRM, and .MCD for PS1 virtual memory cards. The scanner in source/saves.c checks for these extensions case-insensitively when building the save list from USB storage.
Can Apollo Save Tool convert between different PS2 save formats when importing to VMCs?
Yes. When importing .XPS, .CBS, or .MAX files, the tool first converts them to .PSV format using functions like ps2_max2psv() in source/psv_ps2.c, then injects the converted save into the VMC using vmc_import_psv() from source/psv_resign.c. Native .PSV and .PSU files import directly without conversion.
How does Apollo Save Tool handle ECC data in PS2 virtual memory cards?
The tool examines the CF_USE_ECC flag in the VMC header. If set, Card_ReadPageData() and Card_WritePageData() in source/mcio.c include spare/ECC blocks during page operations. Users can export VMCs without ECC using the dedicated menu option for emulator compatibility.
Where is the VMC scanning logic implemented in the Apollo Save Tool source code?
The scanning logic resides in scan_vmc_files() inside source/saves.c (lines 1619-1625). This function validates file extensions against the supported PS1 and PS2 VMC formats and creates entries with SAVE_FLAG_VMC and FILE_TYPE_VMC types for presentation in the Memory Card Management UI.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →