Глава 3. Микропроцессор Z8 0
3.1. Введение
Микропроцессор Z8 0 является наиболее важной микросхемой в микрокомпьютерной системе Спектрум, Z8 0 разработала фирма ZILOG INC (California. U.S.A.), и доказал, что он является наиболее удачным из когда-либо созданных микропроцессоров. В Спектрум использован микропроцессор Z80A, которые изготовляется по лицензии Zilog INC.
Обсуждение его возможностей следует разделить на две части. В первой части дана "физическая" точка зрения на микросхему, во второй - "логическая". Вслед за логической структурой будут рассмотрены машинные коды.
3.2. "Физический" взгляд на Z8 0.
Z80 - микросхема с 40 выводами, пронумерованными 1-40.
Рассмотрим функции выводов.
Выв. 11 - напряжение питания. Z80 требует одного источника + 5v.
Выв. 29 - общий вывод.
Выв. 6 - тактовый вход. В Спектрум используется тактовая частота 3.5 Мгц, т.е. тактовый импульс следует каждые 0.000000286 сек.
Выв. 7-10, 12-15 - эти 8 линий образуют информационную шину, которая несет информацию как в микропроцессор, так и из него.
Выв. 1-5, 30-40 - эти 16 линий образуют адресную шину, которая доставляет адреса из микропроцессора в память.
Оставшиеся 13 выводов присоединены к линиям, которые несут контрольные сигналы.
Выв. 21 - линия считывания, RD. Эта линия становится активной, когда байт информации должен быть считан микропроцессором из памяти.
Выв. 22 - линия записи, WR. Эта линия становится активной, когда байт информации должен быть записан микропроцессором в память .
Выв. 19 - запрос памяти MREQ. Эта линия становится активной в тех случаях, когда байт информации должен следовать как из микропроцессора, так и в него.
Байт информации следует из памяти в соответствии с адресом, помещенным на адресной шине. Далее,в соответствии с откликом на сигналы RD и MREQ соответствующая микросхема памяти помещает байт информации на информационную шину, с которой эта информация в дальнейшем считывается в микропроцессор. Байт данных, записывается в память микропроцессором, помещает требуемые адреса на адресную шину. Шины MREQ, WR активизируются, и байт данных выставляется на шину данных. В дальнейшем, если к микросхеме памяти продолжается обращение, байт данных будет скопирован в память.
Выв. 28 - линия регенерации ОЗУ (RFSH). Эта шина используется для регенерации динамической памяти. В Спектрум эта линия частично используется для регенерации ТВ сканирующих сигналов.
Выв. 2 7 - выборка памяти M1. Наиболее важная линия, которая активизируется либо по машинному коду, либо по соответствующему байту данных, выбираемому из памяти.
Выборка инструкции или байта информации требует, чтобы все три линии M1,MREQ и RD активизировались. В то же время, выборка байта информации из ячейки памяти, которая является другой частью памяти, требует, чтобы только MREQ и RD были активны. Время, необходимое для выборки инструкции, составляет 1.14 мксек, что является 4- тактовыми циклами, или Т-состояниями.
Выв 2 0 - линия вход/выход IORQ. Эта линия активна при выполнении команды IN или OUT.
Выв. 18 - останов HALT. Линия активизируется при выполнении команды HALT.
Выв. 2 5 - линия запроса, BUSRQ. Z8 0 позволяет внешним устройствам использовать адресную и информационную шины в режиме пропуска цикла. Запрос микропроцессора пропустить следующий цикл выполняется внешними устройствами путем активизации этой линии.
Выв. 23 - линия подтверждения, BUSAK. Микропроцессор подтверждает запрос остановки выполнения дальнейших команд и активизирует эту линию.
Оставшиеся 4 вывода находятся под контролем пользователя.
Выв. 26 - линия "сброс", RESET. Эта линия используется для инициализации процессора. Она активизируется при включении питания. Сброс может быть использован в Спектрум соединением линий RESET и GND.
Выв. 24 - линия "ожидание", WAIT. "Медленная" память может требовать большего времени для циклов считывания или записи. И об этом сообщает микропроцессору путем активации линии WAIT.
Выв. 17 - "немаскируемое прерывание". NMI. Активация этой линии приводит к остановке выполнения микропроцессором текущей команды. Вместо этого микропроцессор выполняет программу пользователя, специально составленную для этих целей. В Спектрум немаскируемое прерывание требует системного сброса, который выполняется записыванием 0 по адресу 23728.
Выв. 16 - "маскируемые прерывания", INT. В Спектрум сканирование клавиатуры и обмен в режиме реального времени называют "управляемым прерыванием". Это означает, что электроника системы каждые 1/50 сек активизирует INT, вызывая остановку выполнения микропроцессором основной программы и, вместо этого, выполнение подпрограммы сканирования клавиатуры. Способность Z80 реагировать на INT может управляться программистом специальными машинными командами.
3.3 Логический взгляд на Z8 0.
Внутренняя структура микропроцессора Z8 0 удивительно сложна, но, к счастью, может быть разделена на 5 функциональных частей. Это - устройство управления, регистр команд, программный счетчик, 24 регистра пользователя и арифметическое и логическое устройство. Обсудим каждую часть по очереди .
Устройство управления
Упрощенно его можно представить как "руководителя работ". В функции устройства управления входит пересылка байтов данных в Z8 0, который, в свою очередь, результаты (байты данных) посылает из процессора в правильном направлении и убеждается, что операция успешно завершена.
В Z8 0 устройство управления выдает огромное количество внутренних сигналов, которые проходят к различным частям внутренней структуры, а также управляющие сигналы на линии RD, WR, MREQ и т.д.
Важно подчеркнуть, что устройство управления подобно менеджеру производства - не оказывает влияния на вид работ, но только на их порядок. Z80 следует программе, которая написана программистом, а менеджер следует программе директоров компании.
Регистр команд (РК)
Термин "регистр" используется для описания простой ячей-внутри Z80. Это то место, где 8 бит байта могут держаться вместе. В Z8 0 имеется большой блок регистров и пересылки байтов данных к регистрам и от них, являются простейшей наиболее важной чертой программирования в машинных кодах.
РК - специальный регистр, где микропроцессор содержит копию выполняемой текущей команды. Одной из черт набора команд Z8 0 является то, что определенные инструкции содержатся в 2 байтах данных. В этих случаях РК содержит эти байты по-очереди. Во время выполнения программы РК содержит каждую команду по очереди.
Программный счетчик (ПС)
ПС - это не один, а пара регистров, которые используются совместно. Таким образом, ПС может содержать 16-битные значения. ПС имеет специфическую цепь в сохранении адресов, либо текущей выполняемой команды, либо следующей выданной команды, в зависимости от того, был ли изменен программный счетчик или нет.
Когда инструкция выбирается, устройство управления использует адреса в программном счетчике как адрес памяти, содержащей команду, которая должна выполняться следующей. И затем устройство управления наращивает программный счетчик.
Действие программного счетчика очень похоже на переменную РРС интерпретатора Бейсик, которая содержит номер текущей строки Бейсика и также наращивается.
Регистры пользователя (основные регистры)
В Z80 существует 24 пользовательских регистра. Они названы пользовательскими, поскольку они могут быть заполнены информацией программистом (пользователем).
Имена, данные этим регистрам, не кажутся на первый взгляд логически обоснованными. Причина этого заключается в том, что Z80 развился из более ранних и менее сложных моделей. Некоторые из этих названий напоминают нам о первых, изготовленных в свое время микропроцессорах, тогда как в последующем новые названия были добавлены (к данному перечню) произвольно, причем некоторые из них оказались более подходящими и более информативными, чем остальные.
Все регистры - однобайтовые, но обычно они используются как пара регистров.
Диагр. 3.1 показывает 24 пользовательских регистра микропроцессора Z80, представленных как 12 регистровых пар. Номера битов также показаны.
Каждый из регистров коротко будет обсужден ниже.
основной набор альтернативный набор
А F A" F"
7...O 7...O 7...O 7...O
H L H" L"
7...O 7...O 7...O 7...O
B C B" C"
7...O 7...O 7...O 7...O
IX 15....O
IY 15....O
SP 15....O I R
7...O 7...O
Диагр . 3.1
Регистр А. Этот регистр является наиболее важным регистром Z80. Его часто называют аккумулятором. Название это пришло из моделей, в которых существовал единственный регистр для накопления результата.
В Z8 0 регистр А широко используется в арифметических и логических операциях, и, конечно, существует много операций, которые могут выполняться только используя А - регистр.
Существует огромное число различных возможностей помещения байта данных в регистр А и следующие. Существует много машинных команд, которые включают регистр А.
Регистр F. Это флаговый регистр, и он часто рассматривается как набор 8 флаговых битов, связанных вместе, а не как отдельный регистр.
Понятие флагов рассмотрено в главе 5, но теперь надо сказать, что флаг может быть установлен (т.е. содержать 1), или сброшен (содержать 0).
Флаговый регистр содержит 8 бит, но программист обычно имеет дело с четырьмя основными флагами. Это флаг нуля, флаг знака, флаг переноса и флаг четности/переполнения. Дополнительные флаги используются устройством управления и не могут быть использованы программистом непосредственно.
Регистровая пара HL. В ранних микропроцессорах существовал ординарный адресный регистр, который мог адресовать 256 адресов памяти. Однако, когда была введена двухбайтовая адресация, стало возможным адресовать 65536 адресов памяти непосредственно. В микропроцессоре, содержащем адресный регистр, один из регистров является старшим, а другой - младшим. Имена H и L в Z80 произошли от слов "high" и "low". Интересно отметить, что старший регистр, будучи более поздним достижением, привел к ситуации, в которой при адресации сначала указывается младшая часть, а затем старшая.
Память 64 К байт может быть рассмотрена как 256 страниц по 256 адресов в каждой, и в таком случае значение старшего байта указывает на используемую страницу.
В микропроцессоре регистровая пара HL является одной из трех регистровых пар, которые обычно используются в качестве адресных регистров. Однако, HL - пара является наиболее важной. HL-пара также может быть использована для хранения 16-битного числа, и существует ряд арифметических операций, которые могут быть выполнены над этими числами. H-регистр и L-регистр могут также использоваться как одинарные регистры, хотя с ними может быть выполнено ограниченное число опера-ций.
Регистровые пары BC и DE. Эти регистровые пары используются, главным образом, как адресные регистры. Казалось бы, что их имена произошли единственно из-за существования А-ре-гистра.Хотя, к DE ясно подходит аббревиатура слова "destination".
Все регистры могут быть использованы как одинарные, и особенно употребительно использование регистра B в качестве счетчика цикла.
Набор альтернативных регистров.
Z8 0 -специфический микропроцессор, так как он имеет альтернативный набор регистров для А, F, H, L, B, C, D и E. Эти альтернативные регистры обозначаются А", F", H", L", B", C", D", и E", произносятся как А прим и т.п.
Существует две специальные машинные команды, которые позволяют обменивать основной и альтернативный наборы регистров. После обмена Z80 будет работать с альтернативными регистрами, полагая, что это основной набор. Бывший основной, теперь будет использоваться как альтернативный.
Программист может обменивать наборы регистров (все вместе или частично) столько раз, сколько необходимо. Концепция альтернативных регистров кажется очень простой, но на практике использование альтернативных регистров может быть путаным. Самые большие проблемы те, что программист должен помнить, какой набор регистров используется, так как не существует машинных команд, которые работают на одном регистре и не работают на дополнительном ему.
Альтернативные регистры часто используются для сохранения среды, могла запускается независимая задача.
Особенным примером для программ Спектрум с 16К монитором является ситуация, когда при вычислении с плавающей запятой используются H и L регистры для сохранения адреса возврата. Поэтому, если эти регистры испорчены, то возвращение в Бейсик невозможно.
Регистровые пары IX и IY
Эти две регистровые пары используются для выполнения операций, которые включают индексацию. Это дает возможность работать со списком или таблицей. Начальный адрес списка или таблицы должен быть первоначально занесен в подходящую пару регистров IX или IY. В программе Спектрум регистр IY содержит адрес 23610 (5C3AH), указывающий на таблицу системных переменных. Регистр IX широко используется как указатель в программах обработки команд LOAD, SAVE, VERITY и MERGE.
Указатель стека
Это еще один адресный регистр. Он используется для указания в памяти области машинного стека и всегда рассматривается как цельный 2-х байтовый регистр.
Микропроцессор Z80 использует стек, заполненный в памяти сверху вниз. Аналогией может служить многоэтажный дом, в котором первый жилец поселяется в верхнем этаже, следующий-этажом ниже и т.д. Стек используется по принципу "последним пришел - первый вышел", так что первым жильцом, который выезжает, будет последний вселившийся.
Указатель стека используется для указания различных размещений в области стека в каждом случае. Указатель стека всегда содержит адрес, куда последний раз была произведена запись. Поэтому устройство управления сначала уменьшает значение указателя стека, а затем помещает туда значение. В системе Z8 0 каждая пересылка в стек или из него включает в себя 2 байта данных, и поэтому указатель стека должен дважды уменьшиться при помещении в стек, и дважды увеличен при выборе стека.
Машинный стек обычно используется микропроцессором как место сохранения адресов возврата из подпрограмм, но программист может помещать в стек и числовые данные, и таким образом использовать его как рабочую область. Однако, обычная ошибка программистов состоит в попытке использовать эти данные как адреса возврата, без проверки того, указывает ли стек на требуемую программу.
Регистр I
Это регистр вектора прерывания. В системах, основанных на Z8 0, и отличных от Спектрум, этот регистр обычно используется для размещения адресов обслуживания устройств ввода/вывода. Однако, в Спектрум эта возможность не используется, и регистр I используется для генерации яркостного ТВ сигнала .
Регистр R
Это регистр регенерации памяти. Этот регистр является простым счетчиком, который увеличивается каждый раз при выполнении цикла регенерации. Значение в регистре циклически меняется от 0 до 255.
Регистр R используется для выполнения регенерации динамической памяти.
Арифметически-логическое устройство (АЛУ)
Эта часть Z80 имеет дело, как следует из названия, с арифметическими и логическими операциями. Важно понять, что операции, которые могут быть выполнены АЛУ, сильно ограниченны. Простое двоичное сложение или вычитание возможно, а умножение или деление - нет. Можно выполнить прибавление 1 или вычитание 1. Устройство способно выполнять большое число битовых операций и установить флаги, чтобы показать результат .
3.4. Структура программы в машинных кодах.
Как установлено выше, микропроцессор Z8 0 работает как компьютер, поскольку он представляет машину, способную запоминать последовательность хранимых команд. Программа должна существовать как набор машинных команд и данных, размещенных в последовательных адресах памяти. В микропроцессорных системах, основанных на Z8 0, единицей памяти является 8 бит или 1 байт данных. Поэтому программа в машинных кодах является последовательностью 8-битовых значений.
Десятичный результат может быть представлен следующей программой, которая печатает адреса с 0-7.
10 FOR A= 0 TO 7
20 PRINT "LOCATION"; TAB 10; A; TAB 15; PEEK A
3 0 NEXT A
Программа на Бейсике, показывающая 16-ричные значения, немногим более сложна
10 FOR A= 0 TO 7
20 LET H= INT (PEEK A/16)
30 LET L= PEEK A-H*16
40 PRINT "LOCATION"; TAB 10; TAB 15; CHR$(48+H+7 H 9)
CHR$(48+L+7*(L 9)) 50 NEXT A
Эти две программы включены, чтобы показать способ получения десятичного или 16-ричного листинга программы в машинных кодах.
Рассмотрим шаги получения документированного листинга.
Используя таблицу машинных команд (приложение F "BASIC programming") можно представить эти машинные команды в следующем виде:
мнемоника комментарии
0 - DI запрещение маскированных прерываний
1 - XOR A сложение по модулю2 регистра А 2-4 - LD DE,+FFFF загрузка регистровой пары DE 5-7 JP +11CB адр переход по абсолютному адресу
В вышеупомянутом описании мнемонически записана каждая машинная команда. Мнемоника - стилизованный путь представления команд в полезной форме. Все машинные команды из набора команд Z8 0 имеют свою мнемонику и программы в машинных кодах записываются обычно с использованием мнемоники, а не двоичного, десятичного или 16-ричного представления.
Заметим, что в вышеупомянутом описании две строки программы используют по одному байту памяти, две следующие - по 3 байта. В последнем случае первый из 3 содержит код выполняемой операции.
Обычная форма для представления программ в машинных кодах дана в примере.
адрес машинный мнемоника комментарии код
0000 F3 DI запрет прерываний
0001 AF XOR A исключающее ИЛИ
0002 11 FF FF LD DE,+FFFF предельный адрес
0005 С3 CB 11 JP +11CB переход вперед
Эта форма называется "форматом ассемблера", и обычно имеет адреса расположения кодов в 16-ричном представлении, машинные коды в 16-ричном представлении, мнемоническую запись команды и комментарии.
Вышеупомянутый пример показал, как может быть получен формат ассемблера для данного блока машинных кодов Z8 0. Этот процесс называется дизассемблированием, а программа, решающая эту задачу - дизассемблером.
Операции, детально рассмотренные выше, приведены в обратном порядке по отношению к процессу написания программ.
Прежде всего, программист будет писать программу, используя мнемонику. Затем будут найдены двоичные, десятичные и 16-ричные эквиваленты. Программа, которая ставит в соответствие мнемонической записи машинные коды, называется ассемблер .
Отметьте, что формат ассемблера, приведенный выше, часто дополняется и включает в себя метки и переменные, а именно:
STARI equ 0000 нулевой адрес
START/NEW equ 11CB продолжать здесь
TOP-MEM equ FFFF =65535
адрес мнемоника
0000 START DI запрет прерываний
0001 XOR A исключающее ИЛИ
0 0 02 LD DE,+TOP-MEM старший байт памяти
0005 JP START/NEW переход вперед
При обсуждении формата ассемблера должно быть отмечено что он не является полностью определенным форматом, и что различные ассемблеры будут иметь различные требования и ограничения .