--- /dev/null
+/
+/
+/ S Q R T
+/ - - - -
+/
+/SUBROUTINE SQRT(X)
+/
+/ VERSION 5A 4-27-77 PT
+/
+ SECT SQRT
+ JA #SQRT
+ 0 /THE MANTISSA ND EXPOENT DIDDLE AREAS.
+ 0
+SQRTEX, 0
+ 0
+SQRT13, 0
+ 0
+ 13 /PHONEY EXPONENT PATCH.
+/
+ EXTERN #ARGER
+SQRTM1, TRAP4 #ARGER
+ TEXT +SQRT +
+SQRTXR, SETX XRSQRT
+ SETB BPSQRT
+BPSQRT, F 0.0
+XRSQRT, F 0.0
+SQRT1, F 0.0
+SQRT2, F 0.0
+SQRT3, F 0.0
+F1SQRT, F 1.
+F2SQRT, F 2.
+ ORG 10*3+BPSQRT
+ FNOP
+ JA SQRTXR
+ 0
+SQTRTN, JA .
+SQRTS1, 0 /IF BETWEEN 1/4 & 1/2
+ 3200
+ 0
+ 0 /IF BETWEEN 1/2 & 1
+ 2240
+ 0
+/
+SQRTS2, 7777 /IF BETWEEN 1/4 & 1/2
+ 2327
+ 7772
+ 7777 /IF BETWEEN 1/2 & 1
+ 3300
+ 0
+ BASE 0
+#SQRT, STARTD
+ FLDA 10*3
+ FSTA SQTRTN
+ FLDA 0
+ SETX XRSQRT
+ SETB BPSQRT
+ BASE BPSQRT
+ LDX 1,1
+ FSTA BPSQRT
+ FLDA% BPSQRT,1 /ADDR OF X
+ FSTA BPSQRT
+ STARTF
+ FLDA% BPSQRT /GET X
+ JEQ SQTRTN /IF =0 JUST RTN
+ JLT SQRTM1 /IF <0 THEN ERROR
+ FSTA SQRTEX+1 /SAVE NUMBER AWAY FOR A SECOND.
+ FLDA SQRT13 /GET A RIGHT ADJUSTED 13 IN THE FAC.
+ FSTA SQRTEX-2 /STORE AWAY RIGHT AHEAD OF THE EXPONENT.
+ FLDA SQRTEX /NOW RETREIVE THE EXPONENT AS HIGH ORDER WORD.
+ ALN 0 /CHOP OFF CRAP.
+ JEQ SQRTSC /IS IT EXACTLY ZERO? IF SO, SPECIAL CASE.
+ FNORM /NORMALIZE IT.
+ FSUB F1SQRT /NOW SUBTRACT ONE FROM IT.
+ FDIV F2SQRT /CHOP IT IN HALF NOW.
+ FSTA SQRT1 /AND SAVE 1/2 EXP IN A TEMP.
+ ALN 0 /NOW FIX THE EXPONENT.
+ FNORM /AND NORMALIZE IT TO REMOVE UNDESIRABLE BITS.
+ FSUB SQRT1 /NOW SUBTRACT OFF EXTRANEOUS BITS.
+ FMUL F2SQRT /EXPAND IT AGAIN [FAC =0 OR -1], OR 0 TO +1
+ JGE .+3 /MAKE SURE ITS POSITIVE.
+ FNEG /NOW MAKE IT 0 IF NO BIT OR +1 IF BIT
+SQRTBK, ATX 1 /SAVE IN AN INDEX.
+ FSUB F1SQRT /SUBTRACT ONE TO MAKE IT -1 IF NO BIT OR 0 IF BIT.
+ ALN 0 /AND NOW SHIFT IT RIGHT.
+ FSTA SQRTEX-1 /AND SAVE IT OVER THE OLD EXPONENT.
+ FLDA SQRT1 /RECALL OLD PART
+ ALN 0 /FIX IT UP, NOW.
+ FSTA SQRT1 /AND STORE IT BACK FOR LATER USE
+/
+/ SQRTEX IS NOW 1/4 <X< 1
+/
+ FLDA SQRTEX+1 /RECALL NUMBER.
+ FSTA SQRT2 /SAVE IN A TEMP.
+/
+ FMUL SQRTS1,1 /MULTIPLY BY CORRECT CONSTANT.
+ FADD SQRTS2,1 /AND NOW ADD IN CORRECT CONSTANT.
+/
+/ NOTE: INITIAL APPROXIMATION DEPENDS ON WHETHER X IS 1/4<X<1/2 OR
+/ 1/2<X<1
+/
+ FSTA SQRT3 /SAVE IN A SECOND TEMP.
+ FLDA SQRT2 /RECALL INITIAL.
+ FDIV SQRT3 /CALCULATE X(0)/X(1)
+ FADD SQRT3 /X(1)+X(0)/X(1)
+ FDIV F2SQRT /1/2(X(1)+X(0)/X(1))
+ FSTA SQRT3 /SAVE AGAIN. NOW X(2)
+ FLDA SQRT2 /RECALL ORIGINAL.
+ FDIV SQRT3 /X(0)/X(2)
+ FADD SQRT3 /X(2)+X(0)/X(2)
+ FSTA SQRTEX+1 /NOW STORE AWAY FOR FINAL EXPONENT DIDDLING.
+/
+ STARTD
+/
+ FCLA /ZERO HIGH ORDER EXPONENT PART.
+ FSTA SQRTEX-1
+ FLDA SQRT1 /RECALL MODIFIED EXPONENT.
+ FADDM SQRTEX /UPDATE FRACTIONAL EXPONENT.
+/
+ STARTF /RETRUN TO FLOATING MODE.
+/
+ FLDA SQRTEX+1 /PICK UP THE ANSWER.
+ JA SQTRTN /AND RTN
+/
+SQRTSC, FSUB F1SQRT /SPECIAL CASE FUDGE.
+ FSTA SQRT1 /SET EXPONENT ADD ON TO -1.
+ FNEG /AND SET ODD BIT ON.
+ JA SQRTBK /AND GO BACK UP.
+\f