Z80
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/09 02:05 UTC 版)
レジスタ
![](https://weblio.hs.llnwd.net/e7/redirect?dictCode=WKPJA&url=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fe%2Fe8%2FZ80-CPU_register_set.png%2F300px-Z80-CPU_register_set.png)
A,B,C,D,E,H,Lは8080の同名レジスタと同じ機能を持つ。 Fは8080上位互換のフラグレジスタである。 これらの8ビット汎用レジスタとアキュムレータ、フラグレジスタはZ80では切り替えて使える裏レジスタが用意された。 但し、裏表どちらのレジスタであるかを判断する命令はない。 Rはリフレッシュカウンタで、オリジナルのZ80では下位7ビットが変化し、最上位ビットは初期値不定で、値を書き込むとその最上位ビットが保持される。周辺LSI統合CPU・上位互換CPUでは、リフレッシュカウンタを8ビットに拡張し、最上位ビットが保存されないものもあるほか、リフレッシュ機構をCPUから完全に切り離してRレジスタが変化せず書き込んだ値が保存されるものもある。
- フラグレジスタのビット位置(*は8080から拡張されたビット)
- b7:S 符号
- b6:Z ゼロ
- b5:未使用 (0に固定)
- b4:H AUXキャリー(パックBCD演算用)
- b3:未使用 (0に固定)
- b2:P/V * パリティ・オーバーフロー(8080ではP パリティ)
- b1:N * 減算(ADD命令で0、SUB命令で1になる。8080では未使用、0に固定)
- b0:C キャリー
命令セット
8080に存在する命令についてはパリティフラグを除く挙動とバイナリは同一となり、基本的には上位互換であるため非互換部分に留意すれば同一のバイナリを動作させる事も可能である。8080用のOSであるCP/Mや、そのアプリケーションもそのまま動作した。
Intelによる8080の上位互換プロセッサであるIntel 8085とは拡張部分の命令セットや挙動が違うため非互換である。
アセンブラでプログラムを記述する際には、ザイログ社が定義したZ80のニモニックならびにオペランドの記述は、インテルのi8080やi8085のものと異なる。ザイログ社のものは記述の容易さが勘案され、より整理されたものとなった。例えば、レジスタ間での値の移動、即値をレジスタに入れる、レジスタペアで示されるメモリとレジスタの間の転送命令のニモニックはすべて "LD" であり、アドレッシングモードを意識する必要がなく初心者にも判りやすい。反面、存在しない組み合わせの "LD" 文を記載してエラーとなるなど、i8080やi8085のニモニックと比較して、アドレッシングモードや実際の命令がはっきりせず、使えない組み合わせのオペランドの区別がしにくいなどの状況が発生している。オペランドの順番は、ディスティネーションが前でソースが後である。また、オペコードの仕様上、HLレジスタとインデックスレジスタ間での処理は組み合わせに制限がある。
ここでは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,Iを使用するとき、特にNMOS品ではこの命令を実行中に割り込みがかかった場合、元の割り込み状態に関わらず割り込み禁止になる場合がある[9]。このバグ(エラッタ)はNMOS品は全般にある。CMOS品でも、東芝TMPZ84Cxx・日立HD64180 R0マスク・他にはこのバグがある。ザイログのものは修正されている。HD64180はR1マスクおよびZバージョンで修正済み。シャープLH5080も修正済みの模様。NEC μPD70008は不明。
- LD A,R
- LD R,A
- リフレッシュレジスタとAレジスタの転送。オリジナルのZ80においてRの下位7ビットは常に変動しているため、LD A,Rは簡易な乱数発生器としてよく使われる。互換CPUでは、8ビット全てが変動したり、変動しないものもある。
- LD A,Rについては、チップのバージョンにより前述のLD A,Iと同様の割り込み禁止となる問題が発生する場合がある。
算術演算命令
- 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-777、BUBCOM80などがある。シャープMZ-1500ではオプションのRAMファイル(MZ-1R18、容量64KB)のアクセスにこの仕様を使用している[10]。
しかし、16ビットアドレスのI/Oポート空間をそのままデコードしてI/Oのハードを構成してしまうと、アドレス指定にBCレジスタを指定しないOUT命令の時にアドレスバス上位8ビットにはAレジスタの内容が出力されてしまうため、アドレス指定にBCレジスタを指定しないOUT命令を用いることが出来なくなってしまう。そこで、SONYのSMC-70では、I/Oアドレスの上位8ビットを下位に、下位8ビットを上位にアドレスデコードした。こうして、多くのI/Oアドレスの割り付けが必要なところでは上位8ビット・下位8ビット両方をデコードしてBCレジスタアドレシングのOUT命令でアクセス、他のI/Oアドレスでは元の下位アドレスのみをデコードしてデバイスに割り付けることにより、通常のOUT命令を使用できるようにした。
なお、ブロック入出力命令の場合はBレジスタをデクリメントするため、16ビットアドレスとしては使用しにくい。逆にこれを利用することにより残り回数を周辺デバイスなどが知ることができる。ただし、出力の場合は処理の順番はアドレス出力よりもBレジスタのデクリメントが先のため、アドレスの上位8ビットを利用する場合は1小さい値が出力されることに留意する必要がある。なお、入力の場合はアドレス出力が先である。
注釈
出典
- ^ パチンコ/パチンコ/パチスロ台ではいまだZ80が主流、そのため技術者が高齢化?
- ^ Zilog Calls Time on the Venerable Z80, Discontinues the Standalone Z84C00 CPU Family (huckster.io)
- ^ “Insider's Computer Dictionary:Z80 とは? - @IT”. atmarkit.itmedia.co.jp. 2021年8月31日閲覧。
- ^ a b c ASCII 1982年12月号, p. 75.
- ^ https://patents.google.com/patent/US4486827
- ^ http://www.primrosebank.net/computers/z80/z80_special_reset.htm
- ^ 嶋正利『マイクロコンピュータの誕生』p. 142
- ^ “Z80 CPU User Manual”. zilog.com. p. 11 (2016年). 2020年12月8日閲覧。
- ^ “Z80・割り込みフラグの不具合に関するレポート Z80のIFF2に関するトラブル体験談”. 下間 憲行 (1997年6月17日). 2018年1月16日閲覧。
- ^ 「MZ-1500 オーナーズマニュアル」(付属説明書)に具体的な記述あり。
- ^ "eZ80 CPU User Manual"
固有名詞の分類
- Z80のページへのリンク