ロード・ストア命令

 

LDA (Load Accumulator from Memory)

アキュムレータに値をロードします。
アキュムレータが1バイト幅の場合は指定アドレスの内容を、2バイト幅の場合は指定アドレスの内容を下位バイトとして、指定アドレス+1にある内容を上位バイトとして読み込みます。
この命令で変更されうるフラグはネガティブフラグとゼロフラグとなります。

OC 文法 アドレッシングモード バイト数 サイクル
A9 LDA #$??
LDA #$????
Immediate 2
3
2
3
 
AD LDA $???? Absolute 3 4  
AF LDA $?????? Absolute Long 4 5 1
A5 LDA $?? Direct Page 2 3 1
B2 LDA ($??) Direct Page Indirect 2 5 1
A7 LDA [$??] Direct Page Indirect Long 2 6 1
BD LDA $????,x Absolute Indexed, X 3 4 2
BF LDA $??????,x Absolute Long Indexed, X 4 5  
B9 LDA $????,y Absolute Indexed, Y 3 4 2
B5 LDA $??,x Direct Page Indexed, X 2 4 1
A1 LDA ($??,x) Direct Page Indexed Indirect, X 2 6 1
B1 LDA ($??),y Direct Page Indirect Indexed, Y 2 5 1,2
B7 LDA [$??],y Direct Page Indirect Long Indexed, Y 2 6 1
A3 LDA $??,S Stack Relative 2 4  
B3 LDA ($??,S),Y Stack Relative Indirect Indexed, Y 2 7  


アキュムレータが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加
2:インデックスの追加時にページ境界をまたぐ場合は1サイクル追加


コード例
 
LDA #$12
アキュムレータに0x12という値を読み込みます。正数なのでネガティブフラグとゼロフラグがクリアされます。
 
LDA #$ABCD
または
LDA.W #$ABCD
アキュムレータに0xABCDという値を読み込みます。負数なのでゼロフラグがクリアされ、ネガティブフラグが立ちます。
アキュムレータが16bitモードのときは後者のように16bitモードであることを明記しなければ誤翻訳するアセンブラもあります。
 
LDA $D3
RAMの$0000D3+Dレジスタに格納されている値をアキュムレータに読み込みます。
ちなみにDK2では基本的にDレジスタは0で、大概の場合、このコードで$0000D3にアクセス可能です。アドレスにアクセスすればステージ番号を取得できます。

LDA $FE0000
RAMの$FE0000に格納されている値をアキュムレータに読み込みます。RAMのマッピングの仕様上これはROMの$3E0000に等しいです。

LDA $D3          //16bit幅で読み込み
AND #$00FF       //上位バイトをクリア
ASL A            //左シフト(2倍)
TAX              //Xレジスタに転送
LDA $FE0000,x
RAMの$FE0000+(Xレジスタの内容)に格納されている値をアキュムレータに読み込みます。(5行目)
ちなみにDK2の場合、このコードを走らせることでスプライト配置データへのポインタを取得することが出来ます。途中で使っている命令については別ページに説明がありますのでそちらを参照してください。

LDX (Load X Register from Memory)

インデックスレジスタXにに値をロードします。
インデックスレジスタが1バイト幅の場合は指定アドレスの内容を、2バイト幅の場合は指定アドレスの内容を下位バイトとして、指定アドレス+1にある内容を上位バイトとして読み込みます。
この命令で変更されうるフラグはネガティブフラグとゼロフラグとなります。

OC 文法 アドレッシングモード バイト数 サイクル
A2 LDX #$??
LDX #$????
Immediate 2
3
2  
AE LDX $???? Absolute 3 4  
A6 LDX $?? Direct Page 2 3 1
BE LDX $????,y Absolute Indexed, Y 3 4 2
B6 LDX $??,y Direct Page Indexed, Y 2 4 1


インデックスレジスタが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加
2:インデックスの追加時にページ境界をまたぐ場合は1サイクル追加


コード例
 
LDX #$00
Xレジスタに0x00という値を読み込みます。値が0なのでネガティブフラグがクリアされ、ゼロフラグが立ちます。

LDY (Load Y Register from Memory)

