Tatara

付録B
命令一覧

この付録では、TATARAが受け付けるすべての命令の書き方を、ザイログのマニュアルと同じ分類でまとめ、TATARAがアセンブルするバイトと、命令の働きを簡単に示します。オペランドの書き方は9章で説明しています。それぞれの命令がくわしく何をするか、どのフラグを変えるか、どれだけ時間がかかるかは、Z80のプログラミングを学ぶ本や講座で確かめてください。

TATARAは、公開されているZ80の命令、9.5節の未公開命令、R800の2つのかけ算の命令を受け付けます。

B.1 表の読み方

表はどれも3つの列からなります。命令の書き方、TATARAがそれに対して書き出すバイト(16進数)、そして命令の働きです。最初の2つの列で斜体になっている語は、使うたびに変わるものを表します。

語

表すもの

r, r’

レジスターB、C、D、E、H、L、Aのどれか

n

1バイト。どんな式でもよく、その下位バイトが使われる

nn

1ワード。アドレスか16ビットの値

lo hi

nnの2バイト。下位バイトが先

d

インデックス付きオペランドのディスプレースメント。−128から127まで

e

相対ジャンプの飛び先。TATARAが書き出すバイトは、命令の終わりから飛び先までの距離で、−128から127まで

b

ビット番号。0から7まで

x, x’

インデックス・ハーフ(B.13節)

命令の中には、使うレジスターによってバイトが変わるものがあります。あるレジスターを別のレジスターにコピーするld r,r’には、ld b,bからld a,aまで49通りあります。表では、それぞれに 1行ずつ使う代わりに、バイトを求める規則を示します。レジスターにはそれぞれ番号があり、これをレジスター・コードといいます。

B C D E H L (HL) A
0 1 2 3 4 5 6 7

バイトの列で、8rはrのコードの8倍を表し、数は16進数で足します。ld r,r’の行には40+8r+r’とあります。ld d,bでは、Dのコードが2、Bのコードが0なので、バイトは40h + 8×2 + 0 = 40h + 10h = 50hです。同じように、add a,rは80+rなので、add a,eは80h + 3 = 83hです。bit b,rはCB 40+8b+rなので、bit 7,aはCBのあとに40h + 8×7 + 7 = 40h + 38h + 7 = 7Fhが続きます。

pushのレジスター・ペアやjpの条件のように、数通りしかない命令は、それぞれに1行ずつ使い、バイトをそのまま示します。

IXやIYを使う命令は、HLを使う命令の前にプレフィックスのバイトを付けたものです。IXにはDD、IYにはFDを付けます。dのある書き方では、ディスプレースメントのバイトはオペコードのあとに続きます。DD CBやFD CBで始まるものでは、最後のバイトの前に入ります。

B.2 8ビットのロード

書き方 バイト

働き

ld r,r’ 40+8r+r’

r’をrにコピーする

ld r,n 06+8r n

nをrにロードする

ld r,(hl) 46+8r

HLの示すアドレスのバイトをrにロードする

ld r,(ix+d) DD 46+8r d

IX+dのバイトをrにロードする

ld r,(iy+d) FD 46+8r d

IY+dのバイトをrにロードする

ld (hl),r 70+r

rをHLの示すアドレスに書き込む

ld (ix+d),r DD 70+r d

rをIX+dに書き込む

ld (iy+d),r FD 70+r d

rをIY+dに書き込む

ld (hl),n 36 n

nをHLの示すアドレスに書き込む

ld (ix+d),n DD 36 d n

nをIX+dに書き込む

ld (iy+d),n FD 36 d n

nをIY+dに書き込む

ld a,(bc) 0A

BCの示すアドレスからAをロードする

ld a,(de) 1A

DEの示すアドレスからAをロードする

ld a,(nn) 3A lo hi

アドレスnnからAをロードする

ld (bc),a 02

AをBCの示すアドレスに書き込む

ld (de),a 12

AをDEの示すアドレスに書き込む

ld (nn),a 32 lo hi

Aをアドレスnnに書き込む

ld a,i ED 57

割り込みベクター・レジスターをAにコピーする

