The format was first defined for the CPCEMU emulator but is now widely supported. The format was originally defined by Marco Vieth. Version 3 was defined by Ulrich Doewich, Martin Korth, Richard Wilson and Kevin Thacker.
There are 3 versions defined in this document. Version 3 is the most recent and is currently supported by a few of the most recent emulators.
Abbreviations:
| Offset (Hex) | Count | Description |
|---|---|---|
| 00-07 | 8 | The identification string "MV - SNA". This must exist for the snapshot to be valid. |
| 08-0f | 8 | (not used; set to 0) |
| 10 | 1 | snapshot version (1) |
| 11 | 1 | Z80 register F |
| 12 | 1 | Z80 register A |
| 13 | 1 | Z80 register C |
| 14 | 1 | Z80 register B |
| 15 | 1 | Z80 register E |
| 16 | 1 | Z80 register D |
| 17 | 1 | Z80 register L |
| 18 | 1 | Z80 register H |
| 19 | 1 | Z80 register R |
| 1a | 1 | Z80 register I |
| 1b | 1 | Z80 interrupt flip-flop IFF0 (note 2) |
| 1c | 1 | Z80 interrupt flip-flop IFF1 (note 2) |
| 1d | 1 | Z80 register IX (low) (note 5) |
| 1e | 1 | Z80 register IX (high) (note 5) |
| 1f | 1 | Z80 register IY (low) (note 5) |
| 20 | 1 | Z80 register IY (high) (note 5) |
| 21 | 1 | Z80 register SP (low) (note 5) |
| 22 | 1 | Z80 register SP (high) (note 5) |
| 23 | 1 | Z80 register PC (low) (note 5) |
| 24 | 1 | Z80 register PC (high) (note 5) |
| 25 | 1 | Z80 interrupt mode (0,1,2) (note 3) |
| 26 | 1 | Z80 register F' (note 4) |
| 27 | 1 | Z80 register A' (note 4) |
| 28 | 1 | Z80 register C' (note 4) |
| 29 | 1 | Z80 register B' (note 4) |
| 2a | 1 | Z80 register E' (note 4) |
| 2b | 1 | Z80 register D' (note 4) |
| 2c | 1 | Z80 register L' (note 4) |
| 2d | 1 | Z80 register H' (note 4) |
| 2e | 1 | GA: index of selected pen (note 10) |
| 2f-3f | 17 | GA: current palette (note 11) |
| 40 | 1 | GA: multi configuration (note 12) |
| 41 | 1 | current RAM configuration (note 13) |
| 42 | 1 | CRTC: index of selected register (note 14) |
| 43-54 | 18 | CRTC: register data (0..17) (note 15) |
| 55 | 1 | current ROM selection (note 16) |
| 56 | 1 | PPI: port A (note 6) |
| 57 | 1 | PPI: port B (note 7) |
| 58 | 1 | PPI: port C (note 8) |
| 59 | 1 | PPI: control port (note 9) |
| 5a | 1 | PSG: index of selected register (note 17) |
| 5b-6a | 16 | PSG: register data (0,1,....15) |
| 6b-6c | 1 | memory dump size in Kilobytes (e.g. 64 for 64K, 128 for 128k) (note 18) |
| 6d-ff | 93 | not used set to 0 |
| 100-... | (defined by memory dump size) | memory dump |
Notes:
| Offset (Hex) | Count | Description |
|---|---|---|
| 10 | 1 | snapshot version (2) |
| 6d | 1 | CPC type:
|
| 6e | 1 | interrupt number (0..5) (note 1a) |
| 6f-74 | 6 | 6 multimode bytes (note 1b) |
| 75-ff | x | (not used) |
Notes:
| Offset (Hex) | Count | Description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 1 | snapshot version (3) | ||||||||||||
| 6d | 1 | CPC type:
|
||||||||||||
| 9C | 1 | FDD motor drive state (0=off, 1=on) | ||||||||||||
| 9D-A0 | 1 | FDD current physical track (note 15) | ||||||||||||
| A1 | 1 | Printer Data/Strobe Register (note 1) | ||||||||||||
| A4 | 1 | CRTC type:
| ||||||||||||
| A9 | 1 | CRTC horizontal character counter register (note 11) | ||||||||||||
| AA | 1 | unused (0) | ||||||||||||
| AB | 1 | CRTC character-line counter register (note 2) | ||||||||||||
| AC | 1 | CRTC raster-line counter register (note 3) | ||||||||||||
| AD | 1 | CRTC vertical total adjust counter register (note 4) | ||||||||||||
| AE | 1 | CRTC horizontal sync width counter (note 5) | ||||||||||||
| AF | 1 | CRTC vertical sync width counter (note 6) | ||||||||||||
| B0-B1 | 2 | CRTC state flags. (note 7)
| ||||||||||||
| B2 | 1 | GA vsync delay counter (note 14) | ||||||||||||
| B3 | 1 | GA interrupt scanline counter (note 12) | ||||||||||||
| B4 | 1 | interrupt request flag (0=no interrupt requested, 1=interrupt requested) (note 13) | ||||||||||||
| B5-FF | 75 | unused (0) |
Notes:
Immediatly following the memory dump there is optional data which is seperated into chunks.
Each chunk of data has a header and this is followed by the data in the chunk. The header has the following format:
| Offset (Hex) | Count | Description |
|---|---|---|
| 0 | 4 | Chunk name (note 1) |
| 4 | 4 | Chunk data length (note 2) |
Notes:
The following chunks are currently defined:
Chunk name: "CPC+"
Chunk data:
| Offset (Hex) | Length | Addr in ASIC register-ram | Description |
|---|---|---|---|
| 000-7FF | 800h | 4000-4FFF | Sprite Bitmaps (note 1) |
| 800-87F | 8*16 | 6000-607F | Sprite Attributes (see below) (note 2) |
| 880-8BF | 32*2 | 6400-643F | Palettes (note 3) |
| 8C0 | 1 | 6800 | Programmable Raster Interrupt (note 4) |
| 8C1 | 1 | 6801 | Screen split scan-line (note 4) |
| 8C2 | 2 | 6802-6803 | Screen split secondary screen-address (note 4) |
| 8C4 | 1 | 6804 | Soft scroll control register (note 4) |
| 8C5 | 1 | 6805 | Interrupt vector (note 4) |
| 8C6-8C7 | 2 | - | unused (0) |
| 8C8-8CF | 8 | 6808-680f | Analogue input channels 0-7 (note 5) |
| 8D0-8DB | 3*4 | 6C00-6C0B | Sound DMA channel attributes 0-2 (see below) (note 6) |
| 8DC-8DE | 3 | - | unused (0) |
| 8DF | 1 | 6C0F | DMA Control/Status (note 4) |
| 8E0-8F4 | 3*7 | internal | DMA channel 0-2 internal registers (see below) (note 7) |
| 8F5 | 1 | internal | gate array A0 register value (note 8) |
| 8F6 | 1 | internal | gate array A0 lock: 0=locked, 1=unlocked (note 9) |
| 8F7 | 1 | internal | ASIC unlock sequence state (note 10) |
Notes:
| Offset | Length | Description |
|---|---|---|
| 0 | 2 | Sprite X (see note) |
| 2 | 2 | Sprite Y (see note) |
| 4 | 1 | Sprite Magnification (see note) |
| 5-7 | 3 | unused (0) |
Note: the Sprite X, Y and magnification are in the same order as the ASIC registers
| Offset | Length | Description |
|---|---|---|
| 0 | 2 | DMA Channel address (see note) |
| 2 | 1 | DMA Channel prescalar (see note) |
| 3 | 1 | unused (0) |
Note: the DMA address and prescalar are in the same order as the ASIC registers.
| Offset | Length | Description |
|---|---|---|
| 0 | 2 | loop counter (note a) |
| 2 | 2 | loop address (note b) |
| 4 | 2 | pause count (note c) |
| 6 | 1 | pause prescalar count (note d) |
| State ID | Synchronised State | Note |
|---|---|---|
| 0 | not synchronised | ASIC is waiting for first non-zero byte to be written, this is the first synchronisation byte required |
| 1 | not synchronised | ASIC is waiting for zero byte to be written, this is the second synchronisation byte required |
| 2..10h | synchronised | ASIC is waiting for byte from unlock sequence. e.g. if "2", ASIC is waiting for &FF, the first byte of the unlock sequence. if "3" ASIC is waiting for &77, the second byte of the unlock sequence. |