PIC Microcontoller Radix Math Method

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