5. СИСТЕМА КОМАНД МИКРОПРОЦЕССОРА Z-80.
5.1 КОМАНДЫ И ДАННЫЕ.
Команды поделены на 18 групп, каждая из которых состоит из тех
команд, которые сильно похожи друг на друга. Существует шесть классов
данных, которые могут следовать за командой.
1. Однобайтовая константа (+DD).
Это число А в диапазоне 00-FFh, (0-255d). Те команды, которые
требуют за собой однобайтовую константу, имеют мнемоническую
приставку +DD. Например: LD A,+DD
2. Двухбайтовая константа (+DDDD).
Это число А в диапазоне 0000-FFFFh (0-65535d). Те комманды,
которые требуют за собой двухбайтовую константу, имеют
мнемоническую приставку +DDDD. Например: LD HL,+DDDD
3. Двухбайтовый адрес (ADDV).
Это число А в диапазоне 0000-FFFFh (0-65535d), то есть число,
которое используется как адрес памяти. Те команды, которые требуют
за собой двухбайтовый адрес, имеют приставку ADDV, например: JP
ADDV
4. Однобайтовая константа смещения (е).
Это чисиюА в диапазоне 00-FFh (-128 +127d). Число всегда представлено
в дополнительном коде. Те команды, которые требуют за собой
однобайтовую константу, имеют мнемоническую приставку е.
Например: JP е
5. Однобайтовая индексирующая константа смещения (+D).
Это число А в диапазоне 00-FFh, (-128 +127d) представлено в
дополнительной арифметике. Те команды, которые требуют за собой
однобайтовую индексирующую константу смещения, имеют
мнемоническую приставку +D. Например: LD A,(JX+D)
6. Однобайтовая индексирующая константа смещения и однобайтовая
константа (+D,+DD).
Это два числа в диапазоне ОО-FFh, первое из которых рассматривается
как десятичное -128 -+127, а второе - как десятичное 0-255. Команды,
требующие два байта данных, сопровождаются мнемониками +D и
+DD. Например: LD (JX+D),+UD
5.2 ГРУППЫ КОМАНД.
Существует много путей для разделения на группы сотен различных
машинных команд. Метод, выбранный здесь, разделяет команды на 18
функциональных групп.
После изучения команд по группам читатель выполнит программы
бэйсик из следующей главы, которые иллюстрируют эти команды.
■ Группа 1. Команда "нет операции".
Мрем<ЖИКЗ Цб-ннЙКОД
NOP 00
Выполнение команды требует 1,14 мкс. Ни один из регистров или флагов
не изменяется. Команда NOP используется программистом для организации
задержек, но чаще для удаления ненужных команд из программы.
Программа бэйсика, демонстрирующая эту команду, приведена в главе
6 (программа 1).
Ш Грутц 2. Комавды загрузки регистра коистаетами.
МЧСМРНИК 3 1$-Щ>1ЙК9Д
LDA,+DD 3EDD
LD H,+DD 26DD
LD L,+DD 2EDD
LD B,+DD 06DD
LD C,+DD OEDD
LD D,+DD 16DD
LD E,+DD 1EDD
Каждая из этих команд требует два байта памяти: один для кода
операции, второй для константы. Команды записывают в регистр
соответствующие значения*, старые значения регистра пропадают.
Следующие команды выполняют загрузку пары регистров двухбайтовыми
константами.
Строка команды требует 3 или 4 байта в памяти. Код операции занимает
1 или 2 байта, и 2 байта занимает константа. Первый байт константы
загружается в младший регистр регистровой пары т.е. L,C,E,X,Y,P, а второй
байтв старший регистр, т.е. H,5,D,I,S. Эти команды записывают в регистровые
пары данные, которые часто рассмтриваются программистом как
двухбайтовый адрес, но могут бьпъ также и двухбайтовым числовым значением
и двумя отдельными однобайтовыми числовыми значениями.
команды этой группы не изменяют флагов. Программа бэйсик для
демонстрации этих команд приведена в главе 6 (программы 2,3).
■ Груши 3. Комавды копирования регистров и обмена.
Существует 59 команд, которые выполняют копирование регистров и
регистровых пар. Эти команды можно разделить на 4 подгруппы.
Подгруппа А. Команды копирования типа регистр-регистр.
Следующая таблица даст коды операций команд, выполняющих
копирование содержимого одного регистра в другой.
Ни одна из команд, приведенных в таблице, не изменяет флаги.
Существует кроме того 4 команды для I и R регистров.
Ни одна из команд, приведенных в таблице, не изменяет флаги.
Существует кроме того 4 команды для I и R регистров.
Эти последние команды влияют на флаг переполнения четности.
Подгруппа В. Команды копирования типа регистровая пара -регистровая
пара.
Существует только 3 команды этой подгруппы. Они копируют значения
в указатель стека.
Эти команды не изменяют содержимое флагов. Заметьте, если содержимое
регистровой пары надо копировать в другую регистровую пару и эти
команды не подходят, необходимо выполнить две команды копирования
регистр-регистр. Например, нет команды LD HL,DE, и ее заменяют,
используя LD H,D и LD L,E. Или содержимое первой регистровой пары
может быть сохранено в стеке и затем переписано во вторую регистровую
пару ( смотри команды стека ).
Подгруппа С. Команды ex DE,NL.
Существует только одна команда, которая позволяет обменивать
содержимое регистровых пар в пределах основного набора регистров.
Это очень полезная команда позволяет обменивать содержимое пары
DE с содержимым пары HL. Значение флагов не изменяется. Команда
используется, когда необходимо, чтобы адрес или двухбайтовая числовая
константа из пары DE была записана в пару HL, но содержимое последней
не было потеряно.
Подгруппа D. Команды альтернативного набора регистров.
В этой группе 2 команды.
Команда ЕХХ вызывает переключение регистров H,L,B, С, D,EHa регистры
Н', LB',C, D', Е. Команды EX AF,A'F, как следует из мнемоники, переключают
рег.А и F на A' F. Альтернативные регистры часто используются для
хранения адресов и данных. Помещенные в альтернативные регистры эти
значения сохраняются от искажения и могут быть легко и просто
восстановлены. Программа бэйсик, демонстрирующая эти команды,
приведена в главе 6 (программа 4).
■ Группа 4. Команды загрузки регистров из памяти.
В систему Z80 входит много команд, позволяющих находить данные в
памяти и затем загружать их в регистры. Все эти команды требуют, чтобы
программист указал адрес или пару адресов в памяти, откуда данные должны
быть скопированы в регистр -получатель данных.
Команды этой группы лучше рассматривать как команды трех подгрупп
в соответствии с методом адресации. Виды адресации:
- косвенная - двухбайтовый адрес уже размещен в адресной регистровой
паре;
- непосредственная - действительный адрес указан в двух байтах вслед
за кодом операции;
-индексная - адрес данных должен быть вычислен путем сложения
значения смещения D с основным адресом, уже содержащимся в
регистровой паре DC или IY.
Подгруппа А. Команды, использующие непосредственную адресацию.
Для команд, использующих пару IY, надо изменить DC на IY и DD на FD.
Ни одна из команд этой группы не меняет флаги. Программа бэйсик этих
команд приведена в главе 6 (программы 5,6,7).
■ Груши 5. Команды загаси в память содержимого регистра или константы.
Обычно команды этой группы выполняют операции, противоположные
тем, которые делают команды группы 4. Команды позволяют содержимое
регистров переписывать в память или записывать туда константы. Эти
команды лучше рассмотреть по трем группам.
Подгруппа А. Команды непосредственной адресации.
Приведенные команды приводят только непосредственную адресацию и
важно заметить, что нет команд для записи в память констант. Если это
необходимо, константа предварительно должна быть загружена в регистр А.
Затем выполняется LD(ADDR),A. Команды типа LD(ADDR),HL-
факгически двойные команды: LD(ADDR),L и LD(ADDR+1),H. Команды
подгруппы часто используются для сохранения адресов и значений в
памяти, когда эта значения рассматриваются как переменные. Например,
часто используется LD(RAMTOP),HL, где RAMTOP - метка пары адресов
памяти, используемых дни хранения текущего значения верхней границы
памяти. Выборка текущего значения верхней границы может быть позднее
выполнена командой 4 группы, например: LD HL,(RAMTOP).
Подгруппа В. Команды косвенной адресации.
Команды этой подгруппы позволяют копировать содержимое регистров
в память, адрес которой содержится в регистровой паре HL,BC или DE.
Существует также команда записи однобайтовой константы по адресу,
указанному в паре HL.
Подгруппа С. Команды индексной адресации:
Для команд^ использующих IY-регистровую пару, надо изменить IX на
IY и DD на Dr. Программы 8,9,10 в главе 6 иллюстрируют эти команды.
■ Группа (. Команды сложены.
Эга группа команд выполняет арифметические действия. Команды
сложения позволяют программисту прибавить (в абсолютной двоичной
арифметике) заданное число к регистровой паре, регистру или индексному
адресу памяти.
Команды этой группы могут бьпъ поделены на 3 подгруппы:
- команды ADD;
- команды INC. Специальный случай сложения, когда к числу
прибавляется 1;
- команда ADC. Значение флага переноса прибавляется к результату.
Флаг переноса - это один из битов регистра флагов, который
используется для сигнализации о том, было ли при выполнении
последней арифметической операции переполнение регистра или
байта памяти. Команды ADD и ADC меняют флаг переноса, a INC
- не меняет.
Под группа А* Команды ADD.
Для команд использующих IY регистр, надо поменять IX на IV и DD на
FD. Команды ADD, приведенные выше очень, просты. Команда устанавливает
или сбрасывает флаг переноса в зависимости от того, было или нет
переполнение влево регистра или пары регистров. Это показано на следующих
примерах:
1. Регистры содержат: A=60h B=90h
Выполняется ADD А,В и после этого:
A=F0h
B=90h флаг переноса сброшен.
2. Регистры содержат: A=A8h B=7Eh
Выполняется ADD А,В и после этого:
A=26h
B=7Eh флаг переноса установлен.
Подгруппа В. Команды INC.
Команды этой группы позволяют прибавить 1 к регистру, ячейке памяти
или паре регистров. Во всех случаях флаг переноса не изменяется.
Подгруппа С. Команды ADC
Команды этой группы прзволяют сложить два числа вместе с текущим
значением флага переноса. Все команды этой группы меняют флаг переноса.
Он сбрасывается, если операция ADC не дает переполнения, и
устанавливается, если дает.
Примеры показывают это:
1. Регистры содержал A=60h B=90h4wiar=l
Выполняется ADC А,В и после этого;
A=Flh B=90h флаг=0
2. Регистры содержат: A=A8h B=7Eh флаг=1
Выполняется ADC А,В и после этого:
А=2/а B=7Eh флаг=1
Программы 11,12,13 в главе б демонстрируют эти команды.
■ Грушка 7. Команды мгаггяяия.
Команды вычитания позволяют вычесть заданное число из одинарного
регистра, пары регистров или индексного адреса памяти. Команды этой
группы полезно разделить на 3 подгруппы, каждая из которых имеет свою
мнемонику:
- команда SUB;
- команда DEC. Специальный случай вычитания, когда из числа вычитается
- команда SBC. Значение флага переноса вычитается из результата.
Все команды SUB и SBC изменяют флаг переноса в зависимости от того,
требовался ли двоичный заем. Команда DEC оставляет флаг переноса без
изменения.
Под группа А. Команды SUB.
Замечание: мнемоника команд хотя и пишется, как указано выше, но
SUB L подразумевается SUB A,L и т.д., поскольку все команды используют
регистр А.
В Z80 команда SUB выполняет "истинное" абсолютное двоичное
вычитание, как доказано в примерах. Флаг переноса сбрасывается, если
первоначальное значение регистра А>= вычитаемому и, устанавливается,
если <.
Примеры показывают это:
1. Регистры содержат. A=DCh B=AAh
Выполняется SUB В и посде этого:
A=B2h B=AAh флаг=0
2t Регистры содержат: A=AAh B=DCh
Выполняется SUB В и после этого:
A=CEh B=DCh флаг=1
Подаруппа В. Команды DEC.
Команды этой группы позволяют вычесть 1 из содержимого регистра,
ячейки памяти или пары регистров. Во всех этих случаях флаг переноса не
изменяется.
Подгруппа С. Команды SBC.
Команда SBC выполняет "истинное" вычитание, если флаг переноса
сброшен, и "вычитание с заемом", если флаг переноса установлен. Это
может быть полезно, если используются значения повышенной точности.
Например, четырехбайтовое число содержащееся в регистрах H',LH,L
может быть вычтено из другого числа, хранящегося в регистрах D*,E Ь,Е,
следующим образом:
Соответствующий заем между младшей и старшей частями учитывается.
Программа 14, демонстрирующая команды этой группы, находится в главе
6.
■ Группа 8. Комавды сравнения.
Команды этой группы используют очень часто во всех программах. Они
позволяют программисту сравнить значение,- находящееся в регистре А, с
константой, значением в регистрах и области памяти. Команды выпыполняют
операцию вычитания без переноса, без запоминания результата вычитания
и только устанавливают флаги в регистре флагов. Первоначальное значение
в регистре А не изменяется. Флаг переноса устанавливается, как при
операциях вычитания. Сравнение, которое >=, сбрасывает флаг переноса,
а < устанавливает. Команды этой группы - команды одинарного сравнения,
а блочное сравнение рассмотрено далее.
Следующие примеры показывают использование команды CP:
1. A=31h
CP В оставляет регистры без изменения
B=30h и сбрасывает флаг переноса 31h>30h;
2. A=30h
»»
B=30h
30h=30h
3. A=01h
CP В оставляет регистры без изменения
B=30h и устанавливает флаг переноса 01h<30h.
Программа 12, демонстрирующая эти команды, находится в главе 6.
■ Группа 9. Команды лопиш.
Это команды AND, OR, XOR. Они применяются к регистру А и другой
заданной переменной. Операция выполняется побито, и 8-битовый
результат возвращается в регистр А.
Подгруппа А. Команда AND.
Логическая операция выполняется над двумя двоичными цифрами и
результат равен единице, только если оба тестируемых бита установлены.
В противном случае результирующий бит равен 0. Пример показывает, как
команда выполняется над восемью отдельными битами.
В эйой подгруппе следующие команды:
Командой AND удобно сбрасывать биты 0-7 регистра А. Этот процесс
называется демаскированием и позволяет проверять определенные биты
байта данных. Следующий пример показывает, как это можно сделать. В
системе SPECTRUM биты 0-2 системной переменной ATTR-P содержат
информацию о постоянном цвете чернил. Когда цвет чернил необходимо
изменять, старый цвет удаляется использованием команды AND, и новый
цвет вводился по команде ADD:
LD A,(ATTR-P) находится системная переменная;
AND+F7 демаскируется старый цвет;
ADD+NEW COLOR добавляется новый цвет;
LD(ATTR-P),A сохраняется системная переменная.
Подгруппа В. Команда OR.
Логическая операция "или** выполняется над двумя двоичными цифрами,
и результат равен 1, если одна или обе цифры установлены. В противном
случае бит результата сброшен. Пример показывает, как команда выполняет
операцию над 8 отдельными битами:
Двоичн. 10101010 16-ный AAh
OR OR
11000000 AOh
11101010 EAh
В подгруппе следующие команды:
Мнемоника Код
OR+DD F6 DD
OR А В7
OR Н В4
ORL В5
OR В ВО
OR С В1
ORD В2
ORE ВЗ
При работе команды OR биты будут установлены или будет проверено,
что биты регистра А уже установлены. Пример показывает одно из
использований команды OR. Биты 5,4,3 системной переменной ATTR-P
определяют постоянный цвет бумаги. Можно сделать цвет бумаги белым с
использованием команды OR+DD.
LD A,(ATTR-P) найти системную переменную;
OR+38 установить биты 5,4,3;
LD(ATTR-P),A сохранить системную переменную.
Группа С. Команда XOR.
При работе команды проверяются два разряда. Если хотя бы один из них,
но не вместе, установлен в единицу, то результирующий бит устанавливается
также в 1; иначе результирующий бит сбрасывается. Пример показывает,
каким образом команда XOR выполняет восемь отдельных операций над
битами:
10101010 AAh
XOR XOR
11000000 C0h
01101010 6Ah
Команды в этой подгруппе:
XOR+DD ЕЕ DD
XOR A AF
XOR H AC
XOR L AD
XOR В A8
XOR С A9
XOR D AA
XOR E AB
XOR(HL) AE
XOR(IX+D) DD AE D
XOR(IY-fD) FD AE D
При работе этой команды будут установлены или сброшены до 8 битов
регистра А. Это, вероятно, вначале трудно понять, но рассмотрите пример,
приведенный выше, еще раз, а именно:
АА XOR СО = СА
В этом примере вторым операндом является, байт СО, в котором
установлены в 1 только биты 6 и 7. Поэтому эффект работы операции XOR
заключается в переключении битов 6 и 7 первого операнда, то есть
изменении АА в СА. Использование команды XOR в программах машинного
кода часто является сложным, но команда XOR А, однако, часто используется
как альтернативная для LD А,4-00. Обе эти команды очищают регистр А, но
XOR использует только один адрес, в то время как LD,A+00 использует два
адреса. Все команды AND,OR,XOR сбрасывают флаг переноса, когда они
используются. Программа 15 в главе 6 демонстрирует эти команды.
■ Группа 10. Команды перехода.
Имеется 17 команд, которые позволяют выполнять переходы внутри
программы. Команды этой группы лучше всего разделить на 8 подгрупп.
Четыре из этих подгрупп содержат команды, которые выполняются по
условию, в завимости от состояния одного из основных флагов.
Подгруппа А. Команда абсолютного перехода.
JP ADDV СЗ ADDV
Это команда перехода. При выполнении команды значение ADDV
загружается в счетчик команд и выполнение программы машинного кода
продолжается с этого адреса.
Команды переходов, которые используют косвенную адресацию.
Выполнение этих команд приводит к тому, что 16-битная величина,
хранящаяся в соответствующей регистровой паре загружается в счетчик
команд. Команды этой группы часто используются, когда переход должен
осуществляться на команду, адрес которой находится в таблице адресов.
Подгруппа С. Команда относительного перехода.
JRE 18 Е
Команда позволяет сделать переход к адресам вперед на 128 байт и назад
на 128 байт от текущего адреса. Заметьте, что текущий адрес фактически
является адресом, идущим после адреса, по которому записано Е, поскольку
счетчик команд уже выполнил приращение. Е всегда рассматривается как
число в дополнительном коде. Положительное Е дает число байт, на
которое должен быть осуществлен переход вперед, отрицательная величина
Е показывает на сколько байт нужно перейти назад.
Подгруппа D. Команды перехода по флагу переноса. Имеется 4 команды,
позволяющие делать такой переход.
Флаг переноса.
Этому флагу соответствует бит 0 регистра F, и он является флагом,
который показывает, имело место двоичное переполнение или нет. Этот
флаг может при определенных условиях сбрасываться или устанавливаться.
Имеется много примеров, когда на флаг переноса не влияет выполнение
команд. Кратко можно описать следующее правило:
1. Все команды ADD и ADC влияют на флаг переноса. Если нет
переполнения* флаг сбрасывается, если есть переполнение, то флаг
устанавливается.
2. Все команды SUB,SBC,CP влияют на флаг переноса. Если был
заем, тогда флаг устанавливается, в противном случае - сбрасывается.
3. Все команды AND,OR,XOR сбрасывают флаг переноса.
4. Команды сдвига влияют на флаг переноса.
Комавды перехода во флагу переноса:
Мнемоника 16-нийкрл
JP NC,ADDR D2 ADDR переход, если флаг сброшен,
JPNC,E ЗОЕ
JP CADDR DA ADDR переход, если флаг установлен,
JP С,Е 38 Е
В качестве примера этих команд рассмотрите следующую программу,
котрая распознает цифры в коде ASCII.
..............................в регистре А хранится проверяемый код СР+30
сравнение с кодом для цифры О
JP С,ERROR переход,если он находится за границами диапазона.
СР+ЗА сравнение с кодом для
JP NC, ERROR опять переход, если он находится за пределами
диапазона,
..............................продолжение только с цифрами т.е. диапазон кодов
30-39.
Подгруппа £. Команды перехода по флагу 0.
Имеется 4 команды, которые позволяют выполнить переход только в
том случае, если флаг нуля будет таким же, как требуется командой.
Флагу 0 соответствует шестой бит регистра F, и в большинстве случаев
он устанавливается, если результат равен нулю, в противном случае он
сбрасывается. Например:
6С ADD 5А дает Сб и флаг нуля сбрасывается
6D ADD 94 дает 00 и флаг нуля устанавливается.
Можно привести правило:
1. Команды ADD,INC,ADC,SUB,DEC,SBC,SR,AND,OR,XOR,
использующие одиночные регистры, и команды ADC, SBC,
использующие регистровые пары, установят флаг 0 , если результат
равен 0.
2. Команды сдвига, команды проверки битов и команды поиска
блоков влияют на флаг.
3. Команды LD, за исключением LD АД LD A, R, не влияют на флаг
нуля.
Команды перехода:
Мнемоника 16-ныйкод
JP NZ,ADDR С2 ADDR переход только тогда
JP NZ,E 20 Е когда сброшен флаг О
JP Z,ADDR СА ADDR переход только когда
JP Z,E 28 Е установлен флаг 0.
Команды этой группы обычно широко используются; и пример
показывает, как распознать символы ASCII:
....................введите в регистр А код символа
СР+ЗВ это символ ?
JP Z.S-COLON переход, если это так
СР+2С это символ 7' ?
JP NZ,ELSE переход, если нет.
....................продолжение при У
Подгруппа F. Команды перехода по флагу знака.
Имеется две команды, которые позволяют сделать переход только в том
случае, если флаг знака будет таким же, как требуется командой.
Флагу знака соотвует 7 бит регистра F, и в большинстве случаев он
представляет собой копию старшего (левого) бита результата. Когда 8-ми
битовое или 16-ти битовое двоичное число представлено в виде
арифметического дополнения до 2(в дополнительном коде), тогда левый
бит (бит 7 или бит 15) представляет собой бит знака. Он сбрасывается для
положительных чисел и устанавливается для отрицательных. Поэтому флаг
знака сбрасывается при положительных результатах и устанавливается при
отрицательных.
Кратко опишем правило:
1. Все команды ADD,INC,ADC,SUB,DEC,SBC,CP,AND,OR,XOR,
использующие один регистр; команды ADC и SBC, использующие
регистровые пары, будут влиять на флаг знака, как указано выше.
2. Команды поиска блока и большинство команд сдвига также
влияют на флаг знака.
3. Команды LD, за исключением LD АД и LD A,R не влияют на флаг
знака.
Команды перехода по состоянию флага знака:
JP P,ADDR F2 ADDR - переход, если результат +
JP M,ADDR FA ADDR - переход, если результат -
Команды этой группы обычно используются редко. Частично потому,
что требуют абсолютного адреса, и частично потому, что бит знака может
считьгваться некоторыми другими методами.
Пример показывает использование этих команд.
....................введите в регистр А код символа
AND А устанавливает флаг знака
JP P,ELSE для кодов 00-7Fh выполняется переход
....................продолжение только с графическими символами (коды 80-
FFh)
Подгруппа G. Команды перехода по флагу переполнение / четность.
Имеются две команды, которые позволяют выполнить переход, если
флаг переполнение/четность будет таким, как требуется.
Флагу переполнения/четности соответствует второй бит регистра F, и
он является флагом двойного назначения. Некоторые команды используют
флаг, чтобы указать на переполнение, в то время как другие команды
используют его, чтобы хранить результат проверки на четность.
Понятие переполнение не относится к двоичному перепозшению, а
относится к арифметике чисел в дополнительных кодах, как показано
следующими примерами.
Рассмотрите:
OAh ADD 5Ch дает 66h, что правильно - нет переполнения.
6Ah ADD 32h дает 9Ch, что неправильно - есть переполнение.
Переполнение может также возникнуть при вычитаниях а именно:
83h SUB 14h дает 6Fh, что неправильно, то есть имеет место переполнение.
Флаг переполнение/четность устанавливается, когда имеет место
переполнение.
Понятие четности касается числа единичных битов в заданном байте.
Это показано в примере:
Байт 01010101 имеет четное число единиц (4), и флаг установлен.
Байт 00110010 имеет нечетное число единиц (3), и флаг сброшен.
Кратко сформулируем правило:
1. Все команды AND,OR,XOR и большинство команд сдвига дают
результат, который может быть проверен на четность.
2. Все команды ADD,ADC,SBC,CP, использующие одиночные
регистры, и команды ADC,SBC, использующие регистровые пары
дают результат, который может быть проверен на переполнение.
3. команда INC установит флаг, если результат будет равен 80h;
команда DEC - если результат равен 7Fh.
4. Другие команды, а именно: LD А,1 и LD A,R и многие из команд
отработки блоков - также влияют на флаг переполнение/четность.
Команды перехода этой группы:
JP PO,ADDR Е2 ADDR -переход, если число единиц нечетное или нет
переполнения.
JP PE,ADDR ЕА ADDR -переход, если число единиц четное или есть
переполнение.
Команды этой подгруппы используются только в тех случаях, когда
невозможно использование других команд.
Программа 16, которая демонстрирует использование этих команд,
представлена в главе 6.
■ Группа 11. Команда DJNZ.
Единственная команда в этой группе является одной из самых полезных
и самой широко используемой в Z80. Работа этой команды может быть
уподоблена циклу FOR-NEXT программы бэйсик следующего вида:
FOR В=Х ТО 0 STEP-1.NEXT В
в этом цикле переменной "В" присваивается значение X. Затем с каждым
проходом цикла она уменьшается до тех пор, пока не достигнет значения
0. Команда DJNZ используется подобным же образом. Прежде всего
программист должен определить значение переменной цикла и занести ее
в регистр В. Затем идет цикл. Наконец, используется команда DJNZ, с
необходимой величиной смещения для возврата к началу цикла. Следующий
пример показывает, как эта команда должна использоваться для печати
алфавита.
LD В,+1А 26 букв в алфавите ИАИ - первая
LD А,+5В
SUB В 5В-1А=41 код буквы
RST 0010 печать символа
DJNZ,LOOP переход
Шестнадцатиричным кодом для этого примера является
06, 1A,3E,5Bj90, 17,10,FA.
Байт ЭЕ" явцяется меткой цикла, то есть переход выполняется на адрес
памяти, содержащей этот байт. Автор обнаружил, что лучшая методика для
вычисления правильной величины 'е - смещения" в примерах коротких
машинных программ, подобных приведенному выше, заключается в
представлении байта "еи величиной "FF* и затем считать в обратном
направлении (в 16-ой форме) до тех пор, пока не будет достигнут байт, на
который требуется переход. В приведенном выше примере имеется 5 шагов
назад и соответствующая величина для "еи равна FA.
Программа 17, которая показывает работу этой команды, представлена
в главе о.
■ Группа 12. Комавды стека.
В большинстве программ машинных кодов осуществляется активное
использование машинного стека: программистом в качестве места где
можно хранить данные; микропроцессором - для сохранения адресов
возврата.
Команды, которые образуют эту группу, можно разделить на две подгруппы
для пользователя и три подгруппы для микропроцессора.
Подгруппа A. PUSH и POP.
Эти команды позволяют программисту по PUSH сохранить 2 байта
данных в машинном стеке, а по POP - копировать 2 байта из машинного
стека.
Эти 2 байта данных должны копироваться в строго определенную пару
регистров, но важно знать, что не производится никакой записи, которая
указывала бы, к какому из двух регистров какой байт данных принадлежит.
Комавды PUSH
PUSH AF F5
PUSH HL E5
PUSH ВС C5
PUSH DE D5
PUSH IX DDE5
PUSH IY FDE5
Комавды POP
POP AF F1
POP HL El
POP ВС CI
POP DE D1
POP EX DDE1
POP IY FDE1
Когда выполняется команда PUSH, указатель стека предварительно
уменьшается так, чтобы указать на свободный адрес, и в стек копируется
содержимое старшего регистра. Затем указатель стека уменьшается вторично,
и величина из младшего регистра копируется в стек.
Противоположные действия имеют место во время выполнения команды
POP. Важно помнить, что указатель стека после выполнения одной из эпос
команд указывает текущий адрес стека, использованный в "последний раз".
Команды этой подгруппы часто используются одновременно, и
следующий пример подтверждает это:
PUSH AF сохранить AF
PUSH ВС сохранить ВС
.............."другая работа"
Pop ВС восстановить ВС
Pop AF восстановить AF
В примере под словами "другая работа" подразумевается использование
регистров A, F, В, С " без вреда ", но она должна оставить указатель стека
прежней величины.
Подгруппа В. Команды обмена со стеком.
Команды этой подгруппы используются не часто, но они могут оказаться
полезными:
крмащщ код
EX(SP),HL ЕЗ
EX(SP),IY DDE3
EX(SP),IX FDE3
Эти инструкции позволяют программисту обменивать текущую величину,
имеющуюся в указанной паре регистров, с последним значением машинного
стека. Значение указателя машинного стека не меняется.
Использование этих команд может привести к путанице и лучше всего
их использовать как альтернативные командам PUSH и POP в особых
случаях. Например: Величина "первая" находится в стеке, величина "вторая"
в паре HL, и если программист намерен обменять их друг с другом, то
имеется два способа:
1. Использовать комаду EX(SP),HL. Тогда данные из стека по текущему
значению указателя стека будут размещены в паре HL, а из HL
передадутся в стек.
2. Использовать дополнительный регистр для временного хранения
"первого", то есть:
POP ВС сохранить "первую" величину в ВС
PUSH HL "вторую" передать в стек
PUSH ВС передать "первую" в стек
POP HL сохранить "первую" в HL
Кроме того, команды этой подгруппы могут использоваться для изменения
адреса возврата (см. ниже),
Подгрупп* С. Команды CALL
Команды машинного кода CALL эквивалентны команде бэйсик
"GOSUB". Команды включаются в эту группу, так как микропроцессор
использует стек машины, то есть область, в которой хранятся адреса
"возврата".
Имеются 9 команд в этой группе, и они позволяют перейти на
подпрограмму без условий или в зависимости от состояний четырех флагов.
Командами в этой подгруппе являются :
Действие команд CALL следующее :
1. Текущее значение счетчика команд, то есть адрес первой ячейки
цосле ADDR, сохраняется в стеке. Указатель стека изменяется как в
случае команды PUSH. Старший байт счетчика команд сохраняется
в стеке над младшим байтом.
2. Адрес ADDR затем записывается в счетчик команд, и выполняется
программа.
3. По команде RET осуществляется возврат из подпрограммы.
Подаруппа D. Команды RET.
Команды машинного кода RET эквивалентны команде бэйсик
"RETURN". Имеются 9 команд в этой подгруппе, которые позволяют
осуществить выход из подпрограммы без условий или в зависимости от
состояния четырех флагов.
Командами в этой подгруппе являются :
По команде RET адрес возврата из машинного стека побайтно
восстанавливается в счетчике команд. При этом указатель стека дважды
модифицируется в сторону увеличения.
Важно понимать, что восстановленный адрес возврата из машинного
стека не обязательно тот, что был вначале помещен туда командой CALL.
Не принято при программировании на бэйсике модифицировать стек
GOSUB, но при программировании в машинном коде это обычно имеет
место.
Следующий пример показывает, как это делается. Адрес программы
выбирается из таблицы адресов, и на эту программу осуществляется
переход.
..................регистр А содержит входное значение
LD D,+00 очистка регистра D
ADD А дублирование входного значения
LD Е,А и пересылка в регистр Е
LD HL,+TABLE-BASE НЬуказывает на таблицу
ADD HL.DE указатель на точку входа
LD D,(HL) получение старшего байгга адреса
INC HL
LD E,(HL) получение младшего байта адреса
PUSHDE сохранение адреса в стеке
RET возврат
Подкруппа £. команды RST.
Последняя подгруппа команд в этой группе содержит специальную
команду RST или команду "повторный пуск". Эти команды являются
аналогичными командам CALL, но не требуют, чтобы адрес определялся
Команды подгруппы:
В системе SPECTRUM восемь адресов "перезапуска" являются точками
входа подпрограмм,монитора, и они будут рассмотрены в главе 7.
Программа 18, которая показывает команды этой группы, находится в
главе 6.
■ Группа 13. команды сдвига.
Набор команд Z80 имеет большое число команд для сдвигов битов
определенного байта. Эти команды очень часто полезны. Тем более, что все
они сдвигают биты через флаг переноса, который затем может проверяться.
Сдвиг байта влево удваивает величину, записанную в этом байте (регистре),
старшие биты при этом не теряются. Во время сдвига вправо величина
делится пополам.
В таблице продемонстрированы команды этой группы:
Имеются также четыре однобайтовые команды для сдвига регистра А и
две специальные команды, работающие с полубайтами.
RLCA - 07 RRD - ED 67
RLA - 17 RLD - ED 6F
RRCA - OF
RRA - IF
Суммируя влияние этих команд на основные флаги, можно сделать
следующие выводы:
- все команды за исключением RLD и RRD, влияют на флаг переноса;
- все команды за исключением четырех команд с одиночными байтами
влияют на флаги знака и переполнения/четности.
Программа 19, которая иллюстрирует работу этих команд, представлена
в главе 6.
■ Группа 14. Команды обработки битов.
Набор команд Z80 имеет команда, которые позволяют определять,
устанавливать и сбрасывать отдельные биты в пределах байта, помещенного
в регистр или находящегося в памяти.
Подтруню А. Команды ВГГ.
Они позволяют определять состояние определенного бита. При
использовании одной из этих команд обычным является процесс проверки,
например, путем использования команды JP Z.
Команды ВГГ устанавливают флаг 0 , если используемый бит сброшен,
и наоборот.
Подфушш В. Команды SET.
Эти команды позволяют устанавливать определенный бит, при этом ни
один из флагов не изменяется.
Подфуппя С. Команда RES.
Данная команда сбрасывает определенный бит. Флаги не меняются.
Команды этих трех подгрупп приведены в таблице.
Программа 20, которая демострирует эти команды показана в главе 6.
■ Группа 15. Команды обработка блоков.
Имеется 8 команд обработки блоков. Эти команды очень интересны и
очень полезны. Они позволяют перемещать блок данных из одной области
пвмяпс в другую или искать область памяти. Чтобы перемещать блок
данных, базовый адрес должен находиться в регистровой паре HL, адрес
места назначения информации - в регистровой паре DE и число байтов в
блоке - в ВС. Для поиска в области памяти определенной величины,
базовый адрес должен бьпь в регистровой паре ВС, а регистр А должен
содержать искомую величину.
Команды подорушш AUTOMATIC.
LDIR ED ВО
LDDR ED В8
CPIR ED 81
CPDR ED 89
NON-AUTOMATIC
LDI ED AO
LDD EDA8
CPI EDA1
CPD EDA9
Как можно увидеть из приведенной выше таблицы, имеются
автоматические и неавтоматические команды. Автоматические команды
более просты и более полезны. Автоматическая команда будет выполнять
свою задачу без других команд. Выполнение автоматической команды
может длиться разное время. Это время зависит от количества байтов,
которые будут перемещаться.
Неавтоматическая команда передает только по одному байту и требует,
чтобы программист использовал команду повторно для перемещения
блока данных или поиска в заданной области памяти. Время выполнения
неавтоматической команды поэтому определено. Каждая команда этой
группы далее будет обсуждаться по очереди.
■ LDIR
Это самая распространенная команда из этой группы. Команда будет
перемещать данные, адрес источника которых содержится в регистровой
паре HL, в область памяти с адреса, находящегося в/регистровой паре DE.
Число перемещаемых байтов определяется в паре ВС. При работе одиночный
байт перемещается из (HL) в (DE). Величина в регистровой паре ВС затем
уменьшается, а величина в HL и DE увеличивается. Если счетчик в ВС еще
не достиг 0, тогда будет пересылаться другой байт данных. Этот процесс
продолжается до тех пор, пока счетчик не достигнет 0, но, заметьте, что в
этот момент значения в HL и DE достигают значения адресов выше
последнего адреса блока. Флаг переполнения / четности сбрасывается этой
командой.
■ LDDR
Эта команда является такой же как команда LDIR, за исключением того,
что после пересылки каждого байта значения в HL и DE уменьшаются.
Поэтому команда требует, чтобы базовый адрес блока соответствовал
последнему адресу блока. Место- назначения информации также должно
относиться к последнему адресу области памяти.
■ CPIR
Эта команда просматривает определенную область памяти для поиска
первого наличия эталонной величины. Регистровая пара HL должена
содержать базовый адрес, ВС - число байтов для исследования, а регистр А
- эталонную величину. При работе байт по адресу HL сравнивается с
байтом, находящимся в А. Если они не совпали, то ВС уменьшается, a HL
увеличивается, и сравниваются следующие байты. Так продолжается до тех
пор, пока не совпадут байты, либо ВС не станет равным 0. Если совпали,
тогда флаг нуля устанавливается, флаг знака сбрасывается, а регистровая
пара HL указывает адрес выбранного байта. Величина в ВС указывает, как
далеко от конца блока определено совпадение. Если совпадение не
установлено, то ВС=0, а флаги 0, знака и переполнения/четности
сбрасываются.
■ CPDR
Работа этой команды похожа на CPIR, но блок данных просматривается
сверху вниз.
Далее рассматриваются неавтоматические команды.
■ LDI
Выполнение этой команды даст перемещение одиночного байта данных
из адреса записанного в регистровой паре HL, по адресу записанного в
регистровой паре DE. Величина в ВС уменьшается. Флаг переполнения/
четности устанавлен до тех пор, пока регистровая пара ВС не станет равной
0. Значения в парах HL и DE уменьшаются. Программист может проверить
байт, который надо перемещать, и затем уже осуществит его перемещение.
■ LDD
Как LDI за исключением того, что величина в HL* и DE уменьшаются.
■ CPI
Выполнение этой команды заключается в сравнении байгга по адресу,
определенному в паре HL, с байтом в регистре А. Флаг 0 устанавливается,
если они совпали, в противном случае -сбрасывается. В ВС находится
число, соответствующее размеру блока. После каждого шага HL
увеличивается, а ВС уменьшается. Флаги знака и переполнения / четности
сброшены до тех пор, пока ВС не станет равным 0, при ВС равном 0 он
устанавливается.
■ CPD
Эта команда подобна CPI, за исключением того, что регистровая пара
HL уменьшается. Программы 21 и 22, демонстрирующие эту Группу команд,
приведены в главе 6.
■ Груши 16. Команды ввода / вывода.
В Z80 имеется исчерпывающий набор команд, позволяющих
программисту получать данные от внешнего источника (IN) или выдавать
данные на периферию (OUT). Имеются простые, неавтоматические и
автоматические команды в этой группе, хотя в SPECTRUMe используются
только простые команды. Во всех случаях данные, которые передаются
через IN и OUT представляют форму 8-ми битовых данных. По команде IN
Z80 принимает байты данных с шины данных и копирует их в заданный
регистр. Во время выполнения команды IN линия IORQ активна, так же,
как и RD. По команде OUT Z80 передает даные с заданного регистра на
шину данных, оттуда они поступают на периферийное устройство. Во время
работы команды OUT линии IORQ и WR будут активны. В дополнение к
состоянию RD, WRh IORQ периферийное устройство будет активизироваться
с использованием адреса, помещенного на адресной шине во время
выполнения либо IN, либо OUT команды. Этот адрес указывает конкретный
nopTHBZ80 представляет собой 16-битный адрес. В SPECTRUMe используется
только несколько из 65535 возможных адресов портов, что позволяет
периферийному устройству идентифицировать обращение к нему, используя
только одну определенную линию адреса. Принтер ZX, нагтоимер, выбирается
линией А2. Командами этой группы являются:
Неавтоматические и автоматические команды :
В этих командах работа выполняется с ячейкой памяти, адресуемой по
(HL). Номер порта указывается в регистре С, а в регистре В организуется
счетчик. Алгоритм выполнения автоматической команды следующий (INIR):
1 (HL)=IN(C)
2 В=В-1
3 HL=HL+1
4 IF BOO GOTO 1
Неавтоматические команды требуют дополнительных команд для
выполнения аналогичного алгоритма, но позволяют проверять, например,
каждый введенный байт.
■ Груши 17. Комавды прерывания.
Имеется 7 команд, которые позволяют прерывать систему выполнения
команд Z80. Командами этой группы являются:
EI FB
DI F3
IM0 ED46
IMl ED56
IM2 ED 5е
RETI ED 5D
RETN ED45
Каждая из команд будет рассмотрена поочередно.
■ £1
При включении Z80 система маскированного прерывания не может
прервать выполнение команд. Эта ситуация существует до тех пор, пока
прерывания не будут разрешены программистом по команде EI. В
SPECTRUMe система маскированных прерываний используется для отсчета
текущего времени и опроса клавиатуры, и эти прерывания передаются с
синхронизирующей частотой 50 гц.
■ DI
В любом месте программы программист может запретить прерывания
по команде DI, которая не позволяет микропроцессору принимать сигналы
с линии INT. В SPECTRUMe маскируемое прерывание запрещено во время
выполнения команд SAVE, VERIFY, MERGE.
■ IMO
Имеется три типа прерывания. Режим 0 выбирается автоматически при
включении или по команде IM0. Этот режим позволяет периферийным
устройствам обмениваться информацией с микропроцессором, программа
перезапуска которого должна следовать за Приемом маскированного
прерывания на линии INT. Этот режим в SPECTRUMe не используется.
■ IM1
Режим прерывания 1 выполняется по команде IM1 при выполнении
программы ROM монитора. В других случаях необходимо'включить IM1 в
начало программы. В этом режиме перезапуск будет всегда выбираться с
адреса 0038h при приеме сигнала на линии INT, длительность которого
соответствует возможности обработки системы маскированного прерывания.
В SPECTRUMe программа в кодах с 0038h корректирует данные о текущем
времени и опрашивает клавиатуру.
■ IM2
Режим прерывания 2 не используется в SPECTRUMe, но является
самым мощным из трех режимов. В нем периферийное устройство может
указать микропроцессору, какая из 128 подпрограмм должна обрабатывать
маскированное прерывание. Содержимое регистра I и байта, который
поступает на внешнее устройство, используются вместе, чтобы образовать
16-битный адрес, который затем используется для выбора таблицы векторов,
размещенной заранее в памяти.
■ RETI
Это специальная команда возврата для использования с программой
маскированного прерывания. По этой команде происходит возврат с
сохранением маскированного прерывания; принятого раньше.
■ RETN
Эта команда подобна RETI, но она применима в конце программы
немаскированного прерывания.
■ Группа 18. Дополнительные команды.
Имеется 6 команд, которые рассмотрены ниже, а именно:
CPL 2F
NEG ED44
SCF 37
CCF 3F
HALT 76
DAA 27
Каждая из этих команд будет рассмотрена по очереди.
■ CPL
Представляет собой простую команду, которая инвертирует содержимое
регистра А, то есть она устанавливает сброшенный бит и сбрасывает
установленный. Основные флаги не изменяются.
■ NEG
Это команда дополнения до двух содержимого регистра А, то есть
выполняется преобразование А=-А. Эта команда влияет на основные
флаги. Флаги знака и 0 зависят от результата. Флаг переноса будет установлен,
если регистр А первоначально был 0.
■ SCF
Установка флага переноса
■ ССР
Инверсия флага переноса.
■ HALT
Это специальная команда, заставляющая мп останавливать выполнение
команд, пока не возникнет прерывание. В SPECTRUMe единственными
прерываниями могут бьпъ маскируемые прерывания. Следовательно, при
поступлении прерываний, команда HALT заканчивается. Команда "PAUSE"
использует это, чтобы подсчитать количество 1/50 долей секунды.
■ DAA
Это десятичная переупаковка содержимого регистра А в двоично-
десягичный код (BCD). Десятичные цифры от 0 до 9 представлены двоичными
тетрадами 0000-1001, а тетрады 1010-1111 не используются. Поэтому:
Байт 0000 0000 представляет число 0.
Байт 0011 1001 представляет число 39.
Эта команда превращает байты в двоично-десятичные числа (BCD).
Флаги 0 и знака зависят от результата. Флаг переполнения / четности
устанавливается. Флаг переноса зависит от того, было ли переполнение или
заем при операциях BCD.