Yamamoto's Laboratory
Z80
 命令セット

はじめに

アセンブリ言語でのプログラム開発時のニーモニックの手引きを目指し,このサイトを作成しました.そのため,Zilog Z80 の全ての命令セットの動作を簡便に説明します.その一方,プログラムの書き方については,ここでは説明しません.

命令セットの説明の準備

この節では,Z80 の命令セットを説明するために必要なことを記述します.命令の説明使う記号,フラグレジスターについて説明します.いずれも,次節以降で説明に使う命令セットの表に関わるものです.Z80 は,Intel 8080/8085 の上位互換です.両者の違いについて,記述します.この節は,Intel 8080/8085 を使う人,CP/M を使う人向けです.これらを使用しない読者には,あまり意味がありません.

命令の説明に使う記号

表 1 は,以降の命令セットの表で使用する記号を示します.命令のオペコード,機能説明のための記号,バイナリーの命令コードの一部などです.

プログラム中に書かれる数値や文字データは,リテラル (literal)あるいは即値 (Immediate) と呼ばれます.ただし,Z80 のニーモニックのオペコードに文字/文字列はありません.しかし,アセンブリー言語のプログラムで「CP   'X'」という命令は可能です.これは,アセンブラーが「CP 58」と変換し,処理します.Z80 の命令では,1 バイトあるいは 2 バイトの16進整数のみがリテラルで書かれます.表 1 の (n) や (nn), n, nn です.この中で (A35B) や (FA) のように括弧付きの場合は,アドレスを表します.前者はメモリーのアドレス,後者は I/O ポートアドレスになります.ポインターのようなものです.括弧がない場合は,整数データになります.

表3 — 表25 の最後の列の T と M は,実行に必要なCPU マシンサイクル数と T サイクル数を表します.命令を実行するために必要な時間は,T/(CPU クロック周波数)となります.

Z80の命令セット説明のための記号と意味
記号 意味
(n), (nn) I/Oデバイスのアドレス(8ビット), メモリのアドレス(16ビット)
n, nn 8ビットの値, 16ビットの値
byte 2, byte 3, byte 4 命令の2, 3, 4番目のバイト
r, r1, r2 A, B, C, D, E, H, Lレジスターのどれか.特に,Aレジスターはアキュームレーター.
rm レジスターのビット m.mの値は0〜7.
rH, rL レジスターペアの上位のレジスター, 下位のレジスター
DDD, SSS レジスターを表すビットパターン.DDD:destination(行き先) SSS:source(元)
DDD or SSS レジスター
111 A
000 B
001 C
010 D
011 E
100 H
101 L
RP レジスタペア BC, DE, HL, SPのいずれかで,そのビットパターンは次の通り.
RP レジスターペア
00 BC
01 DE
10 HL
11 SP
  • BCレジスターペア: Bが上位アドレスCが下位アドレス
  • DEレジスターペア: Dが上位アドレスEが下位アドレス
  • HLレジスターペア: Hが上位アドレスLが下位アドレス
  • SPとすると,スタックポインター(16ビット)
PC プログラムカウンター.PCHとするとプログラムカウンターの上位の8ビット,PCLは下位の8ビット.
SP スタックポインター.SPHとするとスタックポインターの上位の8ビット,SPLは下位の8ビット.

フラグレジスター

