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 交換命令

A.4 スタック操作命令

A.5 ブロック転送命令

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