Микропроцессор Z80 -основные характеристики

         

Разрядное деление


Вход: HL – делимое; A – делитель.

Выход: C – частное; H – остаток.

В процессе работы используются все регистры общего назначения.

DIV:  LD   BC,0800h  ; Счётчик разрядов в регистре B

      LD   H,C

      LD   E,H

      LD   D,A       ; Копия делителя

LOOP: ADD  HL,HL     ; Сдвиг делимого влево

      LD   A,H       ; Определение очередной цифры результата

      CP   D

      JR   C,NEXT

      SBC  HL,DE     ; Вычитание делителя из текущего остатка

NEXT: CCF            ; Формирование очередной цифры результата

      RL   C

      DJNZ LOOP      ; Цикл, пока не обработаны все разряды

      RET


[1] В этой и последующих командах данной группы, кроме LDIR и LDDR, флаг P/V сбрасывается, если после уменьшения BC становится равным нулю, и устанавливается в противном случае.

[2]


Каждый проход инструкций с автоматическим повторением выполняются за 21 такт, если условие повторения выполнено, и за 16 тактов в противном случае.

[3] Сравнение выполняется путём вычитания содержимого ячейки памяти (HL) из аккумулятора. Результат вычитания теряется, но на его основе формируются значения флажков.

[4] В этой и последующих инструкциях условного относительного перехода выполнение команды занимает 7 тактов, если условие перехода не соблюдается, и 12 тактов, если соблюдается.

[5] Инструкция DJNZ выполняется 8 тактов, если после декремента B=0 (переход не выполняется), и 13, тактов, если B?0 (переход выполняется).

[6] В командах условного вызова подпрограммы (CALL cc,nn) и условного возврата из подпрограммы (RET cc) меньшее количество тактов соответствует ситуации, когда условие не выполнено (переход не происходит), а большее количество тактов – ситуации, когда условие выполнено (переход происходит).

[7] В инструкциях IN A,(p) и OUT (p),A младший байт адреса порта содержится в коде команды (p), а старший – в аккумуляторе. В остальных инструкциях этой группы 16-разрядный адрес порта содержится в регистровой паре BC.

Инструкция IN r,(C) при коде r, равном 110, производит соответствующую прочитанному значению установку или сброс флажков, но само прочитанное значение не сохраняет. Действия инструкции OUT (C),r в такой же ситуации не определены.

В инструкциях INI, IND, OUTI и OUTD флажок Z устанавливается, если содержимое регистра B было обнулено, или сбрасывается, если в B получено ненулевое значение. По этой же причине в инструкциях INIR, INDR, OTIR и OTDR этот флажок всегда устанавливается.

Большая длительность инструкций INIR, INDR, OTIR и OTDR соответствует ситуации, когда содержимое регистра B отлично от нуля, т.е. когда выполнение инструкции продолжается; меньшая длительность – когда регистр B обнуляется, и выполнение инструкции прекращается.



Абсолютная адресация


Адрес операнда является частью кода команды и занимает два байта, расположенных в порядке “младший–старший”. Он может определять как ячейку памяти, содержащую операнд для инструкции обработки данных, так и адрес следующей команды в инструкции перехода.

Адрес перехода записывается в инструкции явным образом: JP 1234h, а адрес операнда заключается в круглые скобки: LD A,(1234h). В описании форматов кодов команд для обозначения абсолютного адреса используется запись aa.



Байтовые арифметико-логические операции


ADD A,r          ADD A,n

------T---¬      ---------¬ ----------¬

¦10000¦ r ¦      ¦11000110¦ ¦    n    ¦

L-----+----      L--------- L----------

