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


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


Инструкции 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, после чего производится переход на начало соответствующей подпрограммы.
Ни одна из инструкций перехода не оказывает влияния на состояние флажков.