;FILE: BINBCD3.ASM

;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

 

Zurück