ld a,r ED 5F

リフレッシュ・レジスターをAにコピーする

ld i,a ED 47

Aを割り込みベクター・レジスターにコピーする

ld r,a ED 4F

Aをリフレッシュ・レジスターにコピーする

B.3 16ビットのロード、PUSHとPOP

書き方 バイト

働き

ld bc,nn 01 lo hi

nnをBCにロードする

ld de,nn 11 lo hi

nnをDEにロードする

ld hl,nn 21 lo hi

nnをHLにロードする

ld sp,nn 31 lo hi

nnをSPにロードする

ld ix,nn DD 21 lo hi

nnをIXにロードする

ld iy,nn FD 21 lo hi

nnをIYにロードする

ld bc,(nn) ED 4B lo hi

アドレスnnからBCをロードする

ld de,(nn) ED 5B lo hi

アドレスnnからDEをロードする

ld hl,(nn) 2A lo hi

アドレスnnからHLをロードする

ld sp,(nn) ED 7B lo hi

アドレスnnからSPをロードする

ld ix,(nn) DD 2A lo hi

アドレスnnからIXをロードする

ld iy,(nn) FD 2A lo hi

アドレスnnからIYをロードする

ld (nn),bc ED 43 lo hi

BCをアドレスnnに書き込む

ld (nn),de ED 53 lo hi

DEをアドレスnnに書き込む

ld (nn),hl 22 lo hi

HLをアドレスnnに書き込む

ld (nn),sp ED 73 lo hi

SPをアドレスnnに書き込む

ld (nn),ix DD 22 lo hi

IXをアドレスnnに書き込む

ld (nn),iy FD 22 lo hi

IYをアドレスnnに書き込む

ld sp,hl F9

HLをSPにコピーする

ld sp,ix DD F9

IXをSPにコピーする

ld sp,iy FD F9

IYをSPにコピーする

push bc C5

BCをスタックに積む

push de D5

DEをスタックに積む

push hl E5

HLをスタックに積む

push af F5

AFをスタックに積む

push ix DD E5

IXをスタックに積む

push iy FD E5

IYをスタックに積む

pop bc C1

スタックからBCを取り出す

pop de D1

スタックからDEを取り出す

pop hl E1

スタックからHLを取り出す

pop af F1

スタックからAFを取り出す

pop ix DD E1

スタックからIXを取り出す

pop iy FD E1

スタックからIYを取り出す

B.4 交換、ブロック転送、サーチ

書き方 バイト

働き

ex de,hl EB

DEとHLを交換する

ex af,af’ 08

AFと裏のAFを交換する

exx D9

BC、DE、HLを裏のレジスターと交換する

ex (sp),hl E3

HLとスタックの先頭のワードを交換する

ex (sp),ix DD E3

IXとスタックの先頭のワードを交換する

ex (sp),iy FD E3

IYとスタックの先頭のワードを交換する

ldi ED A0

(HL)から(DE)へ1バイトコピーし、先へ進む

ldir ED B0

BCが0になるまでLDIを繰り返す

ldd ED A8

(HL)から(DE)へ1バイトコピーし、後ろへ戻る

lddr ED B8

BCが0になるまでLDDを繰り返す

cpi ED A1

Aと(HL)を比べ、先へ進む

cpir ED B1

一致するかBCが0になるまでCPIを繰り返す

cpd ED A9

Aと(HL)を比べ、後ろへ戻る

cpdr ED B9

一致するかBCが0になるまでCPDを繰り返す

B.5 8ビットの算術演算と論理演算

書き方 バイト

働き

add a,r 80+r

rをAに加える

add a,n C6 n

nをAに加える

add a,(hl) 86

(HL)のバイトをAに加える

add a,(ix+d) DD 86 d

IX+dのバイトをAに加える

add a,(iy+d) FD 86 d

IY+dのバイトをAに加える

adc a,r 88+r

rとキャリーをAに加える

adc a,n CE n

nとキャリーをAに加える

adc a,(hl) 8E

(HL)のバイトとキャリーをAに加える

adc a,(ix+d) DD 8E d

