Z80

読み:ゼッパチ
読み:ぜっとはちまる
読み:ぜっとはちじゅう
外語:Z80: ZiLOG 80
品詞:商品名,@部品

ZiLOGによって開発された8ビットマイクロプロセッサの一つ。1980年代に広く使われ、今でも組み込み用途で広く使われている、8ビットマイクロプロセッサの代表である。

起源

40048080の設計で中心的な役割を果たした嶋正利が、まだ創立間もないZiLOG社でエクソン社(ESSO)の資金を借りながら開発したプロセッサである。

嶋正利がIntelで開発した8080とソフトウェア上位互換を持たせつつ、単相クロック5V単一電源で動作し、DRAMのリフレッシュ回路を内蔵した。

普及

8ビットプロセッサの代表であり、日本ではMSXPC-6001/PC-8001/PC-8801シリーズなどの著名機ほか、当時の数多くの8ビットパソコンに搭載され、高度な技術者を多数生んだ。

またゲームセンター用のゲーム基板にも数多く利用された。日本のアーケードゲームでは、初期のナムコがZ80×3構成を好んで使っていた。例えばゼビウスなどがそうである。

その価格の安さと使いやすさから、さまざまな装置の制御用CPUとしても重宝された。

速度

Z80のオリジナルは、クロック周波数2.5MHzで動作した。その高速版は、末尾のアルファベットで識別される。

  • Z80 ‐ 2.5MHz
  • Z80A ‐ 4MHz
  • Z80B ‐ 6MHz
  • Z80H ‐ 8MHz

多くのZ80搭載機はZ80A相当が使われた。MSXのFS-A1FX、WX、WSXの三機種にはZ80Bが搭載され5.38MHzで動作する。

Z80Hは軍事用Z80とも呼ばれる高速版。シャープ製のものはZ80Eとされている。

機能

8080との命令上の違いに、次のようなものがある(順不同)。

  • インデックスレジスタ(IX・IY)の追加
  • 裏表あるレジスタ群
  • 割り込みベクタレジスタIの追加
  • リフレッシュカウンタレジスタRの追加
  • ビット操作命令の追加 (BIT、SET、RST)
  • Aレジスタ以外でのローテート命令の追加
  • シフト命令の追加(算術、論理) (8080はローテートのみで、シフト命令がなかった)
  • HL以外の16ビットレジスタに対する移動命令、加減算命令を追加
  • NEG命令(2の補数を求める)を追加 (1の補数を求めるCPL命令は8080にもある)
  • 割り込みモードの追加
  • RLD/RRD命令の追加 (BCD用命令)
  • 相対ジャンプ命令(JR命令)の追加
  • 割り込みからのリターン命令(RETI、RETN)の追加
  • レジスタ間接のI/O入出力命令を追加 (IN r,(C)など)
  • ブロック命令を追加 (LDx、CPx、INx、OUTx)

8080やZ80はAF/BC/DE/HLという4つの16ビットレジスタを持っているが、Z80では同じレジスタをもう一組用意し、命令で相互に切り替えて裏表として利用できるという特徴を持っている。PUSH/POPより高速なので、割り込み処理でよく使われる。

IX/IYレジスタ命令は、8080にもあったHLレジスタ命令の前にプリフィックスを置くという拡張法が採用された。本来は16ビットレジスタが想定されていたIX/IYレジスタだったが、このプリフィックスをHレジスタやLレジスタの命令の前に置くと、IX/IYレジスタを8ビット単位で利用できるという、命令表に無い「隠し命令」が存在した。

またこの特徴から、HLレジスタとIX/IYレジスタを直接代入することが出来ない(LD IX, HLなどはできず、一旦スタック等を経由する必要がある)。

関連プロセッサ

Z80は広く使われたため、様々な互換プロセッサや高速プロセッサ、拡張プロセッサが登場している。

