算術演算命令

ADC (Add with Carry)

アキュムレータとメモリの値を足します。キャリーフラグが立っているときはそれも足してキャリーフラグをクリアします
オーバーフローがあったときにキャリーフラグが立ち、サインドオーバーフローが起きた場合にオーバーフローフラグが立ちます。
この命令で変更されうるフラグはネガティブフラグ・オーバーフローフラグ・ゼロフラグ・キャリーフラグです。
キャリーフラグの役割についてはこちらをご覧ください。(知らなくても構いませんが、知っておくとより理解が深まります)

OC 文法 アドレッシングモード バイト数 サイクル
69 ADC #$??
ADC #$????
Immediate 2
3
2
3
 
6D ADC $???? Absolute 3 4  
6F ADC $?????? Absolute Long 4 5  
65 ADC $?? Direct Page 2 3 1
72 ADC ($??) Direct Page Indirect 2 5 1
67 ADC [$??] Direct Page Indirect Long 2 6 1
7D ADC $????,x Absolute Indexed, X 3 4 2
7F ADC $??????,x Absolute Long Indexed, X 4 5  
79 ADC $????,y Absolute Indexed, Y 3 4 2
75 ADC $??,x Direct Page Indexed, X 2 4 1
61 ADC ($??,x) Direct Page Indexed Indirect, X 2 6 1
71 ADC ($??),y Direct Page Indirect Indexed, Y 2 5 1,2
77 ADC [$??],y Direct Page Indirect Long Indexed, Y 2 6 1
63 ADC $??,S Stack Relative 2 4  
73 ADC ($??,S),Y Stack Relative Indirect Indexed, Y 2 7  


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

コラム:大きい値の足し算
65816は8bitまたは16bitの符号付整数を扱えますが、ADC命令を適切に用いることで、それ以上の大きさの値の足し算を行うことが出来ます。ここでは2つのDword値#$13579BDFと#$2468ACE0を足してみます。
CLC
LDA #$9BDF
ADC #$ACE0    ;#$9BDF+#$ACE0=#$148BF
STA $02
LDA #$1357
ADC #$2468    ;#$1357+#$2468+1=#$37C0
STA $00
CLC
まず2つの値の下位16bit同士を足します。このとき、bit16への繰上りがある場合はキャリーフラグがセットされます。コード例では赤字の1で表しました。
次に2つの値の上位16bit同士を足します。このとき、キャリーフラグが立っていればさらに1が足されます。今回はキャリーが立っているのでさらに1が足されます。
こうして計算した2つの16bit値を並べると、正しく32bit+32bitが計算されていることが分かります。基本的に値が何bitになっても計算方法は同じです。

SBC (Subtract from Accumulator)

アキュムレータからメモリの値を引きます。キャリーフラグが立っていないときはさらに1引きます
繰り下がりがなかったときにキャリーフラグが立ち、サインドオーバーフローが起きた場合にオーバーフローフラグが立ちます。
この命令で変更されうるフラグはネガティブフラグ・オーバーフローフラグ・ゼロフラグ・キャリーフラグです。
キャリーフラグの役割についてはこちらをご覧ください。(知らなくても構いませんが、知っておくとより理解が深まります)

OC 文法 アドレッシングモード バイト数 サイクル
E9 SBC #$??
SBC #$????
Immediate 2
3
2
3
 
ED SBC $???? Absolute 3 4  
EF SBC $?????? Absolute Long 4 5  
E5 SBC $?? Direct Page 2 3 1
F2 SBC ($??) Direct Page Indirect 2 5 1
E7 SBC [$??] Direct Page Indirect Long 2 6 1
FD SBC $????,x Absolute Indexed, X 3 4 2
FF SBC $??????,x Absolute Long Indexed, X 4 5  
F9 SBC $????,y Absolute Indexed, Y 3 4 2
F5 SBC $??,x Direct Page Indexed, X 2 4 1
E1 SBC ($??,x) Direct Page Indexed Indirect, X 2 6 1
F1 SBC ($??),y Direct Page Indirect Indexed, Y 2 5 1,2
F7 SBC [$??],y Direct Page Indirect Long Indexed, Y 2 6 1
E3 SBC $??,S Stack Relative 2 4  
F3 SBC ($??,S),Y Stack Relative Indirect Indexed, Y 2 7  


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

コラム:大きい値の引き算
65816は8bitまたは16bitの符号付整数を扱えますが、SBC命令を適切に用いることで、それ以上の大きさの値の引き算を行うことが出来ます。ここではDword値#$13579BDFから#$2468ACE0を引いてみます。
SEC
LDA #$9BDF
SBC #$ACE0    ;#$9BDF-#$ACE0=#$EEFF
STA $02
LDA #$1357
ADC #$2468    ;#$1357+#$2468-1=#$EEEE
STA $00
SEC
まず2つの値の下位16bit同士を引きます。このとき、繰り下がりが無い場合はキャリーフラグが立ちます。
次に2つの値の上位16bit同士を引きます。このとき、キャリーフラグが立っていなければさらに1が引かれます。今回はキャリーが立っていないのでさらに1が引かれます。
こうして計算した2つの16bit値を並べると、正しく32bit-32bitが計算されていることが分かります。基本的に値が何bitになっても計算方法は同じです。

INC (Increment Memory)

アキュムレータやメモリの値をインクリメントします。
この命令で変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
1A INC A Accumulator 1 2  
EE INC $???? Absolute 3 6 1
E6 INC $?? Direct Page 2 5 1,2
FE INC $????,x Absolute Indexed, X 3 7 1
F6 INC $??,x Direct Page Indexed, X 2 6 1,2


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

INX (Increment Index Register X)

Xレジスタをインクリメントします。
この命令で変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
E8 INX Implied 1 2  

INY (Increment Index Register Y)

Yレジスタをインクリメントします。
この命令で変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
C8 INY Implied 1 2  

DEC (Decrement Mermory)

アキュムレータやメモリの値をデクリメントします。
この命令で変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
3A DEC A Accumulator 1 2  
CE DEC $???? Absolute 3 6 1
C6 DEC $?? Direct Page 2 5 1,2
DE DEC $????,x Absolute Indexed, X 3 7 1
D6 DEC $??,x Direct Page Indexed, X 2 6 1,2


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

DEX (Decrement Index Register X)

Xレジスタをデクリメントします。
この命令によって変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
CA DEX Implied 1 2  

DEY (Decrement Index Register Y)

Yレジスタをデクリメントします。
この命令によって変更されうるフラグはネガティブフラグとゼロフラグです。

OC 文法 アドレッシングモード バイト数 サイクル
88 DEY Implied 1 2