下図に Z80 のフラグ・レジスタ (F と F') を示します.1 バイト (8ビット) のレジスターで,このうち 6 個のビットが使われています.図中の「X」で示すビットは未使用です.各ビットは,S: サインフラグ,Z: ゼロフラグ,H: ハーフキャリーフラグ,P/V: パリティ/オーバーフローフラグ,N: 加/減算フラグ,C:キャリーフラグです.

Zilog Flag register
Z80 のフラグレジスター

このレジスターは,CPU のステータス(状態)を表す変数のひとつです.チューリングマシンの「内部状態」を表すものです.実際,フラグレジスターのビットは命令の実行後に設定されます.例えば,算術演算命令の実行結果が負になった場合,フラグレジスターの第 6 ビットのゼロフラグ(Z)が 1 にセットされます.

表 2 に,フラグレジスターの値の設定規則を示します.また,表 3 以降の命令セットの説明の表のフラグの列は,変化するフラグレジスターを示しています.空欄,あるいは表示されていないフラグは,その命令の実行ではフラグのビットは変化しません.

Z80 のフラグレジスター
フラグ 動作 (セット/リセット)
S サインフラグ
  • 演算命令の実行結果の値の最上位のビットが 1 :S=1,最上位のビットが 0 :S=0.
  • 「IN r,(C)」の実行時,データの正負に応じてセット/リセットされる.
Z ゼロフラグ
  • 8ビット算術演算命令の実行結果の値のすべてのビットが 0 :Z=1,ひとつでも 1 がある:Z=0.
  • サーチ命令で 探索データが見つかった場合 (A レジスターの値と (HL)レジスターが示すメモリーの値が一致)とき,値がセットされる.
  • ビットテスト命令では,指定のビットの補数が Z フラグに入る.
  • 入出力命令 INI と IND,OUTI,OUTD の実行後,デクリメントレジスターが B がゼロの場合,Z=1 になる.
  • I/Oデバイスからの入力「IN r,(C)」のとき,インプットデータが0バイトの時,Z=1 になる.
H ハーフキャリーフラグ
  • 8ビットの算術加算命令の実行結果で,ビット3からビット4に桁上がりが有る場合:H=0,無い場合:H=0
  • 8ビットの算術減算命令の実行結果で,ビット4からの借りが有る場合:H=0,無い場合:H=0
P/V パリティ/オーバーフローフラグ
  • 算術演算の場合はオーバーフロー(-128 — +127 の範囲を超える)が生じた場合:P/V=1,これ以外の場合:P/V=0.
  • 2の補数演算で,オーバーフロー(-128 — +127 の範囲を超える)が生じた場合:P/V=1.
  • 論理演算命令の実行結果の値のビットに 1 が偶数個の時:P/V=1,奇数の時:P/V=0.
  • ブロック転送命令で,バイトカウンターの BC レジスターの値がゼロでない場合:P/V=1,ゼロの場合:P/V=0.
  • 「LD A,I」と「LD A,R」の実行時,割り込みイネーブル フリップフロップの内容が,P/Vに移される.
  • 「IN r,(C)」の実行時,データのパリティに応じてセット/リセットされる.
N 加算/減算フラグ
  • ADD 命令:N=1,SUB 命令:N=0.
C キャリーフラグ
  • ADD/SUB 演算命令の実行結果の値にキャリー(桁上げ)/ボロー(上の桁からの借り)があった場合:C=1,その他の場合:C=0.
  • DAA 命令で10進補正を行う条件が整った時:C=1.
  • RLA, RRA, RLS, RRS 命令では,ローテートするビットの一部になります.
  • RLCA, RLC, SLA 命令では,メモリーのビット 7 の値になります.
  • RRCA, RRC, SRA, SRL 命令では,メモリーのビット 0 の値になります.
  • AND, OR, XOR 命令では,C=0 になります.
  • SCF 命令:C=1,CCF 命令:C=0.

Intel 8080/8085 との比較

算術演算のパリティフラグの動作を除いて,Zilog Z80 は Intel 8080/8085 とバイナリーレベルで上位互換です.8080/8085 の算術演算ではパリティフラグは変化しませんが,Z80 では変化します.したがって,8080/8085 のプログラムの算術演算のパリティフラグをチェックするプログラムは意味がありません.勘違いしない限り,そのようなプログラムは書かないでしょう.この唯一の例外さえ常識的に取り扱えば,8080/8085 で動作するプログラムは Z80 で動作します.ただし,逆は保証できません.バイナリーレベルで上位互換であっても,同じ動作電圧の Intel 8085 を Z80 と交換はできません.IC のピン配置や機能が異なります.

以降の命令セットの説明の表中の命令が青字の場合,Intel 8080/8085 と互換があります.その命令をマウスで指し示すと,Intel ニーモニックで互換命令が表示されます.

Zilog Z80 の命令セット (ニーモニック) は,Intel 8080/8085 に比べて分かり易くなっています.オペランドの命名が規則的で,大部分のものは最初の 2 – 3 文字で動作が分かり,カテゴリー分けがクリアーです.動作の対象は,必ずオペコードにかかれます.例えば,BC レジスターが示すアレスの内容を A レジスターにコピーする命令は,Z80:「LD A,(BC)」,8080/8085:「LDAX B」と書かれます.8080/8085 ではコピー先がオペランドに書かれているので,命令が分かり難いと感じられるでしょう.さらに,この例でも分かるように,オペコードに括弧が使われると,それはメモリ/IOデバイスのアドレスになります.例えば (3D4FH) や (HL),があるとそれは,括弧内の数値やレジスターの値はメモリーのアドレスを表します.括弧がない場合は,数字になります.このような工夫がされているので,Z80 のニーモニックで書かれたプログラムは分かりやすくなります.

転送・交換命令

Z80 の転送命令は LD で,交換命令は EX で始まります.それぞれ,LoaD と EXchange の略です.これらの命令は,データの転送に使われます.ここでは,これらの命令について説明します.

8 ビット転送

Z80 の 8 ビット (1 バイト)の転送命令は,メモリーやレジスター,プログラムに書かれた 1 バイトのデータをメモリーやレジスターにコピーします.プログラムに書かれたデータをリテラルと呼ばれます.メモリーに保管されるデータは 1 バイト単位,また通常の演算も 1 バイト単位です.そのため,この 8 ビット転送命令は,使用の命令はプログラム中で多く使われます.

Z80 の 8 ビットの転送命令
命令 英語(機能など) 機能 命令コード フラグ M/T
LD r1,r2 Load Reg. r1 with Reg. r2 レジスター レジスター
  r1 r2
01DDDSSS 1/4
LD r,n Load Reg. r with value n レジスター リテラル
  r n
00DDD110
byte 2:n
2/7
LD r,(HL) Load Reg. r with location (HL) レジスター メモリー
  r (HL)
01DDD110 2/7
LD r,(IX+d) Load Reg. r with location (IX+d) レジスター メモリー
  r (IX+d)
11011101
01DDD110
byte 3:d
5/19
LD r,(IY+d) Load Reg. r with location (IY+d) レジスター メモリー
  r (IX+d)
11111101
01DDD110
byte 3:d
5/19
LD (HL),r Load location (HL) with Reg. r メモリー レジスター
  (HL) r
01110SSS 2/7
LD (IX+d),r Load Reg. r with location (IX+d) メモリー レジスター
  (IX+d) r
11011101
01110DDD
byte 3:d
5/19
LD (IY+d),r Load Reg. r with location (IY+d) メモリー レジスター
  (IY+d) r
11111101
01110DDD
byte 3:d
5/19
LD (HL),n Load location (HL) with value n メモリー リテラル
  (HL) n
00110110
byte 2:n
3/10
LD (IX+d),n Load location (IX+d) with value n メモリー リテラル
  (IX+d) n
11011101
00110110
byte 3:d
byte 4:n
5/19
LD (IY+d),n Load location (IY+d) with value n メモリー リテラル
  (IY+d) n
11111101
00110110
byte 3:d
byte 4:n
5/19
LD A,(BC) Load Acc. wth location (BC) アキュームレーター メモリー
  A (BC)
00001010 2/7
LD A,(DE) Load Acc. wth location (DE) アキュームレーター メモリー
  A (DE)
00011010 2/7
LD A,(nn) Load Acc. wtih location (nn) アキュームレーター メモリー
  A (byte 3 byte 2)
00111010
byte 2
byte 3
4/13
LD (BC),A Load location (BC) wtih Acc. メモリー アキュームレーター
  (BC) A
00000010 2/7
LD (DE),A Load location (DE) wtih Acc. メモリー アキュームレーター
  (DE) A
00010010 2/7
LD (nn),A Load location (nn) メモリー アキュームレーター
  (byte 3 byte 2) A
00110010
byte 2
byte 3
4/13
LD A,I Load Acc. with I アキュームレータ 割り込みレジスタ
  A I
11101101
01010111
S,Z,H,P/V,N 2/9
LD I,A Load I wiht Acc. 割り込みレジスタ アキュームレータ
  I A
11101101
01000111
2/9
LD A,R Load Acc. with Reg. R アキュームレータ リフレッシュレジスタ
  A R
11101101
01011111
S,Z,H,P/V,N 2/9
LD R,A Load R with Acc. リフレッシュレジスタ アキュームレータ
  R A
11101101
01001111
2/9

16 ビット転送

Z80 の 16 ビット (2 バイト)の転送命令は,メモリーやレジスター,プログラム(リテラル)に書かれた 2 バイトのデータをメモリーやレジスターにコピーします.主な 16 ビットのデータは,メモリーのアドレスに関するものです.したがって,ここで説明する 16 ビット転送命令はアドレスの操作に使われることが多くなります.

Z80 の 8 ビットの転送命令
命令 英語(機能など) 機能 命令コード フラグ M/T
LD rp,nn Load Reg. pair rp with value nn. レジスターペア リテラル
  rL nnL
  rH nnH
00RP0001
byte 2:nnL
byte 3:nnH
3/10
LD IX,nn Load IX with value nn レジスター リテラル
  IXL nnL
  IXH nnH
11011101
00100001
byte 3:nnL
byte 4:nnH
4/14
LD IY,nn Load IY with value nn レジスター リテラル
  IYL nnL
  IYH nnH
11111101
00100001
byte 3:nnL
byte 4:nnH
4/14
LD HL,(nn) Load HL with location (nn). レジスター メモリー
  L (nn)
  H (nn + 1)
00101010
byte 2:nnL
byte 3:nnH
5/16
LD rp,(nn) Load Reg. pair rp with location (nn) レジスターペア メモリー
  rL (nn)
  rH (nn + 1)
11101101
01RP1011
byte 3:nnL
byte 4:nnH
6/20
LD IX,(nn) Load IX with location (nn) レジスター メモリー
  IXL (nn)
  IXH (nn + 1)
11011101
00101010
byte 3:nnL
byte 4:nnH
6/20
LD IY,(nn) Load IY with location (nn) レジスター メモリー
  IYL (nn)
  IYH (nn + 1)
11111101
00101010
byte 3:nL
byte 4:nH
6/20
LD (nn),HL Load location (nn) with HL. メモリー レジスター HL
  (nn) L
  (nn + 1) H
00100010
byte 2:nnL
byte 3:nnH
5/16
LD (nn),rp Load location (nn) with Reg. pair rp. メモリー レジスター
  (nn) rpL
  (nn + 1) rpH
11101101
01RP0011
byte 3:nnL
byte 4:nnH
6/20
LD (nn),IX Load location (nn) with IX. メモリー レジスター IX
  (nn) IXL
  (nn + 1) IXH
11011101
00100010
byte 3:nnL
byte 4:nnH
6/20
LD (nn),IY Load location (nn) with IY. メモリー レジスター IY
  (nn) IYL
  (nn + 1) IYH
11111101
00100010
byte 3:nnL
byte 4:nnH
6/20
LD SP,HL Load SP with HL. スタックポインターの変更
  SP HL
11111001 1/6
LD SP,IX Load SP with IX. スタックポインターの変更
  SP IX
11011101
11111001
2/10
LD SP,IY Load SP with IY. スタックポインターの変更
  SP IY
11111101
11111001
2/10

ブロック転送

ブロック転送命令は,多くのメモリーのデータを一度に転送するときに使うと便利です.もちろん,ブロック転送ができるのはメモリ間のみです.HL レジスターが示すメモリーアドレスのデータが,DE レジスターが示すメモリーのアドレスにコピーされます.転送されるデータ数は,BC レジスターで制御します.

ブロック転送命令
命令 英語(機能など) 機能 命令コード フラグ M/T
LDI Load location (DE) with Loacation (HL), increment DE, HL, decrement BC メモリー メモリー
  (DE) (HL)
  DE DE+1
  HL HL+1
  BC BC-1
11101101
10100000
H=1
p/V=1(BC≠1),
  0(その他)
N=0
4/16
LDIR
(BC)がゼロになるまで右のステップを繰り返す.
Load location (DE) with Loacation (HL), increment DE, HL, decrement BC and repeat until BC=0. メモリー メモリー
  (DE) (HL)
  DE DE+1
  HL HL+1
  BC BC-1
11101101
10110000
H=0
p/V=0
N=0
5/21(BC≠0)
4/16(BC=0)
LDD Load location (DE) with Loacation (HL), decrement DE, HL and BC メモリー メモリー
  (DE) (HL)
  DE DE-1
  HL HL-1
  BC BC-1
11101101
10101000
H=1
p/V=1(BC≠1),
  0(その他)
N=0
4/16
LDDR
(BC)がゼロになるまで右のステップを繰り返す.
Load location (DE) with Loacation (HL), decrement DE, HL and BC; repeat until BC=0. メモリー メモリー
  (DE) (HL)
  DE DE-1
  HL HL-1
  BC BC-1
11101101
10111000
H=0
p/V=0
N=0
5/21(BC≠0)
4/16(BC=0)

交換

EXから始まる命令は,レジスター/スタックの値の交換を実行します.レジスター — レジスター,レジスター — スタック領域の値の交換は可能です.メモリー — レジスター,メモリー — スタック領域の交換は不可能です.これらの場合は,転送命令やスタック操作命令を組み合わせる必要があります.

以下の表の交換命令は,レジスターやスタックの一時保管に大変便利です.もちろん,これ以外の目的にも使われます.

Z80 のレジスター/スタックの値の交換命令
命令 英語(機能など) 機能 命令コード フラグ M/T
EX DE,HL Exchange H and L with D and E レジスターペア レジスターペア
  H D
  L E
11101011 1/4
EX AF,AF' Exchange A and F with A' and F' 主レジスターペア 補助レジスターペア
  A A'
  F F'
00001000 1/4
EXX Exchange BC, DE and HL with BE', DE' and HL' 主レジスターペア 補助レジスターペア
  BC BC'
  DE DE'
  HL HL'
11011001 1/4
EX (SP),HL Exchange stack top with H and L SP が示す値と HL の値の交換
  L (SP)
  H (SP+1)
11100011 5/19
EX (SP),IX Exchange stack top with IX SP が示す値と IX の値の交換
  IXL (SP)
  IXH (SP+1)
11011101
11100011
6/23
EX (SP),IY Exchange stack top with IY SP が示す値と IY の値の交換
  IYL (SP)
  IYH (SP+1)
11111101
11100011
6/23

スタック操作命令

一般にマイクロプロセッサーは,メモリーの一部をスタック領域として使うための機能が用意されています.ステックポインター(SP)と呼ばれる16ビットのレジスターがスタックの最上位アドレスを記憶します.そこに1バイトのデータを入れると (PUSH) スタックポインーの値がひとつ減ります.1 バイトのデータを取り出す (POP) すると,スタックポインターの値が増加します.

以下の表では,スタックの操作の命令 (PUSH, POP) について説明します.レジスター (HL, IX, IY) の値をスタックポインター (SP) にコピーする命令は「16 ビット転送命令」,スタックポインターと HL レジスターの値の交換は「交換,ブロック転送,サーチ」の節で示しています.

Z80 の スタック操作命令
命令 英語(機能など) 機能 命令コード フラグ M/T
PUSH rp
「PUSH SP」は使用不可
Push Reg. on Stack. プッシュ
  スタック レジスタペア
  (SP-1) rH
  (SP-2) rL
  SP SP-2
11RP0101 3/11
PUSH AF Push Reg. A and F on Stack. プッシュ(CPU状態)
  スタック レジスタ A, F
  (SP-1) A
  (SP-2) F
  SP SP-2
11110101 3/11
PUSH IX Push Reg. IX on Stack. プッシュ
  スタック レジスタ IX
  (SP-1) IXH
  (SP-2) IXL
  SP SP-2
11011101
11100101
4/15
PUSH IY Push Reg. IY on Stack. プッシュ
  スタック レジスタ IY
  (SP-1) IYH
  (SP-2) IYL
  SP SP-2
11111101
11100101
4/15
POP rp
「POP SP」は使用不可
Pop Reg. from Stack. ポップ
  レジスタペア スタック
  rL (SP)
  rH (SP+1)
  SP SP+2
11RP0001 3/10
POP AF Pop Reg. AF from Stack. ポップ(CPU状態)
  レジスター A, F スタック
  F (SP)
  A (SP+1)
  SP SP+2
11110001 S, Z, H, P/V, H, N, C 3/10
POP IX Pop Reg. IX from Stack. ポップ
  レジスタ IX スタック
  IXH (SP)
  IXL (SP+1)
  SP SP+2
11011101
11100001
4/14
POP IY Pop Reg. IY from Stack. ポップ
  レジスタ IY スタック
  IYH (SP)
  IYL (SP+1)
  SP (SP)+2
11111101
11100001
4/14

ローテート・シフト

ローテートやシフト命令を使うことで,レジスターあるいはメモリーの 1 バイト (8ビット) のデータのビット列の並びを左や右にずらすことができます.このような操作はいろいろな場面で必要になります.最も分かりやすい例は,乗算や除算演算です.データのビット列を左にずらすと,データの値は 2 倍に,右にずらすと 1/2 倍になります.加算や減算を繰り返すことよりも高速に動作します.Z80 には乗算/除算演算命令がないので,工夫が必要です.

ローテート命令は,データのビットが循環的に移動します.この命令を繰り返すと,ビット列はいずれ元の状態に戻ります.一方,シフト命令の場合,データの移動は一方向です.命令を繰り返しても,元の状態に戻ることはありません.

左ローテート

循環的に,データを左にずらします.空いた第 0 ビットには,第 7 ビットあるいはキャリフラグ (C) の値が入ります.

Z80 左ローテート命令
命令 英語(機能など) 機能 命令コード フラグ M/T
RLCA Rotate Left Circular Acc. 左ローテート(アキュームレーター)
  A0 A7
  An An-1
  C A7
00000111 H=0, N=0, C 1/4
RLA Rotate Left Acc. through carry 左ローテート(キャリーを含む)
  A0 C
  C A7
  An An-1
00010111 H=0, N=0, C 1/4
RLC r Rotate register Left Circular 左ローテート(レジスター)
  r0 r7
  rn rn-1
  C r7
11001011
00000SSS
S, Z, H=0, P/V, N=0, C 1/4
RLC (HL) Rotate memory (HL) Left Circular 左ローテート(メモリー)
  (HL)0 (HL)7
  (HL)n (HL)n-1
  C (HL)7
11001011
00000110
S, Z, H=0, P/V, N=0, C 4/15
RLC (IX+d) Rotate memory (IX+d) Left Circular 左ローテート(メモリー)
  (IX+d)0 (IX+d)7
  (IX+d)n (IX+d)n-1
  C (IX)7
11011101
11001011
bit 3:d
00000110
S, Z, H=0, P/V, N=0, C 6/23
RLC (IY+d) Rotate memorly (IY+d) Left Circular 左ローテート(メモリー)
  (IY+d)0 (IY+d)7
  (IY+d)n (IY+d)n-1
  C (IY)7
11111101
11001011
bit 3:d
00000110
S, Z, H=0, P/V, N=0, C 6/23
RL r Rotate Left register 左ローテート(レジスター)
  r0 C
  rn rn-1
  C r7
11001011
00010SSS
S, Z, H=0, P/V, N=0, C 2/8
RL (HL) Rotate Left memory 左ローテート(メモリー)
  (HL)0 C
  (HL)n (HL)n-1
  C (HL)7
11001011
00010110
S, Z, H=0, P/V, N=0, C 4/15
RL (IX+d) Rotate Left memory 左ローテート(メモリー)
  (IX+d)0 C
  (IX+d)n (IX+d)n-1
  C (IX+d)7
11011101
11001011
byte 3:d
00010110
S, Z, H=0, P/V, N=0, C 6/23
RL (IY+d) Rotate Left memory 左ローテート(メモリー)
  (IY+d)0 C
  (IY+d)n (IY+d)n-1
  C (IY+d)7
11111101
11001011
byte 3:d
00010110
S, Z, H=0, P/V, N=0, C 6/23

右ローテート

循環的に,データを右にずらします.空いた第 7 ビットには,第 7 ビットあるいはキャリフラグ (C) の値が入ります.

Z80 右ローテート
命令 英語(機能など) 機能 命令コード フラグ M/T
RRCA Rotate Right Circular Acc. 右ローテート
  A7 A0
  An An+1
  C A0
00001111 H=0, N=0, C 1/4
RRA Rotate Right Acc. through carry 右ローテート(キャリーを含む)
  A7 C
  An An+1
  C A0
00011111 H=0, N=0, C 1/4
RRC r Rotate register Right Circular 右ローテート(レジスター)
  r7 r0
  rn rn+1
  C r0
11001011
00001SSS
S, Z, H=0, P/V, N=0, C 1/4
RRC (HL) Rotate memory (HL) Right Circular 右ローテート(メモリー)
  (HL)7 (HL)0
  (HL)n (HL)n+1
  C (HL)0
11001011
00001110
S, Z, H=0, P/V, N=0, C 4/15
RRC (IX+d) Rotate memory (IX+d) Right Circular 右ローテート(メモリー)
  (IX+d)7 (IX+d)0
  (IX+d)n (IX+d)n+1
  C (IX)0
11011101
11001011
bit 3:d
00001110
S, Z, H=0, P/V, N=0, C 6/23
RRC (IY+d) Rotate memorly (IY+d) Right Circular 右ローテート(メモリー)
  (IY+d)7 (IY+d)0
  (IY+d)n (IY+d)n+1
  C (IY)0
11111101
11001011
bit 3:d
00001110
S, Z, H=0, P/V, N=0, C 6/23
RR r Rotate Right register 右ローテート(レジスター)
  r7 C
  rn rn+1
  C r0
11001011
00011SSS
S, Z, H=0, P/V, N=0, C 2/8
RR (HL) Rotate Right memory 右ローテート(メモリー)
  (HL)7 C
  (HL)n (HL)n+1
  C (HL)0
11001011
00011110
S, Z, H=0, P/V, N=0, C 4/15
RR (IX+d) Rotate Right memory 右ローテート(メモリー)
  (IX+d)7 C
  (IX+d)n (IX+d)n+1
  C (IX+d)0
11011101
11001011
byte 3:d
00011110
S, Z, H=0, P/V, N=0, C 6/23
RR (IY+d) Rotate Right memory 右ローテート(メモリー)
  (IY+d)7 C
  (IY+d)n (IY+d)n+1
  C (IY+d)0
11111101
11001011
byte 3:d
00011110
S, Z, H=0, P/V, N=0, C 6/23

左シフト

データを左にずらします.空いた第 0 ビットには 0 が入ります.

Z80 左シフト命令
命令 英語(機能など) 機能 命令コード フラグ M/T
SLA r Shift operand register left Arithmetic 左シフト(レジスター)
  r0 0
  rn rn-1
  C r7
11001011
00100SSS
S, Z, H=0, P/V, N=0, C 2/8
SLA (HL) Shift operand location (HL) left Arithmetic 左シフト(メモリー)
  (HL)0 0
  (HL)n (HL)n-1
  C (HL)7
11001011
00100110
S, Z, H=0, P/V, N=0, C 4/15
SLA (IX+d) Shift operand location (IX+d) left Arithmetic 左シフト(メモリー)
  (IX+d)0 0
  (IX+d)n (IX+d)n-1
  C (IX+d)7
11011101
11001011
byte 3:d
00100110
S, Z, H=0, P/V, N=0, C 6/23
SLA (IY+d) Shift operand location (IY+d) left Arithmetic 左シフト(メモリー)
  (IY+d)0 0
  (IY+d)n (IY+d)n-1
  C (IY+d)7
11111101
11001011
byte 3:d
00100110
S, Z, H=0, P/V, N=0, C 6/23

右シフト

1 バイトのデータを右にずらします.命令によって,空いた第 7 ビットには 0 あるいはそのままのビットが入ります.

Z80 右シフト命令
命令 英語(機能など) 機能 命令コード フラグ M/T
SRA r Shift operand register Right Arithmetic 右シフト(レジスター)
  r7 r7 :変化せず
  rn rn+1
  C r0
11001011
00101SSS
S, Z, H=0, P/V, N=0, C 2/8
SRA (HL) Shift operand location (HL) Right Arithmetic 右シフト(メモリー)
  (HL)7 (HL)7 :変化せず
  (HL)n (HL)n+1
  C (HL)0
11001011
00101110
S, Z, H=0, P/V, N=0, C 4/15
SRA (IX+d) Shift operand location (IX+d) Right Arithmetic 右シフト(メモリー)
  (IX+d)7 (IX+d)7 :変化せず
  (IX+d)n (IX+d)n+1
  C (IX+d)0
11011101
11001011
byte 3:d
00101110
S, Z, H=0, P/V, N=0, C 6/23
SRA (IY+d) Shift operand location (IY+d) Right Arithmetic 右シフト(メモリー)
  (IY+d)7 (IY+d)7 :変化せず
  (IY+d)n (IY+d)n+1
  C (IY+d)0
11111101
11001011
byte 3:d
00101110
S, Z, H=0, P/V, N=0, C 6/23
SRL r Shift operand register Right Logical 右シフト(レジスター)
  r7 0
  rn rn+1
  C r0
11001011
00111SSS
S, Z, H=0, P/V, N=0, C 2/8
SRL (HL) Shift operand location (HL) Right Logical 右シフト(メモリー)
  (HL)7 0
  (HL)n (HL)n+1
  C (HL)0
11001011
00111110
S, Z, H=0, P/V, N=0, C 4/15
SRL (IX+d) Shift operand location (IX+d) Right Logical 右シフト(メモリー)
  (IX+d)0 0
  (IX+d)n (IX+d)n+1
  C (IX+d)0
11011101
11001011
byte 3:d
00111110
S, Z, H=0, P/V, N=0, C 6/23
SRL (IY+d) Shift operand location (IY+d) Right Logical 右シフト(メモリー)
  (IY+d)7 0
  (IY+d)n (IY+d)n+1
  C (IY+d)0
11111101
11001011
byte 3:d
00111110
S, Z, H=0, P/V, N=0, C 6/23

算術演算命令

Z80 で可能な算術演算は,加算と減算のみです.CPU の機能には,乗算や除算の演算はありません.それらは,プログラマーの仕事です.算術演算の対象データは,8 ビットあるいは 16 ビットです.実際のプログラムでは,主に前者の方が使われます.Z80 は 8 ビット CPU なので,基本的なデータの単位は 8 ビットだからです.

8ビット算術演算

加算・インクリメント

8 ビットの加算命令の演算結果は,アキュームレーター (A レジスター)に入ります.A レジスターと他のレジスターあるいはメモリーとの加算演算が実行できます.インクリメントは,値をひとつ増加させます.

Z80 の 8 ビット算術演算命令 (加算・インクリメント)
命令 英語(機能など) 機能 命令コード フラグ M/T
ADD A,r Add Reg. r to Acc. レジスター + レジスター
  A A + r
10000SSS S, Z, H, P/V, N, C 1/4
ADD A,n Add value n to Acc. レジスター + リテラル
  A A + n
11000110
byte 2:n
S, Z, H, P/V, N, C 2/7
ADD A,(HL) Add location (HL) to Acc. レジスター + メモリー
  A A+(HL)
10000110 S, Z, H, P/V, N, C 2/7
ADD A,(IX+d) Add location (IX+d) to Acc. レジスター + メモリー
  A A+(IX+d)
11011101
10000110
byte 3:d
S, Z, H, P/V, N, C 5/19
ADD A,(IY+d) Add location (IY+d) to Acc. レジスター + メモリー
  A A+(IY+d)
11111101
10000110
byte 3:d
S, Z, H, P/V, N, C 5/19
ADC A, r Add Resister with carry レジスター + レジスター + キャリー
  A A+r+C
10001SSS S, Z, H, P/V, N, C 1/4
ADC A,n Add immediate with carry レジスター + リテラル + キャリー
  A A + n + C
11001110
byte 2:n
S, Z, H, P/V, N, C 2/7
ADC A,(HL) Add memory with carry レジスター + メモリー + キャリー
  A A+(HL)+C
10001110 S, Z, H, P/V, N, C 2/7
ADC A,(IX+d) Add memory with carry レジスター + メモリー + キャリー
  A A+(IX+d)+C
11011101
10001110
byte 3:d
S, Z, H, P/V, N, C 5/19
ADC A,(IY+d) Add memory with carry レジスター + メモリー + キャリー
  A A+(IY+d)+C
11111101
10001110
byte 3:d
S, Z, H, P/V, N, C 5/19
INC r Increment Register インクリメントレジスター
  r r+1
00DDD100 S, Z, H, P/V, N, C 1/4
INC (HL) Increment location (HL) インクリメントメモリー
  (HL) (HL)+1
00110100 S, Z, H, P/V, N, C 3/11
INC (IX+d) Increment location (IX+d) インクリメントメモリー
  (IX+d) (IX+d)+1
11011101
00110100
byte 3:d
S, Z, H, P/V, N, C 6/23
INC (IY+d) Increment location (IY+d) インクリメントメモリー
  (IY+d) (IY+d)+1
11111101
00110100
byte 3:d
S, Z, H, P/V, N, C 6/23

減算・デクリメント

8 ビットの減算命令の演算結果は,アキュームレーター (A レジスター)に入ります.A レジスターと他のレジスターあるいはメモリーとの減算演算が実行できます.デクリメントは,値をひとつ減少させます.

Z80 の 8 ビット算術演算命令 (減算・デクリメント)
命令 英語(機能など) 機能 命令コード フラグ M/T
SUB r Substract Register レジスター - レジスター
  A A - r
10010SSS S, Z, H, P/V, N, C 1/4
SUB n Substract immediate レジスター - リテラル
  A A - n
11010110
byte 2:n
S, Z, H, P/V, N, C 2/7
SUB (HL) Substract memory レジスター - メモリー
  A A - (HL)
10010110 S, Z, H, P/V, N, C 2/7
SUB (IX+d) Substract memory レジスター - メモリー
  A A - (IX+d)
11011101
10010110
byte 3:d
S, Z, H, P/V, N, C 5/19
SUB (IY+d) Substract memory レジスター - メモリー
  A A - (IY+d)
11111101
10010110
byte 3:d
S, Z, H, P/V, N, C 5/19
SBC A, r Subtract Resister with carry レジスター - レジスター - キャリー
  A A - r - C
10011SSS S, Z, H, P/V, N, C 1/4
SBC A,n Subtract immediate with carry レジスター - リテラル - キャリー
  A A- n - C
11011110
byte 2:n
S, Z, H, P/V, N, C 2/7
SBC A,(HL) Subtract memory with carry レジスター - メモリー - キャリー
  A A - (HL) - C
10011110 S, Z, H, P/V, N, C 2/7
SBC A,(IX+d) Subtract memory with carry レジスター - メモリー - キャリー
  A A - (IX+d) - C
11011101
10011110
byte 3:d
S, Z, H, P/V, N, C 5/19
SBC A,(IY+d) Subtract memory with carry レジスター - メモリー - キャリー
  A A - (IY+d) - C
11111101
10011110
byte 3:d
S, Z, H, P/V, N, C 5/19
DEC r Decrement Register デクリメントレジスター
  r r - 1
00DDD101
S, Z, H, P/V, N, C 1/4
DEC (HL) Decrement memory (HL) デクリメントメモリー
  (HL) (HL) - 1
00110101
S, Z, H, P/V, N, C 3/11
DEC (IX+d) Decrement location (IX+d) デクリメントメモリー
  (IX+d) (IX+d) - 1
11011101
00110101
byte 3:d
S, Z, H, P/V, N, C 6/23
DEC (IY+d) Decrement location (IY+d) デクリメントメモリー
  (IY+d) (IY+d) - 1
11111101
00110101
byte 3:d
S, Z, H, P/V, N, C 6/23

16ビット算術演算

加算・インクリメント

レジスタペア (BC, DE, HL) あるいはインデックスレジスター (IX, IY) では, 16ビットデータ同士の加算も可能です.

Z80 の 16 ビット算術演算命令 (加算・インクリメント)
命令 英語(機能など) 機能 命令コード フラグ M/T
ADD HL,rp Add register pair to H and L レジスター + レジスター
  HL HL + rp
00RP1001 H, N, C 3/11
ADC HL,rp Add with carry register pair to HL レジスター + レジスター + キャリー
  HL HL + rp + C
11101101
01RP1010
S, Z, H, P/V, N, C 4/15
ADD IX,rp Add register pair to IX レジスター + レジスター
  IX IX + rp
11011101
00RP1001
H, N, C 4/15
ADD IY,rp Add register pair to IY レジスター + レジスター
  IY IY + rp
11111101
00RP1001
H, N, C 4/15
INC rp Increment register pair インクリメントレジスターペア
  rp rp + 1
00RP0011 1/6
INC IX Increment location regster インクリメントレジスター
  IX IX + 1
11011101
00100011
2/10
INC IY Increment register インクリメントレジスター
  IY IY + 1
11111101
00100011
6/23

減算・デクリメント

レジスタペア (BC, DE, HL) あるいはインデックスレジスター (IX, IY) では, 16ビットデータ同士の減算も可能です.

Z80 の 16 ビット算術演算命令 (減算・デクリメント)
命令 英語(機能など) 機能 命令コード フラグ M/T
SBC HL,rp Subtract register pair from HL with carry レジスター - レジスター - キャリー
  HL HL - rp - C
11101101
01RP0010
S, Z, H, P/V, N, C 4/15
DEC rp Decrement register pair デクリメントレジスターペア
  rp rp - 1
00RP1011
1/6
DEC IX Decrement location regster デクリメントレジスター
  IX IX - 1
11011101
00101011
2/10
DEC IY Decrement location regster デクリメントレジスター
  IY IY - 1
11111101
00101011
2/10

論理・ビット演算命令

Z80 は 8 ビットのレジスターやメモリーのデータのビットの論理演算 (論理和,論理席,排他的論理和,否定) が可能です.ビットを反転する否定演算は,1 の補数と同じです.

論理演算

8 ビットデータのビット同士の論理演算を実行します.1 の補数は否定演算と同じで,ビットが反転します.2 の補数はビット反転の後,+1 加算されます.これは符号付き整数の符号の反転(-1 を乗算) を行います.

Z80 の論理演算命令
命令 英語(機能など) 機能 命令コード フラグ M/T
AND r AND Register 論理積(レジスター)
  A A ∧ r
10100SSS S, Z, H=1, P/V, N=0, C=0 1/4
AND n AND immediate 論理積(リテラル)
  A A ∧ n
11100110
byte 2:n
S, Z, H=1, P/V, N=0, C=0 2/7
ADN (HL) AND Memory 論理積(メモリー)
  A A ∧ (HL)
10100110 S, Z, H=1, P/V, N=0, C=0 2/7
AND (IX+d) AND Memory 論理積(メモリー)
  A A ∧ (IX+d)
11011101
10100110
byte 3:d
S, Z, H=1, P/V, N=0, C=0 5/19
AND (IY+d) AND Memory 論理積(メモリー)
  A A ∧ (IY+d)
11111101
10100110
byte 3:d
S, Z, H=1, P/V, N=0, C=0 5/19
OR r OR Register 論理和(レジスター)
  A A ∨ r
10110SSS S, Z, H=1, P/V, N=0, C=0 1/4
OR n OR immediate 論理和(リテラル)
  A A ∨ n
11110110
byte 2:n
S, Z, H=1, P/V, N=0, C=0 2/7
OR (HL) OR Memory 論理和(メモリー)
  A A ∨ (HL)
10110110 S, Z, H=1, P/V, N=0, C=0 2/7
OR (IX+d) OR Memory 論理和(メモリー)
  A A ∨ (IX+d)
11011101
10110110
byte3:d
S, Z, H=1, P/V, N=0, C=0 5/19
OR (IY+d) OR Memory 論理和(メモリー)
  A A ∨ (IY+d)
11111101
10110110
byte3:d
S, Z, H=1, P/V, N=0, C=0 5/19
XOR r Exclusive OR Register 排他的論理和(レジスター)
  A A ⊕ r
10101SSS S, Z, H=1, P/V, N=0, C=0 1/4
XOR n Exclusive OR immediate 排他的論理和(リテラル)
  A A ⊕ n
11101110
byte 2:n
S, Z, H=1, P/V, N=0, C=0 2/7
XOR (HL) Exclusive OR Memory 排他的論理和(メモリー)
  A A ⊕ (HL)
10101110 S, Z, H=1, P/V, N=0, C=0 2/7
XOR (IX+d) Exclusive OR Memory 排他的論理和(メモリー)
  A A ⊕ (IX+d)
11011101
10101110
byte 3:d
S, Z, H=1, P/V, N=0, C=0 5/19
XOR (IY+d) Exclusive OR Memory 排他的論理和(メモリー)
  A A ⊕ (IY+d)
11111101
10101110
byte 3:d
S, Z, H=1, P/V, N=0, C=0 5/19
CPL Complement acc. (1's Comp.) 1の補数(アキュームレーター)
  A A
00101111 H=1, N=1 1/4
NEG Negate Acc. (2's Comp.) 2の補数(アキュームレーターの符号反転)
  A A+1
11101101
01000100
S, Z, H, P/V, N=1, C 2/8

ビット操作

特定のビットのみを操作することができます.以下の表で操作するビットはひとつです.命令のオペランドの b は 0 — 7 の整数で,対象のビットの示します.それは,命令コードで三桁の二進数 (bbb) に変換されます.

Z80 ビット操作命令.括弧付きフラグレジスターは不定を表す.
命令 英語(機能など) 機能 命令コード フラグ M/T
CCF Complement Carry Flag 1の補数(キャリー)
  C C
00111111 H, N=0, C 1/4
SCF Set Carry Flag キャリーを1に
  C 1
00110111 H=0, N=0, C 1/4
BIT b,r Test BIT b of register r ビット b の補数が Z に(レジスター)
  Z rb
11001011
01bbbSSS
(S), Z, H=1, (P/V), N=0 2/8
BIT b,(HL) Test BIT b of lacation (HL) ビット b の補数が Z に(メモリー)
  Z (HL)b
11001011
01bbb110
(S), Z, H=1, (P/V), N=0 3/12
BIT b,(IX+d) Test BIT b of location (IX+d) ビット b の補数が Z に(メモリー)
  Z (IX+d)b
11011101
11001011
byte 3:d
01bbb110
(S)Z, H=1, (P/V), N=0 5/20
BIT b,(IY+d) Test BIT b of location (IY+d) ビット b の補数が Z に(メモリー)
  Z (IY+d)b
11111101
11001011
byte 3:d
01bbb110
(S), Z, (P/V), H=1, N=0 5/20
SET b,r SET bit b of register r ビット b を 1 に
  rb 1
11001011
11bbbSSS
2/8
SET b,(HL) SET bit b of lacation (HL) ビット b を 1 に
  (HL)b 1
11001011
11bbb110
4/15
SET b,(IX+d) SET bit b of location (IX+d) ビット b を 1 に
  (IX+d)b 1
11011101
11001011
byte 3:d
11bbb110
6/23
SET b,(IY+d) SET bit b of location (IY+d) ビット b を 1 に
  (IY+d)b 1
11111101
11001011
byte 3:d
11bbb110
6/23
RES b,r Reset bit b of register r ビット b を 0 に
  rb 1
11001011
10bbbSSS
2/8
RES b,(HL) Reset bit b of lacation (HL) ビット b を 0 に
  (HL)b 1
11001011
10bbb110
4/15
RES b,(IX+d) Reset bit b of location (IX+d) ビット b を 0 に
  (IX+d)b 1
11011101
11001011
byte 3:d
10bbb110
6/23
RES b,(IY+d) Reset bit b of location (IY+d) ビット b を 0 に
  (IY+d)b 1
11111101
11001011
byte 3:d
10bbb110
6/23

サーチ・比較命令

サーチ・比較の命令は,データを調べるために使います.結果はフラグレジスターに格納されます.通常は,条件付きジャンプ/コールと共に使われます.サーチは,メモリーのデータと A レジスターの値を,

これらのサーチと比較命令は,

サーチは,A レジスターと (HL) レジスターが示すメモリーの 8 ビットのデータの比較を行います.

サーチ命令
命令 英語(機能など) 機能 命令コード フラグ M/T
CPI Compare location (HL) and A, increment HL and decrement BC 比較:A, (HL)
  A (HL)
  HL HL+1
  BC BC-1
11101101
10100001
S, Z, H, P/V, N 4/16
CPIR
BC=0 or A=(HL)になるまで右を繰り返す.
Compare location (HL) and A, increment HL, decrement BC repeat until BC=0. 比較:A, (HL)
  A (HL)
  HL HL+1
  BC BC-1
11101101
10110001
S, Z, H, P/V, N 5/21(BC≠0, A≠HL)
4/16
CPD Compare location (HL) and A, decrement HL and BC 比較:A, (HL)
  A (HL)
  HL HL-1
  BC BC-1
11101101
10101001
S, Z, H, P/V, N 4/16
CPDR
BC=0 or A=(HL)になるまで右を繰り返す.
Compare location (HL) and A, decrement HL and BC repeat until BC=0. 比較:A, (HL)
  A (HL)
  HL HL-1
  BC BC-1
11101101
10111001
S, Z, H, P/V, N 5/21(BC≠0, A≠HL)
4/16

比較

しばしば,比較命令は条件付きジャンプ命令とペアで使われます.すると「if (条件) then 実行文」という構文ができます.

比較命令の動作は単純です.例えば,「CP  7F」とすると,アキュームレーター (レジスター A) の値から 7F を減算 (A - 7F) し,その結果に応じてフラグレジスターを設定します.フラグレジスターを調べることで,比較の結果が得られます.

データの比較命令
命令 英語(機能など) 機能 命令コード フラグ M/T
CP r Compare Register and A 比較(レジスター)
  A - r
10111SSS S, Z, H, P/V, N, C 1/4
CP n Compare value n and A 比較(リテラル)
  A - n
11111110
byte 2:n
S, Z, H, P/V, N, C 2/7
CP (HL) Compare Memory (HL) and A 比較(メモリー)
  A - (HL)
10111110 S, Z, H, P/V, N, C 2/7
CP (IX+d) Compare (IX+d) and A 比較(インデックスレジスター)
  A - (IX+d)
11011101
10111110
byte 3:d
S, Z, H, P/V, N, C 2/7
CP (IY+d) Compare (IY+d) and A 比較(インデックスレジスター)
  A - (IY+d)
11011101
10111110
byte 3:d
S, Z, H, P/V, N, C 2/7

分岐命令

分岐命令が無いプログラムは上から下に順番に実行されるだけで,退屈なものになります.分岐命令があると,プログラムの実行の順序を変えることができます.あるいは,これまでのプログラムの動作結果に応じて実行する命令が選択されます.前者を強制分岐,後者を条件分岐と呼びます.これらを使うことにより,複雑な動作のプログラムが可能になります.真に,コンピューターらしくなります.

一部の例外を除き条件分岐ではフラグレジスターの値に応じて,次に実行する命令が決まります.プログラム中では,下表の「条件記号 cc」でプログラムで指定するフラグレジスターの値を選択します.

分岐の条件
条件記号 cc 意味 フラグ CCC
NZ not zero Z=0 000
Z zero Z=1 001
NC not carry C=0 010
C carry C=0 011
PO parity odd P=0 100
PE parity even P=1 101
P plus S=0 110
M minus S=1 111

分岐命令には,ジャンプとコール/リターンがあります.前者は分岐先に行ったきりで呼び出し元に戻ることはありません.後者はコールで分岐先に飛び,リターンに出会うと呼び出し元に戻ります.要するに,ありふれたプログラミング言語のサブルーチンコールと同じです.

ジャンプ

プログラムは,強制ジャンプ命令に指定されアドレスに実行が移ります.条件ジャンプの場合には,条件が真 (TRUE) ならば指定のアドレス,偽 (FLASE) ならばジャンプの次の行に実行が移ります.いずれの場合も,Z80 はプログラムカウンター (PC) の値を変えることにより,次に実行する命令をコントロールします.

DJNZ を唯一の例外として,条件ジャンプはフラグレジスターの値により,ジャンプする/しないを決めます.通常は,ジャンプ命令に先立って,サーチ・比較命令論理演算などを使いフラグレジスターを設定します.

Z80 のジャンプ命令
命令 英語(機能など) 機能 命令コード フラグ M/T
JP nn Jump 強制ジャンプ
  PC nn
11000011
byte 2:nnL
byte 3:nnH
3/10
JP cc,nn Conditional Jump 条件ジャンプ (If cc then)
  PC nn
11CCC010
byte 2:nnL
byte 3:nnH
3/10
JR e Jump Relative to PC+e 強制ジャンプ(相対移動)
  PC PC + e
00011000
byte 2:e-2
3/12
JR C,e Jump Relative to PC+e if Carry=1 条件ジャンプ(相対移動) If C=1 then
  PC PC + e
00111000
byte 2:e-2
3/12
JR NC,e Jump Relative to PC+e if Carry=0 条件ジャンプ(相対移動) If C=0 then
  PC PC + e
00110000
byte 2:e-2
3/12
JR Z,e Jump Relative to PC+e if zero (Z=1) 条件ジャンプ(相対移動) If Z=1 then
  PC PC + e
00101000
byte 2:e-2
3/12
JR NZ,e Jump Relative to PC+e if non zero (Z=0) 条件ジャンプ(相対移動) If Z=0 then
  PC PC + e
00100000
byte 2:e-2
3/12
JP (HL) Jump to (HL) 強制ジャンプ
  PC HL
11101001 1/4
JP (IX) Jump to (IX) 強制ジャンプ
  PC IX
11011101
11101001
2/8
JP (IY) Jump to (IY) 強制ジャンプ
  PC IY
11111101
11101001
2/8
DJNZ e Decrement B and Jump relative if B=0 条件ジャンプ (B≠0)
  PC PC + e
  B B - 1
00010000
byte 2:e-2
3/13

コール・リターン

プログラムは,コール命令に出会うと指定されアドレスに実行が移り,リターン命令で呼び出し元に戻ります.普通の高級言語のサブルーチンコールと同じ働きをします.条件コール/リターンの場合には,サブルーチンの実行は条件に依存します.これらの動作では,Z80 はプログラムカウンター (PC) の値を変えることにより,次に実行する命令 (サブルーチンの先頭 or コールの次の行) をコントロールします.この辺りは,ジャンプ命令と似ています.コール呼び出しの時,リターンにより戻るアドレスがスタックに保存されることが,ジャンプ命令と異なります.これを忘れて,不用意にサブルーチンで POP すると,恐ろしい事態になります.サブルーチンの引数/戻り値をスタックを通して受け渡しする場合は,命令「EX (SP),HL」を使いリターンアドレスを一時退避/復帰します.

Z80 のコールリターン命令.M/T が二つある場合は,条件が前者:True, 後者:Flase です.
命令 英語(機能など) 機能 命令コード フラグ M/T
CALL nn Call コール
  SP-1 PCH
  SP-2 PCL
  SP SP-2
  PC nn
11001101
byte 2:nnL
byte 3:nnH
5/17
CALL cc,nn Condition call 条件付きコール
  If cc then
  SP-1 PCH
  SP-2 PCL
  SP SP-2
  PC nn
11CCC100
byte 2:nnL
byte 3:nnH
5/17
3/10
RET Return リターン
  PCL (SP)
  PCH (SP+1)
  SP SP+2
11001001 3/10
RET cc Conditional return 条件付きリターン
  If(CCC) then
  PCL (SP)
  PCH (SP+1)
  SP (SP)+2
11CCC000 3/11
1/5
RETI Return from interrupt 割り込み終了リターン
  PCL (SP)
  PCH (SP+1)
  SP (SP)+2
  IFF1 IFF2
11101101
01001101
4/15
RETN Return from non maskable interrupt ノンマスカラブル割り込み終了リターン
  PCL (SP)
  PCH (SP+1)
  SP (SP)+2
  IFF1 IFF2
11101101
01000101
4/14
RST p Restart リスタート
  (SP-1) PCH
  (SP-2) PCL
  SP (SP)-2
  PC 8*ttt=p
11ttt111 3/12

CPU 制御命令

ここでは,CPUの停止や割り込み設定,入出力命令について説明します.結構,ハードウェアーよりの話です.

動作・割り込み設定

NOPは何もしない命令に見えますが,実際はメモリーから命令を読み込みプログラムカウンターをひとつ進めています.HALT は 割り込み/リセットがくるまで,NOP を実行します.いずれも,リフレッシュ信号は出ています.

割り込みを使うと,CPU のピンに外部信号を与えることにより,プログラムの流れを変えることができます.

Z80 の動作・割り込み設定命令.INT (Interrupt Request): I/Oデバイスから生成される割り込み要求.
命令 英語(機能など) 機能 命令コード フラグ M/T
NOP No Operation なにもしない. 00000000 1/4
HALT Halt 停止 01110110 1/4
DI Disable Interrupts INT 割り込みディセーブル(不許可)
  IFF 0
11110011 1/4
EI Enable Interrupts INT 割り込みイネーブル(許可)
  IFF 1
11111011 1/4
IM 0 Interrupt Mode zero 割り込みをモード 0 にセット
11101101
01000110
2/8
IM 1 Interrupt Mode one 割り込みをモード 1 にセット
11101101
01010110
2/8
IM 2 Interrupt Mode two 割り込みをモード 2 にセット
11101101
01011110
2/8

入力

外部の装置からデータを入力します.

Z80 の入力命令.フラグレジスターのうち括弧付きのものは,不定です.
命令 英語(機能など) 機能 命令コード フラグ M/T
IN A,(n) Input a byte form device n to accu. I/Oポート入力 (アキュームレータに)
  A (n)
11011011
byte 2:n
3/11
IN r,(C) Input a byte form device (C) to register. I/Oポート入力 (レジスターに)
  r (C)
11101101
01DDD000
S, Z, H=0, P/V, N=0 3/12
INI Load location (HL) with input from port (C); or increment HL and decrement B I/Oポート入力 (メモリーに)
  (HL) (C)
  B B - 1
  HL HL + 1
11101101
10100010
(S), Z, (H), (P/V), N=1 4/16
INIR
B=0になるまで右を繰り返す.
Load location (HL) with input from port (C), increment HL and decrement B, repeat until B=0 I/Oポート入力 (メモリーに)
  (HL) (C)
  B B - 1
  HL HL + 1
11101101
10110010
(S), Z=1, (H), (P/V), N=1 5/21
B≠0

4/16
B=0
IND Load location (HL) with input from port (C); or decrement HL and B I/Oポート入力 (メモリーに)
  (HL) (C)
  B B - 1
  HL HL - 1
11101101
10101010
(S), Z, (H), (P/V), N=1 4/16
INDR
B=0になるまで右を繰り返す.
Load location (HL) with input from port (C), decrement HL and B, repeat until B=0 I/Oポート入力 (メモリーに)
  (HL) (C)
  B B - 1
  HL HL - 1
11101101
10111010
(S), Z=1, (H), (P/V), N=1 5/21
B≠0

4/16
B=0

出力

外部の装置へデータを出力します.

Z80 の出力命令.フラグレジスターのうち括弧付きのものは,不定です.
命令 英語(機能など) 機能 命令コード フラグ M/T
OUT (n),A Load Output port (n) with Acc. I/Oポート出力 (アキュームレータから)
  (n) A
11010011
byte 2:n
3/11
OUT (C),r Output a byte to device (C) form register. I/Oポート出力 (レジスターから)
  (C) r
11101101
01SSS001
3/12
OUTI Load Output port (C) with location (HL), increment HL and decrement B I/Oポート出力 (メモリーから)
  (C) (HL)
  B B - 1
  HL HL + 1
11101101
10100011
(S), Z, (H), (P/V), N=1 4/16
OUTIR
B=0になるまで右を繰り返す.
Load output port (C) with location (HL), increment HL and decrement B, repeat until B=0 I/Oポート出力 (メモリーから)
  (C) (HL)
  B B - 1
  HL HL + 1
11101101
10110011
(S), Z=1, (H), (P/V), N=1 5/21
B≠0

4/16
B=0
OUTD Load output port (C) with location (HL), decrement HL and B I/Oポート出力 (メモリーから)
  (C) (HL)
  B B - 1
  HL HL - 1
11101101
10101011
(S), Z, (H), (P/V), N=1 4/16
OUTDR
B=0になるまで右を繰り返す.
Load output port (C) with location (HL), decrement HL and B, repeat until B=0 I/Oポート出力 (メモリーから)
  (C) (HL)
  B B - 1
  HL HL - 1
11101101
10111011
(S), Z=1, (H), (P/V), N=1 5/21
B≠0

4/16
B=0

二進化十進 (BCD) 用命令

十進数演算に便利な機能のようです.あまり使わないと思いますが …と書きましたが,読者の方からこの命令は便利で使いますと言われました.例えば,ゲームのプロプログラムの得点の計算で大きな整数を扱うときに便利とのことです.

Z80 二進化十進 (BCD) 用命令
命令 英語(機能など) 機能 命令コード フラグ M/T
DAA Decimal Adjust Accumulator 10進演算用.詳しくはマニュアルを参照. 00100111 S, Z, H, P/V, C 1/4
RLD Rotate digit Left and right between Acc. and location (HL) BCDの一桁左シフト
  (HL)0-3 A0-3
  (HL)4-7 (HL)0-3
  A0-3 (HL)4-7
11101101
01101111
S, Z, H=0, P/V, N=0 5/18
RRD Rotate digit Right and right between Acc. and location (HL) BCDの一桁右シフト
  (HL)4-7 A0-3
  (HL)0-3 (HL)4-7
  A0-3 (HL)0-3
11101101
01100111
S, Z, H=0, P/V, N=0 5/18

ページ作成情報

参考資料

  1. Z80 ファミリーテクニカルマニュアル [I], シャープ(株),1983年

更新履歴

2014年11月03日 ページの新規作成


no counter