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

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)