Z80

出典: Wikipedio


thumb|Z80 CPU(1993年第45週製造品) Z80 は、米国ザイログ社によって製造された 8ビットマイクロプロセッサーである。1976年に発表され、1980年代の中頃までは、パーソナル・コンピューターCPUとしてなど、幅広い用途に使用された。以後も周辺デバイスを集積した製品が出されるなど、現在でも組み込み用途等、目に見えないところで多用されている。

目次

Z80の概要

嶋正利インテルを退社した8080の開発スタッフが設計を行っており、8080とはバイナリレベルで上位互換性がある。

ザイログ社オリジナルの製品としてクロック周波数が2.5MHzのZ80から20MHzの派生製品まで、各社からセカンドソースや互換製品が製造されている。現在では実チップではなく、FPGAASIC用のIPコアとして活用されている。パチンコの主基板向けプロセッサに使われているNECのμPD70008 IPをはじめ、商用の互換コアは20社以上存在し、オープンソースのIPコアも5種類以上存在している。

Z80とその互換CPUは、当初はより高速な8080互換CPUとして応用され、S-100バス互換機にもこぞって搭載されるなど、黎明期のパーソナルコンピューター市場を支配した。日本国内においても、1970年代の末から80年代前半頃にかけて、ビジネス用のオフィスコンピューターなどの他、各社のホビーパソコンにも搭載された。

また組み込み用としては21世紀に至るまで応用され続けて来ており、多数の機器に搭載されたほか、初期のゲーム専用機などにも搭載されていた。パチンコ・パチスロの抽選を司る主基板部分のコアCPUにはZ80ベースのカスタムLSIが使われており、もっとも消費量の多い分野の一つである。

8080が、それと組み合わせられる8251(USART)、8253(CTC/PIT)、8255(PPI)でファミリーを構成していたのに対応して、Z80SIO、Z80CTC、Z80PIOや、Z80DMAでZ-80ファミリーを構成する。また、これらを組み合わせたマイコンがある。

開発者の間では、しばしば「ぜっぱち」と略して呼ばれることが多い。しかし、同社ではZ8というCPUもあり、混同されることがある。

ハードウェアの仕様

Z80は、インテルIntel 8080マイクロプロセッサー の改良型といえる製品であり、他のIntel系CPUと同じくリトルエンディアンである。8080に対して、若干のアーキテクチャーの拡張、電源の 5V単一化、より高いクロック周波数への対応などが図られた。メモリー空間は16ビット(64KB)で、それ以上のメモリー空間を操作する場合には、MMUなどを追加しバンク切り替えなどを行う必要がある。

最大クロック周波数は、Z80が2.5MHz版、Z80Aが4MHz版、Z80Bが6MHz版、Z80EもしくはZ80Hが8MHz版、など、末尾のアルファベットの有無と種類で識別する。トランジスター数は8,200個。

8080からのアーキテクチャーの拡張では、DRAMの情報を維持(リフレッシュ)する機能の内蔵とそのためのレジスタの追加、8080では1組だった汎用レジスター群を、切り替えて使用できる表と裏の2組とし、また、IXとIYの2つのインデックスレジスターを使用したメモリー操作を含む命令の増強、割り込みモードの追加、ワイヤードロジックによる命令の実行、などが行われている。乗算除算命令は8080同様に存在しない。

また、本来16ビット固定のインデックスレジスターを8ビット単位に分割して使用できるなど、ロジックの設計上で派生したとおぼしき、命令表には存在しない隠し命令が存在した。これらの一部はZ280のマニュアル中で正式にドキュメント化されている。

アセンブラの仕様

8080に対して上位互換性を持ち、8080用のバイナリーをそのまま実行できるが、アセンブリプログラミングの際に命令を書き表すための「ニーモニック」は、8080のバイナリに対応する命令でもインテル版とザイログ版では全く異なっており、記述の容易さが勘案され、より整理されたものとなった。これは初心者にも判りやすいとされる反面、他のCPUのニモニックと比較して、アドレッシングモードがはっきりしない、という欠点もあった。オペランドの順番は、ディスティネーションが前でソースが後である。

特徴

8080との差別化のため、命令の1サイクル目(M1サイクル)では他のサイクルに比べて所要ステート数が少なくなっている。通常のサイクルが3ステート必要なのに対しM1サイクルでは2ステートである。仕様を見るとM1サイクルには4ステート必要なように見えるが、後半の2ステートはリフレッシュ機能のために使用され、通常のメモリーアクセスとは関係がない。

