Расширенный набор инструкций Z80
Это общий список инструкций Z80 и Z80N с описаниями. Инструкции, специфичные для Z80N, имеют описания кодов операций в первую очередь.
Для просмотра таблицы с краткими сведениями без дополнительных описаний, см. Таблица инструкций Z80. Также есть специальный поиск кодов операций в той же таблице и внешняя матрица значений кодов операций Z80N на specnext.dev.
Содержание
- Коды операций инструкций Z80N
- Обозначения
- Манипуляции с регистрами и данными
- Блочное копирование
- Блочный поиск
- Арифметика
- Управление потоком
- Замечание о некоторых особенностях Z80-N
- Ошибки
Коды операций инструкций Z80N
Это таблица инструкций и кодов операций всех специфичных для Next инструкций Z80:
Инструкция | Кодировка (2-4 байта) (hex) | T-состояния | Описание | 4 буквы |
---|---|---|---|---|
SWAPNIB | ED 23 | 8 | Меняет местами полубайты (4 бита) в A | SWAP |
MIRROR A | ED 24 | 8 | Зеркально отражает биты 0..7 в 7..0 регистра A | MIRR |
TEST $im8 | ED 27 value | 11 | Изменяет флаги как AND A, но A остается неизменным | TEST |
BSLA DE,B | ED 28 | 8 | Сдвиг влево DE на B битов | BSLA |
BSRA DE,B | ED 29 | 8 | Сдвиг вправо знакового DE на B битов | BSRA |
BSRL DE,B | ED 2A | 8 | Сдвиг вправо DE на B битов | BSRL |
BSRF DE,B | ED 2B | 8 | Сдвиг вправо DE, заполняя 1 на B битов | BSRF |
BRLC DE,B | ED 2C | 8 | Циклический сдвиг влево DE на B битов | BRLC |
MUL D,E | ED 30 | 8 | Умножает D на E, результат в DE | MUL |
ADD HL,A | ED 31 | 8 | Добавляет беззнаковое A к HL | ADD |
ADD DE,A | ED 32 | 8 | Добавляет беззнаковое A к DE | ADD |
ADD BC,A | ED 33 | 8 | Добавляет беззнаковое A к BC | ADD |
ADD HL,$im16 | ED 34 low high | 16 | Добавляет константу к HL | ADD |
ADD DE,$im16 | ED 35 low high | 16 | Добавляет константу к DE | ADD |
ADD BC,$im16 | ED 36 low high | 16 | Добавляет константу к BC | ADD |
PUSH $im16 | ED 8A high low | 23 | Помещает константу в стек | PUSH |
OUTINB | ED 90 | 16 | OUTI, но не изменяет B | OTIB |
NEXTREG $im8,$im8 | ED 91 register value | 20 | Записывает v в регистр Next r | NREG |
NEXTREG $im8,A | ED 92 register | 17 | Записывает A в регистр Next r | NREG |
PIXELDN | ED 93 | 8 | HL как адрес пикселя смещается на строку вниз | PXDN |
PIXELAD | ED 94 | 8 | HL := как адрес пикселя ULA из D==Y E==X | PXAD |
SETAE | ED 95 | 8 | Получает A как маску для пикселя ULA из E | STAE |
JP (C) | ED 98 | 13 | IN (C), затем переходит к 64-байтовой секции | JP |
LDIX | ED A4 | 16 | Расширенное копирование байта LDI | LDIX |
LDWS | ED A5 | 14 | Копирование байта как для Layer 2 | LDWS |
LDDX | ED AC | 16 | Расширенное копирование байта LDD | LDDX |
LDIRX | ED B4 | 21/16 | Расширенное LDIR | LIRX |
LDPIRX | ED B7 | 21/16 | Копирование байта как для заполнения шаблоном | LPRX |
LDDRX | ED BC | 21/16 | Расширенное LDDR | LDRX |
Ниже приведены дополнительные сведения и пояснения всех инструкций Z80, реализованных в ЦП Next Z80.
Примечания:
- Кодировка операнда
PUSH $im16
уникальна: это единственный операнд, закодированный как big-endian. - Значения времени (T-состояния) основаны на ограниченном тестировании и могут быть неточными.
- Более короткие псевдонимы официальных мнемоник (колонка с 4 буквами) предлагаются в инициативе, возглавляемой Мэттом Дэвисом, автором ассемблера, редактора и отладчика Odin для ZX Next.
- Соответствующим ранним источником для этой таблицы может быть редакция комментария к Christmas 2018 в обсуждении issue 312 z88dk.
Обозначения
- В описаниях любой 8-битный регистр означает A, B, C, D, E, H и L. Регистры с именами F, I и R не входят в этот набор, даже если технически это 8-битные регистры. Кроме того, IXH, IXL, IYH, IYL, которые являются старшей и младшей частями байта IX и IY, могут использоваться в некоторых инструкциях в качестве 8-битных регистров, хотя это не было задокументировано для оригинального Z80.
- IXY означает IX или IY.
- Для поля состояния:
- S означает Стандарт. Это есть в руководстве Z80. Все должно это поддерживать.
- U означает Незадокументированное. Он работает на чипах Z80, но отсутствует в руководстве. Они известны годами и были признаны Zilog, поэтому они должны работать на всем, но некоторые ассемблеры могут изменять синтаксис.
- E означает Расширение. Он работает только на ядре Z80 на Next. Вероятно, он будет принят только ассемблерами, которые были обновлены специально для Next.
- Каждый из эффектов флага задокументирован следующим образом:
- - означает, что флаг не изменен.
- 1 или 0 означает, что флаг установлен или сброшен соответственно.
- ? означает, что мы не знаем, какое влияние инструкция оказывает на флаг.
- ! означает, что инструкция оказывает необычное влияние на флаг, который задокументирован в описании.
- S означает, что эффект на флаг является “стандартным”. C устанавливается, если произошел перенос/заем за пределы MSB; Z устанавливается, если результат операции равен нулю; H устанавливается, если произошел перенос/заем за пределы бита 3.
- P, V и L используются для флага P/V, который имеет несколько стандартных эффектов. P означает, что это четность. V означает, что это переполнение. L означает, что он проверяет BC в качестве счетчика циклов для некоторых инструкций блочного копирования и поиска: P/V = (BC != 0)
Манипуляции с регистрами и данными
LD (Загрузка)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LD r, r’ | Регистр | Регистр | S | - | - | - | - | - | - | 4 | r := r’ |
LD r,n | Регистр | Непосредственно | S | - | - | - | - | - | - | 7 | r := n |
LD r, (HL) | Регистр | Косвенно | S | - | - | - | - | - | - | 7 | r := HL* |
LD r, (IXY+d) | Регистр | Индексно | S | - | - | - | - | - | - | 19 | r := (IXY+d)* |
LD (HL),r | Косвенно | Регистр | S | - | - | - | - | - | - | 7 | HL* := r |
LD (IXY+d),r | Индексно | Регистр | S | - | - | - | - | - | - | 19 | (IXY+D)* := r |
LD (HL), n | Косвенно | Непосредственно | S | - | - | - | - | - | - | 10 | HL* := n |
LD (IXY+d), n | Индексно | Непосредственно | S | - | - | - | - | - | - | 19 | (IXY+d)* := n |
LD A, (BC/DE) | Аккумулятор | Косвенно | S | - | - | - | - | - | - | 7 | A := rr* |
LD A, (nn) | Аккумулятор | Адрес | S | - | - | - | - | - | - | 13 | A := (nn)* |
LD (BC/DE), A | Косвенно | Аккумулятор | S | - | - | - | - | - | - | 7 | rr* := A |
LD (nn), A | Адрес | Аккумулятор | S | - | - | - | - | - | - | 13 | (nn)* := A |
LD A, I | Аккумулятор | Регистр | S | - | 0 | ! | 0 | S | S | 9 | A := I; P/V:=IFF2 |
LD A, R | Аккумулятор | Регистр | S | - | 0 | ! | 0 | S | S | 9 | A := R; P/V:=IFF2 |
LD I, A | Регистр | Аккумулятор | S | - | - | - | - | - | - | 9 | I := A |
LD R, A | Регистр | Аккумулятор | S | - | - | - | - | - | - | 9 | R := A |
LD BC/DE/HL/SP, nn | Регистр | Непосредственно | S | - | - | - | - | - | - | 10 | rr := nn |
LD IXY, nn | Регистр | Непосредственно | S | - | - | - | - | - | - | 14 | rr := nn |
LD HL, (nn) | Регистр | Адрес | S | - | - | - | - | - | - | 16 | HL := (nn)* |
LD BC/DE/SP/IXY, (nn) | Регистр | Адрес | S | - | - | - | - | - | - | 20 | rr := (nn)* |
LD (nn), HL | Адрес | Регистр | S | - | - | - | - | - | - | 16 | (nn)* := HL |
LD (nn), BC/DE/SP/IXY | Адрес | Регистр | S | - | - | - | - | - | - | 20 | (nn)* := rr |
LD SP, HL | Регистр | Регистр | S | - | - | - | - | - | - | 6 | SP := HL |
LD SP, IXY | Регистр | Регистр | S | - | - | - | - | - | - | 10 | SP := IXY |
Основная инструкция загрузки/передачи данных. Передает данные из места, указанного вторым аргументом, в место, указанное первым. Доступны следующие комбинации:
- Любой 8-битный регистр может быть:
- загружен непосредственным значением;
- загружен содержимым любого другого 8-битного регистра, кроме I и R;
- загружен содержимым или сохранен в памяти, на которую указывает HL;
- загружен содержимым или сохранен в памяти, индексированной со смещением по IX или IY.
- Кроме того, аккумулятор A (только) может быть:
- загружен содержимым или сохранен в памяти, на которую указывает BC или DE;
- загружен содержимым или сохранен в памяти, на которую указывает непосредственный адрес;
- загружен содержимым I или R.
- Любая 16-битная пара регистров может быть:
- загружена непосредственным значением;
- загружена содержимым или сохранена в памяти, на которую указывает непосредственный адрес.
- Кроме того, SP (только) может быть:
- загружен содержимым HL, IX или IY.
- Запланированная ld hl, sp еще не добралась до Next, одним из возможных обходных путей является: ld hl,0; add hl,sp;
- Памяти, на которую ссылается HL или через IX, можно присваивать непосредственные значения.
Хотя 16-битные пары регистров нельзя напрямую перемещать между собой, их можно перемещать, перемещая два 8-битных регистра. (SP получает особый случай, потому что к нему нельзя обратиться через 8-битные регистры.) Некоторые ассемблеры предоставят встроенные макро-инструкции, позволяющие, например, ld bc, de.
Инструкции LD не изменяют никаких флагов, если I или R не загружены в A.
EX (EXchange - Обмен)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
EX DE, HL | Регистр | Регистр | S | - | - | - | - | - | - | 4 | swap(DE,HL) |
EX AF, AF’ | Регистр | Регистр | S | ! | ! | ! | ! | ! | ! | 4 | swap(AF,AF’) |
EX (SP), HL | Косвенно | Регистр | S | - | - | - | - | - | - | 19 | swap(SP*,HL) |
EX (SP), IXY | Косвенно | Регистр | S | - | - | - | - | - | - | 23 | swap(SP*,IXY) |
Обменивает содержимое двух источников. Единственными разрешенными комбинациями являются
- Обмен DE и HL;
- Обмен AF и AF’;
- Обмен HL, IX или IY с содержимым памяти, на которую указывает SP.
EXX (EXchange all - Обменять все)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
EXX | - | - | S | - | - | - | - | - | - | 4 | swap(BC,BC’);swap(DE,DE’);swap(HL,HL’) |
Обменивает BC, DE и HL с их теневыми регистрами. AF и AF’ не обмениваются.
PUSH
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
PUSH BC/DE/HL/AF | Регистр | - | S | - | - | - | - | - | - | 11 | SP-=2; SP*:=rr |
PUSH IXY | Регистр | - | S | - | - | - | - | - | - | 15 | SP-=2; SP*:=rr |
PUSH nn | Непосредственно | - | E | - | - | - | - | - | - | 23 | SP-=2; SP*:=nn |
Помещает данный аргумент в стек. Это может быть любая 16-битная пара регистров, кроме SP. SP уменьшается на 2, а затем аргумент записывается в новое место, на которое указывает SP.
POP
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
POP BC/DE/HL | Регистр | - | S | - | - | - | - | - | - | 10 | rr:=SP*; SP+=2 |
POP AF | Регистр | - | S | ! | ! | ! | ! | ! | ! | 10 | rr:=SP*; SP+=2 |
POP IXY | Регистр | - | S | - | - | - | - | - | - | 14 | rr:=SP*; SP+=2 |
Удаляет данный аргумент из стека. Это может быть любая 16-битная пара регистров, кроме SP. Текущее значение в SP копируется в пару регистров, а затем SP увеличивается на 2.
При извлечении в AF значение регистра флагов F устанавливается непосредственно в младшие 8 бит значения из стека.
Блочное копирование
LDI (Загрузка и инкремент)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDI | - | - | S | - | 0 | L | 0 | - | - | 16 | DE*:=HL*; DE++; HL++; BC— |
Копирует байт, на который указывает HL, по адресу, на который указывает DE, затем добавляет 1 к DE и HL и вычитает 1 из BC. P/V устанавливается в (BC!=0), то есть устанавливается, когда не равно нулю.
LDIR (Загрузка и инкремент повторно)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDIR | - | - | S | - | 0 | L | 0 | - | - | 21x+16 | do LDI while(BC>0) |
Автоматически зацикливает LDI, пока BC не достигнет нуля. Обратите внимание, что последняя итерация начинается, когда BC=1, и заканчивается с BC=0 (запуск LDIR с BC=0 запустит передачу 64 киБ, скорее всего, перезаписав важные части системной памяти и/или самого кода).
Эффекты флагов такие же, как и у LDI, за исключением того, что P/V всегда будет сброшен, потому что BC по определению достигает 0 до того, как эта инструкция завершится (обычно - если что-то не перезаписывает код операции LDIR, пока BC>0).
Прерывания могут прервать инструкцию LDIR во время цикла (после завершения каждой отдельной части LDI), и LDIR возобновится после этого и правильно завершит цикл.
LDD (Загрузка и декремент)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDD | - | - | S | - | 0 | L | 0 | - | - | 16 | DE*:=HL*; DE—; HL—; BC— |
То же, что и LDI, но вычитает 1 из DE и HL вместо добавления.
LDDR (Загрузка и декремент повторно)
| Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx | | -------- | ----------------- | ----------------- | ------ | --- | --- | 0 | 0 | - | - | 21x+16 | do LDD while(BC>0) |
То же, что и LDIR, но зацикливает LDD вместо LDI.
LDWS
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDWS | - | - | E | - | 0 | ! | S | S | S | 14 | DE*:=HL*; INC L; INC D; |
Расширенный код операции, только для Next. Копирует байт, на который указывает HL, по адресу, на который указывает DE, и увеличивает только L и D. Это используется для вертикального копирования байтов на дисплей Layer 2.
Флаги идентичны тем, которые были бы произведены инструкцией INC D.
Обратите внимание, что данные источника считываются только из одного 256-байтового (выровненного) блока памяти, поскольку увеличивается только L, а не HL.
LDIX, LDIRX, LDDX, LDDRX
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDIX | - | - | E | - | - | - | - | - | - | 16 | {if HL*!=A DE*:=HL*;} DE++; HL++; BC— |
LDIRX | - | - | E | - | - | - | - | - | - | 21/16 | do LDIX while(BC>0) |
LDDX | - | - | E | - | - | - | - | - | - | 16 | {if HL*!=A DE*:=HL*;} DE++; HL—; BC— |
LDDRX | - | - | E | - | - | - | - | - | - | 21/16 | do LDDX while(BC>0) |
Расширенные коды операций только для Next. Ведут себя аналогично своим не-X эквивалентам, за исключением того, что байт не копируется, если он равен A, и LDDX/LDDRX продвигают DE, увеличивая его (как LDI), в то время как HL уменьшается (как LDD).
Второе отличие от не-X инструкций (как обычно, только с кодами операций следующего поколения из-за реализации), расширенные не изменяют какие-либо флаги.
LDPIRX
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
LDPIRX | - | - | E | - | - | - | - | - | - | 21/16 | do{t:=(HL&$FFF8+E&7); {if t!=A DE:=t;} DE++; BC—}while(BC>0) |
Аналогично LDIRX, за исключением того, что адрес байта источника не просто HL, а получается с использованием 13 старших битов HL и 3 младших битов DE, и HL не увеличивается в течение всего цикла (HL работает как базовый адрес выровненной таблицы поиска из 8 байтов, DE работает как назначение, а также оберточный индекс 0..7 в таблицу). Это предназначено для функциональности “заполнения шаблоном”.
Блочный поиск
CPI (Сравнить и инкрементировать)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
CPI | - | - | S | - | 1 | L | S | ! | S | 16 | HL*==A?; HL++; BC— |
Сравнивает байт, на который указывает HL, с содержимым A и устанавливает Z, если он совпадает, или устанавливает S, если сравнение становится отрицательным. Затем добавляет 1 к HL и вычитает 1 из BC. P/V устанавливается в (BC!=0), то есть устанавливается, когда не равно нулю.
CPIR (Сравнить и инкрементировать повторно)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
CPIR | - | - | S | - | 1 | L | S | ! | S | 21x+16 | do CPI while (!Z && BC>0) |
Автоматически зацикливает CPI, пока либо не будет установлен Z (A будет найдено в байте, на который указывает HL), либо P/V не будет сброшен (BC достигнет 0).
Эффекты флага такие же, как и у CPI, за исключением того, что одно из двух завершающих условий флага всегда будет истинным.
CPD (Сравнить и декрементировать)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
CPD | - | - | S | - | 1 | L | S | ! | S | 16 | HL*==A?; HL—; BC— |
То же, что и CPI, но вычитает 1 из HL вместо добавления.
CPDR (Сравнить и декрементировать повторно)
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
CPDR | - | - | S | - | 1 | L | S | ! | S | 21x+16 | do CPD while (!Z && BC>0) |
То же, что и CPIR, но зацикливает CPD вместо CPI.
Арифметика
ADD
Мнемоника | Режим адресации 1 | Режим адресации 2 | Статус | C | N | PV | H | Z | S | T-состояния | shortfx |
---|---|---|---|---|---|---|---|---|---|---|---|
ADD A, r | Аккумулятор | Регистр | S | S | 0 | V | S | S | S | 4 | A+=r |
ADD A, n | Аккумулятор | Непосредственно | S | S | 0 | V | S | S | S | 7 | A+=n |
ADD A, (HL) | Аккумулятор | Косвенно | S |
Этот документ неполный и вскоре будет пересоздан