Divide 14 bit integer using a fixed point divisor and result (7Q8 format)

;-----------------------------------------------------------------------------
; Input:
;  a1:a0 - 14 bit dividend   (a0 - lower byte)
;  b1:b0 - 15 bit divisor in 7Q8 format (b1 is integer, b0 is
;          fractional)
; Output:
;  c1:c0 - 15 bit quotient in 7Q8 format
;
; Size: 27 words
; Time: 3+3+3+15*(5+8+6)-2+3=295 instruction cycles
;
; March 13, 2001 by Nikolai Golovchenko
; March 14, 2001 optimized by Scott Dattalo
;-----------------------------------------------------------------------------
div_uint14_fxp7q8_fxp7q8
;left align the dividend
; (shift accumulator left 1 bit to get the first result bit weight
;  equal to 128)
        clc
        rl      a0
        rl      a1      ;carry is cleared here
;initialize registers
        clr     c0      ;clear result - it will be used
        clr     c1      ;to shift zeroes to dividend
        setb c0.1       ;15 iterations
div_loop
        rl      a0      ;shift out next bit of dividend
        rl      a1      ;to remainder
        mov     W, b0   ;load w with lower divisor byte
        snc             ;if remainder positive - subtract,
        jmp     div_add ;if negative - add
        ;subract
        sub     a0, W
        mov     W, b1
        sc
        movsz   W, ++b1
        sub     a1, W
        jmp     div_next
div_add
        ;add
        add     a0, W
        mov     W, b1
        snc
        movsz   W, ++b1
        add     a1, W
div_next
;here carry has a new result bit
        rl      c0      ;shift in next result bit
        rl      c1
        skpc
        jmp     div_loop
        retp