インデックスレジスタYにに値をロードします。
インデックスレジスタが1バイト幅の場合は指定アドレスの内容を、2バイト幅の場合は指定アドレスの内容を下位バイトとして、指定アドレス+1にある内容を上位バイトとして読み込みます。
この命令で変更されうるフラグはネガティブフラグとゼロフラグとなります。

OC 文法 アドレッシングモード バイト数 サイクル
A0 LDY #$??
LDY #$????
Immediate 2
3
2
3
 
AC LDY $???? Absolute 3 4  
A4 LDY $?? Direct Page 2 3 1
BC LDY $????,x Absolute Indexed, X 3 4 2
B4 LDY $??,x Direct Page Indexed, X 2 4 1


インデックスレジスタが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加
2:インデックスの追加時にページ境界をまたぐ場合は1サイクル追加
 

STA (Store Accumulator to Memory)

アキュムレータの値をメモリに書き込みます。
この命令で変更されうるフラグはありません。

OC 文法 アドレッシングモード バイト数 サイクル
8D STA $???? Absolute 3 4  
8F STA $?????? Absolute Long 4 5 1
85 STA $?? Direct Page 2 3 1
92 STA ($??) Direct Page Indirect 2 5 1
87 STA [$??] Direct Page Indirect Long 2 6 1
9D STA $????,x Absolute Indexed, X 3 5 2
9F STA $??????,x Absolute Long Indexed, X 4 5  
99 STA $????,y Absolute Indexed, Y 3 5 2
95 STA $??,x Direct Page Indexed, X 2 4 1
81 STA ($??,x) Direct Page Indexed Indirect, X 2 6 1
91 STA ($??),y Direct Page Indirect Indexed, Y 2 5 1,2
97 STA [$??],y Direct Page Indirect Long Indexed, Y 2 6 1
83 STA $??,S Stack Relative 2 4  
93 STA ($??,S),Y Stack Relative Indirect Indexed, Y 2 7  


アキュムレータが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加
2:インデックスの追加時にページ境界をまたぐ場合は1サイクル追加

コード例
 
STA #$0A30
アキュムレータの値を$7E0A30に書き込みます。
DK2の場合、このアドレスは現在のX速度値のミラーとなります。
 
STA $20,x
アキュムレータの値を$20+(Xレジスタの値)に書き込みます。

STX (Store X Register to Memory)

インデックスレジスタXの値をメモリに書き込みます。
この命令で変更されうるフラグはありません。

OC 文法 アドレッシングモード バイト数 サイクル
8E STX $???? Absolute 3 4  
86 STX $?? Direct Page 2 3 1
96 STX $??,y Direct Page Indexed, y 2 4 1


インデックスレジスタが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加

STY (Store Y Register to Memory)

インデックスレジスタYの値をメモリに書き込みます。
この命令で変更されうるフラグはありません。

OC 文法 アドレッシングモード バイト数 サイクル
8C STY $???? Absolute 3 4  
84 STY $?? Direct Page 2 3 1
94 STY $??,x Direct Page Indexed, x 2 4 1


インデックスレジスタが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加

STZ (Store Zero byte to Memory)

メモリに0を書き込みます。アキュムレータが8bit幅の場合は1バイト、16bit幅の場合は2バイトのゼロバイトを書き込みます。
この命令で変更されうるフラグはありません。

OC 文法 アドレッシングモード バイト数 サイクル
9C STZ $???? Absolute 3 4  
64 STZ $?? Direct Page 2 3 1
9E STZ $????,x Absolute Indexed, y 3 5  
74 STZ $??,x Direct Page Indexed, X 2 4 1


アキュムレータが16bit幅の場合、1サイクル追加
1:ダイレクトページレジスタの下位バイトが0で無い場合は1サイクル追加

コード例
 
STZ #$ABCD
アキュムレータの値を$7EABCDに書き込みます。このコードは以下のコードのいずれかで置き換えられますが、STZはアキュムレータの値の変更とステータスレジスタのフラグ変更を行いません。
 
LDA #$00          n-----z--
STA $ABCD         n-----Z--
***               n-----Z--

LDA #$0000        n-----z--
STA $ABCD         n-----Z--
***               n-----Z--