ZiLOGによって開発された8ビットマイクロプロセッサーの一つ。1980年代に広く使われ、その後も組み込み用途で広く使われた、8ビットマイクロプロセッサーの代表である。
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は広く使われたため、様々な互換プロセッサーや高速プロセッサー、拡張プロセッサーが登場している。
パソコン用としては現役を退いた後も、制御機器の組み込み用プロセッサーとして利用された。
- バイナリ互換(上位互換、下位互換)
- バイナリ非互換(独自仕様オペコード)
このほかにも、様々な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しか使えない
関連する用語
ZiLOG
嶋正利
4004
8008
8080
8085
CPU
オペコード (Z80)