パソコン用としては現役を退いた後も、制御機器の組み込み用プロセッサとして利用された。

  • バイナリ互換(上位互換、下位互換)
    • Z180 ‐ ZiLOG純正
    • Z280 ‐ ZiLOG純正
    • Z380 ‐ ZiLOG純正
    • (Z800) ‐ ZiLOG純正
    • Z8000 ‐ ZiLOG純正
    • eZ80(Z80190) ‐ ZiLOG純正
    • HD64180 ‐ 日立製作所
    • TMSZ84C ‐ 東芝
    • KC80 ‐ 川崎マイクロエレクトロニクス(川崎製鉄から分社)
    • KC160 ‐ 川崎マイクロエレクトロニクス(川崎製鉄から分社)
    • R800 ‐ ASCII(MSXturboR用)
  • バイナリ非互換(独自仕様オペコード)

このほかにも、様々なZ80互換あるいはZ80風プロセッサが作られ、使われている。

ゲームボーイ

任天堂のゲームボーイゲームボーイカラーはZ80(というよりは8080)のカスタム版を使用している。

Z80と比較して、裏レジスタとインデックスレジスタ(IX・IY)が無い。ゆえにEXX命令も無い。

フラグレジスタも簡略化され、削られたフラグに関する条件ジャンプや条件リターン命令も削られているほか、命令コードの体系も変更されている。

その代わり、LD命令が拡張されたり、SWAP rなど新命令が追加されたりしている。

レジスタセット

Z80は、次のレジスタを持つ。

  • A、F、B、C、D、E、H、L
  • A'、F'、B'、C'、D'、E'、H'、L'
  • IX、IY
  • PC
  • SP
  • R (リフレッシュカウンタ)
  • I (割り込みベクタレジスタ)

A、B、C、D、E、H、Lは、8080の同名のレジスタと同じ機能を有する。Fは、8080上位互換のフラグレジスタである。

'が付いたレジスタは「裏レジスタ」と呼ばれ、Z80から追加された。命令によりA/F、またはBC/DE/HLを裏表で交換することが出来、割り込み処理などで利用された。

命令セット

凡例は次の通り。

  • r ‐ 8ビットレジスタA、B、C、D、E、H、L
  • ss ‐ 16ビットレジスタBC、DE、HL、SP (ソース)
  • dd ‐ 16ビットレジスタBC、DE、HL、SP (デスティネーション)
  • qq ‐ 16ビットレジスタBC、DE、HL、AF
  • n ‐ 8ビットの即値
  • nn ‐ 16ビットの即値
  • b ‐ ビット位置(0から7)
  • d ‐ インデックスレジスタのオフセット(符号付き8ビット)
  • e ‐ プログラムカウンタのオフセット(符号付き8ビット)
  • cc ‐ 条件NZ、Z、NC、C、PO、PE、P、M

以下は8080にある命令も含む。Z80で追加された命令には注釈を入れた。

8ビットデータ移動命令

LD r,r'
8ビットレジスタ間の代入
LD r,n
8ビットレジスタへの即値代入
LD r,(HL)
HLレジスタで示すアドレスのメモリの内容をレジスタに代入
LD r,(IX+d)
LD r,(IY+d)
IX/IYレジスタ+オフセットで示すアドレスのメモリの内容をレジスタに代入。Z80で追加
LD (HL),r
レジスタの内容をHLレジスタで示すアドレスのメモリに代入
LD (IX+d),r
LD (IY+d),r
レジスタの内容をIX/IYレジスタ+オフセットで示すアドレスのメモリに代入。Z80で追加
LD (HL),n
即値をHLレジスタで示すアドレスのメモリに代入
LD (IX+d),n
LD (IY+d),n
即値をIX/IYレジスタ+オフセットで示すアドレスのメモリに代入。Z80で追加
LD A,(BC)
BCレジスタで示すアドレスのメモリの内容をAレジスタに代入
LD A,(DE)
DEレジスタで示すアドレスのメモリの内容をAレジスタに代入
LD A,(nn)
指定されたアドレスのメモリの内容をAレジスタに代入
LD (BC),A
Aレジスタの内容をBCレジスタで示すアドレスのメモリに代入
LD (DE),A
Aレジスタの内容をDEレジスタで示すアドレスのメモリに代入
LD (nn),A
Aレジスタの内容を指定されたアドレスのメモリに代入
LD A,I
LD I,A
割り込みベクタレジスタとAレジスタ間の転送。Z80で追加
LD A,R
LD R,A
リフレッシュカウンタレジスタとAレジスタ間の転送。Z80で追加。Rは変動するため、擬似乱数の取得用によく使われた。但し互換CPUのR800では変動しない

