MSX Datapack wiki化計画

A R800 インストラクション表

※
※ このページは書きかけです。以下の可能性があります。
※ ・誤字、脱字等のチェックをおこなっていません。
※ ・テキスト、表などフォーマットがされていない。
※ ・画像が抜けている。
※

 この表は、命令の種類ごとに分類して、R800のインストラクションをまとめたものです。表中のニーモニックは各命令の名前を現わし、命令動作でその動作内容を簡単に示しています。
 命令動作の欄で←とあるのは、右側の内容を左側に代入することを、カッコでくくられたものは、くくられたレジスタなどで示されるメモリの内容を、それぞれ意味しています。例えば、

r←[.hl]

とあるのは、.hlレジスタで示されるアドレスのメモリの内容を、8ビットレジスタに代入するということです。ただし、入出力命令の[n]と[.c]は、対応する入出力ポートの番号のことです。
 フラグの欄は各フラグの動作を、オペコードはそれぞれの命令に対するマシン語コードを、2進数と16進数で記したものです。その右側のBCは、各命令の長さ(バイト数)と、命令を実行するのに要するクロック数を、それぞれ表しています。
 このほか、インストラクション表に出てくる略号に関しては、次の凡例を参照して下さい。
 表に記載されたニーモニックはZ80のものと違っていますが、R800で追加された乗算命令や、Z80で正式に動作が保障されていなかった命令以外はZ80と命令動作はすべて同じです。

凡例

.a{7} レジスター.aの最上位ビット
.a{4-7}レジスター.aのビット4-7
: 動作の区切り
.de:.hl 上位16ビットが.de、下位16ビットが.hlに入る、32ビット整数
[.ix+d] .ixに8ビットの符号つき変位を足した値が示すアドレス
C キャリーフラグ
Z ゼロフラグ
P/V パリティ・オーバーフローフラグ
S サインフラグ
N 減算フラグ
H ハーフキャリーフラグ
フラグは変化しない
フラグは実行結果により変化する
0 フラグは0
1 フラグは1
? 不定になる
V オーバーフローフラグとして使われる
P パリティーフラグとして使われる
IFF 割り込みフリップフロップとして使われる
r,r'8ビットレジスター、.a,.b,.c,.d,.e,.h,.l
u,u'8ビットレジスター、.a,.b,.c,.d,.e,.ixh,.ixl
v,v'8ビットレジスター、.a,.b,.c,.d,.e,.iyh,.iyl
p 8ビットレジスター、.ixh,.ixl
q 8ビットレジスター、.iyh,.iyl
ss 16ビットレジスター、.bc,.de,.hl,.sp
pp 16ビットレジスター、.bc,.de,.ix,.sp
rr 16ビットレジスター、.bc,.de,.iy,.sp
qq 16ビットレジスター、.bc,.de,.hl,.af
e short br 系の命令の飛び先アドレスへの差分、8ビットの符号付き即値
(+127〜-128)
k brk命令の飛び先アドレス、00h,08h,10h,18h,20h,28h,30h,38h
nn 16ビットの即値、もしくは絶対アドレス
n 8ビットの即値
b ビット演算命令の第何ビットかを示す値
NOT ビットを反転する
ビットのORをとる
ビットのXORをとる
ビットのANDをとる
tmp 一時的に値を退避する
B 命令のバイト数
C 命令の実行に必要な最小クロック数

 分岐命令、コール命令でクロック数が2つ書いてあるものは、上が条件が成立しないとき、下が条件が成立した時を意味します。
 また、入出力命令でクロック数が2つ書いてあるものは、上がまだ転送が終わらないとき、下が転送が終わったときをそれぞれ意味します。
 ここに示す命令表のクロック数は、SYSCLK換算でXTALの発振周波数の4分の1です。また、ノーウエイトで実行したときの値で、DRAM上で実行した時はページブレークやリフレッシュにより、自動的にウエイトが挿入されます。

