Z80
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Z80 は、米国ザイログ社によって製造された 8ビット・マイクロプロセッサである。1976年に発表され、1980年代の中頃までは、パーソナル・コンピュータのCPUとしてなど、幅広い用途に使用された。以後も周辺デバイスを集積した製品が出されるなど、現在でも組み込み用途等、目に見えないところで多用されている。
目次 |
[編集] Z80の概要
嶋正利らインテル社を退社した8080の開発スタッフが設計を行っており、8080とはバイナリレベルで上位互換性がある。
ザイログ社オリジナルの製品としてクロック周波数が2.5MHzのZ80から8MHzのZ80Hのバリエーションと、各社よりのセカンドソース品が存在する。
Z80とその互換CPUは、当初はより高速な8080互換CPUとして応用され、S-100バス互換機にもこぞって搭載されるなど、黎明期のパーソナルコンピュータ市場を支配した。日本国内においても、1970年代の末から80年代前半頃にかけて、ビジネス用のオフィスコンピュータなどの他、各社のホビー用パーソナルコンピュータにも搭載された。
また組み込み用としては21世紀の現在に至るまで応用され続けて来ており、多数の機器に搭載されたほか、初期のゲーム専用機などにも搭載されていた。
その他、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組とし、また、2つのインデックスレジスタ(IXとIY)を使用したメモリ操作を含む命令の増強、割り込みモードの追加、ワイヤードロジックによる命令の実行、などが行われている。乗算・除算命令は8080同様に存在しない。
また、本来16ビット固定のインデックスレジスタ(IX,IY)を8ビット単位に分割して使用できるなど、ロジックの設計上で派生したと思われる、命令表には存在しない隠し命令が存在した。これらの一部はZ280のマニュアル中で正式にドキュメント化されている。
[編集] 仕様(アセンブラ)
8080に対して上位互換性を持ち、8080用のバイナリをそのまま実行できるが、アセンブリプログラミングの際に命令を書き表すための「ニーモニック」は、8080のバイナリに対応する命令でもインテル版とザイログ版では全く異なっており、記述の容易さが勘案され、より整理されたものとなった(これは初心者にも判りやすいとされる反面、他のCPUのニモニックと比較して、アドレッシングモードがはっきりしない、という欠点もあった)。オペランドの順番は、ディスティネーションが前でソースが後である。
アメリカのSF映画『ターミネーター』の第一作に登場のアンドロイド、ターミネーターからの視点を表現した場面で流れる文字列はZ80のアセンブラである。
[編集] 特徴
8080との差別化のため、命令の1サイクル目(M1サイクル)では他のサイクルに比べて所要ステート数が少なくなっている(通常のサイクルが3ステート必要なのに対しM1サイクルでは2ステート(1))。 これは同じ命令を実行しても8080よりも高速に実行するためのZ80の売りの一つであったのだが、逆にこのM1サイクルだけのために速いメモリが必要になり、ハードウェア設計者からは不評を買っていた。
- (1)仕様を見るとM1サイクルには4ステート必要なように見えるが、後半の2ステートはリフレッシュ機能のために使用され、通常のメモリアクセスとは関係がない。
Z80には「特定の命令の組み合わせを用いると、普通に命令を書いた場合よりも実行にかかるクロック数や命令の総バイト数を少なくできる」というテクニックが多数存在し、これらは「最適化」「クロック削り」などと呼ばれた。例えば、Z80にて追加されたブロック転送命令やインデックスレジスタ命令は、一連の処理に必要なプログラムコードのバイト数を節約できる反面、他の命令で代用する場合よりも所要クロック数が増大するといったデメリットもあり、命令のメモリ空間上の占有量と処理速度とのトレードオフの関係にあった。
またZ80は、同時期に新規に開発された他社製の8bitCPUと比較すると、相対ジャンプは可能であるもののジャンプ先の範囲が狭いなどリロケータブルな構成をとりづらく、バイナリ化したコードをリロケータブルに配置して動作させるドライバやデバッガ、オペレーティングシステム等の環境を作るには不向きとされた(リロケータブルでない一般的なバイナリは、配置アドレスを変更する度に再コンパイルや再リンクが必要となった)。 またアドレス参照時のオフセットも汎用レジスタ使用時には指定できず、インデックスレジスタ使用のオフセット指定も-128~0~127の範囲で制限されるため、C言語のポインタとの相性がよくない面があった。
なお、Z80にはアドレッシングモードが少ないこともあり、各命令コードを16進数で覚えることもそう難しくはなかった(Z80の場合、命令のビット配列は本来8進数で考えるべきものであるが)。
[編集] レジスタセット
A,B,C,D,E,H,Lは8080の同名レジスタと同じ機能を持つ。 F,F'は8080互換のフラグレジスタである。
[編集] 命令セット
ここでは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レジスタの転送。
- LD A,R
- LD R,A
- リフレッシュレジスタとAレジスタの転送。Rは常に変動しているため、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のストリング命令に相当する。LDIRが最もよく使われる。
- LDI/LDD/LDIR/LDDR
- ブロック転送。HLレジスタの指すメモリの内容をDEレジスタの指すメモリへ転送することを、DE,HLレジスタをインクリメント/デクリメントしながらBCレジスタの回数だけ繰り返す。
- 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ビットアドレスで取り扱うことができ、グラフィックメモリをここに割り当てることで、メインメモリがグラフィックメモリによって圧迫されることを防ぐことができる。シャープのX1はその代表的なマシンで、同機能を使ったものは他にBUBCOM80などがある。
ただし、通常に16bitアドレスをデコードしてI/Oのハードを構成してしまうと、(アドレス指定にBCレジスタを指定しないOUT命令の時にアドレスバス上位8bitにはAレジスタの内容が出力されてしまうため)アドレス指定にBCレジスタを指定しないOUT命令を用いることが出来なくなってしまう。そこで、SONYのSMC-70では、I/Oアドレスの上位8bitを下位に、下位8bitを上位にアドレスデコードした。こうして、多くのI/Oアドレスの割り付けが必要なところでは上位8bit・下位8bit両方をデコードしてBCレジスタアドレシングのOUT命令でアクセス、他のI/Oアドレスでは(元の)下位アドレスのみをデコードしてデバイスに割り付けることにより、通常のOUT命令を使用できるようにした。
[編集] ザイログ以外のZ80
セカンド・ソース契約による他社での生産も行われた。こうした製品には、シャープの「LH0080」モステックの「MK3880」などがある。また、日本電気(NEC)が独自に互換性のある「μPD780」を出荷したことに対し、ザイログはこれをチップ著作権侵害として訴訟を起こしたが最終的には両者は和解して製造販売が継続された。
もともとはNMOSプロセスで製造されたが、一部のセカンド・ソースの製造者からは、独自にCMOSプロセス化し消費電力の低減を図った製品(NEC「μPD70008」、シャープ「LH5080」、東芝「TMPZ84C00」など)も出荷されている。
また、ナショナル・セミコンダクターからは、CMOS化とともに、インテル8085のようにアドレスバスの下位とデータバスとを共用させた、Z80とソフトウェアの互換性を持つ「NSC800」が製造された。
現在でも制御、組込用として、メモリおよび周辺機器の制御用回路を単一のパッケージに集積したLSIが製造されており、ASICのIPコアとしてZ80の互換プロセッサを用意するデバイスメーカーも多い。 Z80 IPコアは、オリジナルが4bit ALUで多くの命令がマイクロコードで実行される・レジスタがダイナミック動作をするため、クロックを停止できない・組み込み用途として使うのであれば不要な複雑な命令(LDx、LDxRのような繰り返し実行する命令やインデックスレジスタを使う命令等)がある、といった欠点を解消した物も提供されている。任天堂のゲームボーイに使われたZ80ライクなIPコアではクロックを停止・再開できる物が使われている。
また、近年では2002年にシャープがシステム液晶のデモンストレーションとしてガラス基板上にZ80を形成し、MZ80CのCPUと交換し動作させた。
[編集] 他の主なZ80互換CPU
(高速化を図ったものや、周辺デバイスを集積したもの)
- HD64180 - 日立製作所(現ルネサステクノロジ)が開発。高速化されたZ80とMMUを集積し、アドレス空間を512KB~1MBにしたもの。当初はZ80互換をうたわず、CP/M-80ソフトウェア互換と説明された。制御信号やバスのタイミングは68系周辺デバイスに合わせており、Z80用周辺デバイスを直接接続できなかった。後にZ80のタイミングにあわせたHD64180Zが開発された。ビクターのMSX2、HC-90,95に搭載されたほか、富士通のFM TOWNS HRなどのCD-ROMコントローラや、組み込み機器制御などに使用された。
- R800 - (株)ASCIIが開発した、内部16ビットの高速版Z80互換CPU。乗算命令を拡張しているが不具合がある。――不具合の詳細について情報をお待ちしています。――MSX turboRに搭載された。MMUやDMAを持つが同機では使用されなかった。1990年4月に発表。
- μPD9002 - 日本電気が開発した、16ビットパソコンPC-88VAに搭載されたCPU。V30が8080互換モードを持つのと同様に、V30モードとZ80互換モードを持つ。
- KC80 - 川崎マイクロエレクトロニクス(旧川崎製鉄)の、Z80互換の高速版CPU。乗算・除算命令を持つ。KC80をコアにMMUなどを追加した組み込み用ICとしてKL5C8012、KL5C8016、KL5C8400が販売されている。16ビット版で上位互換のKC160も販売されている。
- TMPZ84C011 - 東芝 CMOS版Z80CPUおよび周辺(Z80CTC,パラレルI/O(Z80PIO非互換))を集積したチップ。
- TMPZ84C013 - 東芝 CMOS版Z80CPUおよび周辺(Z80CTC,Z80SIO等)を集積したチップ。
- TMPZ84C015 - 東芝 CMOS版Z80CPUおよび周辺(Z80CTC,Z80PIO,Z80SIO,CGC,ウォッチドッグタイマー等)を集積したチップ。また、本家にあたるザイログからも同等のZ84C15が販売されている。東芝製TMPZ84C015は一時製造中止の噂もあったが現時点(2006/3)では継続して販売している。
- TMPZ84C112 - 東芝 CMOS版Z80CPUおよび周辺(パラレルI/O(Z80PIO非互換),タイマー,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を、ザイログ社が自社の製品として採用したもの。
- Z280 - 16ビット拡張版、あまり採用される事無く、消え去った。
- Z380 - 1993年2月5日に発表されたZ80互換の32ビットCPU。レジスタは従来の汎用レジスタにプラスして16ビット追加部分を含めたグループが4バンク存在する。4GBのアドレス空間をリニアにアクセス可能。DRAMリフレッシュコントローラやINT0~3の割込みが追加されている。Z8000との互換性はない。
- eZ80 - 命令パイプラインを導入し、同一クロックのZ80に対して約4倍のパフォーマンスを持つ。最大クロックスピードは50MHz、16MByteアドレッシング可能。