!Modified RRM 24/6/82 so that this file now contains only functions
!which are common to ALGOL and IMP
!* MODIFIED 28.4.80 TO ALLOW FOR EBCDIC STRINGS
!* MODIFIED 10.3.80 TO REMOVE SQ AND DA  
!* MODIFIED 6.3.80 BY LCG WITH PDS'S  READ1900 AND WRITETEXT ROUTINES
!* MODIFIED 03/05/79 MLIBERR INSERTED
!* MODIFIED 16/04/79 LENGTH CHANGED
!* MODIFIED 17/01/79 NEW VERSION OF WRITETEXT
!* MODIFIED 20/02/78  ERROR MESSAGE VALUES
!* MODIFIED  8/11/77 READ1900 IGNORES MULTIPLE SP & NL AFTER EXP CHAR
!* MODIFIED 13/01/77 SET MARGINS
!* MODIFIED 03/12/76  NEW VERSIONS OF READ1900,WRITETEXT
!******** MODIFIED 02:07:76 15.15  LCG    (ALGLRTS,MATHFNS CONCATONATED
!                                         ,COMPLEX ROUTINES
!                                         & DUPLICATES FOR FORTRAN)
SYSTEMINTEGERFNSPEC  IOCP(INTEGER  A,B)
SYSTEMROUTINESPEC  MLIBERR(INTEGER  N)
CONSTLONGREAL  R1=R'41C98867F42983DF'
CONSTLONGREAL  R2=R'C2562FB2813C6014'
CONSTLONGREAL  R3=R'C1146D547FED8A3D'
CONSTLONGREAL  R4=R'C0157BD961F06C89'
CONSTLONGREAL  S1=R'421B189E39236635'
CONSTLONGREAL  S2=R'4168EE1BDE0C3700'
CONSTLONGREAL  S3=R'41224E7F3CBDFE41'
CONSTLONGREAL  S4=R'41144831DAFBF542'
CONSTLONGREAL  RT3=R'411BB67AE8584CAA'
CONSTLONGREAL  PIBY6=R'40860A91C16B9B2C'
CONSTLONGREAL  PIBY2M1=R'40921FB54442D184'
CONSTLONGREAL  RT3M1=R'40BB67AE8584CAA7'
CONSTLONGREAL  TANPIBY12=R'404498517A7B3559'
CONSTLONGREAL  PIBY4=R'40C90FDAA22168C2'
CONSTLONGREAL  A1=R'40C0000000000000'
CONSTLONGREAL  A2=R'3F90FDAA22168C23'
CONSTLONGREAL  DEFALLT=R'40B504F333F9DE65'
CONSTLONGREAL  MAX=R'4DC90FDAA22168C2'
CONSTLONGREAL  GREATEST=R'7FFFFFFFFFFFFFFF'
!*
SYSTEMLONGREALFN  ISIN(LONGREAL  INARG)
INTEGER  N, N1, N0
LONGREAL  ARG, DIV, REM, RES
LONGREAL  R1, R2, APPROX
CONSTLONGREAL  S0=0.785398163397448307
CONSTLONGREAL  S1=-0.0807455121882805396;!@-1
CONSTLONGREAL  S2=0.00249039457018884507;!@-2
CONSTLONGREAL  S3=-0.0000365762041589190506;!@-4
CONSTLONGREAL  S4=0.000000313361622553306939;!@-6
CONSTLONGREAL  S5=-0.00000000175715008354919024;!@-8
CONSTLONGREAL  S6=0.00000000000687736352204187372;!@-11
CONSTLONGREAL  C0=1.0
CONSTLONGREAL  C1=-0.308425137534042457
CONSTLONGREAL  C2=0.0158543442438154890;!@-1
CONSTLONGREAL  C3=-0.000325991886927199623;!@-3
CONSTLONGREAL  C4=0.00000359086044744883857;!@-5
CONSTLONGREAL  C5=-0.0000000246113662387505408;!@-7
CONSTLONGREAL  C6=0.000000000115006797403238400;!@-9
CONSTLONGREAL  C7=-0.000000000000386315826585600000;!@-12
CONSTLONGREAL  MDEFALLT=R'C0B504F333F9DE65'
      N1=0
         *LSD_INARG; *LB_4; *JAF_2,<NN>
         *STB_N1; *AND_X'7FFFFFFFFFFFFFFF'
