Math: 24 bit subtract with borrow

based on code from Rudy Wieser and hints from Dwayne Reid.

; warning: untested.
;----------------------------
; 24-bit Subtraction-with-Borrow
;       RH:RM:RL = Number to be subtracted
;       DestH:DestM:DestL = Number to be subtracted FROM
;Out    DestH:DestM:DestL = Result = Dest-R
;       Carry = NOT( Borrow result)
; by David Cary 2001-06-26
; based on code by Rudy Wieser (2000-02-17)
        movfw    SourceL ; Lo byte
        subwf   DestL,f  

        movfw SourceM    ;middle byte
        skpc
          incfsz SourceM,W
            subwf DestM,f

        movfw    SourceH ; Hi byte
        skpc
          incfsz  SourceH,W
            subwf   DestH,f     ;dest = dest - source, WITH VALID CARRY
                                ;(although the Z flag is not valid).
        retlw 0
;----------------------------

This ought to be easy to generalize to 32 bits or more.

http://piclist.com/techref/microchip/seepicsrc/psbpix/plus_minus.htm suggests negating one of the numbers and then adding. How would that compare to the code above ?

; warning: untested
; 24-bit Subtraction-with-Borrow
; RH:RM:RL = Number to be subtracted
; DestH:DestM:DestL = Number to be subtracted FROM
;Out DestH:DestM:DestL = Result = Dest-R
; Carry = NOT( Borrow result)
; by David Cary 2001-06-26
; Some people believe that you have to add 1 after complementing
; to negate a number. Not in this case.

  ; first complement dest to get -dest-1
  comf DestL,f
  comf DestM,f
  comf DestH,f
  ; then add R to get R-dest-1
  ; From: Dwayne Reid
  ; http://piclist.com/techref/microchip/math/add/24b.htm
     movfw       RL              ;
     addwf       Dest,F          ;LS byte

     movfw       RM             ;middle byte
     skpnc
       incfsz    RM,W
         addwf   Dest,F          ;

     movfw       RH             ;MS byte
     skpnc
       incfsz    RH,W
         addwf   Dest,F          ;
  ; then complement dest again to get dest-R.
  comf DestL,f
  comf DestM,f
  comf DestH,f
  retlw 0

It looks pretty easy to compress the redundant bits of the above code ...

; by David Cary
subtract_24:
    call negateDest
    call add24_R_to_Dest
negateDest:
    comf DestL,f
    comf DestM,f
    comf DestH,f
    retlw 0
If you're willing to give up a little speed to get more space, this looks like the most compact code (assumes you already have add24 subroutine).