戻る
アドレッシングモード
TLCS-900Lには多彩なアドレッシングモードが用意されています。 ここでは、ADD (加算命令) を例にして、 どのようなアドレッシングモードがあるのかを示します。

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としては次のものがあります。

(1) 汎用レジスタ r

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
汎用レジスタの指定です。m-mmmmが、1-1rrrの形式でレジスタを指定します。 ADD命令のコードは2バイトになります。

汎用レジスタとは、レジスタの中で良く使われるもの、ですが、 マニュアルの表記では、どのレジスタでも指定可能な場合には小文字のr、 汎用レジスタしか指定できない場合には大文字のR が使われます。

(2) レジスタ 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 RA0RWA0 XWA0 RA1RWA1 XWA1 RA2RWA2 XWA2 RA3RWA3 XWA3
0001 RW0

RW1

RW2

RW3

0010 QA0QWA0
QA1QWA1
QA2QWA2
QA3QWA3
0011 QW0

QW1

QW2

QW3

0100 RC0RBC0 XBC0 RC1RBC1 XBC1 RC2RBC2 XBC2 RC3RBC3 XBC3
0101 RB0

RB1

RB2

RB3

0110 QC0QBC0
QC1QBC1
QC2QBC2
QC3QBC3
0111 QB0

QB1

QB2

QB3

1000 RE0RDE0 XDE0 RE1RDE1 XDE1 RE2RDE2 XDE2 RE3RDE3 XDE3
1001 RD0

RD1

RD2

RD3

1010 QE0QDE0
QE1QDE1
QE2QDE2
QE3QDE3
1011 QD0

QD1

QD2

QD3

1100 RL0RHL0 XHL0 RL1RHL1 XHL1 RL2RHL2 XHL2 RL3RHL3 XHL3
1101 RH0

RH1

RH2

RH3

1110 QL0QHL0
QL1QHL1
QL2QHL2
QL3QHL3
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'
QAQWA
QIXLQIX
0011 QW'

QW

QIXH

0100 C'BC' XBC' C BC XBC IYL IY XIY
0101 B'

B

IYH

0110 QC'QBC'
QCQBC
QIYLQIY
0111 QB'

QB

QIYH

1000 E'DE' XDE' E DE XDE IZL IZ XIZ
1001 D'

D

IZH

1010 QE'QDE'
QEQDE
QIZLQIZ
1011 QD'

QD

QIZH

1100 L'HL' XHL' L HL XHL SPL SP XSP
1101 H'

H

SPH

1110 QL'QHL'
QLQHL
QSPLQSP
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'を入れ換える EX F,F'命令によってのみアクセスされます。

(3) 汎用レジスタ間接 ( r32 )

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)
汎用レジスタ間接指定です。 m-mmmmが、0-0rrrの形式で32ビットレジスタを指定します。 ADD命令のコードは2バイトになります。

TLCS-900Lのアドレス空間は24ビットのため、 指定された32ビットレジスタの値の上位8ビットは無視されます。

(4) レジスタ間接 ( r32 )

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ビットで区別可能です。

(5) 8bitディスプレースメント付き汎用レジスタ間接 ( r32+数値 )

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+数値)
8ビットのディスプレースメント付きレジスタ間接指定です。 m-mmmmが、0-1rrrの形式でベースレジスタを指定し、次のバイトに オフセットを記述します。 ADD命令のコードは3バイトになります。

オフセットは符号付で、-128〜127の範囲が指定できます。

このアドレッシングモードのレジスタ番号版はありません。 以下にあげる、16bitオフセット付きのものを利用してください。

(6) 16bitディスプレースメント付きレジスタ間接 ( r32+数値 )

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の範囲が指定できます。

(7) プリデクリメント付きレジスタ間接 ( - r32 )

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
プリデクリメント付きレジスタ間接指定です。 指定された32ビットレジスタが、指定された値だけ減少した後、 レジスタ間接アドレッシングが行なわれます。 m-mmmm を 1-0100 として指定し、すべての32ビットレジスタが指定できます。 ADD命令のコードは3バイトになります。
レジスタ番号は、上位6ビット分を指定します。 間接指定で用いられるレジスタは必ず32ビット (long word) のため、 レジスタ番号の上位6ビットで区別可能です。
減少する値は、ssで指定します。これは、zzと通常は一致しますが、 異なっていてもかまいません。 (異なっている場合のアセンブラ表記は不明です。)
なお、LDDRなどの、ブロック転送/検索命令のデクリメントは、ポストデクリメント、 つまり、メモリにアクセスされた後に、レジスタがデクリメントされます。

(8) ポストインクリメント付きレジスタ間接 ( r32 + )

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
ポストインクリメント付きレジスタ間接指定です。 指定された32ビットレジスタにより間接アドレッシングが行なわれた後、 その32ビットレジスタが指定された値だけ増加します。 m-mmmm を 1-0101 として指定し、すべての32ビットレジスタが指定できます。 ADD命令のコードは3バイトになります。
レジスタ番号は、上位6ビット分を指定します。 間接指定で用いられるレジスタは必ず32ビット (long word) のため、 レジスタ番号の上位6ビットで区別可能です。
増加する値は、ssで指定します。これは、zzと通常は一致しますが、 異なっていてもかまいません。 (異なっている場合のアセンブラ表記は不明です。)

(9) レジスタ指定レジスタ間接 ( r32+r )

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ビットオフセットレジスタです。 どちらの場合も、符号付として扱われ、符号拡張された後にベースレジスタに 加算されます。

(10) 直接アドレス ( n )

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)
アドレス指定による直接アドレッシングです。 指定されたアドレスがアクセスされます。 指定可能なアドレス範囲により、このアドレッシングは3種類あります。
m-mmmmが1-0000の場合は、アドレスを1バイトで指定し、 ADD命令コードは3バイト長になります。 このアドレッシングモードでは、 アドレス空間の最初の256バイト空間を指定できます。
m-mmmmが1-0001の場合は、アドレスを2バイトで指定し、 ADD命令コードは4バイト長になります。 このアドレッシングモードでは、 アドレス空間の最初の64Kバイト空間を指定できます。
m-mmmmが1-0000の場合は、アドレスを3バイトで指定し、 ADD命令コードは5バイト長になります。 TLCS-900Lのアドレス空間は24ビットのため、 すべてのアドレス空間が指定可能です。

(11) 即値 #

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回の方がよいでしょう。

(12) 相対アドレッシング

いわゆるPC相対ですが、TLCS-900では、JR や CALR や DJNZ の相対ジャンプ命令系、 および、LDAR 命令にしか使用できません。

まとめ
まとめると、TLCS-900Lでは、次の形式のアドレッシングが可能です。

数値 即値
r すべてのレジスタ直接
( r32 ) 32ビットレジスタ間接
( r32+数値 ) ディスプレースメント付きレジスタ間接
(-32768〜32767)
( -r32 ) プリデクリメント付きレジスタ間接
( r32+ ) ポストインクリメント付きレジスタ間接
( r32+r8 )
( r32+r16 )
レジスタ指定レジスタ間接
オフセットレジスタ r8,r16 は符号付
( アドレス ) 直接アドレス

このように、アドレッシングモードに関しては、 命令語長の長い短いはあるにせよ、 バンクレジスタを含むすべてのレジスタに対し直交しています。
但し、命令により、使えるアドレッシングとそうでないものがありますので、 注意してください。 アセンブラマニュアル中では、 上記の表の下6つ (黄色) のものは、(mem) と表されています。 また、レジスタ指定r は、すべてのレジスタが指定可能な場合は r、 汎用レジスタだけの場合は R になります。