A.1 8ビット移動命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
ld r , r'r ← r' 0 1 rr'1 1
ld r , nr ← n 0 0 r1 1 0 2 2
← n →
ld r , [.hl]r ← [.hl] 0 1 r1 1 0 1 2
ld r , [.ix+d]r ← [.ix+d] 1 1 0 1 1 1 0 1 DD 3 5
0 1 r1 1 0
← d →
ld r, [.iy+d]r ← [.iy+d] 1 1 1 1 1 1 0 1 FD 3 5
0 1 r1 1 0
← d →
ld [.hl],r [.hl] ← r 0 1 1 1 0 r3 5
ld [.ix+d],r[.ix+d] ← r 1 1 0 1 1 1 0 1 DD 3 5
0 1 1 1 0 r
← d →
ld [iy+d],r[iy+d] ← r 1 1 0 1 1 1 0 1 FD 3 5
0 1 1 1 0 r
← d →
ld u, u'u ← u' 0 1 0 1 1 1 0 1 DD 2 2
0 1 uu'
ld v, v'v ← v' 0 1 1 1 1 1 0 1 FD 2 2
0 1 vv'
ld u, nu ← n 1 1 0 1 1 1 0 1 DD 3 3
0 0 u1 1 0
← n →
ld v, nv ← n 1 1 1 1 1 1 0 1 FD 3 3
0 0 v1 1 0
← n →
ld [.hl],n [.hl] ← n 0 0 1 1 0 1 1 0 36 2 3
← n →
ld [.ix+d],n[.ix+d] ← n 1 1 0 1 1 1 0 1 DD 4 5
0 0 1 1 0 1 1 0 36
← d →
← n →
ld [iy+d],n[iy+d] ← n 1 1 1 1 1 1 0 1 FD 4 5
0 0 1 1 0 1 1 0 36
← d →
← n →
000001010011100101110111
r.b.c.d.e.h.l.a
u.b.c.d.e.ixh.ixl.a
v.b.c.d.e.iyh.iyl.a

A.2 16ビット移動命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
ld ss, nnss ← nn00ss0001 33
← nnl →
← nnh →
ld .ix, nn.ix ← nn11011101 DD 44
00100001 21
← nnl →
← nnh →
ld .iy, nn.iy ← nn11111101 FD 44
00100001 21
← nnl →
← nnh →
ld .sp, .hl.sp ← .bl11111101 F9 11
ld .sp, .ix.sp ← .ix11011101 DD 22
11111001 F9
ld .sp, .iy.sp ← .iy11111101 FD 22
11111001 F9
00011011
ss.bc.de.hl.sp

A.3 交換命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
xch .de,.hl.de⇔.hl11101011EB11
xch .af,.af'.af⇔.af'000010000811
xch [.sp],.hl.l⇔[.sp];.h⇔[.sp+1]11101011E315
xch [.sp],.ix.ixl⇔[.sp]11011101DD26
.ixh⇔[.sp+1]11100011E3
xch [.sp],.iy.iyl⇔[.sp]11111101FD26
.iyh⇔[.sp+1]11100011E3
xchx.bc⇔.bc';.de⇔.de';.hl⇔.hl'11101011D911

A.4 スタック操作命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
push qq[.sp-2]←qql;[.sp-1]←qqh11qq010114
.sp←.sp-2
push .ix[.sp-2]←.ixl;[.sp-1]←.ixh11011101DD25
.sp←.sp-2E5
push .iy[.sp-2]←.iyl;[.sp-1]←.iyh11111101FD25
.sp←.sp-2E5
pop qqqql←[.sp];qqh←[.sp+1]11qq000113
.sp←.sp+2
pop .ix.ixl←[.sp];.ixh←[.sp+1]11011101DD24
.sp←.sp+211100001E1
pop .iy.iyl←[.sp];.iyh←[.sp+1]11111101FD24
.sp←.sp+211100001E1
00011011
qq.bc.de.hl.af

pop .afのときはflagsはすべて変化する

