Z80命令セット

Zilog Z80 CPU。日付コード 1976。

Zilog Z80は、1976年に発表された8ビットマイクロプロセッサです。命令セットはIntel 8080上位バイナリ互換となるように設計されました。Intel 8080の命令は1~3バイトの長さですが、Z80では命令ごとに最大4バイトが必要です。

ZilogはZ80の命令セットを拡張し続け、Z180Z280Z380といった後継機種を次々と発表した。最新版のeZ80は2001年に発表され、2025年時点で購入可能であった。この命令セットは、日立HD64180 [1]三井R800 [2] 、Eastern Bloc U880 [3]といったZilog以外のCPUにも搭載されている

命令セット

Z80は、利用可能な256個のコードのうち252個をシングルバイトオペコード(「ルート命令」)として使用します。そのほとんどは8080から継承されたものです。残りの4つのコードは、オペコードプレフィックスとして広く使用されています。[3] CBとEDは追加命令を有効にし、DDまたはFDはHLの代わりにそれぞれIXまたはIYを選択します。この方式により、Z80は命令とレジスタの多様な組み合わせを実現しています。Zilogはこれらを158種類の「命令タイプ」に分類しており、そのうち78種類はIntel 8080のものと同じです。[3]これにより、すべての8080プログラムをZ80で動作させることができます。Zilogのドキュメント[4]では、命令がさらにカテゴリに分類されています。大部分は8080から継承されていますが、ブロック命令やビット命令など全く新しいものや、16ビットロード、I/O、回転/シフト、相対ジャンプなど、より汎用的なアドレッシングモードを備えた8080命令もあります。カテゴリは以下の通りです。

  • ロードと交換
  • ブロック転送と検索
  • 算術と論理
  • 回転と移動
  • ビット操作(セット、リセット、テスト)
  • ジャンプして、呼んで、戻る
  • 入力/出力
  • CPU制御

エンコード順序

8080命令セットを拡張するため、Z80命令ではIX/IYオーバーライド、オペコードプレフィックス、またはその両方が必要となる場合があります。1つの命令は最大4つのコンポーネントを含むことができます。命令の各コンポーネントは以下の順序で組み立てられます。[5]

IX/IYオーバーライド
CBまたはEDプレフィックス
(IX/IY + n) CBの場合はオフセット
オペコード
CBがない場合、(IX/IY + n)オフセット
データまたはアドレス

ルート指示

ルートオペコードには8080のすべてのオペコードが含まれています。Z80では、8つの新しい1バイト命令、2つのオペコードプレフィックス、そしてIXとIYのオーバーライドが追加されています。[6] 色付きの行は新しいZ80命令を示しています。

オペコードオペランドニモニック説明
76543210b2b3
00000000いいえ操作なし
00RP0001ダトロダティLD rp、データRP ←データ
00RP0010LD (rp)、A(RP) ← A [BCまたはDEのみ]
00RP0011INC rpRP ← RP + 1
00DDD100INC dddDDD ← DDD + 1
00DDD10112月dddDDD ← DDD - 1
00DDD110データLD ddd、データDDD ← データ
00000111RLCAA 1-7 ← A 0-6 ; A 0 ← Cy ← A 7
00RP1001追加rpHL ← HL + RP
00RP1010LD A、(rp)A ← (RP) [BCまたはDEのみ]
00RP101112月rpRP ← RP - 1
00001000EX AF、AF'AF ↔ AF
00001111RRCAA 0-6 ← A 1-7 ; A 7 ← Cy ← A 0
00010000オフセットDJNZオフセットB = B - 1; B ≠ 0 の場合、PC ← PC + オフセット
00010111RLAA 1-7 ← A 0-6 ; Cy ← A 7 ; A 0 ← Cy
00011000オフセットJRオフセットPC ← PC + オフセット
00011111RRAA 0-6 ← A 1-7 ; Cy ← A 0 ; A 7 ← Cy
001CC000オフセットJR cc、オフセットCC 0-1が真の場合、PC ← PC + オフセット(CCの2ビットのみ使用:NZ、Z、NC、C)
00100010追加アディLD追加、HL(追加)←HL
00100111DAAN フラグ = 0 の場合 {A 0-3 > 9 または AC = 1 の場合、A ← A + 6;

then if A 4-7 > 9 OR Cy = 1 then A ← A + 0x60} else {do post-subtract DAA}

