Z80 (формат)
Z80 (*.z80) — наиболее распространённый формат для сохранения состояния эмулируемого ZX Spectrum (т.н. снапшот). Был разработан Гертоном Люнтером для использования в его эмуляторе ZX Spectrum - Z80 (1991), впоследствии стал поддерживаться большинством других эмуляторов.
Формат трижды изменялся автором. Авторы других эмуляторов также вносили некоторые изменения в формат.
Первая версия
Первая версия формата использовалась в версиях эмулятора Z80 до 1.45 включительно и позволяет сохранять состояние только для ZX Spectrum 48K.
Файл состоит из заголовка и образа ОЗУ. Заголовок имеет длину 30 байт и следующую организацию:
Смещение | Размер | Назначение |
---|---|---|
0 | 2 | регистры A, F |
2 | 2 | регистры C, B |
4 | 2 | регистры L, H |
6 | 2 | регистр PC (младший, старший байты) |
8 | 2 | регистр SP |
10 | 1 | Регистр I |
11 | 1 | Регистр R (старший бит не используется) |
12 | 1 | Бит 0: старший бит регистра R Биты 1-3: цвет бордюра Бит 4: установлен при подключенном Basic SamRom Бит 5: установлен при использовании сжатия Биты 6-7: не используются Если байт содержит значение 255, оно должно считаться как 1 |
13 | 2 | Регистры E, D |
15 | 2 | Альтернативные регистры C, B |
17 | 2 | Альтернативные регистры E, D |
19 | 2 | Альтернативные регистры L, H |
21 | 2 | Альтернативные регистры A, F |
23 | 2 | Регистр IY (младший, старший байты) |
25 | 2 | Регистр IX |
27 | 1 | Флаг прерываний - 0 при DI, иначе EI |
28 | 1 | Флаг IFF2 |
29 | 1 | Биты 0-1: режим прерываний (0-2) Бит 2: эмуляция второй версии платы Бит 3: удвоенная частота прерываний Биты 4-5: точность синхронизации эмулятора Биты 6-7: джойстик (0 - Cursor/Protek/AGF, 1 - Kempston, 2 - Sinclair левый, 3 - Sinclair правый) |
После заголовка следует образ ОЗУ компьютера (48 килобайт). Если бит 5 в 12-ом байте заголовка сброшен, данные хранятся в несжатом виде, иначе используется простое RLE-сжатие. Все последовательности 5 и более одинаковых байт кодируются как #ED #ED #xx #yy, где xx количество повторений, а yy значение повторяемого байта. Если в исходных данных встречается последовательность #ED #ED, она кодируется как #ED #ED #02 #ED. Если в исходных данных встречается одиночный байт #ED, первый последующий за ним байт не считается частью повтора - так, последовательность #ED и шести нулей будет закодирована как #ED 00 #ED #ED #05 #00. В конце сжатого образа ОЗУ указывается маркер конца файла - #00 #ED #ED 00.