NN:      *ST_ARG; *ICP_MAX; *JCC_4,<CALC>
         MLIBERR(54);   ! ERROR(1, 2, 1, 0, 1, 0)
         IF  N1=4 THEN  RESULT =MDEFALLT ELSE  RESULT =DEFALLT
CALC:
!         DIV=ARG/PIBY4
!         N=INTPT(DIV)
!         REM=(ARG-N*A1-N*A2)/PIBY4
!      N0=(N+N1)&7
!      %IF N0&1=0 %THEN R1=REM %ELSE R1=1.0-REM
!      R2=R1*R1
!      %IF N0=0 %OR N0=3 %OR N0=4 %OR N0=7 %THEN APPROX=((((( %C
!        (S6*R2+S5)*R2+S4)*R2+S3)*R2+S2)*R2+S1)*R2+S0)*R1 %ELSE %C
!        APPROX=((((((C7*R2+C6)*R2+C5)*R2+C4)*R2+C3)*R2+C2)*R2+C1)*R2+C0
!      %IF N0>3 %THENRESULT =-APPROX %ELSERESULT =APPROX
         *RDV_PIBY4; *FIX_B ; *MYB_4
         *CPB_-64; *JCC_10,<NTS>; *LB_-64
NTS:     *ISH_B ; *STUH_B ; *ST_N
         *FLT_0; *SLSD_A1; *RAD_A2; *RMY_TOS ; *RRSB_ARG; *RDV_PIBY4
         *ST_REM; *LSS_N; *IAD_N1; *AND_7; *ST_B 
         *AND_1; *JAF_4,<EL>; *LSD_REM; *J_<BTH>
EL:      *LSD_1.0; *RSB_REM
BTH:     *ST_R1; *RMY_R1; *ST_R2; *JAT_12,<SWAY>
         *CPB_3; *JCC_8,<SWAY>; *CPB_4; *JCC_8,<SWAY>
         *CPB_7; *JCC_7,<CWAY>
SWAY:    *RMY_S6; *RAD_S5; *RMY_R2; *RAD_S4
         *RMY_R2; *RAD_S3; *RMY_R2; *RAD_S2
         *RMY_R2; *RAD_S1; *RMY_R2; *RAD_S0
         *RMY_R1; *J_<BWAY>
CWAY:    *RMY_C7; *RAD_C6; *RMY_R2; *RAD_C5
         *RMY_R2; *RAD_C4; *RMY_R2; *RAD_C3
         *RMY_R2; *RAD_C2; *RMY_R2; *RAD_C1
         *RMY_R2; *RAD_C0
BWAY:    *CPB_3; *JCC_2,<NRG>; *EXIT_-64
NRG:     *RRSB_0; *EXIT_-64
END  
SYSTEMLONGREALFN  ICOS(LONGREAL  INARG)
INTEGER  N
LONGREAL  R1, R2, APPROX
LONGREAL  ARG, DIV, REM, RES
INTEGER  N0
CONSTLONGREAL  S0=0.785398163397448307
CONSTLONGREAL  S1=-0.0807455121882805396;!@-1
CONSTLONGREAL  S2=0.00249039457018884507;!@-2
CONSTLONGREAL  S3=-0.0000365762041589190506;!@-4
CONSTLONGREAL  S4=0.000000313361622553306939;!@-6
CONSTLONGREAL  S5=-0.00000000175715008354919024;!@-8
CONSTLONGREAL  S6=0.00000000000687736352204187372;!@-11
CONSTLONGREAL  C0=1.0
CONSTLONGREAL  C1=-0.308425137534042457
CONSTLONGREAL  C2=0.0158543442438154890;!@-1
CONSTLONGREAL  C3=-0.000325991886927199623;!@-3
CONSTLONGREAL  C4=0.00000359086044744883857;!@-5
CONSTLONGREAL  C5=-0.0000000246113662387505408;!@-7
CONSTLONGREAL  C6=0.000000000115006797403238400;!@-9
CONSTLONGREAL  C7=-0.000000000000386315826585600000;!@-12
      *LSD_INARG; *AND_X'7FFFFFFFFFFFFFFF'
      *ST_ARG; *ICP_MAX; *JCC_4,<CALC>
      MLIBERR(55);                      ! ERROR(1, 5, 1, 0, 1, 0)
      RESULT =DEFALLT
