アドレッシングモードとは、アドレスの表し方の方法です。
65816では、多くのアドレッシングモードがあります。
各モードを表記方法と共に示します。
イミディエイトモード #??/#????
数値を直接指定するモードです。
LDA #$35とすると、アキュムレータに35が代入されます。
16bitモードの時は、LDA.W #$0035やLDX.W #$0043などと16bitモードであることを明記しないと
アセンブラが誤翻訳することがあります。
ダイレクトモード ??
対象のアドレスを1バイトで指定する方式の1つです。
この1バイトの値+Dレジスタの値が実際の対象のアドレスです。Dレジスタは16bitですので、
最上位8bit00で固定されます。
すなわち、Dレジスタの値をDDDDとすると、
$00DDDD+??の和のアドレスを対象とします。
SpriteTool/BlockTool/LevelASMなどが呼び出されるときはDレジスタの値は#$0000なので、
LDA $30とした場合は、アドレス$000030の値をアキュムレータに代入します。
ROM、RAM、レジスタで述べたとおり、このアドレスは$7E0030に等しいです。
絶対アドレスモード ????
対象のアドレスを2バイトで指定する方式の1つです。
最上位1バイトの値はDBレジスタの値になります
SpriteTool/BlockToolなどが呼び出されるときはDBレジスタの値は#$01なので、
LDA $1234とした場合は、アドレス$011234の値をアキュムレータに代入します。
ROM、RAM、レジスタで述べたとおり、????の値が$0000〜$1FFFの時は、
このアドレスは$7E????に等しいです。
SpriteToolでは、すぐにDBレジスタの値が、ソースが実際に挿入されてるアドレスのバンク番号に書き換えられますが、
????の値が$0000〜$7FFFなら同じ事です。
絶対ロングアドレスモード ??????
対象のアドレスを3バイトで指定する方法です。
LDA $7E1234とした場合は、アドレス$7E1234の値をアキュムレータに代入します。
細かいことをグダグダと述べてきましたが、DレジスタだのDBレジスタだの知る必要はありません。
頻繁にアクセスするのはRAMである$7E0000〜$7FFFFFです。
例えば、$7E0010にアクセスしたいなら、LDA $10でもいいですし、LDA $0010でも構いませんし、LDA $7E0010でも言い訳です。
$7E1234にアクセスしたいのなら、LDA $1234でもいいし、LDA $7E1234でも構いません。
ただし、$7E2000〜$7FFFFFのRAMにアクセスするには絶対ロングアドレスモードを用いて、LDA $7E2000などとしなければいけません。
LDA $2000では駄目なわけです。
ダイレクトインデクスX/Yモード ??,x / ??,y
対象のアドレスを1バイト+XorYレジスタで指定する方式の1つです。
X=30の時、LDA $00,xとした場合は、SpriteTool/BlockTool/LevelASM等の場合は
アドレス$000030の値をアキュムレータに代入します。
勿論これは$7E0030と等しいです。
絶対アドレスインデクスX/Yモード ????,x / ????,y
対象のアドレスを2バイト+XorYレジスタで指定する方式の1つです。
X=30の時、LDA $1234,xとした場合は、SpriteTool/BlockTool/LevelASM等の場合は
アドレス$011264の値をアキュムレータに代入します。
勿論これは$7E1264と等しいです。
絶対ロングアドレスインデクスXモード ??????,x
対象のアドレスを3バイト+Xレジスタで指定する方式です。
X=30の時、LDA $7E1234,xとした場合は、アドレス$7E1264の値をアキュムレータに代入します。
絶対ロングアドレスインデクスYモードはありません。
プログラムカウンタ相対モード(8bit) pcr
プログラムソース上の現在の位置と対称の位置との差分のバイト数で指定する方式です。
指定できる数値は8bitですので、前後80バイトまでの位置に対象が無ければいけません
分岐命令などで使います。アセンブリコード上では対象アドレスをラベルを用いて表記します。
LDA #$30
BRA LBL001 ;LBL001の場所までジャンプ
:
:
LBL001 STA $03
プログラムカウンタ相対モード(16bit) pcrlong
プログラムソース上の現在の位置と対称の位置との差分のバイト数で指定する方式です。
こちらは16bitで指定します。
使用頻度が高いのはここまでです。
以下は知っておく必要は余りありません。
ダイレクトインダイレクトモード (??)
対象のアドレスを1バイトで指定する方式の1つです。
この1バイトの値+Dレジスタの値で示されるアドレス(最上位バイトは0)から16bit分の値を読み込み、
それを下位16bit、上位8bitをDBレジスタとしたアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E0000に34、$7E0001に12の値が格納されているとすると、
LDA ($00)の場合、まず$000000($7E0000と同等)から16bit分(2バイト分)の値を参照します。
この値は#$1234ですので、実際にこのモードで対象となるアドレスは$011234(この場合は$7E1234と同等)となります。
よって、LDA ($00)は、$7E1234の値をアキュムレータに代入することになります。
ダイレクトインデクスXインダイレクトモード (??,x)
対象のアドレスを1バイト+Xレジスタで指定する方式の1つです。
この1バイトの値+Xレジスタ+Dレジスタの値で示されるアドレスから16bit分の値を読み込み、
それを下位16bit、上位8bitをDBレジスタとしたアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E0010に34、$7E0011に12の値が格納されているとすると、
X=10の時でLDA ($00,x)の場合、まず$000010($7E0010と同等)から16bit分(2バイト分)の値を参照します。
この値は#$1234ですので、実際にこのモードで対象となるアドレスは$011234(この場合は$7E1234と同等)となります。
よって、LDA ($00,x)は、$7E1234の値をアキュムレータに代入することになります。
ダイレクトインデクスYインダイレクトモードはありません。
ダイレクトインダイレクトインデクスYモード (??),y
対象のアドレスを1バイト+Yレジスタで指定する方式の1つです。
この1バイトの値+Dレジスタの値で示されるアドレスから16bit分の値を読み込み、
さらにYレジスタを加えた値を下位16bit、上位8bitをDBレジスタとしたアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E0000に34、$7E0001に12の値が格納されているとすると、
Y=10の時でLDA ($00),yの場合、まず$000000($7E0000と同等)から16bit分(2バイト分)の値を参照します。
この値は#$1234ですので、実際にこのモードで対象となるアドレスは$011244(この場合は$7E1244と同等)となります。
よって、LDA ($00),yは、$7E1244の値をアキュムレータに代入することになります。
ダイレクトインダイレクトインデクスXモードはありません。
絶対インダイレクトモード (????)
対象のアドレスを2バイトで指定する方式の1つです。
この2バイトの値(最上位バイトは0)で示されるアドレスから16bit分の値を読み込み、
それを下位16bit、上位8bitをPBレジスタとしたアドレスを対象とします。
PBレジスタは、実際にソースが挿入されてアドレスのバンク番号です。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E1200に34、$7E1201に12の値が格納されているとすると、
LDA ($1200)の場合、まず$001200($7E1200と同等)から16bit分(2バイト分)の値を参照します。
この値は#$1234ですので、実際にこのモードで対象となるアドレスは$PB1234(この場合は$7E1234と同等)となります。
よって、LDA ($1200)は、$7E1234の値をアキュムレータに代入することになります。
絶対インデクスXインダイレクトモード (????,x)
対象のアドレスを2バイト+Xレジスタで指定する方式の1つです。
この2バイトの値+Xレジスタの値で示されるアドレスから16bit分の値を読み込み、
それを下位16bit、上位8bitをはPBレジスタとしたアドレスを対象とします。
ダイレクトインデクスYインダイレクトモードはありません。
ダイレクトインダイレクトロングモード [??]
対象のアドレスを1バイトで指定する方式の1つです。
この1バイトの値+Dレジスタの値で示されるアドレス(最上位バイトは0)から24bit分の値を読み込み、
その値のアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E0000に56、$7E0001に34、$7E0002に7Eの値が格納されているとすると、
LDA [$00]の場合、まず$000000($7E0000と同等)から24bit分(3バイト分)の値を参照します。
この値は#$7E3456ですので、実際にこのモードで対象となるアドレスは$7E3456となります。
よって、LDA [$00]は、$7E3456の値をアキュムレータに代入することになります。
ダイレクトインダイレクトロングインデクスYモード [??],y
対象のアドレスを1バイト+Yレジスタで指定する方式の1つです。
この1バイトの値+Dレジスタの値で示されるアドレスから24bit分の値を読み込み、
さらにYレジスタを加えた値のアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E0000に56、$7E0001に34、$7E0002に7Fの値が格納されているとすると、
Y=10の時でLDA [$00],yの場合、まず$000000($7E0000と同等)から24bit分(3バイト分)の値を参照します。
この値は#$7F3456ですので、実際にこのモードで対象となるアドレスは$7F3456となります。
よって、LDA [$00],yは、$7F3456の値をアキュムレータに代入することになります。
ダイレクトインダイレクトインデクスXモードはありません。
絶対インダイレクトロングモード [????]
対象のアドレスを2バイトで指定する方式の1つです。
この2バイトの値(最上位バイトは0)で示されるアドレスから24bit分の値を読み込み、
この値のアドレスを対象とします。
具体的には、SpriteTool/BlockTool/LevelASMの場合では、
例えば、$7E1200に34、$7E1201に12、$7E1202に7Fの値が格納されているとすると、
LDA [$1200]の場合、まず$001200($7E1200と同等)から24bit分(3バイト分)の値を参照します。
この値は#$7F1234ですので、実際にこのモードで対象となるアドレスは$7F1234となります。
よって、LDA [$1200]は、$7F1234の値をアキュムレータに代入することになります。
リラティブモード
工事中
リラティブロングモード
工事中
スタックリラティブモード
工事中
スタックリラティブインダイレクトインデックスYモード
工事中