![]() |
戻る |
![]() |
アドレッシングモード |
ADD R,opr | 1 | m | z | z | m | m | m | m |
(アドレッシング指定) | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
レジスタRにオペランドoprの内容を加えます。
デスティネーションレジスタRとしては、汎用レジスタを指定します。
オペランドoprには、レジスタ、あるいはメモリ指定になります。
zzは演算サイズであり、
バイト演算、ワード演算、ロングワード演算の3種類あります。
※ADD命令にはこれ以外の形態もあります。
oprとしては次のものがあります。
ADD R, r | 1 | 1 | z | z | 1 | r | r | r |
1 | 0 | 0 | 0 | 0 | R | R | R |
m-mmmm↓ | byte | word | long |
1-1000 | W | WA | XWA |
1-1001 | A | BC | XBC |
1-1010 | B | DE | XDE |
1-1011 | C | HL | XHL |
1-1100 | D | IX | XIX |
1-1101 | E | IY | XIY |
1-1110 | H | IZ | XIZ |
1-1111 | L | SP | XSP |
汎用レジスタとは、レジスタの中で良く使われるもの、ですが、
マニュアルの表記では、どのレジスタでも指定可能な場合には小文字のr、
汎用レジスタしか指定できない場合には大文字のR が使われます。
ADD R, r | 1 | 1 | z | z | 0 | 1 | 1 | 1 |
レジスタ番号 | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
レジスタ指定です。 CPUの内部のレジスタは、バンクレジスタも含め、 8ビットのレジスタ番号により直接指定できます。 これにより、裏バンクのレジスタも、バンク切替えを行なわずに、 直接指定することが可能です。 m-mmmmは、1-0111になります。また、最初の命令語の次に、 レジスタを示す1バイトが追加され、ADD命令のコードは計3バイトになります。
上位 → | 0000 | 0001 | 0010 | 0011 | ||||||||
下位↓ | byte | word | long | byte | word | long | byte | word | long | byte | word | long |
0000 | RA0 | RWA0 | XWA0 | RA1 | RWA1 | XWA1 | RA2 | RWA2 | XWA2 | RA3 | RWA3 | XWA3 |
0001 | RW0 | RW1 | RW2 | RW3 | ||||||||
0010 | QA0 | QWA0 | QA1 | QWA1 | QA2 | QWA2 | QA3 | QWA3 | ||||
0011 | QW0 | QW1 | QW2 | QW3 | ||||||||
0100 | RC0 | RBC0 | XBC0 | RC1 | RBC1 | XBC1 | RC2 | RBC2 | XBC2 | RC3 | RBC3 | XBC3 |
0101 | RB0 | RB1 | RB2 | RB3 | ||||||||
0110 | QC0 | QBC0 | QC1 | QBC1 | QC2 | QBC2 | QC3 | QBC3 | ||||
0111 | QB0 | QB1 | QB2 | QB3 | ||||||||
1000 | RE0 | RDE0 | XDE0 | RE1 | RDE1 | XDE1 | RE2 | RDE2 | XDE2 | RE3 | RDE3 | XDE3 |
1001 | RD0 | RD1 | RD2 | RD3 | ||||||||
1010 | QE0 | QDE0 | QE1 | QDE1 | QE2 | QDE2 | QE3 | QDE3 | ||||
1011 | QD0 | QD1 | QD2 | QD3 | ||||||||
1100 | RL0 | RHL0 | XHL0 | RL1 | RHL1 | XHL1 | RL2 | RHL2 | XHL2 | RL3 | RHL3 | XHL3 |
1101 | RH0 | RH1 | RH2 | RH3 | ||||||||
1110 | QL0 | QHL0 | QL1 | QHL1 | QL2 | QHL2 | QL3 | QHL3 | ||||
1111 | QH0 | QH1 | QH2 | QH3 | ||||||||
上位 → | 1101 | 1110 | 1111 | ||||||
下位↓ | byte | word | long | byte | word | long | byte | word | long |
0000 | A' | WA' | XWA' | A | WA | XWA | IXL | IX | XIX |
0001 | W' | W | IXH | ||||||
0010 | QA' | QWA' | QA | QWA | QIXL | QIX | |||
0011 | QW' | QW | QIXH | ||||||
0100 | C' | BC' | XBC' | C | BC | XBC | IYL | IY | XIY |
0101 | B' | B | IYH | ||||||
0110 | QC' | QBC' | QC | QBC | QIYL | QIY | |||
0111 | QB' | QB | QIYH | ||||||
1000 | E' | DE' | XDE' | E | DE | XDE | IZL | IZ | XIZ |
1001 | D' | D | IZH | ||||||
1010 | QE' | QDE' | QE | QDE | QIZL | QIZ | |||
1011 | QD' | QD | QIZH | ||||||
1100 | L' | HL' | XHL' | L | HL | XHL | SPL | SP | XSP |
1101 | H' | H | SPH | ||||||
1110 | QL' | QHL' | QL | QHL | QSPL | QSP | |||
1111 | QH' | QH | QSPH | ||||||
上側の表は、バンクレジスタを直接アクセスするために用います。
マキシマムモードの場合、バンクは0〜3の4バンクです。
現在のバンクは、SR (ステータスレジスタ)内のRFPビットにより選択されます。
現在選択されているバンクは、レジスタ番号 1110XXXX (下側の表) で指定できます。
うち白い部分は、汎用r指定モードでも指定できます。
表の空いている部分を指定してはいけません。
つまり、ワード演算でワード境界をまたぐような指定はできません。
これは、メモリアクセスの場合と異なります。
メモリアクセスでは、
ワードアクセスがワード境界にそろっていなくてもバスエラーは起きず、
ダイナミックバスサイジング機構により、自動的に分割されてアクセスされます。
レジスタ番号1101XXXXは、副バンクレジスタです。
副バンクレジスタ、とは、現在のバンクレジスタの1つ前のバンクです。
つまり、RFPビットの値が2の場合、現バンクレジスタはバンク2ですが、
副バンクレジスタはバンク1になります。
(現在がバンク0の場合に副バンクが3になるかは不明です。)
副バンクレジスタは通常のレジスタ名にダッシュをつけて表現します。
なお、Z80とは異なり、
現バンクと副バンクの内容を一括して入れ換える命令はありません。
TLCS900には、これらのバンクレジスタの他に、
副フラグレジスタ (F') もあります。
副フラグレジスタは、RFPビットの値とはまったく関係なく、
FとF'を入れ換える
ADD R, ( r32 ) | 1 | 0 | z | z | 0 | r | r | r |
1 | 0 | 0 | 0 | 0 | R | R | R |
m-mmmm↓ | |
0-0000 | (XWA) |
0-0001 | (XBC) |
0-0010 | (XDE) |
0-0011 | (XHL) |
0-0100 | (XIX) |
0-0101 | (XIY) |
0-0110 | (XIZ) |
0-0111 | (XSP) |
TLCS-900Lのアドレス空間は24ビットのため、
指定された32ビットレジスタの値の上位8ビットは無視されます。
ADD R, ( r32 ) | 1 | 1 | z | z | 0 | 0 | 1 | 1 |
レジスタ番号 | 0 | 0 | |||||
1 | 0 | 0 | 0 | 0 | R | R | R |
レジスタ間接指定ですが、すべての32ビットレジスタが指定できます。
m-mmmm を 1-0011 、2バイト目の下位2ビットを 00 として指定します。
ADD命令のコードは3バイトになります。
レジスタ番号は、上位6ビット分を指定します。
間接指定で用いられるレジスタは必ず32ビット (long word) のため、
レジスタ番号の上位6ビットで区別可能です。
ADD R, ( r32+数値 ) | 1 | 0 | z | z | 1 | r | r | r |
符号付オフセット | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
m-mmmm↓ | |
0-1000 | (XWA+数値) |
0-1001 | (XBC+数値) |
0-1010 | (XDE+数値) |
0-1011 | (XHL+数値) |
0-1100 | (XIX+数値) |
0-1101 | (XIY+数値) |
0-1110 | (XIZ+数値) |
0-1111 | (XSP+数値) |
オフセットは符号付で、-128〜127の範囲が指定できます。
このアドレッシングモードのレジスタ番号版はありません。
以下にあげる、16bitオフセット付きのものを利用してください。
ADD R, ( r32+数値 ) | 1 | 1 | z | z | 0 | 0 | 1 | 1 |
レジスタ番号 | 0 | 1 | |||||
符号付オフセット下位 | |||||||
符号付オフセット上位 | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
16ビットのディスプレースメント付きレジスタ間接指定です。
すべての32ビットレジスタをベースレジスタとして指定できます。
m-mmmm を 1-0011 、2バイト目の下位2ビットを 01 として指定します。
ADD命令のコードは5バイトになります。
ベースレジスタは、レジスタ番号を、上位6ビット分指定します。
間接指定で用いられるベースレジスタは必ず32ビット (long word) のため、
レジスタ番号の上位6ビットで区別可能です。
オフセットは符号付で、-32768〜32767の範囲が指定できます。
ADD R, ( -r32 ) | 1 | 1 | z | z | 0 | 1 | 0 | 0 |
レジスタ番号 | s | s | |||||
1 | 0 | 0 | 0 | 0 | R | R | R |
ss↓ | |
00 | -1 |
01 | -2 |
10 | -4 |
ADD R, ( r32+ ) | 1 | 1 | z | z | 0 | 1 | 0 | 1 |
レジスタ番号 | s | s | |||||
1 | 0 | 0 | 0 | 0 | R | R | R |
ss↓ | |
00 | +1 |
01 | +2 |
10 | +4 |
ADD R, ( r32+r ) | 1 | 1 | z | z | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | d | 1 | 1 |
ベースレジスタ番号 | |||||||
オフセットレジスタ番号 | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
32ビットベースレジスタの値に、
指定されたオフセットレジスタの値を加えたアドレスに、
間接アドレッシングを行ないます。
ベースレジスタにはすべての32ビットレジスタ、
オフセットレジスタには、すべての8ビットレジスタ、
あるいはすべての16ビットレジスタが指定可能です。
m-mmmm を 1-0011 、2バイト目の下位2ビットを 11 として指定します。
ADD命令のコードは5バイトになります。
dビットが 0 の場合 8ビットオフセットレジスタ、
1の場合 16ビットオフセットレジスタです。
どちらの場合も、符号付として扱われ、符号拡張された後にベースレジスタに
加算されます。
ADD R, ( n ) | 1 | 1 | z | z | 0 | 0 | m | m |
アドレス下位 | |||||||
(アドレス中位) | |||||||
(アドレス上位) | |||||||
1 | 0 | 0 | 0 | 0 | R | R | R |
m-mmmm↓ | |
1-0000 | 8ビットアドレス (00.0000〜00.00FF) |
1-0001 | 16ビットアドレス (00.0000〜00.FFFF) |
1-0010 | 24ビットアドレス (00.0000〜FF.FFFF) |
ADD r, # | 1 | 1 | z | z | m | m | m | m |
(レジスタ番号) | |||||||
1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
値 下位 | |||||||
(値 中位) | |||||||
(値 上位) | |||||||
(値 最上位) |
即値 (イミディエト) の加算命令です。
この命令は、今までのADD命令とは異なるコード系列です。
デスティネーションレジスタは1-mmmmで指定されますが、
これが1-1rrrの場合は汎用レジスタ、1-0111の場合は任意のレジスタ指定となります。
このあたりの指定方法は(1)や(2)のレジスタ指定と同じです。
加算命令のサイズと、即値のサイズは同じですので、
XIXを16増やしたい、とかの場合には、INC命令2回の方がよいでしょう。
![]() | |
![]() |
まとめ |
数値 | 即値 |
r | すべてのレジスタ直接 |
( r32 ) | 32ビットレジスタ間接 |
( r32+数値 ) | ディスプレースメント付きレジスタ間接 (-32768〜32767) |
( -r32 ) | プリデクリメント付きレジスタ間接 |
( r32+ ) | ポストインクリメント付きレジスタ間接 |
( r32+r8 ) ( r32+r16 ) |
レジスタ指定レジスタ間接 オフセットレジスタ r8,r16 は符号付 |
( アドレス ) | 直接アドレス |
このように、アドレッシングモードに関しては、
命令語長の長い短いはあるにせよ、
バンクレジスタを含むすべてのレジスタに対し直交しています。
但し、命令により、使えるアドレッシングとそうでないものがありますので、
注意してください。
アセンブラマニュアル中では、
上記の表の下6つ (黄色) のものは、(mem) と表されています。
また、レジスタ指定r は、すべてのレジスタが指定可能な場合は r、
汎用レジスタだけの場合は R になります。