CALC:
!      DIV=ARG/PIBY4
!      N=INTPT(DIV)
!      REM=(ARG-N*A1-N*A2)/PIBY4
!      N0=(N+2)&7
!      %IF N0&1=0 %THEN R1=REM %ELSE R1=1.0-REM
!      R2=R1*R1
!      %IF N0=0 %OR N0=3 %OR N0=4 %OR N0=7 %THEN APPROX=((((( %C
!        (S6*R2+S5)*R2+S4)*R2+S3)*R2+S2)*R2+S1)*R2+S0)*R1 %ELSE %C
!        APPROX=((((((C7*R2+C6)*R2+C5)*R2+C4)*R2+C3)*R2+C2)*R2+C1)*R2+C0
!      %IF N0>3 %THENRESULT =-APPROX %ELSERESULT =APPROX
         *RDV_PIBY4; *FIX_B ; *MYB_4
         *CPB_-64; *JCC_10,<NTS>; *LB_-64
NTS:     *ISH_B ; *STUH_B ; *ST_N
         *FLT_0; *SLSD_A1; *RAD_A2; *RMY_TOS ; *RRSB_ARG; *RDV_PIBY4
         *ST_REM; *LSS_N; *IAD_2; *AND_7; *ST_B 
         *AND_1; *JAF_4,<EL>; *LSD_REM; *J_<BTH>
EL:      *LSD_1.0; *RSB_REM
BTH:     *ST_R1; *RMY_R1; *ST_R2; *JAT_12,<SWAY>
         *CPB_3; *JCC_8,<SWAY>; *CPB_4; *JCC_8,<SWAY>
         *CPB_7; *JCC_7,<CWAY>
SWAY:    *RMY_S6; *RAD_S5; *RMY_R2; *RAD_S4
         *RMY_R2; *RAD_S3; *RMY_R2; *RAD_S2
         *RMY_R2; *RAD_S1; *RMY_R2; *RAD_S0
         *RMY_R1; *J_<BWAY>
CWAY:    *RMY_C7; *RAD_C6; *RMY_R2; *RAD_C5
         *RMY_R2; *RAD_C4; *RMY_R2; *RAD_C3
         *RMY_R2; *RAD_C2; *RMY_R2; *RAD_C1
         *RMY_R2; *RAD_C0
BWAY:    *CPB_3; *JCC_2,<NRG>; *EXIT_-64
NRG:     *RRSB_0; *EXIT_-64
END  
SYSTEMLONGREALFN  ILOG(LONGREAL  IN)
INTEGER  P, Q, SHORTF
LONGREAL  PRESULT, INARG2
CONSTLONGREAL  MIN=R'FFFFFFFFFFFFFFFF'
CONSTLONGREAL  SQRTHALF=R'40B504F333F9DE65'
CONSTLONGREAL  A1=0.594603557501360533
CONSTLONGREAL  A2=0.840896415253714543
CONSTLONGREAL  B1=R'40C0000000000000'
CONSTLONGREAL  B2=R'4040000000000000'
CONSTLONGREAL  LOGE2=R'40B17217F7D1CF7A'
CONSTLONGREAL  R0=-0.184416657749370267@2
CONSTLONGREAL  R1=-0.234508372303045254@2
CONSTLONGREAL  R2=-0.244294581969260792
CONSTLONGREAL  S0=-0.157942837832759265@2
CONSTLONGREAL  S1=-0.374252034640387355@1
CONSTLONGREAL  S2=-0.139586882716355509@1
      IF  IN<=0 START 
         IF  IN<0 START 
            MLIBERR(51);                ! ERROR(1, PROCNO, 1, 0, 1, 0)
            IN=-IN
         FINISHELSESTART  
            MLIBERR(52);                ! ERROR(1, PROCNO, 2, 0, 1, 0)
            RESULT =MIN
         FINISH  
      FINISH 
