戻る

Z80


Zilog Z80
Data 8/16bit / Address Bus 16bit
Cycle 2.5MHz〜20.0MHz
(1976)

●Z80の型番

「Z80」は末尾の文字により周波数が異なる。

CMOS版「Z80」は末尾の数字により周波数が異なる。

発展型:アスキー「R800」
内部16bit、高速化などの改良がなされている。
「MSX turboR」のCPUである。

後継型:「Z180」
日立「HD64180Z」の改良型。

後継型:「Z280」→「Z800」
後継型:「Z380」
16/32bit CPU。
商業的には以下略。

後継型:「Z800」
16bit CPUとして大幅に変更されているが商業的には失敗し(懲りてない)、少量がリリースされた。
同じ16bitの「Z8000」との互換性はない。

後継型:「eZ80」
「Z80」とバイナリ互換性がある。
8bit CPUながら3ステージの「パイプライン」を持っており、最大50MHzで駆動する。
モードによっては16bitレジスタ群は24bitに拡張される。

●Z80のピン配列

A111 40A10
A122 39A9
A133 38A8
A144 37A7
A155 36A6
CLK6 35A5
D47 34A4
D38 33A3
D59 32A2
D610 31A1
+5V11 30A0
D212 29GND
D713 28RFSH
D014 27M1
D115 26RESET
INT16 25BUSRQ
NMI17 24WAIT
HALT18 23BUSACK
MREQ19 22WR
IORQ20 21RD

●Z80の命令

命令(ニーモニック)は以下の構成となっている。

  ニーモニック [DEST[,SRC]]

データの流れは「DEST」←「SRC」となる。

「Z80」は「i8080」の拡張セットであるが、ニーモニックの表記は「i8080」と異なる。
「i8080」に比べるとニーモニックにレジスタ名やフラグ名が入るような表記ではなく、ニーモニックとオペランドの指定がはっきりしているのが特徴。
(転送先と転送元の表記が統一されているので理解がしやすい)

「r」は8bit汎用レジスタ「A,B,C,D,E,H,L,(HL)」を表す
 「´」付のレジスタは裏レジスタを表す
「rr」は16bitレジスタ「BC,DE,HL」を表す
「rl」は16bitレジスタ「BC,DE,HL,SP」を表す
「rp」は16bitレジスタ「BC,DE,SP」を表す
「rx」は16bitレジスタ「BC,DE,IX,SP」を表す
「PC」は16bitレジスタである「プログラムカウンタ」(PC)を表す
「e」は符号化8bitでプログラムカウンタの変位を表す(相対ジャンプ用)
「IX」は16bitレジスタである「インデックスレジスタ」(IX,IY)を表す
 インデックスレジスタは高級言語における「配列」の位置を表す
 (Z80の場合は16bit=2bytesの単位となる)
「d」は符号化8bitでインデックスレジスタの変位を表す
「R」は8bitレジスタである「プログラムカウンタ」を表す
「I」は8bitレジスタである「割込ベクタレジスタ」を表す
「f」はフラグ「S,Z,H,P/V,N,C」を表す(フラグはフラグレジスタとして扱われる)
 フラグは演算結果の状態を表す

  bit7「S」 :最上位bit(MSB)が「1」の場合、成立 (負数)
  bit6「Z」 :「0」の場合、成立
  bit5「H」 :算術演算のbit3/4間(Half)でAUX 桁あふれ(Carry)、桁の繰り下がり(Borrow)があった場合、成立
  bit3「P/V」:パリティ/オーバーフローの場合、成立
  bit1「N」 :減算があった場合、成立
  bit0「C」 :Carry、もしくはBorrowがあった場合、成立

※「n」は8bit、「nn」は16bitのイミディエイト値(Immediate Operand)を表す
※「aa」は16bitアドレス値を表す
※「e」は8bit相対アドレス値を表す
※「b」はbit位置(0〜7)を表す

●転送命令

