Z80
読み:ゼッパチ
外語:Z80: ZiLOG 80
ZiLOG
によって開発された
8ビットマイクロプロセッサー
の一つ。1980年代に広く使われ、その後も組み込み用途で広く使われた、8ビットマイクロプロセッサーの代表である。
目次
概要
起源
普及
特徴
速度
機能
関連プロセッサー
ゲームボーイ
仕様
レジスターセット
フラグレジスター
命令セット
凡例
8ビットデータ移動命令
16ビットデータ移動命令
交換命令
ブロック命令
8ビット算術・論理演算命令
汎用算術演算、CPU制御命令
16ビット算術演算命令
ローテート・シフト命令
ビット操作命令
ジャンプ命令
サブルーチン命令
入出力命令
概要
起源
4004
、
8080
の設計で中心的な役割を果たした
嶋正利
が、まだ創立間もない
ZiLOG
社でエクソン社(ESSO)の資金を借りながら開発したプロセッサーである。
嶋正利がIntelで開発した8080と
ソフトウェア
上位互換を持たせつつ、単相クロック5V単一電源で動作し、DRAMのリフレッシュ回路を内蔵した。
普及
8ビットプロセッサーの代表であり、日本では
MSX
、
PC-6001
/
PC-8001
/
PC-8800シリーズ
などの著名機ほか、当時の数多くの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、RES)
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
用)
バイナリ非互換(独自仕様オペコード)
TLCS-90
‐ 東芝
TLCS-900
‐ 東芝
このほかにも、様々な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を裏表で交換することが出来、割り込み処理などで利用された。
フラグレジスター
フラグレジスター
は8ビットであり、次のような構成になっている。
bit 7 ‐ S サインフラグ (負か(1)、正か(0))
bit 6 ‐ Z
ゼロフラグ
(ゼロか(1)、否か(0))
bit 5 ‐ [未使用]
bit 4 ‐ H ハーフキャリーフラグ (BCD桁上がり計算用)
bit 3 ‐ [未使用]
bit 2 ‐ P/V パリティー/オーバーフローフラグ (命令により、パリティまたはオーバーフローをセット)
bit 1 ‐ N サブトラクトフラグ (直前が加算命令なら0クリア、減算命令なら1セット)
bit 0 ‐ C
キャリーフラグ
(桁上がり、桁下がり)
命令セット
凡例
凡例は次の通り。
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 (HL)
RL (IX+d)
RL (IY+d)
レジスターまたはメモリーの内容とキャリーフラグを連結したものを左ローテートする
RLAは8080にもあるが、それ以外はZ80で追加された。RLAとRL Aは、フラグ変化に差がある
RLCA
RLC r
RLC (HL)
RLC (IX+d)
RLC (IY+d)
レジスターまたはメモリーの内容を左ローテートする。最上位ビットのあふれ分は、キャリーフラグにも格納される
RLCAは8080にもあるが、それ以外はZ80で追加された。RLCAとRLC Aは、フラグ変化に差がある
(RLC: Rotate Left Circular)
RRA
RR r
RR (HL)
RR (IX+d)
RR (IY+d)
レジスターまたはメモリーの内容とキャリーフラグを連結したものを右ローテートする
RRAは8080にもあるが、それ以外はZ80で追加された。RRAとRR Aは、フラグ変化に差がある
RRCA
RRC r
RRC (HL)
RRC (IX+d)
RRC (IY+d)
レジスターまたはメモリーの内容を右ローテートする。最下位ビットのあふれ分は、キャリーフラグにも格納される
RRCAは8080にもあるが、それ以外はZ80で追加された。RRCAとRRC Aは、フラグ変化に差がある
(RRC: Rotate Right Circular)
SLA r
SLA (HL)
SLA (IX+d)
SLA (IY+d)
レジスターまたはメモリーの内容を左に算術シフトする。Z80で追加
SRA r
SRA (HL)
SRA (IX+d)
SRA (IY+d)
レジスターまたはメモリーの内容を右に算術シフトする。Z80で追加
SRL r
SRL (HL)
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しか使えない
再検索