!      P=BYTEINTEGER(ADDR(IN))-64
!      BYTEINTEGER(ADDR(IN))=0
!      SHORTF=INTEGER(ADDR(IN))
!      %IF SHORTF>=X'00400000' %START 
!         %IF SHORTF>=X'00800000' %THEN Q=0 %ELSE Q=1
!      %FINISHELSESTART 
!         %IF SHORTF>=X'00200000' %THEN Q=2 %ELSE Q=3
!      %FINISH 
         *LSS_IN; *LUH_0
         *USH_8; *ISB_X'4000000000'
         *STUH_P; *USH_-8; *ST_IN
         *USH_-21; *USH_2; *IRSB_0; *SLSS_X'00001123'
         *USH_TOS ; *AND_15; *ST_Q
!      INTEGER(ADDR(IN))=(INTEGER(ADDR(IN))<<Q)!(INTEGER(ADDR(IN)+4 %C
        )>>(32-Q))
!      INTEGER(ADDR(IN)+4)=INTEGER(ADDR(IN)+4)<<Q
!      BYTEINTEGER(ADDR(IN))=X'40'
         *LSD_IN; *USH_Q
         *OR_X'4000000000000000'
         *ST_IN
      IF  IN>0 AND  IN<SQRTHALF START  
         IN=(IN-A1)/(IN+A1)
         PRESULT=((4*P-Q)-B1)*LOGE2
      FINISHELSESTART  
         IN=(IN-A2)/(IN+A2)
         PRESULT=((4*P-Q)-B2)*LOGE2
      FINISH  
      INARG2=IN*IN
      RESULT =R0/(INARG2+S0+(R1/(INARG2+S1+(R2/(INARG2+S2)))) C 
        )*IN+PRESULT
END  
SYSTEMLONGREALFN  ISQRT(LONGREAL  ARG)
CONSTINTEGERARRAY  A(0:7)=C 
               X'2112E2AC',X'20D5AA18',X'20971564',X'206AD50C',
               X'204B8AB2',X'20356A86',X'2025C559',X'201AB543'
LONGREAL  X,Z
      *LSD_ARG
      *ASF_4
      *ST_X
      *JAF_5,<NOTPOS>
MAINPATH:*LSS_X
      *USH_-1
      *ROT_8
      *ST_B 
      *USH_1
      *SHZ_TOS 
      *USH_-12
      *ST_TOS 
      *UAD_X'410B504F'
      *RRDV_X'C1207B4E'
      *LD_A
      *JAT_14,<EXPODD>
      *INCA_16
EXPODD:*RAD_X'41393FED'
      *UAD_TOS 
      *RMYD_(DR +TOS )
      *RSC_B 
      *ST_Z
      *RRDV_X
      *RAD_Z
      *RMY_X'4080000000000000'
      *ST_Z
      
      *RRDV_X
      *RSB_Z
      *RMY_X'4080000000000000'
      *RAD_Z
DONE: *EXIT_-64
NOTPOS:*JAT_4,<DONE>
      MLIBERR(50)
      ARG=-ARG
      -> MAINPATH
