Packed BCD to 16 bit binary conversion
;*******************************************************************************
; 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: 3+2+16*(6+12+4)-2+3=358 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
mov W, #16
mov counter, W
bcd2bin16loop
clc
rr bcd2
rr bcd1
rr bcd0
rr hi
rr lo
clr W
snb bcd0.3
or W, #$03
snb bcd0.7
or W, #$30
sub bcd0, W
clr W
snb bcd1.3
or W, #$03
snb bcd1.7
or W, #$30
sub bcd1, W
decsz counter
jmp bcd2bin16loop
ret
;*******************************************************************************