16ビットデータ移動命令

LD dd,nn
16ビットレジスタBC、DE、HL、SPへの即値代入
LD IX,nn
LD IY,nn
16ビットレジスタIX、IYへの即値代入。Z80で追加
LD HL,(nn)
指定されたアドレスのメモリの内容をHLレジスタに代入
LD BC,(nn)
LD DE,(nn)
LD SP,(nn)
指定されたアドレスのメモリの内容をBC、DE、SPレジスタに代入。Z80で追加。8080はHLのみ可能だった
LD IX,(nn)
LD IY,(nn)
指定されたアドレスのメモリの内容をIX、IYレジスタに代入。Z80で追加
LD (nn),HL
HLレジスタの内容を指定されたアドレスのメモリに代入
LD (nn),BC
LD (nn),DE
LD (nn),SP
BC、DE、SPレジスタの内容を指定されたアドレスのメモリに代入。Z80で追加。8080はHLのみ可能だった
LD (nn),IX
LD (nn),IY
IX、IYレジスタの内容を指定されたアドレスのメモリに代入。Z80で追加
LD SP,HL
HLレジスタの内容をSPレジスタに代入
LD SP,IX
LD SP,IY
IX、IYレジスタの内容をSPレジスタに代入。Z80で追加
PUSH qq
BC、DE、HL、AFレジスタの内容をスタックにプッシュする
PUSH IX
PUSH IY
IX、IYレジスタの内容をスタックにプッシュする。Z80で追加
POP qq
スタックトップの内容をBC、DE、HL、AFレジスタにポップする
POP IX
POP IY
スタックトップの内容をIX、IYレジスタにポップする。Z80で追加

交換命令

EX DE,HL
DEレジスタとHLレジスタの内容を交換する
EX AF,AF'
AFレジスタとAF'レジスタの内容を交換する。Z80で追加
EXX
BC、DE、HLレジスタとBC'、DE'、HL'レジスタの内容を交換する。Z80で追加
EX (SP),HL
HLレジスタとスタックトップの内容を交換する
EX (SP),IX
EX (SP),IY
IX、IYレジスタとスタックトップの内容を交換する。Z80で追加

ブロック命令

LDI/LDD/LDIR/LDDR
ブロック転送命令。HLレジスタが指すメモリ内容を、DEレジスタが指すメモリアドレスへ転送する。Rなしは一回、R付きはBCレジスタの回数繰り返す。IはDE、HLレジスタをインクリメント、Dはデクリメントする。Z80で追加
CPI/CPD/CPIR/CPDR
ブロック検索命令。HLレジスタが指すメモリ内容とAレジスタの内容を比較する。Rなしは一回、R付きはBCレジスタの回数繰り返す。IはHLレジスタをインクリメント、Dはデクリメントする。Z80で追加

I/Oポートに対するブロック命令は、後述する入出力命令の項を参照のこと。

8ビット算術・論理演算命令

