アドレッシングモード

アドレッシングモード(Addressing Mode)は、操作する値をどうのようにして指定するかの方法のことを言います。65C816にもさまざまなアドレッシングモードがあります。
最低限太字のアドレッシングモードは覚えておかなければコードは読めません。
 
暗黙(Implied)
オペランドを必要としないアドレッシングモードです。主にレジスタ操作が対象となります。

アキュムレータ(Accumulator)
オペランドとしてAレジスタを指定します。単純にAと表します。

イミディエイトモード/即値アドレスモード(Immediate)
アドレス部の内容が目的のデータとして利用されます。先頭に#をつけて#$1234のように表します。

絶対アドレスモード(Absolute)
アドレス部の内容が目的のデータが格納されている16bitアドレスを表します。$1234のように表します。

絶対ロングアドレスモード(Absolute Long)
アドレス部の内容が目的のデータが格納されている24bitフルアドレスを表します。$123456のように表します。

ダイレクトモード(Direct Page)
アドレス部の内容にダイレクトページレジスタの値を足したアドレスが目的のデータの各のされているアドレスを表します。
$12のように表します。なお、フルアドレス上位8bitは0固定となります。

絶対アドレスインデクスX/Yモード(Absolute Indexed, X/Y)
アドレス部の内容にインデクスレジスタの値を足したアドレスが目的のデータが格納されているアドレスを表します。
Xレジスタを足すのかYレジスタを足すのかで$1234,xと$1234,yという表し方があります。

絶対ロングアドレスインデクスXモード(Absolute Long Indexed, X)
アドレス部の内容にインデクスレジスタの値を足したアドレスが目的のデータが格納されている24bitフルアドレスを表します。
$123456,xと表します。絶対ロングアドレスインデクスYモードはありません。

ダイレクトインデクスX/Yモード(Direct Page Indexed, X/Y)
アドレス部の内容にダイレクトページレジスタの値とインデクスレジスタを足したアドレスが目的のデータの各のされているアドレスを表します。
Xレジスタを足すのかYレジスタを足すのかで$12,xと$12,yという表し方があります。

プログラムカウンタ相対モード/プログラムカウンタリラティブモード(Program Counter Relative)
ソース上の現在位置と、目的データの対象の位置との差分でアドレスを指定します。プログラムカウンタにアドレス部の内容を足したものが目的のデータのアドレスとなります。参照範囲は-128バイト~+127バイト以内でなければいけません。アセンブリコード上では基本的にラベルを用いて記述します(つまりアセンブル時に自動的にコード配置がされる)。

プログラムカウンタ相対ロングモード/プログラムカウンタリラティブロングモード(Program Counter Relative Long)
ソース上の現在位置と、目的データの対象の位置との差分でアドレスを指定します。プログラムカウンタにアドレス部の内容を足したものが目的のデータのアドレスとなります。参照範囲は-32768バイト~+32767バイト以内でなければいけません。アセンブリコード上では基本的にラベルを用いて記述します(つまりアセンブル時に自動的にコード配置がされる)。

ダイレクトインダイレクトモード/ダイレクトページ間接モード(Direct Page Indirect)
アドレス部の内容にダイレクトページレジスタの値を足して得られるアドレスから16bitを読み込み、それを下位16bit、DBレジスタを上位8bitとしたアドレスに目的のデータが格納されています。
($12)のように表します。

ダイレクトインダイレクトロングモード/ダイレクトページ間接ロングモード(Direct Page Indirect Long)
アドレス部の内容にダイレクトページレジスタの値を足して得られるアドレスから24bitを読み込んだそのアドレスに目的のデータが格納されています。
[$12]のように表します。

ダイレクトインデクスXインダイレクトモード/ダイレクトインデックスX間接モード(Direct Page Indexed Indirect, X)
アドレス部の内容にダイレクトページレジスタとXレジスタの値を足して得られるアドレスから16bitを読み込み、それを下位16bit、DBレジスタを上位8bitとしたアドレスに目的のデータが格納されています。
ダイレクトインデクスYインダイレクトモードはありません。($12, x)のように表します。

ダイレクトインダイレクトインデクスYモード/ダイレクトページ間接インデクスYモード(Direct Page Indirect Indexed, Y)
アドレス部の内容にダイレクトページレジスタの値を足して得られるアドレスから16bitを読み込み、さらにそれにYレジスタを足したものを下位16bit、DBレジスタを上位8bitとしたアドレスに目的のデータが格納されています。
($12),yのように表します。

ダイレクトインダイレクトロングインデクスYモード/ダイレクトページ間接ロングインデクスYモード(Direct Page Indirect Long Indexed, Y)
アドレス部の内容にダイレクトページレジスタの値を足して得られるアドレスから24bitを読み込み、さらにYレジスタを足したアドレスに目的のデータが格納されています。
ダイレクトインダイレクトロングインデクスXモードはありません。[$12],yのように表します。

絶対インダイレクトモード/絶対アドレス間接指定(Absolute Indirect)
アドレス部のアドレスから16bitを読み込み、それを下位16bit、上位8bitをプログラムバンクレジスタとしたアドレスに目的のデータが格納されています。
($1234)のように表します。

絶対インダイレクトロングモード/絶対ロングアドレス間接指定(Absolute Indirect Long)
アドレス部のアドレスから24bitを読み込んだそのアドレスに目的のデータが格納されています。
[$1234]のように表します。

絶対インデクスXインダイレクトモード(Absolute Indexed Indirect, X)
アドレス部の内容にXレジスタを足したアドレスから16bitを読み込み、それを下位16bit、上位8bitをプログラムバンクレジスタとしたアドレスに目的のデータが格納されています。
絶対インデクスYインダイレクトモードはありません。($1234, x)のように表します。

スタック相対モード/スタックリラティブモード(Stack Relative)
アドレス部の内容にスタックポインタを足したアドレスが目的のデータが格納されたアドレスを表します。
スタックポインタは常に次の有効なスタックの空き領域を示しているため、オペランドに1を指定すれば最後にスタックに積まれた値、0を指定すれば最後にスタックからプルされた値を指す。
$01,sのように表します。

スタック相対間接インデックスYモード/スタックリラティブインダイレクトインデックスYモード(Stack Relative Indirect Indexed, Y)
アドレス部の内容にスタックポインタを足したアドレスから16bitを読み込み、さらにYレジスタを足したアドレスが目的のデータの格納されているアドレスを表します。
($01,s),yのように表します。