IX+dのバイトとキャリーをAに加える

adc a,(iy+d) FD 8E d

IY+dのバイトとキャリーをAに加える

sub r 90+r

Aからrを引く

sub n D6 n

Aからnを引く

sub (hl) 96

Aから(HL)のバイトを引く

sub (ix+d) DD 96 d

AからIX+dのバイトを引く

sub (iy+d) FD 96 d

AからIY+dのバイトを引く

sbc a,r 98+r

Aからrとキャリーを引く

sbc a,n DE n

Aからnとキャリーを引く

sbc a,(hl) 9E

Aから(HL)のバイトとキャリーを引く

sbc a,(ix+d) DD 9E d

AからIX+dのバイトとキャリーを引く

sbc a,(iy+d) FD 9E d

AからIY+dのバイトとキャリーを引く

and r A0+r

AとrのAND

and n E6 n

AとnのAND

and (hl) A6

Aと(HL)のバイトのAND

and (ix+d) DD A6 d

AとIX+dのバイトのAND

and (iy+d) FD A6 d

AとIY+dのバイトのAND

xor r A8+r

AとrのXOR

xor n EE n

AとnのXOR

xor (hl) AE

Aと(HL)のバイトのXOR

xor (ix+d) DD AE d

AとIX+dのバイトのXOR

xor (iy+d) FD AE d

AとIY+dのバイトのXOR

or r B0+r

AとrのOR

or n F6 n

AとnのOR

or (hl) B6

Aと(HL)のバイトのOR

or (ix+d) DD B6 d

AとIX+dのバイトのOR

or (iy+d) FD B6 d

AとIY+dのバイトのOR

cp r B8+r

Aとrを比べる

cp n FE n

Aとnを比べる

cp (hl) BE

Aと(HL)のバイトを比べる

cp (ix+d) DD BE d

AとIX+dのバイトを比べる

cp (iy+d) FD BE d

AとIY+dのバイトを比べる

inc r 04+8r

rに1を加える

inc (hl) 34

(HL)のバイトに1を加える

inc (ix+d) DD 34 d

IX+dのバイトに1を加える

inc (iy+d) FD 34 d

IY+dのバイトに1を加える

dec r 05+8r

rから1を引く

dec (hl) 35

(HL)のバイトから1を引く

dec (ix+d) DD 35 d

IX+dのバイトから1を引く

dec (iy+d) FD 35 d

IY+dのバイトから1を引く

B.6 汎用とCPU制御

書き方 バイト

働き

daa 27

BCDの加算や減算のあとでAを補正する

cpl 2F

Aのすべてのビットを反転する

neg ED 44

Aの符号を反転する

ccf 3F

キャリー・フラグを反転する

scf 37

キャリー・フラグをセットする

nop 00

何もしない

halt 76

割り込みを待つ

di F3

割り込みを禁止する

ei FB

割り込みを許可する

im 0 ED 46

割り込みモード0にする

im 1 ED 56

割り込みモード1にする

im 2 ED 5E

割り込みモード2にする

B.7 16ビットの算術演算

書き方 バイト

働き

add hl,bc 09

BCをHLに加える

add hl,de 19

DEをHLに加える

add hl,hl 29

HLをHLに加える

add hl,sp 39

SPをHLに加える

adc hl,bc ED 4A

BCとキャリーをHLに加える

adc hl,de ED 5A

DEとキャリーをHLに加える

adc hl,hl ED 6A

HLとキャリーをHLに加える

adc hl,sp ED 7A

SPとキャリーをHLに加える

sbc hl,bc ED 42

HLからBCとキャリーを引く

sbc hl,de ED 52

HLからDEとキャリーを引く

sbc hl,hl ED 62

HLからHLとキャリーを引く

sbc hl,sp ED 72

HLからSPとキャリーを引く

add ix,bc DD 09

BCをIXに加える

add ix,de DD 19

DEをIXに加える

add ix,ix DD 29

IXをIXに加える

add ix,sp DD 39

SPをIXに加える

add iy,bc FD 09

BCをIYに加える

add iy,de FD 19