ニーモニックオペランド動作
LD r,r 8bitデータレジスタ間のデータ転送 (メモリアクセス用の「M」同士では行えない)
LD r,n 8bit指定レジスタへ8bitイミディエイト値をロード(読込)
LD rr,nn 16bit指定レジスタへ16bitイミディエイト値をロード
LD A,(aa) 「A」レジスタに16bit指定アドレスの値をロード
LD (aa),A 「A」レジスタから16bit指定アドレスに値をストア(格納)
LD HL,(aa) 「HL」レジスタに16bit指定アドレスの値をロード
LD (aa),HL 「HL」レジスタから16bit指定アドレスに値をストア(格納)
LD A,(r) 「A」レジスタに8bit指定レジスタ(r=B->BC,D->DE)が示すアドレスの値をロード
LD (r),A 「A」レジスタから8bit指定レジスタが示すアドレスに値をストア
LD SP,HL 「HL」レジスタの内容を「SP」レジスタに転送
EX DE,HL 「DE」レジスタの内容と「SP」レジスタの値を交換
↓以下Z80拡張
LD r,(IX+d) 8bit指定レジスタにインデックスアドレッシングでの指定アドレスの値をロード (「HL」は指定不可)
LD (IX+d),r 8bit指定レジスタからインデックスアドレッシングでの指定アドレスに値をストア (「HL」は指定不可)
LD (IX+d),n 8bitイミディエイト値をインデックスアドレッシングでの指定アドレスにストア
LD IX,nn インデックスレジスタに16bitイミディエイト値をロード
LD IX,(nn) インデックスレジスタに16bit指定アドレスの値をロード
LD (nn),IX インデックスレジスタから16bit指定アドレスに値をストア
LD rp,(nn) 16bit指定レジスタに16bit指定アドレスの値をロード
LD (nn),rp 16bit指定レジスタから16bit指定アドレスに値をストア
LD SP,IX インデックスレジスタの値を「SP」レジスタに転送
EX AF,AF' 「AF」レジスタと「AF'」レジスタを交換
EXX 「BC,DE,HL」レジスタと「BC',DE',HL'」レジスタを交換
LD A,I 「A」レジスタに割込ベクタレジスタから転送
LD I,A 「A」レジスタから割込ベクタレジスタに転送
LD A,R 「A」レジスタにリフレッシュレジスタから転送
LD R,A 「A」レジスタからリフレッシュレジスタに転送

●算術演算命令

ニーモニックオペランド動作
ADDA,r 8bit指定レジスタの値を「A」レジスタに加算
ADDA,n 8bitイミディエイト値を「A」レジスタに加算
ADCA,r 8bit指定レジスタの値と「C」フラグの値を「A」レジスタに加算
ADCA,n 8bitイミディエイト値と「C」フラグの値を「A」レジスタに加算
SUBA,r 8bit指定レジスタの値を「A」レジスタから減算
SUBA,n 8bitイミディエイト値を「A」レジスタから減算
SBCA,r 8bit指定レジスタの値と「C」フラグの値を「A」レジスタから減算
SBCA,n 8bitイミディエイト値と「C」フラグの値を「A」レジスタから減算
CP r 8bit指定レジスタの値を「A」レジスタから減算するが、結果はストアしない(=比較)
CP n 8bitイミディエイト値を「A」レジスタから減算するが、結果はストアしない
INCr 8bit指定レジスタの値をインクリメント
DECr 8bit指定レジスタの値をデクリメント
INCrr 16bit指定レジスタの値をインクリメント
DECrr 16bit指定レジスタの値をデクリメント
ADDHL,rr8bit指定レジスタの値を「HL」レジスタに加算
DAA 「A」レジスタをBCD(Binary-Coded Decimal:二進化十進)補正
↓以下Z80拡張
ADDIX,rx16bit指定レジスタの値をインデックスレジスタに加算
ADCHL,rl16bit指定レジスタの値と「C」フラグの値を「HL」レジスタに加算
SBCHL,rl16bit指定レジスタの値と「C」フラグの値を「HL」レジスタから減算
INCIX インデックスレジスタの値をインクリメント
DECIX インデックスレジスタの値をデクリメント
NEG 「A」レジスタの値から2の補数(MSBの1桁上を1とした数値[Z80の場合256]から減算)を取った結果をストア

●論理演算命令

ニーモニックオペランド動作
ANDr8bit指定レジスタの値と「A」レジスタの論理積
ANDn8bitイミディエイト値と「A」レジスタの論理積
OR r8bit指定レジスタの値と「A」レジスタの論理和
OR n8bitイミディエイト値と「A」レジスタの論理和
XORr8bit指定レジスタの値と「A」レジスタの排他的論理和
XORn8bitイミディエイト値と「A」レジスタの排他的論理和
CPL 「A」レジスタの内容を反転

