ADC 命令 (Add Memory to Accumulator with Carry)
オペランドに指定された値をアキュムレータに加算し、結果をアキュムレータに返します。

ADCオーバーロード
オペコード 構文 アドレッシングモード バイト数 命令サイクル
69
ADC #const
Imm.
2/ 3
2
1, 4
65
ADC dp
DP.
2
3
1, 2
72
ADC (dp)
DP. Ind
2
5
1, 2
67
ADC [dp]
DP. Ind long
2
6
1, 2
75
ADC dp, X
DP. Idx X
2
4
1, 2
61
ADC (dp, X)
DP. Idx Ind X
2
6
1, 2
71
ADC (dp), Y
DP. Ind Idx Y
2
5
1, 2, 3
77
ADC [dp], Y
DP. Ind long Idx Y
2
6
1, 2
6D
ADC abs
Abs.
3
4
1
7D
ADC abs, X
Abs. Idx X
3
4
1, 3
79
ADC abs, Y
Abs. Idx Y
3
4
1, 3
6F
ADC long
Abs. Iong
4
5
1
7F
ADC long, X
Abs. long Idx X
4
5
1
63
ADC sp, S
SR.
2
4
1
73
ADC (sp, S), Y
SR. Ind Idx Y
2
7
1


1. メモリモードフラグクリア時は1サイクル追加
2. ダイレクトページの開始アドレスがページ境界になっていない場合1サイクル追加
3. インデクス加算時にページ境界を超える場合は1サイクル追加
4. メモリモードフラグクリア時は3バイト。メモリモードフラグセット時は2バイト。
 
フラグ変化
nv----zc

n: アキュムレータのMSBがセットされる
v: サインドオーバーフローがあった場合にセットされる
z: 演算結果が0の場合にセットされる
c: 算術オーバーフローがあった場合にセットされる
解説
ADC命令はオペコードによって指定されたアドレッシングモードに従って、オペランドで指定された値とアキュムレータの間で和を取り、アキュムレータに結果を返します。
アキュムレータが8ビット長の場合は符号付8ビット整数同士の加算を、16ビット長の場合は符号付16ビット整数同士の加算を行います。
演算の結果、ビット8またはビット16への繰上り、すなわち算術オーバーフローがあった場合はオーバーフローフラグはクリアされ、キャリーフラグがセットされます。
また、演算の結果、符号が意図しないものとなった場合、すなわちサインドオーバーフローがあった場合はオーバーフローフラグがセットされ、キャリーフラグはクリアされます。

なお、キャリーフラグがセットされている場合、ADC命令はさらに1を足します。これはオーバーフローによる桁上がりを適切に表現するためです。


レジスタ幅を超える大きな数同士の加算を行う場合、次の例のように下位バイトから順に計算を行います。一連の操作において、キャリーフラグの状態を外部から変更してはいけません。
ただし、操作の開始時には必ずキャリーフラグをクリアする必要があります。ちょうど筆算と同じような方法で行います。また、ADC命令がキャリーを余分に足すという操作は、筆算における「繰上りの1を足す」操作と全く同じものです。
; ADC Sample
; Calculate #$13579BDF + #$2468ACE0 (= #$37C048BF)

CLC		;		**m*****
LDA	#$9BDF	;		**m****c
ADC	#$ACE0	; A: 9BDF	Nvm***zc
STA	$00	; A: 48BF	nvm***zC	#$9BDF + #$ACE0
LDA	#$1357	;
ADC	#$2468	; A: 1357	nvm***zc
STA	$02	; A: 37C0	nvm***zc	#$1357 + #$2468 + Carry
SEC		; Memory: BF 48 C0 37
参照