#includecblock 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