これは同じ命令を実行しても8080よりも高速に実行するためのZ80の売りの一つだったが、逆にこのM1サイクルだけのために速いメモリーが必要になり、ハードウェア設計者からは不評を買っていた。

Z80には「特定の命令の組み合わせを用いると、普通に命令を書いた場合よりも実行にかかるクロック数や命令の総バイト数を少なくできる」というテクニックが多数存在し、これらは「最適化」「クロック削り」などと呼ばれた。例えば、Z80にて追加されたブロック転送命令やインデックスレジスタ命令は、一連の処理に必要なプログラムコードのバイト数を節約できる反面、他の命令で代用する場合よりも所要クロック数が増大するといったデメリットもあり、命令のメモリ空間上の占有量と処理速度とのトレードオフの関係にあった。

またZ80は、同時期に新規に開発された他社製の8bitCPUと比較すると、相対ジャンプは可能であるもののジャンプ先の範囲が狭いなどリロケータブルな構成をとりづらく、バイナリー化したコードをリロケータブルに配置して動作させるドライバーやデバッガ、オペレーティングシステム等の環境を作るには不向きとされた。リロケータブルでない一般的なバイナリーは、配置アドレスを変更する度に再コンパイルや再リンクが必要となった。またアドレス参照時のオフセットも汎用レジスター使用時には指定できず、インデックスレジスター使用のオフセット指定も-128~0~127の範囲で制限されるため、C言語ポインタとの相性がよくない面があった。

なお、Z80にはアドレッシングモードが少ないこともあり、各命令コードを16進数で覚えることもそう難しくはなかった。ただし、Z80の場合、命令のビット配列は本来8進数で考えるのが妥当である。

レジスタセット

Template:右 A,B,C,D,E,H,Lは8080の同名レジスタと同じ機能を持つ。 Fは8080上位互換のフラグレジスターである。 Rはリフレッシュカウンタで、オリジナルのZ80では下位7ビットが変化し、読み出した際の最上位ビットの初期値は不定である。書き込んだ場合、最上位ビットが保存され、読み出すと最上位ビットは書き込んだ値が得られる(周辺LSI統合CPU・上位互換CPUでは8ビット全部使用するものもある。その場合は8ビット全部が変化し、書き込んでも最上位ビットは保存されない)。

命令セット

ここではZ80で追加された命令のみ示す。 8080からある命令についてはIntel 8080#命令セットを参照。 また、IXとIYについては同等の命令が存在するが、ここではIXのみを示す。

  • rは8ビットレジスタA,B,C,D,E,H,Lまたは(HL)を表す。
  • rrは16ビットレジスタBC,DE,HL,SPを表す。
  • rxは16ビットレジスタBC,DE,IX,SPを表す。
  • nは8ビットの即値を表す。
  • nnは16ビットの数値(即値またはメモリアドレス)を表す。
  • bはビット位置0~7を表す。
  • dはインデクスレジスタの変位(符号つき8ビット)を表す。
  • eはプログラムカウンタの変位(符号つき8ビット)を表す。

転送・交換命令

LD r,(IX+d)
LD (IX+d),r
インデクスレジスターを用いたメモリーとレジスターの転送。rに(HL)は指定できない。
LD (IX+d),n
メモリーに即値をストアする。
LD IX,nn
インデクスレジスターに即値をロードする。
LD IX,(nn)
メモリーの内容をインデクスレジスターにロードする。
LD (nn),IX
インデクスレジスターの内容をメモリーにストアする。
LD BC,(nn)
LD DE,(nn)
LD SP,(nn)
メモリーの内容を16ビットレジスターにロードする。8080ではHLレジスターでしかできなかった。
LD (nn),BC
LD (nn),DE
LD (nn),SP
16ビットレジスターの内容をメモリにストアする。8080ではHLレジスターでしかできなかった。
LD SP,IX
インデクスレジスターの内容をSPレジスターに転送する。
EX AF,AF'
AFレジスターとAF'レジスターを交換する。
EXX
BC,DE,HLレジスタとBC',DE',HL'レジスターを交換する。
LD A,I
LD I,A
割り込みベクタレジスターとAレジスターの転送。この命令を使用するときは、特にNMOS品の場合は注意が必要(この命令を実行中に割り込みがかかった場合、元の割り込み状態に関わらず割り込み禁止になる場合がある)。CMOS品にもこのバグがあるバージョンもある<ref name=int_bug>このバグはNMOS品は全般にある。CMOS品は東芝TMPZ84Cxx・日立HD64180 R0マスク・他にある。ザイログのものは修正されている。HD64180はR1マスクおよびZバージョンで修正済み。シャープLH5080も修正済みの模様。NEC μPD70008は不明。</ref>。
LD A,R
LD R,A
リフレッシュレジスターとAレジスターの転送。Rの下位7ビットは常に変動しているため、LD A,Rは簡易な乱数発生器としてよく使われる。

