Z80
読み:ゼッパチ
外語:Z80: ZiLOG 80

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

概要

起源
 40048080の設計で中心的な役割を果たした嶋正利が、まだ創立間もないZiLOG社でエクソン社(ESSO)の資金を借りながら開発したプロセッサーである。
 嶋正利がIntelで開発した8080とソフトウェア上位互換を持たせつつ、単相クロック5V単一電源で動作し、DRAMのリフレッシュ回路を内蔵した。

普及
 8ビットプロセッサーの代表であり、日本ではMSXPC-6001/PC-8001/PC-8800シリーズなどの著名機ほか、当時の数多くの8ビットパソコンに搭載され、高度な技術者を多数生んだ。
 またゲームセンター用のゲーム基板にも数多く利用された。日本のアーケードゲームでは、初期のナムコがZ80×3構成を好んで使っていた。例えばゼビウスなどがそうである。
 その価格の安さと使いやすさから、さまざまな装置の制御用CPUとしても重宝された。

特徴

速度
 Z80のオリジナルは、クロック周波数2.5MHzで動作した。その高速版は、末尾のアルファベットで識別される。
 多くのZ80搭載機はZ80A相当が使われた。MSXのFS-A1FX、WX、WSXの三機種にはZ80Bが搭載され5.38MHzで動作する。
 Z80Hは軍事用Z80とも呼ばれる高速版。シャープ製のものはZ80Eとされている。

機能
 8080との命令上の違いに、次のようなものがある(順不同)。
 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は広く使われたため、様々な互換プロセッサーや高速プロセッサー、拡張プロセッサーが登場している。
 パソコン用としては現役を退いた後も、制御機器の組み込み用プロセッサーとして利用された。
 このほかにも、様々なZ80互換あるいはZ80風プロセッサーが作られ、使われている。

ゲームボーイ
 任天堂のゲームボーイゲームボーイカラーはZ80(というよりは8080)のカスタム版を使用している。
 Z80と比較して、裏レジスターとインデックスレジスター(IX・IY)が無い。ゆえにEXX命令も無い。
 フラグレジスターも簡略化され、削られたフラグに関する条件ジャンプや条件リターン命令も削られているほか、命令コードの体系も変更されている。
 その代わり、LD命令が拡張されたり、SWAP rなど新命令が追加されたりしている。

仕様

レジスターセット
 Z80は、次のレジスターを持つ。
 A、B、C、D、E、H、Lは、8080の同名のレジスターと同じ機能を有する。Fは、8080上位互換のフラグレジスターである。
 'が付いたレジスターは「裏レジスター」と呼ばれ、Z80から追加された。命令によりA/F、またはBC/DE/HLを裏表で交換することが出来、割り込み処理などで利用された。

フラグレジスター
 フラグレジスターは8ビットであり、次のような構成になっている。

命令セット

凡例
 凡例は次の通り。
 以下は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しか使えない

再検索