ASMB,L,F,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 ".ATA2" - TRIPLE PRECISION INVERSE TANGENT OF TWO ARGUMENTS.
      NAM .ATA2,7 24998-1X118 REV.2001 780424 
* 
      ENT .ATA2,.ATN2 
      EXT .ATAN,.TADD,.TSUB,.TDIV,.ENTR,.4ZRO,.CFER 
* 
*     .ATA2(Y,X) TAKES THE TRIPLE-PRECISION INVERSE TRIGONOMETRIC 
*     TANGENT OF TWO ARGUMENTS, I.E. ATAN(Y/X) PROPERLY ADJUSTED SO THAT
*     THE RESULT ANGLE LIES IN THE PROPER QUADRANT.  IF X OR Y IS ZERO, 
*     THE RESULT IS 0,PI/2, -PI/2 OR PI, AS IS APPROPRIATE.  IN OTHER 
*     WORDS, .ATA2 COMPUTES THE ANGLE PART OF A CARTESIAN TO POLAR
*     CONVERSION. 
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .ATA2 
*                   DEF *+4 
*                   DEF <RESULT>
*                   DEF <Y> 
*                   DEF <X> 
*                   <ERROR RETURN> (A,B) = ASCII "15UN" 
*                   <NORMAL RETURN> 
* 
*     THE ERROR RETURN IS TAKEN IF X=Y=0. 
* 
*     METHOD:  THE DIVISION Y/X IS DONE.  IF IT OVERFLOWS, THE RESULT IS
*     SIGN(PI/2,Y) .  IF NOT, THE RESULT IS ATAN(Y/X) IF X>0 ELSE 
*     ATAN(Y/X)+SIGN(PI,Y) .
      SPC 3 
*                   COPY ADDRESSES, FORM Y/X, CHECK FOR OVERFLOW. 
* 
RESLT DEF *-* 
Y     DEF *-* 
X     DEF *-* 
.ATA2 NOP 
.ATN2 EQU .ATA2 
      JSB .ENTR     COPY ADDRESSES
      DEF RESLT 
      JSB .TDIV     Z _ Y/X 
      DEF Z 
      DEF Y,I 
      DEF X,I 
      SOC           OVERFLOW ?
      JMP OFL       YES.
      SKP 
*                   NO OVERFLOW, USE .ATAN .
* 
      LDA X,I       X>0 ? 
      SSA 
      JMP ATA2A     NO. 
      JSB .ATAN     YES, RESULT = .ATAN(Z)
      DEF *+3 
      DEF RESLT,I 
      DEF Z 
      JMP EXIT      EXIT
ATA2A LDA Z         FIRST WORD Y/X
      SZA,RSS       Y/X UNDERFLOW OR Y=0 ?
      JMP ATA2C     (A=0) SKIP ATAN: IS ZERO ANYWAY.
      JSB .ATAN     ATAN(Z) 
      DEF *+3 
      DEF Z 
      DEF Z 
      LDA X,I       SGN(X)
ATA2C XOR Z         SGN(Y)
      SSA           Y>0 ? 
      JMP ATA2D     NO. 
      JSB .TADD     YES, RESULT = ATAN(Z) + PI
      DEF RESLT,I 
      DEF Z 
      DEF PI
      JMP EXIT
ATA2D JSB .TSUB     Y<0, RESULT = ATAN(Z) - PI
      DEF RESLT,I 
      DEF Z 
      DEF PI
EXIT  ISZ .ATA2     SKIP ERROR RETURN.
      JMP .ATA2,I 
* 
*                   Y/X OVERFLOWS. RESULT = -PI/2, +PI/2 OR ERROR.
* 
OFL   LDA X,I       X=Y=0 ? 
      IOR Z 
      SZA,RSS 
      JMP ERROR     YES.
      LDA Z         NO, RESULT = SIGN(PI/2,Y) 
      SSA           Y>0 ? 
      JMP OFL1      NO, -PI/2 
      JSB .CFER     YES, +PI/2
      DEF RESLT,I 
      DEF PI2 
      JMP EXIT
OFL1  JSB .TSUB     NO, -PI/2 
      DEF RESLT,I 
      DEF .4ZRO+0 
      DEF PI2 
      JMP EXIT
      SKP 
*                   ERROR PROCESSING. 
* 
ERROR LDA =A15      (A,B) _ ASCII "15UN"
      LDB =AUN
      JMP .ATA2,I   TAKE ERROR EXIT.
* 
*                   LOCALS & CONSTANTS. 
* 
Z     BSS 4         Y/X 
PI    OCT 062207,166521,010264,060404 
PI2   OCT 062207,166521,010264,060402 
* 
      END 
                                                                                                                                                                                                