算術演算命令

ADD IX,rx
16ビットレジスターの内容をインデクスレジスターに加算する。
ADC HL,rr
16ビットレジスターの内容とCフラグをHLレジスターに加算する。ADD命令は8080から存在した。
SBC HL,rr
16ビットレジスターの内容とCフラグをHLレジスターから減算する。なお16ビットのSUB命令はない。そのため8ビットの算術演算命令のうちSUB命令だけAを表記しない。
INC IX
インデクスレジスターの内容をインクリメントする。
DEC IX
インデクスレジスターの内容をデクリメントする。
NEG
Aレジスターの2の補数をとる。

ローテート・シフト命令

RLC r
RLC (IX+d)
レジスターまたはメモリーの内容とCフラグを連結して左ローテートする。RLC Aと8080からあるRLCAとではフラグの変化が異なる。
RRC r
RRC (IX+d)
レジスターまたはメモリーの内容とCフラグを連結して右ローテートする。RRC Aと8080からあるRRCAとではフラグの変化が異なる。
RL r
RL (IX+d)
レジスターまたはメモリーの内容を左ローテートする。RL Aと8080からあるRLAとではフラグの変化が異なる。
RR r
RR (IX+d)
レジスターまたはメモリーの内容を右ローテートする。RR Aと8080からあるRRAとではフラグの変化が異なる。
RLD
RRD
Aレジスターの下位4ビットと(HL)を連結して4ビット単位でローテートする。BCD用の命令。
SLA r
SLA (IX+d)
レジスターまたはメモリーの内容を左に算術シフトする。
SRA r
SRA (IX+d)
レジスターまたはメモリーの内容を右に算術シフトする。
SRL r
SRL (IX+d)
レジスターまたはメモリーの内容を右に論理シフトする。

ビット操作命令

BIT b,r
BIT b,(IX+d)
レジスターまたはメモリーの特定のビットをテストする。
SET b,r
SET b,(IX+d)
レジスターまたはメモリーの特定のビットをセットする。
RES b,r
RES b,(IX+d)
レジスターまたはメモリーの特定のビットをリセットする。

ジャンプ・コール・リターン命令

JR e
無条件相対ジャンプ。
JR NZ,e
JR Z,e
JR NC,e
JR C,e
条件付相対ジャンプ。
DJNZ e
Bレジスタをデクリメントして0でなければ相対ジャンプする(Decrement and Jump if Non Zero)。ループに使う。
JP (IX)
インデクスレジスターの内容をPCに転送する。
RETI
割り込みからのリターン。
RETN
NMIからのリターン。

スタック操作命令

PUSH IX
インデクスレジスターの内容をスタックにプッシュする。
POP IX
スタックトップの内容をインデクスレジスターにポップする。
EX (SP),IX
インデクスレジスターとスタックトップの内容を交換する。

入出力命令

IN r,(C)
OUT (C),r
CレジスターまたはBCレジスターによる間接指定の入出力。rに(HL)は指定できない。

CPU制御命令

IM x
割り込みモードを設定する。xの値は0~2。

ブロック命令

8086のストリング命令、80186/V30のI/Oストリング命令に相当する。LDIRが最もよく使われる。

LDI/LDD/LDIR/LDDR
ブロック転送。HLレジスタの指すメモリの内容をDEレジスタの指すメモリへ転送することを、DE,HLレジスターをインクリメント/デクリメントしながらBCレジスタの回数だけ繰り返す。LDIRとLDDRは転送元と転送先のアドレスが重なる場合に使い分ける。
CPI/CPD/CPIR/CPDR
ブロックサーチ。AレジスタとHLレジスタの指すメモリの内容を比較することを、HLレジスタをインクリメント/デクリメントしながらBCレジスタの回数だけ(あるいは比較結果が一致するまで)繰り返す。
INI/IND/INIR/INDR
ブロック入力。Cレジスタの指すI/OポートからHLレジスターの指すメモリに入力することを、HLレジスターをインクリメント/デクリメントしながらBレジスターの回数だけ繰り返す。
OUTI/OUTD/OTIR/OTDR
ブロック出力。HLレジスターの指すメモリーからCレジスターの指すI/Oポートに出力することを、HLレジスターをインクリメント/デクリメントしながらBレジスタの回数だけ繰り返す。

