
HT80C51 User Manual
80C51 Family Instruction Set – Instruction definitions
Handshake Solutions
© Philips Electronics N.V. 2005
Page 101 of 132
DA A
Function: Decimal-adjust Accumulator for Addition
Description: DA A adjusts the eight-bit value in the Accumulator resulting from the earlier addition of two vari-
able (each in packed-BCD format), producing two four-bit digits. Any ADD or ADDC instruction
may have been used to perform the addition.
If Accumulator bits 3-0 are greater than nine (xxx1010-xxx1111), or if the AC flag is one, six is
added to the Accumulator, producing the proper BCD digit in the low-order nibble. This internal
addition would set the carry flag if a carry-out of the low-order four-bit field propagated through all
high-order bits, but it would not clear the carry flag otherwise.
If the carry flag is now set, or if the four high-order bits now exceed nine (1010xxx-111xxxx), these
high-order bits are incremented by six, producing the proper BCD digit in the high-order nibble.
Again, this would set the carry flag if there was a carry-out of the high-order bits, but wouldn’t
clear the carry. The carry flag thus indicates if the sum of the original two BCD variables is greater
than 100, allowing multiple precision decimal addition. OV is not affected.
All of this occurs during the one instruction cycle. Essentially, this instruction performs the decimal
conversion by adding 00H, 06H, 60H, or 66H to the Accumulator, depending on initial Accumula-
tor and PSW conditions.
Note: DA A cannot simply convert a hexadecimal number in the Accumulator to BCD notation, nor
does DA A apply to decimal subtraction.
Example: The Accumulator holds the value 56H (01010110B) representing the packed BCD digits of the
decimal number 56. Register 3 contains the value 67H (01100111B) representing the packed
BCD digits of the decimal number 67. The carry flag is set.. The instruction sequence,
ADDC A,R3
DA A
will first perform a standard two’s-complement binary addition, resulting in the value 0BEH
(10111110B) in the Accumulator. The carry and auxiliary carry flags will be cleared.
The Decimal Adjust instruction will then alter the Accumulator to the value 24H (00100100B), indi-
cating the packed BCD digits of the decimal number 24, the low-order two digits of the decimal
sum of 56, 67, and the carry-in. The carry flag will be set by the Decimal Adjust instruction,
indicating that a decimal overflow occurred. The true sum 56, 67, and 1 is 124.
BCD variables can be incremented or decremented by adding 01H or 99H. If the Accumulator ini-
tially holds 30H (representing the digits of 30 decimal), the the instruction sequence,
ADD A,#99H
DA A
will leave the carry set and 29H in the Accumulator, since 30 + 99 = 129. The low-order byte of
the sum can be interpreted to mean 30 – 1 = 29.
Bytes: 1
Cycles: 1
Encoding:
Operation: DA
–contents of Accumulator are BCD
IF [[(A3-0) > 9]
∨ [(AC) = 1]]
THEN
(A3-0)
← (A3-0) + 6
AND
IF [[(A7-4) > 9]
∨ [(C) = 1]]
THEN
(A7-4)
← (A7-4) + 6
1
1
0
1
0
1
0
0