!Modified RRM 24/6/82 to remove functions which are common to
!ALGOL and IMP. These are now in a file with name AIROUTnnS, which must
!be used in conjuction with this. The functions moved are:
!S#ISIN,S#ICOS,S#ILOG,S#ISQRT,S#IEXP,S#ITAN
!***********************************************************************
!*    NOTE WELL                                                        *
!*    AFTER COMPILING THIS FILE THE FOLLOWING ALIASES MUST BE ADDED    *
!*    S#PRINT1900=ICL9CEPRINT1900 & S#READ1900=ICL9CEREAD1900          *
!***********************************************************************
!* 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)
SYSTEMROUTINESPEC  SSERR(INTEGER  I)
SYSTEMINTEGERFNSPEC  IOCP(INTEGER  A,B)
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  N)
SYSTEMROUTINESPEC  MLIBERR(INTEGER  N)
CONSTBYTEINTEGERARRAY  ITOETAB(0 : 255) =       C 
            X'00',X'01',X'02',X'03',   X'37',X'2D',X'2E',X'2F',
            X'16',X'05',X'25',X'0B',   X'0C',X'0D',X'0E',X'0F',
            X'10',X'11',X'12',X'13',   X'3C',X'3D',X'32',X'26',
            X'18',X'19',X'3F',X'27',   X'1C',X'1D',X'1E',X'1F',
            X'40',X'4F',X'7F',X'7B',   X'5B',X'6C',X'50',X'7D',
            X'4D',X'5D',X'5C',X'4E',   X'6B',X'60',X'4B',X'61',
            X'F0',X'F1',X'F2',X'F3',   X'F4',X'F5',X'F6',X'F7',
            X'F8',X'F9',X'7A',X'5E',   X'4C',X'7E',X'6E',X'6F',
            X'7C',X'C1',X'C2',X'C3',   X'C4',X'C5',X'C6',X'C7',
            X'C8',X'C9',X'D1',X'D2',   X'D3',X'D4',X'D5',X'D6',
            X'D7',X'D8',X'D9',X'E2',   X'E3',X'E4',X'E5',X'E6',
            X'E7',X'E8',X'E9',X'4A',   X'E0',X'5A',X'5F',X'6D',
            X'79',X'81',X'82',X'83',   X'84',X'85',X'86',X'87',
            X'88',X'89',X'91',X'92',   X'93',X'94',X'95',X'96',
            X'97',X'98',X'99',X'A2',   X'A3',X'A4',X'A5',X'A6',
            X'A7',X'A8',X'A9',X'C0',   X'6A',X'D0',X'A1',X'07',
            X'20',X'21',X'22',X'23',   X'24',X'15',X'06',X'17',
            X'28',X'29',X'2A',X'2B',   X'2C',X'09',X'0A',X'1B',
            X'30',X'31',X'1A',X'33',   X'34',X'35',X'36',X'08',
            X'38',X'39',X'3A',X'3B',   X'04',X'14',X'3E',X'E1',
            X'41',X'42',X'43',X'44',   X'45',X'46',X'47',X'48',
            X'49',X'51',X'52',X'53',   X'54',X'55',X'56',X'57',
            X'58',X'59',X'62',X'63',   X'64',X'65',X'66',X'67',
            X'68',X'69',X'70',X'71',   X'72',X'73',X'74',X'75',
            X'76',X'77',X'78',X'80',   X'8A',X'8B',X'8C',X'8D',
            X'8E',X'8F',X'90',X'9A',   X'9B',X'9C',X'9D',X'9E',
            X'9F',X'A0',X'AA',X'AB',   X'AC',X'AD',X'AE',X'AF',
            X'B0',X'B1',X'B2',X'B3',   X'B4',X'B5',X'B6',X'B7',
            X'B8',X'B9',X'BA',X'BB',   X'BC',X'BD',X'BE',X'BF',
            X'CA',X'CB',X'CC',X'CD',   X'CE',X'CF',X'DA',X'DB',
            X'DC',X'DD',X'DE',X'DF',   X'EA',X'EB',X'EC',X'ED',
            X'EE',X'EF',X'FA',X'FB',   X'FC',X'FD',X'FE',X'FF'
