Архитектура системыРасширенный набор инструкций Z80

Расширенный набор инструкций Z80

Это общий список инструкций Z80 и Z80N с описаниями. Инструкции, специфичные для Z80N, имеют описания кодов операций в первую очередь.

Для просмотра таблицы с краткими сведениями без дополнительных описаний, см. Таблица инструкций Z80. Также есть специальный поиск кодов операций в той же таблице и внешняя матрица значений кодов операций Z80N на specnext.dev.

Содержание

Коды операций инструкций Z80N

Это таблица инструкций и кодов операций всех специфичных для Next инструкций Z80:

ИнструкцияКодировка (2-4 байта) (hex)T-состоянияОписание4 буквы
SWAPNIBED 238Меняет местами полубайты (4 бита) в ASWAP
MIRROR AED 248Зеркально отражает биты 0..7 в 7..0 регистра AMIRR
TEST $im8ED 27 value11Изменяет флаги как AND A, но A остается неизменнымTEST
BSLA DE,BED 288Сдвиг влево DE на B битовBSLA
BSRA DE,BED 298Сдвиг вправо знакового DE на B битовBSRA
BSRL DE,BED 2A8Сдвиг вправо DE на B битовBSRL
BSRF DE,BED 2B8Сдвиг вправо DE, заполняя 1 на B битовBSRF
BRLC DE,BED 2C8Циклический сдвиг влево DE на B битовBRLC
MUL D,EED 308Умножает D на E, результат в DEMUL
ADD HL,AED 318Добавляет беззнаковое A к HLADD
ADD DE,AED 328Добавляет беззнаковое A к DEADD
ADD BC,AED 338Добавляет беззнаковое A к BCADD
ADD HL,$im16ED 34 low high16Добавляет константу к HLADD
ADD DE,$im16ED 35 low high16Добавляет константу к DEADD
ADD BC,$im16ED 36 low high16Добавляет константу к BCADD
PUSH $im16ED 8A high low23Помещает константу в стекPUSH
OUTINBED 9016OUTI, но не изменяет BOTIB
NEXTREG $im8,$im8ED 91 register value20Записывает v в регистр Next rNREG
NEXTREG $im8,AED 92 register17Записывает A в регистр Next rNREG
PIXELDNED 938HL как адрес пикселя смещается на строку внизPXDN
PIXELADED 948HL := как адрес пикселя ULA из D==Y E==XPXAD
SETAEED 958Получает A как маску для пикселя ULA из ESTAE
JP (C)ED 9813IN (C), затем переходит к 64-байтовой секцииJP
LDIXED A416Расширенное копирование байта LDILDIX
LDWSED A514Копирование байта как для Layer 2LDWS
LDDXED AC16Расширенное копирование байта LDDLDDX
LDIRXED B421/16Расширенное LDIRLIRX
LDPIRXED B721/16Копирование байта как для заполнения шаблономLPRX
LDDRXED BC21/16Расширенное LDDRLDRX

Ниже приведены дополнительные сведения и пояснения всех инструкций 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СтатусCNPVHZST-состоянияshortfx
LD r, r’РегистрРегистрS------4r := r’
LD r,nРегистрНепосредственноS------7r := n
LD r, (HL)РегистрКосвенноS------7r := HL*
LD r, (IXY+d)РегистрИндексноS------19r := (IXY+d)*
LD (HL),rКосвенноРегистрS------7HL* := r
LD (IXY+d),rИндексноРегистрS------19(IXY+D)* := r
LD (HL), nКосвенноНепосредственноS------10HL* := n
LD (IXY+d), nИндексноНепосредственноS------19(IXY+d)* := n
LD A, (BC/DE)АккумуляторКосвенноS------7A := rr*
LD A, (nn)АккумуляторАдресS------13A := (nn)*
LD (BC/DE), AКосвенноАккумуляторS------7rr* := A
LD (nn), AАдресАккумуляторS------13(nn)* := A
LD A, IАккумуляторРегистрS-0!0SS9A := I; P/V:=IFF2
LD A, RАккумуляторРегистрS-0!0SS9A := R; P/V:=IFF2
LD I, AРегистрАккумуляторS------9I := A
LD R, AРегистрАккумуляторS------9R := A
LD BC/DE/HL/SP, nnРегистрНепосредственноS------10rr := nn
LD IXY, nnРегистрНепосредственноS------14rr := nn
LD HL, (nn)РегистрАдресS------16HL := (nn)*
LD BC/DE/SP/IXY, (nn)РегистрАдресS------20rr := (nn)*
LD (nn), HLАдресРегистрS------16(nn)* := HL
LD (nn), BC/DE/SP/IXYАдресРегистрS------20(nn)* := rr
LD SP, HLРегистрРегистрS------6SP := HL
LD SP, IXYРегистрРегистрS------10SP := 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СтатусCNPVHZST-состоянияshortfx
EX DE, HLРегистрРегистрS------4swap(DE,HL)
EX AF, AF’РегистрРегистрS!!!!!!4swap(AF,AF’)
EX (SP), HLКосвенноРегистрS------19swap(SP*,HL)
EX (SP), IXYКосвенноРегистрS------23swap(SP*,IXY)

