; 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 ;