SPC700プロセッサで利用可能なアドレッシングモードについて説明します。
アドレッシングモードの概要
命令の実行には、通常、操作する対象が何であるのか、また、操作する対象がメモリ上のどこに存在しているのかといった情報が必要になります。
また、用途によって、同一のメモリに対して複数のアクセス方法があるほうがコーディングのロスを抑え、柔軟なプログラミングを可能にできます。
命令の実行に必要なデータの種類、およびそのデータへのアクセス方法を規定したものをアドレッシングモードと言います。また、前述の目的を達成するため、SPC700には多数のアドレッシングモードが用意されています。
なお、65C816とは異なり、SPC700の命令系は MOV A, dp+X のように、「どこに対して何が」をすべてオペランドで記述しなければなりません。
アキュムレータ
(Accumulator)
オペランドとしてアキュムレータを指定します。ソースコード上では A をオペランドに指定します。
例: ADC A,
#$12; アキュムレータに定数 #$12 を加算。
注: この例のように、 操作する対象, データの所在、 の順で記述します。
即値
(Immediate)
オペランドとして定数リテラルを指定します。アドレスと区別するためにソースコード上では # プレフィックスを付けます。
例: MOV A, #$12; アキュムレータに定数 #$12 を代入。
ダイレクトページ
(Direct Page)
オペランドとしてダイレクトページ内のアドレスを指定します。ダイレクトページが0ページであるか、1ページであるかは、PSWのPフラグに依存します。
一度に複数のダイレクトページをまたいで参照することはできません。
例: MOV $12, A; ダイレクトページ内のアドレス
$12 にアキュムレータの内容をストア。
ダイレクトページインデクス
(Direct Page Indexed)
オペランドとしてダイレクトページ内の基底アドレス、およびインデクスレジスタを指定します。
インデクスレジスタはX, Yとも使用可能ですが、命令によってはいずれかが使用できない場合があります。
例: MOV A, $12+X; ダイレクトページ内のアドレス $12 を基底アドレスとして、インデクスにXを追加した場所からアキュムレータに値を代入。
X-インデクスレジスタ間接
(Indirect)
Xレジスタの値をポインタとしてデータを指定します。参照されるのはダイレクトページとなります。
例: MOV A,
(X); Xレジスタの内容をダイレクトページ内のアドレスとし、そこからアキュムレータに値を代入。
X-インデクスレジスタ間接自動インクリメント (Indirect Auto-Increment)
Xレジスタの値をポインタとしてデータを指定します。参照されるのはダイレクトページとなります。
このモードでは、命令の実行後にXレジスタが自動的に1インクリメントされます。
配列の読取りに非常に便利なアドレッシングモードです。
例: MOV A, (X)+; Xレジスタの内容をダイレクトページ内のアドレスとし、そこからアキュムレータに値を代入。完了後、Xレジスタをインクリメント。
ダイレクトページ内移動
(Direct Page to Direct Page)
オペランドとしてダイレクトページ内のアドレスを2つ指定します。第2オペランドに指定したアドレスの内容を、第1オペランドに指定した内容に作用させます。
例: MOV $12, $34; ダイレクトページ内のアドレス $34 の内容を、ダイレクトページ内のアドレス $12
にコピー
インデクスレジスタ間接相互参照
(Indirect Page to Indirect Page)
オペランドとしてX, Yレジスタを指定します。
例: MOV (X), (Y); Yレジスタ間接で得られたデータをXレジスタ間接が指定するアドレスへコピー
ダイレクトページビット
(Direct Page Bit)
オペランドとしてダイレクトページ内のアドレス、およびテストするビットを指定します。
例: SET1 $12, 3;
ダイレクトページ内のアドレス $12 にあるデータのビット3をセット。
ダイレクトページビット相対
(Direct Page Bit Relative)
オペランドとしてダイレクトページ内のアドレス、テストするビット、および分岐アドレスを指定します。
例: BBS $12,
7, $34; ダイレクトページ内のアドレス $12 にあるデータのビット7がセットされている場合、52バイト先へ分岐
絶対アドレス
(Absolute)
オペランドとして16ビットのアドレスを指定します。
例: MOV A, $1234; アドレス $1234 の内容をアキュムレータに代入。
絶対インデクス
(Absolute Indexed)
オペランドとして16ビットのアドレスおよびインデクスレジスタを指定します。
インデクスレジスタはX, Yとも使用可能ですが、命令によってはいずれかが使用できない場合があります。
例: MOV $1234+X, A; アドレス $1234 を基底アドレスとしてインデクスXを追加した場所にアキュムレータの値をストア。
ダイレクトページインデクス間接
(Direct Page X-Indexed Indirect)
オペランドとしてダイレクトページ内のアドレスとXレジスタを指定します。
ダイレクトページインデクスによって16ビットを取得し、それをポインタとしてデータにアクセスします。
例: MOV A, ($12+X); ダイレクトページ内のアドレス $12+X からの16ビットをポインタとし、そこから8ビットをアキュムレータに代入。
ダイレクトページ間接インデクス
(Direct Page Indirect Y-Indexed)
オペランドとしてダイレクトページ内のアドレスとYレジスタを指定します。
ダイレクトページ間接によって16ビットを取得し、そこにYインデクスを追加したアドレスのデータにアクセスします。
例: MOV ($12)+Y, A; ダイレクトページ内のアドレス $12 からの16ビットにYレジスタを加算したアドレスをポインタとし、そこにアキュムレータの内容をストア。
絶対アドレスビット
(Absolute Boolean Bit)
オペランドとして16ビットのアドレスとテストするビットを指定します。
例: AND1 C, $1234, 7; アドレス
$1234 にあるデータのビット7とキャリーフラグとの論理積を取り、キャリーフラグに返す。
プログラムカウンタ相対
(Program Counter Relative)
オペランドとして8ビットのオフセットを指定します。
現在のプログラムカウンタの値にこのオフセットを加算した位置へプログラムの実行位置を変更します。
プログラムカウンタは、常に次の実行アドレスが格納されていることに注意が必要です。
例: BNE $12 ;ゼロフラグがクリアされている場合18バイト先へ分岐