!* MODIFIED 20/02/78 ERROR MESSAGE VALUES !* MODIFIED 8/11/77 READ1900 IGNORES MULTIPLE SP & NL AFTER EXP CHAR !* MODIFIED 18/02/77 SQ AND DA FILE ROUTINES ADDED !* 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) SYSTEMROUTINESPEC SSERR(INTEGER I) SYSTEMROUTINESPEC IOCP(INTEGER A,B) SYSTEMINTEGERMAPSPEC COMREG(INTEGER N) SYSTEMROUTINESPEC MLIBERR(INTEGER ERR) 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 N1=0 CONSTLONGREAL MDEFALLT=R'C0B504F333F9DE65' *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 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 SYSTEMLONGREALFN AARCTAN(LONGREAL X1) INTEGER DUMMY LONGREAL XX1, XSQ, CONSTANT INTEGER SIGN, INV ! CONSTANT=0 ! %IF X1<0 %THEN SIGN=1 %AND XX1=-X1 %ELSE SIGN=0 %AND XX1=X1 ! %IF XX1>R'4110000000000000' %C ! %THEN XX1=1.0/XX1 %AND INV=1 %ELSE INV=0 ! %IF XX1>TANPIBY12 %THEN XX1=(RT3M1*XX1-1.0+XX1)/(XX1+RT3) %AND %C ! CONSTANT=PIBY6 ! XSQ=XX1*XX1 ! XX1=XX1*(R1/(XSQ+S1+(R2/(XSQ+S2+(R3/(XSQ+S3+(R4/(XSQ+S4))))))) %C ! )+CONSTANT ! %IF INV=1 %THEN XX1=1.0-XX1+PIBY2M1 ! %IF SIGN=1 %THEN XX1=-XX1 ! %RESULT =XX1 *LSD_0; *ST_CONSTANT; *ST_SIGN *LB_1; *LSD_X1; *JAF_6,<POS> *STB_SIGN; *AND_X'7FFFFFFFFFFFFFFF' POS: *RCP_R'4110000000000000'; *JCC_12,<NOTGZ> *STB_INV; *RRDV_R'4110000000000000' NOTGZ: *RCP_TANPIBY12; *JCC_12,<NTP> *LD_PIBY6; *STD_CONSTANT; ! USE DR SO XX1 STAYS IN ACC *ST_XX1; *RMY_RT3M1; *RSB_1.0; *RAD_XX1 *SLSD_XX1; *RAD_RT3; *RRDV_TOS NTP: *ST_XX1; *RMY_XX1; *ST_XSQ *RAD_S4; *RRDV_R4; *RAD_S3; *RAD_XSQ *RRDV_R3; *RAD_S2; *RAD_XSQ *RRDV_R2; *RAD_S1; *RAD_XSQ *RRDV_R1; *RMY_XX1; *RAD_CONSTANT *LB_INV; *JAT_12,<INVZ>; *RRSB_1.0; *RAD_PIBY2M1 INVZ: *LB_SIGN; *JAT_12,<SIGNZ>; *RRSB_0 SIGNZ: *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) INTEGER DUMMY 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 OWNSTRING (2) ARRAY REP(1:15)="1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" SYSTEMROUTINE ININTEGER(INTEGER CH, INTEGERNAME VAL) LONGREAL X IF CH#COMREG(22) THEN SELECT INPUT(CH) READ(X) SKIP SYMBOL VAL=INT(X) END SYSTEMROUTINE INREAL(INTEGER CH, LONGREALNAME VAL) LONGREAL X IF CH#COMREG(22) THEN SELECT INPUT(CH) READ(X) SKIP SYMBOL VAL=X END SYSTEMROUTINE OUTINTEGER(INTEGER CH, VALUE) IF CH#COMREG(23) THEN SELECT OUTPUT(CH) WRITE(VALUE, 1) PRINTSTRING('; ') END SYSTEMROUTINE OUTREAL(INTEGER CH, LONGREAL VALUE) IF CH#COMREG(23) THEN SELECT OUTPUT(CH) PRINTFL(VALUE, 15) PRINTSTRING('; ') END SYSTEMROUTINE OUTTERMINATOR(INTEGER CH) IF CH#COMREG(23) THEN SELECT OUTPUT(CH) PRINTSTRING('; ') END SYSTEMLONGREALFN ABS(LONGREAL VALUE) RESULT =MOD(VALUE) END SYSTEMINTEGERFN IABS(INTEGER VALUE) RESULT =IMOD(VALUE) END SYSTEMINTEGERFN SIGN(LONGREAL VALUE) IF VALUE>0 THENRESULT =1 IF VALUE<0 THENRESULT =-1 RESULT =0 END SYSTEMLONGREALFN MAXREAL RESULT =GREATEST END SYSTEMLONGREALFN MINREAL RESULT =R'0010000000000000' END SYSTEMINTEGERFN MAXINT RESULT =X'7FFFFFFF' END SYSTEMLONGREALFN EPSILON RESULT =R'3410000000000000' END SYSTEMLONGREALFN ALREAD LONGREAL X READ(X) SKIP SYMBOL RESULT =X END SYSTEMINTEGERFN ANXTSY RESULT =NEXT SYMBOL END SYSTEMROUTINE APRSYM(INTEGER SYM) PRINTSYMBOL(SYM) END SYSTEMROUTINE ARDSYM(INTEGERNAME SYM) INTEGER S READSYMBOL(S) *LSS_S; *LD_SYM; *ST_(DR ); END SYSTEMROUTINE ALGPTH NEWPAGE END SYSTEMROUTINE PRSTNG(STRINGNAME S) STRING (255)P, Q P=S WHILE P->P.("_").Q THEN P=P." ".Q WHILE P->P.("¬").Q THEN P=P." ".Q PRINTSTRING(P) END SYSTEMROUTINE ASELIN(INTEGER CH) SELECT INPUT(CH) END SYSTEMROUTINE ASELOU(INTEGER CH) SELECT OUTPUT(CH) END SYSTEMROUTINE ALGNWL NEWLINE END SYSTEMROUTINE ALGSPC SPACE END SYSTEMROUTINE ALGNLS(INTEGER N) NEWLINES(N) END SYSTEMROUTINE ALGSPS(INTEGER N) SPACES(N) END SYSTEMINTEGERFN LENGTH(STRINGNAME S) RESULT = INTEGER(ADDR(S))>>24 END SYSTEMROUTINE INSYMBOL(INTEGER CH, STRINGNAME S, INTEGERNAME CHAR) STRING (1)ITEM STRING (65)S1, S2 INTEGER I IF CH#COMREG(22) THEN SELECT INPUT(CH) READ ITEM(ITEM) IF S->S1.(ITEM).S2 THEN CHAR=LENGTH(S1)+1 ANDRETURN I=CHARNO(ITEM, 1) IF (' '<=I<='Z' AND I#34) OR I=92 OR I=95 OR I=126 OR C I=10 THEN CHAR=-I ELSE CHAR=0 END SYSTEMROUTINE OUTSYMBOL(INTEGER CH, STRINGNAME S, INTEGER CHAR) IF CH#COMREG(23) THEN SELECT OUTPUT(CH) IF 1<=CHAR<=LENGTH(S) THEN PRINTSYMBOL(CHARNO(S, CHAR)) C ELSE PRINTSYMBOL(-CHAR) END SYSTEMINTEGERFN AICODE(STRINGNAME S) INTEGER I I=CHARNO(S, 1) IF I='_' THEN I=' ' IF I='¬' OR S='EL' THEN I=NL IF S='SS' THEN I='%' RESULT =I END SYSTEMROUTINE OUTSTRING(INTEGER CH, STRINGNAME S) IF CH#COMREG(23) THEN SELECT OUTPUT(CH) PRSTNG(S) END SYSTEMROUTINE WRITE TEXT(STRINGNAME TEXT) SYSTEMROUTINESPEC PRSTNG(STRINGNAME S) INTEGER I, R, SUCCESS BYTEINTEGERARRAY SA(0:255) STRING (255)S, S1, S3 STRING (3)QU STRINGNAME S2 STRING (1)BR1, BR2 BR1="<" BR2=">" SUCCESS=0 START: S=TEXT SA(0)=0 S2==STRING(ADDR(SA(0))) WHILE S->S1.("%").S3 THEN S=S1."_".S3; ! CHANGE '%' TO '_'(TEMP) NEXT: IF S->S1.(BR1).S2.(BR2).S3 START SUCCESS=1 PRSTNG(S1) S=S3 R=0 CYCLE I=1, 1, SA(0) IF SA(I)='S' START IF R=0 THEN SPACE ELSE SPACES(R) R=0 ->REP FINISH IF SA(I)='C' START IF R=0 THEN NEWLINE ELSE NEWLINES(R) R=0 ->REP FINISH IF SA(I)='Q' OR SA(I)='U' START IF SA(I)='Q' THEN QU='''(''' ELSE QU=''')''' IF R=0 THEN R=1 UNTIL R=0 CYCLE R=R-1 PRSTNG(QU) REPEAT ->REP FINISH IF SA(I)='P' THEN NEWPAGE AND ->REP R=R*10+(SA(I)-'0') REP: REPEAT ->NEXT FINISH IF SUCCESS=1 THEN PRSTNG(S) ELSESTART BR1=TOSTRING('['+32) BR2=TOSTRING(']'+32) SUCCESS=1 ->START FINISH END OWNINTEGER LEVEL=0 SYSTEMLONGREALFN READ1900 !************************************************************** !********* !* THIS ROUTINE IS THE 1900 IMPLICITLY SPECIFIED ROUTINE ! * !* ! * !* THE METHOD USED IS SIMPLE REPEATED MULTIPLICATION ! USING LONG * !* REAL VARIABLES. SOME ROUNDING ERRORS ARE INTRODUCED ! WHICH * !* COULD BE AVOIDED BY USING PACKED DECIMAL INSTNS WITH ! NECESSARY* !* SCALING. ! * !************************************************************** !********* INTEGERFNSPEC NEXT INTEGERFNSPEC CHECK EXP INTEGER TYPE, IVALUE, FLAG, CURSYM ! FLAG= 0FOR'-',1 FOR '+' LONGREAL RWORK, SCALE FLAG=1; TYPE=0 LEVEL=LEVEL+1 START:CURSYM=NEXT; ! CARE NOT TO READ TERMINATOR ! NOW IGNORE LEADING SPACES UNLESS LEVEL>1 START CYCLE EXITIF '0'<=CURSYM<='9' OR CURSYM='+' OR CURSYM='-' OR C CURSYM='.' OR CURSYM='@' OR CURSYM='&' OR CURSYM='''' CURSYM=NEXT REPEAT FINISH ELSE START CURSYM = NEXT WHILE CURSYM = NL OR CURSYM = ' ' FINISH ! RECORD INITIAL MINUS IF CURSYM='-' THEN FLAG=0 AND CURSYM='+' ! MOVE OVER SIGN ONCE IT HAS ! BEEN RECORDED IN FLAG IF CURSYM='+' THEN CURSYM=NEXT IF '0'<=CURSYM AND CURSYM<='9' THENSTART RWORK=CURSYM-'0'; ! KEEP TOTAL IN RWORK TYPE=1; ! VALID DIGIT CYCLE CURSYM=NEXT EXITUNLESS '0'<=CURSYM AND CURSYM<='9' RWORK=10*RWORK+(CURSYM-'0') ! CONTINUE EVALUATING REPEAT FINISHELSE RWORK=0 IF LEVEL>1 THEN ->RETEXP IF CURSYM='.' THENSTART SCALE=10 CYCLE CURSYM=NEXT EXITUNLESS '0'<=CURSYM AND CURSYM<='9' TYPE=1 RWORK=RWORK+(CURSYM-'0')/SCALE SCALE=10*SCALE REPEAT FINISH ! ! THE VALUE HAS NOW BEEN READ ! INTO RWORK. THERE MIGHT BE ! AN EXPONENT ! E.G. '1.7@ 10' IS VALID ! DATA FOR READ ! IF CHECKEXP#0 THENSTART IF TYPE=0 AND RWORK=0 THEN RWORK=1 IVALUE=INT(READ1900); ! CALL TO FIND EXPONENT IF IVALUE = -99 THEN RWORK = 0 ELSE C RWORK=RWORK*10**IVALUE TYPE=1 FINISH IF TYPE=0 THEN ->START RETEXP: IF FLAG=0 THEN RWORK=-RWORK LEVEL=LEVEL-1 RESULT =RWORK INTEGERFN NEXT INTEGER S READ SYMBOL(S) IF S=' ' THEN READ SYMBOL(S) RESULT =S END INTEGERFN CHECKEXP INTEGER S RESULT =1 IF CURSYM='@' OR CURSYM='&' OR CURSYM='E' RESULT =0 UNLESS CURSYM='''' AND NEXTSYMBOL='1' SKIP SYMBOL; READ SYMBOL(S) RESULT =0 UNLESS S='0' AND NEXT SYMBOL='''' SKIP SYMBOL RESULT =1 END END SYSTEMROUTINE PRINT1900(LONGREAL X, INTEGER M, N) PRINT(X, M, N); SPACES(2) END SYSTEMROUTINE OUTPUT(LONGREAL X) PRINT(X, 0, 10) PRINTSYMBOL(';') NEWLINE END SYSTEMINTEGERFN READ BOOLEAN BYTEINTEGERARRAY TORF(0:6) STRINGNAME S INTEGER I S==STRING(ADDR(TORF(0))) FINDQ: READSYMBOL(I) UNTIL I='''' FOUNDQ: CYCLE I=1, 1, 6 READSYMBOL(TORF(I)) ->OUT IF TORF(I)='''' REPEAT OUT: TORF(0)=I RESULT =-1 IF S='TRUE''' RESULT =0 IF S='FALSE''' IF TORF(I)='''' THEN ->FOUNDQ ELSE ->FINDQ END SYSTEMROUTINE WRITE BOOLEAN(INTEGER B) IF B#0 THEN PRINTSTRING('''TRUE'' ') ELSE PRINTSTRING('' C 'FALSE'' ') END SYSTEMROUTINE COPYTEXT(STRINGNAME TEXT) INTEGER I, J, K, L L=LENGTH(TEXT) BEGIN BYTEINTEGERARRAY T(1:L*2), T1(0:L) STRINGNAME S S==STRING(ADDR(T1(0))) S=TEXT CYCLE I=1, 2, L*2-1 T(I)=I+2 READSYMBOL(T(I+1)) REPEAT T(I)=1 I=1 J=1 NEXT: CYCLE K=1, 1, L IF T1(K)#T(I+1) THEN ->OUT I=T(I) REPEAT ->RET OUT: I=T(J) PRINTSYMBOL(T(J+1)) READSYMBOL(T(J+1)) J=I ->NEXT RET: END RETURN END SYSTEMINTEGERFN ALRDCH INTEGER CH READCH(CH) RESULT =CH END SYSTEMINTEGERFN ALNXCH SYSTEMINTEGERFNSPEC IOCP(INTEGER A, B) RESULT =IOCP(18, 0) END SYSTEMROUTINE ALPRCH(INTEGER CH) PRINTCH(CH) END SYSTEMROUTINE ALSKCH INTEGER CH READCH(CH) END SYSTEMROUTINE ALGMON MONITOR END SYSTEMROUTINE CLOSE STREAM(INTEGER STREAM) IF STREAM > 98 OR STREAM < 1 OR COMREG(22) = STREAM C OR COMREG(23) = STREAM THEN SSERR(29) IOCP(16,STREAM) END SYSTEMINTEGERFNSPEC FORTRANDF(INTEGER DSNUM, NUMBLOCKS, BLKSIZE, C ASVARD) SYSTEMINTEGERFNSPEC OUTREC(INTEGER LENGTH) SYSTEMINTEGERFNSPEC INREC SYSTEMINTEGERFNSPEC NEW FILE OP(INTEGER DSNUM, ACTION, TYPE, C INTEGERNAME AFD) RECORDFORMAT NRFDFMT(INTEGER LINK, DSNUM, BYTEINTEGER STATUS, C ACCESS ROUTE, VALID ACTION, CUR STATE, BYTEINTEGER MODE OF USE, C MODE, FILE ORG, DEV CLASS, BYTEINTEGER REC TYPE, FLAGS, LM, RM, C INTEGER ASVAR, AREC, RECSIZE, MINREC, MAXREC, MAXSIZE, ROUTECCY, C INTEGER C0, C1, C2, C3, TRANSFERS, DARECNUM, SPARE1, SPARE2, C STRING (31)IDEN) CONSTINTEGERARRAY BYTES(3:7)=1, 2, 4, 8, 16 ! ! !* ROUTINE MOVE(INTEGER LENGTH, FROM, TO) INTEGER I RETURNIF LENGTH <= 0 I = X'18000000'!LENGTH *LSS_FROM *LUH_I *LDTB_I *LDA_TO *MV_L =DR END ; !OF MOVE !* ROUTINE FILL(INTEGER LENGTH, FROM,FILLER) INTEGER I RETURNIF LENGTH <= 0 I = X'18000000'!LENGTH *LDTB_I *LDA_FROM *LB_FILLER *MVL_L =DR END !* SYSTEMROUTINE GETSQ(INTEGER CHAN, DESC1,DESC2,DESC3,DESC4) RECORDNAME SQFD(NRFDFMT) INTEGER START, SIZE, AFD, FLAG, LENGTH SSERR(164) UNLESS 1<=CHAN<=99; ! INVALID DATA SET NUMBER FLAG=NEW FILE OP(CHAN, 1, 2, AFD) ! OPEN FILE SSERR(FLAG) IF FLAG>0; ! INVALID OPERATION ON FILE SQFD==RECORD(AFD) SSERR(178) IF SQFD_STATUS<2 SIZE=(DESC1&X'38000000')>>27 START=DESC2 LENGTH = BYTES(SIZE) * (DESC1 & X'FFFFFF') IF LENGTH<=0 THEN SSERR(177); ! ADDRESS INSIDE OUT FLAG=INREC; ! READ RECORD INTO BUFFER IF FLAG>0 THEN SSERR(153); ! INPUT FILE ENDED IF SQFD_RECSIZE<LENGTH START MOVE(SQFD_RECSIZE, SQFD_AREC, START) FILL(LENGTH-SQFD_RECSIZE, START+SQFD_RECSIZE, 0) LENGTH=SQFD_RECSIZE FINISHELSE MOVE(LENGTH, SQFD_AREC, START) RETURN END ! ! SYSTEMROUTINE PUTSQ(INTEGER CHAN,DESC1,DESC2,DESC3,DESC4) RECORDNAME SQFD(NRFDFMT) INTEGER START, SIZE, AFD, FLAG, LENGTH SSERR(164) UNLESS 1<=CHAN<=99; ! INVALID DATA SET NUMBER FLAG=NEW FILE OP(CHAN, 2, 2, AFD) ! OPEN FILE SSERR(FLAG) UNLESS FLAG <= 0 SIZE=(DESC1&X'38000000')>>27 START=DESC2 LENGTH = BYTES(SIZE) * (DESC1 & X'FFFFFF') IF LENGTH<=0 THEN SSERR(177); ! ADDRESS INSIDE OUT SQFD==RECORD(AFD) UNLESS SQFD_MINREC<=LENGTH<=SQFD_MAXREC THEN SSERR(161) !INVALID RECORD SIZE MOVE(LENGTH, START, SQFD_AREC) FLAG=OUTREC(LENGTH); ! OUTPUT RECORD SSERR(FLAG) UNLESS FLAG<=0; ! INVALID OPERATION ON FILE RETURN END ! ! SYSTEMROUTINE GETDA(INTEGER CHAN, INTEGERNAME SECT, INTEGER C DESC1,DESC2, DESC3,DESC4) OWNINTEGER FSECT LONGINTEGER ADFSECT RECORDNAME DAFD(NRFDFMT) INTEGER START, FINISH, AFD, FLAG, SIZE, LEN SSERR(164) UNLESS 1<=CHAN<=99; ! INVALID FILE NUMBER FLAG=NEW FILE OP(CHAN, 1, 3, AFD) SSERR(FLAG) IF FLAG>0 DAFD==RECORD(AFD) SSERR(178) UNLESS DAFD_STATUS>=2 SIZE=(DESC1&X'38000000')>>27 START=DESC2 FINISH = BYTES(SIZE) * (DESC1 & X'FFFFFF') + START IF FINISH<=START THEN SSERR(177) FSECT=SECT ADFSECT = ADDR(FSECT) FLAG=FORTRANDF(CHAN, -1, DAFD_RECSIZE, ADDR(ADFSECT)) SSERR(FLAG) IF FLAG>0 LEN = DAFD_RECSIZE WHILE START<FINISH THENCYCLE IF START + LEN > FINISH THEN LEN = FINISH - START DAFD_DARECNUM = FSECT FLAG = INREC SSERR(FLAG) IF FLAG>0 MOVE (LEN , DAFD_AREC , START) START=START+LEN REPEAT SECT=FSECT END ! ! SYSTEMROUTINE PUTDA(INTEGER CHAN, INTEGERNAME SECT, INTEGER C DESC1,DESC2, DESC3,DESC4) OWNINTEGER FSECT LONGINTEGER ADFSECT RECORDNAME DAFD(NRFDFMT) INTEGER START, FINISH, AFD, FLAG, SIZE SSERR(164) UNLESS 1<=CHAN<=99; ! INVALID FILE NUMBER FLAG=NEW FILE OP(CHAN, 2, 3, AFD) SSERR(FLAG) IF FLAG>0 DAFD==RECORD(AFD) SSERR(178) UNLESS DAFD_STATUS>=2 SIZE=(DESC1&X'38000000')>>27 START=DESC2 FINISH = BYTES(SIZE) * (DESC1 & X'FFFFFF') + START IF FINISH<=START THEN SSERR(177) FSECT=SECT ADFSECT = ADDR(FSECT) FLAG=FORTRANDF(CHAN, -1, DAFD_RECSIZE, ADDR(ADFSECT)) SSERR(FLAG) IF FLAG>0 WHILE START<FINISH THENCYCLE DAFD_DARECNUM = FSECT MOVE (DAFD_RECSIZE , START , DAFD_AREC) FLAG = OUTREC (DAFD_RECSIZE) SSERR(FLAG) IF FLAG>0 START=START+DAFD_RECSIZE REPEAT SECT=FSECT END ! ! SYSTEMROUTINE RWNDSQ (INTEGER CHAN) INTEGER I , AFD SSERR(164) UNLESS 1 <= CHAN <= 99 ; ! INVALID DATA SET NUM I = NEWFILEOP (CHAN, 4, 0, AFD) IF I > 0 THEN SSERR(I) END ! ! SYSTEMROUTINE AFAULT(STRINGNAME MESSAGE,LONGREAL VALUE) !* !*THIS ENABLES AN ALGOL PROGRAM TO TERMINATE WITH A MESSAGE !* AND DIAGNOSIS AS PER ALGOL 60M REPORT !* SELECT OUTPUT(107) PRINTSTRING('ALGOL FAULT '.MESSAGE.' PARAMETER = ') PRINTFL(VALUE,15) NEWLINE MONITOR STOP END ! ! ENDOFFILE