> From: Scott Dattalo SNIP > > I'll try: > > > > BCD_ADD: ;Y = Y + X > > MOVLW 66 W = 66 > > ADDWF X,W W = 95 + 66 = FB > > ADDWF Y,F Y = 95 + FB = 90, C=1 > > MOVLW -60 W = -60 > > SKPDC NOT SKIPPED > > MOVLW -66 W = -66 > > SKPC SKIPPED > > ADDWF Y,F NO ADD, SO RESULT = 90, C=1 > > RETLW 0 > > Close, but try X = 0x95 and Y = 0x95. The correct answer should > be Y=0x80 and C=1. However, this routine will produce Y=0x2A and > C=1. You still need that annoying normalization step. This code will produce 90 with C=1. Should be the right answer 95+95 = 190 not _180_. The code must be correct! > > > BCD_MINUS: ;Y = Y - X > > MOVF X,W > > SUBWF Y,F > > MOVLW -6 > > SKPC > > MOVLW -66 > > SKPDC > > ADDWF Y,F > > RETLW 0 > > Try X=0x25, Y=0x16. This produces 0xf1 instead of 0x91. I goofed on this one :(. How about this: BCD_MINUS: ;Y = Y - X MOVF X,W SUBWF Y,F ANDLW 0 ;Set Zero flag SKPDC IORLW 6 SKPC IORLW 60 SUBWF Y,F ;Zero flag is cleared RETLW 0 Test ZERO flag for underflow. Reggie