A.5 ブロック転送命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
move [.hl++],[.de++][.de]←[.hl];.de←.de+10011101101ED24
.hl←.hl+1;.bc←.bc-110100000A0
move [.hl--],[.de--][.de]←[.hl];.de←.de-10011101101ED24
.hl←.hl-1;.bc←.bc-110101000A8
movem [.hl++],[.de++]repeat;[.de]←[.hl];.de←.de+100011101101ED24
.hl←.hl+1;.bc←.bc-1;until .bc=010110000B0
movem [.hl--],[.de--]repeat;[.de]←[.hl];.de←.de-100011101101ED24
.hl←.hl-1;.bc←.bc-1;until .bc=010111000B8

A.6 ブロックサーチ命令

A.7 乗算命令

A.8 加算命令

A.9 減算命令

A.10 比較命令

A.11 論理演算命令

A.12 ビット操作命令

A.13 ローテイト命令

A.14 シフト命令

A.15 分岐命令

A.16 コール命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
call nn[.sp-2] ← .pcl;[.sp] ← pch11001101CD35
.sp ← .sp-2;pc-nn← nni →
← nnh →
call nz,nnif z=011000100C435
[.sp-2] ← .pcl;[.sp] ← pch← nni →
.sp ← .sp-2;pc-nn← nnh →
call z,nnif z=111001100CC33
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call ne,nnif c=011010100D433
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call c,nnif c=111011100DC33
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call po,nnif F=011100100E433
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call pe,nnif F=111101100EC35
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call p,nnif s=011110100F433
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
call m,nnif s=111111100FC33
[.sp-2] ← .pcl;[.sp] ← pch← nni →5
.sp ← .sp-2;pc-nn← nnh →
ret.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+211001001C913
ret nzif z=011000000C011
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret zif z=111001000C811
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret ncif c=011010000D011
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret cif c=111011000D811
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret poif F=011100000E011
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret peif F=111101000E811
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret pif s=011110000F011
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
ret mif s=111111000F811
.pcl ← [.sp];pch ← [.sp+1];.sp ← .sp+23
retiinterrupt return11101101ED25
010011014D
retnNon Maskable Interrupt return11101000ED25
0100010145

A.17 入出力命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
in .a,[n].a ← [n]11011011DB23
in r,[.c]r ← [.c]110P0101101ED23
in .f,[.c][.c]110P0101101ED23
0111000070
in [.hl++],[.c][.hl] ← [.c];b ← .b-11011011ED24
.hl ← .hl+110100010A2
in [.hl--],[.c][.hl] ← [.c];b ← .b-11011011ED24
.hl ← .hl-1?1??110101010AA
inm [.hl++],[.c]repeat;[.hl] ← [.c];b ← .b-111011011ED24
.hl ← .hl+1;until .b=0?1??110110010B23
inm [.hl--],[.c]repeat;[.hl] ← [.c];b ← .b-111011011ED24
.hl ← .hl-1;until .b=0?1??110111010BA3
out [n],.a[n] ← .a11010011D323
out [.c],r[.c] ← r11101101ED23
out [.c],[.hl++][.c] ← [.hl];.b ← .b-1?1??11101101ED24
.hl ← .hl+110100011A3
out [.c],[.hl--][.c] ← [.hl];.b ← .b-1?1??11011011ED24
.hl ← .hl-110101011AB
outm [.c],[.hl++]repeat;[.c] ← [.hl];.b ← .b-1?1??111011011ED24
.hl ← .hl+1;until .b=010110011B33
outm [.c],[.hl--]repeat;[.c] ← [.hl];.b ← .b-1?1??111011011ED24
.hl ← .hl-1;until .b=010111011BB3

A.18 CPU制御命令

ニーモニック命令動作 flagsオペコードB C
SZHP/VNC 7 6 5 4 3 2 1 0 Hex
adj .aadjust to decimalP010001112711
not.a.a ← NOT .a11010011112F11
neg.a.a ← NOT .a+1V11101101ED22
0100010044
notcC ← NOT c?0001111113F11
setcC ← 100001101113711
nopNO operation000000000011
haltHALT011101107612
diIFF ← 011110011F312
eiIFF ← 111111011FB11
im 0interrupt mode 011101101ED23
0100011046
im 1interrupt mode 111101101ED23
0101011056
im 2interrupt mode 211101101ED23
010111105E