Spectrum pages
Home -> Spectrum -> Multiface 3 data format

_____________________________________________________________________

The Multiface 3 Save File Format

Conventions:

All items marked * should be present in the Multiface save file and identical to those in the files saved by the Multiface itself. Even though they do not contribute data to the actual snapshot, they may well be needed by the Multiface during loading. Items marked with a + must be present, but need not be identical to those in the M3's "own" datafiles. Two-byte values are in Zilog/Intel form (LSB first). Words and phrases enclosed in [square brackets] are Spectrum keywords or colour codes.

The Multiface 3 save file consists of either:

1. Two disc files, the Loader and the Datafile. The Datafile is treated as a series of concatenated data blocks, exactly corresponding to the separate headerless files of the tape save file. The Loader has a filename of seven characters with no file type extension (ie nothing after the dot); the Datafile has the same filename, with the letter C appended to it. Thus a typical pair would be HORACE and HORACEC.

or:

2. A collection of tape files; the Loader and three or more headerless files. The Loader may have any name, although the Multiface can save with names only up to seven characters in length.

The M3 loader file has the following format (all figures in Hex):

Offset Length Purpose
================================================================================
000h* 80h Standard +3DOS header for a BASIC program (disc only). For
 tape files, subtract 80h from all offsets in this loader.
080h* 69h The start of the BASIC line: "1 REM "
0E9h 09h Filename of datafile (disc only), ASCII, terminated by 0FFh.
 There will be spaces after the 0FFh byte if the filename is
 shorter than 8 characters. Unused for tape files.
0F2h 02h Length of first data block (disc files) or headerless file
 (tape files).
0F4h+ 0Eh The message "[AT 20,12][FLASH 1][PAPER 6]NOT ON!". This
 message is printed by the loader when it cannot detect the
 presence of the Multiface.
102h 02h A word which is 006Eh for tape or 0071h for disc.
104h 10h The 16 AY-3-8912 sound chip register values, in ascending
 order.
114h* 01h Carriage Return - the end of the REM line.
115h* 54h BASIC line 2. This resets RAMTOP and runs the machine code
 loader program in the REM in line 1.
 Parts of this line may be altered. It starts:
 [BORDER][SGN][PI]:[INK][SGN][PI]:[PAPER][SGN][PI]:[CLEAR]
 [VAL]"24543":[PRINT]"[AT 20,9][FLASH 1][PAPER 6]M3 LOADING":
 The address of the string "LOADING" should not be altered,
 since it is used by the machine code loader. However, the
 colour codes in the string can be changed.
 Replace [SGN] by [NOT], [SQR], [INT] for colours 0, 2, 3
 respectively. Or, the entire first part of the line can be
 replaced by
 [CLEAR][VAL]"24543":[LOAD]"loadscr"[SCREEN$]
 (up to 7 characters in the name of the loading screen).
===============================================================================
The loader should be exactly the same length as a "real" M3 loader (169h bytes) since this value is hardwired into the Multiface ROM.

[BINARY DATA] You can get a sample Multiface 3 loader by clicking here (You may have to set your viewer to download to disk first). Note that the Spectrum +3 uses CP/M format discs, so the file is made up to a multiple of 128 bytes with random bytes.

The M3 data file has the following format:

The file is treated as a sequence of 3-8 data blocks, which are either separate headerless tape files or consecutive parts of a large headerless disc file. The first data block begins with a data area 0D3h bytes long. Many bytes in this area are scratchpads used by the Multiface and have no meaning in the saved file.

Offset Length Purpose
================================================================================
000h 01h A flags byte. Bit 7 is set if the first data block may need
 decompression.
 Bit 6 is set if the second data block may need
 decompression.
016h 02h Load address of the data following this header. This should
 always be 60B3h.
01Ah 02h Length of this data block, including the header.
01Ch 02h Length of the second data block. If 1B00h, the block is
 not compressed.
01Eh 02h One greater than the last address used by the first block.
 If it is zero, the first block is not compressed.
