.z80

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: (с) Г. А. Лунтер (G.A.Lunter), Нидерланды, 1994; (с) Перевод с английского и техническое редактирование «Инфорком-Пресс», Москва, 1995.

Старый формат файлов .Z80 (для версий до 1.45) выглядит так:

Смещение Длина	Описание
0	1	Регистр А
1	1	Регистр F
2	2	Регистровая пара BC (сначала младший, т.е. С)
4	2	Регистровая пара HL
6	2	Программный счетчик (РС)
8	2	Указатель стека (SP)
10	1	Регистр прерываний I
11	1	Регистр регенерации R (Бит 7 - не значащий)
12	1	Bit 0  : Равен 7-му биту регистра R
                Bit 1-3: Цвет бордюра
                Bit 4  : 1- впечатан БЕЙСИК SamRam
                Bit 5  : 1- блок данных компрессирован
                Bit 6-7: Не значащие 
13      2       Регистровая пара DE 
15      2       Регистровая пара BC' 
17      2       Регистровая пара DE' 
19      2       Регистровая пара HL' 
21      1       Регистр А' 
22      1       Регистр F'
23	2	Регистр IY  (Сначала младший)
25	2	Регистр IX
27	1	Триггер прерываний, 0=DI, иначе EI
28	1	Триггер прерываний IFF2 (роли не играет)
29	1	Bit 0-1: Режим прерываний (0, 1 или 2)
                Bit 2  : 1=эмуляция 2-го выпуска Спектрума
                Bit 3  : 1=Двойная частота прерываний
                Bit 4-5: 1=Высокая видеосинхронизация
                         3=Низкая видеосинхронизация
                         0,2=Нормальная
                Bit 6-7: 0=Курсор/Protek/AGF- джойстик
                         1=Кемпстон-джойстик
                         2=Sinclair-левый джойстик
                         3=Sinclair-правый джойстик

Ради совместимости если байт 12 равен 255, то он принимается равным 1.

После этого 30-байтного хэдера следуют 48 килобайтов Спектрумовской памяти. Если бит-5 12-го байта равен 1, то дамп памяти идет в компрессированном формате. Метод компрессии очень прост. Заменяются все последовательности идущих подряд пяти одинаковых байтов. Вместо них производится запись ED ED xx yy. Здесь ED ED - это префикс, xx - коэффициент повтора, а yy - повторяющийся байт. Итак, кодируются только последовательности из пяти повторов или более. Исключением являются последовательности из байтов, равных ED. Даже если это только два байта, все равно они пакуются ED ED 02 ED. И последнее правило: любой байт, непосредственно следующий за ED, не упаковывается в общий блок. Например, у нас есть последовательность ED 00 00 00 00 00 00. Она не пакуется, как ED ED ED 06 00, а пакуется как ED 00 ED ED 05 00. Блок заканчивается концевым маркером 00 ED ED 00.

Такой формат файлов .Z80 использовался версиями эмулятора до 1.45. Начиная с версии 2.0 в связи с поддержкой файлов оттисков памяти, снятых со 128-го Спектрума, появился новый формат. этот новый формат используется для всех оттисков, неважно 48-ых или 128-ых. Но эмулятор по-прежнему понимает и старый формат.

Несмотря на то, что эмулятор понимает старый формат, сам он никогда файлов .Z80 в старом формате не производит. Но при желании новый формат можно конвертировать в старый (конечно только для 48К-файлов), если использовать утилиту ConvZ80.

Новый формат начинается с такого же 30-байтного хэдера, что и приведенный выше. Но теперь биты 4 и 5 флагового байта (12-го) уже не имеют значения, а байты 6 и 7 равны нулю, что говорит о том, что это файл в новом формате.

За первыми 30-ю байтами следуют дополнительные:

Смещение  Длина	Описание
* 30	2	Длина дополнительного блока (см. ниже)
* 32	2	Программный счетчик
* 34	1	Аппаратный режим (см. ниже)
* 35	1	В режиме эмуляции SamRam содержит битовое состояние микросхемы 74ls259.
                В режиме 128К содержит последний вывод на порт 7FFD.
