Z80
命令セット
|
8ビット CPU Z80命令セット
ここでは,Zilog Z80 の命令セット(Instruction Set)について説明します.
目次
はじめに
アセンブリ言語でのプログラム開発時のニーモニックの手引きを目指し,このサイトを作成しました.そのため,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:キャリーフラグです.
このレジスターは,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 |
加算/減算フラグ
|
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 |
ページ作成情報
参考資料
- Z80 ファミリーテクニカルマニュアル [I], シャープ(株),1983年
更新履歴
|