00101010追加アディLD HL、追加HL ← (追加)
00101111CPLA ← ¬A
00110010追加アディLD追加、A(追加)←A
00110111SCFサイ ← 1
00111010追加アディLD A、追加A ← (追加)
00111111CCFサイ ← ¬サイ
01DDDSSSLD ddd、sssDDD ← SSS
01110110停止停止
10アルミSSSADC SUB SBC と XOR または CP sssを追加A ← A [ALU演算] SSS
11CC000RET ccccが真の場合、PC ← (SP)、SP ← SP + 2
11RP0001ポップrpRP ← (SP), SP ← SP + 2
11CC010追加アディJP cc、追加ccが真の場合、PC ← 追加
11000011追加アディJP追加PC ← 追加
11CC100追加アディccに電話をかけ、追加ccが真の場合、SP ← SP - 2、(SP) ← PC、PC ← 加算
11RP0101プッシュrpSP ← SP - 2、(SP) ← RP
11アルミ110データADC SUB SBCとXORまたはCPデータを追加A ← A [ALU演算] データ
11111RST nSP ← SP - 2、(SP) ← PC、PC ← N
11001001RETPC ← (SP), SP ← SP + 2
11001011CBプレフィックスCBプレフィックス表を参照
11001101追加アディ追加を呼ぶSP ← SP - 2, (SP) ← PC, PC ← 加算
11010011ポート出力ポート、Aポート(A:ポート) ← A [a]
11011001エクセBC ↔ BC '、DE ↔ DE '、HL ↔ HL '
11011011ポートIN A、ポートA ← ポート(A:ポート) [a]
11011101IXオーバーライドHLはIXになり、(HL)は(IX + オフセット)になります。
11100011EX (SP)、HL(SP)↔HL
11101001JP(HL)PC ← HL
11101011EX DE、HLHL ↔ DE
11101101ED接頭辞ED接頭辞表を参照
11110011DIIFF1 ← IFF2 ← 0; 割り込みを無効にする
11111001LD SP、HLSP ← HL
11111011えいIFF1 ← IFF2 ← 1; 割り込みを有効にする
11111101IYオーバーライドHLはIYになり、(HL)は(IY + オフセット)になります。
76543210b2b3ニモニック説明
SSS DDD210CCアルミRP
B000ニュージーランドADD (A ← A + 引数)紀元前
C001ZADC (A ← A + arg + Cy)ドイツ
D010ノースカロライナ州SUB (A ← A - 引数)HL
E011CSBC (A ← A - arg - Cy)SPまたはAF
H100郵便局AND (A ← A ∧ 引数)
L101体育XOR (A ← A ⊻ 引数)
(HL)110Pまたは (A ← A ∨ 引数)
111CP (A - 引数)
SSS DDD210CCアルミ
  1. ^ ab OUTポート、AおよびIN Aポート命令は、8ビットの即値ポート番号がアドレスの下位部分を形成し、Aレジスタが上位部分を形成する16ビットのポートアドレスを生成します。通常、デバイスは下位部分のみをデコードします。これに対し、8080では、上位アドレスバスと下位アドレスバスの両方で即値ポート番号が重複して使用されます。

EDで始まる指示

EDで始まるオペコードは、1バイトでエンコードできない新しいZ80命令を包括するものです。このグループには、利用可能な256個のオペコードのうち60個のみが含まれます。[6]