●ローテート・シフト命令

ニーモニックオペランド動作
RLCA 「A」レジスタの値と「C」フラグを連結して左ローテート
RRCA 「A」レジスタの値と「C」フラグを連結して右ローテート
RLA 「A」レジスタの値を左ローテート
RRA 「A」レジスタの値を右ローテート
↓以下Z80拡張
RLCr 8bit指定レジスタの値と「C」フラグを連結して左ローテート
RLC(IX+d)インデックスアドレッシングでの指定アドレスの値と「C」フラグを連結して左ローテート
RRCr 8bit指定レジスタの値と「C」フラグを連結して右ローテート
RRC(IX+d)インデックスアドレッシングでの指定アドレスの値と「C」フラグを連結して右ローテート
RL r 8bit指定レジスタの値を左ローテート
RL (IX+d)インデックスアドレッシングでの指定アドレスの値を左ローテート
RR r 8bit指定レジスタの値を右ローテート
RR (IX+d)インデックスアドレッシングでの指定アドレスの値を右ローテート
RLDr 「A」レジスタ下位4bitの内容と「HL」レジスタを連結して4bit単位で左ローテート (BCD用)
RRD(IX+d)「A」レジスタ下位4bitの内容と「HL」レジスタを連結して4bit単位で右ローテート (BCD用)
SLAr 8bit指定レジスタの値を左算術シフト
SLA(IX+d)インデックスアドレッシングでの指定アドレスの値を左算術シフト
SRAr 8bit指定レジスタの値を右算術シフト
SRA(IX+d)インデックスアドレッシングでの指定アドレスの値を右算術シフト
SRLr 8bit指定レジスタの値を右論理シフト
SRL(IX+d)インデックスアドレッシングでの指定アドレスの値を右論理シフト

●ビット操作命令 (Z80拡張)

ニーモニックオペランド動作
BITb,r 8bit指定レジスタの指定bit位置の値をテスト (0|1判定)
BITb,(IX+d)インデックスアドレッシングでの指定アドレスの指定bit位置の値をテスト
SETb,r 8bit指定レジスタの指定bit位置の値を1にする (セット)
SETb,(IX+d)インデックスアドレッシングでの指定アドレスの指定bit位置の値を1にする
RESb,r 8bit指定レジスタの指定bit位置の値を0にする (リセット)
RESb,(IX+d)インデックスアドレッシングでの指定アドレスの指定bit位置の値を0にする

●分岐制御命令 (レジスタ、アドレス以外の第1オペランドはコンディション指定)

ニーモニックオペランド動作
JP aa 16bit指定アドレスにジャンプ
JP Nf,aa指定フラグ(f=Z,C)が0のとき、16bit指定アドレスにジャンプ
JP f,aa 指定フラグ(f=Z,C)が1のとき、16bit指定アドレスにジャンプ
JP PO,aa「P」フラグが0のとき、16bit指定アドレスにジャンプ
JP PE,aa「P」フラグが1のとき、16bit指定アドレスにジャンプ
JP P,aa 「S」フラグが0のとき、16bit指定アドレスにジャンプ
JP M,aa 「S」フラグが1のとき、16bit指定アドレスにジャンプ
JP (HL) 「HL」レジスタの値を「PC」に転送 (「HL」レジスタの示すアドレスにジャンプ)
CALLaa 16bit指定アドレスをサブルーチンコール
CALLNf,aa指定フラグ(f=Z,C)が0のとき、16bit指定アドレスをサブルーチンコール
CALLf,aa 指定フラグ(f=Z,C)が1のとき、16bit指定アドレスをサブルーチンコール
CALLPO,aa「P」フラグが0のとき、16bit指定アドレスをサブルーチンコール
CALLPE,aa「P」フラグが1のとき、16bit指定アドレスをサブルーチンコール
CALLP,aa 「S」フラグが0のとき、16bit指定アドレスをサブルーチンコール
CALLM,aa 「S」フラグが1のとき、16bit指定アドレスをサブルーチンコール
RST n n(0〜7)*8番地をコール(割込)
RET サブルーチンから復帰
RET Nf 指定フラグ(f=Z,C)が0のとき、サブルーチンから復帰
RET f 指定フラグ(f=Z,C)が1のとき、サブルーチンから復帰
RET PO 「P」フラグが0のとき、サブルーチンから復帰
RET PE 「P」フラグが1のとき、サブルーチンから復帰
RET P 「S」フラグが0のとき、サブルーチンから復帰
RET M 「S」フラグが1のとき、サブルーチンから復帰
↓以下Z80拡張
JP (IX) 「IX」レジスタの値を「PC」に転送 (「IX」レジスタの示すアドレスにジャンプ)
JP (IY) 「IY」レジスタの値を「PC」に転送 (「IY」レジスタの示すアドレスにジャンプ)
JR e 無条件8bit相対ジャンプ
JR Nf,e 指定フラグ(f=Z,C)が0のとき、無条件8bit相対ジャンプ
JR f,e 指定フラグ(f=Z,C)が1のとき、無条件8bit相対ジャンプ
DJNZe 「B」レジスタをデクリメントして0でなければ8bit相対ジャンプ (Decrement and Jump if Non Zero)
RETI 割込から復帰
RETN NMI(Non-Maskable Interrupt)からから復帰

