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