END 
SYSTEMLONGREALFN  IEXP(LONGREAL  INARG)
LONGREAL  W
LONGREAL  Y,FY
CONSTLONGREAL  LOG2E=R'41171547652B82FE'
INTEGER  B, YINT, P, NEGQ
CONSTLONGREAL  UE=R'C2B437DF00000000'
CONSTLONGREAL  E=R'42AEAC4D00000000'
CONSTLONGREAL  RMAX=R'7FFFFFFFFFFFFFFF'
CONSTLONGREAL  C0=0.999999999999999993
CONSTLONGREAL  C1=-0.693147180559934648
CONSTLONGREAL  C2=0.240226506956369776
CONSTLONGREAL  C3=-0.0555041084024485261;!@-1
CONSTLONGREAL  C4=0.00961811709948153328;!@-2
CONSTLONGREAL  C5=-0.00133307347698115810;!@-2
CONSTLONGREAL  C6=0.000150737171272758723;!@-3
CONSTLONGREALARRAY  EXP2(0:15)=1.0, 
      0.957603280698573647, 
      0.917004043204671232, 
      0.878126080186649742, 
      0.840896415253714543, 
      0.805245165974627154, 
      0.771105412703970412, 
      0.738413072969749656, 
      0.707106781186547524, 
      0.677127773468446364, 
      0.648419777325504833, 
      0.620928906036742024, 
      0.594603557501360533, 
      0.569394317378345827, 
      0.545253866332628830, 
      0.522136891213706920
         IF  INARG<=UE THEN  RESULT =0
         IF  INARG>=E THEN  MLIBERR(53) AND  RESULT =RMAX;! ERROR(1,98,1,0,1,0)
!         Y=INARG*R'41171547652B82FE001777D0FFDA0D24'
!         %IF INARG>0 %START 
!            YINT=INTPT(Y)+1
!            Y=YINT-Y
!            %UNLESS Y<1.0 %START 
!               YINT=YINT-1
!               Y=0
!            %FINISH 
!            %IF YINT&3=0 %THEN P=YINT>>2 %AND NEGQ=0 %ELSE %C
!              P=YINT>>2+1 %AND NEGQ=-(P<<2)+YINT
!         %FINISHELSESTART 
!            %IF INARG<0 %THEN YINT=-INTPT(-Y) %ELSE YINT=INTPT(Y)
!            Y=YINT-Y
!            B=-YINT
!            P=-(B>>2)
!            %IF B&3=0 %THEN NEGQ=0 %ELSE NEGQ=(-P<<2)-B
!         %FINISH 
         *LSD_INARG; *RMY_LOG2E; *ST_Y
         *RAD_R'4F00000000000000'; *ST_FY
         *FIX_B ; *MYB_4; *ISH_B ; *STUH_B ; *ST_B 
         *LSD_INARG; *JAF_1,<ZORNEG>
         *ADB_1; *STB_YINT; *LSS_B 
         *FLT_0; *RSB_Y; *ST_Y
         *RCP_1.0; *JCC_4,<L1>
         *LSS_YINT; *ISB_1; *ST_YINT; *LSD_0; *ST_Y
L1:      *LSS_YINT; *AND_3; *JAF_4,<L2>
         *ST_NEGQ; *LSS_YINT; *USH_-2; *ST_P
         *J_<BOTH>
L2:      *LSS_YINT; *USH_-2; *IAD_1; *ST_P
         *USH_2; *IRSB_YINT; *ST_NEGQ; *J_<BOTH>
ZORNEG:  *STB_YINT; *LSD_FY; 
         *RSB_Y; *ST_Y
         *LSS_YINT; *IRSB_0; *ST_B
         *USH_-2; *IRSB_0; *ST_P
         *LSS_B; *AND_3; *JAT_4,<L3>
         *LSS_P; *USH_2; *IRSB_0; *ISB_B
