ASMB,L,R,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".SQRT" - TRIPLE PRECISION SQUARE ROOT. 
      NAM .SQRT,7 24998-1X128 REV.2001 780424 
* 
      ENT .SQRT 
      EXT .ENTR,.CFER,.PWR2,SQRT,.XADD,.XDIV,.TADD,.TDIV
* 
*     .SQRT TAKES THE TRIPLE-PRECISION SQUARE ROOT OF A 
*     TRIPLE-PRECISION ARGUMENT.
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .SQRT 
*                   DEF *+3 
*                   DEF <RESULT>
*                   DEF <ARG> 
*                   <ERROR RETURN>  (A,B) = ASCII "02UN"
*                   <NORMAL RETURN> 
* 
*     THE ERROR RETURN IS TAKEN IF THE ARGUMENT IS NEGATIVE.
* 
*     METHOD:  "SQRT" IS CALLED TO GIVE A 2-WORD APPROXIMATION.  SINCE
*     ONLY 15 BITS OF THE ARGUMENT TO SQRT ARE VALID (FIRST WORD), ONLY 
*     15 BITS OF THIS INITIAL APPROXIMATION ARE VALID.  HERON'S RULE IS 
*     APPLIED TWICE IN THE FORM:  X(N+1)=0.5*(X(N)+Y/X(N))  GIVING 31 
*     BITS AND (IF SUFFICIENT PRECISION WAS USED) 63 BITS.
      SPC 4 
*                   TEST Y=0, COPY Y, TAKE 15-BIT APPROX, CHECK Y<0 . 
* 
RESLT DEF *-* 
ARG   DEF *-* 
.SQRT NOP 
      JSB .ENTR     COPY ADDRESSES
      DEF RESLT 
      JSB .CFER     COPY ARG
      DEF Y 
      DEF ARG,I 
      LDA Y         TAKE 15-BIT APPROX. = X0
      SZA,RSS       ZERO ?
      JMP ZERO      YES.
      LDB Y+3 
      JSB SQRT
      JMP .SQRT,I   Y<0, ERROR. 
      SKP 
*                   TWO HERON'S RULES: FIRST IN 3-WORD, SECOND IN 4-WORD. 
* 
      STA X         EXTEND TO 3-WORD. 
      STA X+1       FOR CONSISTENT RESULTS, NOT ACCURACY. 
      STB X+2 
      LDA Y+2       REDUCE Y TO 3-WORD (TEMPORARILY)
      STA TEMP
      LDA Y+3 
      STA Y+2 
      JSB .XDIV     Y/X0
      DEF YDIVX 
      DEF Y 
      DEF X 
      JSB .XADD     2*X1 = X0+Y/X0
      DEF X 
      DEF X 
      DEF YDIVX 
      LDA X+2       EXTEND TO 4-WORD
      STA X+3 
      LDA TEMP      RESTORE Y TO 4-WORD 
      STA Y+2 
      JSB .TDIV     Y/(2*X1) = 0.5*(Y/X1) 
      DEF Y 
      DEF Y 
      DEF X 
      CCA           (FOR .PWR2) 
      LDB X+3       0.25*(2*X1) = 0.5*(X1)
      JSB .PWR2 
      DEF MTWO
      STB X+3 
      JSB .TADD     X2 = 0.5*(X1)+0.5*(Y/X1) = 0.5*(X1+Y/X1)
      DEF RESLT,I 
      DEF X 
      DEF Y 
SQRT1 ISZ .SQRT     NORMAL RETURN 
      JMP .SQRT,I 
* 
*                   ARG = 0, RESULT = 0 
* 
ZERO  JSB .CFER     JUST COPY ARG.
      DEF RESLT,I 
      DEF ARG,I 
      JMP SQRT1 
* 
*                   LOCALS & CONSTANTS. 
* 
Y     BSS 4         ARGUMENT
X     BSS 4         CURRENT APPROXIMATION 
YDIVX BSS 3         Y/X0, 3-WORD
TEMP  BSS 1         SCRATCH FOR SAVING Y+2
MTWO  DEC -2        SINCE "DEF" DOESN'T ALLOW LITERALS. 
      END 