CONSTBYTEINTEGERARRAY  ETOITAB(0 : 255) =     0,
     1,     2,     3,   156,     9,   134,   127,   151,   141,   142,
    11,    12,    13,    14,    15,    16,    17,    18,    19,   157,
   133,     8,   135,    24,    25,   146,   143,    28,    29,    30,
    31,   128,   129,   130,   131,   132,    10,    23,    27,   136,
   137,   138,   139,   140,     5,     6,     7,   144,   145,    22,
   147,   148,   149,   150,     4,   152,   153,   154,   155,    20,
    21,   158,    26,    32,   160,   161,   162,   163,   164,   165,
   166,   167,   168,    91,    46,    60,    40,    43,    33,    38,
   169,   170,   171,   172,   173,   174,   175,   176,   177,    93,
    36,    42,    41,    59,    94,    45,    47,   178,   179,   180,
   181,   182,   183,   184,   185,   124,    44,    37,    95,    62,
    63,   186,   187,   188,   189,   190,   191,   192,   193,   194,
    96,    58,    35,    64,    39,    61,    34,   195,    97,    98,
    99,   100,   101,   102,   103,   104,   105,   196,   197,   198,
   199,   200,   201,   202,   106,   107,   108,   109,   110,   111,
   112,   113,   114,   203,   204,   205,   206,   207,   208,   209,
   126,   115,   116,   117,   118,   119,   120,   121,   122,   210,
   211,   212,   213,   214,   215,   216,   217,   218,   219,   220,
   221,   222,   223,   224,   225,   226,   227,   228,   229,   230,
   231,   123,    65,    66,    67,    68,    69,    70,    71,    72,
    73,   232,   233,   234,   235,   236,   237,   125,    74,    75,
    76,    77,    78,    79,    80,    81,    82,   238,   239,   240,
   241,   242,   243,    92,   159,    83,    84,    85,    86,    87,
    88,    89,    90,   244,   245,   246,   247,   248,   249,    48,
    49,    50,    51,    52,    53,    54,    55,    56,    57,   250,
   251,   252,   253,   254,   255;
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'
!*
ROUTINE  SELECTINPUT(INTEGER  CH)
INTEGER  I
      I=IOCP(21,CH)
END 
ROUTINE  SELECTOUTPUT(INTEGER  CH)
INTEGER  I
     I=IOCP(22,CH)
END 
SYSTEMLONGREALFN  AARCTAN(LONGREAL  X1)
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  
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, 10)
      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  
SYSTEMINTEGERFN  EANXTSY
      RESULT =ITOETAB(NEXT SYMBOL)
END 
SYSTEMROUTINE  APRSYM(INTEGER  SYM)
      PRINTSYMBOL(SYM)
END  
SYSTEMROUTINE  EAPRSYM(INTEGER  SYM)
      PRINTSYMBOL(ETOITAB(SYM&255))
END 
SYSTEMROUTINE  ARDSYM(INTEGERNAME  SYM)
INTEGER  S
      READSYMBOL(S)
      *LSS_S; *LD_SYM; *ST_(DR );
END  
SYSTEMROUTINE  EARDSYM(INTEGERNAME  SYM)
INTEGER  S
      READSYMBOL(S)
      S=ITOETAB(S)
      *LSS_S; *LD_SYM; *ST_(DR )
END 
SYSTEMROUTINE  ALGPTH
      NEWPAGE
END  
SYSTEMROUTINE  PRSTNG(STRINGNAME  S)
STRING  (255)P, Q
      P=S
      P=P." ".Q WHILE  P->P.("_").Q
      P=P."
".Q WHILE  P->P.("¬").Q
      PRINTSTRING(P)
END  
SYSTEMROUTINE  EPRSTNG(LONGINTEGER  EBSTRING)
INTEGER  I,J,L,AD
      L=EBSTRING>>32&X'FFFF'
      AD<-EBSTRING
      RETURN  IF  L=0
      CYCLE  I=0,1,L-1
         J=ETOITAB(BYTEINTEGER(AD+I))
         IF  J='_' THEN  J=' '
         IF  J='¬' THEN  J=NL
         PRINTCH(J)
      REPEAT 
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  = BYTEINTEGER(ADDR(S))
END  
SYSTEMINTEGERFN  ELENGTH(LONGINTEGER  EBSTRING)
INTEGER  I
      I=EBSTRING>>32&X'FFFF'
      RESULT =I
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  EINSYMBOL(INTEGER  CH,LONGINTEGER  EBSTRING, C 
         INTEGERNAME  CHAR)
