PIC Microcontroller Math Method

BCD (packed) addition

From: Scott Dattalo

 ;****************************************** 
;bcd_add 
; 
; Computes  z = x + y 
; where x,y,z are all 8-bit packed BCD numbers 
; Exits with C=1 if x+y > 0x99 and with z=1 if 
; x+y = 0x100. 
; Note that z can be aliased to x or y so that 
;it's possible to calculate x = x+y or y = x+y 
;This routine forms the BCD two's complement of 
;y and then uses the bcd_subtract routine to 
;find the sum. e.g. z = x - (-y) = x + y 
; 
; 10 cycles 
bcd_add 
        COMF    y, W    ;W = ~y 
        ADDLW   0x9a+1  ;W = ~y + 0x9a +1 
                        ;W = (~y + 1) + 0x9a 
                        ;W = 0x9a - y 
        SUBWF   x, W    ;W = x - (0x9a - y) 
                        ;W = x + y - 0x9a 
                        ;W = x + y + 0x66 
        RLF     z, F    ;Get the carry 
        SKPDC           ;if lsn of x + lsn of y < 10 (dec) 
         ADDLW  -0x06   ; then remove the extra 6 added above 
        BTFSS   z, 0    ;Similarly for the msn 
         ADDLW  -0x60 
        RRF     z, F    ;restore the carry 
        MOVWF   z 

        RETURN