О введении стардарта на программы для ZX-Spectrum
(С) SigN, г.Москва, 1995.
Практически каждый, кто более или менее долго работал с ZX-Spectrum, сталкивался с проблемами совместимости. Многие часы были потрачены синклеристами на приведение своих Спектрумов в конфигурацию, наиболее приближенную к фирменной. Никто не отрицает, что для обеспечения нормальной работы уже написанных программ это просто необходимо. Тем не менее, зададимся вопросом, что же можно сделать для совместимости с различными версиями Спектру-ма программ, которые будут написаны в будущем. Для этих целей предлагается проект стандарта ZXX (ZX extension), описанный в этой статье. Программа, удовлетворяющая требованиям стандарта ZXX, будет нормально выполняться на всех компьютерах стандарта ZXX (насколько известно автору, требованиям стандарта ZXX удовлетворяют все Спектрум-совместимые компьютеры). В программах стандарта ZXX разрешено использование только перечисленных ниже средств ZX-Spectrum (в частности, запрещается обращение к портам, кроме перечисленных ниже).
1. Стандартные средства ZX-spectrna 48К.
К стандартным средствам ZX-Spectrum 48К относятся:
- 48К ОЗУ;
- ПЗУ с прошивкой 1982 или 1990 г. (т.е. в ZXX-программах запрещено использование программ ПЗУ, выполняющихся по-разному в этих прошивках);
- графический экран;
- порт бордюра #XXFE (вывод, X - обозначает любую НЕХ-цифру);
- порт клавиатуры #XXFE (ввод);
- аппаратные прерывания с частотой 50 Гц и длительностью сигнала INT, варьирующейся в пределах от 5 до 20 мкс;
- порт KEMPST0N-джойстика #XX1F (ввод, может отсутствовать).
2. Стандартные средства ZX-Spectyum 12SK.
Помимо средств ZX-Spectrum 48К, к стандартным средствам ZX-Spectrum 128К относятся:
- дополнительные 80К ОЗУ;
- порт переключения страниц ОЗУ #7FFD;
- дополнительное ПЗУ ZX-Spectrum 128К;
- дополнительный графический экран;
- му зык аильный сопроцессор (может отсутствовать).
При использовании дополнительного ПЗУ, дополнительного ОЗУ и/или музыкального сопроцессора ZXX-программа обязана непосредственно и независимо проверить доступность этих средств.
3. Стандартные_средства TR-
роа-
К стандартным относятся следующие способы взаимодействия с TR-DOS:
- посредством USR 15616, USR 15619 - из программ на BASIC;
- посредством CALL #3D13 с 0*0-12, 14, 18-20, 22 (см. ZX-PE-ВЮ-93, N1-2) - из программ на ассемблере .
4. Использование нестандартных
средств < расширений Ь.
Вот, йаконец, и то, для чего, в основном, и был предложен стандарт ZXX. В последнее время появилось несколько вариантов ZX-совместимых компьютеров (ZX-PR0-FI, ATM-TURBO и ATM-TURBO-2) с дополнительными возможностями (расширениями) в режиме ZX-Spectrum (в частности, дополнительной памятью (кстати, о дополнительной памяти: для человека, умеющего держать в руках паяльник, переделать Спектрум-128 в Спектрум-256 не должно представлять существенных проблем)). Тем не менее, эти расширения (а, значит, и программы, их использующие), явно не совместимы, а программистов, желающих писать программы для одного и только одного типа компьютера, как правило, мало. Этим, по-видимому, объясняется столь малое количество программ, использующих эти расширения. С другой стороны, в процессе превращения Спектрума в полупрофессиональный компьютер (о чем очень много говорилось в последнее время в ZX-РЕВЮ) эти возможности были бы очень кстати.
Для решения этой проблемы предлагается подход, который прекрасно зарекомендовал себя на IBM PC-совместимых компьютерах -использование драйверов (в данном случае - драйверов расширений).
Драйвером расширения называется файл, в котором находятся процедуры , обеспечивающие взаимодействие программ стандарта ZXX с расширениями. Этот файл уникален для каждой конфигурации компьютера, но един для всех программ стандарта ZXX. Во время инициализации программа пытается найти драйвер расширения (файл с именем "ZXXBIOS"). Если драйвер присутствует, то ZXX-программа загружает его в любое место памяти и использует для взаимодействия с расширением, в противном случае считается, что данный компьютер не имеет расширения.
4.1. Определение версии стандарта ZXXr_которой соответствует
драйвер.
Номер версии стандарта ZXX, которой соответствует драйвер, хранится в первых двух байтах файла "ZXXBIOS". Описываемой версии стандарта предлагается присвоить номер 1.0 (#0100).
4.2. Инсталляция драйвера.
ZXX-программа, которой необходим драйвер расширения, должна произвести следующие действия:
- загрузить файл "ZXXBIOS" по адресу #4000 (размер этого файла не должен превышать 6912 байтов);
- запустить процедуру инсталляции драйвера:
LD ВС, MASK
LD DE,DESTINATION
CALL #4002
Здесь MASK - маска модулей, которые предполагается инсталлировать (см. ниже), a DESTINATION
адрес инсталляции. После инсталляции регистры А, Н, L и F могут изменить свое значение, регистр ВС содержит маску фактически инсталлированных модулей, а регистр DE - адрес первой свободной ячейки памяти после инсталлированного драйвера.
4*3. Вызов функций драйвера.
Драйвер расширения состоит из модулей с номерами от #00 до #0F. Для вызова функций всех модулей драйвера служит единственная точка входа, равная адресу его инсталляции. Код вызываемого модуля драйвера помещается в старшие 4 бита регистра С, код функции этого модуля - в младшие 4 бита регистра С. После выполнения функции в аккумуляторе находится возвращенное этой функцией значение, а содержимое регистров В,С, D,E,H,L и F может быть изменено.
Модуль соэиестицости_(#0Q).
МА$у=#0001. С=#0Х.
с=#оо
Функция обеспечения совместимости с ZX-Spectrum 128К. Если конфигурация компьютера позволяет устанавливать защелку совместимости с ZX-Spectrum 128К, то функция делает это и возвращает #00, в противном случае - возвращает #FF.
C=#0B/#0F
TURBO ON/OFF: в зависимости от С устанавливает или сбрасывает режим TURBO и возвращает #00. В случае невозможности - возвращает #FF.
модуль расширенной_памяти
(#01К MASK=#0002. С»<1Х.
Предполагается, что компьютер содержит NPG страниц расширенной памяти размером 16К каждая (включая страницы ZX-Spectrum 128К), которые могут быть "впечатаны" с адреса #С000. Соответствие между номерами страниц ZX-Spectrum 128К и драйвера расширения следующее:
ZX-Sp |
Драйвер |
ZX-Sp |
Драйвер) |
0 |
0 |
4 |
3 |
1 |
1 |
5 |
- |
2 |
- |
6 |
4 |
3 |
2 |
7 |
5 |
Если предполагается использовать этот модуль, то драйвер должен быть загружен в область памяти до #С000. с=#ю
Определение количества доступных страниц NPG. Возвращает NPG.
С=#11, А=#ХХ
Установка состояния порта
#7FFD. Биты 3-7 регистра А запоминаются для дальнейшего вывода в порт #7FFD.
С=#12, А=#ХХ <0<SA<NP6) "Впечатывание'1 страницы номер А. Производит "впечатывание" страницы с номером А с адреса #С000 и возвращает текущее значение, выведенное в порт #7FFD.
Стандарт на функции модулей, перечисленных ниже, в настоящее время не разработан.
Модуль расширенной графики (#02). MASK=#0004. С=#2Х.
Модуль принтера (#03).
MASK=#0008. С=#ЗХ.
Модуль программатора (#04). MASK=#0010. Ся#4Х»
Модуль ZX-модема (#05).
MASK»#0020. С»#5Х.
* * *