Операции сдвига
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 является признаком чётности результата).