      TITLE F_EXP
      MODULE F_EXP
      EXPORTC F_EXP
      IMPORTC F_ZSTE,F_HANDLER
      AREADEF PROG,[PIC,READ,SHARED,CODE],DOUBLE
      AREADEF DATA,[WRITE,DATA],DOUBLE
      DEFSB   DATA
      AREA    PROG
      DCS     'F_EXP       '
F_EXP
      SPRD   FP,TOS
      LPRD   FP,12(SP)
      MOVF   0(0(FP)),F0
      MULF   =1.442695,F0   ;/Log2
      CMPF   =-126.0,F0
      BGT    zero           ;arg too small
      CMPF   =128.0,F0
      BLE    inf            ;arg too big
      ROUNDFD F0,R0
      MOVDF  R0,F1
      SUBF   F1,F0
      MOVF   F0,F1
      MULF   F1,F1
      MOVF   =0.05768867,F2
      MULF   F1,F2
      ADDF   =7.21532455,F2
      MULF   F2,F0           ;A*X
      ADDF   =20.81902595,F1 ;B
      MOVF   F0,F2
      ADDF   F1,F0           ;B+AX
      SUBF   F2,F1           ;B-AX
      DIVF   F1,F0
      MOVF   F0,ans
      ASHW   =7,R0
      ADDW   R0,ans+2
fin   ADDR   ans,R0
      LPRD   FP,TOS
      RXP    4
zero  MOVQD  0,ans
      BR     fin
inf   ADDR    mess,TOS
      CXP     F_ZSTE
      HANDLER
      CXP     F_HANDLER
txt   DCS     'argument too big in EXP'
lgt   EQU     *
      AREA    DATA
ans   ALLOCD  1
mess  ADDRESS mm
mm    ADDRESS txt
      DCD     lgt-txt
      END
