From: Juan Mayoral
Based on these two documents from the code library:
1): Binary to BCD half-packed 8 bit to 3 digit
From: Scott Dattalo, notes
2): Binary to BCD unpacked 16 bit to 5 digit
From: John Payson via Scott Dattalo
I wrote this linear code to convert binary to bcd unpacked.
The code isn't too short (131 words), but it always takes the
same time.
aar0 = binary number low byte
aar1 = binary number high byte
aac0 = bcd number ones
aac1 = bcd number tens
aac2 = bcd number hundreds
aac3 = bcd number thousands
aac4 = bcd number ten-thousands
b16_d5
swapf aar0,w ; partial ones sum in low byte
addwf aar0,w ;
andlw 0x0f ;
skpndc ;
addlw 0x16 ;
skpndc ;
addlw 0x06 ;
addlw 0x06 ;
skpdc ;
addlw -0x06 ; wmax=3:0
;
btfsc aar0,4 ; complete ones sum in low byte
addlw 0x15+0x06
skpdc
addlw -0x06 ; wmax=4:5
movwf aac0 ; save sum in aac0
;
; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+
; 20
; 100 60 30 15+
; ----------------------------------------------------
; 128 64 32 16 8 4 2 1
;
swapf aar1,w ; partial ones sum in high byte
addwf aar1,w ;
andlw 0x0f ;
skpndc ;
addlw 0x16 ;
skpndc ;
addlw 0x06 ;
addlw 0x06 ;
skpdc ;
addlw -0x06 ; wmax=3:0
;
btfsc aar1,0 ; complete ones sum in high byte
addlw 0x05+0x06
skpdc
addlw -0x06 ; wmax=3:5
;
btfsc aar1,4
addlw 0x15+0x06
skpdc
addlw -0x06 ; wmax=5:0
;
addlw 0x06 ; include previous sum
addwf aac0,w
skpdc
addlw -0x06 ; wmax=9:5, ones sum ended
;
movwf aac0
movwf aac1
swapf aac1,f
movlw 0x0f
andwf aac0,f ; save total ones sum in aac0
andwf aac1,f ; save partial tens sum in aac1
;
; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+
; 5+
; 60 80 90 10+ 5+
; 700 300 100 80 40 20 10 50
; 32000 16000 8000 4000 2000 1000 500 200
; ------------------------------------------------------
; 32768 16384 8192 4096 2048 1024 512 256
;
; complete tens sum in low and high byte
rrf aar1,w ; rotate right high byte once
andlw 0x0f ; clear high nibble
addlw 0x06 ; adjust bcd
skpdc
addlw -0x06 ; wmax=1:5
;
addlw 0x06 ; include previous sum
addwf aac1,w
skpdc
addlw -0x06 ; wmax=2:4
;
btfsc aar0,5
addlw 0x03+0x06
skpdc
addlw -0x06 ; wmax=2:7
;
btfsc aar0,6
addlw 0x06+0x06
skpdc
addlw -0x06 ; wmax=3:3
;
btfsc aar0,7
addlw 0x12+0x06
skpdc
addlw -0x06 ; wmax=4:5
;
btfsc aar1,0
addlw 0x25+0x06
skpdc
addlw -0x06 ; wmax=7:0
;
btfsc aar1,5
addlw 0x09+0x06
skpdc
addlw -0x06 ; wmax=7:9
;
btfsc aar1,6
addlw 0x08+0x06
skpdc
addlw -0x06 ; wmax=8:7
;
btfsc aar1,7
addlw 0x06+0x06
skpdc
addlw -0x06 ; wmax=9:3, tens sum ended
;
movwf aac1 ; save total tens sum in aac1
swapf aac1,w
andlw 0x0f ; load partial hundreds sum in w
;
; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+
; 20+ 5+
; 100+ 60+ 30+ 10+
; ----------------------------------------------------
; 128 64 32 16 8 4 2 1
;
; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+
; 5+
; 60+ 80+ 90+ 10+ 5+
; 700 300 100 80+ 40+ 20+ 10+ 50+
; 32000 16000 8000 4000 2000 1000 500 200+
; ------------------------------------------------------
; 32768 16384 8192 4096 2048 1024 512 256
;
; complete hundreds sum in high byte
btfsc aar1,1
addlw 0x05+0x06
skpdc
addlw -0x06 ; wmax=1:4
;
btfsc aar1,5
addlw 0x01+0x06
skpdc
addlw -0x06 ; wmax=1:5
;
btfsc aar1,6
addlw 0x03+0x06
skpdc
addlw -0x06 ; wmax=1:8
;
btfsc aar1,7
addlw 0x07+0x06
skpdc
addlw -0x06 ; wmax=2:5, hundreds sum ended
;
movwf aac2 ; save total hundreds sum in aac2
swapf aac2,w
movwf aac3 ; save partial thousands sum in aac3
movlw 0x0f ; clear high nibble
andwf aac1,f ;
andwf aac2,f ;
andwf aac3,f ;
;
; 8+ 4+ 2+ 1+ 8+ 4+ 2+ 1+
; 5+
; 60+ 80+ 90+ 10+ 5+
; 700+ 300+ 100+ 80+ 40+ 20+ 10+ 50+
; 32000 16000 8000 4000 2000 1000 500+ 200+
; ------------------------------------------------------
; 32768 16384 8192 4096 2048 1024 512 256
;
; complete thousands sum in low and high byte
rrf aar1,w ; rotate right high byte twice
movwf aac4 ;
rrf aac4,w ;
andlw 0x0f ; clear high nibble
addlw 0x06 ; adjust bcd
skpdc ;
addlw -0x06 ; wmax=1:5
;
addlw 0x06 ; include previous sum
addwf aac3,w
skpdc
addlw -0x06 ; wmax=1:7
;
btfsc aar1,6
addlw 0x16+0x06
skpdc
addlw -0x06 ; wmax=3:3
;
btfsc aar1,7
addlw 0x32+0x06
skpdc
addlw -0x06 ; wmax=6:5, thousands sum ended
;
movwf aac3 ; save total thousands sum in aac3
movwf aac4 ;
swapf aac4,f ; save ten-thousands sum in aac4
movlw 0x0f ; clear high nibble
andwf aac3,f ;
andwf aac4,f ;
P.S.: I am a beginner in the task of programming micro controllers.
And all suggestion that improves this code will be welcome.
Juan Mayoral (from the end of the world).
;* * * * * * * * * * * * * * * * * *
Comments: