;Umwandlung einer 16 - bit Binaerzahl
in einem BCD - Zahl.
;Die Zaehlmethode zu Umwandlung
einer Binaerzahl in eine BCD -
;Zahl im Programm binbcd2.asm
hat zu einer Programmlaufzeit
;von ueber einer Sekunde gefuehrt.
Dieses Programm soll die
;Umwandlung BIN -> BCD schneller
ausfuehren.
;Methode:
; Wird eine Binaerzahl um eine
Position nach links verschoben,
; so erhoeht sich, was hinlaenglich
bekannt ist, der Wert der
; Binaerzahl um den Faktor 2.
Dies gilt auch fuer BCD -
; Zahlen, vorausgesetzt nach
dem Linkschieben wird dezimali-
; siert (mit "da a").
; Wir bauen per Software zwei
Schieberegister auf. In einem
; Schieberegister ist die umzuwandelnde
Binaerzahl, im
; anderen Schieberegister ist
nach dem Programmdurchlauf die
; BCD - Zahl.
;
; Zeichnung:
; BCD - Register BIN - Register
; I ------------------I I--------------------I
; I <- I--<----I <-
I
; I-------------------I I--------------------I
; Schift mit "da a" Schift
; Zuerst wird das BCD - Register
auf 0 gesetzt, danach wird
; 16 mal nach links geschoben.
Im BCD - Register steht dann
; das Ergebnis.
; ???
; Wir verfolgen nun das MSB aus
dem BIN - Register. Dieses
; Bit hat die Wertigkeit von
2 ** 15 also 32768.
; Es wird 16 mal nach links
geschoben. Nach dem ersten mal
; Linksschieben hat das Bit
im BCD Register die LSB
; Position. Dies ergibt den
Wert 1 im BCD Register. Danach
; wird es noch 15 mal dezimalisiert
nach links geschoben,
; hat damit die Wertigkeit von
2 ** 15 bzw 32768, jedoch
; durch die Dezimalisierung
im BCD Format.
; Das MSB - 1 wird im BCD Register
nur 14 mal nach links
; geschoben.
; MSB - 2 im BCD 13 mal nach
links ....
; Damit ist fuer jedes Bit im
Binaerregister nachgewiesen,
; dass ein entsprechender Zahlenwert
im BCD - Register
; (addiativ) erzeugt wird.
;Eingang: dptr
;Ausgang: r3, r4, r5
; LSByte MSByte
;Veraenderte Register: accu,
psw, r2
org 8000h
mov r3, #0h
mov r4, #0h
mov r5, #0h
mov r2, #10h ;Zaehlschleife
m1:
;16 mal shift
mov a, dpl ;Binaeres Register
add a, dpl ;(dptr) nach links
mov dpl, a ;schieben
mov a, dph
rlc a
mov dph, a
;das bcd Register be-
mov a, r3 ;steht aus r3, r4, r5.
addc a, r3 ;nicht "rlc a" , da
da a ;ac nicht gesetzt wird
mov r3, a
mov a, r4
addc a, r4
da a
mov r4, a
mov a, r5
addc a, r5
da a
mov r5, a
djnz r2, m1
nop
nop
nop
;PS: Eine andere effiziente Methode
kann mit einer Division durch 10
;realsiert werden. Es muss dabei
die umzuwandelde Zahl in einer
;Schleife durch 10 dividiert
werden, der ganzzahlige Rest ist eine neue
;Stelle im Ergebnis.
END