C*********************************************************************** C C 8 0 8 0 P L / M C O M P I L E R , P A S S - 1 C PLM81 C VERSION 2.0 C JANUARY, 1975 C C COPYRIGHT (C) 1975 C INTEL CORPORATION C 3065 BOWERS AVENUE C SANTA CLARA, CALIFORNIA 95051 C C MODIFIED BY JEFF OGDEN (UM), DECEMBER 1977 C C*********************************************************************** C C C C P A S S - 1 E R R O R M E S S A G E S C C ERROR MESSAGE C NUMBER C ------ ------------------------------------------------------------- C 1 THE SYMBOLS PRINTED BELOW HAVE BEEN USED IN THE CURRENT BLOCK C BUT DO NOT APPEAR IN A DECLARE STATEMENT, OR LABEL APPEARS IN C A GO TO STATEMENT BUT DOES NOT APPEAR IN THE BLOCK. C C 2 PASS-1 COMPILER SYMBOL TABLE OVERFLOW. TOO MANY SYMBOLS IN C THE SOURCE PROGRAM. EITHER REDUCE THE NUMBER OF VARIABLES IN C THE PROGRAM, OR RE-COMPILE PASS-1 WITH A LARGER SYMBOL TABLE. C C 3 INVALID PL/M STATEMENT. THE PAIR OF SYMBOLS PRINTED BELOW C CANNOT APPEAR TOGETHER IN A VALID PL/M STATEMENT (THIS ERROR C MAY HAVE BEEN CAUSED BE A PREVIOUS ERROR IN THE PROGRAM). C C 4 INVALID PL/M STATEMENT. THE STATEMENT IS IMPROPERLY FORMED-- C THE PARSE TO THIS POINT FOLLOWS (THIS MAY HAVE OCCURRED BE- C CAUSE OF A PREVIOUS PROGRAM ERROR). C C 5 PASS-1 PARSE STACK OVERFLOW. THE PROGRAM STATEMENTS ARE C RECURSIVELY NESTED TOO DEEPLY. EITHER SIMPLIFY THE PROGRAM C STRUCTURE, OR RE-COMPILE PASS-1 WITH A LARGER PARSE STACK. C C 6 NUMBER CONVERSION ERROR. THE NUMBER EITHER EXCEEDS 65535 OR C CONTAINS DIGITS WHICH CONFLICT WITH THE RADIX INDICATOR. C C 7 PASS-1 TABLE OVERFLOW. PROBABLE CAUSE IS A CONSTANT STRING C WHICH IS TOO LONG. IF SO, THE STRING SHOULD BE WRITTEN AS A C SEQUENCE OF SHORTER STRINGS, SEPARATED BY COMMAS. OTHERWISE, C RE-COMPILE PASS-1 WITH A LARGER VARC TABLE. C C 8 MACRO TABLE OVERFLOW. TOO MANY LITERALLY DECLARATIONS. C EITHER REDUCE THE NUMBER OF LITERALLY DECLARATIONS, OR RE- C COMPILE PASS-1 WITH A LARGER 'MACROS' TABLE. C C 9 INVALID CONSTANT IN INITIAL, DATA, OR IN-LINE CONSTANT. C PRECISION OF CONSTANT EXCEEDS TWO BYTES (MAY BE INTERNAL C PASS-1 COMPILER ERROR). C C 10 INVALID PROGRAM. PROGRAM SYNTAX INCORRECT FOR TERMINATION C OF PROGRAM. MAY BE DUE TO PREVIOUS ERRORS WHICH OCCURRED C WITHIN THE PROGRAM. C C 11 INVALID PLACEMENT OF A PROCEDURE DECLARATION WITHIN THE PL/M C PROGRAM. PROCEDURES MAY ONLY BE DECLARED IN THE OUTER BLOCK C (MAIN PART OF THE PROGRAM) OR WITHIN DO-END GROUPS (NOT C ITERATIVE DO'S, DO-WHILE'S, OR DO-CASE'S). C C 12 IMPROPER USE OF IDENTIFIER FOLLOWING AN END STATEMENT. C IDENTIFIERS CAN ONLY BE USED IN THIS WAY TO CLOSE A PROCEDURE C DEFINITION. C C 13 IDENTIFIER FOLLOWING AN END STATEMENT DOES NOT MATCH THE NAME C OF THE PROCEDURE WHICH IT CLOSES. C C 14 DUPLICATE FORMAL PARAMETER NAME IN A PROCEDURE HEADING. C C 15 IDENTIFIER FOLLOWING AN END STATEMENT CANNOT BE FOUND IN THE C PROGRAM. C C 16 DUPLICATE LABEL DEFINITION AT THE SAME BLOCK LEVEL. C C 17 NUMERIC LABEL EXCEEDS CPU ADDRESSING SPACE. C C 18 INVALID CALL STATEMENT. THE NAME FOLLOWING THE CALL IS NOT C A PROCEDURE. C C 19 INVALID DESTINATION IN A GO TO. THE VALUE MUST BE A LABEL C OR SIMPLE VARIABLE. C C 20 MACRO TABLE OVERFLOW (SEE ERROR 8 ABOVE). C C 21 DUPLICATE VARIABLE OR LABEL DEFINITION. C C 22 VARIABLE WHICH APPEARS IN A DATA DECLARATION HAS BEEN PRE- C VIOUSLY DECLARED IN THIS BLOCK C C 23 PASS-1 SYMBOL TABLE OVERFLOW (SEE ERROR 2 ABOVE). C C 24 INVALID USE OF AN IDENTIFIER AS A VARIABLE NAME. C C 25 PASS-1 SYMBOL TABLE OVERFLOW (SEE ERROR 2 ABOVE). C C 26 IMPROPERLY FORMED BASED VARIABLE DECLARATION. THE FORM IS C I BASED J, WHERE I IS AN IDENTIFIER NOT PREVIOUSLY DECLARED C IN THIS BLOCK, AND J IS AN ADDRESS VARIABLE. C C 27 SYMBOL TABLE OVERFLOW IN PASS-1 (SEE ERROR 2 ABOVE). C C 28 INVALID ADDRESS REFERENCE. THE DOT OPERATOR MAY ONLY C PRECEDE SIMPLE AND SUBSCRIPTED VARIABLES IN THIS CONTEXT. C C 29 UNDECLARED VARIABLE. THE VARIABLE MUST APPEAR IN A DECLARE C STATEMENT BEFORE ITS USE. C C 30 SUBSCRIPTED VARIABLE OR PROCEDURE CALL REFERENCES AN UN- C DECLARED IDENTIFIER. THE VARIABLE OR PROCEDURE MUST BE C DECLARED BEFORE IT IS USED. C C 31 THE IDENTIFIER IS IMPROPERLY USED AS A PROCEDURE OR SUB- C SCRIPTED VARIABLE. C C 32 TOO MANY SUBSCRIPTS IN A SUBSCRIPTED VARIABLE REFERENCE. C PL/M ALLOWS ONLY ONE SUBSCRIPT. C C 33 ITERATIVE DO INDEX IS INVALID. IN THE FORM 'DO I = E1 TO E2' C THE VARIABLE I MUST BE SIMPLE (UNSUBSCRIPTED). C C 34 ATTEMPT TO COMPLEMENT A $ CONTROL TOGGLE WHERE THE TOGGLE C CURRENTLY HAS A VALUE OTHER THAN 0 OR 1. USE THE '= N' C OPTION FOLLOWING THE TOGGLE TO AVOID THIS ERROR. C C 35 INPUT FILE NUMBER STACK OVERFLOW. RE-COMPILE PASS-1 WITH C A LARGER INSTK TABLE. C C 36 TOO MANY BLOCK LEVELS IN THE PL/M PROGRAM. EITHER SIMPLIFY C YOUR PROGRAM (30 BLOCK LEVELS ARE CURRENTLY ALLOWED) OR C RE-COMPILE PASS-1 WITH A LARGER BLOCK TABLE. C C 37 THE NUMBER OF ACTUAL PARAMETERS IN THE CALLING SEQUENCE C IS GREATER THAN THE NUMBER OF FORMAL PARAMETERS DECLARED C FOR THIS PROCEDURE. C C 38 THE NUMBER OF ACTUAL PARAMETERS IN THE CALLING SEQUENCE C IS LESS THAN THE NUMBER OF FORMAL PARAMETERS DECLARED C FOR THIS PROCEDURE. C C 39 INVALID INTERRUPT NUMBER (MUST BE BETWEEN 0 AND 7) C C 40 DUPLICATE INTERRUPT PROCEDURE NUMBER. A PROCEDURE C HAS BEEN PREVIOUSLY SPECIFIED WITH AN IDENTICAL C INTERRUPT ATTRIBUTE. C C C 41 PROCEDURE APPEARS ON LEFT-HAND-SIDE OF AN ASSIGNMENT. C C 42 ATTEMPTED 'CALL' OF A TYPED PROCEDURE. C C 43 ATTEMPTED USE OF AN UNTYPED PROCEDURE AS A FUNCTION C OR A VARIABLE. C C C 44 THIS PROCEDURE IS UNTYPED AND SHOULD NOT RETURN A VALUE. C C 45 THIS PROCEDURE IS TYPED AND SHOULD RETURN A VALUE. C C 46 'RETURN' IS INVALID OUTSIDE A PROCEDURE DEFINITION. C C 47 ILLEGAL USE OF A LABEL AS AN IDENTIFIER. C C ------ ------------------------------------------------------------- C I M P L E M E N T A T I O N N O T E S C - - - - - - - - - - - - - - - - - - - C THE PL/M COMPILER IS INTENDED TO BE WRITTEN IN ANSI STANDARD C FORTRAN - IV, AND THUS IT SHOULD BE POSSIBLE TO COMPILE AND C EXECUTE THIS PROGRAM ON ANY MACHINE WHICH SUPPORTS THIS FORTRAN C STANDARD. BOTH PASS-1 AND PASS-2, HOWEVER, ASSUME THE HOST C MACHINE WORD SIZE IS AT LEAST 31 BITS, EXCLUDING THE SIGN BIT C (I.E., 32 BITS IF THE SIGN IS INCLUDED). C C THE IMPLEMENTOR MAY FIND IT NECESSARY TO CHANGE THE SOURCE PROGRAM C IN ORDER TO ACCOUNT FOR SYSTEM DEPENDENCIES. THESE CHANGES ARE C AS FOLLOWS C C 1) THE FORTRAN LOGICAL UNIT NUMBERS FOR VARIOUS DEVICES C MAY HAVE TO BE CHANGED IN THE 'GNC' AND 'WRITEL' SUBROU- C TINES (SEE THE FILE DEFINITIONS BELOW). C C 2) THE HOST MACHINE MAY NOT HAVE THE PL/M 52 CHARACTER SET C 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$=./()+-'*,<>:; C (THE LAST 15 SPECIAL CHARACTERS ARE C DOLLAR, EQUAL, PERIOD, SLASH, LEFT PAREN, C RIGHT PAREN, PLUS, MINUS, QUOTE, ASTERISK, C COMMA, LESS-THAN, GREATER-THAN, COLON, SEMI-COLON) C IN THIS CASE, IT IS NECESSARY TO CHANGE THE 'OTRAN' VECTOR IN C BLOCK DATA TO A CHARACTER SET WHICH THE HOST MACHINE SUPPORTS C C 3) THE COMPUTED GO TO IN 'SYNTH' MAY BE TOO LONG FOR SOME C COMPILERS. IF YOU GET A COMPILATION ERROR, BREAK THE C 'GO TO' INTO TWO SECTIONS. C C 4) THE HOST FORTRAN SYSTEM MAY HAVE A LIMITATION ON THE NUMBER C OF CONTIGUOUS COMMENT RECORDS (E.G. S/360 LEVEL G). IF SO, C INTERSPERSE THE DECLARATION STATEMENTS INTEGER I1000, INTEGER C I1001, ETC., AS NECESSARY TO BREAK UP THE LENGTH OF COMMENTS. C THE SYMBOLS I1XXX ARE RESERVED FOR THIS PURPOSE. C C THERE ARE A NUMBER OF COMPILER PARAMETERS WHICH MAY HAVE TO C BE CHANGED FOR YOUR INSTALLATION. THESE PARAMETERS ARE DEFINED C BELOW (SEE 'SCANNER COMMANDS'), AND THE CORRESPONDING DEFAULT C VALUES ARE SET FOLLOWING THEIR DEFINITION. FOR EXAMPLE, THE C $RIGHTMARGIN = I C PARAMETER DETERMINES THE RIGHT MARGIN OF THE INPUT SOURCE LINE. C THE PARAMETER IS SET EXTERNALLY BY A SINGLE LINE STARTING WITH C '$R' IN COLUMNS ONE AND TWO (THE REMAINING CHARACTERS UP TO C THE '=' ARE IGNORED). THE INTERNAL COMPILER REPRESENTATION C OF THE CHARACTER 'R' IS 29 (SEE CHARACTER CODES BELOW), AND THUS C THE VALUE OF THE $RIGHTMARGIN PARAMETER CORRESPONDS TO ELEMENT 29 C OF THE 'CONTRL' VECTOR. C C 1) THE PARAMETERS $T, $P, $W, $I, $O, AND $R C CONTROL THE OPERATING MODE OF PL/M. FOR BATCH PROCESSING, C ASSUMING 120 CHARACTER (OR LARGER) PRINT LINE AND 80 CHARAC- C TER CARD IMAGE, THE PARAMETERS SHOULD DEFAULT AS FOLLOWS C $TERMINAL = 0 C $PRINT = 1 C $WIDTH = 120 C $INPUT = 2 C $OUTPUT = 2 C $RIGHTMARGIN= 80 C NOTE THAT IT MAY BE DESIRABLE TO LEAVE $R=72 TO ALLOW ROOM C FOR AN 8-DIGIT SEQUENCE NUMBER IN COLUMNS 73-80 OF THE PL/M C SOURCE CARD. C C 2) FOR INTERACTIVE PROCESSING, ASSUMING A CONSOLE WITH WIDTH C OF 72 CHARACTERS (E.G., A TTY), THESE PARAMETERS SHOULD C DEFAULT AS FOLLOWS C $TERMINAL = 1 C $PRINT = 1 C $WIDTH = 72 C $INPUT = 1 C $OUTPUT = 1 C $RIGHTMARGIN= 72 C C 3) THE CHARACTERISTICS OF THE INTERMEDIATE LANGUAGE FILES C PRODUCED BY PASS-1 ARE GOVERNED BY THE $J, $K, $U, $V, AND C $Y PARAMETERS. THESE PARAMETERS CORRESPOND TO THE DESTINATION C AND WIDTH OF THE INTERMEDIATE CODE FILE ($J AND $K), AND C DESTINATION AND WIDTH OF THE INTERMEDIATE SYMBOL TABLE ($U C AND $V). SOME FORTRAN SYSTEMS DELETE THE LEADING CHARACTER C OF THE FILES PRODUCED BY OTHER FORTRAN PROGRAMS. THE $Y C PARAMETER CAN BE USED TO PAD EXTRA BLANKS AT THE BEGINNING OF C THE INTERMEDIATE FILES IF THIS BECOMES A PROBLEM ON THE HOST C SYSTEM. C C UNDER NORMAL CIRCUMSTANCES, THESE PARAMETERS WILL NOT C HAVE TO BE CHANGED. IN ANY CASE, EXPERIMENT WITH VARIOUS C VALUES OF THE $ PARAMETERS BY SETTING THEM EXTERNALLY BE- C FORE ACTUALLY CHANGING THE DEFAULTS. C C THE IMPLEMENTOR MAY ALSO WISH TO INCREASE OR DECREASE THE SIZE C OF PASS-1 OR PASS-2 TABLES. THE TABLES IN PASS-1 WHICH MAY BE C CHANGED IN SIZE ARE 'MACROS' AND 'SYMBOL' WHICH CORRESPOND TO C THE AREAS WHICH HOLD 'LITERALLY' DEFINITIONS AND PROGRAM SYMBOLS C AND ATTRIBUTES, RESPECTIVELY. IT IS IMPOSSIBLE TO PROVIDE AN C EXACT FORMULA WHICH RELATES THE NUMBER OF SYMBOLS HELD BY EITHER C OF THESE TABLES TO THE TABLE LENGTH, SINCE TABLE SPACE IS DY- C NAMICALLY ALLOCATED ACCORDING TO SYMBOL NAME LENGTH AND NUMBER C OF ATTRIBUTES REQUIRED FOR THE PARTICULAR SYMBOL. C C 1) IN THE CASE OF THE MACROS TABLE, THE LENGTH IS RELATED TO THE C TOTAL NUMBER OF CHARACTERS IN THE MACRO NAMES PLUS THE TOTAL C NUMBER OF CHARACTERS IN THE MACRO DEFINITIONS - AT THE DEEP- C EST BLOCK LEVEL DURING COMPILATION. TO CHANGE THE MACRO C TABLE SIZE, ALTER ALL OCCURRENCES OF C C MACROS(500) C C IN EACH SUBROUTINE TO MACROS(N), WHERE N REPRESENTS THE NEW C INTEGER CONSTANT SIZE. IN ADDITION, THE 'DATA' STATEMENT C BLOCK DATA (LAST PROGRAM SEGMENT) MUST BE CHANGED FOR THE C MACRO PARAMETERS BASED UPON THE CONSTANT VALUE N TO C C DATA MACROS /N*0/, CURMAC /N+1/, MAXMAC /N/, C 1 MACTOP /1/ C C 2) IF THE IMPLEMENTOR WISHES TO INCREASE OR DECREASE THE SIZE C OF THE SYMBOL TABLE, THEN ALL OCCURRENCES OF C C SYMBOL(4000) C C MUST BE CHANGED TO SYMBOL(M), WHERE M IS THE DESIRED INTEGER C CONSTANT SIZE. THE 'DATA' STATEMENTS FOR SYMBOL TABLE PARA- C METERS MUST ALSO BE ALTERED AS DESCRIBED IN THE CORRESPONDING C COMMENT IN BLOCK DATA. IN PARTICULAR, THE LAST ITEM OF C THE DATA STATEMENT FOR 'SYMBOL' FILLS THE UNINITIALIZED POR- C TION OF THE TABLE WITH ZEROES, AND HENCE MUST BE THE EVALUATION C OF THE ELEMENT C (M-120)*0 C C (IT IS CURRENTLY (4000-120)*0 = 3880*0). THE DATA STATEMENT C FOR MAXSYM AND SYMABS MUST BE CHANGED TO INITIALIZE THESE C VARIABLES TO THE VALUE M. C C GOOD LUCK... C C C F I L E D E F I N I T I O N S C INPUT OUTPUT C C FILE FORTRAN MTS DEFAULT FORTRAN MTS DEFAULT C NUM I/O UNIT I/O UNIT FDNAME I/O UNIT I/O UNIT FDNAME C C 1 1 GUSER *MSOURCE* 11 SERCOM *MSINK* C 2 2 SCARDS *SOURCE* 12 SPRINT *SINK* C 3 3 3 13 13 C 4 4 4 14 14 C 5 5 5 15 15 C 6 6 6 16 16 -PLM16## C 7 7 7 17 17 -PLM17## C C ALL INPUT RECORDS ARE 80 CHARACTERS OR LESS. ALL C OUTPUT RECORDS ARE 120 CHARACTERS OR LESS. C THE FORTRAN UNIT NUMBERS CAN BE CHANGED IN THE C SUBROUTINES GNC AND WRITEL (THESE ARE THE ONLY OC- C CURRENCES OF REFERENCES TO THESE UNITS). C C C C 0 1 2 3 4 5 6 7 8 9 C 0 0 0 0 0 0 0 0 1 1 C 2 3 4 5 6 7 8 9 0 1 C C C $ = . / ( ) + - ' * , < > : ; C 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 C 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 C C C A B C D E F G H I J K L M N O P Q R S T U V W X Y Z C 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 C 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 C C C SEQNO SUB/FUNC NAME C 15410000 SUBROUTINE EXITB C 16300000 INTEGER FUNCTION LOOKUP(IV) C 17270000 INTEGER FUNCTION ENTER(INFOV) C 18050000 SUBROUTINE DUMPSY C 20030000 SUBROUTINE RECOV C 20420000 LOGICAL FUNCTION STACK(Q) C 20930000 LOGICAL FUNCTION PROK(PRD) C 21550000 SUBROUTINE REDUCE C 22100000 SUBROUTINE CLOOP C 22740000 SUBROUTINE PRSYM(CC,SYM) C 23120000 INTEGER FUNCTION GETC1(I,J) C 23330000 SUBROUTINE SCAN C 25280000 INTEGER FUNCTION WRDATA(SY) C 26460000 SUBROUTINE DUMPCH C 26960000 SUBROUTINE SYNTH(PROD,SYM) C 36310000 INTEGER FUNCTION GNC(Q) C 37980000 SUBROUTINE WRITEL(NSPACE) C 38520000 FUNCTION ICON(I) C 38710000 SUBROUTINE DECIBP C 38850000 SUBROUTINE CONV(PREC) C 39090000 SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH) C 39370000 SUBROUTINE CONOUT(CC,K,N,BASE) C 39690000 SUBROUTINE PAD(CC,CHR,I) C 39800000 SUBROUTINE STACKC(I) C 39950000 SUBROUTINE ENTERB C 40180000 SUBROUTINE DUMPIN C 40880000 SUBROUTINE ERROR(I,LEVEL) C 41320000 INTEGER FUNCTION SHR(I,J) C 41360000 INTEGER FUNCTION SHL(I,J) C 41400000 INTEGER FUNCTION RIGHT(I,J) C 41440000 SUBROUTINE SDUMP C 41670000 SUBROUTINE REDPR(PROD,SYM) C 41900000 SUBROUTINE EMIT(VAL,TYP) C C*********************************************************************** C INTEGER I INTEGER TITLE(10),VERS COMMON /TITL/TITLE,VERS C C SYNTAX ANALYZER TABLES INTEGER SHL,SHR,RIGHT,CONV,GETC1 INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV C GLOBAL VARIABLES INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR, 1 INSTK(7),ITRAN(256),OTRAN(64) COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR, 1 INSTK,ITRAN,OTRAN INTEGER CONTRL(64) COMMON /CNTRL/CONTRL INTEGER MSSG(77) COMMON /MESSAG/MSSG INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18) COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 C THE FOLLOWING SCANNER COMMANDS ARE DEFINED C ANALYZE = I (12) PRINT SYNTAX ANALYSIS TRACE C BYPASS (13) BYPASS STACK DUMP ON ERROR C COUNT = I (14) BEGIN LINE COUNT AT I C DELETE = I (15) C EOF (16) C GENERATE (18) C INPUT = I (20) C JFILE (CODE)= I (21) C KWIDTH (CD)= I (22) C LEFTMARGIN = I (23) C MEMORY = I (24) C OUTPUT = I (26) C PRINT (T OR F) (27) C RIGHTMARG = I (29) C SYMBOLS (30) C TERMINAL (31) (0=BATCH, 1=TERM, 2=INTERLIST) C USYMBOL = I (32) C VWIDTH (SYM) = I (33) C WIDTH = I (34) C YPAD = N (36) BLANK PAD ON OUTPUT C CONTRL(1) IS THE ERROR COUNT DO 2 I=1,64 2 CONTRL(I) = -1 CONTRL(1) = 0 CONTRL(12) = 0 CONTRL(13) = 1 CONTRL(14) = 0 CONTRL(15) = 120 CONTRL(16) = 0 CONTRL(18) = 0 CONTRL(20) = 2 CONTRL(21) = 6 CONTRL(22) = 72 CONTRL(23) = 1 CONTRL(24) = 1 CONTRL(26) = 2 CONTRL(27) = 1 CONTRL(29) = 80 CONTRL(30) = 0 CONTRL(31) = 1 CONTRL(32) = 7 CONTRL(33) = 72 CONTRL(34) = 120 CONTRL(36) = 1 C DO 4 I=1,5 4 PRMASK(I)=2**(I*8-8)-1 DO 8 I=1,256 ITRAN(I) = 1 8 CONTINUE C DO 5 I=53,64 OTRAN(I) = OTRAN(1) 5 CONTINUE C DO 10 I=1,52 J = OTRAN(I) J = ICON(J) 10 ITRAN(J) = I CALL CONOUT(0,4,8080,10) CALL PAD(1,1,1) CALL FORM(1,TITLE,1,10,10) CALL CONOUT(1,1,VERS/10,10) CALL PAD(1,40,1) CALL CONOUT(1,1,MOD(VERS,10),10) CALL WRITEL(1) DO 20 I=1,3 20 PSTACK(I)=0 PSTACK(4)=EOFILE SP = 4 CALL SCAN CALL CLOOP CALL EMIT(NOP,OPR) 100 IF (POLTOP.EQ.0) GO TO 200 CALL EMIT(NOP,OPR) GO TO 100 200 CONTINUE C PRINT ERROR COUNT I = CONTRL(1) J = CONTRL(26) K = J 300 CONTINUE CALL WRITEL(0) CONTRL(26) = J IF (I.EQ.0) CALL FORM(0,MSSG,6,7,41) IF (I.NE.0) CALL CONOUT(2,-5,I,10) CALL PAD(1,1,1) CALL FORM(1,MSSG,8,20,41) IF (I.NE.1) CALL PAD(1,30,1) CALL PAD(0,1,1) CALL WRITEL(0) C CHECK FOR TERMINAL CONTROL OF A BATCH RUN IF ((J.EQ.1).OR.(CONTRL(31).EQ.0)) GO TO 400 C ARRIVE HERE IF TERMINAL TOGGLE GT 0, AND OUTPUT NOT CONSOLE J = 1 GO TO 300 400 CONTINUE CONTRL(26) = K CALL DUMPSY C MAY WANT A SYMBOL TABLE FOR THE SIMULATOR IF(CONTRL(24).EQ.0) SYMBOL(2) = 0 CALL DUMPCH CALL DUMPIN STOP END SUBROUTINE EXITB C GOES THROUGH HERE UPON BLOCK EXIT C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER HENTRY(127),HCODE COMMON /HASH/HENTRY,HCODE INTEGER RIGHT,SHR,SHL INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP LOGICAL ERRED ERRED = .FALSE. IF (CURBLK .LE. 0) GO TO 9999 I = BLOCK(CURBLK) N = MACBLK(CURBLK) CURMAC = RIGHT(N,12) MACTOP = SHR(N,12) CURBLK = CURBLK - 1 J = SYMBOL(SYMTOP) 100 IF (J.LT.I) GO TO 300 IF (SYMBOL(J+1).LT.0) GO TO 200 K = IABS(SYMBOL(J+2)) KP = RIGHT(K,4) LP = SHR(KP,8) IF(KP.GE.LITER) GO TO 200 IF ((KP.NE.VARB).AND.(KP.NE.LABEL))GO TO 150 K = RIGHT(SHR(K,4),4) IF (K.NE.0) GO TO 150 IF ((KP.EQ.LABEL).AND.(CURBLK.GT.1)) GO TO 200 IF (ERRED) GO TO 130 CALL ERROR(1,1) ERRED=.TRUE. 130 CALL PAD(0,1,5) N = SYMBOL(J+1) N = SHR(N,12) IF (N.EQ.0) GO TO 150 DO 120 KP=1,N LTEMP=J+2+KP L=SYMBOL(LTEMP) DO 120 LP=1,PACK JP = 30-LP*6 JP = RIGHT(SHR(L,JP),6)+1 CALL PAD(1,JP,1) 120 CONTINUE CALL WRITEL(0) 150 SYMBOL(J+1) = -SYMBOL(J+1) C MAY WANT TO FIX THE HASH CODE CHAIN IF (LP.LE.0) GO TO 200 C FIND MATCH ON THE ENTRY K = J - 1 KP = SYMBOL(K) HCODE = SHR(KP,16) KP = RIGHT(KP,16) N = HENTRY(HCODE) IF (N.NE.K) GO TO 160 C C THIS ENTRY IS DIRECTLY CONNECTED HENTRY(HCODE) = KP GO TO 200 C C LOOK THROUGH SOME LITERALS IN THE SYMBOL TABLE ABOVE 160 NP = RIGHT(SYMBOL(N),16) IF (NP.EQ.K) GO TO 170 N = NP GO TO 160 C 170 SYMBOL(N) = SHR(HCODE,16) + KP C 200 J = RIGHT(SYMBOL(J),16) GO TO 100 300 BLKSYM = BLOCK(CURBLK) 9999 RETURN END INTEGER FUNCTION LOOKUP(IV) C SYNTAX ANALYZER TABLES INTEGER SHL,SHR,RIGHT,CONV,GETC1 INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER HENTRY(127),HCODE COMMON /HASH/HENTRY,HCODE INTEGER ENTER LOGICAL SFLAG EQUIVALENCE (L,SYMLEN),(I,SYMLOC) NVAL = FIXV(IV) SFLAG = PSTACK(IV) .NE. NUMBV I = VAR(IV) L = SHR(I,12) I = RIGHT(I,12) J = I KP = PACK*6 K = KP JP = 0 M = 0 100 IF (JP .GE. L) GO TO 300 K = K - 6 IF (K .GE. 0) GO TO 200 VARC(J) = M J = J + 1 M = 0 K = KP - 6 200 LTEMP=JP+I M=SHL(VARC(LTEMP)-1,K)+M JP = JP + 1 GO TO 100 300 VARC(J) = M C VARC IS NOW IN PACKED FORM READY FOR LOOKUP C COMPUTE HASH CODE (REDUCE NUMBERS MOD 127, USE FIRST 5 CHARS OF C IDENTIFIERS AND STRINGS ) HCODE = NVAL IF (SFLAG) HCODE = VARC(I) HCODE = MOD(HCODE,127) + 1 C HCODE IS IN THE RANGE 1 TO 127 LP = (L-1)/PACK + 1 K = HENTRY(HCODE) 400 IF (K .LE. 0) GO TO 9990 IF (SFLAG) GO TO 450 C COMPARE NUMBERS IN INTERNAL FORM RATHER THAN CHARACTERS J = SYMBOL(K+3) IF (RIGHT(J,4).LE.LITER) GO TO 600 J = SHR(J,8) IF (J.EQ.NVAL) GO TO 510 GO TO 600 450 J = SYMBOL(K+2) JP = RIGHT(J,12) IF (JP .NE. L) GO TO 600 J = K + 3 JP = I DO 500 M=1,LP LTEMP=J+M IF(VARC(JP).NE.SYMBOL(LTEMP)) GO TO 600 500 JP = JP + 1 C SYMBOL FOUND C C MAKE SURE THE TYPES MATCH. JP = PSTACK(IV) M = SYMBOL(K+3) M = RIGHT(M,4) IF ((JP.EQ.STRV).AND.(M.EQ.LITER)) GO TO 510 IF ((JP.NE.IDENTV).OR.(M.GE.LITER)) GO TO 600 C JP IS IDENTIFIER, M IS VARIABLE, LABEL, OR PROCEDURE. 510 LOOKUP = K+2 RETURN 600 K = SYMBOL(K) K = RIGHT(K,16) GO TO 400 9990 LOOKUP = 0 RETURN END INTEGER FUNCTION ENTER(INFOV) INTEGER Q,TYP,INFO,INFOV,SHR,SHL,RIGHT C SYNTAX ANALYZER TABLES INTEGER CONV,GETC1 INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL C COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER HENTRY(127),HCODE COMMON /HASH/HENTRY,HCODE INTEGER CONTRL(64) COMMON /CNTRL/CONTRL C ENTER ASSUMES A PREVIOUS CALL TO LOOKUP (EITHER THAT, OR SET UP C THE VALUES OF SYMLOC AND SYMLEN IN THE VARC ARRAY). C ALSO SET-UP HASH CODE VALUE (SEE LOOKUP), IF NECESSARY INFO = INFOV I = SYMTOP IF (INFO.GE.0) GO TO 10 C ENTRY WITH NO EXTERNAL NAME IHASH = 0 HCODE = 0 INFO = - INFO SYMLEN = 0 Q = 0 GO TO 20 C 10 IHASH = 1 Q = (SYMLEN-1)/PACK + 1 C 20 SYMTOP = SYMTOP + Q + IHASH + 3 IQ = I I = I + IHASH C IF (SYMTOP .LE. MAXSYM) GO TO 100 I = IHASH SYMTOP = Q + IHASH + 3 CALL ERROR(2,5) 100 SYMBOL(SYMTOP) = I SYMCNT = SYMCNT + 1 SYMBOL(I) = SHL(SYMCNT,16) + SYMBOL(IQ) I = I + 1 SYMBOL(I) = SHL(Q,12) + SYMLEN IP = I + 1 SYMBOL(IP) = INFO L = SYMLOC - 1 IF (Q.EQ.0) GO TO 210 DO 200 J = 1,Q LTEMP=IP+J LTEMP1=L+J 200 SYMBOL(LTEMP)=VARC(LTEMP1) 210 ENTER = I C C COMPUTE HASH TABLE ENTRY IF (IHASH.EQ.0) GO TO 300 C FIX COLLISION CHAIN SYMBOL(IQ) = SHL(HCODE,16) + HENTRY(HCODE) HENTRY(HCODE) = IQ 300 RETURN END SUBROUTINE DUMPSY INTEGER INTPRO(8) COMMON /INTER/INTPRO C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER RIGHT,SHR,SHL INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON/BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER LOOKUP,ENTER INTEGER MSSG(77) COMMON /MESSAG/MSSG INTEGER CONTRL(64) COMMON /CNTRL/CONTRL INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER IC = CONTRL(30) IF (IC.EQ.0) GO TO 2000 CALL WRITEL(0) IF (IC.GT.1) CALL FORM(0,MSSG,42,77,77) I = SYMBOL(SYMTOP) IT = SYMTOP 210 IF (I .LE. 0) GO TO 1000 K = SYMBOL(I) KP = SHR(K,16) C QUICK CHECK FOR ZERO LENGTH NAME IF (IC.GE.2) GO TO 215 N = IABS(SYMBOL(I+1)) IF (SHR(N,12).EQ.0) GO TO 218 215 CONTINUE CALL PAD(0,30,1) CALL CONOUT(1,5,KP,10) 218 CONTINUE K = SYMBOL(I+1) IF (IC.LT.2) GO TO 220 J = 1 IF (K .LT. 0) J = 47 CALL PAD(1,J,1) CALL PAD(1,1,1) 220 CONTINUE K = IABS(K) KP = SHR(K,12) N = KP K = RIGHT(K,12) MC = K IF (IC.LT.2) GO TO 230 CALL CONOUT(1,4,I+1,10) CALL PAD(1,1,1) CALL CONOUT(1,-3,KP,10) CALL PAD(1,1,1) CALL CONOUT(1,-4,K,10) CALL PAD(1,1,1) 230 CONTINUE K = SYMBOL(I+2) J = 29 IF (IC.LT.2) GO TO 240 IF (K .LT. 0) J = 13 CALL PAD(1,J,1) CALL PAD(1,1,1) 240 CONTINUE K = IABS(K) M = RIGHT(K,4) IF (IC.LT.2) GO TO 250 KP = SHR(K,8) CALL CONOUT(1,6,KP,10) KP = RIGHT(SHR(K,4),4) CALL CONOUT(1,-3,KP,10) KP = RIGHT(K,4) CALL CONOUT(1,-3,KP,10) 250 CONTINUE CALL PAD(1,1,1) IP = I+2 IF (N.EQ.0) GO TO 310 IF (M.EQ.LITER) CALL PAD(1,46,1) DO 300 KP=1,N LTEMP=KP+IP L=SYMBOL(LTEMP) DO 300 LP=1,PACK IF ((KP-1)*PACK+LP.GT.MC) GO TO 305 JP = 30-LP*6 JP = RIGHT(SHR(L,JP),6)+1 CALL PAD(1,JP,1) 300 CONTINUE 305 IF (M.EQ.LITER) CALL PAD(1,46,1) 310 IP = IP + N IF (IC.LT.2) GO TO 330 320 IP = IP + 1 IF (IP .GE. IT) GO TO 330 CALL PAD(1,1,1) K = SYMBOL(IP) J = 1 IF (K .LT. 0) J = 45 CALL PAD(1,J,1) K = IABS(K) CALL CONOUT(1,8,K,16) GO TO 320 330 IT = I I = RIGHT(SYMBOL(I),16) GO TO 210 1000 CONTINUE CALL WRITEL(0) 2000 CONTINUE CALL WRITEL(0) K = CONTRL(26) CONTRL(26) = CONTRL(32) KP = CONTRL(34) CONTRL(34) = CONTRL(33) C WRITE THE INTERRUPT PROCEDURE NAMES CALL PAD(1,41,1) DO 2050 I = 1,8 J = INTPRO(I) IF (J.LE.0) GO TO 2050 C WRITE INTNUMBER SYMBOLNUM (4 BASE-32 DIGITS) CALL PAD(1,I+1,1) DO 2020 L=1,3 CALL PAD(1,RIGHT(J,5)+2,1) 2020 J = SHR(J,5) CALL PAD(1,41,1) 2050 CONTINUE CALL PAD(1,41,1) CALL WRITEL(0) C C C REVERSE THE SYMBOL TABLE POINTERS C SET THE LENGTH FIELD OF COMPILER-GENERATED LABELS TO 1 C L = 0 I = SYMTOP J = SYMBOL(I) SYMBOL(I) = 0 2100 IF (J.EQ.0) GO TO 2200 L = L + 1 C CHECK FOR A LABEL VARIABLE K = SYMBOL(J+2) IF (MOD(K,16).NE.LABEL) GO TO 2110 C CHECK FOR CHARACTER LENGTH = 0 K = IABS(SYMBOL(J+1)) IF (MOD(K,4096).NE.0) GO TO 2110 C SET LENGTH TO 1 AND PREC TO 5 (FOR COMP GENERATED LABELS) SYMBOL(J+2) = 336 + LABEL C 336 = 1 * 256 + 5 * 16 2110 M = SYMBOL(J) SYMBOL(J) = I I = J J = RIGHT(M,16) GO TO 2100 C 2200 CONTINUE JP = 0 IFIN = 1 IP = 1 J = 1 C 2500 IF (J.NE.JP) GO TO 2610 J = J + IP 2610 IF (J.LT.IFIN) GO TO 2700 C OTHERWISE GET ANOTHER ENTRY FROM TABLE CALL PAD(1,41,1) J = I + 1 I = SYMBOL(I) IF (I.EQ.0) GO TO 2800 IP = IABS(SYMBOL(J)) IP = RIGHT(SHR(IP,12),12) J = J + 1 JP = J + 1 C CHECK FOR BASED VARIABLE -- COMPUTE LAST ENTRY IFIN = JP + IP IF (SYMBOL(J).LT.0) IFIN = IFIN + 1 GO TO 2500 2700 L = 1 LP = SYMBOL(J) IF (LP.LT.0) L = 45 LP = IABS(LP) CALL PAD(1,L,1) 2710 CALL PAD(1,RIGHT(LP,5)+2,1) LP = SHR(LP,5) IF (LP.GT.0) GO TO 2710 J = J + 1 GO TO 2500 C 2800 CALL PAD(1,41,1) CALL WRITEL(0) CONTRL(26) = K CONTRL(34) = KP RETURN END SUBROUTINE RECOV INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER GETC1 INTEGER RIGHT C FIND SOMETHING SOLID IN THE TEXT 100 IF(TOKEN.EQ.DECL.OR.TOKEN.EQ.PROCV.OR.TOKEN.EQ.ENDV 1 .OR.TOKEN.EQ.DOV.OR.TOKEN.EQ.SEMIV.OR.TOKEN.EQ.EOFILE) GO TO 300 200 CALL SCAN GO TO 100 C AND IN THE STACK 300 I = PSTACK(SP) IF (FAILSF.AND.GETC1(I,TOKEN).NE.0) GO TO 500 IF (I.EQ.EOFILE.AND.TOKEN.EQ.EOFILE) GO TO 400 IF ((I.EQ.GROUPV.OR.I.EQ.SLISTV.OR.I.EQ.STMTV.OR. 1 I.EQ.DOV.OR.I.EQ.PROCV).AND.TOKEN.NE.EOFILE) GO TO 200 C BUT DON'T GO TOO FAR IF (SP.LE.4) GO TO 200 VARTOP = RIGHT(VAR(SP),12) SP = SP - 1 GO TO 300 400 COMPIL = .FALSE. 500 FAILSF = .FALSE. RETURN END LOGICAL FUNCTION STACK(Q) INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER GETC1,SHL,SHR INTEGER Q 100 I = GETC1(PSTACK(SP),TOKEN)+1 GO TO (1000,2000,3000,4000),I C ILLEGAL SYMBOL PAIR 1000 CALL ERROR(3,1) CALL PRSYM(0,PSTACK(SP)) CALL PAD(1,1,1) CALL PRSYM(1,TOKEN) CALL SDUMP CALL RECOV C RECOVER MAY HAVE SET COMPILING FALSE IF (.NOT.COMPIL) GO TO 2000 GO TO 100 C RETURN TRUE 2000 STACK = .TRUE. GO TO 9999 C RETURN FALSE 3000 STACK = .FALSE. GO TO 9999 C CHECK TRIPLES 4000 CONTINUE J = SHL(PSTACK(SP-1),16)+SHL(PSTACK(SP),8)+TOKEN IU = NC1TRI+2 IL = 1 4100 K =SHR(IU+IL,1) JP = C1TRI(K) IF(J .LT. JP) IU = K IF(J .GE. JP) IL = K IF ((IU-IL) .GT. 1) GO TO 4100 C CHECK FOR MATCH STACK = J .EQ. C1TRI(IL) 9999 RETURN END LOGICAL FUNCTION PROK(PRD) INTEGER PRD INTEGER SHL,SHR,RIGHT,CONV,GETC1 INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV C CONTEXT CHECK OF EQUAL OR IMBEDDED RIGHT PARTS I = CONTC(PRD)+1 GO TO (1000,2000,3000,4000),I C NO CHECK REQUIRED 1000 PROK = .TRUE. GO TO 9999 C RIGHT CONTEXT CHECK 2000 PROK = GETC1(HDTB(PRD),TOKEN) .NE. 0 GO TO 9999 C LEFT CONTEXT CHECK 3000 K = HDTB(PRD) - NT L = PRLEN(PRD) LTEMP=SP-L I=PSTACK(LTEMP) L = LEFTI(K)+1 LP = LEFTI(K+1) IF (L .GT. LP) GO TO 3200 DO 3100 J=L,LP IF (LEFTC(J) .NE. I) GO TO 3100 PROK = .TRUE. GO TO 9999 3100 CONTINUE 3200 CONTINUE C PROK = .FALSE. GO TO 9999 C CHECK TRIPLES 4000 CONTINUE K = HDTB(PRD)-NT L=PRLEN(PRD) LTEMP=SP-L I=SHL(PSTACK(LTEMP),8)+TOKEN L = TRIPI(K)+1 LP = TRIPI(K+1) IF (L .LT. LP) GO TO 4200 DO 4100 J=L,LP IF (CONTT(J) .NE. I) GO TO 4100 PROK = .TRUE. GO TO 9999 4100 CONTINUE 4200 CONTINUE PROK = .FALSE. 9999 RETURN END SUBROUTINE REDUCE INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL INTEGER SHL,SHR,RIGHT,CONV,GETC1 C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER I,J,PRD,K,L,M LOGICAL JL,ML,PROK EQUIVALENCE (J,JL),(M,ML) C PACK STACK TOP K = SP-4 L = SP-1 J = 0 DO 100 I=K,L 100 J = SHL(J,8)+PSTACK(I) LTEMP=PSTACK(SP) K=PRIND(LTEMP)+1 L=PRIND(LTEMP+1) C DO 200 PRD=K,L M = PRLEN(PRD) M = 8 * (M - 1) M = RIGHT (J, M) IF (M .NE. PRTB(PRD)) GO TO 200 IF (.NOT. PROK(PRD)) GO TO 200 MP = SP -PRLEN(PRD)+1 MPP1 = MP+1 J = HDTB(PRD) CALL SYNTH(PRDTB(PRD),J) SP = MP PSTACK(SP) = J VARTOP=RIGHT(VAR(SP),12) GO TO 9999 C 200 CONTINUE 300 CONTINUE C NO APPLICABLE PRODUCTION CALL ERROR(4,1) FAILSF = .FALSE. CALL SDUMP CALL RECOV 9999 RETURN END SUBROUTINE CLOOP LOGICAL STACK INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE INTEGER SHL,SHR,RIGHT COMPIL = .TRUE. 100 IF (.NOT. COMPIL) GO TO 9999 IF (.NOT. STACK(0)) GO TO 400 C STACK MAY HAVE SET COMPILING FALSE IF (.NOT.COMPIL) GO TO 9999 SP = SP + 1 IF (SP .LT. MSTACK) GO TO 300 CALL ERROR(5,5) GO TO 9999 300 PSTACK(SP) = TOKEN C INSERT ACCUM INTO VARC HERE IF (TOKEN .NE. NUMBV) GO TO 302 CALL CONV(16) IF (VALUE.GE.0) GO TO 301 CALL ERROR(6,1) VALUE = 0 301 FIXV(SP) = VALUE 302 VAR(SP) = VARTOP 305 IF (ACCLEN .EQ. 0) GO TO 315 DO 310 J=1,ACCLEN VARC(VARTOP) = ACCUM(J) VARTOP = VARTOP + 1 IF (VARTOP .LE. MVAR) GO TO 310 CALL ERROR(7,5) VARTOP = 1 310 CONTINUE 315 IF (TOKEN .NE. STRV) GO TO 360 IF (STYPE .NE. CONT) GO TO 360 CALL SCAN GO TO 305 360 I = VARTOP-VAR(SP) IF (I .LT. 0) I = 1 VAR(SP) = SHL(I,12) + VAR(SP) CALL SCAN GO TO 100 400 CALL REDUCE GO TO 100 9999 RETURN END SUBROUTINE PRSYM(CC,SYM) C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER CC,SYM,SHL,SHR,RIGHT INTEGER PBUFF(30) K=VLOC(SYM+1) IF (SYM .GT. NT) GO TO 100 L = V(K) CALL FORM(CC,V,K+1,K+L,NSY+1) GO TO 9999 100 CONTINUE L = RIGHT(K,15)-1 K = SHR(K,15) KP = 0 DO 300 I=1,K,PACK L = L + 1 LP = V(L) JP = PACK * 6 DO 300 J=1,PACK JP = JP - 6 KP = KP + 1 IP = SHR(LP,JP) PBUFF(KP) = RIGHT(IP,6)+1 300 CONTINUE C CALL FORM(CC,PBUFF,1,K,30) 9999 RETURN END INTEGER FUNCTION GETC1(I,J) INTEGER SHL,SHR,RIGHT C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV K = (NT+1)*I+J L = K/15+1 L = C1(L) M = SHL(14-MOD(K,15),1) GETC1=RIGHT(SHR(L,M),2) RETURN END SUBROUTINE SCAN INTEGER GNC,SHL,SHR,RIGHT C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER ACCLEN,ACCUM(32),TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE COMMON /SCANC/ACCLEN,ACCUM,TYPE,STYPE,EOFLAG, 1 IDENT,NUMB,SPECL,STR,CONT,VALUE C SCAN FINDS THE NEXT ENTITY IN THE INPUT STREAM C THE RESULTING ITEM IS PLACED INTO ACCUM (OF LENGTH C ACCLEN). TYPE AND STYPE IDENTIFY THE ITEM AS SHOWN C BELOW -- C TYPE STYPE ITEM VARIABLE C 1 NA END OF FILE EOFLAG C 2 CONT IDENTIFIER IDENT C 3 RADIX NUMBER NUMB C 4 NA SPEC CHAR SPECL C 5 CONT STRING STR C INTEGER IBUFF(80),OBUFF(120),IBP,OBP,INPTR, 1 INSTK(7),ITRAN(256),OTRAN(64) COMMON /FILES/IBUFF,OBUFF,IBP,OBP,INPTR, 1 INSTK,ITRAN,OTRAN INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL FAILSF = .TRUE. 10 I=GNC(0) ACCLEN = 0 IF (STYPE .NE. CONT) GO TO 51 GO TO (100,200,51,51,499), TYPE C DEBLANK INPUT 50 I = GNC(0) 51 IF (I .EQ. 0) GO TO 100 GO TO (50,300,300,300,300,300,300,300,300,300,300, 1 200,200,200,200,200,200,200,200,200,200, 2 200,200,200,200,200,200,200,200,200,200, 3 200,200,200,200,200,200, 4 400,400,400,400,400,400,400,400,400,400, 5 400,400,400,400,400,400,400,400,400,400, 6 400,400,400,400,400,400,400),I C END OF FILE 100 TYPE = EOFLAG GO TO 999 C IDENTIFIER 200 TYPE = IDENT 210 ACCLEN = ACCLEN + 1 ACCUM(ACCLEN) = I IF (ACCLEN .GE. 32) GO TO 220 215 I = GNC(0) C CHECK FOR $ WITHIN AN IDENTIFIER IF (I.EQ.38) GO TO 215 IF ((I .GE. 2) .AND. (I .LE. 37)) GO TO 210 CALL DECIBP STYPE = 0 GO TO 999 220 STYPE = CONT GO TO 999 C C C NUMBER 300 TYPE = NUMB STYPE = 0 310 ACCLEN = ACCLEN +1 ACCUM(ACCLEN) = I IF (ACCLEN .EQ. 32) GO TO 350 312 I = GNC(0) C CHECK FOR $ IN NUMBER IF (I.EQ.38) GO TO 312 IF ((I .GE. 2) .AND. (I .LE. 17)) GO TO 310 C CHECK RADIX IF (I .EQ. 19) STYPE = 16 IF (I .EQ. 28) STYPE = 8 IF (I .EQ. 26) STYPE = 8 IF (STYPE .NE. 0) GO TO 325 IF (ACCUM(ACCLEN) .EQ. 13) GO TO 315 IF (ACCUM(ACCLEN) .EQ. 15) GO TO 318 STYPE = 10 GO TO 320 315 STYPE = 2 ACCLEN = ACCLEN - 1 GO TO 320 318 STYPE = 10 ACCLEN = ACCLEN -1 320 CALL DECIBP 325 DO 330 I=1,ACCLEN J = ACCUM(I) -2 IF (J.GE.STYPE) GO TO 340 330 CONTINUE GO TO 999 340 STYPE = 1 GO TO 999 350 STYPE = 1 351 I = GNC(0) IF ((I .GE. 2) .AND. (I .LE. 17)) GO TO 351 CALL DECIBP GO TO 999 C SPECIAL CHARACTER (TEST FOR QUOTE) 400 CONTINUE IF (I .EQ. 46) GO TO 500 TYPE = SPECL ACCLEN = 1 ACCUM(1) = I IF (I .NE. 41) GO TO 999 I = GNC(0) C LOOK FOR COMMENT IF (I .EQ. 47) GO TO 410 CALL DECIBP GO TO 999 C COMMENT FOUND 410 I = GNC (0) IF (I .EQ. 0) GO TO 100 IF (I .NE. 47) GO TO 410 I = GNC(0) IF (I .EQ. 41) GO TO 420 CALL DECIBP GO TO 410 420 ACCLEN = 0 GO TO 50 C CONTINUE WITH STRING 499 CALL DECIBP C STRING QUOTE 500 TYPE = STR ACCUM(1) = 1 510 I = GNC(0) IF (I .EQ. 46) GO TO 530 520 ACCLEN = ACCLEN +1 ACCUM(ACCLEN) = I IF (ACCLEN .LT. 32) GO TO 510 STYPE = CONT GO TO 999 C STRING QUOTE FOUND (ENDING, MAYBE) 530 I = GNC(0) IF (I. EQ. 46) GO TO 520 CALL DECIBP STYPE = 0 C THE CODE BELOW IS HERE TO SATISFY THE SYNTAX ANALYZER 999 IF (TYPE.EQ.EOFLAG) GO TO 2000 TOKEN = STRV IF (TYPE .EQ. STR) RETURN TOKEN = 0 IF (ACCLEN .GT. VIL) GO TO 3000 C SEARCH FOR TOKEN IN VOCABULARY J = VINDX(ACCLEN)+1 K = VINDX(ACCLEN+1) DO 1300 I=J,K L = VLOC(I) LP = L + V(L) L = L + 1 N = 1 DO 1200 M=L,LP IF (ACCUM(N) .NE. V(M)) GO TO 1300 1200 N = N + 1 TOKEN = I-1 GO TO 1400 1300 CONTINUE GO TO 3000 1400 RETURN 2000 TOKEN = EOFILE RETURN 3000 IF (TYPE .NE. IDENT) GO TO 4000 TOKEN = IDENTV L = MACTOP 3100 L = MACROS(L) IF (L .EQ. 0) GO TO 3400 K = MACROS(L+1) IF (K .NE. ACCLEN) GO TO 3100 I = L+2 DO 3200 J=1,K IF (ACCUM(J) .NE. MACROS(I)) GO TO 3100 3200 I = I + 1 C MACRO FOUND, SET-UP MACRO TABLE AND RESCAN CURMAC = CURMAC - 1 IF (CURMAC .GT. MACTOP) GO TO 3300 CALL ERROR(8,5) CURMAC = MAXMAC 3300 J = I + MACROS(I) MACROS(CURMAC) = SHL(I,12)+J GO TO 10 3400 CONTINUE 4000 IF (TYPE .EQ. NUMB) TOKEN = NUMBV RETURN END INTEGER FUNCTION WRDATA(SY) INTEGER SY INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER LOGICAL DFLAG INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 C IF SY IS NEGATIVE, THE CALL COMES FROM SYNTH -- DATA IS INSERTED C INLINE BY CALLING LIT WITH EACH BYTE VALUE. C C IF SY IS POSITIVE, THE CALL COMES FROM DUMPIN -- C WRDATA WRITES DATA INTO THE OUTPUT FILE FROM SYMBOL AT LOCATION C 'SY' EACH BYTE VALUE IS WRITTEN AS A PAIR OF BASE 32 DIGITS. C THE HIGH ORDER BIT OF THE FIRST DIGIT IS 1, AND ALL REMAINING HIGH C ORDER DIGITS ARE ZERO. THE VALUE RETURNED BY WRDATA IS THE TOTAL C NUMBER OF BYTES WRITTEN. C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER ASCII(64) COMMON /ASC/ASCII INTEGER SHL, SHR, RIGHT NBYTES = 0 J = IABS(SY) C C CHECK PRECISION OF VALUE K = SYMBOL(J+1) C SET DFLAG TO TRUE IF WE ARE DUMPING A VARIABLE OR LABEL NAME L = RIGHT(K,4) DFLAG = (L.EQ.LABEL).OR.(L.EQ.VARB).OR.(L.EQ.PROC) L = RIGHT(SHR(K,4),4) IF ((L.GT.2).OR.DFLAG) GO TO 400 C C SINGLE OR DOUBLE BYTE CONSTANT KP = SHR(K,8) K = 16 NBYTES = L C 200 IF (L.LE.0) GO TO 9999 C PROCESS NEXT BYTE L = L - 1 N = RIGHT(SHR(KP,L*8),8) IF (SY.LT.0) GO TO 350 C N IS THEN WRITTEN IN TWO PARTS DO 300 I=1,2 K = RIGHT(SHR(N,(2-I)*4),4) + K + 2 CALL PAD(1,K,1) 300 K = 0 C GO TO 200 C C OTHERWISE EMIT DATA INLINE 350 CALL EMIT(N,LIT) GO TO 200 C C WRITE OUT STRING DATA 400 CONTINUE L = RIGHT(IABS(SYMBOL(J)),12) J = J + 1 K = 16 N = - 1 NP = (PACK-1)*6 LP = 1 C 500 IF (LP.GT.L) GO TO 9999 IF (N.GE.0) GO TO 600 N = NP J = J + 1 M = SYMBOL(J) C 600 CONTINUE NBYTES = NBYTES + 1 KP = RIGHT(SHR(M,N),6)+1 IF (DFLAG) GO TO 900 KP = ASCII(KP) C C WRITE OUT BOTH HEX VALUES IF (SY.LT.0) GO TO 800 C DO 700 IP=1,2 K = RIGHT(SHR(KP,(2-IP)*4),4) + K + 2 CALL PAD(1,K,1) 700 K = 0 710 N = N - 6 LP = LP + 1 GO TO 500 C C EMIT STRING DATA INLINE 800 CALL EMIT(KP,LIT) GO TO 710 C C WRITE OUT THE VARIABLE OR LABEL NAME 900 CALL PAD(1,KP,1) GO TO 710 9999 WRDATA = NBYTES RETURN END SUBROUTINE DUMPCH C DUMP THE SYMBOLIC NAMES FOR THE SIMULATOR INTEGER SHR,SHL,RIGHT INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER INTEGER WRDATA INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER CONTRL(64) COMMON /CNTRL/CONTRL CALL WRITEL(0) KT = CONTRL(26) CONTRL(26) = CONTRL(32) KQ = CONTRL(34) CONTRL(34) = CONTRL(33) C K = 0 I = 2 IF (SYMBOL(2).EQ.0) I=0 CALL PAD(1,41,1) 200 IF (I.EQ.0) GO TO 1000 K = K + 1 J = SYMBOL(I+2) IF (J.LT.0) GO TO 400 J = MOD(J,16) IF ((J.NE.LABEL).AND.(J.NE.VARB).AND.(J.NE.PROC)) GO TO 400 C CHECK FOR NO CHARACTERS J = IABS(SYMBOL(I+1)) C CHECK FOR NO WORDS ALLOCATED IF (SHR(J,12).EQ.0) GO TO 400 C WRITE SYMBOL NUMBER M = K DO 300 L=1,3 CALL PAD(1,MOD(M,32)+2,1) M = M/32 300 CONTINUE C NOW WRITE THE STRING M = WRDATA(I+1) CALL PAD(1,41,1) 400 I = SYMBOL(I) GO TO 200 C 1000 CALL PAD(1,41,1) CALL WRITEL(0) CONTRL(26) = KT CONTRL(34) = KQ RETURN END SUBROUTINE SYNTH(PROD,SYMM) C C MP == LEFT , SP == RIGHT C C GLOBAL TABLES INTEGER V(446),VLOC(107),VINDX(13),C1(364),C1TRI(243),PRTB(129), 1PRDTB(129),HDTB(129),PRLEN(129),CONTC(129),LEFTC(5),LEFTI(57), 2CONTT(1),TRIPI(57),PRIND(107),NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 3PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 4PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV COMMON /SYNTAX/V,VLOC,VINDX,C1,C1TRI,PRTB,PRDTB,HDTB,PRLEN,CONTC, 1LEFTC,LEFTI,CONTT,TRIPI,PRIND,NSY,NT,VLEN,VIL,C1W,C1L,NC1TRI, 2PRTBL,PRDTBL,HDTBL,PRLENL,CONCL,LEFTCL,LEFTIL,CONTL,TRIPL,PRIL, 3PACK,TOKEN,IDENTV,NUMBV,STRV,DIVIDE,EOFILE,PROCV,SEMIV, *DECL,DOV,ENDV,GROUPV,STMTV,SLISTV INTEGER PROD,SYMM,SHL,SHR,RIGHT,ENTER,LOOKUP,WRDATA INTEGER CONTRL(64) COMMON /CNTRL/CONTRL INTEGER MSSG(77) COMMON /MESSAG/MSSG INTEGER SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK(75),VAR(75), 1 VARC(256),FIXV(75),FIXC(75),PRMASK(5) LOGICAL FAILSF,COMPIL COMMON /STACKS/SP,MP,MPP1,MSTACK,MVAR,VARTOP,PSTACK,VAR, 1 VARC,FIXV,FIXC,PRMASK,FAILSF,COMPIL INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP INTEGER VARB,INTR,PROC,LABEL,LITER COMMON /TYPES/VARB,INTR,PROC,LABEL,LITER INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM INTEGER PROCTP(30) COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM 1,PROCTP INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS, 1 ACNT INTEGER OPCVAL(51),OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 COMMON /OPCOD/ OPCVAL,OPR,ADR,VLU,DEF,LIT,LIN, *NOP,ADD,ADC,SUB,SBC,MUL,DIV,REM,NEG,AND,IOR,XOR,NOT,EQL,LSS,GTR, *NEQ,LEQ,GEQ,INX,TRA,TRC,PRO,RET,STO,STD,XCH,DEL,DAT,LOD,BIF,INC, *CSE,END,ENB,ENP,HAL,RTL,RTR,SFL,SFR,HIV,LOV,CVA,ORG,DRT,ENA,DIS, *AX1,AX2,AX3 INTEGER POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18) COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR INTEGER ASCII(64) COMMON /ASC/ASCII INTEGER INTPRO(8) COMMON /INTER/INTPRO IF(CONTRL(12).NE.0) CALL REDPR(PROD,SYMM) C 1 1 2 3 4 5 6 7 8 9 10 C 2 11 12 13 14 15 16 17 18 19 20 C 3 21 22 23 24 25 26 27 28 29 30 C 4 31 32 33 34 35 36 37 38 39 40 C 5 41 42 43 44 45 46 47 48 49 50 C 6 51 52 53 54 55 56 57 58 59 60 C 7 61 62 63 64 65 66 67 68 69 70 C 8 71 72 73 74 75 76 77 78 79 80 C 9 81 82 83 84 85 86 87 88 89 90 C A 91 92 93 94 95 96 97 98 99 100 C B 101 102 103 104 105 106 107 108 109 110 C C 111 112 113 114 115 116 117 118 119 120 C D 121 122 123 124 125 126 127 128 129 130 GO TO ( 1 100,99999,99999,99999,99999, 600,99999, 800,99999,99999, 2 99999, 800, 1300, 1340, 1360,99999,99999, 1500, 1600,99999, 3 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 4 2800, 2900,99999, 3100, 3200, 3300, 3400, 3500, 3540, 3600, 5 3700, 3800, 3700, 4000, 4100, 4200, 4300, 4350, 4400, 4500, 6 4600, 4700, 5000,99999,99999,99999,99999,99999, 5300, 5600, 7 5610, 5620, 5610, 5400, 5500,99999, 5700, 5800, 5900,99999, 8 6100, 6400, 6300, 6400, 6500, 6600, 6500, 6800, 6900, 6800, 9 7100, 7100,99999,99999,99999, 7500,99999, 7600, 7700,99999, 1 7900,99999, 8100,99999, 8300, 8400, 8400, 8400, 8400, 8400, 2 8400,99999, 9300, 9300, 9300, 9300, 9400,99999,10000,10000, 3 10000,10300,10310,10320,10400,10500,99999,10550,10560,10600, 4 10700,10800,10900,11000,11100,11200,11300,11400),PROD C P R O D U C T I O N S C ::= C ::= 100 CONTINUE IF (MP .NE. 5) CALL ERROR(10,1) COMPIL = .FALSE. CALL EXITB GO TO 99999 C ::= C ::= C ::= C ::= ; 600 IF (ACNT .LE. 0) GO TO 630 LTEMP=MAXSYM-ACNT I=SYMBOL(LTEMP) ACNT = ACNT - 1 IF (I.GT.0) GO TO 610 CALL EMIT(XCH,OPR) GO TO 620 610 J = SYMBOL(I-1) CALL EMIT(SHR(J,16),ADR) 620 IF(ACNT.GT.0) CALL EMIT(STO,OPR) GO TO 600 630 I = STD GO TO 88888 C ::= ; C ::= ; 800 CONTINUE I = DOPAR(CURBLK) I = RIGHT(I,2) IF (I.EQ.0) GO TO 99999 CALL ERROR(11,1) GO TO 99999 C ::= ; C ::= ; C ::= ; C ::= ; C ::= HALT 1300 I = HAL GO TO 88888 C ::= ENABLE; 1340 CONTINUE I = ENA GO TO 88888 C ::= DISABLE; 1360 CONTINUE I = DIS GO TO 88888 C ::= ; C ::=