╔═══════════════════════════════════════════════════════════╗
║ ▒▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒ ║
║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║
║ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒ ║
║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║
║ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ Z80 ║
╚═══════════════════════════════════════════════════════════╝
(Продолжение).
(C) WLODEK BLACK
00Ah. КОМАНДЫ СДВИГА.
Слово "сдвиг" идеально отражает сущность одноименных операций.
Содержимое регистра или ячейки памяти побитно сдвигается в сто-
рону старших ("влево") или младших ("вправо") разрядов. В зави-
симости от того, что происходит при этом с крайними (7-м и 0-м)
битами, различают циклические, арифметические и прочие сдвиги.
Имеется также весьма специфическая команда двоично-десятичного
сдвига.
Команды сдвига находят применение в преобразованиях данных из
параллельной формы в последовательную и наоборот, например, при
подготовке их к передаче по сетям связи; при побитной обработке
данных и так далее.
Циклические сдвиги.
Механизм циклического сдвига влево таков:
------------------->-------------------
| |
| |
Carry<------- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<---
Биты сдвигаются влево; бит 7 переходит в бит 0 и одновременно
копируется во флаг переноса C.Нетрудно вообразить происхождение
названия "циклический" для такого сдвига. Биты регистра действи-
тельно перемещаются по замкнутому кругу, а крайний бит попутно
копируется в признак переноса.
Аналогичный сдвиг вправо:
--> D7 ->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 -------->Carry
| |
| |
--------------------<----------------------
Основа мнемоники для команд циклического сдвига с ответвлением
в признак переноса - RLC (Rotate Left and to Carry) и RRC. Адре-
сация - все возможные варианты:
RLC A RLC H
RLC B RLC L
RLC C RLC (HL)
RLC D RLC (IX+nn) - 4-х байтовая команда.
RLC E RLC (IY+nn). Так же и для RRC.
Существенный нюанс: для аккумулятора имеются более короткие
команды RLCA и RRCA. Эти однобайтовые команды достались Z80 в
наследство от его прародителя Intel 8080,в котором сдвиги можно
было производить только в аккумуляторе. Команды RLCA и RLC A -
разные. RLC A - двухбайтовая команда процессора Z80; в этой
команде аккумулятор выступает как равный среди равных остальных
регистров. RLC A влияет на все флаги, а RLCA - только на флаг
переноса. Больше (кроме, конечно, длины и времени исполнения)
эти команды ничем не различаются.
RLC и RRC, выполняемые для других регистров и памяти, также вли-
яют на все флаги. Флаг P/V отражает четность результата.
Сдвиги через признак переноса - "обыкновенные" сдвиги.
"Обыкновенными" их можно назвать исходя из того, что в их мнемо-
никах присутствуют только обозначение сдвига и его направление:
RR, RL, RRA, RLA.
--------------------------->------------------------
: |
RL: : |
---Carry<- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<---
---------------------------<----------------------------
| |
RR:| |
---D7 ->D6 ->D5 -> D4 -> D3 -> D2 -> D1 -> D0 ->Carry---
В сдвигах типа RR и RL флаг переноса включен последовательно в
общую цепочку битов.
Существуют команды RLA и RRA, отличительные особенности которых
имеют ту же природу, что и для RLCA и RRCA. С флагами дела об-
стоят так же.
Следующие виды сдвигов в процессоре 8080 не были реализованы
и появились только в Z80. Поэтому для них не существует привиле-
гированной формы по отношению к аккумулятору.Все описанные ниже
команды допускают любую адресацию и влияют на все флаги.
Флаг P/V отражает четность.
Сдвиг влево типа SLA:
Carry<--- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<--- 0
SLA сдвигает байт влево; бит 7 выдвигается в признак переноса;
в бит 0 вдвигается 0.
Сдвиг вправо типа SRA (читается "Эс-Эр-Эй"):
->-
| |
| |
-<-D7 --->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 --->Carry
SRA сдвигает байт вправо; бит 7 копируется сам на себя и одно-
временно выдвигается в соседний бит 6, то есть как бы размножае-
тся; 0-й бит выдвигается в признак переноса.
SRA не является зеркальным отображением SLA.
А сдвиг типа SRL как раз им является:
0 --->D7 ->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 --->Carry.
На этом группа команд побитного сдвига исчерпывается.
Двоично-десятичные сдвиги RLD и RRD.
RLD: --------------->------------------
| |
| |
A: D7 D6 D5 D4 D3 D2 D1 D0 (HL): D7 D6 D5 D4 D3 D2 D1 D0
___________ ___________ ___________ ___________
не изм. | | | |
| | | |
----------<-------- ----<----
RRD: ------>------- ---->--
| | | |
| | | |
A: D7 D6 D5 D4 D3 D2 D1 D0 (HL): D7 D6 D5 D4 D3 D2 D1 D0
___________ ___________ ___________ ___________
не изм. | |
------------------<--------------------
Эти замысловатые сдвиги скорее напоминают пересылки четырехбито-
ых групп между аккумулятором и памятью.
В RLD движутся по кругу: младшая половина ячейки, адресуемой по
(HL),- в старшую половину; прежние 4 бита из старшей половины -
в младшие 4 бита аккумулятора; прежние младшие 4 бита аккумуля-
тора - в младшую половину (HL).
В RRD движение 4-битовых групп в (HL) идет вправо - старшая по-
ловина перемещается на место младшей, младшая половина перехо-
дит в аккумулятор, а младшая половина аккумулятора занимает мес-
то старшей половины (HL).
RLD и RRD влияют на флаги Z, P/V, S, отталкиваясь от содержимо-
го аккумулятора.
Флаг P/V отражает четность. Флаг C не изменяется.
Операция сдвига USPH (User's Shift by Phase) - сдвиг по фазе у
пользователя.
Возникает к концу дня после неудачной попытки с ходу понять,что
такое RLD.
Но шутки шутками, а:
что касается использования столь причудливых команд, как RLD и
RRD, то, помимо сомнительной двоично-десятичной арифметики (не
знаю, не пробовал и не собираюсь пробовать), они эффективны в
задаче печатания 64-символьных строк на 32-символьном экране
компьютера"Спектрум". Больше мне их никуда приткнуть не удалось.
[ Продолжение следует ].