Обменивает содержимое двух источников. Единственными разрешенными комбинациями являются

  • Обмен DE и HL;
  • Обмен AF и AF’;
  • Обмен HL, IX или IY с содержимым памяти, на которую указывает SP.

EXX (EXchange all - Обменять все)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
EXX--S------4swap(BC,BC’);swap(DE,DE’);swap(HL,HL’)

Обменивает BC, DE и HL с их теневыми регистрами. AF и AF’ не обмениваются.

PUSH

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
PUSH BC/DE/HL/AFРегистр-S------11SP-=2; SP*:=rr
PUSH IXYРегистр-S------15SP-=2; SP*:=rr
PUSH nnНепосредственно-E------23SP-=2; SP*:=nn

Помещает данный аргумент в стек. Это может быть любая 16-битная пара регистров, кроме SP. SP уменьшается на 2, а затем аргумент записывается в новое место, на которое указывает SP.

POP

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
POP BC/DE/HLРегистр-S------10rr:=SP*; SP+=2
POP AFРегистр-S!!!!!!10rr:=SP*; SP+=2
POP IXYРегистр-S------14rr:=SP*; SP+=2

Удаляет данный аргумент из стека. Это может быть любая 16-битная пара регистров, кроме SP. Текущее значение в SP копируется в пару регистров, а затем SP увеличивается на 2.

При извлечении в AF значение регистра флагов F устанавливается непосредственно в младшие 8 бит значения из стека.

Блочное копирование

LDI (Загрузка и инкремент)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
LDI--S-0L0--16DE*:=HL*; DE++; HL++; BC—

Копирует байт, на который указывает HL, по адресу, на который указывает DE, затем добавляет 1 к DE и HL и вычитает 1 из BC. P/V устанавливается в (BC!=0), то есть устанавливается, когда не равно нулю.

LDIR (Загрузка и инкремент повторно)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
LDIR--S-0L0--21x+16do 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СтатусCNPVHZST-состоянияshortfx
LDD--S-0L0--16DE*:=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СтатусCNPVHZST-состоянияshortfx
LDWS--E-0!SSS14DE*:=HL*; INC L; INC D;

Расширенный код операции, только для Next. Копирует байт, на который указывает HL, по адресу, на который указывает DE, и увеличивает только L и D. Это используется для вертикального копирования байтов на дисплей Layer 2.

Флаги идентичны тем, которые были бы произведены инструкцией INC D.

Обратите внимание, что данные источника считываются только из одного 256-байтового (выровненного) блока памяти, поскольку увеличивается только L, а не HL.


LDIX, LDIRX, LDDX, LDDRX

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
LDIX--E------16{if HL*!=A DE*:=HL*;} DE++; HL++; BC—
LDIRX--E------21/16do LDIX while(BC>0)
LDDX--E------16{if HL*!=A DE*:=HL*;} DE++; HL—; BC—
LDDRX--E------21/16do LDDX while(BC>0)

Расширенные коды операций только для Next. Ведут себя аналогично своим не-X эквивалентам, за исключением того, что байт не копируется, если он равен A, и LDDX/LDDRX продвигают DE, увеличивая его (как LDI), в то время как HL уменьшается (как LDD).

Второе отличие от не-X инструкций (как обычно, только с кодами операций следующего поколения из-за реализации), расширенные не изменяют какие-либо флаги.


LDPIRX

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
LDPIRX--E------21/16do{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СтатусCNPVHZST-состоянияshortfx
CPI--S-1LS!S16HL*==A?; HL++; BC—

Сравнивает байт, на который указывает HL, с содержимым A и устанавливает Z, если он совпадает, или устанавливает S, если сравнение становится отрицательным. Затем добавляет 1 к HL и вычитает 1 из BC. P/V устанавливается в (BC!=0), то есть устанавливается, когда не равно нулю.


CPIR (Сравнить и инкрементировать повторно)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
CPIR--S-1LS!S21x+16do CPI while (!Z && BC>0)

Автоматически зацикливает CPI, пока либо не будет установлен Z (A будет найдено в байте, на который указывает HL), либо P/V не будет сброшен (BC достигнет 0).

Эффекты флага такие же, как и у CPI, за исключением того, что одно из двух завершающих условий флага всегда будет истинным.


CPD (Сравнить и декрементировать)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
CPD--S-1LS!S16HL*==A?; HL—; BC—

То же, что и CPI, но вычитает 1 из HL вместо добавления.


CPDR (Сравнить и декрементировать повторно)

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
CPDR--S-1LS!S21x+16do CPD while (!Z && BC>0)

То же, что и CPIR, но зацикливает CPD вместо CPI.


Арифметика

ADD

МнемоникаРежим адресации 1Режим адресации 2СтатусCNPVHZST-состоянияshortfx
ADD A, rАккумуляторРегистрSS0VSSS4A+=r
ADD A, nАккумуляторНепосредственноSS0VSSS7A+=n
ADD A, (HL)АккумуляторКосвенноS

Этот документ неполный и вскоре будет пересоздан

Last updated on