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