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 * DEF * DEF * (A,B) = ASCII "15UN" * * * 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