╔═══════════════════════════════════════════════════════════╗ ║ ▒▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒ ║ ║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║ ║ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒ ║ ║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║ ║ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ 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-символьном экране компьютера"Спектрум". Больше мне их никуда приткнуть не удалось. [ Продолжение следует ].