L3:      *ST_NEGQ
BOTH:
!         W=Y
!         %IF W<R'4010000000000000' %THEN B=0 %ELSESTART 
!            LONGINTEGER(ADDR(W))=LONGINTEGER(ADDR(W))<<4
!            B=INTEGER(ADDR(W))>>24
!            BYTEINTEGER(ADDR(W))=X'3F'
!            INTEGER(ADDR(W)+4)=INTEGER(ADDR(W)+4) %C
!               !(INTEGER(ADDR(Y)+8)>>20)&15
!         %FINISH 
         *LSD_Y; *ST_W; *LB_0
         *RCP_R'4010000000000000'; *JCC_4,<EVAL>
         *USH_4;
         *OR_8; *ST_W; *USH_-24; *STUH_B 
         *LUH_X'3F'; *USH_24; *STUH_W
EVAL:
!         W=((((((C6*W+C5)*W+C4)*W+C3)*W+C2)*W+C1)*W+C0)*EXP2(B)
         *LSD_C6; *RMY_W; *RAD_C5; *RMY_W
         *RAD_C4; *RMY_W; *RAD_C3; *RMY_W
         *RAD_C2; *RMY_W; *RAD_C1; *RMY_W
         *RAD_C0; *RMY_(EXP2+B ); *ST_W
!         %IF BYTEINTEGER(ADDR(W))=X'41' %START 
!            %IF NEGQ#0 %THEN NEGQ=NEGQ+4 %ELSE P=P+1 %AND ->NOSHIFT
!         %FINISH 
!         LONGINTEGER(ADDR(W))=LONGINTEGER(ADDR(W))<<NEGQ
         *LSS_W; *USH_-24; *ICP_X'41'; *JCC_7,<SHIFT>
         *LB_NEGQ; *JAT_12,<NEGZ>
         *ADB_4; *STB_NEGQ; *J_<SHIFT>
NEGZ:    *LB_P; *ADB_1; *LSD_W; *J_<NOSHIFT>
SHIFT:   *LSD_W; *USH_NEGQ; *LB_P
NOSHIFT:
!         BYTEINTEGER(ADDR(W))=P+64
!         %RESULT =W
         *ADB_64
         *AND_X'00FFFFFFFFFFFFFF'; *RSC_B 
         *EXIT_-64
END  
SYSTEMLONGREALFN  ITAN(LONGREAL  ARG)
CONSTLONGREAL  P0=0.108886004372816875@8
CONSTLONGREAL  P1=-0.895888440067680411@6
CONSTLONGREAL  P2=0.141898542527617784@5
CONSTLONGREAL  P3=-0.456493194386656319@2
CONSTLONGREAL  Q0=0.138637966635676292@8
CONSTLONGREAL  Q1=-0.399130951803516515@7
CONSTLONGREAL  Q2=0.135382712805119094@6
CONSTLONGREAL  Q3=-0.101465619025288534@4
CONSTLONGREAL  LEASTDIV=R'0210000000000000'
INTEGER  SIGN, Q, QM
LONGREAL  DIV, REM, RES, W2
      SIGN=0
      IF  ARG<0 THEN  SIGN=1 AND  ARG=-ARG
      IF  ARG>MAX START  
         MLIBERR(56);                  ! ERROR(1, 14, 1, 0, 1, 0)
         RES=1
      FINISHELSESTART  
         DIV=ARG/PIBY4
         Q=INTPT(DIV)
         REM=(ARG-Q*A1-Q*A2)/PIBY4
      IF  Q&1#0 THEN  REM=1.0-REM
      W2=REM*REM
      RES=(((P3*W2+P2)*W2+P1)*W2+P0)/((((W2+Q3)*W2+Q2)*W2+Q1)*W2+Q0)*REM
      QM=Q&3
      IF  QM=1 OR  QM=2 START  
         IF  RES<=LEASTDIV START  
                                       ! ERROR(1, 14, 2, 0, 1, 0)
            RES=GREATEST
         FINISHELSE  RES=1.0/RES
      FINISH  
     IF  QM>1 START 
        IF  SIGN=0 THEN  RES=-RES
     FINISHELSESTART 
        IF  SIGN=1 THEN  RES=-RES
     FINISH 
      FINISH  
      RESULT  =RES
END  
ENDOFFILE