      TITLE F_DAT2
      MODULE F_DAT2
      EXPORTC F_DAT2,F_DATA
      IMPORTC F_ZSTE,F_HANDLER
      AREADEF PROG,[PIC,READ,SHARED,CODE],DOUBLE
      AREADEF DATA,[WRITE,DATA],DOUBLE
      DEFSB   DATA
      AREA    PROG
      DCS     'F_DAT2      '
F_DATA SPRD    FP,TOS
      LPRD    FP,12(SP)
      ABSL    =1.0,F4                 ;|X|=1
      MOVQW   1,R0                    ;sign of X
      BR      st
F_DAT2 SPRD    FP,TOS
      LPRD    FP,12(SP)
      ABSL    0(4(FP)),F4             ;|X|
      MOVW    6(4(FP)),R0             ;sign of X
st    ABSL    0(0(FP)),F2             ;|Y|
      MOVL    =0.0,F0                 ;origin at 0
      MOVL    =0.41421356237309501,F6 ;ROOT(2)-1 = ATAN(PI/8)
      MULL    F2,F6
      CMPL    F6,F4
      BLT     a1                      ;< 67.5 degrees
      CMPL    F2,F0
      BEQ     bad                     ;both args zero
      MOVL    =1.5707963267948966,F0  ;start from 90 deg.
      DIVL    F2,F4
      NEGL    F4,F2                   ;-|X/Y|
      BR      a2
a1    DIVL    F4,F2                   ;|Y/X|
      CMPL    =0.41421356237309501,F2 ;check at 22.5 degrees
      BGT     a2                      ;< 22.5
      MOVL    =0.78539816339744828,F0 ;start from 45 degrees
      MOVL    =1.0,F4
      MOVL    F4,F6
      ADDL    F2,F6
      SUBL    F4,F2
      DIVL    F6,F2          ;(Y-X)/(Y+X)
a2    MOVL    F2,F4          ;find atan(F2) <22.5 degr.
      MULL    F4,F4
      MOVL    =.15897402884823069,F6
      MULL    F4,F6
      ADDL    =6.6605790170092627,F6
      MULL    F4,F6
      ADDL    =40.969264832102255,F6
      MULL    F4,F6
      ADDL    =77.477687719204216,F6
      MULL    F4,F6
      ADDL    =44.541340059290686,F6
      MULL    F6,F2
      MOVL    F4,F6
      ADDL    =15.503977551421988,F6
      MULL    F4,F6
      ADDL    =62.835930511032378,F6
      MULL    F4,F6
      ADDL    =92.324801072300975,F6
      MULL    F4,F6
      ADDL    =44.541340059290686,F6
      DIVL    F6,F2
      ADDL    F2,F0
      CMPQW   0,R0
      BLE     a3
      SUBL    =3.1415926535897932,F0
      NEGL    F0,F0          ;correct for X<0
a3    CMPQW   0,6(0(FP))
      BLE     a4
      NEGL    F0,F0          ;correct for Y<0
a4    MOVL    F0,ans
      ADDR    ans,R0
      LPRD    FP,TOS
      RXP     4
bad   ADDR    mess,TOS
      CXP     F_ZSTE
      HANDLER
      CXP     F_HANDLER
txt   DCS     'arguments zero in DATAN2'
lgt   EQU     *
      AREA    DATA
ans   ALLOCD  2
mess  ADDRESS mm
mm    ADDRESS txt
      DCD     lgt-txt
      END
