; ; sqrt.s ; ; Fast square root routines ; ; © 1995-1998 Straylight ; ;----- Licensing note ------------------------------------------------------- ; ; This file is part of Straylight's Sapphire library. ; ; Sapphire is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2, or (at your option) ; any later version. ; ; Sapphire is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with Sapphire. If not, write to the Free Software Foundation, ; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ;----- Standard header ------------------------------------------------------ GET libs:header GET libs:swis GET libs:stream ;----- Main code ------------------------------------------------------------ AREA |Sapphire$$Code|,CODE,READONLY ; --- sqrt --- ; ; On entry: R0 == value to square-root ; ; On exit: R0 == the result ; ; Use: Evaluates the square root of the number given. This routine ; is constructed from the information supplied by David Seal, ; and is *extremely* fast. EXPORT sqrt sqrt ROUT STMFD R13!,{R1-R4,R14} ;Stack registers MOV R1,#0 ;Result so far MOV R2,#0 ;Current remainder MOV R3,#1 ;A '01' pair MOV R4,#3 ;A nice mask GBLA count count SETA 0 ;Start the count at 30 WHILE count<=28 ;Set up the loop condition AND R14,R4,R0,LSR #30-count ORR R2,R14,R2,LSL #2 ORR R14,R3,R1,LSL #2 CMP R2,R14 ADC R1,R1,R1 SUBCS R2,R2,R14 count SETA count+2 WEND AND R14,R4,R0 ORR R2,R14,R2,LSL #2 ORR R14,R3,R1,LSL #2 CMP R2,R14 ADC R1,R1,R1 SUBCS R2,R2,R14 c MOV R0,R1 ;Put the result in R0 LDMFD R13!,{R1-R4,PC}^ ;Return to caller LTORG ;----- That's all, folks ---------------------------------------------------- END