DEをIYに加える

add iy,iy FD 29

IYをIYに加える

add iy,sp FD 39

SPをIYに加える

inc bc 03

BCに1を加える

inc de 13

DEに1を加える

inc hl 23

HLに1を加える

inc sp 33

SPに1を加える

inc ix DD 23

IXに1を加える

inc iy FD 23

IYに1を加える

dec bc 0B

BCから1を引く

dec de 1B

DEから1を引く

dec hl 2B

HLから1を引く

dec sp 3B

SPから1を引く

dec ix DD 2B

IXから1を引く

dec iy FD 2B

IYから1を引く

B.8 ローテートとシフト

書き方 バイト

働き

rlca 07

Aを左に回転する

rla 17

Aをキャリーを通して左に回転する

rrca 0F

Aを右に回転する

rra 1F

Aをキャリーを通して右に回転する

rlc r CB 00+r

rを左に回転する

rlc (hl) CB 06

(HL)のバイトを左に回転する

rlc (ix+d) DD CB d 06

IX+dのバイトを左に回転する

rlc (iy+d) FD CB d 06

IY+dのバイトを左に回転する

rl r CB 10+r

rをキャリーを通して左に回転する

rl (hl) CB 16

(HL)のバイトをキャリーを通して左に回転する

rl (ix+d) DD CB d 16

IX+dのバイトをキャリーを通して左に回転する

rl (iy+d) FD CB d 16

IY+dのバイトをキャリーを通して左に回転する

rrc r CB 08+r

rを右に回転する

rrc (hl) CB 0E

(HL)のバイトを右に回転する

rrc (ix+d) DD CB d 0E

IX+dのバイトを右に回転する

rrc (iy+d) FD CB d 0E

IY+dのバイトを右に回転する

rr r CB 18+r

rをキャリーを通して右に回転する

rr (hl) CB 1E

(HL)のバイトをキャリーを通して右に回転する

rr (ix+d) DD CB d 1E

IX+dのバイトをキャリーを通して右に回転する

rr (iy+d) FD CB d 1E

IY+dのバイトをキャリーを通して右に回転する

sla r CB 20+r

rを左にシフトする

sla (hl) CB 26

(HL)のバイトを左にシフトする

sla (ix+d) DD CB d 26

IX+dのバイトを左にシフトする

sla (iy+d) FD CB d 26

IY+dのバイトを左にシフトする

sra r CB 28+r

rをビット7を保って右にシフトする

sra (hl) CB 2E

(HL)のバイトをビット7を保って右にシフトする

sra (ix+d) DD CB d 2E

IX+dのバイトをビット7を保って右にシフトする

sra (iy+d) FD CB d 2E

IY+dのバイトをビット7を保って右にシフトする

srl r CB 38+r

rをビット7に0を入れて右にシフトする

srl (hl) CB 3E

(HL)のバイトをビット7に0を入れて右にシフトする

srl (ix+d) DD CB d 3E

IX+dのバイトをビット7に0を入れて右にシフトする

srl (iy+d) FD CB d 3E

IY+dのバイトをビット7に0を入れて右にシフトする

rld ED 6F

Aと(HL)の間で数字を左に回転する

rrd ED 67

Aと(HL)の間で数字を右に回転する

B.9 ビットのセット、リセット、テスト

書き方 バイト

働き

bit b,r CB 40+8b+r

rのビットbを調べる

bit b,(hl) CB 46+8b

(HL)のバイトのビットbを調べる

bit b,(ix+d) DD CB d 46+8b

IX+dのバイトのビットbを調べる

bit b,(iy+d) FD CB d 46+8b

IY+dのバイトのビットbを調べる

set b,r CB C0+8b+r

rのビットbをセットする

set b,(hl) CB C6+8b

(HL)のバイトのビットbをセットする

set b,(ix+d) DD CB d C6+8b

IX+dのバイトのビットbをセットする

set b,(iy+d) FD CB d C6+8b

IY+dのバイトのビットbをセットする

res b,r CB 80+8b+r

rのビットbをクリアする

res b,(hl) CB 86+8b

