Packed BCD to 16 bit binary conversion
#include
cblock 0x0C
bcd0, bcd1, bcd2
lo, hi
counter
endc
mov macro __x, __y
movlw __x
movwf __y
endm
mov 0x06, bcd2
mov 0x55, bcd1
mov 0x35, bcd0
call bcd2bin16
nop
;*******************************************************************************
; Input: packed BCD in bcd2:bcd1:bcd0 (modified!)
; bcd0 = tens:ones
; bcd1 = thou:hund
; bcd2 = 0:tenk
; Output: 16 bit binary in hi:lo
;Temporary: counter
; Size: 23 instructions
; Timing: 2+2+16*(6+12+3)-1+2=341 instruction cycles
;
; Notes: The routine uses BCD division by 2. Each iteration
; the LSB of BCD value (which coincides with correspondent
; binary bit) is shifted to output and BCD value is
; divided by 2. To do the division, BCD is shifted right
; once and corrected. Correction: if MSB of a nibble is set,
; subtract 3 from it.
;
;January 22, 2001 by Nikolai Golovchenko
;*******************************************************************************
bcd2bin16
movlw 16
movwf counter
bcd2bin16loop
clrc
rrf bcd2, f
rrf bcd1, f
rrf bcd0, f
rrf hi, f
rrf lo, f
clrw
btfsc bcd0, 3
iorlw 0x03
btfsc bcd0, 7
iorlw 0x30
subwf bcd0, f
clrw
btfsc bcd1, 3
iorlw 0x03
btfsc bcd1, 7
iorlw 0x30
subwf bcd1, f
decfsz counter, f
goto bcd2bin16loop
return
;*******************************************************************************
END