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. |