ADC $hhll

From C64-Wiki
Jump to navigationJump to search
Mnemonic: ADC $hhll
2. Schreibweise: {{{2. Schreibweise}}}
Opcode: $6D
Operator(en): $ll $hh
Byte count: 3
Command type: Arithmetic- and logic command
Address mode: absolute
register flags:
Carry Flag
Negative Flag
Overflow Flag
Zero Flag
Cycles: 4


The assembler command ADC $hhll adds the content of memory location $hhll to the accumulator.
If the carry flag is set the result is incremented by one.
Therefore the carry flag should be cleared with CLC before an addition; unless the behaviour is intended.
The result is stored in the accumulator.
If the result is bigger than 255 ($ff) the carry flag is set to be used in multibyte addition as the carry from one byte to the next higher byte. If the carry flag is set in single-byte arithmetic or after the highest order byte has been processed in multi-byte arithmetic, then it should be treated as an overflow.

Function flow

Assembler command 6d.gif

Explanation of the mnemonic shortcut

ADC ADd with Carry
Add accumulator with operator and carry flag

Example

; This program adds two 16 bit numbers
; and displays the result on the screen.
; Start program with SYS 49152

*=$c000   ; start address of the program

AXOUT = $bdcd

start      clc             ; clear carry bit
           lda l_num1      ; low byte of 1st number
           adc l_num2      ; add low byte of 2nd number
           sta l_result    ; store low byte in result

           lda h_num1      ; high byte of 1st number
           adc h_num2      ; add high byte of 2nd number 
           sta h_result    ; store high byte in result		

           ldx l_result    ; low byte of result in X register
           lda h_result    ; high byte of result in accumulator
           jsr AXOUT       ; display 16 bit number

           rts             ; return to BASIC			

l_num1     .byte $00       ; number 1 = $1000
h_num1     .byte $10 
l_num2     .byte $55       ; number 2 = $2155
h_num2     .byte $21
l_result   .byte $00       ; result = $0000
h_result   .byte $00
.c000	 18            clc
.c001	 ad 1d c0      lda $c01d
.c004	 6d 1f c0      adc $c01f
.c007	 8d 21 c0      sta $c021
.c00a	 ad 1e c0      lda $c01e
.c00d	 6d 20 c0      adc $c020
.c010	 8d 22 c0      sta $c022
.c013	 ae 21 c0      ldx $c021
.c016	 ad 22 c0      lda $c022
.c019	 20 cd bd      jsr $bdcd
.c01c	 60            rts
>c01d	 00
>c01e	 10
>c01f	 55
>c020	 21
>c021	 00
>c022	 00

Comparison of the example program with BASIC

10 Z1=4096  : REM $1000 (4096)
20 Z2=8533  : REM $2155 (8533)
30 E=Z1+Z2
40 PRINT E  : REM $3155 (12629)