ADC $hhll

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: ADC $hhll
Opcode: $6D
Operand(en): $ll $hh
Anzahl der Bytes: 3
Befehlsgruppe: Arithmetik- und Logikbefehl
Adressierung: absolut
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Overflow-Flag
Zero-Flag
Taktzyklen: 4


Der Assembler-Befehl ADC $hhll addiert zum Inhalt des Akkumulators den Inhalt der Speicherzelle $hhll.
Ist das Carry-Flag gesetzt, wird zusätzlich eins hinzugezählt.
Daher sollte vor jeder Addition, sofern nicht der Übertrag in einer zusammengesetzten Addition zu berücksichtigen ist, das Carry-Flag mit dem Befehl CLC gelöscht werden.
Das Ergebnis wird im Akkumulator gespeichert.
Ist das Ergebnis größer als 255 ($ff), wird das Carry-Flag als Übertrags-Bit mit der Wertigkeit von 256 verwendet.

Bei gesetztem Decimal-Flag erfolgt die Berechnung in BCD-Arithmetik, wobei bei Operanden im gültigen BCD-Format nur das Carry-Flag entsprechend gesetzt (bei Überlauf > $99) wird. Negative-Flag und Overflow-Flag werden zwar entsprechend der Komplement-Darstellung der Operanden verändert, haben aber keinen Bedeutung für die BCD-Arithmetik. Auch das Zero-Flag zeigt für gültige BCD-Operanden ein BCD-Ergebnis $00 nicht an (außer für den einfachen Fall $00+$00). Hier muss explizit der Akkumulator auf 0 getestet werden, etwa mit ORA #$00, AND #$FF, EOR #$00 oder mit einem Transferbefehl TAX oder TAY (falls die Index-Registerinhalte verworfen werden können).

Funktionsprinzip

Ass befehl 6d.gif

Bedeutung der Buchstaben im Befehl

ADC ADd with Carry
Addiere Akkumulator mit Operand und Carry-Flag

Beispiel

; Dieses Programm addiert zwei 16-Bit-Zahlen
; und gibt das Ergebnis am Bildschirm aus.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

AXOUT = $bdcd

start      clc             ; Carry-Bit löschen
           lda l_zahl1     ; Low-Byte der 1. Zahl mit
           adc l_zahl2     ; Low-Byte der 2. Zahl addieren
           sta l_ergebnis  ; Low-Byte ins Ergebnis schreiben

           lda h_zahl1     ; High-Byte der 1. Zahl mit
           adc h_zahl2     ; High-Byte der 2. Zahl addieren
           sta h_ergebnis  ; High-Byte ins Ergebnis schreiben		

           ldx l_ergebnis  ; Low-Byte vom Ergebnis ins X-Register 
           lda h_ergebnis  ; High-Byte vom Ergebnis in den Akku
           jsr AXOUT       ; 16-Bit-Zahl ausgeben

           rts             ; Rücksprung ins Basic			

l_zahl1    .byte $00       ; Zahl1 = $1000
h_zahl1    .byte $10 
l_zahl2    .byte $55       ; Zahl2 = $2155
h_zahl2    .byte $21
l_ergebnis .byte $00       ; Ergebnis = $0000
h_ergebnis .byte $00

Speicherauszug (vor der Ausführung):

.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

Vergleich des Beispielprogramms mit BASIC

Für BASIC V2:

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

Entsprechend dem obigen Beispiel.

Beispielprogramme