●スタック操作命令 (対象は16bitレジスタのみ)

ニーモニックオペランド動作
PUSHrr 16bit指定レジスタの値を「SP」にプッシュ
PUSHAF 「AF」アドレスの値を「SP」にプッシュ
POP rr 16bit指定レジスタに「SP」からポップ
POP AF 「AF」アドレスに「SP」からポップ
EX (SP),HL「HL」レジスタと「SP」レジスタを交換
↓以下Z80拡張
PUSHIX 「IX」レジスタの値を「SP」にプッシュ
POP IX 「IX」レジスタに「SP」からポップ
EX (SP),IX「IX」レジスタと「SP」レジスタを交換

●フラグ操作命令 (対象は「C」フラグのみ)

ニーモニックオペランド動作
SCF 「C」フラグをセット
CCF 「C」フラグを反転

●入出力命令

ニーモニックオペランド動作
IN aa 指定I/Oアドレスの値を「A」レジスタに入力
OUTaa 指定I/Oアドレスに「A」レジスタの値を出力
↓以下Z80拡張 (「HL」レジスタ指定不可)
IN r,(C)「C」レジスタの示すI/Oアドレスから8bit指定レジスタに値を入力
OUT(C),r「C」レジスタの示すI/Oアドレスに8bit指定レジスタの値を出力

●CPU制御命令

ニーモニックオペランド動作
NOP 何もしない
HALT CPUを停止し、割込を待つ
DI 割込を禁止
EI 割込を許可
↓以下Z80拡張
IM n割込モード(n=0〜2)指定

●ブロック命令 (Z80拡張)

ニーモニックオペランド動作
LDI 「BC」レジスタの値をデクリメントし、「DE,HL」レジスタをインクリメント
「HL」レジスタの示すアドレスの値を「DE」レジスタの示すアドレスへ転送
LDD 「LDI」のデクリメント版
LDIR 「LDI」を「BC」レジスタの値が0になるまで実行
LDDR 「LDD」を「BC」レジスタの値が0になるまで実行
CPI 「BC」レジスタの値をデクリメントし、「A,HL」レジスタをインクリメント
「HL」レジスタの示すアドレスの値と「A」レジスタの示すアドレスの値を比較
CPD 「CPI」のデクリメント版
CPIR 「CPI」を「BC」レジスタの値が0になるまで実行
CPDR 「CPD」を「BC」レジスタの値が0になるまで実行
INI 「B」レジスタの値をデクリメントし、「C,HL」レジスタをインクリメント
「HL」レジスタの示すアドレスに「C」レジスタの示すI/Oアドレスの値を入力
IND 「INI」のデクリメント版
INIR 「INI」を「B」レジスタの値が0になるまで実行
INDR 「IND」を「B」レジスタの値が0になるまで実行
OUTI 「B」レジスタの値をデクリメントし、「C,HL」レジスタをインクリメント
「HL」レジスタの示すアドレスの値を「C」レジスタの示すI/Oアドレスに出力
OUTD 「OUTI」のデクリメント版
OTIR 「OUTI」を「B」レジスタの値が0になるまで実行
OTDR 「OUTD」を「B」レジスタの値が0になるまで実行

[TOPに戻る]