I/Oポート

Z80には8080と同じくメモリーアドレスとは別に0からFF(255)までのI/Oポートアドレスを持っていた。ポートアドレスはメインメモリーのアドレスデコーダーを流用していたのか、アドレスバスの下位8ビットに出力されたが、上位8ビットにも同時に値が出力される仕様になっていた。この値にはI/OアドレスをCレジスタで指定する命令の場合はBレジスター、それ以外の命令はAレジスターの値が用いられる。

この仕様を利用するとI/Oポート空間を16ビットアドレスで取り扱うことができ、VRAMをここに割り当てることで、メインメモリーがVRAMによって圧迫されることを防ぐことができる。そのような構成をとった日本製パソコンには、シャープのX1、ソニーのSMC-777BUBCOM80などがある。X1と同じくシャープのMZ-1500ではオプションのRAMファイル(MZ-1R18、容量64KB)のアクセスにこの仕様を使用している<ref>「MZ-1500 オーナーズマニュアル」(付属説明書)に具体的な記述あり。</ref>。

ただし、通常に16bitアドレスをデコードしてI/Oのハードを構成してしまうと、アドレス指定にBCレジスターを指定しないOUT命令の時にアドレスバス上位8bitにはAレジスターの内容が出力されてしまうため、アドレス指定にBCレジスターを指定しないOUT命令を用いることが出来なくなってしまう。そこで、SONYSMC-70では、I/Oアドレスの上位8bitを下位に、下位8bitを上位にアドレスデコードした。こうして、多くのI/Oアドレスの割り付けが必要なところでは上位8bit・下位8bit両方をデコードしてBCレジスターアドレシングのOUT命令でアクセス、他のI/Oアドレスでは元の下位アドレスのみをデコードしてデバイスに割り付けることにより、通常のOUT命令を使用できるようにした。

ザイログ以外のZ80

セカンド・ソース契約による他社での生産も行われた。こうした製品には、シャープの「LH0080」モステックの「MK3880」などがある。また、日本電気(NEC)が独自に互換性のある「μPD780」を出荷したことに対し、ザイログはこれをチップ著作権侵害として訴訟を起こしたが、最終的には両者は和解して製造販売が継続された。 thumb|LH0080A thumb|μPD780C-1 thumb|μPD70008AC-4

もともとはNMOSプロセスで製造されたが、一部のセカンド・ソースの製造者からは、NEC「μPD70008」、シャープ「LH5080」、東芝「TMPZ84C00」など、独自にCMOSプロセス化し消費電力の低減を図った製品も出荷されている。

また、ナショナル・セミコンダクターからは、CMOS化とともに、インテル8085のようにアドレスバスの下位とデータバスとを共用させた、Z80とソフトウェアの互換性を持つ「NSC800」が製造された(ただし8085とはピン配置が異なり、置き換えだけでの移行はできない)。

現在でも制御、組込用として、メモリおよび周辺機器の制御用回路を単一のパッケージに集積したLSIが製造されており、ASICのIPコアとしてZ80の互換プロセッサーを用意するデバイスメーカーも多い。Z80 IPコアは、「オリジナルが4bit ALUで多くの命令がマイクロコードで実行される」「レジスタがダイナミック動作をするため、クロックを停止できない」「LDx、LDxRのような繰り返し実行する命令やインデックスレジスターを使う命令等、組み込み用途では不要な複雑な命令がある」といった欠点を解消した物も提供されている。任天堂ゲームボーイに使われたZ80ライクなIPコアではクロックを停止・再開できる物が使われている。

また、近年では2002年シャープシステム液晶のデモンストレーションとしてガラス基板上にZ80を形成し、MZ80CのCPUと交換し動作させた。

他の主なZ80互換CPU

(高速化を図ったものや、周辺デバイスを集積したもの) thumb|HD64180SY10 thumb|R800 CPU thumb|TMPZ84C015AF

