***** Important notice ******************************************************** This document describes the snapshot file format for Snes9x 1.52 and later, not compatible with 1.51. ******************************************************************************* Snes9x snapshot file format: (may be gzip-compressed) Begins with fixed length signature, consisting of a string, ':', a 4-digit decimal version, and a '\n'. #!s9xsnp:0006 <-- '\n' after the 6 Then we have various blocks. The block format is: 3-character block name, ':', 6-digit length, ':', then the data. Blocks are written in a defined order. Structs are written packed with their members in a defined order, in big-endian order where applicable. NAM:000019:Chrono Trigger.zip Currently defined blocks (in order) are: Essential parts: NAM - ROM filename, from Memory.ROMFilename. 0-terminated string. CPU - struct SCPUState, CPU internal state variables. REG - struct SRegisters, emulated CPU registers. PPU - struct SPPU, PPU internal variables. Note that IPPU is never saved. DMA - struct SDMA, DMA/HDMA state variables. VRA - Memory.VRAM, 0x10000 bytes. RAM - Memory.RAM, 0x20000 bytes (WRAM). SRA - Memory.SRAM, 0x20000 bytes. FIL - Memory.FillRAM, 0x8000 bytes (register backing store). SND - All of sound emulated registers and state valiables. CTL - struct SControlSnapshot, controller emulation. TIM - struct STimings, variables about timings between emulated events. Optional parts: SFX - struct FxRegs_s, Super FX. SA1 - struct SSA1, SA1 internal state variables. SAR - struct SSA1Registers, SA1 emulated registers. DP1 - struct SDSP1, DSP-1. DP2 - struct SDSP2, DSP-2. DP4 - struct SDSP4, DSP-4. CX4 - Memory.C4RAM, 0x2000 bytes. ST0 - struct SST010, ST-010. OBC - struct SOBC1, OBC1 internal state variables. OBM - Memory.OBC1RAM, 0x2000 byts. S71 - struct SSPC7110Snapshot, SPC7110. SRT - struct SSRTCSnapshot, S-RTC internal state variables. CLK - struct SRTCData, S-RTC emulated registers. BSX - struct SBSX, BS-X. SHO - rendered SNES screen. MOV - struct SnapshotMovieInfo. MID - Some block of data the movie subsystem. ================== Without changing the snapshot version number: --------------------------------------------- Blocks may be safely added at the END of the file, as anything after the last block is ignored. Blocks may not be moved or removed. Blocks may not decrease in size. Say you decrease from 10 bytes to 5. Then later you increase back to 8. The only way you could safely do this is if bytes 5-7 still mean the same thing they meant when the block was 10 bytes long. Blocks may increase in size as you wish, as long as you can handle old savestates with the old shorter size. Struct members may not change in interpretation. New struct members may be added (at the END!) only if you can cope with them being binary-0 in older savestates. Struct members may not be removed or changed in size/type. With changing the snapshot version number: ------------------------------------------ Blocks may be added, moved, or removed at will. Blocks may decrease in size. Struct members may be added, moved, or deleted, and their interpretations/types may be changed. Use the 'debuted_in' and 'deleted_in' fields to indicate when the new member debuted or the old member went away.