SX Microcontroller Radix Math Method

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
;*******************************************************************************