HD64180
日立製作所(現ルネサス エレクトロニクス)が開発。高速化されたZ80バイナリーレベル互換命令とMMUを集積し、アドレス空間を512KB~1MBにしたもの。Z80にはない乗算、除算命令を備えている。68系周辺デバイスのバスサイクル(同期バス)に合わせたHD64180と、Z80用周辺デバイスのバスサイクル(非同期バス)を直接接続できるHD64180Zがある。ザイログからは、HD64180Zのセカンドソース品としてZ64180が出た。
R800
アスキーが開発した、内部16ビットの高速版Z80互換CPU。1990年4月に発表。乗算命令を拡張しているが、使用するレジスターの組み合わせで計算結果が不正になる不具合があるため、実質使用できるレジスターが制限されていた。また隠し命令のうち、IX/IYレジスタの8ビットアクセスを主とするいくつかの命令が正式命令に格上げされた。MSX turboRに搭載された。MMUやDMAを持つが同機では使用されなかった。CPU機能を停止しメモリーコントローラーとして動作するモードも持ち、こちらは同機で使用された。
μPD9002
日本電気が開発した、16ビットパソコンPC-88VAに搭載されたCPU。型番が示すとおり汎用量産品ではなく日本電気ホームエレクトロニクス社からの特注品として開発され、V30が8080互換モードを持つのと同様に、V30モードとZ80互換モードを持つ。チップそのものはV30をベースに周辺回路を統合したV50を基本としているため、Intel 8086とのソケット互換性はないが、PC-88VA2/3においては、V30モード時に8087-1コプロセッサが稼動する数値演算プロセッサソケットが用意されていた。
KC80
川崎マイクロエレクトロニクス(旧川崎製鉄)の、Z80互換の高速版CPU。乗算・除算命令を持つ。KC80をコアにMMUなどを追加した組み込み用ICとしてKL5C8012、KL5C8016、KL5C8400が販売されている。16ビット版で上位互換のKC160も販売されている。2009/7/1に一連の汎用マイコンの生産終了を発表。代替品の予定も無し。
TMPZ84C011
東芝 CMOS版Z80CPU、Z80CTC、Z80PIO非互換パラレルI/Oを集積したチップ。
TMPZ84C013
東芝 CMOS版Z80CPU、Z80CTC、Z80SIO等を集積したチップ。
TMPZ84C015
東芝 CMOS版Z80CPU、Z80CTC、Z80PIO、Z80SIO、CGC、ウォッチドッグタイマー等)を集積したチップ。また、本家にあたるザイログからも同等のZ84C15が販売されている。ただし、ピン機能の一部が異なる。東芝TMPZ84C015は製造中止。
TMPZ84C112
東芝 CMOS版Z80CPU、Z80PIO非互換パラレルI/O、タイマー、256バイトRAM等を集積したチップ。
TMPZ84C710
東芝 CMOS版Z80CPU、ISDN基本インターフェイス、Z80SIO等を集積したチップ。
TMPZ84C711
東芝 CMOS版Z80CPU、ISDN基本インターフェイス、Z80SIO等を集積したチップ。Z84C710上位互換。
TMPZ84C810
東芝 CMOS版Z80CPU、Z80CTC、Z80SIO、Z80CTC、パラレルI/O、DMA、MMU、DRAMリフレッシュコントローラー、ウォッチドッグタイマー等を集積したチップ。

後継CPU

Z180
日立製HD64180Zのザイログ社によるセカンドソース品であるZ64180の改良品。HD64180Z/Z64180とは仕様が微妙に異なる。Z80180やZ8S180がある。
Z280
16ビット拡張版。あまり採用される事無く、消え去った。ほとんど生産されなかったZ800CMOS化したもの。
Z380
1993年2月5日に発表されたZ80互換の32ビットCPU。レジスタは従来の汎用レジスターにプラスして16ビット追加部分を含めたグループが4バンク存在する。4GBのアドレス空間をリニアにアクセス可能。DRAMリフレッシュコントローラやINT0~3の割込みが追加されている。Z8000との互換性はない。
eZ80
命令パイプラインを導入し、同一クロックのZ80に対して約4倍のパフォーマンスを持つ。最大クロックスピードは50MHz、16MByteアドレッシング可能。

主な開発環境

脚注

Template:Reflist

関連項目

ar:معالج زد 80 ca:Zilog Z80 cs:Z80 da:Z80 de:Zilog Z80 en:Zilog Z80 es:Zilog Z80 fi:Zilog Z80 fr:Zilog Z80 hu:Zilog Z80 id:Zilog Z80 is:Z80 it:Zilog Z80 ko:질록 Z80 nl:Z80 nn:Zilog Z80 no:Zilog Z80 pl:Zilog Z80 pt:Zilog Z80 ro:Z80 ru:Zilog Z80 simple:Z80 sk:Zilog Z80 sv:Zilog Z80 vec:Zilog z80 zh:Zilog Z80

個人用ツール