* 36	1	Содержит 0FF, если впечатано ПЗУ Интерфейса-1
* 37	1	Бит 0: 1 если включена эмуляция регистра R
                Bit 1: 1 если включена эмуляция LDIR 
* 38      1       Последний вывод на порт 7FFD.
* 39	16	Содержимое регистров музыкального сопроцессора
55	2	Счетчик тактов (младший)
57	1	Счетчик тактов (старший)
58	1	Флаговый байт. Используется Спектатором (эмулятор Спектрума для компьютеров QL) При загрузке Z80 его игнорирует, а при выгрузке выставляет в нем 0.
59	1	0FF, если впечатано ПЗУ "Гордон"
60	1	0FF, если впечатано ПЗУ М128. Должно быть 0.
61	1	0FF, если 0-8191 - ОЗУ
62	1	0FF, если 8192-16383 - ОЗУ
63	10	Клавиши, заданные в качестве пользовательского джойстика.
73	10	Клавиатурные данные для клавиш, указанных выше.
83	1	Тип устройства "Гордон". 0=Disciple + Epson, 1=Disciple + HP,  16=Plus D
84	1	Статус кнопки INHIBIT интерфейса Disciple
                : 0=интерфейс отключен, за исключением джойстиков
                : 0FF=подключен
85	1	Флаг INHIBIT интерфейса Disciple
                : 0=ПЗУ может быть впечатано;
                : 0FF=не может быть впечатано. 

Значение содержимого позиции 30 равно 23-м для версии эмулятора 2.01 и равно 54-м для версии 3.0. Позиции, помеченные знаком "*", соответствуют хэдеру версии 2.01 и интерпретируются версией 3.0 точно так же, за исключением байта 34:

Число	Значение в версии 2.01    Значение в версии 3.0
0	48k	                  48k
1	48k + If.1	          48k + If.1
2	SamRam	                  48k + M.G.T.
3	128k	                  SamRam
4	128k + If.1	          128k
5	-	                  128k + If.1
6	-	                  128k + M.G.T.

Старший байт счетчика тактов отсчитывает такты по модулю 4. Сразу после того, как ULA генерирует свое прерывание (каждые 20 миллисекунд), он равен трем и увеличивается на единицу через каждые пять эмулируемых миллисекунд. В эти интервалы, равные 1/200 секунды, младший байт счетчика считает от 17472 до нуля, что и дает 69888 тактов на кадр. Байт 60 должен быть нулевым, поскольку содержимое ОЗУ устройства Multiface 128 не сохраняется в файле-оттиске. Если M128 был впечатан в момент сохранения оттиска, эмулируемая программа скорее всего не будет работать при последующей загрузке.

Байты 61 и 62 - функции прочих флагов, таких как байт 34, 59, 60 и 83. После хэдера идут блоки памяти, каждый из которых содержит упакованные данные 16-килобайтного блока. Компрессия производится по старой схеме, за исключением конечного маркера, который теперь отсутствует. Структура блока памяти следующая:

Байт    Длина   Описание
0	2	Длина данных (без этого трехбайтного хэдера)
2	1	Страничный номер блока
3	[0]	Упакованные данные

Нумерация страниц зависит от аппаратного режима:

Стр.    В режиме 48	В режиме 128    В режиме SamRam
0	48K ПЗУ	        ПЗУ (старое)    48K ПЗУ
1	ПЗУ Интерфейса-1, ПЗУ Disciple или ПЗУ Plus D, в соответствии с тем, что задано
2	-	        ПЗУ (новое)     ПЗУ SamRam (BASIC)
3	-	        page 0          ПЗУ SamRam (монитор,..)
4	8000-bfff	page 1	        Обычные 8000-bfff
5	c000-ffff	page 2	        Обычные c000-ffff
6	-	        page 3	        Теневые 8000-bfff
7	-	        page 4          Теневые c000-ffff
8	4000-7fff	page 5	        4000-7fff
9	-	        page 6	        -
10	-	        page 7	        -
11	ПЗУ Multiface   ПЗУ Multiface

В режиме 48К выгружаются страницы 4, 5 и 8. В режиме SamRam сохраняются страницы с 4 по 8. В режиме 128К - все страницы с 3 по 10. Концевой маркер отсутствует.