; uint16 x = uint16 x / uint16 y
;
; Input:
; x, x+1 - 16 bit unsigned integer dividend (x - lsb, x+1 - msb)
; y, y+1 - 16 bit unsigned integer divisor
; Output:
; x, x+1 - 16 bit unsigned integer quotient
; Temporary:
; counter
; x+2, x+3 - 16 bit remainder
; temp - remainder extension
; Size: 36 instructions
; Max timing: 6+16*(5+14+4)-2+2+3=377 cycles
div16by16
clr x+2 ;clear
clr x+3 ;remainder
div16by16loopinit
clr temp ;clear remainder extension
mov W, #16
mov counter, W
stc ;first iteration will be subtraction
div16by16loop
;shift in next result bit and shift out next
;dividend bit to remainder
rl x ;shift lsb
rl x+1 ;shift msb
rl x+2
rl x+3
rl temp
mov W, y
sb x.0
jmp div16by16add
;subtract divisor from remainder
sub x+2, W
mov W, y+1
sc
movsz W, ++y+1
sub x+3, W
mov W, #1
sc
sub temp, W
jmp div16by16next
div16by16add
;add divisor to remainder
add x+2, W
mov W, y+1
snc
movsz W, ++y+1
add x+3, W
mov W, #1
snc
add temp, W
div16by16next
;carry is next result bit
decsz counter
jmp div16by16loop
;shift in last bit
rl x
rl x+1
ret
See also:
; uint16 x = uint16 x / uint16 y
;
; Input:
; x, x+1 - 16 bit unsigned integer dividend (x - lsb, x+1 - msb)
; y, y+1 - 16 bit unsigned integer divisor
; Output:
; x, x+1 - 16 bit unsigned integer quotient
; x+2, x+3 - 16 bit unsigned integer remainder
; Temporary:
; counter
; Size: 28 instructions
; Max timing: 4+16*(4+15+4)-2+2+3=375 cycles
div16by16
clr x+2 ;clear
clr x+3 ;remainder
mov W, #16
mov counter, W
div16by16loop
;shift in next result bit and shift out next
;dividend bit to remainder
rl x
rl x+1
rl x+2
rl x+3
;subtract divisor from remainder
mov W, y
sub x+2, W
mov W, y+1
sc
movsz W, ++y+1
sub x+3, W
;if no borrow, set next quotient bit
snc
jmp div16by16next
;if borrow, clear next quotient bit and restore the remainder
;add divisor to remainder
mov W, y
add x+2, W
mov W, y+1
snc
movsz W, ++y+1
add x+3, W
clc
div16by16next
decsz counter
jmp div16by16loop
;shift in last result bit
rl x
rl x+1
ret