ADD A,r
8ビットレジスタの内容をAレジスタに加算する
ADD A,n
8ビットの即値をAレジスタに加算する
ADD A,(HL)
HLレジスタで示すアドレスのメモリの内容をAレジスタに加算する
ADD A,(IX+d)
ADD A,(IY+d)
IX/IYレジスタ+オフセットで示すアドレスのメモリの内容をAレジスタに加算する。Z80で追加
ADC A,s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、キャリーフラグを足す以外はADD命令と同じ
SUB s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、引き算をする以外はADD命令と同じ
ちなみに、16ビットのSUB命令は存在しないため、デスティネーションの「A,」は記述しない
SBC A,s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、キャリーフラグを引く以外はSUB命令と同じ
AND s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、論理積を求める以外はADD命令と同じ
OR s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、論理和を求める以外はADD命令と同じ
XOR s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、排他的論理和を求める以外はADD命令と同じ
CP s
sはr、n、(HL)、(IX+d)、(IY+d)のいずれかで、比較をする。結果をAに代入しない以外はSUB命令と同じ
INC r
8ビットレジスタの内容を1つ増分する
INC (HL)
HLレジスタで示すアドレスのメモリの内容を1つ増分する
INC (IX+d)
INC (IY+d)
IX/IYレジスタ+オフセットで示すアドレスのメモリの内容を1つ増分する。Z80で追加
DEC d
dはr、(HL)、(IX+d)、(IY+d)で、1つ減分する以外はINC命令と同じ

汎用算術演算、CPU制御命令

DAA
Aレジスタの内容をBCD補正する
CPL
Aレジスタの内容をビット反転(1の補数)する
NEG
Aレジスタの2の補数を求める。Z80で追加
CCF
キャリーフラグの内容を反転する (※注意※ 0にするのではない)
SCF
キャリーフラグの内容を1にする
NOP
何もしない
HALT
CPUの動作を停止し、割り込みの発生を待つ
DI
割り込みを禁止する
EI
割り込みを許可する
IM 0
IM 1
IM 2
割り込みモードを0〜2に設定する。Z80で追加

16ビット算術演算命令

ADD HL,ss
16ビットレジスタBC、DE、HL、SPの内容をHLレジスタに加算する
ADD IX,pp
16ビットレジスタBC、DE、IX、SPの内容をIXレジスタに加算する。Z80で追加
ADD IY,rr
16ビットレジスタBC、DE、IY、SPの内容をIYレジスタに加算する。Z80で追加
ADC HL,ss
16ビットレジスタBC、DE、HL、SPの内容とキャリーフラグをHLレジスタに加算する。Z80で追加。16ビットADDは8080にもあったが、16ビットADCは無かった
SBC HL,ss
16ビットレジスタBC、DE、HL、SPの内容とキャリーフラグをHLレジスタから減算する。Z80で追加。なお、8080にもZ80にも、16ビットSUB命令は存在しない
INC ss
16ビットレジスタBC、DE、HL、SPの内容を1つ増分する
INC IX
INC IY
16ビットレジスタIX、IYの内容を1つ増分する。Z80で追加
DEC ss
16ビットレジスタBC、DE、HL、SPの内容を1つ減分する
DEC IX
DEC IY
16ビットレジスタIX、IYの内容を1つ減分する。Z80で追加

ローテート・シフト命令

