АРХИТЕКТУРА ZX SPECTRUM
Решив заняться программированием, Вы рано или поздно пойме-
те, что написать действительно серьезную программу для ZX Spectrum
на Бейсике, Паскале и прочих языках «повышенного» уровня практиче-
ски невозможно. Все удобства, предоставляемые этими языками, сво-
дятся «на нет» низким быстродействием и большим объемом написан-
ных на них программ. Только работая непосредственно с командами
процессора, Вы сможете создавать программы, не уступающие фирмен-
ным. Но для этого необходимо серьезно изучить архитектуру
ZX Spectrum, систему команд процессора Z80, уметь пользоваться сред-
ствами написания и отладки программ в кодах.
Эта и последующие главы книги, в отличие от предыдущих,
рассчитаны на более подготовленного читателя. Однако мы старались
как можно доступнее излагать материал, кратко поясняя используемые
термины и не употребляя малопонятных выражений. Надеемся, что
даже неспециалисты, пользуясь сведениями, почерпнутыми из этого
раздела книги, смогут начать программировать на ассемблере, а про-
фессионалы получат в руки подробный справочник по ZX Spectrum.
Внутренняя структура
ZX Spectrum ничем существенно
не отличается от строения других
компьютеров (рис. 9). Работой всех
устройств управляет центральный
процессор (ЦП). Он связан с осталь-
ными блоками компьютера через ши-
ны адреса, данных и управления. Па-
мять разделена на две области: ПЗУ
(постоянное запоминающее устройст-
во) объемом 16К и ОЗУ (оперативное
запоминающее устройство) — 48К. В
ПЗУ «зашита» операционная система
ZX Spectrum. Блокуправления внешни-
ми устройствами обеспечивает связь
процессора с клавиатурой, телевизо-
ром, магнитофоном и т. д.
*) Речь пойдет только о компьютерах, выпущенных фирмой Sinclair Re-
search Ltd. Архитектура остальных разновидностей ZX Spectrum, вклю-
чая машины фирм Amstrad и Timex, может несколько отличаться от
базовой модели. Кроме того, следует иметь ввиду, что на конфигурацию
ZX Spectrum могут влиять подключаемые к компьютеру периферийные
устройства.
ЦЕНТРАЛЬНЫЙ ПРОЦЕССОР
Одной из причин успеха, постигшего ZX Spectrum, было применение
в качестве ЦП микропроцессора Z80 (полное название — Z80A CPU) амери-
канской фирмы Zilog. В основе разработки этой микросхемы лежала идеология
построения одного из самых распространенных в свое время 8-разрядных
процессоров —18080 (советский аналог — КР580ВМ80А). В Z80 увеличено
число регистров, дополнена система прерываний и, самое главное, существен-
но расширена система команд (в частности, за счет добавления команд,
обрабатывающих блоки данных). Все это позволило повысить производитель-
Рис. 10. Структурная схема микропроцессора Z80.
Рис. 10. Структурная схема микропроцессора Z80.
Ность процессора при одновременном уменьшении размера программ.
Структурная схема Z80 (рис. 10) включает в себя: арифметико-логи-
ческое устройство (АЛУ), блок управления шиной данных, блок регистров, блок
управления адресной шиной, дешифратор команд и сигналов управления. Все
узды связаны внутренней шиной данных.
Для обращения процессора к памяти и внешним устройствам слу-
жит 16-разрядная шина адреса (ее разряды обозначаются от АО —- млад-
ший разряд до А15 — старший). Следовательно, процессор может непос-
редственно обратиться (в зависимости от обрабатываемой команды) либо
к 2" =65536 ячейкам памяти, либо к такому же количеству внешних
устройств (портов).
Обмен информацией Z80 с памятью и портами осуществляется через
8-разрядную шину данных (разряда обозначаются D0...D7). Для хранения
и обработки чисел, больших 255 (28-1), используются две или более ячейки
памяти, расположенные одна за другой.
РЕГИСТРЫ 180
Регистры данных и аккумулятор
Микропроцессор Z80, в отличие от 18080, работает с двумя наборами
регистров — основным и альтернативным, Оба набора состоят из семи
8-разрядных регистров данных и флагового регистра. Регистры основного
набора обозначаются буквами А, В, С, D, Е, Н, L и F (флаговый). Регистры
альтернативного набора соответственно — А', В'( С, Dr, Е Hr, L' и F Для
пользователя эти наборы совершенно идентичны, и знак' (апостроф) озна-
чает лишь то, что в данный момент регистр не является активным. С
помощью специальных команд можно переключать работу процессора с
одного набора регистров на другой. Но выяснить, какой из наборов активен
в данный момент, невозможно.
Для выполнения многих команд обрабатываемые данные должны
быть занесены в специальный регистр —~ аккумулятор А.
Команды, обрабатывающие 16-разрядные числа, используют пары ре-
гистров в следующих сочетаниях: ВС, DE, HL, AF и, соответственно, ВС, DE
HL AF'. При этом в регистры В, D, Н, А, В', D', Н А' записывается старший
байт числа, а в С, Е, L, F, С, Е L' и F' — младший. Спаренные регистры можно
использовать, например, для хранения и обработки адресов ячеек памяти.
Счетчик комавд
Выполнив очередную команду, процессор должен знать, откуда ему
взять следующую. За этим следит 1 б-разрядный регистр счетчика команд PC.
При последовательном выполнении программы после считывания из памяти
каждого байта команды значение PC увеличивается на единицу. Если коман-
да требует от процессора перейти не к следующей, а какой-л^бо другой
ячейке памяти (например, команда вызова подпрограммы), в PC записыва-
ется адрес этой ячейки.
Индексную регистры
Важной особенностью Z80 является возможность обращаться к ячей-
кам памяти, указывая смещение их адреса относительно содержимого 16-
разрядных индексных регистров IX и IY. Смещение может быть задано
числом в пределах —128...+127.
Указатель стена
16-разрядный регистр указателя стека SP содержит адрес вершины
стека. Как известно, стек — это специальная область памяти, предназначен-
ная для временного хранения данных. В Z80 он организован по принципу
LIFO* — помещенные в стек одно за другим несколько чисел извлекаться из
стека будут в обратной последовательности. Особенностью Z80 является то,
что стек «растет» в сторону уменьшения адресов. При каждой записи в стек
значение регистра SP уменьшается на 2, а при извлечении числа увеличи-
вается на 2. «Общение» со стеком обычно происходит посредством регист-
ровых пар. В стеке также автоматически сохраняется адрес возврата при
вызове подпрограмм.
Регистр флагов
После выполнения ряда команд в соответствии с результатом опера-
ции изменяется содержимое флагового регистра ____„_
F (рис. 11). Флагом называется отдельный бит этого Гс I z [ х ! Н I x l P/vTnT"c1
регистра. Флаг считается установленным, если в 1 I L 1 г I ™ 1 I
регистра. Флаг считается установленным, если в
соответствующем бите записана единица, и сбро- 7 6 5 4 3 2 1 0
шейным, если записан ноль. Значимыми являются рис j | Регистр флагов.
6 из 8 битов регистра F:
*) Last In First Out — первым пришел — последним вышел (англ.).
Z (zero) — флаг нуля. Устанавливается, если результат операции равен
нулю;
P/V (parity/overflow) — флаг четности/переполнения, В логических опе-
рациях устанавливается при получении четного результата, в ариф-
метических — при переполнении (изменении знака) операнда;
CY (carry) — флаг переноса. Устанавливается, если в итоге выполнения
арифметических операций произошел перенос либо заем старшего
бита;
N (negative) — флаг отрицательного результата. Устанавливается при
получении отрицательного результата арифметической операции;
Н (half-carry) — флаг вспомогательного переноса. Устанавливается, если про-
изошел перенос (заем) в 4-й бит аккумулятора. Используется при прове-
дении двоично-десятичной коррекции при работе с BCD-арифметикой*;
S (sign) — флаг вычитания. Устанавливается, если предыдущей коман-
дой было вычитание. В BCD-арифметике помогает определить тип
предыдущей операции.
Другие регистры
Регистр вектора прерываний I используется во 2-м режиме обработки
прерываний. Подробно о нем будет рассказано в разделе, посвященном
прерываниям.
Регистр регенерации динамической памяти R обслуживает в основном
аппаратные потребности компьютера, однако он все же может использовать-
ся и для программных целей, например, при написании процедур, генери-
рующих случайные числа. Младшие семь разрядов этого регистра увеличи-
ваются на единицу после выполнения очередной команды (точнее цикла
Ml) микропроцессора, старший разряд аппаратко не используется.
ВНЕШНИЕ УСТРОЙСТВА
Работа программиста превратится в бессмысленные математические
упражнения при отсутствии связи компьютера с внешним миром, осущест-
вляемой через порты.
Хотя Z80 имеет 16-разрядную шину адреса, в ZX Spectrum при обраще-
нии к большинству внешних устройств значащими являются только 8 младших
разрядов. Например, для изменения цвета бордюра необходимо записать соот-
ветствующее значение в порт с адресом %0000000011111110 (254)**, но если
Вы запишете это же значение в порт %0000000111111110 (510), то получите
тот же эффект. Разряды, не влияющие на выбор устройства, обычно обозна-
чаются знаком х, и, таким образом, полный адрес упомянутого выше внешнего
устройства записывается как xxxxxxxxl 1111110.
Для упрощения аппаратной части в Speccy выбор внешних устройств
осуществляется сбросом в ноль одного из разрядов адреса. Порт 254, например,
выбирается при А0-0, порт 239 — при A2-Q и т. д. При разработке
ZX Spectrum были сделаны следующие назначения для разрядов шины адреса:
АО — клавиатура, магнитофон, динамик;
А1 — не используется (в ZX Spectrum 48К);
А2 — ZX Printer;
A3 и А4 — Interface 1 и микродрайв.
*) BCD — Binary Coded Decimal — двоично-десятичный код {англ,).
**) Ниже для обозначения шестнадцатеричных чисел использован символ #,
двоичных — символ %.
Если несколько разрядов будут сброшены в ноль, окажутся выбран-
ными одновременно несколько устройств.
Разряды А5, А6 и А 7 оставлены разработчиками для специального
применения, но, в принципе, могут быть использованы для подключения
дополнительных внешних устройств, например, джойстика.
Разряды с А 8 no А15 используются для сканирования клавиатуры
(только при сброшенном АО).
Хотя в фирменном ZX Spectrum для выбора внешнего устройства и
не используются все разряды младшего байта адреса, тем не менее, во
избежание различных накладок, в программах рекомендуется всегда указы-
вать точный 8-разрядный адрес порта.
Ниже рассмотрены стандартные порты ZX Spectrum. Для каждого порта
указаны его десятичный и, в» скобках, шестнадцатиричный и двоичный адреса.
Внешнего устройства с таким адресом в ZX Spectrum нет, поэтому из
порта 255 считывается состояние «пассивной» шины данных. Благодаря
оригинальному схемотехническому решению, в ZX Spectrum шина данных
используется одновременно для двух процессов: работы Z80 и вывода ин-
формации на дисплей. В момент формирования изображения из порта 255
считываются случайные значения (анализ показывает, что преимуществен-
но считываюгся атрибуты отображаемого в данный момент знакоместа), а во
время, не занятое выводом — значение 255.*
Чтение из порта 255 в некоторых фирменных программах использу-
ется для синхронизации относительно вывода на экран, и поэтому они
отказываются работать на многих самоделках.**
ZX Spectrum управляет магнитофоном, клавиатурой, цветом бордюра
и динамиком через один-единственный порт с адресом 254.
При записи байта в порт:
биты D0...D2 определяют цвет бордюра:
биг D3 управляет выходом на магнитофон. Манипулируя этим битом,
программы обслуживания магнитофона формируют сигнал записи;
бит D4 управляет звуковым каналом. Например, дя того чтобы получить
звук частотой 1 кГц, необходимо устанавливать и сбрасывать этот бит
1000 раз в секунду;
биты D5*.tD7 не используются.
*) На самом деле, если Вы попытаетесь обратиться по другим незадейсгво-
ванным адресам портов, то получите аналогичный результат.
**) В ZX Spectrum +3 схема отображения выполнена более грамотно, чем в
Speccy, однако это стало причиной неполной совместимости с базовой
моделью. Ряд программ, например, Short Circuit, на Spectrum -КЗ не
работают.
Порт 255 (#FF, %11ШШ|
Порт 254 |#FE, %f 11111!®!
000 (0) — черный
001 (1) — синий
010 (2) — красный
011 (3) — фиолетовый
100 (4) — зеленый
101 (5) — голубой
110 (6) — желтый
111 (7) — белый;
При чтении байта из порта:
биты D0...D4 обслуживают клавиатуру.
Стандартная клавиатура ZX Spectrum состоит из 40 клавиш, которые
разбиты на восемь рядов по пять кнопок в каждом (рис. 12). Для того, чтобы
|
|
|
сброшенный бит |
|
|
|
|
|
|
DO |
D1 |
D2 |
D3 |
D4 |
D4 |
D3 |
D2 |
D1 |
DO |
|
|
|
п |
#F7FE |
All |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0 |
A12 |
#EFFE |
n |
о |
#FBFE |
A10 |
Q |
W |
E |
R |
T |
Y |
U |
I |
О |
P |
A13 |
#DFFE |
о |
р |
#FDFE |
A9 |
A |
S |
D |
F |
G |
H |
J |
К |
L |
EN |
A14 |
#BFFE |
p |
т |
#FEFE |
A8 |
CS |
Z |
X |
С |
V |
В |
N |
M |
SS |
SP |
A15 |
#7FFE |
T |
Рис. 12. Организация клавиатуры ZX Spectrum.
узнать, какая из клавиш ряда нажата, нужно прочесть байт из порта, полный
16-разрядный адрес которого задается так: младший байт адреса равен 254
(#FE), а в старшем байте сброшен в ноль один из разрядов, соответствующий
выбранному ряду. Биты D0...D4 считанного байта указывают, какая из
кнопок в ряду нажата — соответствующий бит будет сброшен. Например,
чтобы узнать, нажата ли клавиша Enter, нужно проверить состояние бита DO
в байте, считанном из порта #BFFE.
бит D6 отображает состояние магнитофонного входа. Для получения ин-
формации с магнитной ленты программа должна постоянно опраши-
вать этот бит.
Некоторые внешние устройства могут «эмулировать» порт 254. При-
мер такого устройства — Interface 2. Помимо других своих функций*
Interface 2 обслуживает попу-
лярный тип джойстика «для
двоих» — Sinclair Joystick. Этот
джойстик «запараллелен» с
цифровыми клавишами кла-
виатуры, так что если у Вас нет
Interface 2, Вы все-таки можете
использовать Sinclair-джой-
стик, либо аппаратно подклю-
чив его к соответствующим
клавишам, либо имитировать
его, работая этими клавишами
как джойстиком. В табл. 1 по-
казано соответствие между
цифровыми клавишами и фун-
кциями Sin clair-джойстика.
Таблица 1. Назначение клавиш
Sindair-джойстика.
Таблица 1. Назначение клавиш
Sindair-джойстика.
Номер джойстика |
1 |
2 |
Адрес порта |
#EFFE |
#F7FE |
Функция |
бит |
клавиша |
бит |
клавиша |
влево (left) |
D4 |
6 |
DO |
1 |
вправо (right) |
D3 |
7 |
D1 |
2 |
вниз (down) |
D2 |
8 |
D2 |
3 |
вверх (up) |
D1 |
9 |
D3 |
4 |
стрельба (fire) |
DO |
0 |
D4 |
5 |
Обращение к описанным ниже портам имеет смысл только при
подключении к ZX Spectrum соответствующего интерфейса внешнего уст-
ройства, например, принтера или джойстика.
*) Interface 2 позволяет также использовать картриджи с ПЗУ, в которое при
изготовлении записываются готовые программы.
Порт 151 t#FB, %11111011)
Порт обслуживает стандартный для ZX Spectrum принтер —
ZX Printer, драйвер которого «зашит» в ПЗУ компьютера. Некоторые интер-
фейсы принтеров в тот момент, когда на адресной шине появляется адрес
25!, «перехватывают» управление. Например, интерфейс ZX Lprint III с
помощью драйверов из его собственного ПЗУ может через порт 251 управ-
лять различными типами принтеров.
Порт 247 (#F7, %11110111)
Порт 239 (#EF, %11101111)
Порт 231 (#Е7, %11100111)
Порты устройства Interface 1, которое позволяет: соединять компью-
теры в локальную вычислительную сеть; использовать стандартный интер-
фейс RS-232C; подключать до восьми микродрайвов (накопителей на «бес-
конечной» магнитной ленте), работать с которыми несколько удобнее, чем с
магнитофоном. Однако в Союзе Interface 1 по разным причинам не получил
распространения.
Порт 31 (#1F, %Р0011111)
Порт 31 служит для свя-
зи с самым распространенным
типом джойстика — Kempston
Joystick. Старшие три бита
(D5...D7) этого порта всегда
сброшены в ноль — именно по
этому условию некоторые про-
граммы определяют, что
kempston-джойстик подключен.
Младшие биты (DQ...D4) инди-
цируют состояние джойстика
(см. табл. 2).
Несколько битов может быть установлено одновременно. Например,
если установлены биты DO, D3 и D4, то это означает, что джойстик находится
в положении «влево-вниз» и нажата «стрельба».
При нейтральном положении kempston-джойстика из порта 31 должен
считываться ноль.