INTEGER  I,L,ITEM,EITEM,AD
      IF  CH#COMREG(22) THEN  SELECT INPUT(CH)
      READ SYMBOL(ITEM)
      EITEM=ITOETAB(ITEM)
      L=EBSTRING>>32&X'FFFF'
      I=0; AD<-EBSTRING
      WHILE  I<L CYCLE 
         IF  EITEM=BYTEINTEGER(AD+I) THEN  CHAR=I+1 AND  RETURN 
         I=I+1
      REPEAT 
      IF  (' '<=ITEM<='Z' AND  ITEM#34) OR  ITEM=92 OR  ITEM=95 OR  C 
         ITEM=126 OR  ITEM=10 THEN  CHAR=-EITEM 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  
SYSTEMROUTINE  EOUTSYMBOL(INTEGER  CH,LONGINTEGER  EBSTRING, C 
      INTEGER  CHAR)
INTEGER  L,AD,J
      IF  CH#COMREG(23) THEN  SELECT OUTPUT(CH)
      L=EBSTRING>>32&X'FFFF'
      AD<-EBSTRING
      IF  1<=CHAR<=L THEN  J=BYTEINTEGER(AD+CHAR-1) ELSE  J=(-CHAR)&255
      PRINTSYMBOL(ETOITAB(J))
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  
SYSTEMINTEGERFN  EAICODE(LONGINTEGER  EBSTRING)
INTEGER  I,J,L,AD
      L=EBSTRING>>32&X'FFFF'
      AD<-EBSTRING
      I=BYTEINTEGER(AD)
      J=BYTEINTEGER(AD+1)
      IF  I=C'_' THEN  RESULT =C' '
      IF  I=C'¬' OR  (L=2 AND  I=C'E' AND  J=C'L') THEN  C 
         RESULT =ITOETAB(NL)
      IF  L=2 AND  I=J=C'S' THEN  RESULT =C'%'
      RESULT =I
END 
SYSTEMROUTINE  OUTSTRING(INTEGER  CH,STRINGNAME  S)
      IF  CH#COMREG(23) THEN  SELECT OUTPUT(CH)
      PRSTNG(S)
END  
SYSTEMROUTINE  EOUTSTRING(INTEGER  CH,LONGINTEGER  EBSTRING)
      IF  CH#COMREG(23) THEN  SELECT OUTPUT(CH)
      EPRSTNG(EBSTRING)
END 
SYSTEMROUTINE  WRITE TEXT(STRINGNAME  TEXT)
CONSTBYTEINTEGERARRAY  SUBSTRCH(0:127)=0(48),1(10),0(6),
                  0(3),2,0(12),3,4,0,5,0,6,0,0,7,8,0(6),
                  0(3),2,0(12),3,4,0,5,0,6,0,0,7,8,0(6);
CONSTSTRING (3)ARRAY  OCHAR(2:8)="
","","'('"," ","')'","{","}";
                                        ! C==NEWLINE (CODE=2)
                                        ! P==NEWPAGE (CODE=3)
                                        ! Q==OPENQUOTE '(' (CODE=4)
                                        ! S==SPACE (CODE=5)
                                        ! U==UNQUOTE ')' (CODE=6)
                                        ! X==OPENQUOTE { (CODE=7)
                                        ! Y==CLOSEQUOTE } (CODE=8)
INTEGER  I, R, SUCCESS, SYM, TRSYM
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)))
NEXT: 
      UNLESS  S->S1.(BR1).S2.(BR2).S3 THEN  ->FAIL 
      UNLESS  0<SA(0)<=7 THEN  ->ILLEGAL
      CYCLE  I=1,1,SA(0)
         SYM=SA(I); TRSYM=SUBSTRCH(SYM)
         ->ILLEGAL IF  TRSYM=0
      REPEAT 
      SUCCESS=1
      PRINTSTRING(S1)
      S=S3
      R=0
      CYCLE  I=1, 1, SA(0)
         SYM=SA(I); TRSYM=SUBSTRCH(SYM)
         IF  TRSYM=1 THEN  START 
            R=10*R+SYM-'0'
         FINISH  ELSE  START 
            QU=OCHAR(TRSYM)
            UNTIL  R<=0 CYCLE  
               R=R-1
               IF  QU="" THEN  NEWPAGE ELSE  PRINTSTRING(QU)
            REPEAT  
            R=0
         FINISH  
      REPEAT  
      ->NEXT