020h 01h Another flags byte. Bit 2 is set if the snapshot is in
 128k format.
 Bit 5 is set if the file is a tape file.
038h 01h Used only in 128k files.
 The low 4 bits of this byte form a nibble which controls how
 memory banks 1,3,4 and 6 were saved. It can take the
 following values:
 00h: None of Banks 1,3,4 or 6 was saved.
 01h: There is one data block, containing Bank 1.
 03h: There are two data blocks - Banks 1 and 3.
 07h: There are three data blocks - Banks 1, 3 and 4.
 0Fh: There are four data blocks - Banks 1, 3, 4 and 6.
 The high bits relate to compression:
 Bit 4 is set if the image of Bank 1 is compressed.
 Bit 5 is set if the image of Bank 3 is compressed.
 Bit 6 is set if the image of Bank 4 is compressed.
 Bit 7 is set if the image of Bank 6 is compressed.
039h 01h Used only in 128k files.
 Bit 3 is set if Bank 7 was saved to a data block.
 Bit 7 is set if the image of Bank 7 is compressed.
03Ah 02h Used only in 128k files. Length of Bank 1 data block.
03Ch 02h Used only in 128k files. Length of Bank 3 data block.
03Eh 02h Used only in 128k files. Length of Bank 4 data block.
040h 02h Used only in 128k files. Length of Bank 6 data block.
042h 02h Used only in 128k files. Length of Bank 7 data block.
04Ah 1Ch Z80 registers and ports information, in the order:
			DW	PC	;All double
			DW	IY
			DW	IX	;registers are
			DW	B'C'
			DW	D'E'	;stored low byte first.
			DW	H'L'
			DB	F'
			DB	A'
			DW	BC
			DW	DE
			DB	Mb	;last value output to port 7FFDh
			DB	R
			DB	Mi	;High nibble is the low nibble of the
					;last value output to 1FFDh.
					;Low nibble: Bit 0 is set for IM 2
					; reset for IM 1
					; Bit 2 is set for EI
					; reset for DI
			DB	I
			DW	HL
			DB	F
			DB	A
			DW	SP
 PC is also stored at the top of the stack.
 The names Mb and Mi come from the Multiface's register
 display when it is running the Multi Toolkit.
067h* 6Bh Multiface 3 memory banking and disc access routines.
 These are used while loading.
0D3h ??? Data for 60B3h-FFFFh, possibly compressed.
================================================================================

The first data block contains an image (possibly compressed) of the RAM from 60B3h-FFFFh.

The second data block contains the screen, possibly compressed.

The third data block is never compressed, and is always of length 05B3h. It contains the image of memory from 5B00h-60B2h.

48k datafiles end at this point. 128k datafiles continue with up to five additional data blocks containing the RAM pages 1,3,4,6 and 7. All of these may be compressed; see below for their format if they are.

Note: When saving, either of the first two blocks may be flagged as "compressed" but be uncompressed. This can be detected from the block lengths.

The border colour is not saved.

Compression

If a block is compressed, then it will contain 6-byte codes instead of repeated sequences of one byte. The code is: c, b, a, 37h, EDh, CBh

b*256+c
is the number of repetitions of the byte;
a
is the byte to be repeated.

If a block contains the sequence 37h, EDh, CBh then it will not be compressed.

The extra blocks for a 128k datafile have the following format if compressed:

Offset Purpose
================================================================================
0 DW length		;Length of this block.
2 Compressed data.....	;The compressed image
length-2 DB byte0,byte1	;First two bytes of the compressed image, which
				;should be transferred to offset 0 before
				;decompression starts.
================================================================================

[BINARY DATA] Click here for the first 256 bytes of a Multiface 3 datafile. Again, you may need to select downloading to disc.

Disclaimer:

This format has been determined by disassembling the M3 ROM, and by examining the snapshot files it produces. I have no guarantee that it will work in all cases - but it hasn't let me down yet.

John Elliott - seasip.webmaster@gmail.com

AltStyle によって変換されたページ (->オリジナル) /