(HL)のバイトのビットbをクリアする

res b,(ix+d) DD CB d 86+8b

IX+dのバイトのビットbをクリアする

res b,(iy+d) FD CB d 86+8b

IY+dのバイトのビットbをクリアする

B.10 ジャンプ

書き方 バイト

働き

jp nn C3 lo hi

nnへジャンプする

jp nz,nn C2 lo hi

ゼロでなければnnへジャンプする

jp z,nn CA lo hi

ゼロならnnへジャンプする

jp nc,nn D2 lo hi

キャリーがなければnnへジャンプする

jp c,nn DA lo hi

キャリーがあればnnへジャンプする

jp po,nn E2 lo hi

パリティが奇数ならnnへジャンプする

jp pe,nn EA lo hi

パリティが偶数ならnnへジャンプする

jp p,nn F2 lo hi

正ならnnへジャンプする

jp m,nn FA lo hi

負ならnnへジャンプする

jr e 18 e

eへジャンプする

jr nz,e 20 e

ゼロでなければeへジャンプする

jr z,e 28 e

ゼロならeへジャンプする

jr nc,e 30 e

キャリーがなければeへジャンプする

jr c,e 38 e

キャリーがあればeへジャンプする

jp (hl) E9

HLの示すアドレスへジャンプする

jp (ix) DD E9

IXの示すアドレスへジャンプする

jp (iy) FD E9

IYの示すアドレスへジャンプする

djnz e 10 e

Bから1を引き、0でなければeへジャンプする

B.11 コール、リターン、リスタート

書き方 バイト

働き

call nn CD lo hi

nnのルーチンを呼び出す

call nz,nn C4 lo hi

ゼロでなければnnのルーチンを呼び出す

call z,nn CC lo hi

ゼロならnnのルーチンを呼び出す

call nc,nn D4 lo hi

キャリーがなければnnのルーチンを呼び出す

call c,nn DC lo hi

キャリーがあればnnのルーチンを呼び出す

call po,nn E4 lo hi

パリティが奇数ならnnのルーチンを呼び出す

call pe,nn EC lo hi

パリティが偶数ならnnのルーチンを呼び出す

call p,nn F4 lo hi

正ならnnのルーチンを呼び出す

call m,nn FC lo hi

負ならnnのルーチンを呼び出す

ret C9

ルーチンから戻る

ret nz C0

ゼロでなければ戻る

ret z C8

ゼロなら戻る

ret nc D0

キャリーがなければ戻る

ret c D8

キャリーがあれば戻る

ret po E0

パリティが奇数なら戻る

ret pe E8

パリティが偶数なら戻る

ret p F0

正なら戻る

ret m F8

負なら戻る

reti ED 4D

割り込みルーチンから戻る

retn ED 45

マスク不可能割り込みのルーチンから戻る

rst 00h C7

00hのルーチンを呼び出す

rst 08h CF

08hのルーチンを呼び出す

rst 10h D7

10hのルーチンを呼び出す

rst 18h DF

18hのルーチンを呼び出す

rst 20h E7

20hのルーチンを呼び出す

rst 28h EF

28hのルーチンを呼び出す

rst 30h F7

30hのルーチンを呼び出す

rst 38h FF

38hのルーチンを呼び出す

B.12 入出力

書き方 バイト

働き

in a,(n) DB n

ポートnからAへ読み込む

in r,(c) ED 40+8r

Cのポートからrへ読み込む

ini ED A2

Cのポートから(HL)へ読み込み、先へ進む

inir ED B2

Bが0になるまでINIを繰り返す

ind ED AA

Cのポートから(HL)へ読み込み、後ろへ戻る

indr ED BA

Bが0になるまでINDを繰り返す

out (n),a D3 n

Aをポートnへ書き出す

out (c),r ED 41+8r

rをCのポートへ書き出す

outi ED A3

(HL)をCのポートへ書き出し、先へ進む

otir ED B3

Bが0になるまでOUTIを繰り返す

outd ED AB

(HL)をCのポートへ書き出し、後ろへ戻る

otdr ED BB

