DAA 命令 (Decimal Adjust for Addition)
加算結果を二進化十進数に変換します。

DAA オーバーロード
オペコード 構文 アドレッシングモード バイト数 命令サイクル
DF
DAA A
Accumulator
1
3


フラグ変化
n------zc

n: 変換後のアキュムレータのMSBがセットされる
z: 変換後のアキュムレータがゼロの場合にセットされる
c: 変換によって算術オーバーフローが発生した(変換後の値が十進数で100を超える)場合にセットされる。DAAの実行前にセットされている場合はセットされたままとなる。


解説
DAA命令は、直前に実行された加算命令の演算結果を二進化十進数に変換します。変換の対象はアキュムレータとなります。

DAA命令によって実行される処理は、次の3段階に分かれます。
・ステップ1    ハーフキャリーフラグがセットされているか、下位ニブルが0xA以上である場合は0x6を足す
・ステップ2    キャリーフラグがセットされているか、上位ニブルが(ステップ1の実行後)0xA以上である場合は0x60を足す
・ステップ3    ビット8をキャリーフラグにセットする(算術オーバーフローしなければ、このビットは0である)

; DAA Sample

; Calculate 25 + 49 (= 74) in decimal.

CLRC		; ***-*-**
MOV	A, #$25	; ***-*-*c
ADC	A, #$49	; n**-*-zc	A: 25	First, add two numbers in hexadecimal.
DAA	A	; nv*-h-zc	A: 6E	Then, execute DAA instruction.
***		; nv*-h-zc	A: 74

;DAA instruction runs following operations in this case.
;1. Since low nibble is 0xE > 0x9, adds 0x6 to accumulator. 0x6E + 6 = 0x74
;2. Since high nibble is 0x7 < 0xA and carry flag is not set, no operation is done in this step.
;3. Carry has not occured, so carry flag is not set.

; Calculate 99 + 99 (= 198) in decimal.

CLRC		; ***-*-**
MOV	A, #$99	; ***-*-*c
ADC	A, #$99	; n**-*-zc	A: 99	First, add two numbers in hexadecimal.
DAA	A	; nv*-H-zC	A: 32	Then, execute DAA instruction.
***		; Nv*-H-zC	A: 98	100's place is stored in carry flag. DAA instruction result is 198 in decimal.

;DAA instruction runs following operations in this case.
;1. Since half-carry flag is set, adds 0x6 to accumulator. 0x32 + 6 = 0x38
;2. Since carry flag is set, adds 0x60 to accumulator. 0x38 + 0x60 = 0x98
;3. Since carry flag was set befor do DAA, carry flag is still set.


参照