; Smallest code AVR Sqrt
; Target: All AVRs including AT90S1200
; June 1999, by Jack Tidwell
; Calculates the sqrt by subtracting an ODD number that self increments (by 2)
; for each iteration. If the new ODD 'subber' is LESS than the previous
; results, increment our root by 1, and loop again.
; Worst case is about 200us at 8mhz and less than 15us for 8 bit.
; Example sqrt(100)
;num 'odd_suber' sqrt
;100 1 1
;99 3 2
;96 5 3
;91 7 4
;84 9 5
;75 11 6
;64 13 7
;51 15 8
;36 17 9
;19 19 10
so the sqrt(100) = 10
.def numlo = r16
.def numhi = r17
.def sqrt = r18
.def suber = r24
.def suberh= r25
; enter with the 16 bit Number in r16,r17
Sqrt:
clr sqrt
ldi suber,1 ; initialize the seed to be subtracted
clr suberh ; for each iteration
loop: sub numlo,suber
sbc numhi,suberh
brlo exit
inc sqrt
adiw suber,2 ; keep the number to subtract ODD.
rjmp loop
exit: ret ; the sqrt(num) on exit is stored in r18
;