Bが0になるまでOUTDを繰り返す

B.13 未公開命令

9.5節の未公開命令です。SLLの行では、rは7つのレジスターのどれでもかまいません。ほかの行では、xとx’はIXHかIXLで、そのコードはHとLのコードと同じ4と5です。rはB、C、D、E、Aのどれかで、x’はxと同じレジスターの半分です。表はIXのバイトを示します。IYHとIYLでは、DDの代わりにFDを使います。ld iyl,aはFD 6Fです。

書き方 バイト

働き

sll r CB 30+r

rを左へシフトし、ビット0を1にする

sll (hl) CB 36

HLのアドレスのバイトに同じことをする

sll (ix+d) DD CB d 36

IX+dのバイトに同じことをする

sll (iy+d) FD CB d 36

IY+dのバイトに同じことをする

ld x,r DD 40+8x+r

rをxにコピーする

ld r,x DD 40+8r+x

xをrにコピーする

ld x,x’ DD 40+8x+x’

IXの一方の半分を他方か、同じ半分にコピーする

ld x,n DD 06+8x n

nをxに入れる

inc x DD 04+8x

xに1を足す

dec x DD 05+8x

xから1を引く

add a,x DD 80+x

Aにxを足す

adc a,x DD 88+x

Aにxとキャリーを足す

sub x DD 90+x

Aからxを引く

sbc a,x DD 98+x

Aからxとキャリーを引く

and x DD A0+x

AとxのAND

xor x DD A8+x

AとxのXOR

or x DD B0+x

AとxのOR

cp x DD B8+x

Aとxを比べる

in f,(c) ED 70

Cのポートを読んでフラグを設定する。Aは変わらない

out (c),0 ED 71

Cのポートに0か0FFhを書く(9.5節)

B.14 R800のかけ算

書き方 バイト

働き

mulub a,r ED C1+8r

A×r、結果はHL

muluw hl,bc ED C3

HL×BC、結果はDE:HL

muluw hl,sp ED F3

HL×SP、結果はDE:HL

B.15 受け付けない書き方

ほかのアセンブラーでは受け付けられたり、うまくいきそうに見えたりしても、ザイログの一覧にも、TATARAが受け付ける未公開命令にもない書き方があります。TATARAはそれらを受け付けません(表B.14)。

書いたもの

メッセージ

代わりに書くもの

sub a,b

not a form this instruction has.

sub b

and a,b

not a form this instruction has.

and b

cp a,b

not a form this instruction has.

cp b

add b

not a form this instruction has.

add a,b

ex af,af

not a form this instruction has.

ex af,af’

jp hl

undefined symbol in an expression.

jp (hl)

ld h,ixl

not a form this instruction has.

なし

ld ixh,iyl

not a form this instruction has.

なし

ld ixh,(hl)

not a form this instruction has.

なし

rlc ixh

not a form this instruction has.

なし

rlc (ix+2),b

not a form this instruction has.

rlc (ix+2)と
ld b,(ix+2)

in (c)

not a form this instruction has.

in f,(c)

sl1 b

not a directive, a macro or an instruction.

sll b

ld a,hx

undefined symbol in an expression.

ld a,ixh

表 B.14: TATARAが受け付けない書き方。

SUB、AND、OR、XOR、CPはいつもAに対して働くので、ザイログはAを書きません。ADD、ADC、SBCには 16ビットの書き方もあるので、8ビットの書き方ではAを書きます。かっこがないと、jp hlはjp nnと読まれ、hlはアドレスの名前と見なされますが、その名前は定義されていません。

インデックス・ハーフを使う書き方が書けないのは、1つのプレフィックスが命令全体にかかるからです(9.5節)。rlc (ix+2),bは、結果をメモリとレジスターの両方に入れる未公開の書き方の1つで、TATARAは受け付けません。in (c)、sl1、hxは、TATARAでは1通りにしか書かない命令の、ほかのアセンブラーでの綴りです。

ディスプレースメントのない(IX)と(IY)は受け付けられ、(IX+0)と(IY+0)の意味になります。ld a,(ix)はDD 7E 00です。