ILLEGAL:                                ! SUBSTRING HAS ILLEGAL CONTENTS
      PRINTSTRING(S1.BR1.S2.BR2)
      S=S3; SUCCESS=1; ->NEXT
FAIL:
      IF  SUCCESS=1 THEN  PRINTSTRING(S) ELSESTART  
         BR1="<"
         BR2=">"
         SUCCESS=1
         ->START
      FINISH  
END  

SYSTEMROUTINE  EWRITE TEXT(LONGINTEGER  EBSTRING)
INTEGER  L,AD,I,LL
STRING (255)S
      AD<-EBSTRING
      L=EBSTRING>>32&X'FFFF'
AGN:
      LL=L
      IF  LL>255 THEN  LL=255
      CYCLE  I=1,1,LL
         CHARNO(S,I)=ETOITAB(BYTEINTEGER(AD+I-1))
      REPEAT 
      CHARNO(S,0)=LL
      WRITE TEXT(S)
      L=L-LL
      AD=AD+LL
      ->AGN IF  L>0
END 
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
LONGREALFNSPEC  GET(INTEGER  LEVEL)
INTEGER  CURSYM
      RESULT =GET(1)
LONGREALFN  GET(INTEGER  LEVEL)
INTEGER  TYPE, IVALUE, FLAG
                                       ! FLAG= 0FOR'-',1 FOR '+'
LONGREAL  RWORK, SCALE
      FLAG=1;  TYPE=0
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='-' C 
              OR  CURSYM='.' OR  CURSYM='@' OR  CURSYM='&' C 
            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
      CURSYM=NEXT WHILE  CURSYM=' '
      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(GET(2));                   ! CALL TO FIND EXPONENT
         IF  IVALUE = -99 THEN  RWORK = 0 ELSE  C 
         RWORK=RWORK*10.0**IVALUE
         TYPE=1
      FINISH  
      IF  TYPE=0 THEN  ->START
RETEXP:
      IF  FLAG=0 THEN  RWORK=-RWORK
      RESULT  =RWORK
END 
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("'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  

SYSTEMROUTINE  ECOPY TEXT(LONGINTEGER  EBSTRING)
INTEGER  I,AD,L
STRING (255)S
      AD<-EBSTRING
      L=EBSTRING>>32&X'FFFF'
      L=255 IF  L>255
      CYCLE  I=1,1,L
         CHARNO(S,I)=ETOITAB(BYTEINTEGER(AD+I-1))
      REPEAT 
      CHARNO(S,0)=L
      COPY TEXT(S)
END 
SYSTEMINTEGERFN  ALRDCH
INTEGER  CH
      READCH(CH)
      RESULT  =CH
END  
SYSTEMINTEGERFN  ALNXCH
      RESULT  =IOCP(18, 0)
END  
SYSTEMROUTINE  ALPRCH(INTEGER  CH)
      PRINTCH(CH)
END  
SYSTEMROUTINE  ALSKCH
INTEGER  CH
      READCH(CH)
END  

SYSTEMINTEGERFN  EALRDCH
INTEGER  CH
      READCH(CH)
      RESULT =ITOETAB(CH)
END 
SYSTEMINTEGERFN  EALNXCH
      RESULT =ITOETAB(IOCP(18,0))
END 
SYSTEMROUTINE  EALPRCH(INTEGER  EBCH)
      PRINTCH(ETOITAB(EBCH))
END 
SYSTEMROUTINE  ALGMON
      MONITOR  
END  
SYSTEMROUTINE  CLOSE STREAM(INTEGER  STREAM)
INTEGER  I
   IF  STREAM > 98 OR  STREAM < 1 OR  COMREG(22) = STREAM C 
      OR  COMREG(23) = STREAM THEN  SSERR(29)
   I=IOCP(16,STREAM)
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 
!

SYSTEMROUTINE  EAFAULT(LONGINTEGER  EBSTRING,LONGREAL  VALUE)
      SELECT OUTPUT(107)
      PRINTSTRING("
ALGOL FAULT  ")
      EPRSTNG(EBSTRING)
      PRINTSTRING("
PARAMETER = ")
      PRINTFL(VALUE,15)
      NEWLINE
      MONITOR 
      STOP 
END 
ENDOFFILE