АВТОРСКАЯ РАЗРАБОТКА
В предыдущем номере ZX-РЕВЮ прозвучало сенсационное сообщение о разработке Сергея Веремеенко использовании в Спектруме видеопроцессора от игровой приставки
Видеопроцессор для ZX-spectrum
(С) Сергей Веремеенко, г.Екатеринбург, 1995.
Немного истории.
В начале 1995 года мне пришла в голову мысль о том, что было бы неплохо оснастить популярную игровую видеоприставку DENDY системой ввода программ с магнитного носителя. Эта задача была решена довольно быстро, и к марту первый образец магнитофонного адаптера был готов (это тема отдельного разговора, но сейчас речь не о нем) .
В процессе исследования видеоприставки я пришел к выводу, что ее видеопроцессор вполне может быть подключен к SPECTRUM1у и значительно улучшит его графические возможности. Первая попытка подключения видеопроцессора 6538, применяемого в многокристальном варианте видеоприставки в общем удалась, но выявились некоторые неприятные нюансы. SPECTRUM в отличие от "примитивной" DENDY, не имеет контроллера прямого доступа в память и даже самая быстрая команда OTIR не позволяла в полной мере использовать все возможности видеопроцессора.
Программирование видеопроцессора оказалось неоправданно усложненным и надеяться на широкое распространение этого варианта не приходилось. Кроме того выяснилось, что кристалл из однокристальной версии DENDY не дороже и гораздо более доступен, чем 6538.
Второй вариант видеопроцессора для SPECTRUM'а базировался на микросхеме 6561. Эта микросхема могла быть заменена практически любой, применяемой в 8-битных ви-
DENDY. Сегодня мы располагаем конкретной информацией и предлагаем этот материал нашим читателям. Итак, передаем слово автору этой разработки.
деоприставках, или даже 8-крис-тальной платой на основе 6527 и 6538. Было введено "синклеровское окно", расширяющее возможности видеопроцессора и обеспечивающее совместимость компьютера, оснащенного видеопроцессором, с обычным. Теперь при вводе Спектру-мовских программ стало возможным не отключать видеопроцессор. Кроме собственно видеопроцессора, SPECTRUM получил доступ к ден-дивским джойстикам, световому пистолету и музпроцессору.
Результат превзошел все ожидания. Но, как обычно, выявились и некоторые недостатки. Система команд и некоторые параметры видеопроцессора теперь определялись программой-драйвером, размещенной в ПЗУ, подключенном к микросхеме видеоприставки вместо картриджа. Довольно быстро я понял, что написать универсальный драйвер, одинаково пригодный для всех возможных применений видеопроцессора, едва ли возможно. Какая-то задача требует максимального быстродействия, другая - сложной логической обработки изображения* третья - работы видеопроцессора в автономном режиме, но синхронно с центральным процессором, четвертая - возможности непрерывного скроллинга на 1000 экранов, пятая ....
Короче говоря, было принято решение оставить в ПЗУ видеопроцессора только небольшой загрузчик, а драйвер сделать загружаемым. Теперь рядовой программист должен будет выбрать подходящий драйвер из библиотеки и писать программу под него, а мастерам предоставляется возможность проявить себя путем написания драйверов обладающих уникальными свойствами. Чтобы реализовать эту идею пришлось большую часть ПЗУ заменить на ОЗУ.
Объем этого ОЗУ может составлять от 2 до 32 Кб. Выбор варианта зависит от Ваших целей и экономических возможностей. Вы можете начать с установки дешевой 537РУ10, а впоследствии заменить ее на 537РУ17 или 62256. В минимальном варианте емкости ОЗУ достаточно для целей изучения видеопроцессора и размещения несложного драйвера, ориентированного на работу с программами, написанными на ассемблере. Более сложный драйвер, ориентированный на BASIC, может потребовать 8 Кб ОЗУ. Максимальная емкость памяти в 32 Кб позволяет разместить драйвер любой мыслимой сложности и более двух десятков дополнительных экранов. Кроме того у такого варианта есть особенность, которая может заинтересовать многих. Ничто не мешает вместо драйвера загрузить в это ОЗУ игрушку вынутую из дендивского картриджа и запустить ее.
На одной дискете или кассете могут присутствовать и ELITE и DUCK HUNT и новая программа написанная для SPECTRUM'а с видеопроцессором, причем процедура загрузки их абсолютно одинакова. Чтобы такая возможность могла быть реализована, в схему введены дополнительные цепи блокировки.
рдним махом можно, как минимум, удвоить количество игр для модифицированного таким образом SPECTRUM'а.
Аппаратная часть.
Проблема соединения SPECTRUM'а и DENDY на аппаратном уровне имеет три составляющих. Это совмещение изображений формируемых SPECTRUM'ом и видеопроцессором DENDY на экране монитора, согласование стандартов и взаимодействие компьютеров на программно-логическом уровне.
Самой сложной в техническом отношении является первая задача. Ее сложность определяется, как ни странно, простотой нашего любимого SPECCY. Во всех известных мне вариантах SPECTRUM'а тактирующие импульсы динамической памяти вырабатываются теми же схемами, которые формируют телевизионный растр. Задача усложняется большим количеством моделей SPECTRUM-cob-местимых компьютеров.
Самым оптимальным решением была бы разработка нового SPECTRUM -совместимого компьютера, в котором видеопроцессор был бы не внешней "нашлепкой", а органической составной частью. При этом схема его даже упростилась бы, но на современном этапе это преждевременно. Реально сейчас может стоять задача модернизации существующего парка компьютеров.
Я продемонстрирую решение на примере компьютера SCORPION ZS-256. Принципиально оно пригодно для любой модели, но конкретные изменения в схеме, очевидно, будут индивидуальными.
Вначале нужно выделить из полного телевизионного сигнала видеопроцессора строчные и кадровые синхроимпульсы. Схема селектора импульсов приведена на рис. 1.
Видеосигнал подается на вход компаратора, порог компарации которого установлен приблизительно на одну треть амплитуды синхроимпульсов видеосигнала. Смесь строчных и кадровых синхроимпуль-сов с выходу компаратора подается на схему селекции по длительности, собранную на микросхеме D1. На выходе 6 элемента D1.3 выделяются строчные, а на выходе 8 D1.4 кадровые синхроимпульсы. Схема сдвига кадрового синхроимпульса ца длительность 64 строк, собранная на микросхеме D2, нужна для конкретного синхронизатора SCORPION' а и для других компьютеров может не понадобиться или выглядеть совсем по иному.
Схема синхронизатора приведена на рис. 2.
Синхронизатор размещается на макетном поле компьютера. Строчные и кадровые синхроимпульсы, выделенные селектором, а также сигнал тактовой частоты видеопроцессора подается на синхронизатор через разъем. Через этот же разъем выводится сигнал "окно", кото-
АВТОРСКАЯ РАЗРАБОТКА
D4.1
40*1
D1 - 555АГ1 D2 - 555ТВ6 D3 - 555КП16 D4 - 555ПН1
">3
Рис. 2.
АВТОРСКАЯ РАЗРАБОТКА
рый используется для реализации "синклеровского окна", о котором речь пойдет ниже. Мультиплексор D3 может отсутствовать, если видеопроцессор подключен к компьютеру "намертво". В моем варианте он установлен для того, что бы при отключении видеопроцессора все измененные цепи компьютера восстановились. Это достигается тем, что на ответной части разъема контакт ВПР заземлен и при подсоединении разъема видеопроцессора логический уровень сигнала на 1 ножке микросхемы D3 становится равным нулю. При этом синхронизатор подключается к компьютеру. Если разъем вынут, то уровень на управляющем входе мультиплексора задается резистором R2 и компьютер работает так, как будто никаких изменений в его схему внесено не было,
Тактовая частота видеопроцессора DENDY приблизительно 26.6 МГц и ее менять нельзя, т.к. под-несущая PAL формируется из нее и является ее 6-й субгармоникой. Чтобы избежать биений, пришлось снизить тактовую частоту SPECTRUM ' а до 13.3 МГц. это не сказывается на совместимости, при условии, что тактовая частота дискового интерфейса останется неизменной. Синхроимпульсы частотой 13.3 МГц, полученные делением частоты 26.6 МГц при помощи триггера D2.2 поступают через канал мультиплексора D3 на вход линейки делителей, вырабатывающих все синхропоследовательности компьютера. Генератор 14.0 МГц сохраняется и его сигнал по прежнему подается на микросхему D11.2. Это обеспечивает сохранение тактовой частоты контроллера дисковода равной 1 МГц.
Строчный синхроимпульс, выделенный из полного видеосигнала видеопроцессора, калибруется по длительности при помощи ждущего мультивибратора D1 и подается в виде положительного импульса на вход R триггера D2.1. Обычно этот триггер сброшен в 0 по входу R и на его инверсном выходе присутствует 1, разрешающая работу счетчиков. При появлении положительного импульса строчной синхронизации триггер переходит в единичное состояние по заднему фронту сигнала RAS и формирует импульс устанавливающий счетчики синхро-генератора компьютера в состояние соответствующее началу формирования новой строки. Поскольку импульс синхронизирован окончанием сигнала RAS динамической памяти, в любом случае цикл ее работы завершается нормально и сбоев не происходит.
Синхронизация по кадрам осуществляется сбросом счетчиков D5 и D6 (обозначения соответствуют фирменной схеме SCORPION ZS-256) в 0 в момент времени соответствующий верхней кромке активного экрана SPECTRUM'а, т.е. через промежуток времени соответствующий длительности 64 строк после кадрового синхроимпульса. Строгий ревнитель хорошего тона, может быть, возмутится таким грубым приемом, но в случае SCORPION'а он сработал вполне нормально. В других компьютерах фокус может и не пройти, но, поскольку кадровый счетчик непосредственно не связан с формированием синхросерий динамической памяти, требования к импульсу синхронизации по кадрам самые минимальные, и приемлемое решение всегда найдется без затруднений .
На рис. 3 приведены фрагменты схемы SCORPION ZS-256 с внесенными изменениями. Исходное состояние цепей показано пунктиром. Точки подключения синхронизатора отмечены цифрами, совпадающими с обозначенными на его схеме. Элементы D57.1 и D58.2 в исходной схеме незадействованы. Это изменение пришлось сделать из-за не вполне корректной адресации порта FFh в SCORPION'е.
При отладке схемы особое внимание следует уделить сигналу с частотой 26.6 МГц. При недостаточной амплитуде этого сигнала триггер D2.2 может работать неустойчиво, что неизбежно приведет к сбоям. Возможно, его придется сформировать при помощи микросхе-
РАЗРАБОТКА
011.2
02.2
033
13,
+5В
Рис. 3.
мы 531 серии, установленной в непосредственной близости от генератора DENDY. Признаком неустойчивой работы схемы является дрожание изображения по горизонтали. Если его не удается устранить подстройкой длительности импульса мультивибратора D1, значит помехи по питанию слишком велики и нужно ставить блокирующие конденсаторы. При длинном кабеле, соединяющем DENDY и SPECTRUM возможно придется экранировать провод, по которому поступает сигнал частотой 26.6 МГц.
Проблема согласования стандартов возникает из-за того, что видеопроцессор DENDY формирует полный видеосигнал в несколько упрощенном стандарте PAL, а большинство SPECTRUM'ов имеют выход RGB. Наиболее просто проблема решается, если Вы используете в качестве монитора телевизор 3 или 4 поколения, имеющий декодер PAL и разъем, на который выведены входы RGB и "окно". В этом случае достаточно обычным путем подключить DENDY по высокой или низкой частоте, a SPECTRUM - к соответствующему разъему, не забыв подключить сигнал "окно". Если такого разъема нет, то во многих телевизорах его можно сделать, т.к. соответствующие цепи в телевизоре есть, просто они не выведены на-
D3.1
2 58 |
30 8 |
5 57 |
29 7 |
6 56 |
28 6 |
9 55 |
27 5 |
12 54 |
26 4 |
15 53 |
25 3 |
16 52 |
24 2 |
19 51 |
23 1 |
|
22 23 |
|
21 22 |
|
20 19 |
|
92 18 |
2 2 |
78 20 |
5 3 |
|
6 4 |
|
9_5 |
76 2l |
12 6 |
47 1j |
15 7 |
|
16 8 |
31 13 |
19 9 |
59 3 |
|
76 14( |
i -17 |
77J5I 79 1 |
i
XI
RESET |
|
00 |
|
01 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
06 |
|
07 |
|
A5 |
|
A6 |
|
A7 |
|
WR |
|
RO |
|
Ml |
|
DOS |
|
WAIT |
|
IORO +5B |
|
£ND |
|
33
04
AO |
|
DO |
A1 |
|
01 |
A2 |
|
02 |
A3 |
|
03 |
A4 |
|
04 |
A5 |
|
05 |
A6 |
|
06 |
A7 |
|
07 |
A8 |
|
|
A9 |
|
|
A10 |
|
|
CS |
|
|
OE |
|
|
D5
9 58 |
30 10 |
10 57 |
23 9 |
11 56 |
28 8 |
13 55 |
27 7 |
14 54 |
26 6 |
15 53 |
25 5 |
16 52 |
24 4 |
17 51 |
23 3 |
|
2225 |
|
21 24 |
|
20 21 |
|
19 23 |
|
48 2 |
|
49 26 |
|
50 1 |
6 78 |
93 20 |
5 79 |
/822 |
4 80 |
81 27 |
3 81 |
|
3_4
4_7
5 8
6 13
7 14
8 17
9 18
85 111
DO |
go |
D1 |
01 |
03 |
02 |
03 |
|
D4 |
04 |
05 |
05 |
06 |
06 |
07 |
07 |
С |
|
OE |
|
02
00 D1 03
03
04
05
06 07
С
OE 9+5B
11 58 |
42 10 |
12 57 |
41 9 |
13 56 |
40 8 |
15 55 |
39 7 |
16 54 |
38 6 |
17 53 |
37 5 |
18 52 |
36 4 |
19 51 |
63 3 |
|
64 25 |
|
65 24 |
|
66 21 |
|
67 23 |
|
68 2 |
|
69 26 |
|
33 1 |
|
3320 |
|
3±22 91 27 |
X1.2
a 60 61 62
63
64
65
66 67 6§.
69
70 21
72
73 1
|
+ 5B |
|
RDV |
|
A12 |
|
A13 |
|
A14 |
|
D7 |
|
06 |
|
D5 |
|
D4 |
|
03 |
|
02 |
|
D1 |
|
DO |
|
CSS |
|
Ш»M |
|
HilllJliH |
|
WRV |
|
VCS' |
|
VA13 |
|
VA7 |
|
VA8 |
|
VA9 |
|
VA10 |
|
VA11 |
|
VA12 |
|
VA13 |
|
VD7 |
|
VD6 |
|
VD5 |
|
VD4 |
* RESET
XI.1
|
GND |
|
A11 |
|
A10 |
|
A9 |
|
A8 |
|
A7 |
|
A6 |
|
A5 |
|
A4 |
|
A3 |
|
A2 |
|
A1 |
|
AO |
|
WRS |
|
INT |
|
GNO |
|
OEV |
|
VA10* |
|
VA6 |
|
VA5 |
|
VA4 |
|
VA3 |
|
VA2 |
|
VA1 |
|
VAO |
|
VDO |
|
VD1 |
|
VD2 |
|
VD3 |
|
+5B |
AO |
|
DO |
A1 |
|
01 |
A2 |
|
02 |
A3 |
|
03 |
A4 |
|
04 |
A5 |
|
D5 |
A6 |
|
06 |
A7 |
|
07 |
A8 |
|
|
A9 |
|
|
A10 |
|
|
A11 |
|
|
A12 |
|
|
A13 |
|
|
A14 |
|
|
CS |
|
|
OE |
|
|
WR |
|
|
D10
D1 - 1533ИР23 02 - 1533ИР22 03 - 1533TM2 04 - 573РФ2
05,D6 - 1533ИД4 07 - 62256 08 - 1533ПА2 09 - 62256
D10 - 1533TM8 D11 - 1533ЛА5 D12 - 1533ЛЕ1 013 - 1533ПН1
Рис.4*
АВТОРСКАЯ РАЗРАБОТКА
ружу. Несколько сложнее ситуация, если декодер PAL есть, но вход RGB с "окном" отсутствует. Это может быть, если блок цветности собран с применением микросхем 174АФ4, 174АФ5 или 174ХА1, а декодер PAL установлен позднее. В этом случае самым простым выходом будет "врезка" в сигнал DENDY сигналов RGB, обработанных схемой, содержащей резисторную матрицу, квадратурный модулятор и схему формирования цветовой под-несущей. Схема получается несложной, т.к. в видеосигнале DENDY не используется чересстрочная развертка и фаза вспышек цветовой поднесущей от кадра к кадру не меняется. Если же Ваш телевизор не имеет PAL-декодера или Вы используете монитор, то можно порекомендовать изготовить блок сопряжения по упрощенной (не нужны оконечные видеоусилители) схеме модуля цветности МЦ-31, заменив микросхему 174ХА16 на 174ХА28 с соответствующим обрамлением. Я встроил такой блок в свой монитор и вполне доволен результатом.
Схема интерфейсной платы, обеспечивающей взаимодействие SPECTRUM'а и DENDY приведена на рис. 4. Приведен вариант, в котором в качестве системного ОЗУ и видео-ОЗУ используются импортные микросхемы емкостью 32 Кб. Этот вариант минимален по количеству корпусов, но не по стоимости. При замене микросхемы D7 на отечественную меньшей емкости, старшие разряды шины адреса просто не используются. Эту микросхему лучше установить на 28-контактный со-кет. Тогда замена ее в будущем на микросхему большей емкости упростится. Два полноценных варианта замены микросхемы D9 приведены на рис. 5 и 6.
Если используется готовая DENDY, то плата вставляется в ее слот, в ином случае схема должна быть дополнена микросхемой 6561, парой 6527 и 6538 с соответствующим обрамлением или неопознанным вылетающим (причем регулярно) кристаллом производства КНР. Последний вариант самый удобный 537РУ17
11 43 |
42 10 |
12 44 |
41 9 |
13 45 |
40 8 |
15 46 |
39 7 |
16 73 |
38 6 |
17 72 |
37 5 |
18 71 |
36 4 |
19 70 |
63 3 |
|
64 25 |
65 24 |
66 21 67 23 |
88 2 |
91 27 34 22 |
69 20 |
РИС. 5.
конструктивно и, во всяком случае, самый дешевый, но не самый надежный.
На интерфейсной плате установлены ПЗУ типа 573РФ2 с зашитым в нем загрузчиком, системное ОЗУ типа 62256 или AS7C256 емкостью 32 Кб, видео-ОЗУ такого же типа, двунаправленный интерфейсный регистр с триггером флага запроса на микросхемах 1533ИР22, 1533ИР23 и 1533ТМ2, регистр состояния на микросхеме 1533ТМ8, селектор адреса со стороны DENDY на двух микросхемах 1533ИД4, селектор адреса со стороны SPECTRUM на микросхеме 153 3ЛА2 и схема блокировки записи на микросхеме 153 3/1A3.
D9,;
АО |
|
DO |
А1 |
|
01 |
А2 |
|
02 |
A3 |
|
03 |
А4 |
|
D4 |
А5 |
|
D5 |
AG |
|
06 |
А7 |
|
D7 |
А8 |
|
|
А9 |
|
|
А10 |
|
|
All |
|
|
А12 |
|
|
WR |
|
|
OE |
|
|
CS |
|
|
11 43
12 |
44 |
13 |
45 |
15 |
46 |
16 |
73 |
17 |
72 |
18 |
71 |
19 |
70 |
09' - 537РУ17 D9" - 537РУ10 D14 - 1533ИД7
Рис. 6.
09*
42 10
40 8
39 7
38 6
37 5
36 4
63 3
64 25
65 24
66- 21 67 23
91 27 34 22
69 20
AO |
|
DO |
A1 |
|
01 |
|
A2 |
|
D2 |
|
A3 |
|
03 |
|
A4 |
|
D4 |
|
A5 |
|
D5 |
|
A6 |
|
06 |
|
A7 |
|
07 |
|
A8 |
|
|
AS |
|
|
A10 |
|
|
All |
|
|
A12 |
|
|
WR |
|
|
OE |
|
|
CS |
|
|
Адрес интерфейсного регистра со стороны DENDY 6000h, со стороны SPECTRUM 7Fh. Адрес регистра состояния 6001h. Разряды регистра состояния:
D5 - 0 включено ПЗУ 1 включено ОЗУ D6 - О запись в память разрешена 1 запись в память запрещена D7 - 1 блокировка регистра состояния и запрет взаимодействия со SPECTRUM.
Разряды DO - D4 зарезервированы для расширения возможностей видеопроцессора. Задумки на этот счет есть, но пока говорить о них рано.
Обмен информацией всегда происходит по инициативе SPECTRUM. Запись байта в интерфейсный регистр вызывает прерывание DENDY. SPECTRUM тормозится по WAIT (возможно по BRQ, если конкретная модель не допускает использования сигнала WAIT), пока DENDY не запишет ответ со своей стороны в интерфейсный регистр. Реально цикл запрос-ответ занимает время 10 - 50 мкс, если процессор DENDY не занят обработкой немаскируемого прерывания или не отключен контроллером ПДП. В противном случае время ожидания может достигать 1000 мкс.
Загрузчик, размещенный в ПЗУ, имеет всего две команды: загрузка драйвера и идентификация варианта. Вторая команда сообщает SPECTRUM'у объем задействованной памяти, чтобы он мог решить, пойдет ли загружаемая программа с данным видеопроцессором.
Микросхему 573РФ2, с зашитым в нее загрузчиком, и дискету или кассету с драйвером можно будет приобрести в ИНФОРКОМЕ в самое ближайшее время.
Программная часть.
При эксплуатации системы SPECTRUM-DENDY неплохих результатов можно добиться, даже не умея программировать на ассемблере Z-80, т.к. при использовании готового драйвера управление видеопроцессором может осуществляться из BASIC по порту 127. Возможно, появится версия LASER-BASIC адаптированная к видеопроцессору. Однако, наиболее эффективные программы могут быть написаны в машинных кодах на ассемблере.
Доступ к видеопроцессору возможен только через драйвер, размещенный в ОЗУ DENDY и написанный в машинных кодах DENDY. Написать такой драйвер можно, только зная ее архитектуру и систему команд. Ограниченный объем этой статьи позволяет мне привести только самую необходимую информацию.
Адресное пространство центрального процессора DENDY составляет 64 Кб.
Адреса 0000h-07FFh занимает встроенное ОЗУ, в котором размещаются стек и переменные.
8 адресов с 2000h по 2007h занимает видеопроцессор, подключенный как байтовое устройство ввода/вывода .
Начиная с адреса 4000h размещены регистры музпроцессора, порты джойстиков и светового пистолета, управляющий регистр контроллера ПДП.
Адреса 6000h и 6001h занимают регистры интерфейсной платы.
С адреса 8000h по OFFFFh размещается основная память, в которой хранится выполняемая программа .
Центральный процессор в основном аналогичен известному 6502. Он имеет всего три 8-разрядных регистра: аккумулятор А и два индексных регистра X и Y. Кроме того, есть регистр флагов Р и 9-разрядный указатель стека S, старший разряд которого всегда 1.
АВТОРСКАЯ РАЗРАБОТКА
В области |
старших адресов раз- |
3. IMM - непосредственная |
мещены три вектора: |
|
4. ABS - абсолютная |
OFFFAh - |
немаскируемое преры- |
5. ZP - абсолютная короткая. |
вание NMI; |
|
|
Задается только младший байт ад |
OFFFCh - |
холодный старт 8TART; |
реса. Старший равен 0. |
OFFFEh - |
маскируемое |
прерыва- |
6. ZP,X - индексная короткая |
ние INT; |
|
|
по регистру X. |
Двухбайтные числа размещаются |
7. ZP,Y - индексная короткая |
в памяти по принципу |
"младший |
по регистру Y. |
байт по младшему адресу" |
, так же, |
8. ABS,X - индексная длинная |
как и у Z-80 |
|
|
по регистру X. |
Формат регистра флагов Р: |
9. ABS,Y - индексная длинная |
0 разряд |
- С ; перенос. 1 при |
по регистру Y. |
сложении, *0 |
при вычитании. |
10. REL - относительная для |
1 разряд |
- Z ; ZERO. |
1, если |
коротких условных переходов. |
результат равен 0. |
|
11. IND,X - индекдно-косвенная |
2 разряд |
- I ; INT. |
1, если |
по X. Адрес исполнительного адре |
прерывание разрешено. |
|
са вычисляется как сумма аргумен |
3 разряд |
- D ; DECIM |
. 1, если , |
та и X. Перенос не учитывается. |
десятичный режим. |
|
12. IND,Y - косвенно-индексная |
4 разряд |
- В ; BRK |
1 при вы- |
по Y. Исполнительный адрес вычис |
полнении команды BRK. |
|
ляется как сумма Y и содержимого |
5 разряд |
всегда 1. |
|
пары ячеек, адресуемых аргумен |
6 разряд |
- V ; арифметическое |
том . |
переполнение. |
|
13. IND - косвенная длинная. |
7 разряд |
- N ; SIGN устанавли- |
Адрес располагается по адресу, |
вается по D7 |
|
|
определяемому аргументом. Аргу |
|
|
|
мент - полный адрес. |
Методы адресации |
|
Команды коротких условных пе |
|
|
|
реходов реализованы совершенно |
1. АСС -- |
аккумуляторная |
аналогично подобным командам |
2. IMPL - |
неявная |
|
Z-80 . |
|
Система команд |
Мнемо |
Функция |
Метод |
Код К-во Флаги |
|
|
адрес. |
HEX байт |
ADC |
А=А+М+С |
IMM |
69h 2 N,V,Z,С |
|
|
ZP |
65h 2 |
|
|
ZP,X |
75h 2 |
|
|
ABS |
6Dh 3 |
|
|
ABS, X |
7Dh 3 |
|
|
ABS, Y |
79h 3 |
|
|
(IND,X) |
61h 2 |
|
|
(IND),Y |
71h 2 |
AND |
A=AandM |
IMM |
29h 2 N,Z |
|
|
ZP |
25h 2 |
|
|
ZP,X |
3 5h 2 |
|
|
ABS |
2Dh 3 |
|
|
ABS, X |
3Dh 3 |
|
|
ABS, Y |
39h 3 |
|
|
(IND,X) |
21h 2 |
|
|
(IND),Y |
31h 2 |
|
|
АВТОР |
С К А Я |
P A |
3 P A |
Б 0 T К A |
|
ASL |
арифметич. |
ACC |
OAh |
1 |
Z,C : |
|
сдвиг |
ZP |
06h |
2 |
|
|
влево |
ZP,X |
16h |
2 |
|
|
DO-O |
ABS |
OEh |
3 |
|
|
C=D7 |
ABS, X |
lEh |
3 |
|
всс |
IF C=0 |
REL |
90h |
2 |
|
BCS |
IF C=1 |
REL |
BOh |
2 |
|
BEQ |
IF Z = 1 |
REL |
FOh |
2 |
|
BIT |
AandM |
ZP |
24h |
2 |
N=M7,V=M6 |
|
|
ABS |
2Ch |
3 |
Z=F(AandM) |
BMI |
IF N=1 |
REL |
30h |
2 |
|
BNE |
IF Z = 0 |
REL |
DOh |
2 |
|
BPL |
IF N=0 |
REL |
lOh |
2 |
|
BRK |
программное |
IMPL |
ooh |
1 |
|
|
прерывание |
|
|
|
|
BVC |
IF V=0 |
REL |
50h |
2 |
|
BVS |
IF V=1 |
REL |
70h |
2 |
|
CLC |
C=0 |
IMPL |
I8h |
1 |
сброс |
CLD |
D=0 |
IMPL |
D8h |
1 |
выбранного |
CLI |
1=0 |
IMPL |
58h |
1 |
флага |
CLV |
V=0 |
IMPL |
B9h |
1 |
|
CMP |
A-M |
I MM |
C9h |
2 |
N, Z , С i |
|
сравнение |
ZP |
C5h |
2 |
|
|
|
ZP,X |
D5h |
2 |
|
|
|
ABS |
CDh |
3 |
|
|
|
ABS, X |
DDh |
3 |
|
|
|
ABS, Y |
D9h |
3 |
|
|
|
(IND,X) |
Clh |
2 |
|
|
|
(IND),Y |
Dlh |
2 |
|
CPX |
X-M |
I MM |
EOh |
2 |
N , Z , С |
|
сравнение |
ZP |
E4h |
2 |
|
|
|
ABS |
ECh |
3 |
|
CPY |
Y-M |
IMM |
COh |
2 |
N , Z , С |
|
сравнение |
ZP |
C4h |
2 |
|
|
|
ABS |
CCh |
3 |
|
DEC |
M=M-1 |
ZP |
ceh |
2 |
N, Z I |
|
|
ZP,X |
D6h |
2 |
|
|
|
ABS |
CEh |
3 |
|
|
|
ABS, X |
DEh |
3 |
|
DEX |
X=X-1 |
IMPL |
CAh |
1 |
N,Z |
|
|
АВТОРСКАЯ |
P A |
3 P |
А Б О T К А |
|
DEY |
Y=Y-1 |
IMPL |
88h |
1 |
N,Z |
INX |
X=X + 1 |
IMPL |
E8h |
1 |
N, Z |
INY |
Y=Y+1 |
IMPL |
C8h |
1 |
N,Z |
EOR |
A=AxorM |
IMM |
49h |
2 |
N,Z |
|
исключающее |
ZP |
45h |
2 |
|
|
или |
ZP,X |
55h |
2 |
|
|
|
ABS |
4Dh |
3 |
|
|
|
ABS, X |
5Dh |
3 |
|
|
|
ABS, Y |
59h |
3 |
|
|
|
(IND,X) |
41h |
2 |
|
|
|
(IND),Y |
51h |
2 |
|
INC |
M=M+1 |
ZP |
E6h |
2 |
N, Z |
|
|
ZP,X |
F6h |
2 |
|
|
|
ABS |
EEh |
3 |
|
|
|
ABS, X |
FEh |
3 |
|
JMP |
переход |
ABS |
4Ch |
3 |
|
|
|
IND |
6Ch |
3 |
|
JSR |
обращение к |
ABS |
20h |
3 |
|
|
подпрограмме |
|
|
|
|
LDA |
А=М |
IMM |
A9h |
2 |
N, Z |
|
|
ZP |
A5h |
2 |
|
|
|
ZP,X |
B5h |
2 |
|
|
|
ABS |
ADh |
3 |
|
|
|
ABS, X |
BDh |
3 |
|
|
|
ABS, Y |
B9h |
3 |
|
|
|
(IND,X) |
Alh |
2 |
|
|
|
(IND),Y |
Blh |
2 |
|
NOP |
нет операции |
IMPL |
EAh |
1 |
|
LDX |
Х=М |
IMM |
A2h |
2 |
N, Z |
|
|
ZP |
A6h |
2 |
|
|
|
ZP, Y |
B6h |
2 |
|
|
|
ABS |
AEh |
3 |
|
|
|
ABS, Y |
В Eh |
3 |
|
LDY |
Y=M |
IMM |
AOh |
2 |
N,Z |
|
|
ZP |
A6h |
2 |
|
|
|
ZP,X |
B4h |
2 |
|
|
|
ABS |
ACh |
3 |
|
|
|
ABS, X |
BCh |
3 |
|
LSR |
арифметический |
ACC |
4 Ah |
1 |
N=0,Z,C |
|
сдвиг |
ZP |
46h |
2 |
|
|
вправо |
ZP,X |
56h |
2 |
|
|
D7=0,C=D0 |
ABS |
4Eh |
3 |
|
|
|
ABS, X |
5 Eh |
3 |
|
|
РАЗРАБОТКА
ORA |
А=AorM |
IMM |
09h |
2 |
n, z |
|
|
ZP |
05h |
2 |
|
|
|
ZP,X |
15h |
2 |
|
|
|
ABS |
ODh |
3 |
|
|
|
ABS , X |
1 Dh |
3 |
|
|
|
ABS, Y |
19h |
3 |
|
|
|
( IND,X) |
01 h |
2 |
|
|
|
(IND),Y |
llh |
2 |
|
РНА |
А в стек |
IMPL |
4Bh |
1 |
|
РНР |
Р в стек |
IMPL |
08h |
1 |
|
PLA |
А из стека |
IMPL |
68h |
1 |
|
PLP |
Р из стека |
IMPL |
2 8h |
1 |
все флаги из стека |
ROL |
циклический |
ACC |
2Ah |
1 |
N , Z , С |
|
сдвиг |
ZP |
26h |
2 |
|
|
влево |
ZP,X |
36h |
2 |
|
|
|
ABS |
2Eh |
3 |
|
|
|
ABS , X |
3Eh |
3 |
|
ROR |
циклический |
ACC |
6Ah |
1 |
N , Z , С |
|
сдвиг |
ZP |
66h |
2 |
|
|
вправо |
ZP,X |
76h |
2 |
|
|
|
ABS |
6Eh |
3 |
|
|
|
ABS, X |
7Eh |
3 |
|
RTI |
возврат из |
IMPL |
4 Oh |
1 |
из стека |
|
прерываний |
|
|
|
|
RTS |
возврат из |
IMPL |
60h |
1 |
|
|
подпрограммы |
|
|
|
|
SBC |
А=А-М-С |
IMM |
E9h |
2 |
N , V, Z , С |
|
|
ZP |
E5h |
2 |
|
|
|
ZP,X |
F$h |
2 |
|
|
|
ABS |
EDh |
3 |
|
|
|
ABS, X |
FDh |
3 |
|
|
|
ABS, Y |
F9h |
3 |
|
|
|
(IND,X) |
Elh |
2 |
|
|
|
(IND),Y |
Flh |
2 |
|
STA |
М=А |
ZP |
85h |
2 |
|
|
|
ZP,X |
95h |
2 |
|
|
|
ABS |
8Dh |
3 |
|
|
|
ABS, X |
9Dh |
3 |
|
|
|
ABS, Y |
99h |
3 |
|
|
|
(IND,X) |
81 h |
2 |
|
|
|
(IND),Y |
91h |
2 |
|
STX |
М = Х |
ZP |
86h |
2 |
|
|
|
ZP, Y |
96h |
2 |
|
|
|
ABS |
8Eh |
3 |
|
STY |
M=Y |
ZP |
84h |
2 |
|
|
|
ZP,X |
94h |
2 |
|
|
|
ABS |
8Ch |
3 |
|
АВТОРСКАЯ РАЗРАБОТКА
SEC |
|
IMPL |
SED |
|
IMPL |
SEI |
запрет прерыв. |
IMPL |
TAX |
X=A |
IMPL |
TAY |
Y=A |
IMPL |
ТХА |
A=X |
IMPL |
TYA |
A=Y |
IMPL |
TSX |
X=S |
IMPL |
TXS |
S=X |
IMPL |
38h |
C=1 |
F8h |
D= 1 |
78h |
1 = 1 |
AAh |
N,Z |
A8h |
N , Z |
8Ah |
N , Z |
98h |
N, Z |
BAh |
N,Z |
9Ah |
|
Видеопроцессор.
Видеопроцессор DENDY имеет разрешающую способность 256*240 пикселов или 32*30 знакомест размером 8*8 пикселов. Он поддерживает использование 14 цветов при 4 градациях яркости. Система формирования спрайтов полностью автономна и позволяет использовать до 64 спрайтов на экране одновременно. Видеопроцессор имеет 4 плана изображения и две независимых палитры цветов. На выходе видеопроцессора формируется полный телевизионный сигнал в несколько упрощенном стандарте PAL с амплитудой около 1 вольта. С точки зрения программиста видеопроцессор является периферийным устройством с байтовым обменом через 8 портов ввода/вывода.
К сожалению, он имеет две неприятные особенности, которые затрудняют его непосредственное использование в ZX-SPECTRUM.
В большинстве случаев обмен информацией возможен только во время обратного хода по кадру. Видеопроцессор вырабатывает сигнал готовности к обмену, который в DENDY подключен к входу немаскируемого прерывания и почти весь обмен идет по прерываниям. Использование такого приема в SPECTRUM'е в принципе возможно, но при этом возникнут некоторые сложности с обеспечением совместимости .
Вторая особенность связана с оригинальной системой адресации внутреннего ОЗУ, в котором хранятся параметры спрайтов. В DENDY проблема доступа в это ОЗУ решается применением контроллера ПДП.
Кроме внутреннего ОЗУ объемом 256 байт, видеопроцессор имеет 25 регистров цвета и к нему должно быть подключено внешнее запоминающее устройство, в состав которого должно входить, как минимум, 2 Кб ОЗУ и 4-8 Кб ПЗУ, которое тоже может быть заменено на ОЗУ.
Именно в таком минимальном варианте видеопроцессор и используется в DENDY. Его возможности значительно увеличиваются, если его адресное пространство, составляющее 16 Кб, задействовать полностью. К счастью, такая возможность есть даже при использовании однокристального варианта. Разработчики DENDY вывели на разъем картриджа все необходимые для этого сигналы, видимо, на всякий случай.
Рассмотрим распределение памяти в адресном пространстве видеопроцессора. С адреса OOOOh по IFFFh размещена область хранения образов графических примитивов, из которых строится пейзаж и которые могут быть использованы как элементы спрайтов. Если придерживаться классификации книги "Динамическая графика", можно сказать, что видеопроцессор работает с блочной графикой. Любое изображение строится из блоков размером 8*8 пикселов. Некоторую аналогию здесь можно провести со способом хранения образов символов в SPECTRUM1е. Совокупность образов всех символов принято называть символьным набором или фонтом. Фонт в SPECTRUM'е содержит 96 образов символов и имеет размер 768 байт. Чтобы не придумывать нового термина, совокупность образов графических примитивов видеопроцессора я тоже буду называть фонтом, хотя следует помнить, что в данном случае речь не идет о символах .
Графический примитив, выведенный на экран, я буду называть блоком, а его же в составе фонта - элементом. В памяти видеопроцессора содержится два фонта по 256 элементов каждый. Элемент имеет размер 16 байт. Блок формируется из элемента путем наложения первых 8 байт на вторые. Таким образом, за каждый пиксел блока отвечают два бита элемента. Эти два бита можно рассматривать как код пиксела, который может принимать 4 значения. Младшим разрядом кода является бит, входящий в байт, имеющий меньший адрес .
На рис. 7 приведен пример элемента фонта с изображением монстрика зеленого цвета (код пиксела 01), с голубыми глазами (код 10) и красными губами (код 11). Цвета задаются при программировании регистров цвета.
Рис. 8 показывает, как этот монстрик будет выглядеть на экране .
0000 0001 0002
0003
0004
0005
0006
0007
0008 0009 000Й ооов ооос
000D 000Е 000F
00 |
01 |
01 |
01 |
01 |
01 |
01 |
00 |
01 |
1 0 |
10 |
01 |
01 |
10 |
10 |
01 |
01 |
10 |
10 |
01 |
01 |
10 |
10 |
01 |
01 |
01 |
01 |
01 |
01 |
01 |
01 |
01 |
00 |
01 |
11 |
11 |
11 |
11 |
01 |
00 |
00 |
00 |
01 |
01 |
01 |
01 |
00 |
00 |
00 |
00 |
01 |
00 |
00 |
01 |
00 |
00 |
00 |
01 |
01 |
00 |
00 |
01 |
01 |
00 |
Рис. 8.
С адреса 2000h по 2FFFh размещены 4 экранных области, каждая объемом по 1 Кб. В каждом экране первые 960 байт соответствуют знакоместам на телевизионном экране, так же, как байты из области атрибутов SPECTRUM. Каждый байт определяет, какой блок будет выведен в данное знакоместо и содержит номер элемента фонта. Совокупность всех блоков формирует пейзаж. Оставшиеся 64 байта содержат атрибуты экрана. Каждый байт определяет атрибуты 16 знакомест, расположенных в виде квадрата размером 4*4 знакоместа и составляющих 4 кластера размером 2*2 знакоместа. Для знакомест, входящих в один кластер, атрибуты одинаковы. Два бита из байта атрибута, соответствующие кластеру, являются его кодом.
Разложение экрана показано на рис. 9. Указаны адреса байтов, ответственных за знакоместа и атрибуты относительно начала экрана. В центральном квадрате показано, какие разряды байта атрибута определяют коды соответствующих кластеров.
Назначение области памяти начиная с адреса ЗОООЬ по 3EFFh выяснить не удалось. Если к этим адресам подключено ОЗУ, то можно записать или считать информацию, но при этом никаких видимых изменений на экране не происходит. В видеоприставках эта область памяти вообще не задействована, как впрочем и почти три экрана из четырех возможных.
Область памяти с 3F00h по 3FFFh имеет особое назначение. При попытке записи или чтения, ОЗУ блокируется. Сигналы ОЕ и WR не вырабатываются. Здесь расположены регистры цвета, в которые информацию можно только записывать .
Внутреннее ОЗУ объемом 256 байт содержит параметры спрайтов. Каждый спрайт описывается последовательно расположенной четверкой байтов. Они имеют следующее назначение:
0 - координата Y
1 - номер элемента фонта
2 - атрибут спрайта
3 - координата X
Координаты отсчитываются в пикселах от левого верхнего угла телевизионного растра и относятся к левому верхнему углу спрайта.
Значение разрядов атрибута спрайта:
О и 1 - код цвета спрайта, аналогично коду кластера.
5 - план изображения. О спрайт над пейзажем. 1 - спрайт под пейзажем.
6 - при 1 зеркальный поворот спрайта по горизонтали.
7 - при 1 зеркальный поворот спрайта по вертикали.
Значение 2, 3 и 4 разрядов не выяснено.
Управление цветом.
Регистры цветов объединены в три палитры.
В первую палитру входит всего один регистр с адресом 3F00h. Он
определяет цвет фона, самого глубокого плана изображения.
Во вторую палитру входят регистры с адресами от 3F01h по 3F0Fh. Младший нибл адреса является номером регистра в палитре. Это палитра пейзажа. Номер регистра для каждого пиксела пейзажа определяется как сумма кода пиксела с учетверенным кодом кластера, за исключением случая, когда код пиксела равен нулю. В этом случае данный пиксел является как бы "прозрачным". Через него "просвечивает" нижележащий план изображения. Таким образом, в одном кластере может быть не более 4 различных цветов, а в пределах всего экрана не более 13.
В третью палитру входят регистры с адресами с 3Fllh по 3FlFh. Это палитра спрайтов. Цвета определяются совершенно аналогично палитре пейзажа, но вместо кода кластера фигурирует код спрайта. Палитры независимы друг от друга и общее количество задействованных одновременно цветов с учетом спрайтов достигает 25.
Регистр цвета содержит в своем младшем нибле код цвета, причем коды Е и F не задействованы. Разряды 4 и 5 определяют градацию яркости'.
АВТОРСКАЯ РАЗРАБОТКА
0000 |
0 |
.... |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
А |
В |
С |
D |
Е |
F |
Ю |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
1А |
1В |
ФМ |
[IF |
0020 |
■п |
33 |
— сс |
г |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
' 1 ' |
0040 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0060 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0080 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ООАО |
|
ЭЗ |
с? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЭЗ |
CF |
|
OOCtt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
00Е0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
01 00 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
01 20 |
|
эз |
DC |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЭЗ |
07 |
|
0140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
01 АО |
|
эз |
0£ |
|
|
|
|
|
|
|
|
|
1 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЭЗ |
DF |
|
01С0 |
|
|
|
|
|
|
|
|
|
|
1 |
1
,5 |
6 |
1
,7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
С 1 Е0 |
|
|
|
|
|
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0220 |
|
D3 |
ЕС |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ЭЗ |
Е7 |
|
0240 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0260 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0280 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
02 АО |
|
03 |
Е£ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
эз |
EF |
|
02С0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
02ЕО |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0300 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0320 |
|
03 |
FC |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
03 |
F7 |
|
0340 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0360 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0380 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
03А0 |
03F8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
03FF |
Рис. 9.
Разряды 6 и 7 не задействованы. Таким образом, общее количество возможных цветов с учетом градаций яркости составляет 56.
С относительно простыми вопросами архитектуры видеопроцессора покончено. Перейдем к более сложным, а именно, система команд и управление видеопроцессором.
Управление видеопроцессором.
Видеопроцессор занимает в адресном пространстве видеоприставки адреса с 2000h по 2007h.
Назначение регистров:
2000h - регистр состояния
2001h - регистр режима вывода на экран
2002h - регистр синхронизации
2003h - регистр адреса ОЗУ спрайтов
2004h - регистр данных ОЗУ спрайтов
2005h - регистр скроллинга пейзажа
2006h - регистр адреса внешнего ОЗУ
2007h - регистр данных внешнего ОЗУ
Начнем с регистров, имеющих более простые функции.
Чтобы записать информацию в ОЗУ, подключенное к видеопроцессору, нужно вначале указать адрес записи. Это осуществляется путем последовательной записи пары байтов по адресу 2006h. Первым идет старший байт, затем младший. Когда адрес установлен, можно записать данные по адресу 2007h. После записи этого байта адрес инк-рементируется и запись следующего байта произойдет в следующую по порядку ячейку ОЗУ. Таким образом, для записи массива достаточно установить его начальный адрес и просто передать его весь по адресу 2007h.
Для считывания массива из внешнего ОЗУ видеопроцессора, его адрес также задается через регистр 2006h, и чтение данных производится по адресу 2007h, но первый считанный байт недостоверен и после первого цикла чтения адрес ОЗУ не инкрементируется. Это означает, что перед чтением массива нужно сделать один холостой цикл чтения, без использования результата.
Запись и чтение ОЗУ спрайтов производится аналогично, только по адресу 2003h нужно передать не два, а один байт, т.к. емкость внутреннего ОЗУ всего 256 байт. Но если Вы попробуете написать реальную программу с использованием этого варианта, у Вас ничего не получится. Просто не хватит быстродействия. Дело в том, что в ОЗУ пейзажа большие объемы информации записываются загодя, предварительно переведя видеопроцессор в режим, разрешающий постоянный доступ к ОЗУ (экран при этом окрашивается в цвет фона, а изображение исчезает), а при скроллинге нужно заменять в каждом цикле не более 30-32 байт.
При управлении спрайтами нужно переписать 256 байт, и не Просто переписать готовые значения, как в случае изменения пейзажа, а вычислить новые координаты и, возможно, атрибуты! Когда я попробовал решить эту задачу на SPECTRUM ■е с его более мощным и быстродействующим процессором, у меня ничего не вышло. Проблема легко решается с использованием контроллера ПДП. Достаточно не спеша сформировать нужный массив по адресу, скажем, 0200h (не спеша, потому что время готовности к обмену видеопроцессора менее 1 ms, а промежуток между прерываниями почти 20 ms) и при наступлении прерывания контроллер ПДП менее чем за 100 mks перебросит этот массив в ОЗУ спрайтов видеопроцессора. При этом останется еще много времени на другие операции, которые, возможно, нужно успеть сделать, пока видеопроцессор не утратил способности к обмену. Контроллер ПДП сам называет нужные адреса регистров видеопроцессора поэтому при анализе дендивс-ких программ Вы никогда не ветре-тите адреса 2004h и очень редко, как правило только в процедуре прерывания, адрес 2003h.
Регистр синхронизации 2002h работает только на чтение и используется обычно для организации задержек, аналогично команде HALT в SPECTRUM*е. Польза от его применения при написании драйвера видеопроцессора для SPECTRUM'а как-то не просматривается....
Регистр скроллинга 2005h позволяет осуществлять очень плавный скроллинг пейзажа в любом направлении. Информация в него засылается в виде двух последовательных байтов, так же, как и в регистр адреса внешнего ОЗУ. Младший байт ответственен за скроллинг по горизонтали, старший - по вертикали. Изменение значения на 1 вызывает сдвиг пейзажа на 1 пиксел. При одновременном изменении значений обоих байтов получается сдвиг в диагональных направлениях. Увеличение младшего байта вызывает сдвиг влево, а старшего -вверх. В отличие от большинства функций, команда скроллинга будет воспринята и правильно выполнена в любой момент, а не только «во время готовности видеопроцессора. Скроллинг является циклическим, но в цикле, как по горизонтали, так и по вертикали задействованы два экрана. Поэтому реализация нециклического скроллинга не представляет никаких затруднений. Взаимное расположение экранов может быть изменено дополнительной командой. Возможные варианты приведены на рис. 10 (см. ниже).
Регистр режима вывода на экран 2001h служит для управления выводом на экран монитора в целом. Если заслать в него число 00h, вывод на экран как пейзажа, так и спрайтов запрещается, экран окрашивается в цвет фона, а видеопроцессор переходит в состояние постоянной готовности к обмену. Этим режимом удобно пользоваться во время инициализации фонтов, экранов и регистров цвета. В некоторых играх, в частности, в известной "Принц Персии", по ходу игры фонты и экраны постоянно переинициализируются. Это заметно по погасанию экрана во время перехода героя из одного помещения в другое .
Любая команда, отличная от 00h, выводит видеопроцессор из режима постоянной готовности к обмену.
Разряд 0 регистра 2001h, при установке в 1, запрещает вывод цветного изображения. Остаются только градации яркости.
При 1 в разряде 3 разрешается вывод пейзажа, а при 1 в разряде 4 - вывод спрайтов.
0 в разрядах 1 и 2 включает режим маскирования крайнего левого столбца знакомест для пейзажа и спрайтов соответственно. Режим маскирования спрайтов позволяет удалить неиспользуемые в данный момент спрайты установкой их координаты X равной 0. Разряды 5, 6 и 7, хотя и оказывают незначительное влияние на яркость и оттенок изображения в целом, во всех исследованных мною играх всегда установлены в 0 и могут считаться незадействованными.
Регистр состояния 2000h выполняет разнообразные и достаточно сложные функции. Сразу хочу сказать, что назначение разрядов 2 и 6 мне установить не удалось, хотя они явно задействованы и при управлении по ним что-то происходит. Все описание видеопроцессора приведенное здесь, справедливо при установке этих разрядов в 0. Возможно, в будущем мне или кому-то другому удастся идентифицировать эти разряды и откроются новые возможности видеопроцессора.
Как уже сообщалось выше, синхронизация обмена между центральным процессором и видеопроцессором происходит путем использования механизма немаскируемых прерываний. Эти прерывания невозможно запретить на уровне команд центрального процессора, но их можно замаскировать, установив 7 разряд регистра 2000h видеопроцессора в ноль.
Разряды 0 и 1 этого регистра определяют, какая из четырех экранных областей используется в данный момент, при условии, что в регистре скроллинга записано значение OOOOh. Точнее, они определяют взаимное расположение экранов, соответствующих этим экранным областям. Расположение экранов в зависимости от состояния этих разрядов приведено на рис 10. Двойной рамкой выделен экран, включаемый при записи в регистр скроллинга значения OOOOh.
00 01
0 1
2 3
10 11
2 3
0 I
Рис. 10.
Разряд 3 определяет номер фонта, элементы которого участвуют в формировании спрайтов, а разряд 4 выполняет аналогичную функцию для пейзажа.
Разряд 5, при установке его в 1, вызывает удвоение спрайтов. Спрайт формируется из двух блоков, расположенных по вертикали и соответствующих двум последовательно расположенным элементам фонта. Причем номер первого элемента всегда четный. Если задан четный номер элемента фонта, то используется нулевой фонт, а если нечетный, то первый, независимо от состояния разряда 3.
При описании видеопроцессора я пользовался термином "спрайт", хотя имелся ввиду один блок, входящий в состав реального спрайта. Спрайт составляется из отдельных блоков и, в принципе, может иметь любой размер и форму, хватило бы блоков. 64 блока спрайтов - это очень много, даже без применения режима удвоения, поэтому в реальных играх часто блоки спрайтов используются как элементы пейзажа для расширения палитры пейзажа. Надписи, возникающие по ходу игры, как правило, формируются с использованием механизма спрайтов .
"Синклеровское окно".
Из описания видеопроцессора ясно, что, поскольку минимально адресуемым элементом изббражения является блок размером 8*8 пикселов, работа с отдельными пикселами очень затруднена. Поэтому в дендивских играх никогда не встречается векторная графика, а при выводе текста используется шрифт с размером символов кратным 8 пикселам. Это не очень большое ограничение, т.к. блочная графика видеопроцессора все равно на порядок, если не на два, быстрее векторной графики SPECTRUM'а.
Несколько ослабить этот недостаток и попутно обеспечить, совместимость SPECTRUM'а, оснащенного видеопроцессором с классическими программами, позволяет "синклеровское окно".
При задании синклеровского окна часть изображения, формируемого видеопроцессором, заменяется изображением, формируемым SPECTRUM 'ом. Синклеровское окно может быть задано в пределах активной части экрана SPECTRUM'а. Оно может иметь любой размер от одного знакоместа до всего экрана, любую форму и связность. При вводе классических игр в подавляющем большинстве случаев синклеровское окно автоматически устанавливается максимальным - на весь экран.
Для реализации синклеровского окна пришлось пожертвовать функцией FLASH. Эта функция практически не используется в современных программах, т.к. эффект, который она производит, очень груб и плохо смотрится на экране.
При подключении видеопроцессора область BORDER навсегда отдается ему, а в активной части экрана видеопроцессор подключен в знакоместах, имеющих атрибут FLASH 1, т.е. 7 бит байта атрибута установлен в 1.
Чтобы подключить видеопроцессор из BASIC на весь экран нужно дать команду:
FLASH 1: РОКЕ 23624,128: CLS
Команда:
PRINT FLASH 0; INK A; PAPER В; AT X,Y;"СООБЩЕНИЕ"
автоматически сформирует синкле-ровское окно требуемого размера в нужном месте и выведет СООБЩЕНИЕ с заданными цветами INK и PAPER.
Удалить это окно можно командой CLS, при этом первоначальный вид экрана полностью восстановится .
Очень эффектно смотрится синк-леровское окно на фоне скроллиру-емого экрана видеопроцессора.
Синклеровское окно позволяет "адаптировать" классические игры под видеопроцессор самым простым способом. Достаточно перед загрузкой игры запрограммировать видеопроцессор на вывод статического или даже динамического орнамента на бордюр и игра приобретет совершенно новый вид.
С сожалением можно предсказать, что этим приемом не преминут воспользоваться компьютерные пижоны, чтобы передавать свои бандерлоговские приветы людям, которые их не знают и знать не хотят, не только в осточертевших INTRO, но и прямо во время игры, идиотской прыгающе-бегущей строкой по бордюру. Но от этой публики, у которой начисто отсутствует чувство меры, все равно не уберечься ....
Рекомендации по программированию.
Тем, кто в достаточной степени освоил ассемблер Z-80, не составит особого труда изучить более простой ассемблер 6502.
По сигналу RESET процессор DENDY начинает выполнение программы не с нулевого адреса, как
Z-80, а с адреса записанного по адресу OFFFCh. Адрес процедуры немаскируемого прерывания должен быть размещен по адресу OFFFAh, а маскируемого по адресу OFFFEh.
Область стека фиксирована. Стек может размещаться только в 1 странице памяти в диапазоне адресов 0100h-01FFh, причем при инициализации указателя задается только младший байт. Непосредственно указатель установлен быть не может, только через регистр X. Пример инициализации стека:
LDX #0FFh TXS
Область адресов OOOOh-OOFFh особая. К ней возможен быстрый доступ через команды с короткой адресацией. Она призвана возместить в какой-то мере недостающие регистры общего назначения. В ней лучше размещать не программу, а переменные.
Регистр флагов заносится в стек по прерыванию автоматически, поэтому процедура прерывания обязательно должна заканчиваться командой RTI.
Вообще с флагами нужно быть очень внимательным. Они, в отличие от Z-80, могут быть изменены даже командой загрузки регистра.
Процедура немаскируемого прерывания должна начинаться обращением к контроллеру ПДП. Старший байт адреса области в которой хранится копия ОЗУ спрайтов видеопроцессора должен быть передан контроллеру ПДП путем записи его по адресу 4 014h. Например, если буфер копии ОЗУ спрайтов создан в 7 странице памяти по адресам 0700h-07FFh, то фрагмент процедуры немаскируемого прерывания, вызывающий ПДП, будет выглядеть так:
LDA #00h STA 2003h LDA #07h STA 4014h
В качестве примера программирования на ассемблере DENDY приведу полезную подпрограмму, опрашивающую первый джойстик.
EQU |
10h |
LDX |
#00h |
STX |
OST |
LDA |
#01h |
STA |
4016h |
ТХА |
|
STA |
4016h |
LDY |
#08h |
LDA |
4016h |
LSR |
A |
ROL |
JST |
DEY |
|
BNE |
OOSL |
LDA |
OST |
RTS |
|
После выполнения этой подпрограммы в ячейке JST и аккумуляторе будет записан код состояния первого джойстика. Нажатой кнопке соответствует 1 в соответствующем разряде.
Разряд |
0 - |
- вправо |
Разряд |
1 - |
- влево |
Разряд |
2 - |
- ВНИЗ |
Разряд |
3 - |
- вверх |
Разряд |
4 - |
- START |
Разряд |
5 - |
- SELECT |
Разряд |
6 - |
- В |
Разряд |
7 - |
- А |
Более подробная информация по программированию DENDY приведена в моей брошюре "DENDY под микроскопом", вышедшей в Екатеринбурге в начале 1995 года.
Драйвер видеопроцессора.
Драйвер видеопроцессора это программа, написанная в кодах DENDY и размещенная в ее ОЗУ. Основная задача драйвера - принять команду, посланную SPECTRUM'ом через интерфейсный порт и выполнить ее. Простейший драйвер, незаменимый, кстати, при изучении видеопроцессора, просто должен протранслировать посылаемые команды без всякого изменения в порты видеопроцессора. В принципе, с таким драйвером можно работать и из практических программ. Но, как Вы видимо уже убедились, система команд видеопроцессора довольно сложная и какая-то несуразная. Кроме того, грех не воспользоваться вычислительными возможностями центрального процессора дендивского кристалла. Драйвер может поддерживать обращения к музпроцессору DENDY и ее джойстикам. Удобно также разместить в памяти DENDY информацию о пейзажах дополнительных экранов.
Я написал неплохой драйвер, ориентированный на DIZZY-подобные игры, но в связи с изменением концепции видеопроцессора (переход на загружаемый драйвер), он нуждается в значительной переработке и не может быть сейчас опубликован. Требования к драйверу определяются задачей, которую решает программист. Поскольку драйвер загружается одновременно с основной программой, нет необходимости как-то стандартизовать его команды.
Если драйвер предназначается для работы с BASIC-программой, то необходимо "уплотнить" его команды, по возможности не используя аргументы, т.к. BASIC может передать не более 50-100 команд OUT в секунду, но требования к скорости выполнения команд минимальные, потому что промежутки между командами составят несколько миллисекунд. Если же драйвер предназначается для работы с программой, написанной в машинных кодах, то напротив, нет ограничений на мно-гобайтность команд, но выполняться они должны возможно быстрее.
В системе команд драйвера видеопроцессора обязательно должны присутствовать команды загрузки фонтов и экранов в ОЗУ видеопроцессора, команды скроллинга или переключения экранов, команды формирования и управления спрай-тами. Могут присутствовать команды, формирующие многофазные спрайты, что особенно полезно для драйверов, ориентированных на BASIC. В большинстве случаев понадобятся команды, опрашивающие состояние спрайта на предмет коллизии .
Для оформления уже существующих программ, понадобится автономный драйвер, который, будучи однажды запрограммирован, дальше будет работать в автономном режиме до выключения компьютера без управления с его стороны.
Объем программы драйвера зависит от его сложности и количества выполняемых им функций.
Для написания программ на ассемблере DENDY я использовал GENS 4+ с использованием механизма макросов. Тех, кто захочет повторить мой опыт предупреждаю, что GENS поддерживает не более 63 макросов с именами длиной в 4 символа. Нигде в литературе мне не приходилось читать о таком ограничении. Недостающие, редко используемые команды, пришлось заменять директивами DEFB и DEFW. Неудобно конечно, но пока другого выхода нет. Надеюсь, что, если написание драйверов для видеопроцессора станет популярным занятием среди синклеристов, появится кросассемблер.
Что дальше?
Мы постоянно слышим, что SPECTRUM - самая "демократичная" машина. Да, действительно, если не считать видеоприставок, он наиболее распространен в нашем Отечестве. SPECTRUM доступен по своей цене, но доступен ли он большинству своих владельцев как источник творчества? Почему же тогда игры, написанные нашими авторами можно буквально пересчитать по пальцам, а как только прекратился приток программ с Запада, начались крики о кончине SPECTRUM' а? И это при том, что достойной замены ему пока что-то не просматривается.
Скажите, Вы можете написать для SPECTRUM'а игру типа "DIZZY" или, хотя бы "EXOLON"? Думаю, что положительно сможет ответить каждый тысячный, читающий эти строки. Ну а если запрограммировать нужно только алгоритм игры, причем на BASIC, а все проблемы с высококачественной графикой возь мет на себя видеопроцессор, осна щенный простым в использовании драйвером? Ага, уже каждый десятый! Вот и ответ. Применение видеопроцессора это реальная "де мократизация" SPECTRUM'а.
Те графические эффекты, которыми сегодня гордятся мастера SPECTRUM'а и даже спорят о авторстве в своих "DEMO", будут убого выглядеть по сравнению с тем, что завтра сделает пятиклас-ник на своем компьютере, оснащенном видеопроцессором.
Дело за малым. Главный вопрос - поддержит ли, как говорили в эпоху развитого социализма, широкая общественность, мое предложение о введении в ZX-SPECTRUM видеопроцессора. Я считаю, что моя работа заложила неплохой фундамент, но дальше нужны объединенные усилия многих энтузиастов SPECTRUM'а. Что же нужно?
Нужны практические схемы синхронизаторов для разных моделей SPECTRUM. Нужны драйверы, с простой и удобной системой команд для различных применений. Нужны системные программы, адаптированные к видеопроцессору. Нужен кросассемблер для программирования в кодах DENDY (RST7 - Ay...!). Нужна адаптированная версия LASER-BASIC. И много еще чего.
Если кому-то надоело писать бесконечные (и бесполезные) "глю--калы", дисковать старье и с кровью выдирать музыку и картинки из чужих программ - приглашаю! Я предлагаю настоящее творчество!
PS. Организациям, желающим воспользоваться материалами этой статьи для деятельности, сопряженной с извлечением прибыли, напоминаю, что, согласно Российскому законодательству, авторские права на идею и конкретные решения принадлежат автору с момента опубликования в открытой печати.