オペコードオペランドニモニック説明
76543210b2b3
01DDD000IN ddd、(C) [a]DDD ← ポート(BC) [(HL)を除く] (ポート番号は16ビット)
01SSS001アウト(C)、sssport(BC) ← SSS [(HL)を除く] (ポート番号は16ビット)
01RP0010SBC HL、ssHL ← HL – ss – CY
01RP0011追加アディLD (追加)、ss(追加)←RP
01000100ネガティブA ← 0 - A
01000101RETNPC ← (SP); SP ← SP + 2; IFF1 ← IFF2 [b]
010NN110IM n割り込みモード0、1、2(エンコード0、2、3)
01000111LD I、A割り込み制御ベクトル ← A
01RP1010ADC HL、SSHL ← HL + ss + CY
01RP1011追加アディLD dd、(追加)RP ← (追加)
01001101レティPC ← (SP); SP ← SP + 2; IFF1 ← IFF2 [b]
01001111LD R、Aリフレッシュ ← A
01010111LD A、IA ← 割り込み制御ベクトル[c]
01011111LD A、RA ← リフレッシュ[c]
01100111規制当局A 0-3 ← (HL) 0-3 ; (HL) 7-4 ← A 0-3 ; (HL) 0-3 ← (HL) 7-4
01101111RLDA 0-3 ← (HL) 7-4 ; (HL) 0-3 ← A 0-3 ; (HL) 7-4 ← (HL) 0-3
101RD000LDI LDIR LDD LDDR(DE) ← (HL); HL ← HL ± 1; DE ← DE ± 1; BC ← BC-1 [d] [e]
101RD001CPI CPIR CPD CPDRA - (HL); HL ← HL ± 1; BC ← BC-1 [d] [e] [f]
101RD010INI INIR IND INDR(HL) ← ポート(BC); HL ← HL ± 1; B ← B – 1 [d]
101RD011OTI OTIR OTD OTDRポート(BC) ← (HL); HL ← HL ± 1; B ← B – 1 [d]
76543210b2b3ニモニック説明
  1. ^ バイト入力はIN A,nとは異なりフラグを設定します
  2. ^ ab RETN と RETI は同一であり、IFF1 を復元します。Z80 互換の割り込みデバイスは、M1- が 0xED に続いて 0x4D にアサートされている間にデータ バスをスニッフィングして RETI を監視します。
  3. ^ ab LD A,IとLD A,Rは、フラグを設定する唯一の2つのLD命令です。さらに、IFF2はP/Vフラグにロードされます。Cは影響を受けません。
  4. ^ abcd D = 1 の場合、ポインタHLとDEはデクリメントされます。R = 1 の場合、BCまたはB = 0 になるまで操作が繰り返されます。すべてのブロックIO命令は、ポートアドレスとしてCだけでなくBCも出力します。
  5. ^ ab LDI、LDD、CPI、CPD は、BC – 1 ≠ 0 の場合に P/V を設定します。これは、繰り返しを使用しない場合のループ制御に役立ちます。
  6. ^ A = (HL) の場合、CPIR/CPDR は早期に終了します。

CBで始まる命令

シフトおよび回転命令。SLL は未定義命令です。

CBで始まるオペコードは、シフトとローテートに加え、ビットテスト、クリア、セット命令をカバーします。これらの命令はすべて、任意のレジスタまたはメモリに使用できます。これらの命令の(HL)形式は、IXまたはIYオペコードプレフィックスと組み合わせて、(IX+d)または(IY+d)を操作できます。このグループは、利用可能な256個のオペコードのうち248個を網羅しています。[6]

オペコードニモニック説明
76543210
00000SSSRLC rR 1-7 ← R 0-6 ; R 0 ← Cy ← R 7
00001SSSRRC rR 0-6 ← R 1-7 ; R 7 ← Cy ← R 0
00010SSSRL rR 1-7 ← R 0-6 ; Cy ← R 7 ; R 0 ← Cy
00011SSSRR rR 0-6 ← R 1-7 ; Cy ← R 0 ; R 7 ← Cy
00100SSSSLA rサイ ← R 7 ; R 1-7 ← R 0-6 ; R 0 ← 0
00101SSSSRA rサイ ← R 0 ; R 0-6 ← R 1-7
00111SSSSRL rCy ← R 0 ; R 0-6 ← R 1-7 ; R 7 ← 0
01少しSSSビットb,rR∧(1 << b)
10少しSSSRES b,rR ← R ∧ ¬(1 << b)
11少しSSSセットb、rR ← R ∨ (1 << b)
76543210ニモニック説明