RLA
RL r
RL (IX+d)
RL (IY+d)
レジスタまたはメモリの内容を左ローテートする。最上位ビットのあふれ分は、キャリーフラグにも格納される
RLAは8080にもあるが、それ以外はZ80で追加された。RLAとRL Aは、フラグ変化に差がある
RLCA
RLC r
RLC (IX+d)
RLC (IY+d)
レジスタまたはメモリの内容をとキャリーフラグを連結したものを左ローテートする
RLCAは8080にもあるが、それ以外はZ80で追加された。RLCAとRLC Aは、フラグ変化に差がある
RRA
RR r
RR (IX+d)
RR (IY+d)
レジスタまたはメモリの内容をを右ローテートする。最下位ビットのあふれ分は、キャリーフラグにも格納される
RRAは8080にもあるが、それ以外はZ80で追加された。RRAとRR Aは、フラグ変化に差がある
RRCA
RRC r
RRC (IX+d)
RRC (IY+d)
レジスタまたはメモリの内容をとキャリーフラグを連結したものを右ローテートする
RRCAは8080にもあるが、それ以外はZ80で追加された。RRCAとRRC Aは、フラグ変化に差がある
SLA r
SLA (IX+d)
SLA (IY+d)
レジスタまたはメモリの内容を左に算術シフトする。Z80で追加
SRA r
SRA (IX+d)
SRA (IY+d)
レジスタまたはメモリの内容を右に算術シフトする。Z80で追加
SRL r
SRL (IX+d)
SRL (IY+d)
レジスタまたはメモリの内容を右に論理シフトする。Z80で追加
RLD
RRD
Aレジスタの下位4ビットと(HL)を連結したものを、4ビット単位で左右にローテートする。BCD用命令。Z80で追加

ビット操作命令

BIT b,r
BIT b,(HL)
BIT b,(IX+d)
BIT b,(IY+d)
レジスタまたはメモリの内容の指定ビットをテストする。内容の反転をゼロフラグに格納。Z80で追加
SET b,r
SET b,(HL)
SET b,(IX+d)
SET b,(IY+d)
レジスタまたはメモリの内容の指定ビットを1にする。Z80で追加
RES b,r
RES b,(HL)
RES b,(IX+d)
RES b,(IY+d)
レジスタまたはメモリの内容の指定ビットを0にする。Z80で追加

ジャンプ命令

JP nn
指定の番地にジャンプする
JP cc,nn
条件付きジャンプ命令
JR e
無条件相対ジャンプ。Z80で追加
JR C,e
JR NC,e
JR Z,e
JR NZ,e
条件付き相対ジャンプ。Z80で追加
JP (HL)
HLの内容をPCに代入する。つまり、HL番地にジャンプする
JP (IX)
JP (IY)
IX、IYの内容をPCに代入する。つまり、IX、IY番地にジャンプする。Z80で追加
DJNZ e
Bを1減分し、非0なら相対ジャンプする。ループ用。Z80で追加

サブルーチン命令

CALL nn
指定の番地をコールする
CALL cc,nn
条件付きコール命令
RET
リターンする
RET cc
条件付きリターン命令
RETI
割り込みからのリターン。Z80で追加
RETN
NMIからのリターン。Z80で追加
RST p
割り込み処理。pは0〜7で、p×8番地をコールする

入出力命令

IN A,(n)
指定I/OアドレスからAレジスタに入力する
IN r,(C)
BCレジスタで指定されるI/Oアドレスからレジスタに入力する。Z80で追加
Cレジスタだけと思われがちだが、実際には、アドレスバスにはBCレジスタの内容が出力される
INI/IND/INIR/INDR
ブロック入力命令。BCレジスタが指すI/Oアドレスから、HLレジスタが指すメモリアドレスへ入力する。Rなしは一回、R付きはBレジスタの回数繰り返す。IはHLレジスタをインクリメント、Dはデクリメントする。Z80で追加
この命令では、アドレスは実質Cしか使えない
OUT (n),A
Aレジスタから指定I/Oアドレスに出力する
OUT (C),r
レジスタからBCレジスタで指定されるI/Oアドレスに出力する。Z80で追加
Cレジスタだけと思われがちだが、実際には、アドレスバスにはBCレジスタの内容が出力される
OUTI/OUTD/OTIR/OTDR
ブロック出力命令。HLレジスタが指すメモリアドレスから、BCレジスタが指すI/Oアドレスへ出力する。Rなしは一回、R付きはBレジスタの回数繰り返す。IはHLレジスタをインクリメント、Dはデクリメントする。Z80で追加
この命令では、アドレスは実質Cしか使えない