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