ADD A,(HL)       ADD A,(IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10000110¦       ¦11011101¦ ¦10000110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

ADD A,(IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10000110¦ ¦    d    ¦

L--------- L--------- L----------

ADC A,r          ADC A,n

------T---¬      ---------¬ ----------¬

¦10001¦ r ¦      ¦11001110¦ ¦    n    ¦

L-----+----      L--------- L----------

ADC A,(HL)       ADC A,(IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10001110¦       ¦11011101¦ ¦10001110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

ADC A,(IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10001110¦ ¦    d    ¦

L--------- L--------- L----------

SUB r            SUB n

------T---¬      ---------¬ ----------¬

¦10010¦ r ¦      ¦11010110¦ ¦    n    ¦

L-----+----      L--------- L----------

SUB (HL)         SUB (IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10010110¦       ¦11011101¦ ¦10010110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

SUB (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10010110¦ ¦    d    ¦

L--------- L--------- L----------

SBC A,r          SBC A,n

------T---¬      ---------¬ ----------¬

¦10011¦ r ¦      ¦11011110¦ ¦    n    ¦

L-----+----      L--------- L----------

SBC A,(HL)       SBC A,(IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10011110¦       ¦11011101¦ ¦10011110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

SBC A,(IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10011110¦ ¦    d    ¦

L--------- L--------- L----------

AND r            AND n

------T---¬      ---------¬ ----------¬

¦10100¦ r ¦      ¦11100110¦ ¦    n    ¦


L-----+----      L--------- L----------

AND (HL)         AND (IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10100110¦       ¦11011101¦ ¦10100110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

AND (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10100110¦ ¦    d    ¦

L--------- L--------- L----------

OR r             OR n

------T---¬      ---------¬ ----------¬

¦10101¦ r ¦      ¦11101110¦ ¦    n    ¦

L-----+----      L--------- L----------

OR (HL)          OR (IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10101110¦       ¦11011101¦ ¦10101110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

OR (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10101110¦ ¦    d    ¦

L--------- L--------- L----------

XOR r            XOR n

------T---¬      ---------¬ ----------¬

¦10110¦ r ¦      ¦11110110¦ ¦    n    ¦

L-----+----      L--------- L----------

XOR (HL)         XOR (IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10110110¦       ¦11011101¦ ¦10110110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

XOR (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10110110¦ ¦    d    ¦

L--------- L--------- L----------

CP r             CP n

------T---¬      ---------¬ ----------¬

¦10111¦ r ¦      ¦11111110¦ ¦    n    ¦

L-----+----      L--------- L----------

CP (HL)          CP (IX+d)

---------¬       ---------¬ ---------¬ ----------¬

¦10111110¦       ¦11011101¦ ¦10111110¦ ¦    d    ¦

L---------       L--------- L--------- L----------

CP (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦10111110¦ ¦    d    ¦

L--------- L--------- L----------

INC r             INC (HL)

---T---T---¬      ---------¬

¦00¦ r ¦100¦      ¦00110100¦

L--+---+----      L---------

INC (IX+d)

---------¬ ---------¬ ----------¬

¦11011101¦ ¦00110100¦ ¦    d    ¦

L--------- L--------- L----------



INC (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦00110100¦ ¦    d    ¦

L--------- L--------- L----------

DEC r             DEC (HL)

---T---T---¬      ---------¬

¦00¦ r ¦101¦      ¦00110101¦

L--+---+----      L---------

DEC (IX+d)

---------¬ ---------¬ ----------¬

¦11011101¦ ¦00110101¦ ¦    d    ¦

L--------- L--------- L----------

DEC (IY+d)

---------¬ ---------¬ ----------¬

¦11111101¦ ¦00110101¦ ¦    d    ¦

L--------- L--------- L----------

DAA           CPL           NEG

---------¬    ---------¬    ---------¬ ---------¬

¦00100111¦    ¦00101111¦    ¦11101101¦ ¦01000100¦

L---------    L---------    L--------- L---------

Инструкция DAA используется для десятичной коррекции результата сложения или вычитания двоично-десятичных чисел с помощью инструкций ADD, ADC, INC, SUB, SBC и DEC. Состояние флажка N определяет, какая именно операция (сложение или вычитание) выполнялась перед командой DAA; при выполнении коррекции анализируется состояние флажков C и H, а также содержимое аккумулятора. После выполнения инструкции DAA аккумулятор будет содержать правильное двоично-кодированное десятичное значение. Значение флажка N не изменяется, остальные флажки устанавливаются или сбрасываются в соответствии с результатом операции (флажок P/V является признаком чётности).

Инструкция CPL инвертирует содержимое аккумулятора. Флажки H и N устанавливаются, состояние остальных флажков не изменяется.

Инструкция NEG меняет знак числа, содержащегося в аккумуляторе. Флажок N устанавливается, остальные флажки устанавливаются или сбрасываются в соответствии с результатом выполнения операции (флажок P/V является признаком переполнения).

Инструкции инкремента и декремента (INC и DEC) соответственно увеличивают или уменьшают на единицу значение своего операнда. Операндом этих инструкций может быть аккумулятор, любой из регистров общего назначения или байт памяти, адресуемый регистровой парой HL или суммой одного из индексных регистров и 8-разрядного смещения.


Состояние флажка C этими инструкциями не изменяется; флажок N сбрасывается при инкременте и устанавливается при декременте; остальные флажки (S, Z, H и P/V) устанавливаются или сбрасываются в соответствии с результатом выполнения операции, флажок P/V при этом служит признаком переполнения.

Остальные инструкции (ADD, ADC, SUB, SBC, AND, OR, XOR и CP) работают с двумя операндами. Первый из них задан неявно – это содержимое аккумулятора. Вторым операндом может быть содержимое аккумулятора или любого из регистров общего назначения, 8-разрядная константа, входящая в состав кода команды, или байт памяти, адресуемый регистровой парой HL или суммой одного из индексных регистров и 8-разрядного смещения. Результат выполнения операции всегда помещается в аккумулятор (инструкция CP не запоминает результат, поэтому в ней содержимое аккумулятора остаётся неизменным). Заметим, что в мнемониках инструкций ADD, ADC и SBC указываются оба операнда, в то время как в остальных пяти двухадресных инструкциях – только второй операнд (аккумулятор подразумевается). Это связано с тем, что в группу двухбайтовых арифметических операций также входят инструкции ADD, ADC и SBC.

Инструкции ADD и ADC выполняют сложение операндов (к аккумулятору прибавляется значение явно заданного операнда). Они отличаются тем, что инструкция ADC дополнительно производит добавление переноса (флажка C), что позволяет организовать сложение чисел с разрядностью, превышающей 8 битов.

Инструкции SUB и SBC выполняют вычитание операндов (из аккумулятора вычитается значение явно заданного операнда. Инструкция SBC дополнительно вычитает значение флажка переноса C.

Инструкции AND, OR и XOR выполняют соответственно операции “И”, “ИЛИ” и “Исключающее ИЛИ” между содержимым аккумулятора и явно заданного операнда.

Инструкция CP выполняет сравнение аккумулятора и явно заданного операнда. Сравнение выполняется путём вычитания значения явно заданного операнда из содержимого аккумулятора. Полученный результат теряется, но производится установка или сброс флажков, отражающих результат операции.

Инструкции ADD, ADC, SUB, SBC и CP оказывают влияние на все флажки, при этом флажок P/V является признаком переполнения, а флажок N сбрасывается в операциях сложения (ADD и ADC) и устанавливается в операциях вычитания (SUB, SBC и CP).

Инструкции AND, OR и XOR также оказывают влияние на все флажки, при этом флажки N и C сбрасываются, флажок H устанавливается, флажок P/V является признаком чётности результата.


Битовая адресация


Этот вид адресации применяется в инструкциях, работающих с отдельными битами. Байт, содержащий обрабатываемый бит, определяется регистровой, косвенной (через регистровую пару HL) или индексной адресацией. Номер обрабатываемого разряда указывается тремя битами, содержащимися в последнем байте кода команды.

В битовых инструкциях всегда присутствует два операнда. Первый из них определяет номер обрабатываемого разряда и задаётся числом от 0 до 7, преобразуемым транслятором языка ассемблера в трёхразрядный двоичный код; в описании форматов кодов команд он обозначается b. Второй операнд определяет регистр или ячейку памяти, над одним из битов которой выполняется операция, и записывается с использованием регистровой, косвенной (с регистровой парой HL) или индексной адресации: BIT3,(IY-7).



Битовые операции


BIT b,r                    BIT b,(HL)

---------¬ ---T---T---¬    ---------¬ ---T---T---¬

¦11001011¦ ¦01¦ b ¦ r ¦    ¦11001011¦ ¦01¦ b ¦110¦

L--------- L--+---+----    L--------- L--+---+----

BIT b,(IX+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦01¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

BIT b,(IY+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦01¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

SET b,r                    SET b,(HL)

---------¬ ---T---T---¬    ---------¬ ---T---T---¬

¦11001011¦ ¦11¦ b ¦ r ¦    ¦11001011¦ ¦11¦ b ¦110¦

L--------- L--+---+----    L--------- L--+---+----

SET b,(IX+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦11¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

SET b,(IY+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦11¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

RES b,r                    RES b,(HL)

---------¬ ---T---T---¬    ---------¬ ---T---T---¬

¦11001011¦ ¦10¦ b ¦ r ¦    ¦11001011¦ ¦10¦ b ¦110¦

L--------- L--+---+----    L--------- L--+---+----

RES b,(IX+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦10¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

RES b,(IY+d)

---------¬ ---------¬ --------¬ ---T---T---¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦10¦ b ¦110¦

L--------- L--------- L-------- L--+---+----

Инструкция BIT проверяет значение указанного полем b разряда своего второго операнда – аккумулятора, регистра общего назначения или ячейки памяти, адресуемой содержимым регистровой пары HL или суммой значения одного из индексных регистров и 8-разрядного смещения, входящего в состав кода команды. Проверка заключается в том, что инверсное значение проверяемого разряда заносится во флажок Z, где в дальнейшем может быть проанализировано одной из инструкций условного перехода. Флажок C этой инструкцией не изменяется, флажок N сбрасывается, флажок H устанавливается. Значение флажков S и P/V непредсказуемо.

Инструкции SET и RES соответственно устанавливают или сбрасывают указанный разряд своего второго операнда. В отличие от инструкции BIT, они не оказывают влияния на флажки.



Двухбайтовые арифметические операции


ADD HL,rr      ADC HL,rr                 SBC HL,rr

---T--T----¬   ---------¬ ---T--T----¬   ---------¬ ---T--T----¬

¦00¦rr¦1001¦   ¦11101101¦ ¦01¦rr¦1010¦   ¦11101101¦ ¦01¦rr¦0010¦

L--+--+-----   L--------- L--+--+-----   L--------- L--+--+-----

ADD IX,rr                 ADD IY,rr

---------¬ ---T--T----¬   ---------¬ ---T--T----¬

¦11011101¦ ¦01¦rr¦1001¦   ¦11111101¦ ¦01¦rr¦1001¦

L--------- L--+--+-----   L--------- L--+--+-----

INC rr         INC IX                  INC IY

---T--T----¬   ---------¬ ---------¬   ---------¬ ---------¬

¦00¦rr¦0011¦   ¦11011101¦ ¦00100011¦   ¦11111101¦ ¦00100011¦

L--+--+-----   L--------- L---------   L--------- L---------

DEC rr         DEC IX                  DEC IY

---T--T----¬   ---------¬ ---------¬   ---------¬ ---------¬

¦00¦rr¦1011¦   ¦11011101¦ ¦00101011¦   ¦11111101¦ ¦00101011¦

L--+--+-----   L--------- L---------   L--------- L---------

В эту группу входят инструкции, обеспечивающие сложение и вычитание 16-разрядных величин. Особенностью большинства из них по сравнению с 8-разрядными арифметическими операциями является то, что эти команды не оказывают влияния на состояние флажков. Это связано с тем, что они предназначены в первую очередь для ускорения обработки адресной информации, а не обычных данных.

Инструкции инкремента и декремента INC и DEC соответственно увеличивают или уменьшают на единицу содержимое регистровых пар BC, DE, HL или двухбайтовых регистров SP, IX, IY; никакие флажки при этом не изменяются.

Инструкция ADD HL,rr прибавляет к содержимому регистровой пары HL значение одной из регистровых пар BC, DE, HL или регистра SP. По окончании выполнения этой команды значение флажка H непредсказуемо, флажок N сбрасывается, а флажок C устанавливается или сбрасывается в зависимости от наличия или отсутствия переноса из старшего (15-го) разряда результата.

Инструкции ADC HL,rr и SBC HL,rr обеспечивают соответственно добавление или вычитание значения регистровой пары BC, DE или HL либо регистра SP к/из содержимого регистровой пары HL. Значение флажка H непредсказуемо; флажок N устанавливается при выполнении инструкции SBC и сбрасывается при выполнении инструкции ADC; остальные флажки устанавливаются или сбрасываются в соответствии с полученным результатом, при этом флажок P/V используется для индикации переполнения. Таким образом, эти две команды влияют на флажки подобно аналогичным 8-разрядным инструкциям.

Инструкции ADD IX,rr и ADD IY,rr обеспечивают добавление к содержимому указанного индексного регистра значения регистровой пары BC или DE, либо того же самого индексного регистра (IX или IY), либо регистра SP. Значение флажка H непредсказуемо; флажок N сбрасывается; флажок C устанавливается или сбрасывается в зависимости от наличия переноса из старшего разряда результата.



Флаги управления прерываниями


В микропроцессоре имеются две пары флагов (IFF1, IFF2 и IMFa, IMFb), управляющих системой прерываний.

Флаг IFF1, когда установлен, разрешает маскируемые прерывания, а когда сброшен – запрещает их. Он сбрасывается при сбросе процессора, при возникновении немаскируемого прерывания и при выполнении инструкции запрещения прерываний DI, а устанавливается при выполнении инструкции разрешения прерываний EI. Кроме того, при выполнении инструкции возврата из немаскируемого прерывания RETN в него заносится состояние флага IFF2.

Когда происходит немаскируемое прерывание, состояние флага IFF1 копируется во флаг IFF2, а когда выполняется инструкция возврата из немаскируемого прерывания RETN, выполняется обратное копирование. Флаг IFF2 сбрасывается сбросом процессора и выполнением инструкции DI, а устанавливается инструкцией EI. При выполнении инструкций LD A,I и LD A,R  его состояние заносится во флаг чётности P/V регистра флагов F.

Флаги IMFa и IMFb совместно определяют режим обработки маскируемых прерываний. Комбинации их состояний имеют следующий смысл:

– 00 – режим совместимости с процессором 8080 (режим 0);

– 01 – не используется;

– 10 – режим единственного вектора (режим 1);

– 11 – режим векторов, предоставляемых устройствами (режим 2).



Индексная адресация


Операнд располагается в памяти. Его адрес определяется сложением содержимого указанного индексного регистра (IX или IY) и 8-разрядного смещения в дополнительном коде, являющегося частью кода команды.

Используемый индексный регистр определяется первым байтом кода команды: значение 0DDh соответствует регистру IX, а значение 0FDh – регистру IY. Второй байт является кодом операции. Смещение занимает третий байт кода команды.

На языке ассемблера индексная адресация обозначается суммой индексного регистра и смещения, заключённой в круглые скобки: LD B,(IX+10h). В описании форматов кодов команд для смещения, используемого в относительной (см. выше) и индексной  адресации, применяется обозначение d.



Индексные регистры


Два 16-разрядных индексных регистра IX и IY используются в некоторых инструкциях для адресации операндов в памяти. Адрес ячейки памяти вычисляется путём сложения содержимого индексного регистра с 8-разрядной константой d, являющейся частью кода команды. Первоначальное содержимое индексного регистра при этом не изменяется.



Косвенная адресация


Операнд находится в ячейке памяти, адрес которой содержится в одной из регистровых пар BC, DE или HL. Почти во всех случаях адрес может находиться только в регистровой паре HL, причём по формату команда с косвенной адресацией по этой регистровой паре не отличается от команды с регистровой адресацией (на языке ассемблера микропроцессора 8080 такой операнд даже обозначался как “регистр” M). Содержимое регистровых пар BC и DE может использоваться в качестве адресов только в нескольких инструкциях.

Косвенная адресация может использоваться также в инструкции безусловного перехода JP. В этом случае адрес перехода содержится либо в регистровой паре HL, либо в одном из индексных регистров IX или IY.

Факт использования косвенной адресации отражается в коде операции, а не кодируется какими-либо отдельными разрядами. На языке ассемблера имя регистра или регистровой пары, содержащей адрес, заключается в круглые скобки: LD A,(HL).



Маскируемые прерывания


Запросы маскируемых прерываний поступают в микропроцессор по линии INT#. Распознавание маскируемых прерываний разрешается установкой флага IFF1. Когда этот флаг сброшен, маскируемые прерывания запрещены.

Микропроцессор Z80 поддерживает три режима обработки маскируемых прерываний. Выбор режима осуществляется соответствующей установкой флагов IMFa и IMFb.

Режим 0 соответствует механизму обработки прерываний микропроцессора 8080 и предназначен главным образом для сохранения совместимости с изделием фирмы Intel. Однако инженеры фирмы Zilog не до конца продумали этот режим, в результате чего полной совместимости можно добиться только с помощью дополнительных внешних схем. Суть проблемы заключается в следующем.

Микропроцессор 8080 обрабатывает прерывание, получая у контроллера прерывания полный код команды, которая должна быть выполнена. В принципе может использоваться любая инструкция микропроцессора, но практическую ценность имеют лишь инструкции вызова подпрограммы CALL (трёхбайтовая; код операции – 0CDh) и RST 0–7 (однобайтовые; двоичный код операции 11nnn111, где nnn – номер, стоящий после мнемоники RST). В результате выполнения любой из этих инструкций адрес следующей команды (т.е. команды, которая выполнилась бы следующей, если бы не произошло прерывание) сохраняется в стеке, а в счётчик команд PC заносится адрес первой инструкции обработчика прерывания (этот адрес содержится во втором и третьем байтах инструкции CALL или является фиксированным для инструкций RST 0–7 – от 0000h до 0038h с шагом 0008h). Чтобы получить у контроллера код инструкции перехода к обработчику прерывания, микропроцессор 8080 в ответ на запрос прерывания выдаёт необходимое количество раз сигнал подтверждения прерывания. В ответ на первый сигнал подтверждения контроллер выдаёт байт кода операции. Расшифровав его, микропроцессор определяет, требуется ли получить дополнительные байты кода команды, а значит, нужно ли выдать дополнительные сигналы подтверждения. Таким образом, для инструкции CALL сигнал подтверждения прерывания будет выдан трижды, а для любой из инструкций RST – лишь один раз.


Микропроцессор Z80 не имеет специального выхода подтверждения прерывания. Вместо этого в режиме 0 он выполняет специальный цикл чтения кода операции, выдавая одновременно сигналы M1# (признак чтения первого байта кода команды) и IORQ# (признак обращения в пространство ввода-вывода) вместо сигналов M1# и MREQ# (признак обращения в пространство памяти), используемых при обычной выборке кода операции из памяти. Из сигналов M1# и IORQ# с помощью простейшей схемы можно получить сигнал подтверждения прерывания в стиле микропроцессора 8080, однако вырабатываться он будет только для первого байта кода команды. Таким образом, использовать для перехода к обработчику прерывания инструкции RST 0–7 можно, а инструкцию CALL – нельзя, поскольку она состоит из трёх байтов и требует выдачи трёх сигналов подтверждения прерывания. Однако именно инструкция CALL используется для перехода к обработчику прерывания в большинстве систем на базе микропроцессора 8080, поскольку её код выдаётся контроллером прерываний 8259 фирмы Intel (советский аналог – КР580ВН59). Чтобы добиться совместимости с этим или аналогичным контроллером, приходится применять дополнительные схемы, “отлавливающие” факт подтверждения прерывания по сигналам M1# и IORQ# и выдающие дополнительные сигналы подтверждения прерывания для инструкции CALL.

Режим 1 используется в маленьких вычислительных системах, где достаточно одного-единственного вектора маскируемого прерывания. При поступлении запроса прерывания микропроцессор сохраняет адрес возврата в прерванную программу в стеке и осуществляет переход на адрес 0038h. Таким образом, в этом режиме маскируемые прерывания обрабатываются точно тем же способом, что и немаскируемые. Разница заключается в возможности их маскирования и в адресе обработчика прерываний.

Следует заметить, что подобный режим обслуживания прерываний был возможен и в микропроцессоре 8080 при его использовании совместно с системным контроллером 8228 или 8238 (КР580ВК28 или КР580ВК38). Правда, в отличие от Z80, здесь такой режим реализовывался чисто аппаратным путём, и перепрограммировать его было невозможно.

Режим 2 является основным режимом обслуживания маскируемых прерываний, реализующим все потенциальные возможности микропроцессора Z80. Используя его, можно определить до 128 различных векторов прерываний.

Как и в режиме 0, микропроцессор подтверждает прерывание выдачей сигналов M1# и IORQ#. Устройство, запросившее прерывание, отвечает выдачей на шину данных своего вектора. Процессор, получив вектор, использует его в качестве младшего байта адреса элемента таблицы прерываний; в качестве старшего байта используется содержимое регистра I. Затем он сохраняет в стеке адрес возврата к прерванной программе, выбирает из таблицы прерываний двухбайтовый адрес обработчика и передаёт ему управление.

Поскольку адрес обработчика занимает два байта, вектор прерывания, выдаваемый устройством, должен иметь нулевой младший разряд.


Методы адресации


Байтовые операнды арифметико-логических команд могут находится в аккумуляторе, регистрах общего назначения B, C, D, E, H, L, непосредственно в коде команды и в ячейках памяти.

Двухбайтовые операнды (слова) могут располагаться в регистровых парах BC, DE и HL, 16-разрядных регистрах SP, IX и IY, непосредственно в коде команды в смежных ячейках памяти. В памяти байты слов хранятся в порядке “младший–старший”, традиционном для большинства вычислительных систем. Разновидностью двухбайтовых операндов можно считать содержимое регистровой пары AF (аккумулятор и регистр флагов) и операнд в стеке.

Адреса переходов в инструкциях передачи управления могут содержаться в самой команде (абсолютная адресация), в регистровой паре HL или регистрах IX, IY (косвенная адресация) или вычисляться с помощью 8-разрядного смещения и адреса следующей инструкции (относительная адресация). В операциях возврата из подпрограммы и прерывания адрес возврата выбирается из вершины стека.



Модифицированная нуль-страничная адресация


Специфический вид адресации, используемый в командах рестарта RST. Эти команды осуществляют переход на одну из восьми подпрограмм с фиксированными адресами (от 0000h до 0038h с интервалом 8). Номер подпрограммы задаётся тремя разрядами кода операции.

При записи на языке ассемблера в качестве операнда указывается значение младших восьми разрядов адреса перехода, которые транслятор языка ассемблера переводит в трёхразрядный двоичный код, соответствующий данному адресу: RST 10h. В описании формата кода команды для обозначения этого операнда используется буква x.



Назначение выводов


Микропроцессор Z80 выпускался в 40-выводном DIP-корпусе, наиболее распространённом для восьмиразрядных микропроцессоров. В отличие от микропроцессора 8080 фирмы Intel, Z80 для своей работы не требует специфических дополнительных схем (двухфазного тактового генератора и системного контроллера), что значительно упрощает конструкцию процессорного модуля. Кроме того, для работы Z80 требует единственное напряжение питания +5 В вместо трёх напряжений для 8080 (+5, –5 и +12 В).



Неявная адресация


Местоположение операнда неявно определяется кодом операции. Например, во всех двухадресных байтовых арифметико-логических операциях один из операндов находится в аккумуляторе, а в операциях PUSH и POP одним из операндов является слово в вершине стека.

Операнд, адресуемый неявно, на языке ассемблера в некоторых инструкциях записывается явным образом (например, инструкция LD A,R, оба операнда которой используют неявную адресацию), а в некоторых не указывается вообще (например, в инструкции LDI, неявно использующей все три регистровые пары).



Немаскируемые прерывания


Запросы немаскируемых прерываний поступают в микропроцессор по линии NMI#. Программно они запрещены быть не могут.

При поступлении запроса немаскируемого прерывания микропроцессор сохраняет адрес возврата в прерванную программу в стеке и передаёт управление на инструкцию по адресу 0066h. Кроме того, состояние флага IFF1 копируется во флаг IFF2, а флаг IFF1 обнуляется, что приводит к запрещению маскируемых прерываний.



Непосредственная адресация


Операнд является частью кода команды и состоит из одного или двух байтов, следующих непосредственно за байтом кода операции. Байты 16-разрядного операнда хранятся в памяти в порядке “младший–старший”.

Операнд непосредственно записывается в мнемонике инструкции, например LDA,10h. В описании форматов кодов команд для непосредственного операнда используется обозначение n или nn (соответственно 8- и 16-разрядный операнд).



Операции байтовой пересылки данных


LD r1,r2           LD r,n

---T---T---¬      ---T---T---¬ ----------¬

¦01¦ r1¦ r2¦      ¦00¦ r ¦110¦ ¦    n    ¦

L--+---+----      L--+---+---- L----------

LD r,(HL)         LD r,(IX+d)

---T---T---¬      ---------¬ ---T---T---¬ ----------¬

¦01¦ r ¦110¦      ¦11011101¦ ¦01¦ r ¦110¦ ¦    d    ¦

L--+---+----      L--------- L--+---+---- L----------

LD r,(IY+d)

---------¬ ---T---T---¬ ----------¬

¦11111101¦ ¦01¦ r ¦110¦ ¦    d    ¦

L--------- L--+---+---- L----------

LD (HL),r         LD (IX+d),r

---T---T---¬      ---------¬ ---T---T---¬ ----------¬

¦01¦110¦ r ¦      ¦11011101¦ ¦01¦110¦ r ¦ ¦    d    ¦

L--+---+----      L--------- L--+---+---- L----------

LD (IY+d),r                            LD (HL),n

---------¬ ---T---T---¬ ----------¬    ---T---T---¬ ----------¬

¦11111101¦ ¦01¦110¦ r ¦ ¦    d    ¦    ¦00¦110¦110¦ ¦    n    ¦

L--------- L--+---+---- L----------    L--+---+---- L----------

LD (IX+d),n

---------¬ ---T---T---¬ ----------¬ ----------¬

¦11011101¦ ¦00¦110¦110¦ ¦    d    ¦ ¦    n    ¦

L--------- L--+---+---- L---------- L----------

LD (IY+d),n

---------¬ ---T---T---¬ ----------¬ ----------¬

¦11111101¦ ¦00¦110¦110¦ ¦    d    ¦ ¦    n    ¦

L--------- L--+---+---- L---------- L----------

LD A,(BC)      LD A,(DE)      LD A,(aa)

---------¬     ---------¬     ---------¬ ----------¬ ----------¬

¦00001010¦     ¦00011010¦     ¦00111010¦ ¦    a    ¦ ¦    a    ¦

L---------     L---------     L--------- L---------- L----------

LD (BC),A      LD (DE),A      LD (aa),A

---------¬     ---------¬     ---------¬ ----------¬ ----------¬

¦00000010¦     ¦00010010¦     ¦00110010¦ ¦    a    ¦ ¦    a    ¦

L---------     L---------     L--------- L---------- L----------

LD A,I                        LD A,R

---------¬ ---------¬         ---------¬ ---------¬

¦11101101¦ ¦01010111¦         ¦11101101¦ ¦01011111¦

L--------- L---------         L--------- L---------

LD I,A                        LD R,A


---------¬ ---------¬         ---------¬ ---------¬

¦11101101¦ ¦01000111¦         ¦11101101¦ ¦01001111¦

L--------- L---------         L--------- L---------

Все перечисленные инструкции пересылают один байт информации из источника (второй операнд) в приёмник (первый операнд). Все они, за исключением LD A,I и LD A,R, не оказывают влияния на состояние флажков регистра F.

Инструкции LD A,I и LD A,R изменяют состояние флажков S и Z в соответствии с пересланным значением. Флажки H и N при их выполнении обнуляются, а во флажок P/V заносится текущее состояние флага управления прерываниями IFF2, т.е. указывает, запрещены или разрешены в данный момент маскируемые прерывания.

Особых комментариев большинство инструкций не требует. Заметим лишь, что при обращении к памяти адрес ячейки заключается в круглые скобки независимо от вида адресации: LD A,(aa) – прямая адресация; LD A,(BC) – косвенная адресация; LD A,(IX+d) – индексная адресация.


Операции двухбайтовой пересылки данных


LD rr,nn

---T--T----¬ ----------¬ ----------¬

¦00¦rr¦0001¦ ¦    n    ¦ ¦    n    ¦

L--+--+----- L---------- L----------

LD IX,nn

---------¬ ---------¬ ----------¬ ----------¬

¦11011101¦ ¦00100001¦ ¦    n    ¦ ¦    n    ¦

L--------- L--------- L---------- L----------

LD IY,nn

---------¬ ---------¬ ----------¬ ----------¬

¦11111101¦ ¦00100001¦ ¦    n    ¦ ¦    n    ¦

L--------- L--------- L---------- L----------

LD HL,(aa)

---------¬ ----------¬ ----------¬

¦00101010¦ ¦    a    ¦ ¦    a    ¦

L--------- L---------- L----------

LD rr,(aa)

---------¬ ---T--T----¬ ----------¬ ----------¬

¦11101101¦ ¦01¦rr¦1011¦ ¦    a    ¦ ¦    a    ¦

L--------- L--+--+----- L---------- L----------

LD IX,(aa)

---------¬ ---------¬ ----------¬ ----------¬

¦11011101¦ ¦00101010¦ ¦    a    ¦ ¦    a    ¦

L--------- L--------- L---------- L----------

LD IY,(aa)

---------¬ ---------¬ ----------¬ ----------¬

¦11111101¦ ¦00101010¦ ¦    a    ¦ ¦    a    ¦

L--------- L--------- L---------- L----------

LD (aa),HL

---------¬ ----------¬ ----------¬

¦00100010¦ ¦    a    ¦ ¦    a    ¦

L--------- L---------- L----------

LD (aa),rr

---------¬ ---T--T----¬ ----------¬ ----------¬

¦11101101¦ ¦01¦rr¦0011¦ ¦    a    ¦ ¦    a    ¦

L--------- L--+--+----- L---------- L----------

LD (aa),IX

---------¬ ---------¬ ----------¬ ----------¬

¦11011101¦ ¦00100010¦ ¦    a    ¦ ¦    a    ¦

L--------- L--------- L---------- L----------

LD (aa),IY

---------¬ ---------¬ ----------¬ ----------¬

¦11111101¦ ¦00100010¦ ¦    a    ¦ ¦    a    ¦

L--------- L--------- L---------- L----------

LD SP,HL        LD SP,IX                 LD SP,IY

---------¬      ---------¬ ---------¬    ---------¬ ---------¬

¦11111001¦      ¦11011101¦ ¦11111001¦    ¦11111101¦ ¦11111001¦

L---------      L--------- L---------    L--------- L---------

PUSH rr         PUSH IX                  PUSH IY

---T--T----¬    ---------¬ ---------¬    ---------¬ ---------¬


¦11¦rr¦0101¦    ¦11011101¦ ¦11100101¦    ¦11111101¦ ¦11100101¦

L--+--+-----    L--------- L---------    L--------- L---------

POP rr          POP IX                   POP IY

---T--T----¬    ---------¬ ---------¬    ---------¬ ---------¬

¦11¦rr¦0001¦    ¦11011101¦ ¦11100001¦    ¦11111101¦ ¦11100001¦

L--+--+-----    L--------- L---------    L--------- L---------

Все инструкции этой группы пересылают 16-разрядную величину в или из двухбайтового регистра или регистровой пары. Обеспечивается загрузка регистра или регистровой пары непосредственным значением или содержимым двухбайтовой области памяти (байты операнда хранятся в порядке “младший–старший”), а также запись содержимого регистра или регистровой пары в двухбайтовую область памяти. Имеются также инструкции, пересылающие содержимое регистровой пары HL или регистров IX и IY в регистр указателя стека SP.

В инструкциях LD rr,nn, LD rr,(aa) и LD (aa),rr используются определяемые с помощью регистровой адресации регистровые пары BC, DE, HL или регистр SP. В других инструкциях с мнемоникой LD применяется неявная адресация используемых регистров или регистровых пар.

Заметим, что для команд LD HL,(aa) и LD (aa),HL имеются по два возможных формата команды: трёх- и четырёхбайтовый. Транслятор языка ассемблера всегда сгенерирует более короткий трёхбайтовый вариант; при необходимости четырёхбайтовый вариант в программе можно построить вручную. Наличие двух форматов для по существу одной и той же инструкции объясняется тем, что трёхбайтовый формат (оперирующий только с регистровой парой HL) присутствовал в системе команд микропроцессора Intel 8080, а четырёхбайтовый формат (оперирующий с регистром SP и регистровыми парами BC, DE и HL) был введён в микропроцессоре Zilog Z80.

Инструкции PUSH и POP обеспечивают соответственно занесение содержимого регистровой пары в стек и загрузки его оттуда. Адрес вершины стека находится в регистре SP. При записи байта в стек содержимое SP уменьшается на единицу, после чего производится запись; при выборке байта из стека сначала читается содержимое байта по адресу, находящемуся в SP, а затем значение SP увеличивается на единицу.Поскольку микропроцессор Z80 всегда записывает или извлекает из стека по два байта информации, в результате выполнения любой операции со стеком содержимое SP увеличивается или уменьшается на 2.

Инструкции PUSH и POP используют регистровую адресацию, чтобы определить регистровую пару, которая участвует в операции. Помимо “традиционных” регистровых пар BC, DE и HL, в операции может участвовать регистровая пара AF. Старшим её байтом является содержимое регистра-аккумулятора, младшим – содержимое регистра флагов F.

Все инструкции этой группы, за исключением POP AF, не изменяют состояние флажков. Команда POP AF полностью загружает содержимое регистра флагов из стека.


Операции обмена


EX DE,HL      EX AF,AF’     EXX           EX (SP),HL

---------¬    ---------¬    ---------¬    ---------¬

¦11101011¦    ¦00001000¦    ¦11011001¦    ¦11100011¦

L---------    L---------    L---------    L---------

EX (SP),IX                  EX (SP),IY

---------¬ ---------¬       ---------¬ ---------¬

¦11011101¦ ¦11100011¦       ¦11111101¦ ¦11100011¦

L--------- L---------       L--------- L---------

Инструкция EX DE,HL меняет местами содержимое регистровых пар DE и HL. Инструкции EX (SP),HL, EX (SP),IX и EX (SP),IY меняют местами содержимое двух байтов, расположенных в вершине стека (младший – по адресу в регистре SP, старший – следующий за ним в сторону увеличения адресов), и значение регистровой пары HL и регистров IX и IY соответственно.

Инструкции EX AF,AF’ и EXX производят переключение используемых блоков регистров. Первая инструкция переключает аккумулятор и регистр флагов, вторая – регистры общего назначения. С точки зрения программиста это выглядит так, будто содержимое основного и дополнительного блоков регистров меняется местами.

Все инструкции этой группы, кроме EX AF,AF’, не изменяют состояние флажков. Инструкция EX AF,AF’ активизирует регистр F, относящийся к другому блоку регистров, что выглядит как изменение состояния флажков.



Операции обработки блоков данных


LDI                         LDIR

---------¬ ---------¬       ---------¬ ---------¬

¦11101101¦ ¦10100000¦       ¦11101101¦ ¦10110000¦

L--------- L---------       L--------- L---------

LDD                         LDDR

---------¬ ---------¬       ---------¬ ---------¬

¦11101101¦ ¦10101000¦       ¦11101101¦ ¦10111000¦

L--------- L---------       L--------- L---------

CPI                         CPIR

---------¬ ---------¬       ---------¬ ---------¬

¦11101101¦ ¦10100001¦       ¦11101101¦ ¦10110001¦

L--------- L---------       L--------- L---------

CPD                         CPDR

---------¬ ---------¬       ---------¬ ---------¬

¦11101101¦ ¦10101001¦       ¦11101101¦ ¦10111001¦

L--------- L---------       L--------- L---------

Инструкции этой группы предназначены для обработки блоков данных переменной длины, располагающихся в памяти.

В регистровой паре DE располагается адрес одного из операндов, в регистровой паре HL – второго операнда. Если операнд переменной длины один (в командах сравнения CPI, CPIR, CPD и CPDR), его адрес располагается в регистровой паре HL. Регистровая пара BC содержит счётчик байтов.

После обработки каждого байта операндов их адреса в регистровых парах DE и HL (или только HL) изменяются на единицу: увеличиваются для инструкций, содержащих в своей мнемонике букву I (LDI, LDIR, CPI, CPIR), и уменьшаются для инструкций, содержащих в мнемонике букву D (LDD, LDDR, CPD, CPDR). Содержимое счётчика в регистровой паре BC уменьшается на единицу.

Инструкции, мнемоники которых заканчиваются на R (LDIR, LDDR, CPIR и CPDR), обеспечивают автоматическое повторение операции. Выполнение этих инструкций заканчивается, когда счётчик в регистровой паре BC принимает нулевое значение. Кроме того, инструкции сравнения CPIR и CPDR завершаются, если содержимое аккумулятора совпало с содержимым байта памяти, адресуемого регистровой парой HL.

Инструкции с мнемоникой без завершающей буквы R (LDI, LDD, CPI и CPD) обрабатывают только один байт.


Инструкции, мнемоники которых начинаются с букв LD (LDI, LDIR, LDD и LDDR), осуществляют пересылку байтов из поля второго операнда, адресуемого регистровой парой HL, в поле первого операнда, адресуемого регистровой парой DE. При их выполнении флажки S, Z и C не изменяются, флажки H и N сбрасываются, а флажок P/V устанавливается, если после выполнения инструкции счётчик в регистровой паре BC имеет ненулевое значение, и сбрасывается, если счётчик обнуляется. Следовательно, для инструкций, обеспечивающих повторение (LDIR и LDDR) флажок P/V будет всегда сброшен.

Инструкции, мнемоники которых начинаются с букв CP (CPI, CPIR, CPD и CPDR), выполняют сравнение содержимого аккумулятора с байтами памяти, адресуемыми регистровой парой HL. По результатам сравнения устанавливаются или сбрасываются флажки S, Z и H. Флажок C не изменяется; флажок N устанавливается; флажок P/V, как и в инструкциях пересылки, устанавливается, если после завершения выполнения команды счётчик (регистровая пара BC) не равен нулю, и сбрасывается в противном случае.


Операции переходов


JP nn                               JR d

---------¬ --------¬ --------¬      ---------¬ --------¬

¦11000011¦ ¦   n   ¦ ¦   n   ¦      ¦00011000¦ ¦  d-2  ¦

L--------- L-------- L--------      L--------- L--------

JP cc,nn                            DJNZ d

---T---T---¬ --------¬ --------¬    ---------¬ --------¬

¦11¦cc ¦010¦ ¦   n   ¦ ¦   n   ¦    ¦00010000¦ ¦  d-2  ¦

L--+---+---- L-------- L--------    L--------- L--------

JP (HL)       JP (IX)                  JP (IY)

---------¬    ---------¬ ---------¬    ---------¬ ---------¬

¦11101001¦    ¦11011101¦ ¦11101001¦    ¦11111101¦ ¦11101001¦

L---------    L--------- L---------    L--------- L---------

JR C,d                  JR NC,d

---------¬ --------¬    ---------¬ --------¬

¦00111000¦ ¦  d-2  ¦    ¦00110000¦ ¦  d-2  ¦

L--------- L--------    L--------- L--------

JR Z,d                  JR NZ,d

---------¬ --------¬    ---------¬ --------¬

¦00101000¦ ¦  d-2  ¦    ¦00100000¦ ¦  d-2  ¦

L--------- L--------    L--------- L--------

CALL nn                           RET           RET cc

---------¬ --------¬ --------¬    ---------¬    ---T---T---¬

¦11001101¦ ¦   n   ¦ ¦   n   ¦    ¦11001001¦    ¦11¦cc ¦000¦

L--------- L-------- L--------    L---------    L--+---+----

CALL cc,nn

---T---T---¬ --------¬ --------¬

¦11¦cc ¦100¦ ¦   n   ¦ ¦   n   ¦

L--+---+---- L-------- L--------

RETI                     RETN                     RST x

---------¬ ---------¬    ---------¬ ---------¬    ---T---T---¬

¦11101101¦ ¦01001101¦    ¦11001001¦ ¦01000101¦    ¦11¦ x ¦111¦

L--------- L---------    L--------- L---------    L--+---+----

Инструкции JP осуществляют безусловный или условный переход по абсолютному адресу длиной два байта, входящему в состав кода команды. Кроме того, безусловный переход может выполняться по адресу, находящемуся в регистровой паре HL или в индексных регистрах.

Инструкции JR осуществляют безусловный или условный переход по относительному адресу; для них в коде команды задаётся 8-разрядное смещение d, рассматриваемое как число со знаком и прибавляемое в случае выполнения перехода к содержимому счётчика команд (к моменту сложения он содержит адрес инструкции, следующей непосредственно за командой перехода).


Инструкция CALL обеспечивает безусловный или условный переход к подпрограмме, заданной с помощью абсолютной адресации (в коде команды содержится двухбайтовый адрес перехода). При переходе к подпрограмме адрес инструкции, следующей за командой CALL, сохраняется в стеке, после чего в счётчик команд заносится адрес подпрограммы.

Инструкция RET производит безусловный или условный возврат из подпрограммы; адрес возврата извлекается из вершины стека.

Обозначение

Код

Условие

NZ

000

не нуль (Z=0)

Z

001

нуль (Z=1)

NC

010

нет переноса (C=0)

C

011

есть перенос (C=1)

PO

100

нечётность (P/V=0)

PE

101

чётность (P/V=1)

P

110

плюс (S=0)

M

111

минус (S=1)

Все инструкции условных переходов имеют своим первым (а для RET – единственным) операндом код условия, обозначаемый в форматах инструкций буквами cc. Для инструкций относительного перехода JR возможны переходы по состоянию флажка Z (JR NZ и JR Z) и флажка C (JR NC и JR C), при этом условие перехода определяется кодом операции. В остальных инструкциях (JP, CALL и RET) набор условий перехода более широкий; он кодируется тремя разрядами кода команды, как показано в приведённой таблице.

Инструкция DJNZ облегчает организацию циклов по счётчику. Она уменьшает содержимое регистра B на единицу и, если результат отличен от нуля, производит переход на указанный адрес. Для определения адреса перехода используется относительная адресация: код команды содержит 8-разрядное смещение d относительно адреса инструкции, следующей за командой DJNZ, рассматриваемое как число со знаком.

Инструкции RETI и RETN предназначены для завершения программ обработки прерываний; первая используется в обработчиках маскируемых прерываний, возникающих по запросам внешних устройств, а вторая – в обработчике немаскируемых прерываний. Обе инструкции извлекают из вершины двухбайтовый адрес возврата и заносят его в счётчик команд.

Команда RETI никаких дополнительных действий в процессоре не производит, но “родные” микросхемы, предназначенные для совместной работы с микропроцессором Z80, распознают её машинный код (анализируя состояние шины данных в процессе выборки команды и отслеживая появление байтов 0EDh и 4Dh, составляющих код инструкции RETI) и благодаря этому определяют, что обработка прерывания завершена.


При использовании “чужих” микросхем (например, входящих в микропроцессорный набор фирмы Intel) приходится либо создавать дополнительные схемы, “отлавливающие” выполнение инструкции RETI, либо информировать устройство об окончании обработки прерывания программно, как это обычно делается в вычислительных системах на базе микропроцессора Intel 8080.

Инструкция RETN, помимо занесения в счётчик команд адреса возврата, устанавливает флажок IFF1 в соответствии с текущим состоянием флажка IFF2, т.е. восстанавливает состояние разрешения или запрещения маскируемых прерываний на момент возникновения немаскируемого прерывания.

Инструкции RST обеспечивают переход к одной из восьми подпрограмм, первые инструкции которых располагаются соответственно по адресам 0000h, 0008h, 0010h, 0018h, 0020h, 0028h, 0030h и 0038h. В стек заносится адрес возврата, то есть адрес команды, следующей непосредственно за инструкцией RST, после чего производится переход на начало соответствующей подпрограммы.

Ни одна из инструкций перехода не оказывает влияния на состояние флажков.


Операции сдвига


RLCA                 -----------------¬

---------¬    ----¬  ¦ ------------¬  ¦

¦00000111¦    ¦ C ¦<-+-¦ 7 <---- 0 ¦<--

L---------    L----    L------------

RLC r                     RLC (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00000¦ r ¦    ¦11001011¦ ¦00000110¦

L--------- L-----+----    L--------- L---------

RLC (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00000110¦

L--------- L--------- L-------- L---------

RLC (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00000110¦

L--------- L--------- L-------- L---------

RLA           --------------------------¬

---------¬    ¦ ----¬    ------------¬  ¦

¦00010111¦    L-¦ C ¦<---¦ 7 <---- 0 ¦<--

L---------      L----    L------------

RL r                      RL (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00010¦ r ¦    ¦11001011¦ ¦00010110¦

L--------- L-----+----    L--------- L---------

RL (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00010110¦

L--------- L--------- L-------- L---------

RL (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00010110¦

L--------- L--------- L-------- L---------

RRCA          -----------------¬

---------¬    ¦  ------------¬ ¦  ----¬

¦00001111¦    L->¦ 7 ----> 0 ¦-+->¦ C ¦

L---------       L------------    L----

RRC r                     RRC (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00001¦ r ¦    ¦11001011¦ ¦00001110¦

L--------- L-----+----    L--------- L---------

RRC (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00001110¦

L--------- L--------- L-------- L---------

RRC (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00001110¦

L--------- L--------- L-------- L---------

RRA           ---------------------------¬


---------¬    ¦  ------------¬    ----¬  ¦

¦00011111¦    L->¦ 7 ----> 0 ¦--->¦ C ¦---

L---------       L------------    L----

RR r                      RR (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00011¦ r ¦    ¦11001011¦ ¦00011110¦

L--------- L-----+----    L--------- L---------

RR (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00011110¦

L--------- L--------- L-------- L---------

RR (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00011110¦

L--------- L--------- L-------- L---------

     ----¬    ------------¬

     ¦ C ¦<---¦ 7 <---- 0 ¦<-0

     L----    L------------

SLA r                     SLA (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00100¦ r ¦    ¦11001011¦ ¦00100110¦

L--------- L-----+----    L--------- L---------

SLA (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00100110¦

L--------- L--------- L-------- L---------

SLA (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00100110¦

L--------- L--------- L-------- L---------

        ------------¬    ----¬

     -->¦ 7 ----> 0 ¦--->¦ C ¦

     ¦  L------------    L----

     ¦   ^

     L----

SRA r                     SRA (HL)

---------¬ ------T---¬    ---------¬ ---------¬

¦11001011¦ ¦00101¦ r ¦    ¦11001011¦ ¦00101110¦

L--------- L-----+----    L--------- L---------

SRA (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00101110¦

L--------- L--------- L-------- L---------

SRA (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00101110¦

L--------- L--------- L-------- L---------

        ------------¬    ----¬

     0->¦ 7 ----> 0 ¦--->¦ C ¦

        L------------    L----

SRL r                     SRL (HL)

---------¬ ------T---¬    ---------¬ ---------¬



¦11001011¦ ¦00111¦ r ¦    ¦11001011¦ ¦00111110¦

L--------- L-----+----    L--------- L---------

SRL (IX+d)

---------¬ ---------¬ --------¬ ---------¬

¦11011101¦ ¦11001011¦ ¦   d   ¦ ¦00111110¦

L--------- L--------- L-------- L---------

SRL (IY+d)

---------¬ ---------¬ --------¬ ---------¬

¦11111101¦ ¦11001011¦ ¦   d   ¦ ¦00111110¦

L--------- L--------- L-------- L---------

                                   ----------------¬

RLD                                ¦               Ў

---------¬ ---------¬     ------T-----¬   ------T-----¬

¦11101101¦ ¦01101111¦     ¦ 7-4 ¦ 3-0 ¦   ¦ 7-4 ¦ 3-0 ¦

L--------- L---------     L-----+------   L-----+------

                                   ^        ¦ ^    ¦

                                   L--------- L-----

                                A               (HL)

                                   ---------¬ -----¬

RRD                                ¦        Ў ¦    Ў

---------¬ ---------¬     ------T-----¬   ------T-----¬

¦11101101¦ ¦01100111¦     ¦ 7-4 ¦ 3-0 ¦   ¦ 7-4 ¦ 3-0 ¦

L--------- L---------     L-----+------   L-----+------

                                   ^               ¦

                                   L----------------

                                A               (HL)

Микропроцессор Z80 имеет весьма развитую систему операций сдвигов. В неё входят арифметические сдвиги вправо и влево (инструкции SLA и SRA), логический сдвиг вправо (SRL), циклические сдвиги вправо и влево через флажок переноса (RRA, RR, RLA, RL) и без флажка переноса (RRCA, RRC, RLCA, RLC). Кроме того, имеются две весьма специфические инструкции так называемого десятичного сдвига, обеспечивающие “вращение” младшего полубайта аккумулятора  и полубайтов ячейки памяти, адрес которой располагается в регистровой паре HL (RLD и RLC). Схемы выполнения сдвигов приведены выше одновременно со структурами их кодов операций.

Инструкции RLCA, RLA, RRCA и RRA обеспечивают циклический сдвиг содержимого аккумулятора.


Только эти четыре инструкции имелись в системе команд микропроцессора Intel 8080, что порой весьма сильно осложняло его программирование. Эти инструкции сбрасывают флажки H и N, а во флажок C заносится значение выдвинутого из аккумулятора разряда.

Инструкции RLC, RL, RRC и RR являются аналогами инструкций RLCA, RLA, RRCA и RRA, обеспечивающими циклический сдвиг содержимого любого регистра общего назначения, а также ячейки памяти, адресуемой либо содержимым регистровой пары HL, либо суммой содержимого одного из индексных регистров и 8-разрядного смещения, входящего в состав команды. Заметим, что эти инструкции способны выполнить сдвиг содержимого аккумулятора, однако они выполняются в два раза медленнее, чем команды RLCA, RLA, RRCA и RRA, и занимают два байта памяти вместо одного. Инструкции RLC, RL, RRC и RR изменяют состояние флажков S, Z и P/V в соответствии с полученным результатом (последний содержит признак чётности результата); во флажок C заносится значение выдвинутого разряда; флажки H и N обнуляются. Таким образом, использование двухбайтовых команд вида RLC A вместо однобайтовых вида RLCA может потребоваться в тех случаях, когда необходимо проанализировать результат операции сдвига, отражаемый флажками S, Z и P/V.

Инструкции SLA и SRA выполняют арифметический сдвиг влево и вправо содержимого аккумулятора, любого регистра общего назначения или ячейки памяти, адрес которой находится в регистровой паре HL или определяется суммированием содержимого одного из индексных регистров и 8-разрядного смещения. Инструкция SRL аналогична инструкции SRA, но выполняет логический сдвиг вправо (разница заключается в том, что при арифметическом сдвиге вправо значение старшего (знакового) разряда операнда не изменяется, а при логическом сдвиге в старший разряд заносится нуль). Все эти инструкции влияют на флажки аналогично инструкциям RLC, RL, RRC и RR: сбрасывают флажки H и N; заносят во флажок C значение выдвинутого разряда операнда; устанавливают или сбрасывают флажки S, Z и P/V в соответствии с полученным результатом (флажок P/V содержит признак чётности результата).

Операции RLD и RRD обменивают местами три полубайта: младший полубайт аккумулятора и оба полубайта ячейки памяти, адресуемой содержимым регистровой пары HL. Содержимое старшего полубайта аккумулятора не изменяется. Эти команды могут использоваться при преобразовании двоично-десятичных упакованных чисел (по две цифры в байте) в распакованный формат (код цифры – в младшем полубайте, код зоны – в старшем) и обратно. Они не оказывают влияния на флажок C, сбрасывают флажки H и N и устанавливают или сбрасывают флажки S, Z и P/V в соответствии с результатом, получившимся в аккумуляторе (флажок P/V является признаком чётности результата).


Операции ввода-вывода


IN A,(n)                 IN r,(C)

---------¬ --------¬     ---------¬ ---T---T---¬

¦11011011¦ ¦   n   ¦     ¦11101101¦ ¦01¦ r ¦000¦

L--------- L--------     L--------- L--+---+----

INI                      INIR

---------¬ ---------¬    ---------¬ ---------¬

¦11101101¦ ¦10100010¦    ¦11101101¦ ¦10110010¦

L--------- L---------    L--------- L---------

IND                      INDR

---------¬ ---------¬    ---------¬ ---------¬

¦11101101¦ ¦10101010¦    ¦11101101¦ ¦10111010¦

L--------- L---------    L--------- L---------

OUT (n),r                OUT (C),r

---------¬ --------¬     ---------¬ ---T---T---¬

¦11010011¦ ¦   n   ¦     ¦11101101¦ ¦01¦ r ¦001¦

L--------- L--------     L--------- L--+---+----

OUTI                     OTIR

---------¬ ---------¬    ---------¬ ---------¬

¦11101101¦ ¦10100011¦    ¦11101101¦ ¦10110011¦

L--------- L---------    L--------- L---------

OUTD                     OTDR

---------¬ ---------¬    ---------¬ ---------¬

¦11101101¦ ¦10101011¦    ¦11101101¦ ¦10111011¦

L--------- L---------    L--------- L---------

Набор операций ввода-вывода по сравнению с системой команд микропроцессора Intel 8080 был существенно расширен.

Инструкции IN A,(n) и OUT (n),A – единственные команды ввода-вывода, реализованные в микропроцессоре 8080. Они обеспечивают соответственно ввод байта информации из порта и вывод информации в порт. Младший байт адреса порта содержится в коде команды – это константа n. Старший байт адреса порта содержится в аккумуляторе. (Микропроцессор 8080 всегда использовал 8-разрядный адрес порта, содержащийся в коде команды.) Значение, читаемое из порта инструкцией IN, заносится в аккумулятор; значение, заносимое в порт инструкцией OUT, находится в аккумуляторе. Эта пара инструкций на флажки влияния не оказывает.

Инструкции IN r,(C) и OUT (C),r  осуществляют ввод байта из порта или его вывод в порт. Адрес порта находится в регистровой паре BC; данные, читаемые из порта или выводимые в порт, находятся в регистре r.
Команда IN устанавливает или сбрасывает флажки S, Z и P/V в соответствии со значением прочитанного значения (флажок P/V является признаком чётности) и сбрасывает флажки H и N; значение флажка C не изменяется. Команда OUT на флажки влияния не оказывает. Заметим, что если в поле r кода команды IN задана комбинация 110, то прочитанное значение вызовет соответствующую установку или сброс флажков, но не будет сохранено. Действия микропроцессора для этой комбинации в команде OUT в фирменной документации не определены. По-видимому, в порт будет записано случайное значение.

Оставшиеся инструкции (INI, INIR, IND, INDR, OUTI, OTIR, OUTD и OTDR) обеспечивают ввод или вывод нескольких байтов информации. В регистровой паре HL содержится адрес области памяти, в которую будут заноситься вводимые данные или из которой будут извлекаться выводимая информация. После ввода или вывода очередного байта информации содержимое HL увеличивается или уменьшается на 1 (если третья буква мнемоника кода команды – I, то осуществляется инкремент этой регистровой пары; если D – то декремент). В качестве адреса порта используется содержимое регистровой пары BC. Кроме того, содержимое регистра B используется в качестве счётчика; оно уменьшается на единицу после ввода или вывода каждого байта информации. Инструкции, мнемоники которых заканчиваются на букву R (INIR, INDR, OTIR и OTDR), производят ввод или вывод данных до тех пор, пока регистр B не будет обнулён. Инструкции, мнемоники которых не содержат буквы R (INI, IND, OUTI и OUTD), выполняют одиночную операцию ввода или вывода байта. После выполнения этих инструкций значение флажка C не изменяется; флажок N устанавливается; флажок Z сбрасывается, если содержимое регистра B отлично от нуля, и устанавливается при обнулении регистра B (таким образом, в инструкциях с автоматическим повторением – INIR, INDR, OTIR и OTDR – флажок Z будет установлен); состояние остальных флажков непредсказуемо.


Основные характеристики


Z80 является однокристальным микропроцессором третьего поколения, оперирующим 8-разрядными данными и 16-разрядными адресами. Максимальный объём прямо адресуемой памяти и прямо адресуемого пространства ввода вывода – по 64 Кбайта (пространство ввода-вывода микропроцессора 8080 составляет 256 байт).

Система команд микропроцессора Z80 включает 158 инструкций, из которых 78 полностью аналогичны командам микропроцессора 8080, хотя и имеют другие мнемоники. Помимо традиционных для 8-разрядных микропроцессоров арифметико-логических команд, у Z80 имеются инструкции, работавшие с отдельными битами, а также облегчающие обработку символьной информации.

Выпускались микропроцессоры с различными рабочими тактовыми частотами от 2,5 до 8 МГц (у 8080A – 2,5 МГц), что обеспечивало очень высокое по тем временам быстродействие (команда сложения типа “регистр–регистр” выполнялась за 4 такта, что на частоте 8 МГц составляло 2 млн. операций в секунду). Советский аналог Z80 – микропроцессор КР1858ВМ1 – работает на тактовой частоте 4 МГц.

Микропроцессор содержит два идентичных набора регистров общего назначения по сравнению с единственным набором процессора 8080. Благодаря наличию двух наборов регистров обеспечивается быстрое переключение контекста при обработке прерываний. Кроме того, по сравнению с прототипом были добавлены два 16-разрядных индексных регистра, что позволило расширить набор методов адресации операндов в памяти.

Z80 поддерживает три схемы организации обработки прерываний, в том числе режим совместимости с микропроцессором 8080. Правда, для согласования микропроцессора Z80 с контроллером прерываний 8259 фирмы Intel требуются дополнительные схемы, т.е. режим совместимости оказался не совсем “совместимым”.

Наконец, на самом кристалле микропроцессора реализован счётчик регенерации динамической памяти, что позволяет резко сократить количество деталей в простых микрокомпьютерах по сравнению с 8080.



Относительная адресация


Этот вид адресации используется в некоторых командах переходов. Код команды состоит из двух байтов. В первом содержится код операции, во втором – 8-разрядное смещение в дополнительном коде. Адрес перехода получается путём прибавления смещения, расширенного до 16 разрядов, к текущему содержимому счётчика команд PC (он всегда указывает на следующую инструкцию, в данном случае следующую непосредственно за командой перехода).

Поскольку смещение имеет длину 8 разрядов, с его помощью возможно осуществить переход на 128 байтов назад или на 127 байтов вперёд относительно команды, следующей за инструкцией перехода.

Адрес перехода записывается в инструкции явным образом, при этом транслятор языка ассемблера автоматически вычисляет необходимое значение смещения: JR8123h. В описании форматов кодов команд для смещения, используемого в относительной и индексной (см. ниже) адресации, применяется обозначение d.



В кодах операций регистрам соответствуют


В таблице используются следующие обозначения:

– r, r1, r2 – регистры общего назначения. В кодах операций регистрам соответствуют следующие битовые значения: 000 – B, 001 – C, 010 – D, 011 – E, 100 – H, 101 – L, 111 – A. Значение 110 применяется для обозначения операнда в памяти, адрес которого содержится в регистровой паре HL (см. ниже). В языке ассемблера микропроцессора 8080 для этот случай обозначался “псевдорегистром” M (например, инструкция процессора Z80 LD A,(HL) соответствует инструкции процессора 8080 MOV A,M);

– (IX), (IY), (BC), (DE), (HL) – операнд в памяти, адрес которого содержится в соответствующем 16-разрядном регистре или регистровой паре;

– (IX+d), (IY+d) – операнд в памяти; его адрес равен сумме содержимого указанного индексного регистра и 8-разрядной константы d, являющейся частью кода команды;

– n – 8-разрядная константа, являющаяся частью кода команды;

– nn – 16-разрядная константа, являющаяся частью кода команды (в памяти младший байт предшествует старшему);

– e – 8-разрядное смещение относительно адреса следующей команды;

– (aa) – операнд в памяти по адресу aa, являющемуся частью кода команды;

– dd – 16-разрядный регистр SP или одна из регистровых пар. Им соответствуют следующие коды: 00 – BC, 01 – DE, 10 – HL, 11 – SP;

– pp – одна из 16-разрядных пар или регистров: 00 – BC, 01 – DE, 10 – IX, 11 – SP;

– qq – одна из 16-разрядных регистровых пар: 00 – BC, 01 – DE, 10 – HL, 11 – AF;

– ss – одна из 16-разрядных пар или регистров: 00 – BC, 01 – DE, 10 – IY, 11 – SP;

– x – номер одной из восьми подпрограмм, переход к которым осуществляется с помощью инструкции RST;

– (p) – порт ввода-вывода с адресом p;

– b – номер разряда в диапазоне 0–7;

– rb – разряд b регистра r;

– (HL)b, (IX+d)b, (IY+d)b – разряд b ячейки памяти с соответствующим адресом;

– cc – условие перехода, кодируемое следующим образом: NZ (000) – не нуль, не равно, Z=0; Z (001) – нуль, равно, Z=1; NC (010) – отсутствие переноса или заёма, C=0; C (011) – наличие переноса или заёма, C=1; PO (100) – нечётный результат, P/V=0; PE (101) – чётный результат, P/V=1; P (110) – знак “плюс”, S=0; M (111) – знак “минус”, S=1.



– * – флаг устанавливается по результатам выполненной операции;

– ? – значение флага после выполнения операции не определено;

– & – операция “логическое И”;

– | – операция “логическое ИЛИ”;

– Å – операция “исключающее ИЛИ”.

Мнемоника

Операция

Флаги

Код операции

Кол-во байтов

Кол-во циклов

Кол-во тактов

S

Z

H

P/V

N

C

76

543

210

шестн.

Однобайтовые операции пересылки

LD r1,r2

r1












01

r1

r2

1

1

4

LD r,n

r












00

r

110

2

2

7

n

LD r,(HL)

r<(HL)













01

r

110

1

2

7

LD r,(IX+d)

r<(IX+d)













11

011

101

DD

3

5

19

01

r

110

d

LD r,(IY+d)

r<(IY+d)













11

111

101

FD

3

5

19

01

r

110

d

LD (HL),n

(HL)












00

110

110

36

2

3

10

n

LD (IX+d),n

(IX+d)












11

011

101

DD

4

5

19

00

110

110

36

d

n

LD (IY+d),n

(IY+d)












11

111

101

FD

4

5

19

00

110

110

36

d

n

LD A,(BC)

A<(BC)













00

001

010

0A

1

2

7

LD A,(DE)

A<(DE)













00

011

010

1A

1

2

7

LD A,(aa)

A<(aa)













00

111

010

3A

3

4

13

a

a

LD (BC),A

(BC)












00

000

010

02

1

2

7

LD (DE),A

(DE)












00

010

010

12

1

2

7

LD (aa),A

(nn)












00

110

010

32

3

4

13

a

a

LD A,I

A
*

*

0

IFF2

0



11

101

101

ED

2

2

9

01

010

111

57

LD A,R

A
*

*

0

IFF2

0



11

101

101

ED

2

2

9

01

011

111

5F

LD I,A

I












11

101

101

ED

2

2

9

01

000

111

47

LD R,A

R












11

101

101

ED

2

2

9

01

001

111

4F

Двухбайтовые операции пересылки

LD dd,nn

dd












00

dd0

001

3

3

10

n

n

LD IX,nn

IX












11

011

101

DD

4

4

14

00

100

001

21

n

n

LD IY,nn

IY












11

111

1-1

FD

4

4

14

00

100

001

21

n

n

LD HL,(aa)

H<(nn+1)













00

101

010

2A

3

5

16

L<(nn)

a

a

LD dd,(aa)

dd[15:8]<(nn+1)













11

101

101

ED

4

6

20

dd[7:0]<(nn)













01

dd1

011

a

a

LD IX,(aa)

IX[15:8]<(nn+1)













11

011

101

DD

4

6

20

IX[7:0]<(nn)













00

101

010

2A

a

a

LD IY,(aa)

IY[15:8]<(nn+1)













11

111

101

FD

4

6

20

IY[7:0]<(nn)













00

101

010

2A

a

a

LD (aa),HL

(nn+1)












00

100

010

22

3

5

16

(nn)












a

a

LD (aa),dd

(nn+1)












11

101

101

ED

4

6

20

(nn)












01

dd0

011

a

a

LD (aa),IX

(nn+1)












11

011

101

DD

4

6

20

(nn)












00

100

010

22

a

a

LD (aa),IY

(nn+1)












11

111

101

FD

4

6

20

(nn)












00

100

010

22

a

a

LD SP,HL

SP












11

111

001

F9

1

1

6

LD SP,IX

SP












11

011

101

DD

2

2

10

11

111

001

F9

LD SP,IY

SP












11

111

101

FD

2

2

10

11

111

001

F9

PUSH qq

(SP-2)












11

qq0

101

1

3

11

(SP-1)
SP
PUSH IX

(SP-2)












11

011

101

DD

2

4

15

(SP-1)
11

100

101

E5

SP
PUSH IY

(SP-2)












11

111

101

FD

2

4

15

(SP-1)
11

100

101

E5

SP
POP qq

qq[15:8]<(SP+1)













11

qq0

001

1

3

10

qq[7:0]<(SP)

SP
POP IX

IX[15:8]<(SP+1)













11

011

101

DD

2

4

14

IX[7:0]<(SP)

11

100

001

E1

SP
POP IY

IY[15:8]<(SP+1)













11

111

101

FD

2

4

14

IY[7:0]<(SP)

11

100

001

E1

SP
Операции обмена

EX DE,HL

DE-HL













11

101

011

EB

1

1

4

EX AF,AF'

AF-AF'

*

*

*

*

*

*

00

001

000

08

1

1

4

EXX

BC-BC'













11

011

001

D9

1

1

4

DE-DE'

HL-HL'

EX (SP),HL

H-(SP+1)













11

100

011

E3

1

5

19

L-(SP)

EX (SP),IX

IX[15:8]-(SP+1)













11

011

101

DD

2

6

23

IX[7:0]-(SP)

11

100

011

E3

EX (SP),IY

IY[15:8]-(SP+1)













11

111

101

FD

2

6

23

IY[7:0]-(SP)

11

100

011

E3

Операции поиска и групповой передачи

LDI

(DE)<(HL)





0

*[1]

0



11

101

101

ED

2

4

16

DE
10

100

000

A0

HL
BC
LDIR

(DE)<(HL)





0

0

0



11

101

101

ED

2

5

21[2]

DE
10

110

000

B0

2

4

16

HL
BC
Повтор, пока BC?0

LDD

(DE)<(HL)





0

*

0



11

101

101

ED

2

4

16

DE
10

101

000

A8

HL
BC
LDDR

(DE)<(HL)





0

0

0



11

101

101

ED

2

5

21

DE
10

111

000

B8

2

4

16

HL
BC
Повтор, пока BC?0

CPI

Сравнение A с (HL)[3]

*

*

*

*

1



11

101

101

ED

2

4

16

HL
10

100

001

A1

BC
CPIR

Сравнение A с (HL)

*

*

*

*

1



11

101

101

ED

2

5

21

HL
10

110

001

B1

2

4

16

BC
Повтор, пока A?(HL) и BC?0

CPD

Сравнение A с (HL)

*

*

*

*

1



11

101

101

ED

2

4

16

HL
10

101

001

A9

BC
CPDR

Сравнение A с (HL)

*

*

*

*

1



11

101

101

ED

2

5

21

HL
10

111

001

B9

2

4

16

BC
Повтор, пока A?(HL) и BC?0

Однобайтовые арифметико-логические операции

ADD A,r

A
*

*

*

*

0

*

10

000

r

1

1

4

ADD A,n

A
*

*

*

*

0

*

11

000

110

C6

2

2

7

n

ADD A,(HL)

A
*

*

*

*

0

*

10

000

110

86

1

2

7

ADD A,(IX+d)

A
*

*

*

*

0

*

11

011

101

DD

3

5

19

10

000

110

86

d

ADD A,(IY+d)

A
*

*

*

*

0

*

11

111

101

FD

3

5

19

10

000

110

86

d

ADC A,r

A
*

*

*

*

0

*

10

001

r

1

1

4

ADC A,n

A
*

*

*

*

0

*

11

001

110

CE

2

2

7

n

ADC A,(HL)

A
*

*

*

*

0

*

10

001

110

8E

1

2

7

ADC A,(IX+d)

A
*

*

*

*

0

*

11

011

101

DD

3

5

19

10

001

110

8E

d

ADC A,(IY+d)

A
*

*

*

*

0

*

11

111

101

FD

3

5

19

10

001

110

8E

d

SUB r

A
*

*

*

*

1

*

10

010

r

1

1

4

SUB n

A
*

*

*

*

1

*

11

010

110

D6

2

2

7

n

SUB (HL)

A
*

*

*

*

1

*

10

010

110

96

1

2

7

SUB (IX+d)

A
*

*

*

*

1

*

11

011

101

DD

3

5

19

10

010

110

96

d

SUB (IY+d)

A
*

*

*

*

1

*

11

111

101

FD

3

5

19

10

010

110

96

d

SBC A,r

A
*

*

*

*

1

*

10

011

r

1

1

4

SBC A,n

A
*

*

*

*

1

*

11

011

110

DE

2

2

7

n

SBC A,(HL)

A
*

*

*

*

1

*

10

011

110

9E

1

2

7

SBC A,(IX+d)

A
*

*

*

*

1

*

11

011

101

DD

3

5

19

10

011

110

9E

d

SBC A,(IY+d)

A
*

*

*

*

1

*

11

111

101

FD

3

5

19

10

011

110

9E

d

AND r

A
*

*

1

*

0

0

10

100

r

1

1

4

AND n

A
*

*

1

*

0

0

11

100

110

E6

2

2

7

n

AND (HL)

A
*

*

1

*

0

0

10

100

110

A6

1

2

7

AND (IX+d)

A
*

*

1

*

0

0

11

011

101

DD

3

5

19

10

100

110

A6

d

AND (IY+d)

A
*

*

1

*

0

0

11

111

101

FD

3

5

19

10

100

110

A6

d

OR r

A
*

*

1

*

0

0

10

110

r

1

1

4

OR n

A
*

*

1

*

0

0

11

110

110

F6

2

2

7

n

OR (HL)

A
*

*

1

*

0

0

10

110

110

B6

1

2

7

OR (IX+d)

A
*

*

1

*

0

0

11

011

101

DD

3

5

19

10

110

110

B6

d

OR (IY+d)

A
*

*

1

*

0

0

11

111

101

FD

3

5

19

10

110

110

B6

d

XOR r

A
*

*

1

*

0

0

10

101

r

1

1

4

XOR n

A
*

*

1

*

0

0

11

101

110

EE

2

2

7

n

XOR (HL)

A
*

*

1

*

0

0

10

101

110

AE

1

2

7

XOR (IX+d)

A
*

*

1

*

0

0

11

011

101

DD

3

5

19

10

101

110

AE

d

XOR (IY+d)

A
*

*

1

*

0

0

11

111

101

FD

3

5

19

10

101

110

AE

d

CP r

Сравнение A и r

*

*

*

*

1

*

10

111

r

1

1

4

CP n

Сравнение A и n

*

*

*

*

1

*

11

111

110

FE

2

2

7

n

CP (HL)

Сравнение A и (HL)

*

*

*

*

1

*

10

111

110

BE

1

2

7

CP (IX+d)

Сравнение A и (IX+d)

*

*

*

*

1

*

11

011

101

DD

3

5

19

10

111

110

BE

d

CP (IY+d)

Сравнение A и (IX+d)

*

*

*

*

1

*

11

111

101

FD

3

5

19

10

111

110

BE

d

INC r

r
*

*

*

*

0



00

r

100

1

1

4

INC (HL)

(HL)<(HL)+1

*

*

*

*

0



00

110

100

34

1

3

11

INC (IX+d)

(IX+d)<(IX+d)+1

*

*

*

*

0



11

011

101

DD

3

6

23

00

110

100

34

d

INC (IY+d)

(IY+d)<(IY+d)+1

*

*

*

*

0



11

111

101

FD

3

6

23

00

110

100

34

d

DEC r

r
*

*

*

*

0



00

r

101

1

1

4

DEC (HL)

(HL)<(HL)-1

*

*

*

*

0



00

110

101

35

1

3

11

DEC (IX+d)

(IX+d)<(IX+d)-1

*

*

*

*

0



11

011

101

DD

3

6

23

00

110

101

35

d

DEC (IY+d)

(IY+d)<(IY+d)-1

*

*

*

*

0



11

111

101

FD

3

6

23

00

110

101

35

d

DAA

Десятичная коррекция

*

*

*

*



*

00

100

111

27

1

1

4

CPL

A< not A





1



1



00

101

111

2F

1

1

4

NEG

A< -A

*

*

*

*

1

*

11

101

101

ED

2

2

8

01

000

100

44

Двухбайтовые арифметические операции

ADD HL,dd

HL




?



0

*

00

dd1

001

1

3

11

ADC HL,dd

HL
*

*

?

*

0

*

11

101

101

ED

2

4

15

01

dd1

010

SBC HL,dd

HL
*

*

?

*

1

*

11

101

101

ED

2

4

15

01

dd0

010

ADD IX,pp

IX




?



0

*

11

011

101

DD

2

4

15

01

pp1

001

ADD IY,ss

IY




?



0

*

11

111

101

FD

2

4

15

00

ss1

001

INC dd

dd












00

ss0

011

1

1

6

INC IX

IX












11

011

101

DD

2

2

10

00

100

011

23

INX IY

IY












11

111

101

FD

2

2

10

00

100

011

23

DEC dd

dd












00

ss1

011

1

1

6

DEC IX

IX












11

011

101

DD

2

2

10

00

101

011

2B

DEX IY

IY












11

111

101

FD

2

2

10

00

101

011

2B

Операции сдвигов

RLCA

циклический сдвиг A влево





0



0

*

00

000

111

07

1

1

4

RLA

циклический сдвиг A влево через перенос





0



0

*

00

010

111

17

1

1

4

RRCA

циклический сдвиг A вправо





0



0

*

00

001

111

0F

1

1

4

RRA

циклический сдвиг A вправо через перенос





0



0

*

00

011

111

1F

1

1

4

RLC r

циклический сдвиг r влево

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

000

r

RLC (HL)

циклический сдвиг (HL) влево

*

*

0

*

0

*

11

001

011

CB

2

4

15

00

000

110

06

RLC (IX+d)

циклический сдвиг (IX+d) влево

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

000

110

06

RLC (IY+d)

циклический сдвиг (IY+d) влево

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

000

110

06

RL r

циклический сдвиг r влево через перенос

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

010

r

RL (HL)

циклический сдвиг (HL) влево через перенос

*

*

0

*

0

*

11

001

011

CB

2

4

15

00

010

110

16

RL (IX+d)

циклический сдвиг (IX+d) влево через перенос

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

010

110

16

RL (IY+d)

циклический сдвиг (IY+d) влево через перенос

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

010

110

16

RRC r

циклический сдвиг r вправо

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

001

r

RRC (HL)

циклический сдвиг (HL) вправо

*

*

0

*

0

*

11

001

011

CB

2

4

15

00

001

110

0E

RRC (IX+d)

циклический сдвиг (IX+d) вправо

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

001

110

0E

RRC (IY+d)

циклический сдвиг (IY+d) вправо

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

001

110

0E

RR r

циклический сдвиг r вправо через перенос

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

011

r

RR (HL)

циклический сдвиг (HL) вправо через перенос

*

*

0

*

0

*

11

001

011

CB

2

4

15

00

011

110

1E

RR (IX+d)

циклический сдвиг (IX+d) вправо через перенос

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

011

110

1E

RR (IY+d)

циклический сдвиг (IY+d) вправо через перенос

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

011

110

1E

SLA r

арифметический сдвиг r влево

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

100

r

SLA (HL)

арифметический сдвиг (HL) влево

*

*

0

*

0

*

11

001

011

2B

2

4

15

00

100

110

26

SLA (IX+d)

арифметический сдвиг (IX+d) влево

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

100

110

26

SLA (IY+d)

арифметический сдвиг (IY+d) влево

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

100

110

26

SRA r

арифметический сдвиг r вправо

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

101

r

SRA (HL)

арифметический сдвиг (HL) вправо

*

*

0

*

0

*

11

001

011

2B

2

4

15

00

101

110

2E

SRA (IX+d)

арифметический сдвиг (IX+d) вправо

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

101

110

2E

SRA (IY+d)

арифметический сдвиг (IY+d) вправо

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

101

110

2E

SRL r

логический сдвиг r вправо

*

*

0

*

0

*

11

001

011

CB

2

2

8

00

111

r

SRL (HL)

логический сдвиг (HL) вправо

*

*

0

*

0

*

11

001

011

2B

2

4

15

00

111

110

3E

SRL (IX+d)

логический сдвиг (IX+d) вправо

*

*

0

*

0

*

11

011

101

DD

4

6

23

11

001

011

CB

d

00

111

110

3E

SRL (IY+d)

логический сдвиг (IY+d) вправо

*

*

0

*

0

*

11

111

101

FD

4

6

23

11

001

011

CB

d

00

111

110

3E

RLD

десятичный сдвиг влево

*

*

0

*

0



11

101

101

ED

2

5

18

01

101

111

6F

RRD

десятичный сдвиг вправо

*

*

0

*

0



11

101

101

ED

2

5

18

01

100

111

67

Битовые операции

BIT b,r

Z< not rb

?

*

1

?

0



11

001

011

CB

2

2

8

01

b

r

BIT b,(HL)

Z< not (HL)b

?

*

1

?

0



11

001

011

CB

2

3

12

01

b

110

BIT b, (IX+d)

Z< not (IX+d)b

?

*

1

?

0



11

011

101

DD

4

5

20

11

001

011

CB

d

01

b

110

BIT b, (IY+d)

Z< not (IY+d)b

?

*

1

?

0



11

111

101

FD

4

5

20

11

001

011

CB

d

01

b

110

SET b,r

rb < 1













11

001

011

CB

2

2

8

11

b

r

SET b,(HL)

(HL)b < 1













11

001

011

CB

2

4

15

11

b

110

SET b, (IX+d)

(IX+d)b < 1













11

011

101

DD

4

6

23

11

001

011

CB

d

11

b

110

SET b, (IY+d)

(IY+d)b < 1













11

111

101

FD

4

6

23

11

001

011

CB

d

11

b

110

RES b,r

rb < 1













11

001

011

CB

2

2

8

10

b

r

RES b,(HL)

(HL)b < 1













11

001

011

CB

2

4

15

10

b

110

RES b, (IX+d)

(IX+d)b < 1













11

011

101

DD

4

6

23

11

001

011

CB

d

10

b

110

RES b, (IY+d)

(IY+d)b < 1













11

111

101

FD

4

6

23

11

001

011

CB

d

10

b

110

Операции переходов

JP nn

PC












11

000

011

C3

3

3

10

n

n

JP cc,nn

Если выполнено условие cc, то PC












11

сс

010

3

3

10

n

n

JR e

PC












00

011

000

18

2

3

12

e-2

JR C,e

Если C=1, то PC












00

111

000

38

2

2

7[4]

e-2

2

3

12

JR NC,e

Если C=0, то PC












00

110

000

30

2

2

7

e-2

2

3

12

JR Z,e

Если Z=1, то PC












00

101

000

28

2

2

7

e-2

2

3

12

JR NZ,e

Если Z=0, то PC












00

100

000

20

2

2

7

e-2

2

3

12

JP (HL)

PC












11

101

001

E9

1

1

4

JP (IX)

PC












11

011

101

DD

2

2

8

11

101

001

E9

JP (IY)

PC












11

111

101

FD

2

2

8

11

101

001

E9

DJNZ e

B












00

010

000

10

2

2

8[5]

e-2

2

3

13

CALL nn

(SP-1)












11

001

101

CD

3

5

17

(SP-2)
n

SP
n

PC
CALL cc,nn

Если условие cc выполнено, то:













11

сс

100

CD

3

3

10[6]

n

3

5

17

(SP-1)
n

(SP-2)
SP
PC
RET

PC[7:0]<(SP)













11

001

001

C9

1

3

10

PC[15:8]<(SP+1)

SP
RET cc

Если условие cc выполнено, то:













11

сс

000

1

1

5

1

3

11

PC[7:0]<(SP)

PC[15:8]<(SP+1)

SP
RETI

Возврат из прерывания













11

101

101

ED

2

4

14

01

001

101

4D

RETN

Возврат из немаскируемого прерывания













11

101

101

ED

2

4

14

01

000

101

45

IFF1
RST x

(SP-1)












11

x

111

1

3

11

(SP-2)
SP
PC<адрес подпрограммы

Операции ввода-вывода[7]

IN A,(p)

A<порт (A; p)













11

011

011

DB

2

3

11

p

IN r,(C)

r<порт (BC)

*

*

0

P

0



11

101

101

ED

2

3

12

01

r

000

INI

(HL)<порт (BC)

?

*

?

?

1



11

101

101

ED

2

4

16

B
10

100

010

A2

HL
INIR

(HL)<порт (BC)

?

1

?

?

1



11

101

101

ED

2

5

21

B
10

110

010

B2

2

4

16

HL
Повтор, пока B?0

IND

(HL)<порт (BC)

?

*

?

?

1



11

101

101

ED

2

4

16

B
10

101

010

AA

HL
INDR

(HL)<порт (BC)

?

1

?

?

1



11

101

101

ED

2

5

21

B
10

111

010

BA

2

4

16

HL
Повтор, пока B?0

OUT (p),A

порт (A; p)












11

010

011

D3

2

3

11

p

OUT (C),r

порт (BC)












11

101

101

ED

2

3

12

01

r

001

OUTI

порт (BC)<(HL)

?

*

?

?

1



11

101

101

ED

2

4

16

B
10

100

011

A3

HL
OTIR

порт (BC)<(HL)

?

1

?

?

1



11

101

101

ED

2

5

21

B
10

110

011

B3

2

4

16

HL
Повтор, пока B?0

OUTD

порт (BC)<(HL)

?

*

?

?

1



11

101

101

ED

2

4

16

B
10

101

011

AB

HL
OTDR

порт (BC)<(HL)

?

1

?

?

1



11

101

101

ED

2

5

21

B
10

111

011

BB

2

4

16

HL
Повтор, пока B?0

Прочие операции

CCF

инверсия флага C











*

00

111

111

3F

1

1

4

SCF

установка флага C











1

00

110

111

37

1

1

4

NOP

нет операции













00

000

000

00

1

1

4

HALT

останов ЦП













01

110

110

76

1

1

4

DI

IFF<0













11

110

011

F3

1

1

4

EI

IFF<1













11

111

011

FB

1

1

4

IM 0

установка режима













11

101

101

ED

2

2

8

прерываний 0

01

000

110

46

IM 1

установка режима













11

101

101

ED

2

2

8

прерываний 1

01

010

110

56

IM 2

установка режима













11

101

101

ED

2

2

8

прерываний 2

01

011

110

5E



Подпрограммы умножения и деления


Как и подавляющее число других восьмиразрядных микропроцессоров, Z80 не содержит специальных инструкций для выполнения операций умножения и деления: эти действия реализуются с помощью подпрограмм.



Приоритет прерываний


Запрос немаскируемого прерывания всегда имеет больший приоритет, чем запрос маскируемого прерывания. Кроме того, когда происходит немаскируемое прерывание, обработка маскируемых прерываний блокируется (сбрасывается флаг IFF1).

Приоритет нескольких одновременных запросов маскируемых прерываний в режиме 0 определяется контроллером прерываний, на который поступают все запросы от устройств. Обычно, передав какой-либо запрос на обработку процессору, контроллер запрещает все прерывания такого же и более низкого уровня, однако это зависит от его возможностей и запрограммированных режимов работы.

В режиме 1 все устройства используют один и тот же вектор прерывания. Определение устройства, вызвавшего прерывание, ложится на программу обработки прерывания.

В режиме 2, как и в режиме 1, их запросы одновременно поступают на линию INT# микропроцессора; ответные сигналы (M1# и IORQ#) также поступают ко всем устройствам. Однако сами устройства связаны между собой в единую цепочку с помощью специальных сигналов IEI и IEO. Первый из них является входным сигналом, сообщающим устройству, что его предшественники не запрашивали прерывание. Второй сигнал идёт от данного устройства к последующим, сообщая, что ни это устройство, ни его предшественники прерывание не запрашивали. На входе IEI первого устройства в цепочке постоянно присутствует сигнал высокого уровня, а любое устройство, запрашивающее прерывание, выдаёт на свой выход IEO сигнал низкого уровня. Если устройство не запрашивает прерывание, оно транслирует на выход IEO значение входа IEI. Устройство выдаёт на шину данных свой вектор только в том случае, когда оно запросило прерывание, на его входе IEI присутствует напряжение высокого уровня, а от процессора поступили сигналы M1# и IORQ#.



Прочие операции


CCF           SCF           NOP           HALT

---------¬    ---------¬    ---------¬    ---------¬

¦00111111¦    ¦00110111¦    ¦00000000¦    ¦01110110¦

L---------    L---------    L---------    L---------

DI            EI            IM 0

---------¬    ---------¬    ---------¬ ---------¬

¦11110011¦    ¦11111011¦    ¦11101101¦ ¦01000110¦

L---------    L---------    L--------- L---------

IM 1                        IM 2

---------¬ ---------¬       ---------¬ ---------¬

¦11101101¦ ¦01010110¦       ¦11101101¦ ¦01011110¦

L--------- L---------       L--------- L---------

Инструкции CCF и SCF изменяют состояние флажка C: первая меняет его состояние на противоположное, а вторая устанавливает в единицу.

Инструкция NOP не выполняет никаких действий.

Инструкция HALT переводит микропроцессор в состояние останова. Находясь в состоянии останова, процессор выдаёт сигнал HALT#, однако продолжает выполнять циклы регенерации памяти, а также обрабатывать запросы захвата шины и прерываний. Выход из состояния останова возможен с помощью прерывания (маскируемые прерывания при этом должны быть разрешены), а также с помощью сброса.

Инструкции DI и EI соответственно запрещают и разрешают маскируемые прерывания. Их функция заключается в соответственно сбросе и установке флажков IFF1 и IFF2, управляющих прерываниями.

Инструкции IM устанавливают соответствующий режим обработки маскируемых прерываний. В процессе сбора устанавливается режим 0, обеспечивающий совместимость (правда, как уже указывалось, неполную) с механизмом обработки прерываний микропроцессора Intel 8080.



Прочие регистры


8-разрядный регистр адреса регенерации R хранит адрес очередной строки динамической памяти, которая подлежит регенерации. Очередной цикл регенерации выполняется сразу после выборки первого (или единственного) байта кода операции, благодаря чему регенерация динамического ОЗУ совмещена по времени с обработкой информации в процессоре и не приводит к лишним потерям времени на ожидание её завершения. После выполнения очередного цикла содержимое младших семи разрядов регистра R автоматически увеличивается на единицу. Значение старшего разряда не изменяется.

Хотя к регистру R возможен доступ с помощью инструкций пересылки данных, особой пользы для программиста от него нет, хотя можно пытаться использовать его в качестве счётчика выполненных инструкций (поскольку цикл регенерации выполняется сразу за выборкой кода операции) и для генерации случайных чисел.

Ценность встроенного счётчика регенерации снижается из-за того, что он формирует 7-, а не 8-разрядный адрес строки ОЗУ, подлежащей регенерации. Когда микропроцессор Z80 создавался, этот недостаток не играл существенной роли, поскольку самыми распространёнными микросхемами динамической памяти были кристаллы ёмкостью 128×128 разрядов (16 Кбит), для регенерации которых требовались 7-разрядные адреса. Позднее появились кристаллы с организацией 256×256 разрядов (64 Кбита); для их регенерации требовались уже 8-разрядные адреса

8-разрядный регистр адреса таблицы прерываний I используется в “родном” (втором) режиме обработки прерываний микропроцессора Z80. В нём содержится старший байт адреса таблицы, в которой хранятся указатели обработчиков прерываний. Младший байт, называемый вектором прерывания и определяющий, в каком из элементов этой таблицы хранится указатель нужного обработчика, выдаётся устройством, запросившим прерывание.

В нулевом и первом режимах обработки прерываний регистр I не используется.



Регистровая адресация


Операнд находится в регистре или регистровой паре. Код команды явным образом (с помощью нескольких битов) указывает, какой регистр или пара регистров содержит операнд. Не следует путать регистровую адресацию с неявной, при которой операнд тоже может находиться в регистре, но не задаваемом явным образом несколькими разрядами кода команды.

8-разрядные регистры, участвующие в операции, кодируются комбинацией трёх битов:

– 000 – регистр B;

– 001 – регистр C;

– 010 – регистр D;

– 011 – регистр E;

– 100 – регистр H;

– 101 – регистр L;

– 110 – косвенная адресация по регистровой паре HL (см. ниже);

– 111 – регистр A.

16-разрядные регистры и регистровые пары кодируются комбинацией двух битов, при этом в зависимости от инструкции кодировка несколько изменяется:

– 00 – регистровая пара BC;

– 01 – регистровая пара DE;

– 10 – регистровая пара HL (все инструкции, кроме ADD IX и ADD IY), регистр IX (инструкция ADD IX) или регистр IY (инструкция ADD IY);

– 11 – регистровая пара AF (инструкции PUSH и POP) или регистр SP (инструкции LD, ADD, ADC, SBC, INC и DEC).

Регистровые операнды записываются в инструкциях явным образом. Однако явная запись имени регистра ещё не свидетельствует об использовании регистровой адресации, поскольку в некоторых случаях применяется неявная адресация (например, в инструкциях PUSH и POP, работающих с индексными регистрами). В описании форматов кодов команд для однобайтовых регистров применяются обозначения r, r1, r2, для двухбайтовых регистров и регистровых пар – обозначение rr.



Регистры общего назначения


Микропроцессор Z80 содержит две идентичные группы (банка) из восьми 8-разрядных регистров в каждой. Эти регистры для краткости именуются регистрами общего назначения, что, однако, не совсем верно.

Каждый банк состоит из следующих регистров:

– аккумулятора A;

– регистра флагов F;

– регистров общего назначения B, C, D, E, H и L.

Регистры второго банка принято обозначать с помощью знака апострофа: A', B' и т.д. Функционально регистры обеих групп совершенно идентичны.

Подавляющее число инструкций микропроцессора оперирует с содержимым регистров первого (основного) банка. Имеются две инструкции (EXAF,AF' и EXX), которые позволяют обменять местами содержимое банков. Суммарное время выполнения этих двух команд составляет 8 тактов; время, необходимое для сохранения тех же самых регистров в стеке с помощью команд PUSH (как это традиционно делается в обработчиках прерывания для процессора 8080), составляет 44 такта; для восстановления содержимого регистров из стека командами POP требуется 40 тактов.

Аккумулятор A используется во всех основных арифметико-логических операций и содержит один из операндов, а также результат операции.

Регистры общего назначения  используются вместе с аккумулятором в байтовых арифметико-логических операциях, храня второй операнд. Кроме того, имеются инструкции инкремента и декремента содержимого этих регистров. Регистр B, помимо всего прочего, используется в качестве счётчика в инструкции организации циклов DJNZ.

Регистры общего назначения могут логически объединяться в три пары BC, DE и HL, применяющиеся для хранения и обработки 16-разрядных адресов и операндов (старший байт находится соответственно в регистре B, D и H, а младший – в C, E и L). Особенно часто это свойство используется для регистровой пары HL, поскольку система команд включает полный набор арифметико-логических операций между содержимым аккумулятора и ячейкой памяти, адрес которой находится в этой регистровой паре (в системе команд микропроцессора 8080 для обозначения такого операнда использовался “псевдорегистр” M).
Правда, арифметико-логические операции возможны и над операндами, адреса которых хранятся в индексных регистрах, но коды этих команд занимают 3 байта памяти вместо одного, а для их выполнения требуется 19 тактов вместо семи.

Адрес в регистровой паре BC может применяться в командах пересылки 8-разрядных операндов, а также в операциях ввода-вывода. Кроме того, содержимое регистровой пары BC используется в качестве счётчика в инструкциях обработки блоков данных. Адрес в регистровой паре DE используется в командах пересылки 8-разрядных операндов и обработки блоков данных.

Регистр флагов F состоит из нескольких отдельных разрядов, имеющих самостоятельное значение. Он имеет следующий формат:

----T---T---T---T---T---T---T---¬

¦ S ¦ Z ¦   ¦ H ¦   ¦P/V¦ N ¦ C ¦

L---+---+---+---+---+---+---+----

7                           0

Назначение разрядов регистра флагов следующее.

S (разряд 7) – флаг знака. Принимает значение 1, если старший (знаковый) разряд результата операции равен единице.

Z (разряд 6) – флаг нуля. Устанавливается, когда при выполнении операции был получен нулевой результат.

Разряд 5 не используется.

H (разряд 4) – флаг вспомогательного переноса. Устанавливается, когда операция сложения или вычитания вызывает соответственно перенос из 3-го разряда в 4-й или заём из 4-го разряда в 3-й. Используется при выполнении операций десятичной коррекции инструкцией DAA.

Разряд 3 не используется.

P/V (разряд 2) – этот флаг в зависимости от операции является либо признаком переполнения (V), либо признаком чётного результата (P). В первом случае он устанавливается, если при выполнении операции произошло переполнение, и сбрасывается при отсутствии такового. Во втором случае он устанавливается, если в результате присутствует чётное число единичных разрядов, и сбрасывается, если единиц нечётное число.

N (разряд 1) – флаг операции вычитания. Устанавливается, если предыдущая операция была операцией вычитания, и сбрасывается в противном случае. Используется инструкцией DAA при выполнении десятичной коррекции результата.

C (разряд 0) устанавливается, если при выполнении операции сложения произошёл перенос из старшего разряда или если при выполнении операции вычитания произошёл заём в старший разряд. В инструкциях сдвига во флажок переноса заносится значение выдвигаемого разряда.

При выполнении некоторых инструкций те или иные флаги регистра F устанавливаются или сбрасываются по особым правилам. Сведения об имеющихся особенностях приводятся в описании системы команд.


Счётчик команд


16-разрядный счётчик команд PC содержит адрес следующей команды, подлежащей выполнению. Когда очередная команда выбрана из памяти, его значение увеличивается на длину кода команды. При выполнении инструкций переходов содержимое счётчика команд замещается на адрес перехода; при выполнении команды вызова подпрограммы или при прерывании текущее содержимое PC сохраняется в стеке.



Шина адреса


Микропроцессор Z80 имеет 16 адресных выходов A15–A0 (номера выводов 5–1, 40–30 соответственно). Активный уровень – высокий; линии имеют три состояния.



Шина данных


У микропроцессора имеется 8 двунаправленных выводов с тремя состояниями D7–D0 (номера выводов 13, 10, 9, 7, 8, 12, 15 и 14 соответственно). Активный уровень – высокий.



Шина питания


Микропроцессор Z80 использует единственное напряжение питания +5 В, подаваемое на вывод 11. “Земля” подаётся на вывод 29.



Шина синхронизации и управления


Шина синхронизации и управления микропроцессора Z80 включает 14 линий.

Вход C (вывод 6) – сигнал синхронизации. Когда синхроимпульсы вырабатываются ТТЛ-схемами, рекомендуется подключать линию C к напряжению +5 В через резистор сопротивлением 330 Ом.

Вход INT# (вывод 16) – сигнал запроса маскируемого прерывания. Активный уровень низкий. Допускается соединение нескольких сигналов запросов прерываний от различных устройств по схеме “монтажное И”.

Вход NMI# (вывод 17) – сигнал запроса немаскируемого прерывания. Активный уровень низкий.

Выход HALT# (вывод 18) – сигнал перехода процессора в состояние останова в ответ на выполнение инструкции HALT. Активный уровень низкий. Хотя выполнение инструкций прекращается до поступления запроса прерывания, циклы регенерации памяти выполняются по-прежнему.

Выход с тремя состояниями MREQ# (вывод 19) – сигнал обращения к памяти. Активный уровень низкий. Выдаётся при любом обращении к памяти для чтения или записи.

Выход с тремя состояниями IORQ# (вывод 20) – сигнал обращения к устройству ввода-вывода. Активный уровень низкий. Выдаётся при любом обращении к портам ввода-вывода, а также в цикле подтверждения запроса маскируемого прерывания.

Выход с тремя состояниями RD# (вывод 21) – сигнал чтения. Активный уровень низкий. Выдаётся при обращении к памяти или порту ввода-вывода для получения информации.

Выход с тремя состояниями WR# (вывод 22) – сигнал записи. Активный уровень низкий. Выдаётся при обращении к памяти или порту ввода-вывода для записи информации.

Выход BUSAK# (вывод 23) – сигнал разрешения захвата шины. Активный уровень низкий. Выдаётся микропроцессором, когда он разрешает какому-либо устройству захватить шину микропроцессорной системы, при этом все выходы микропроцессора с тремя состояниями переходят в состояние высокого импеданса.

Вход WAIT# (вывод 24) – сигнал запроса ожидания. Активный уровень низкий. Блок памяти или внешнее устройство, к которому микропроцессор производит обращение, выдаёт этот сигнал, если требуется “растянуть” цикл чтения или записи информации на несколько тактов.
Этот сигнал удерживается устройством в активном состоянии, пока оно не будет готово выполнить запрошенную операцию обмена данными.

Вход BUSRQ# (вывод 25) – сигнал запроса захвата шины. Активный уровень низкий. Устройство выдаёт этот сигнал, когда хочет выполнить цикл обмена данными с памятью или другим устройством без участия микропроцессора. Когда микропроцессор разрешает захват шины, он выдаёт сигнал BUSAK#.

Вход RESET# (вывод 26) – сигнал сброса процессора. Активный уровень низкий. Этот сигнал переводит процессор в начальное состояние: в регистр счётчика команд PC заносится нулевое значение; флаги разрешения маскируемых прерываний и режима обработки маскируемых прерываний IFF1, IFF2, IMFa и IMFb сбрасываются; регистры I и R очищаются. Сигнал RESET# должен оставаться активным в течение не меньше 3 тактов.

Выход с тремя состояниями M1# (вывод 27) – сигнал машинного цикла 1. Активный уровень низкий. Выдаётся, когда микропроцессор выполняет выборку первого байта кода команды или подтверждает запрос маскируемого прерывания.

Выход RFSH# (вывод 28) – сигнал регенерации памяти. Активный уровень – низкий. Микропроцессор выдаёт этот сигнал в цикле регенерации памяти, выполняющемся сразу после чтения первого байта кода очередной команды.


Система команд


Система команд микропроцессора Z80 насчитывает 158 инструкций, из которых 78 полностью повторяют (правда, зачастую с иной мнемоникой и другим способом записи операндов) команды процессора 8080, благодаря чему часто достигается полная переносимость программного обеспечения.



Система прерываний


Микропроцессор Z80 обслуживает два класса прерываний: немаскируемые и маскируемые (8080 имел единственный класс прерываний – маскируемые).



Указатель стека


16-разрядный регистр указателя стека SP содержит адрес текущей вершины стека. Как и в большинстве современных вычислительных систем, стек микропроцессора Z80 растёт вниз. При записи в стек содержимое SP уменьшается, и по полученному адресу выполняется запись. При выборке из стека после чтения данных содержимое SP увеличивается.

Информация заносится в стек и извлекается из него всегда порциями по два байта. Это, однако, не накладывает каких-либо ограничений на содержимое регистра SP.



Умножение 8-разрядных чисел


Вход: E – множимое; H – множитель.

Выход: HL – произведение.

Изменяемые регистры: B, D, E, H, L.

MULT: LD   B,8      ; Счётчик разрядов

      LD   D,0      ; Подготовка 16-разрядных полей множимого и

      LD   L,D      ; промежуточного результата/произведения

LOOP: ADD  HL,HL    ; Сдвиг HL влево на один разряд

      JR   NC,DECB  ; Если флаг C = 0, очередной разряд

                    ; множителя равен нулю, сложение не нужно

      ADD  HL,DE    ; Прибавление множимого

DECB: DJNZ LOOP     ; Повторение, пока не обработаны все биты

      RET           ; Возврат



Умножение 16-разрядных чисел


Вход: BC – множимое; DE – множитель.

Выход: DEHL – произведение.

Во время работы подпрограммы аккумулятор используется в качестве счётчика разрядов.

MPY:  LD   HL,0000h ; Начальная инициализация произведения

      LD   A,16     ; Счётчик разрядов

LOOP: ADD  HL,HL    ; Сдвиг промежуточного результата влево

      EX   DE,HL

      ADC  HL,HL

      EX   DE,HL

      JR   NC,DECA  ; Если очередной разряд множителя равен 0,

                    ; сложение не требуется

      ADD  HL,BC    ; Прибавление множимого

      JR   NC,DECA

      INC  DEC

DECA: DEC  A        ; Уменьшение счётчика и повтор операции,

      JP   NZ,LOOP  ; пока не обработаны все разряды

      RET