IXとIYのオーバーライド

2 つのオペコード プレフィックスにより、新しい IX および IY インデックス レジスタにアクセスするための Z80 アドレス指定モードの数が増えます。

  • 接頭辞DDはHLをIXに、または(HL)を(IX+変位)に変更します。
  • 接頭辞FDはHLをIYに、または(HL)を(IY+変位)に変更します。

インデックスレジスタIXとIYは、メモリ、スタックフレーム、およびデータ構造の操作能力を高める柔軟な16ビットポインタとして意図されていました。公式には、これらは16ビットとしてのみ扱われていました。実際には、これらはHLレジスタと同じ方法で、8ビットレジスタのペアとして実装されました[7]。HLレジスタは、16ビットとして、または上位レジスタと下位レジスタとして個別にアクセスできます。バイナリオペコードは同じですが、新しいオペコードプレフィックスが先頭に付いています。[8] Zilogは、意図された機能のオペコードと関連ニーモニックを公開しましたが、HLレジスタの操作を可能にするすべてのオペコードがIXレジスタとIYレジスタの8ビット部分に対して同様に有効であるという事実は文書化していませんでした。たとえば、オペコード26hの後に即値バイト値が続くと、命令が形成されますLD H,n。これは、n番目の即値をHレジスタにロードします。この2バイト命令の前にIXレジスタのオペコードプレフィックスDDを付けると、IXレジスタの最上位8ビットに同じ値がロードされます。ただし、注目すべき例外として、同じLD H,(IX+d)命令でHLレジスタとIXまたはIYレジスタの両方を使用する命令があります。[8]この場合、DDプレフィックスは命令の(IX+d)部分にのみ適用されます。IXレジスタとIYレジスタの半分は、8ビット算術演算、論理演算、比較演算命令のオペランドを保持できるため、通常の8ビットレジスタは他の用途に使用できます。

参考文献

  1. ^ Cohen, Charles L. (1985年3月4日). 「Sun Rises on New Designs」. ElectronicsWeek . pp.  18– 21. 2024年6月2日閲覧
  2. ^ “UD 880 および UD 855” [UD 880 および UD 855]. Radio Fernsehen Elektronik (ドイツ語)。35 (2)。 VEB Verlag Technik: 70. 1986. ISSN  0033-7900。
  3. ^ ab "Z80 CPU Introduction". Zilog . 1995年. 2023年12月20日時点のオリジナルよりアーカイブ。252個のルート命令からなる言語を持ち、プレフィックスとして予約された4バイトを用いて、さらに308個の命令にアクセスする。
  4. ^ 「Z80-CPU命令セット」(PDF). Zilog . 1976. p. 19. 2023年11月5日時点のオリジナルよりアーカイブ2021年7月20日閲覧。
  5. ^ "Z80". CPC Wiki . 2025年9月6日閲覧
  6. ^ abc Z80 CPU ユーザーマニュアル(PDF) (第11版). Zilog. 2016年8月. 2025年8月15日閲覧
  7. ^ フレーリッヒ, ロバート A. (1984).フリーソフトウェアカタログとディレクトリ. クラウン・パブリッシャーズ. p. 133. ISBN 978-0-517-55448-7文書化されていない Z80 コードでは、IX レジスタと IY レジスタを使用した 8 ビット操作が可能です。
  8. ^ ab Bot, Jacco JT「Z80 未文書化命令」。Z80 CPU のホームページ。2023年12月23日時点のオリジナルからのアーカイブ。オペコードがレジスタ HL、H、または L で機能する場合、そのオペコードの前に #DD(または #FD)が付くと、IX、IXH、または IXL(または IY、IYH、IYL)でも機能しますが、一部例外があります。例外となるのは、LD H,IXH や LD L,IYH のような命令です。
「https://en.wikipedia.org/w/index.php?title=Z80_instruction_set&oldid=1322205361」から取得