Files
Digital-Research-Source-Code/ASSEMBLY & COMPILE TOOLS/PLM COMPILER/PLM81.FOR
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

3656 lines
124 KiB
Fortran
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 <PROGRAM> ::= <STATEMENT LIST>
C <STATEMENT LIST> ::= <STATEMENT>
100 CONTINUE
IF (MP .NE. 5) CALL ERROR(10,1)
COMPIL = .FALSE.
CALL EXITB
GO TO 99999
C <STATEMENT LIST> ::= <STATEMENT LIST> <STATEMENT>
C <STATEMENT> ::= <BASIC STATEMENT>
C <STATEMENT> ::= <IF STATEMENT>
C <BASIC STATEMENT> ::= <ASSIGNMENT> ;
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 <BASIC STATEMENT> ::= <GROUP> ;
C <BASIC STATEMENT> ::= <PROCEDURE DEFINITION> ;
800 CONTINUE
I = DOPAR(CURBLK)
I = RIGHT(I,2)
IF (I.EQ.0) GO TO 99999
CALL ERROR(11,1)
GO TO 99999
C <BASIC STATEMENT> ::= <RETURN STATEMENT> ;
C <BASIC STATEMENT> ::= <CALL STATEMENT> ;
C <BASIC STATEMENT> ::= <GO TO STATEMENT> ;
C <BASIC STATEMENT> ::= <DECLARATION STATEMENT> ;
C <BASIC STATEMENT> ::= HALT
1300 I = HAL
GO TO 88888
C <BASIC STATEMENT> ::= ENABLE;
1340 CONTINUE
I = ENA
GO TO 88888
C <BASIC STATEMENT> ::= DISABLE;
1360 CONTINUE
I = DIS
GO TO 88888
C <BASIC STATEMENT> ::= ;
C <BASIC STATEMENT> ::= <LABEL DEFINITION> <BASIC STATEMENT>
1500 I = FIXV(MP)
GO TO 1610
C <IF STATEMENT> ::= <IF CLAUSE> <STATEMENT>
1600 I = FIXV(MP)
1610 J = SYMBOL(I-1)
CALL EMIT(SHR(J,16),DEF)
SYMBOL(I+1) = 64+LABEL
GO TO 99999
C <IF STATEMENT> ::= <IF CLAUSE> <TRUE PART> <STATEMENT>
C <IF STATEMENT> ::= <LABEL DEFINITION> <IF STATEMENT>
C <IF CLAUSE> ::= IF <EXPRESSION> THEN
1800 I = ENTER(-LABEL)
J = SYMBOL(I-1)
CALL EMIT(SHR(J,16),VLU)
CALL EMIT(TRC,OPR)
FIXV(MP) = I
GO TO 99999
C <TRUE PART> ::= <BASIC STATEMENT> ELSE
1900 I = ENTER(-LABEL)
J = SYMBOL(I-1)
CALL EMIT(SHR(J,16),VLU)
CALL EMIT(TRA,OPR)
J = FIXV(MP-1)
FIXV(MP-1) = I
I = J
GO TO 1610
C <GROUP> ::= <GROUP HEAD> <ENDING>
2000 IF (FIXV(SP).GT.0) CALL ERROR(12,1)
IF (FIXC(SP).LT.0) FIXC(MP) = 0
I = DOPAR(CURBLK+1)
J = RIGHT(I,2) + 1
I = SHR(I,2)
GO TO (2060,2050,2040,2005),J
C GENERATE DESTINATION OF CASE BRANCH
2005 J = RIGHT(I,14)
K = SHR(SYMBOL(J-1),16)
CALL EMIT(K,DEF)
M = SHR(SYMBOL(J+1),8)
SYMBOL(J+1) = RIGHT(SYMBOL(J+1),8)
C M IS SYMBOL NUMBER OF LABEL AT END OF JUMP TABLE
CALL EMIT(CSE,OPR)
C DEFINE THE JUMP TABLE
I = SHR(I,14)
C REVERSE THE LABEL LIST
L = 0
2010 IF (I.EQ.0) GO TO 2020
K = SYMBOL(I+1)
SYMBOL(I+1) = SHL(L,8)+RIGHT(K,8)
L = I
I = SHR(K,8)
GO TO 2010
C EMIT LIST STARTING AT L
2020 I = SYMBOL(L+1)
SYMBOL(L+1) = 64 + LABEL
J = SHR(I,8)
IF (J.EQ.0) GO TO 2030
K = SHR(SYMBOL(L-1),16)
2025 CALL EMIT(K,VLU)
CALL EMIT(AX2,OPR)
L = J
GO TO 2020
2030 CONTINUE
C DEFINE END OF JUMP TABLE
CALL EMIT(M,DEF)
GO TO 99999
C DEFINE END OF WHILE STATEMENT
2040 J = SHR(I,14)
I = RIGHT(I,14)
CALL EMIT(J,VLU)
CALL EMIT(TRA,OPR)
CALL EMIT(I,DEF)
GO TO 99999
C END OF ITERATIVE STATEMENT
2050 K = FIXV(MP)
IF (K.EQ.0) GO TO 2040
C OTHERWISE INCREMENT VARIABLE
CALL EMIT(K,VLU)
CALL EMIT(INC,OPR)
CALL EMIT(K,ADR)
CALL EMIT(STD,OPR)
C DEFINE ENDING BRANCH AND LABEL
GO TO 2040
2060 I = END
GO TO 88888
C <GROUP HEAD> ::= DO ;
2100 CALL ENTERB
I = ENB
GO TO 88888
C <GROUP HEAD> ::= DO <STEP DEFINITION> ;
2200 CALL ENTERB
DOPAR(CURBLK) = 1 + SHL(FIXV(MP+1),2)
GO TO 99999
C <GROUP HEAD> ::= DO <WHILE CLAUSE> ;
2300 CALL ENTERB
DOPAR(CURBLK) = 2 + SHL(FIXV(MP+1),2)
GO TO 99999
C <GROUP HEAD> ::= DO <CASE SELECTOR> ;
2400 CALL ENTERB
K = ENTER(-(64+LABEL))
K = SHR(SYMBOL(K-1),16)
C K IS LABEL AFTER CASE JUMP TABLE
I = ENTER(-(SHL(K,8)+64+LABEL))
J = SHR(SYMBOL(I-1),16)
CALL EMIT(J,VLU)
CALL EMIT(AX1,OPR)
DOPAR(CURBLK) = SHL(I,2)+3
2410 I = DOPAR(CURBLK)
K = SHR(I,16)
J = ENTER(-(SHL(K,8)+64+LABEL))
DOPAR(CURBLK) = SHL(J,16) + RIGHT(I,16)
J = SHR(SYMBOL(J-1),16)
CALL EMIT(J,DEF)
GO TO 99999
C <GROUP HEAD> ::= <GROUP HEAD> <STATEMENT>
2500 CONTINUE
I = DOPAR(CURBLK)
IF (RIGHT(I,2).NE.3) GO TO 99999
C OTHERWISE CASE STMT
J = RIGHT(SHR(I,2),14)
J = SYMBOL(J+1)
J = SHR(J,8)
CALL EMIT(J,VLU)
CALL EMIT(TRA,OPR)
GO TO 2410
C <STEP DEFINITION> ::= <VARIABLE> <REPLACE> <EXPRESSION> <ITERATION
C
2600 I = FIXV(MP)
J = FIXV(MP+3)
IF (J.GE.0) I = 0
C PLACE <VARIABLE> SYMBOL NUMBER INTO DO SLOT
FIXV(MP-1) = I
FIXV(MP) = IABS(J)
GO TO 99999
C <ITERATION CONTROL> ::= <TO> <EXPRESSION>
2700 CALL EMIT(LEQ,OPR)
I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
CALL EMIT(I,VLU)
CALL EMIT(TRC,OPR)
FIXV(MP) = - (SHL(FIXV(MP),14)+I)
C SEND -(BACK BRANCH NUMBER/END LOOP NUMBER)
GO TO 99999
C <ITERATION CONTROL> ::= <TO> <EXPRESSION> <BY> <EXPRESSION>
2800 I = FIXV(MP-3)
C I = SYMBOL NUMBER OF INDEXING VARIABLE
CALL EMIT(I,VLU)
CALL EMIT(ADD,OPR)
CALL EMIT(I,ADR)
CALL EMIT(STD,OPR)
C BRANCH TO COMPARE
I = FIXV(MP+2)
J = SHR(I,14)
CALL EMIT(J,VLU)
CALL EMIT(TRA,OPR)
C DEFINE BEGINNING OF STATEMENTS
J = RIGHT(I,14)
CALL EMIT(J,DEF)
C <TO> ALREADY HAS (BACK BRANCH NUMBER/END LOOP NUMBER)
GO TO 99999
C <WHILE CLAUSE> ::= <WHILE> <EXPRESSION>
2900 I = ENTER(-(64+LABEL))
J = FIXV(MP)
I = SHR(SYMBOL(I-1),16)
FIXV(MP) = SHL(J,14)+I
C (BACK BRANCH NUMBER/END LOOP NUMBER)
CALL EMIT(I,VLU)
I = TRC
GO TO 88888
C <CASE SELECTOR> ::= CASE <EXPRESSION>
C <PROCEDURE DEFINITION> ::= <PROCEDURE HEAD> <STATEMENT LIST> <ENDI
3100 I = FIXV(MP)
K = SHR(I,15)
I = RIGHT(I,15)
J = FIXV(SP)
IF (J.LT.0) J = -J+1
IF ((J.NE.0).AND.(I.NE.J)) CALL ERROR(13,1)
I = SHR(SYMBOL(K-1),16)
CALL EMIT(END,OPR)
C EMIT A RET JUST IN CASE HE FORGOT IT
CALL EMIT(DRT,OPR)
CALL EMIT(I,DEF)
GO TO 99999
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> ;
3200 L = 0
K = 0
GO TO 3450
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <TYPE> ;
3300 L = 0
K = FIXV(SP-1)
GO TO 3510
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <PARAMETER LIST> ;
3400 L = FIXV(MP+1)
K = 0
3450 PROCTP(CURBLK)=1
GO TO 3520
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> <PARAMETER LIST> <TYPE> ;
3500 L = FIXV(MP+1)
K = FIXV(SP-1)
3510 PROCTP(CURBLK)=2
3520 I = FIXV(MP)
SYMBOL(I+1) = SHL(L,8)+SHL(K,4)+PROC
J = ENTER(-(64+LABEL))
FIXV(MP) = SHL(J,15) + I
J = SHR(SYMBOL(J-1),16)
CALL EMIT(J,VLU)
CALL EMIT(TRA,OPR)
I = SHR(SYMBOL(I-1),16)
CALL EMIT(I,DEF)
GO TO 99999
C <PROCEDURE HEAD> ::= <PROCEDURE NAME> INTERRUPT <NUMBER>;
3540 CONTINUE
C GET SYMBOL NUMBER
I = FIXV(MP)
I = SYMBOL(I-1)
I = SHR(I,16)
C GET INTERRUPT NUMBER
J = FIXV(SP-1)
IF (J.LE.7) GO TO 3550
CALL ERROR(39,1)
GO TO 3200
3550 J = J + 1
K = INTPRO(J)
C IS INTERRUPT DUPLICATED
IF (K.LE.0) GO TO 3560
CALL ERROR(40,1)
GO TO 3200
3560 INTPRO(J) = I
GO TO 3200
C <PROCEDURE NAME> ::= <LABEL DEFINITION> PROCEDURE
3600 CONTINUE
CALL ENTERB
I = ENP
GO TO 88888
C <PARAMETER LIST> ::= <PARAMETER HEAD> <IDENTIFIER> )
3700 CONTINUE
I = LOOKUP(SP-1)
IF (I.GE.BLKSYM) CALL ERROR(14,1)
I = ENTER(VARB)
FIXV(MP) = FIXV(MP)+1
GO TO 99999
C <PARAMETER HEAD> ::= (
3800 FIXV(MP) = 0
GO TO 99999
C <PARAMETER HEAD> ::= <PARAMETER HEAD> <IDENTIFIER> ,
C <ENDING> ::= END
4000 CALL EXITB
FIXV(MP) = 0
GO TO 99999
C <ENDING> ::= END <IDENTIFIER>
4100 CALL EXITB
I = LOOKUP(SP)
IF (I .EQ. 0) CALL ERROR(15,1)
FIXV(MP) = I
GO TO 99999
C <ENDING> ::= <LABEL DEFINITION> <ENDING>
4200 FIXV(MP) = FIXV(SP)
GO TO 99999
C <LABEL DEFINITION> ::= <IDENTIFIER> :
4300 I = LOOKUP(MP)
IF (CURBLK.EQ.2) IP = 48
IF (CURBLK.NE.2) IP = 64
IF (I.GE.BLKSYM) GO TO 4310
C
C PREC = 3 IF USER-DEFINED OUTER BLOCK LABEL
C PREC = 4 IF USER-DEFINED LABEL NOT IN OUTER BLOCK
C PREC = 5 IF COMPILER-GENERATED LABEL
I = ENTER (IP+LABEL)
GO TO 4320
4310 J = SYMBOL(I+1)
J = RIGHT(SHR(J,4),4)
K = I + 1
IF (J.EQ.0) GO TO 4315
CALL ERROR(16,1)
SYMBOL(K) = SYMBOL(K) - J*16
4315 SYMBOL(K) = SYMBOL(K) + IP
4320 FIXV(MP) = I
IF (TOKEN .EQ. PROCV) GO TO 99999
I = SYMBOL(I-1)
CALL EMIT(SHR(I,16),DEF)
GO TO 99999
C <LABEL DEFINITION> ::= <NUMBER> :
4350 CONTINUE
I = ORG
J = MP
4360 K = FIXV(J)
IF (K.LE.65535) GO TO 4370
CALL ERROR(17,1)
GO TO 99999
4370 CONTINUE
L = LOOKUP(J)
IF (L.NE.0) GO TO 4380
C ENTER NUMBER
J = 1
IF (K.GT.255) J = 2
L = ENTER(SHL(K,8)+SHL(J,4)+LITER+1)
4380 L = SYMBOL(L-1)
CALL EMIT(SHR(L,16),VLU)
GO TO 88888
C <RETURN STATEMENT> ::= RETURN
4400 CALL EMIT(0,LIT)
I = RET
IF(PROCTP(CURBLK).EQ.2) CALL ERROR(45,1)
IF(PROCTP(CURBLK).EQ.0) CALL ERROR(46,1)
GO TO 88888
C <RETURN STATEMENT> ::= RETURN <EXPRESSION>
4500 I = RET
IF(PROCTP(CURBLK).EQ.1) CALL ERROR(44,1)
IF(PROCTP(CURBLK).EQ.0) CALL ERROR(46,1)
GO TO 88888
C <CALL STATEMENT> ::= CALL <VARIABLE>
4600 I = FIXV(SP)
IF (I.EQ.0) GO TO 99999
IF (I.GT.0) GO TO 4620
4610 CALL ERROR(18,1)
GO TO 99999
4620 J = SYMBOL(I+1)
J = RIGHT(J,4)
I = SHR(SYMBOL(I-1),16)
CALL EMIT(I,ADR)
I = 0
IF (J.EQ.PROC) I = PRO
IF (J.EQ.INTR) I = BIF
IF (I.EQ.0) GO TO 4610
GO TO 88888
C <GO TO STATEMENT> ::= <GO TO> <IDENTIFIER>
4700 CONTINUE
I = LOOKUP(SP)
IF(I .EQ. 0) I= ENTER(LABEL)
J=SYMBOL(I+1)
J = RIGHT(J,4)
IF ((J.EQ.LABEL).OR.(J.EQ.VARB)) GO TO 4710
CALL ERROR(19,1)
GO TO 99999
C INCREMENT THE REFERENCE COUNTER (USE LENGTH FIELD)
4710 IF (J.EQ.LABEL) SYMBOL(I+1) = SYMBOL(I+1) + 256
I = SYMBOL(I-1)
CALL EMIT(SHR(I,16),VLU)
I = TRA
GO TO 88888
C <GO TO STATEMENT> ::= <GOTO> <NUMBER>
5000 J = SP
I = TRA
GO TO 4360
C <GO TO> ::= GO TO
C <GO TO> ::= GOTO
C <DECLARATION STATEMENT> ::= DECLARE <DECLARATION ELEMENT>
C <DECLARATION STATEMENT> ::= <DECLARATION STATEMENT> , <DECLARATION
C
C <DECLARATION ELEMENT> ::= <TYPE DECLARATION>
C <DECLARATION ELEMENT> ::= <IDENTIFIER> LITERALLY <STRING>
5300 CONTINUE
L = MP
K = MACTOP
DO 5330 M = 1,2
I = VAR(L)
IP = SHR(I,12)
I = RIGHT(I,12)-1
K = K + 1
IF (K .GE. CURMAC) GO TO 5390
MACROS(K) = IP
DO 5320 J=1,IP
K = K + 1
IF (K .GE. CURMAC) GO TO 5390
LTEMP=I+J
MACROS(K)=VARC(LTEMP)
5320 CONTINUE
L = SP
5330 CONTINUE
C
K = K + 1
IF (K .GE. CURMAC) GO TO 5390
MACROS(K) = MACTOP
MACTOP = K
GO TO 99999
5390 CALL ERROR(20,5)
GO TO 99999
C <TYPE DECLARATION> ::= <IDENTIFIER SPECIFICATION> <TYPE>
5400 N = 1
5410 I = FIXV(MP)
J = SHR(I,15)
I = RIGHT(I,15)
K = FIXV(SP)
DO 5420 L = J,I
M = SYMBOL(L)+1
IP = SYMBOL(M)
IF (K.NE.0) GO TO 5430
IF (IP.NE.1) CALL ERROR(21,1)
IP = LABEL
5430 CONTINUE
SYMBOL(M) = SHL(N,8)+SHL(K,4)+RIGHT(IABS(IP),4)
IF (IP .LT. 0) SYMBOL(M) = - SYMBOL(M)
5420 CONTINUE
C
MAXSYM = I
FIXV(MP) = SYMBOL(I)
GO TO 99999
C <TYPE DECLARATION> ::= <BOUND HEAD> <NUMBER> ) <TYPE>
5500 N = FIXV(MP+1)
GO TO 5410
C <TYPE DECLARATION> ::= <TYPE DECLARATION> <INITIAL LIST>
C <DECLARATION ELEMENT> ::= <IDENTIFIER> <DATA LIST>
5600 I = FIXV(MP)+1
J = FIXV(MP+1)
L = RIGHT(J,16)
SYMBOL(I) = SHL(L,8) + SYMBOL(I)
J = SHR(J,16)
CALL EMIT(DAT,OPR)
CALL EMIT(J,DEF)
I = DAT
GO TO 99999
C <DATA LIST> ::= <DATA HEAD> <CONSTANT> )
5610 I = FIXV(MP+1)
FIXV(MP) = FIXV(MP) + WRDATA(-I)
GO TO 99999
C <DATA HEAD> ::= DATA (
5620 J = ENTER(-(64+LABEL))
J = SHR(SYMBOL(J-1),16)
CALL EMIT(J,VLU)
CALL EMIT(TRA,OPR)
FIXV(MP) = SHL(J,16)
I = LOOKUP(MP-1)
IF (I.LE.BLKSYM) GO TO 5630
CALL ERROR(22,1)
C SET PRECISION OF INLINE DATA TO 3
5630 I = ENTER(48+VARB)
FIXV(MP-1) = I
I = SHR(SYMBOL(I-1),16)
CALL EMIT(DAT,OPR)
CALL EMIT(I,DEF)
C COUNT THE NUMBER OF BYTES EMITTED
GO TO 99999
C <DATA HEAD> ::= <DATA HEAD> <CONSTANT> ,
C <TYPE> ::= BYTE
5700 FIXV(MP) = 1
GO TO 99999
C <TYPE> ::= ADDRESS
5800 FIXV(MP) = 2
GO TO 99999
C <TYPE> ::= LABEL
5900 FIXV(MP) = 0
GO TO 99999
C <BOUND HEAD> ::= <IDENTIFIER SPECIFICATION> (
C <IDENTIFIER SPECIFICATION> ::= <VARIABLE NAME>
6100 SYMBOL(MAXSYM) = FIXV(MP)
FIXV(MP) = SHL(MAXSYM,15)+MAXSYM
GO TO 99999
C <IDENTIFIER SPECIFICATION> ::= <IDENTIFIER LIST> <VARIABLE NAME> )
C <IDENTIFIER LIST> ::= (
6300 FIXV(MP) = MAXSYM
GO TO 99999
C <IDENTIFIER LIST> ::= <IDENTIFIER LIST> <VARIABLE NAME> ,
6400 IF (SYMTOP .LT. MAXSYM) GO TO 6420
6410 CALL ERROR(23,5)
MAXSYM = SYMABS
6420 SYMBOL(MAXSYM) = FIXV(MP+1)
FIXV(MP) = SHL(MAXSYM,15)+RIGHT(FIXV(MP),15)
MAXSYM=MAXSYM-1
GO TO 99999
C <VARIABLE NAME> ::= <IDENTIFIER>
6500 CONTINUE
I = LOOKUP(MP)
IF (I.GT.BLKSYM) GO TO 6520
I = ENTER(VARB)
GO TO 6540
6520 J = RIGHT(SYMBOL(I+1),8)
IF (J.EQ.VARB) GO TO 6540
CALL ERROR(24,1)
6540 FIXV(MP) = I
GO TO 99999
C <VARIABLE NAME> ::= <BASED VARIABLE> <IDENTIFIER>
6600 I = FIXV(MP)
J = SYMTOP
SYMTOP = SYMTOP + 1
IF (SYMTOP .LE. MAXSYM) GO TO 6620
SYMTOP = SYMTOP - 1
CALL ERROR(25,5)
GO TO 99999
6620 SYMBOL(SYMTOP) = SYMBOL(J)
K = LOOKUP(SP)
IF (K .NE. 0) GO TO 6630
K = ENTER(VARB)
GO TO 6640
6630 L = SYMBOL(K+1)
L = RIGHT(L,4)
IF (L.EQ.VARB) GO TO 6640
CALL ERROR(26,1)
GO TO 99999
6640 K = SYMBOL(K-1)
SYMBOL(J) = SHR(K,16)
I = I + 1
SYMBOL(I) = - SYMBOL(I)
GO TO 99999
C <BASED VARIABLE> ::= <IDENTIFIER> BASED
C <INITIAL LIST> ::= <INITIAL HEAD> <CONSTANT> )
6800 CONTINUE
I = FIXV(MP)
IF (MAXSYM.LE.SYMTOP) GO TO 6410
SYMBOL(I) = SYMBOL(I)+1
I = FIXV(MP+1)
I = SHL(SHR(SYMBOL(I-1),16),16) + I
SYMBOL(MAXSYM) = I
MAXSYM = MAXSYM - 1
GO TO 99999
C <INITIAL HEAD> ::= INITIAL (
6900 CONTINUE
I = FIXV(MP-1)
FIXV(MP) = MAXSYM
J = MAXSYM
MAXSYM = MAXSYM - 1
IF (MAXSYM .LE. SYMTOP) GO TO 6410
I = SHR(SYMBOL(I-1),16)
SYMBOL(J) = SHL(I,15)
GO TO 99999
C <INITIAL HEAD> ::= <INITIAL HEAD> <CONSTANT> ,
C <ASSIGNMENT> ::= <VARIABLE> <REPLACE> <EXPRESSION>
7100 ACNT = ACNT + 1
I = MAXSYM - ACNT
IF (I.GT.SYMTOP) GO TO 7110
CALL ERROR(27,5)
ACNT = 0
GO TO 99999
7110 SYMBOL(I) = FIXV(MP)
C CHECK FOR PROCEDURE ON LHS OF ASSIGNMENT.
C ****NOTE THAT THIS IS DEPENDENT ON SYMBOL NUMBER OF OUTPUT=17****
IF(FIXV(MP).NE.0.OR.FIXC(MP).EQ.17) GO TO 99999
CALL ERROR(41,1)
GO TO 99999
C <ASSIGNMENT> ::= <LEFT PART> <ASSIGNMENT>
C <REPLACE> ::= =
C <LEFT PART> ::= <VARIABLE> ,
C <EXPRESSION> ::= <LOGICAL EXPRESSION>
C <EXPRESSION> ::= <VARIABLE> : = <EXPRESSION>
7500 CONTINUE
I = STO
J = FIXV(MP)
IF(FIXV(MP).EQ.0) CALL ERROR(41,1)
IF (J.LT.0) GO TO 7510
J = SYMBOL(J-1)
CALL EMIT(SHR(J,16),ADR)
GO TO 88888
7510 CALL EMIT(XCH,OPR)
GO TO 88888
C
C <EXPRESSION> ::= <LOGICAL FACTOR>
C <EXPRESSION> ::= <EXPRESSION> OR <LOGICAL FACTOR>
7600 I = IOR
GO TO 88888
C <EXPRESSION> ::= <EXPRESSION> XOR <LOGICAL FACTOR>
7700 I = XOR
GO TO 88888
C <LOGICAL FACTOR> ::= <LOGICAL SECONDARY>
C <LOGICAL FACTOR> ::= <LOGICAL FACTOR> AND <LOGICAL SECONDARY>
7900 I = AND
GO TO 88888
C <LOGICAL SECONDARY> ::= <LOGICAL PRIMARY>
C <LOGICAL SECONDARY> ::= NOT <LOGICAL PRIMARY>
8100 I = NOT
GO TO 88888
C <LOGICAL PRIMARY> ::= <STRING EXPRESSION>
C <LOGICAL PRIMARY> ::= <STRING EXPRESSION> <RELATION> <STRING EXPRE
8300 I = FIXV(MP+1)
GO TO 88888
C
C * NOTE THAT THE CODE THAT FOLLOWS DEPENDS UPON FIXED PRODUCTION #
8400 FIXV(MP) = (PROD-96) + EQL
C THE 96 COMES FROM THE PRODUCTION NUMBER FOR =
GO TO 99999
C <RELATION> ::= =
C <RELATION> ::= <
C <RELATION> ::= >
C <RELATION> ::= < >
C <RELATION> ::= < =
C <RELATION> ::= > =
C <STRING EXPRESSION> ::= <ARITHMETIC EXPRESSION>
C
C <ARITHMETIC EXPRESSION> ::= <TERM>
C * NOTE THAT THE FOLLOWING CODE DPENDS UPON FIXED PROD NUMBERS
9300 I = (PROD-103) + ADD
C *** THE VALUES OF ADC AND SUB WERE ACCIDENTILY REVERSED ***
IF ((I.EQ.ADC).OR.(I.EQ.SUB)) I = 5-I
GO TO 88888
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> + <TERM>
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> - <TERM>
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> PLUS <TERM>
C <ARITHMETIC EXPRESSION> ::= <ARITHMETIC EXPRESSION> MINUS <TERM>
C <ARITHMETIC EXPRESSION> ::= - <TERM>
9400 CONTINUE
CALL EMIT(0,LIT)
CALL EMIT(XCH,OPR)
I = SUB
GO TO 88888
C
C <TERM> ::= <PRIMARY>
C * NOTE THAT THE FOLLOWING CODE DEPENDS UPON FIXED PROD NUMBERS
10000 I = (PROD-109) + MUL
GO TO 88888
C <TERM> ::= <TERM> * <PRIMARY>
C <TERM> ::= <TERM> / <PRIMARY>
C <TERM> ::= <TERM> MOD <PRIMARY>
C <PRIMARY> ::= <CONSTANT>
10300 I = FIXV(MP)
I = SYMBOL(I-1)
CALL EMIT(SHR(I,16),VLU)
GO TO 99999
C <PRIMARY> ::= . <CONSTANT>
10310 I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
FIXV(MP) = I
CALL EMIT(I,VLU)
CALL EMIT(TRA,OPR)
CALL EMIT(DAT,OPR)
CALL EMIT(0,DEF)
C DROP THROUGH TO NEXT PRODUCTION
C <PRIMARY> ::= <CONSTANT HEAD> <CONSTANT> )
C ENTER HERE FROM ABOVE ALSO
10320 I = FIXV(MP+1)
I = WRDATA(-I)
CALL EMIT(DAT,OPR)
I = FIXV(MP)
CALL EMIT(I,DEF)
GO TO 99999
C <PRIMARY> ::= <VARIABLE>
10400 I = FIXV(MP)
IF (I.GT.0) GO TO 10450
IF (I.EQ.0) GO TO 99999
C SUBSCRIPTED VARIABLE
I = LOD
GO TO 88888
C SIMPLE VARIABLE
10450 J = SYMBOL(I-1)
CALL EMIT(SHR(J,16),VLU)
J = SYMBOL(I+1)
J = RIGHT(J,4)
IF (J.EQ.PROC) CALL EMIT(PRO,OPR)
IF (J.EQ.INTR) CALL EMIT(BIF,OPR)
GO TO 99999
C <PRIMARY> ::= . <VARIABLE>
10500 CONTINUE
I = FIXV(SP)
IF (I.GT.0) GO TO 10520
C SUBSCRIPTED - CHANGE PRECISION TO 2
IF (I.EQ.0) GO TO 10530
10510 I = CVA
GO TO 88888
C
10520 J = IABS(SYMBOL(I+1))
IF (RIGHT(J,4).EQ.VARB) GO TO 10540
10530 CALL ERROR(28,1)
GO TO 99999
10540 J = SYMBOL(I-1)
CALL EMIT(SHR(J,16),ADR)
GO TO 10510
C <PRIMARY> ::= ( <EXPRESSION> )
C <CONSTANT HEAD> ::= . (
10550 I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
FIXV(MP) = I
CALL EMIT(I,VLU)
CALL EMIT(TRA,OPR)
CALL EMIT(DAT,OPR)
CALL EMIT(0,DEF)
GO TO 99999
C <CONSTANT HEAD> ::= <CONSTANT HEAD> <CONSTANT> ,
10560 I = FIXV(MP+1)
I = WRDATA(-I)
GO TO 99999
C <VARIABLE> ::= <IDENTIFIER>
10600 CONTINUE
I = LOOKUP(MP)
IF (I .NE. 0) GO TO 10650
CALL ERROR(29,1)
I = ENTER(VARB)
10650 FIXV(MP) = I
J = IABS(SYMBOL(I+1))
J = RIGHT(J,4)
IF(J.EQ.LABEL) CALL ERROR(47,1)
IF ((J.NE.PROC).AND.(J.NE.INTR)) GO TO 99999
IF(SHR(SYMBOL(I+1),8).NE.0) CALL ERROR(38,1)
J=RIGHT(SHR(SYMBOL(I+1),4),4)
C IN THE STATEMENTS BELOW, 30 IS THE TOKEN FOR 'CALL'
IF(PSTACK(MP-1).EQ.30.AND.J.NE.0) CALL ERROR(42,1)
IF(PSTACK(MP-1).NE.30.AND.J.EQ.0) CALL ERROR(43,1)
I = SHR(SYMBOL(I-1),16)
I = (SHL(I,15)+I+1)
FIXC(MP) = 0
GO TO 10760
C <VARIABLE> ::= <SUBSCRIPT HEAD> <EXPRESSION> )
10700 I = FIXV(MP)
IF (I.LT.0) GO TO 10740
FIXV(MP) = - I
I = INX
GO TO 88888
10740 I = -I
CALL EMIT(RIGHT(I,15),ADR)
IF (FIXC(MP).NE.1) CALL EMIT(STD,OPR)
IF(IABS(FIXC(MP)).EQ.0) CALL ERROR(37,1)
IF(IABS(FIXC(MP)).GT.1) CALL ERROR(38,1)
10760 CONTINUE
CALL EMIT(SHR(I,15),VLU)
FIXC(MP)=SHR(I,15)
I = PRO
FIXV(MP) = 0
GO TO 88888
C <SUBSCRIPT HEAD> ::= <IDENTIFIER> (
10800 I = LOOKUP(MP)
IF (I.NE.0) GO TO 10840
CALL ERROR(30,1)
I = ENTER(VARB)
10840 J = IABS(SYMBOL(I+1))
J = RIGHT(J,4)
IF (J.EQ.VARB) GO TO 10860
IF ((J.EQ.PROC).OR.(J.EQ.INTR)) GO TO 10880
CALL ERROR(31,1)
10860 FIXV(MP) = I
I = SYMBOL(I-1)
CALL EMIT(SHR(I,16),ADR)
GO TO 99999
10880 FIXC(MP) = SHR(SYMBOL(I+1),8)
IF (J.EQ.INTR) FIXC(MP) = -FIXC(MP)
J=RIGHT(SHR(SYMBOL(I+1),4),4)
C IN THE STATEMENTS BELOW, 30 IS THE TOKEN FOR 'CALL'
IF(PSTACK(MP-1).EQ.30.AND.J.NE.0) CALL ERROR(42,1)
IF(PSTACK(MP-1).NE.30.AND.J.EQ.0) CALL ERROR(43,1)
I = SHR(SYMBOL(I-1),16)
FIXV(MP) = -(SHL(I,15)+I+1)
GO TO 99999
C <SUBSCRIPT HEAD> ::= <SUBSCRIPT HEAD> <EXPRESSION> ,
10900 I = -FIXV(MP)
IF (I .GT. 0) GO TO 10910
CALL ERROR(32,1)
GO TO 99999
10910 FIXV(MP) = -(I+1)
J = RIGHT(I,15)
CALL EMIT(J,ADR)
IF (FIXC(MP).NE.0) GO TO 10920
CALL ERROR(37,1)
GO TO 99999
10920 IF (FIXC(MP).NE.2) CALL EMIT(STD,OPR)
I = -1
IF (FIXC(MP).LT.0) I = 1
FIXC(MP) = FIXC (MP) + I
GO TO 99999
C <CONSTANT> ::= <STRING>
11000 CONTINUE
C MAY WISH TO TREAT THIS STRING AS A CONSTANT LATER
J = VAR(SP)
I = SHR(J,12)
L = 3
K = 0
IF ((I.LE.0).OR.(I.GT.2)) GO TO 11010
C CONVERT INTERNAL CHARACTER FORM TO ASCII
J = RIGHT(J,12)
K = 0
DO 11005 L = 1,I
LTEMP=J+L-1
KP=VARC(LTEMP)
K = K * 256 + ASCII(KP)
11005 CONTINUE
L = I
11010 I = LOOKUP(SP)
IF (I.EQ.0) I = ENTER(SHL(K,8)+SHL(L,4)+LITER)
FIXV(MP) = I
GO TO 99999
C <CONSTANT> :: = <NUMBER>
11100 CONTINUE
I = LOOKUP(SP)
IF (I.NE.0) GO TO 11120
C ENTER NUMBER INTO SYMBOL TABLE
I = FIXV(MP)
J = 1
IF (I.GT.255) J=2
I = ENTER(SHL(I,8)+SHL(J,4)+LITER+1)
11120 FIXV(MP) = I
GO TO 99999
C <TO> ::= TO
11200 CONTINUE
I = FIXV(MP-3)
IF (I .GT. 0) GO TO 11210
CALL ERROR(33,1)
FIXV(MP) = 1
GO TO 99999
11210 I = SYMBOL(I-1)
I = SHR(I,16)
FIXV(MP-3) = I
CALL EMIT(I,ADR)
CALL EMIT(STD,OPR)
J = ENTER(-(64+LABEL))
J = SHR(SYMBOL(J-1),16)
CALL EMIT(J,DEF)
FIXV(MP) = J
CALL EMIT(I,VLU)
GO TO 99999
C <BY> ::= BY
11300 CONTINUE
CALL EMIT(LEQ,OPR)
I = ENTER(-(64+LABEL))
C SAVE SYMBOL NUMBER AT <TO> (END LOOP NUMBER)
I = SHR(SYMBOL(I-1),16)
J = FIXV(MP-2)
FIXV(MP-2) = I
CALL EMIT(I,VLU)
CALL EMIT(TRC,OPR)
I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
FIXV(MP) = SHL(J,14)+I
C <BY> IS (TO NUMBER/STATEMENT NUMBER)
CALL EMIT(I,VLU)
CALL EMIT(TRA,OPR)
C NOW DEFINE BY LABEL
I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
C SAVE BY LABEL IN <TO> AS BRANCH BACK NUMBER
FIXV(MP-2)=SHL(I,14)+FIXV(MP-2)
CALL EMIT(I,DEF)
GO TO 99999
C <WHILE> ::= WHILE
11400 CONTINUE
I = ENTER(-(64+LABEL))
I = SHR(SYMBOL(I-1),16)
CALL EMIT(I,DEF)
FIXV(MP) = I
GO TO 99999
88888 CALL EMIT(I,OPR)
99999 RETURN
END
INTEGER FUNCTION GNC(Q)
C GET NEXT CHARACTER FROM THE INPUT STREAM (OR 0 IF
C NO CHARACTER IS FOUND)
C
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 SHL,SHR,RIGHT
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 BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
INTEGER PROCTP(30)
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
1,PROCTP
INTEGER MACROS(500),MAXMAC,CURMAC,MACTOP
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
INTEGER Q
4000 IF(CURMAC .LE. MAXMAC) GO TO 2000
IF (IBP .LE. CONTRL(29)) GO TO 200
C READ ANOTHER RECORD FROM COMMAND STREAM
IF (CONTRL(31) .EQ. 0) GO TO 1
IF(CONTRL(20).EQ. 1) CALL PAD(0,1,1)
CALL WRITEL(0)
1 IFILE = CONTRL(20)
READ(IFILE,1000) IBUFF
100 DO 110 I=1,80
J = IBUFF(I)
J = ICON(J)
IBUFF(I) = ITRAN(J)
110 CONTINUE
C
LP = CONTRL(23)
IF (IBUFF(LP).EQ.38) GO TO 300
115 IBP = LP
CONTRL(14) = CONTRL(14) + 1
CALL EMIT(CONTRL(14),LIN)
IF (CONTRL(27).EQ.0) GO TO 200
CALL CONOUT(0,5,CONTRL(14),10)
CALL CONOUT(1,-3,CURBLK-1,10)
CALL PAD(1,1,3)
IF (CONTRL(23) .EQ. 1) GO TO 120
CALL FORM(1,IBUFF,1,CONTRL(23)-1,80)
CALL PAD(1,1,3)
120 CALL FORM(1,IBUFF,CONTRL(23),CONTRL(29),80)
IF(CONTRL(29) .EQ. 80) GO TO 130
CALL PAD(1,1,3)
CALL FORM(1,IBUFF,CONTRL(29)+1,80,80)
130 CONTINUE
200 GNC = IBUFF(IBP)
IBP = IBP + 1
RETURN
300 CONTINUE
IF(IBUFF(2) .EQ. 1) GO TO 115
LP = LP + 1
C SCANNER PARAMETERS FOLLOW
305 J = IBUFF(LP)
IF (J.EQ.38) GO TO 400
LP = LP + 1
C
DO 310 I=LP,80
II = I
IF (IBUFF(I) .EQ. 39) GO TO 330
IF (IBUFF(I).EQ.38) GO TO 315
310 CONTINUE
C
315 K = CONTRL(J)
LP = II
IF ((K.GT.1).OR.(K.LT.0)) GO TO 320
CONTRL (J) = 1-K
GO TO 325
320 CALL ERROR(34,1)
325 IF (II.EQ.80) GO TO 1
LP = LP + 1
GO TO 305
330 K = 0
II = II+1
C
DO 340 I=II,80
LP = II
L = IBUFF(I)
IF (L .LE. 1) GO TO 340
IF (L .GT. 11) GO TO 350
K = K*10+(L-2)
340 CONTINUE
C
350 CONTRL(J) = K
C MAY BE MORE $ IN INPUT LINE
360 II = LP + 1
DO 370 I=II,80
LP = I
IF (IBUFF(I).EQ.38) GO TO 380
370 CONTINUE
C NO MORE $ FOUND
GO TO 1
380 LP = LP + 1
GO TO 305
400 CONTINUE
C DISPLAY $ PARAMETERS
L = 2
K = 64
LP = LP + 1
J = IBUFF(LP)
IF (J.EQ.1) GO TO 410
L = J
K = J
410 CONTINUE
DO 420 I=L,K
J = CONTRL(I)
IF (J.LT.0) GO TO 420
CALL PAD(0,38,1)
CALL PAD(1,I,1)
CALL PAD(1,39,1)
CALL CONOUT(2,-10,J,10)
420 CONTINUE
IF (CONTRL(31).NE.0) CALL PAD(0,1,1)
CALL WRITEL(0)
GO TO 360
990 IF (INPTR .LT. 1) GO TO 999
CONTRL(16) = 0
INPTR = INPTR - 1
CONTRL(20) = INSTK(INPTR)
GO TO 1
999 GNC = 0
RETURN
1000 FORMAT(80A1)
2000 CONTINUE
I = MACROS(CURMAC)
J = SHR(I,12)
I = RIGHT(I,12)
IF (J .GE. I) GO TO 2100
J = J + 1
GNC = MACROS(J)
MACROS(CURMAC) = SHL(J,12)+I
RETURN
2100 CURMAC = CURMAC + 1
GO TO 4000
END
SUBROUTINE WRITEL(NSPAC )
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),OFILE
COMMON/CNTRL/CONTRL
C
NSPACE=NSPAC
NP = CONTRL(36) - 1
IF (OBP.LE.NP) GO TO 998
NBLANK = 1
C
DO 5 I=1,OBP
J = OBUFF(I)
IF (J .NE. 1) NBLANK = I
5 OBUFF(I) = OTRAN(J)
C
OBP = IMIN(CONTRL(15),NBLANK)
OFILE = CONTRL(26) + 10
9 CONTINUE
10 WRITE(OFILE,1000) (OBUFF(I), I=1,OBP)
11 IF(NSPACE.LE.0) GO TO 998
C
DO 12 I=1,OBP
12 OBUFF(I)=OTRAN(1)
NSPACE=NSPACE-1
GO TO 9
998 IF (NP.LE.0) GO TO 997
DO 999 I=1,NP
999 OBUFF(I) = 1
997 OBP = NP
RETURN
1000 FORMAT (1H ,121A1)
1001 FORMAT(1H )
END
FUNCTION ICON(I)
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
C ICON IS CALLED WITH AN INTEGER VARIABLE I WHICH CONTAINS A
C CHARACTER READ WITH AN A1 FORMAT. ICON MUST REDUCE THIS CHARACTER
C TO A VALUE SOMEWHERE BETWEEN 1 AND 256. NORMALLY, THIS WOULD BE
C ACCOMPLISHED BY SHIFTING THE CHARACTER TO THE RIGHTMOST BIT POSI-
C TIONS OF THE WORD AND MASKING THE RIGHT 8 BITS. IT IS DONE RATHER
C INEFFICIENTLY HERE, HOWEVER, TO GAIN SOME MACHINE INDEPENDENCE.
DO 100 K=1,52
J = K
IF (I .EQ. OTRAN(K)) GO TO 200
100 CONTINUE
J = 1
200 ICON = J
RETURN
END
SUBROUTINE DECIBP
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
IF (CURMAC .LE. MAXMAC) GO TO 100
IBP = IBP -1
RETURN
100 I = MACROS(CURMAC)
MACROS(CURMAC) = I - 2**12
RETURN
END
SUBROUTINE CONV(PREC)
INTEGER PREC
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
IF (STYPE .LE. 1) GO TO 200
VALUE = 0
DO 100 I=1,ACCLEN
J = ACCUM(I) - 2
100 VALUE = VALUE * STYPE + J
IF (PREC .LE. 0) GO TO 999
I = 2**PREC
IF (VALUE .LT. I) GO TO 999
200 VALUE = -1
999 RETURN
END
FUNCTION IMIN(I,J)
IF (I .LT. J) GO TO 10
IMIN = J
GO TO 20
10 IMIN = I
20 RETURN
END
SUBROUTINE FORM(CC,CHARS,START,FINISH,LENGTH)
C CC = 0 DUMP BUFFER, GO TO NEXT LINE
C CC = 1 APPEND TO CURRENT BUFFER
C CC = 2 DELETE LEADING BLANKS AND APPEND
INTEGER CHARS(LENGTH)
INTEGER CC,START,FINISH
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
J = START
I = CC + 1
GO TO (100,200,300),I
100 CALL WRITEL(0)
200 IF (J .GT. FINISH) GO TO 999
OBP = OBP + 1
OBUFF(OBP) = CHARS(J)
J = J + 1
IF (OBP .GE. CONTRL(34)) GO TO 100
GO TO 200
300 IF (J .GT. FINISH) GO TO 999
IF (CHARS(J) .NE. 1) GO TO 200
J = J + 1
GO TO 300
999 RETURN
END
SUBROUTINE CONOUT(CC,K,N,BASE)
INTEGER CC,K,N,BASE,T(20)
LOGICAL ZSUP
NP = N
ZSUP = K .LT. 0
KP = IMIN (IABS(K),19)
C
DO 10 I=1,KP
10 T(I) = 1
C
IP = KP + 1
C
DO 20 I=1,KP
LTEMP=IP-I
T(LTEMP)=MOD(NP,BASE)+2
NP = NP/BASE
IF(ZSUP .AND. (NP .EQ. 0)) GO TO 30
20 CONTINUE
C
30 IF(BASE .EQ. 8) GO TO 40
IF(BASE .EQ. 2) GO TO 45
IF(BASE .NE. 16) GO TO 50
KP = KP+1
T(KP) = 19
GO TO 50
40 KP = KP+1
T(KP) = 28
GO TO 50
45 KP = KP+1
T(KP) = 13
50 CALL FORM(CC,T,1,KP,20)
RETURN
END
SUBROUTINE PAD(CC,CHR,I)
INTEGER CC,CHR,I
INTEGER T(20)
J = IMIN(I,20)
C
DO 10 K=1,J
10 T(K) = CHR
C
CALL FORM(CC,T,1,J,20)
RETURN
END
SUBROUTINE STACKC(I)
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
INPTR = INPTR + 1
IF (INPTR .GT. 7) GO TO 100
INSTK(INPTR) = CONTRL(20)
CONTRL(20) = I
RETURN
100 CALL ERROR(35,5)
RETURN
END
SUBROUTINE ENTERB
C ENTRY TO BLOCK GOES THROUGH HERE
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 MACROS(500),MAXMAC,CURMAC,MACTOP
COMMON /MACRO/MACROS,MAXMAC,CURMAC,MACTOP
INTEGER SHL
INTEGER LOOKUP,ENTER
CURBLK = CURBLK + 1
PROCTP(CURBLK)=PROCTP(CURBLK-1)
IF (CURBLK .LE. MAXBLK) GO TO 100
CALL ERROR(36,5)
CURBLK = 1
100 BLOCK(CURBLK) = SYMTOP
DOPAR(CURBLK) = 0
C SAVE THE MACRO PARAMETERS
MACBLK(CURBLK) = SHL(MACTOP,12) + CURMAC
BLKSYM = SYMTOP
RETURN
END
SUBROUTINE DUMPIN
C DUMP THE INITIALIZATION TABLE
INTEGER WRDATA
C WRDATA(X) WRITES THE DATA AT LOCATION X IN SYMBOL TABLE
C AND RETURNS THE NUMBER OF BYTES WRITTEN
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
1 ACNT
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
1 ACNT
INTEGER MSSG(77)
COMMON /MESSAG/MSSG
INTEGER RIGHT,SHL,SHR
INTEGER CONTRL(64)
COMMON /CNTRL/CONTRL
IF(CONTRL(30).NE.2) GO TO 1000
I = SYMABS+1
100 I = I - 1
IF (I .LE. MAXSYM) GO TO 1000
J = SYMBOL(I)
JP = RIGHT(J,15)
J = SHR(J,15)
CALL PAD(0,1,1)
CALL WRITEL(0)
CALL FORM(0,MSSG,42,48,77)
CALL PAD(1,30,1)
CALL CONOUT(1,5,J,10)
CALL PAD(1,1,1)
CALL PAD(1,39,1)
200 IF (JP.LE.0) GO TO 100
JP = JP - 1
I = I - 1
CALL PAD(1,1,1)
CALL PAD(1,30,1)
C GET THE SYMBOL NUMBER
K = SHR(SYMBOL(I),16)
CALL CONOUT(1,5,K,10)
GO TO 200
1000 CALL WRITEL(0)
KT = CONTRL(26)
CONTRL(26) = CONTRL(32)
KQ = CONTRL(34)
CONTRL(34) = CONTRL(33)
C READY TO WRITE THE INITIALIZATION TABLE
I = SYMABS+1
3000 CALL PAD(1,41,1)
3100 I = I - 1
IF (I.LE.MAXSYM) GO TO 4000
J = SYMBOL(I)
JP = RIGHT(J,15)
J = SHR(J,15)
C WRITE SYMBOL NUMBERS
DO 3300 K=1,3
KP = MOD(J,32)+2
CALL PAD(1,KP,1)
3300 J = J /32
C
C WRITE OUT DATA CORRESPONDING TO EACH CONSTANT
3400 IF (JP.LE.0) GO TO 3000
JP = JP - 1
I = I - 1
K = RIGHT(SYMBOL(I),16)
K = WRDATA(K)
GO TO 3400
C
4000 CALL PAD(1,41,1)
CALL WRITEL(0)
CONTRL(26) = KT
CONTRL(34) = KQ
RETURN
END
SUBROUTINE ERROR(I,LEVEL)
INTEGER I,LEVEL
C I IS ERROR NUMBER, LEVEL IS SEVERITY CODE
INTEGER TERR(22)
COMMON /TERRM/TERR
C TERR CONTAINS THE TERMINAL ERROR MESSAGE - COMPILATION TERMINATED
INTEGER CONTRL(64)
COMMON /CNTRL/CONTRL
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 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 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
CONTRL(1) = CONTRL(1) + 1
CALL FORM(0,MSSG,21,21,41)
CALL CONOUT(1,5,CONTRL(14),10)
CALL FORM(1,MSSG,22,22,41)
CALL PAD(1,1,2)
CALL FORM(1,MSSG,16,20,41)
CALL PAD(1,1,1)
CALL CONOUT(2,-4,I,10)
CALL PAD(1,1,2)
CALL FORM(1,MSSG,23,26,41)
CALL PAD(1,1,1)
CALL FORM(1,ACCUM,1,ACCLEN,32)
CALL WRITEL(0)
C CHECK FOR TERMINAL ERROR - LEVEL GREATER THAN 4
IF (LEVEL.LE.4) GO TO 999
C TERMINATE COMPILATION
CALL FORM(0,TERR,1,22,22)
CALL WRITEL(0)
COMPIL = .FALSE.
999 RETURN
END
INTEGER FUNCTION SHR(I,J)
SHR = I/(2**J)
RETURN
END
INTEGER FUNCTION SHL(I,J)
SHL = I*(2**J)
RETURN
END
INTEGER FUNCTION RIGHT(I,J)
RIGHT = MOD(I,2**J)
RETURN
END
SUBROUTINE SDUMP
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
C CHECK FOR STACK DUMP BYPASS
IF (CONTRL(13).NE.0) GO TO 400
CALL FORM(0,MSSG,29,41,41)
IF (SP .LT. 5) GO TO 200
DO 100 I=5,SP
J = PSTACK(I)
CALL PRSYM(1,J)
CALL PAD(1,1,1)
100 CONTINUE
200 CALL WRITEL(0)
400 CONTINUE
RETURN
END
SUBROUTINE REDPR(PROD,SYM)
INTEGER SYM,PROD
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
CALL CONOUT(0,-5,PROD,10)
CALL PAD(1,1,2)
CALL PRSYM(1,SYM)
CALL PAD(1,1,1)
CALL PAD(1,51,2)
CALL PAD(1,39,1)
DO 50 I=MP,SP
CALL PAD(1,1,1)
50 CALL PRSYM(1,PSTACK(I))
CALL WRITEL(0)
RETURN
END
SUBROUTINE EMIT(VAL,TYP)
INTEGER VAL,TYP
C TYP MEANING
C 0 OPERATOR
C 1 LOAD ADDRESS
C 2 LOAD VALUE
C 3 DEFINE LOCATION
C 4 LITERAL VALUE
C 5 LINE NUMBER
C 6 UNUSED
C 7 "
INTEGER CONTRL(64)
COMMON /CNTRL/CONTRL
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 RIGHT,SHR,SHL
POLTOP = POLTOP+1
IF (POLTOP .LE. MAXPOL) GO TO 100
CALL ERROR(37,1)
POLTOP = 1
100 POLCNT = POLCNT + 1
IF (CONTRL(18).EQ.0) GO TO 1200
CALL CONOUT(0,-5,POLCNT,10)
CALL PAD(1,1,1)
I = (TYP*3)+1
CALL FORM(1,POLCHR,I,I+2,18)
CALL PAD(1,1,1)
I = TYP+1
J = 1
GO TO (1000,1001,1001,1001,1004,1004),I
1000 J = OPCVAL(VAL+1)
DO 200 I=1,3
K = SHR(J,(3-I)*6)
CALL PAD(1,RIGHT(K,6),1)
200 CONTINUE
GO TO 1100
1001 CONTINUE
J = 30
1004 CALL PAD(1,J,1)
CALL CONOUT(1,5,VAL,10)
1100 CONTINUE
C
C NOW STORE THE POLISH ELEMENT IN THE POLISH ARRAY.
C
CALL WRITEL(0)
1200 POLISH(POLTOP) = SHL(VAL,3)+TYP
LCODE = CONTRL(22)/3
IF (POLTOP .LT. LCODE) GO TO 9999
C WRITE THE CURRENT BUFFER
CALL WRITEL(0)
KP = CONTRL(34)
CONTRL(34) = CONTRL(22)
K = CONTRL(26)
CONTRL(26) = CONTRL(21)
C
JP = 0
DO 2000 I=1,LCODE
J = POLISH(I)
DO 2000 L = 1,3
LP = RIGHT(SHR(J,(3-L)*5),5)+2
CALL PAD(JP,LP,1)
JP = 1
2000 CONTINUE
C
CALL WRITEL(0)
CONTRL(34) = KP
CONTRL(26) = K
POLTOP = 0
9999 RETURN
END
BLOCK DATA
INTEGER TITLE(10),VERS
COMMON /TITL/TITLE,VERS
INTEGER INTPRO(8)
COMMON /INTER/INTPRO
INTEGER ASCII(64)
COMMON /ASC/ASCII
INTEGER HENTRY(127),HCODE
COMMON /HASH/HENTRY,HCODE
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 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
C COMPILATION TERMINATED
INTEGER TERR(22)
COMMON /TERRM/TERR
INTEGER MSSG(77)
COMMON /MESSAG/MSSG
C
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 POLISH(30),MAXPOL,POLTOP,POLCNT,POLCHR(18)
COMMON /POLE/POLISH,MAXPOL,POLTOP,POLCNT,POLCHR
INTEGER BLOCK(30),DOPAR(30),MACBLK(30),CURBLK,MAXBLK,BLKSYM
INTEGER PROCTP(30)
COMMON /BLK/BLOCK,DOPAR,MACBLK,CURBLK,MAXBLK,BLKSYM
1,PROCTP
C THE '48' USED IN BLOCK INITIALIZATION AND IN SYMBOL TABLE
C INITIALIZATION IS DERIVED FROM THE PROGRAM 'SYMCS' WHICH
C BUILDS THE INITIAL SYMBOL TABLE. IF THIS NUMBER CHANGES, BE
C SURE TO ALTER 'BLOCK', 'BLKSYM', 'SYMTOP', AND 'SYMCNT'.
C TWO ARRAYS, SYM1 AND SYM2, ARE EQUIVALENCED OVER THE
C SYMBOL TABLE ARRAY IN ORDER TO LIMIT THE NUMBER OF
C CONTINUATION CARDS IN SYMBOL TABLE INITIALIZATION
C BELOW. THE LENGTHS OF SYM1 AND SYM2, THEREFORE, MUST
C TOTAL THE LENGTH OF THE SYMBOL TABLE. CURRENTLY, THESE
C ARRAYS ARE DECLARED AS FOLLOWS
C
C SYM1(60) + SYM2(3940) = SYMBOL(4000)
C
C IF YOU INCREASE (DECREASE) THE SIZE OF SYMBOL, YOU MUST
C INCREASE (DECREASE) THE SIZE OF SYM2 AS WELL.
C
C NOTE ALSO THAT THE REMAINING ENTRIES OF THE SYMBOL
C TABLE ARE SET TO ZERO AT THE END OF THE DATA STATEMENT
C FOR SYM2. CURRENTLY, THIS IS ACCOMPLISHED WITH THE LAST
C ENTRY IN THE DATA STATEMENT
C
C 3880*0
C
C AGAIN, IF YOU CHANGE THE SIZE OF SYMBOL, YOU MUST
C ALSO CHANGE THIS LAST ENTRY. IF FOR EXAMPLE, YOU ALTER
C THE SIZE OF SYMBOL TO 3000, THE LAST ENTRY 1880*0 BECOMES
C
C 2880*0
C
INTEGER SYMBOL(4000),SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
1 ACNT
COMMON /SYM/SYMBOL,SYMTOP,MAXSYM,SYMLOC,SYMLEN,SYMCNT,SYMABS,
1 ACNT
INTEGER SYM1(60),SYM2(3940)
EQUIVALENCE (SYMBOL(1),SYM1(1)),(SYMBOL(61),SYM2(1))
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 SYNTAX ANALYZER TABLES
INTEGER V0(254),V1(73),V2(68),V3(51)
EQUIVALENCE (V(1),V0(1)),(V(255),V1(1)),(V(328),V2(1)),
4(V(396),V3(1))
INTEGER C10(110),C11(118),C12(136)
EQUIVALENCE (C1(1),C10(1)),(C1(111),C11(1)),(C1(229),C12(1))
INTEGER C1TRI0(93),C1TRI1(86),C1TRI2(64)
EQUIVALENCE (C1TRI(1),C1TRI0(1)),(C1TRI(94),C1TRI1(1)),
3(C1TRI(180),C1TRI2(1))
C ... PLM1 VERS ...
DATA TITLE/27,23,24, 3, 1,33,16,29,30, 1/
DATA VERS/20/
DATA INTPRO /8*0/
C TRANSLATION TABLE FROM INTERNAL TO ASCII
DATA ASCII /
1 32, 48,49,50,51,52, 53,54,55,56,57,
2 65,66,67,68,69,70,71,72,73,
3 74,75,76,77,78,79,80,81,82,
4 83,84,85,86,87,88,89,90,
5 36,61,46, 47,40,41, 43,45,39, 42,44,60, 62,58,59,
6 12*0/
DATA CONTRL /64*0/
DATA IBP/81/, OBP/0/, INPTR /0/
DATA OTRAN /1H ,1H0,1H1,1H2,1H3,1H4,
1 1H5,1H6,1H7,1H8,1H9,1HA,1HB,1HC,1HD,1HE,1HF,
2 1HG,1HH,1HI,1HJ,1HK,1HL,1HM,1HN,1HO,1HP,1HQ,
3 1HR,1HS,1HT,1HU,1HV,1HW,1HX,1HY,1HZ,
4 1H$,1H=,1H.,1H/,1H(,1H),1H+,1H-,1H',1H*,1H,,
5 1H<,1H>,1H:,1H;,12*0/
C COMPILATION TERMINATED
DATA TERR /14,26,24,27,20,23,12,31,20,26,25, 1,
1 31,16,29,24,20,25,12,31,16,15/
C PASS-NO PROGRAM
C ERROR
C ()NEARAT
C PARSE STACK
C SYMBOL ADDR WDS CHRS LENGTH PR TY
DATA MSSG /27,12,30,30,45,
1 25,26,27,29,26,18,29,12,24,1,
2 16,29,29,26,29,
3 42,43,25,16,12,29,12,31,
4 27,12,29,30,16,1,30,31,12,14,22,51,1,
5 30,36,24,13,26,23, 1,1, 12,15,15,29, 1, 34,15,30, 1,
6 14,19,29,30, 1,1,1, 23,16,25,18,31,19, 1,27,29, 1,31,36/
DATA STYPE /0/, EOFLAG /1/, IDENT /2/, NUMB /3/,
1 SPECL /4/, STR /5/, CONT /1/
C
DATA MP /0/, MPP1 /1/, MSTACK /75/, VARTOP /1/,
1 MVAR /256/, FAILSF /.FALSE./, COMPIL /.TRUE./
DATA MACROS /500*0/, CURMAC /501/, MAXMAC /500/,
1 MACTOP /1/
DATA VARB /1/, INTR /2/, PROC /3/, LABEL /4/, LITER /5/
DATA MAXPOL /30/, POLTOP /0/, POLCNT /0/
C OPRADRVALDEFLITLIN
DATA POLCHR /26,27,29, 12,15,29, 33,12,23, 15,16,17,
1 23,20,31, 23,20,25/
DATA BLOCK /1,120,28*0/, CURBLK /2/, MAXBLK /30/,
1 BLKSYM /120/, DOPAR /30*0/, MACBLK /30*0/
1,PROCTP/30*0/
DATA SYM1 /
1 5439488, 65536, 4101, 17, 221103907, 6815744,
2 131074, 4100, 17, 608028224, 5046272, 196615,
3 4100, 17, 491591168, 7471104, 262156, 8198,
4 17, 439207134, 587202560, 7995392, 327697, 8198,
5 17, 389903964, 587202560, 851968, 393239, 8200,
6 33, 494449493, 444186624, 3866624, 458781, 4099,
7 530, 476405760, 8126464, 524323, 4099, 530,
8 476430336, 5373952, 589864, 4099, 530, 491347968,
9 1310720, 655405, 4099, 530, 491372544, 131072,
A 720946, 4099, 530, 490037248, 4390912, 786487/
DATA SYM2 /
B 4099, 530, 490061824, 5373996, 852028, 4100,
C 258, 508392384, 7405568, 917569, 4100, 274,
D 307041408, 7143424, 983110, 4099, 274, 375787520,
E 5308416, 1048651, 4101, 274, 325167070, 3276800,
F 1114192, 8198, 274, 427681439, 503316480, 1114112,
G 1179733, 8198, 274, 373130334, 301989888, 1703936,
H 1245275, 4100, 274, 372103040, 1900544, 1310817,
I 4100, 770, 392561600, 589824, 1376358, 8198,
J 290, 241562390, 251658240, 458752, 1441899, 4099,
K 274, 238866432, 1507441, 0, 1, 117,
L 3880*0/
DATA SYMTOP /120/, MAXSYM /4000/, SYMABS /4000/,
1 SYMCNT /23/, ACNT /0/
DATA HENTRY /
*0,54,0,0,0,0,112,0,106,0,0,0,28,0,0,0,90,0,0,49,0,0,0,0,0,96,0,
10,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,0,0,0,0,0,0,0,
20,34,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0,0,11,0,0,0,79,64,1,0,0,0,
30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,74,0,0,0,69,16,0,0,
40,0,0,0,0,22,0,39,0,0,0/
DATA OPR /0/, ADR /1/, VLU /2/, DEF /3/, LIT /4/, LIN /5/,
*NOP/ 0/,ADD/ 1/,ADC/ 2/,SUB/ 3/,SBC/ 4/,MUL/ 5/,DIV/ 6/,REM/ 7/,
*NEG/ 8/,AND/ 9/,IOR/10/,XOR/11/,NOT/12/,EQL/13/,LSS/14/,GTR/15/,
*NEQ/16/,LEQ/17/,GEQ/18/,INX/19/,TRA/20/,TRC/21/,PRO/22/,RET/23/,
*STO/24/,STD/25/,XCH/26/,DEL/27/,DAT/28/,LOD/29/,BIF/30/,INC/31/,
*CSE/32/,END/33/,ENB/34/,ENP/35/,HAL/36/,RTL/37/,RTR/38/,SFL/39/,
*SFR/40/,HIV/41/,LOV/42/,CVA/43/,ORG/44/,DRT/45/,ENA/46/,DIS/47/,
*AX1/48/,AX2/49/,AX3/50/
DATA OPCVAL /
* 104091, 50127, 50126, 124941, 123726, 100375, 62753, 119832,
* 103442, 50767, 83613, 145053, 104095, 67351, 96158, 75741,
* 103452, 95260, 74780, 83555, 128844, 128846, 112474, 119839,
* 124890, 124879, 144275, 62487, 62239, 95887, 54545, 83534,
* 59280, 67151, 67149, 67163, 78615, 120791, 120797, 123991,
* 123997, 79137, 95905, 59468, 108370, 63327, 67148, 62750,
* 51395, 51396, 51397/
DATA V0/18,49,16,29,29,26,29,51,1,31,26,22,16,25,1,39,1,2,50,1,52,
11,43,1,42,1,48,1,51,1,39,1,49,1,50,1,44,1,45,1,47,1,41,1,40,2,20,
217,2,15,26,2,18,26,2,31,26,2,26,29,2,13,36,3,16,26,17,3,16,25,15,
33,35,26,29,3,12,25,15,3,25,26,31,3,24,26,15,4,19,12,23,31,4,31,19,
416,25,4,16,23,30,16,4,14,12,30,16,4,14,12,23,23,4,18,26,31,26,4,
515,12,31,12,4,13,36,31,16,4,27,23,32,30,5,23,12,13,16,23,5,13,12,
630,16,15,5,24,20,25,32,30,5,34,19,20,23,16,6,16,25,12,13,23,16,6,
729,16,31,32,29,25,7,15,20,30,12,13,23,16,7,15,16,14,23,12,29,16,7,
812,15,15,29,16,30,30,7,20,25,20,31,20,12,23,8,49,25,32,24,13,16,
929,50,8,49,30,31,29,20,25,18,50,9,20,25,31,16,29,29,32,27,31,9,27,
A29,26,14,16,15,32,29,16,9,23,20,31,16,29,12,23,23,36,12,49,20,15/
DATA V1/16,25,31,20,17,20,16,29,50,813276224,808598592,813315727,
1822083584,813233943,822083584,809879135,449052672,814032086,
2264503296,809865246,432275456,809337747,407310336,812238417,
3472742976,812709526,188021824,812238039,192035904,813741843,
4187786225,808818205,506300337,812709259,508401201,813032158,
5257750558,822083584,810352653,372111183,822083584,813287375,
66862622,822083584,809023371,5846878,822083584,809023371,4780750,
7822083584,811136030,6862622,822083584,808310611,291599320,
8516161536,809379484,259380441,415498240,809879135,436282315,
9247726080,808556504,234955723,247726080,810352669,506323927,
A258075712,814032086,251712907,527760448,810386654,321740822/
DATA V2/326495296,810386654,321740818,254602304,808761167,7665039,
1226072369,813741843,187786176,405631985,808818205,506300288,
2305968049,813032158,257750558,5846878,822083584,808760726,7725790,
3257750558,822083584,812238413,255457039,4780750,822083584,
4812238413,255457039,6337999,822083584,812168971,389931996,5846878,
5822083584,812168971,389931996,4780750,822083584,808499023,
6235012828,321701263,822083584,811177043,221077520,188081756,
7822083584,813036317,225523358,4780750,822083584,808499027,
8218224523,507343832,516161536,809865246,419551115,507343832,
9516161536,813032410,3732499,407758041,415498240,810345432,
A508363983,469853405,516161536,811177043,221077530,474837724/
DATA V3/600047616,812709791,476055390,192476623,410718208,
1811119375,369157072,325138323,425922560,813315727,3732310,
2191936403,425922560,810410972,192493144,3511838,476408896,
3811177043,221077533,255170062,192035904,811177043,221077519,
4577356765,491623985,809038678,191936403,425722838,257750558,
5822083584,812238413,255457039,3732499,407758041,415498240,
6809038678,191936403,425723742,192476623,410718208,808305886,
7308082579,218167450,473814867,425922560,810345432,508363983,
8469882511,223151309,192493144,822083584/
DATA VLOC /1,20,22,24,26,28,30,32,34,36,38,40,42,44,46,49,52,55,
158,61,64,68,72,76,80,84,88,93,98,103,108,113,118,123,128,133,139,
2145,151,157,164,171,179,187,195,203,212,221,231,241,251,131336,
3131337,196874,196876,229646,229648,229650,262420,295190,295192,
4295194,327964,327966,327968,360738,360741,360744,360747,360750,
5360753,393524,393527,393530,393533,459072,459075,459078,459081,
6491852,491855,491858,524629,524633,524637,524641,524645,524649,
7524653,524657,524661,557433,557437,557441,557445,557449,590221,
8590225,590229,623001,623005,655777,688549,721322,754095,754100,
9852409/
DATA VINDX /1,14,20,26,35,39,41,45,47,50,50,50,51/
DATA C10/0,0,0,32768,688288,35815424,713162890,715827202,
1673744896,991953792,196620,201326640,0,15740976,2129920,8388608,
22563,134283266,671219840,671091360,545786880,204472320,805306368,
3245952,541360640,0,40,33686536,134217728,0,10493968,16384,0,1281,
44194308,0,0,335807488,1048576,0,81984,268435712,0,20,16842752,0,0,
55246992,1064960,4194304,1281,67108864,1,4096,262144,4096,0,0,
6536904192,131072,40,33619972,67108880,0,5247008,2129920,8388608,
72562,67108865,335544384,335545680,268730368,0,0,64,268452096,
865536,20,16842756,67108880,0,5246992,1064960,0,1281,4194308,0,0,
9335822848,0,0,8,168,8232,174112,35651584,44040194,10485802,
A545267728,1064960,4194304,1281,0,0,0,262144,0,0,131200,268435456/
DATA C11/0,0,2129920,0,0,33554448,16384,0,1281,136314880,0,2,0,0,
10,128,268435712,0,20,16908296,134217760,0,10494208,0,0,0,
2138412292,1024,0,335822848,0,0,0,268435456,0,0,18907136,0,0,
333554448,0,0,0,254192288,44081696,2129920,41514,713042442,
4142606856,0,0,0,16,2228224,0,139264,134742016,0,0,256,201239200,
544081696,27885576,1049600,68157440,268435456,81984,268452096,
665536,20,19955712,0,0,33555080,715456680,168951816,134217728,
767108864,0,0,1024,68157440,268435456,81984,0,0,16,18874368,0,0,0,
82,0,0,4194564,1024,0,335847978,713042442,142606856,10,233482242,
9673744896,136314880,2935466,537559688,536904192,16,1064960,0,1281,
A134217730,671744128,671091360,537411584,344064,16859136,356581444/
DATA C12/84,4116,87056,18907136,0,0,0,0,0,1280,0,0,0,311296,0,0,9,
167108865,67109888,0,1048576,22021121,5242901,272633856,0,0,1024,
2134217730,671744128,671091360,537411584,0,0,8,134217728,0,128,0,0,
30,5243136,0,0,0,26214400,0,8912904,0,0,0,81924,84,37752852,87056,
417825792,0,0,256,5376,263424,5571585,71303168,0,4456452,16793600,
50,1088,1048576,0,0,0,16777216,0,0,4744,168,151126016,0,4194564,
61024,0,335839232,688288,36864000,713162884,0,0,0,1048576,0,0,0,0,
70,1,169869312,44081184,0,16384,0,0,4,84,4198420,87056,287342592,0,
80,16777728,0,0,0,169869312,44081184,0,41472,9732,8388608,8,
9134217728,0,0,1048576,0,0,260,0,0,0,169956608,44081184,1064960,
A1024,0,1088,1048576/
DATA C1TRI0/197379,197386,197389,197400,197421,197422,197426,
1209411,329219,329226,329229,329240,329261,329262,329266,393987,
2393994,393997,394008,394029,394030,394034,406019,590595,590602,
3590605,590616,590637,590638,590642,602627,656131,656138,656141,
4656152,656173,656174,656178,668163,721667,721674,721677,721688,
5721709,721710,721714,733699,787203,787210,787213,787224,787245,
6787246,787250,799235,864771,918275,918282,918285,918296,918317,
7918318,918322,930307,995843,998918,1180419,1180426,1180429,
81180440,1180461,1180462,1180466,1192451,1323523,1323525,1326596,
91326598,1328897,1442563,1442570,1442573,1442584,1442605,1442606,
A1442610,1454595,1508099,1508106,1508109,1508120,1508141,1508142/
DATA C1TRI1/1508146,1520131,1573635,1573642,1573645,1573656,
11573677,1573678,1573682,1585667,1639171,1639178,1639181,1639192,
21639213,1639214,1639218,1651203,1901315,1901322,1901325,1901336,
31901357,1901358,1901362,1913347,1978883,2228995,2229002,2229005,
42229016,2229037,2229038,2229042,2241027,2425603,2425610,2425613,
52425624,2425645,2425646,2425650,2437635,2622211,2622218,2622221,
62622232,2622253,2622254,2622258,2634243,2949665,2949667,2949675,
73091713,3343107,3343114,3343117,3343128,3343149,3343150,3343154,
83355139,3408643,3408650,3408653,3408664,3408685,3408686,3408690,
93420675,3670787,3670794,3670797,3670808,3670829,3670830,3670834,
A3682819,3932931,3932938,3932941,3932952,3932973,3932974,3932978/
DATA C1TRI2/3944963,4195075,4195082,4195085,4195096,4195117,
14195118,4195122,4207107,4338179,4338181,4341252,4341254,4343553,
24348700,4403715,4403717,4406788,4406790,4409089,4538114,4538116,
34600323,4603396,4603398,4796931,4796933,4800004,4800006,4802305,
44861186,5127938,5127940,5324546,5324548,5386755,5386757,5389828,
55389830,5392129,5517827,5517829,5520900,5520902,5523201,5584129,
65649665,5714434,5714436,5899011,5899018,5899021,5899032,5899053,
75899054,5899058,5911043,6369795,6369797,6372868,6372870,6375169,
86816771,6816818/
DATA PRTB /0,5592629,5582637,21813,21846,3933,3916,3919,85,15,71,
155,103,96,83,92,104,26,39,41,0,17727,20031,22322,24144,20799,840,
223112,32,106,44,13,50,0,0,22322,17727,24144,20031,20799,23112,62,
350,45,7,8,0,0,0,7,0,16,0,0,0,3656,91,0,0,0,50,0,0,0,57,0,12849,0,
497,21,57,88,0,0,4861186,106,26889,26890,26914,26917,10,0,21586,97,
573,13835,13836,13849,0,30,13,0,13,0,16963,82,73,66,0,50,70,
63360820,15932,51,56,29,40,97,0,98,0,0,25874,25878,0,97,0,24,0,0,
74078664,22807,0,4064518,0,26628,42,26944,0/
DATA PRDTB /0,38,39,36,37,25,26,27,35,24,6,7,8,9,10,11,12,13,14,
115,16,61,78,41,72,114,117,121,62,70,79,118,122,42,73,43,63,74,80,
2119,123,84,47,48,100,101,96,83,97,99,98,54,126,127,44,21,22,55,67,
369,77,128,49,68,53,125,59,124,40,45,52,76,75,120,65,64,103,104,
4105,106,107,102,34,46,23,109,110,111,108,51,116,115,113,112,19,3,
528,18,2,60,82,31,81,30,32,33,50,20,5,66,71,1,88,89,87,17,4,93,92,
658,29,91,90,86,85,57,56,95,94/
DATA HDTB /0,84,84,84,84,73,73,73,84,73,91,91,91,91,91,91,91,91,
191,91,91,68,77,86,106,61,61,62,69,74,78,81,90,87,94,87,69,94,78,
281,90,70,97,97,64,64,64,60,64,64,64,57,51,52,58,66,67,57,53,53,88,
356,96,53,92,63,102,63,85,58,92,80,80,62,98,98,105,105,105,105,105,
4105,103,58,55,54,54,54,54,83,61,61,61,61,75,82,73,75,82,102,71,99,
571,99,76,79,96,75,65,98,106,59,101,101,101,91,65,100,100,102,93,
689,89,72,72,104,104,95,95/
DATA PRLEN /0,4,4,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,1,3,3,3,3,3,3,
13,2,2,2,2,2,1,1,3,3,3,3,3,3,2,2,2,2,2,1,1,1,2,1,2,1,1,1,3,2,1,1,1,
22,1,1,1,2,1,3,1,2,2,2,2,1,1,4,2,3,3,3,3,2,1,3,2,2,3,3,3,1,2,2,1,2,
31,3,2,2,2,1,2,2,4,3,2,2,2,2,2,1,2,1,1,3,3,1,2,1,2,1,1,4,3,1,4,1,3,
42,3,1/
DATA CONTC /0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
10,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
40,0,0/
DATA LEFTC /105,4,42,94,85/
DATA LEFTI /0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,
11,1,1,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5/
DATA CONTT /0/
DATA TRIPI /0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1/
DATA PRIND /1,21,28,35,42,44,48,49,51,51,51,51,51,51,51,51,51,53,
153,54,54,55,55,55,55,55,55,56,57,57,57,58,58,59,59,60,61,61,62,62,
263,63,63,64,64,66,68,68,69,69,74,74,74,76,82,82,82,82,85,85,85,89,
392,94,94,99,99,99,100,100,100,101,107,107,107,109,109,110,110,110,
4111,111,112,112,112,112,112,112,112,115,115,117,117,117,117,119,
5119,119,120,121,123,125,127,127,127,129,129/
DATA NSY /106/, NT /50/, VLEN /445/, VIL /12/, C1W /102/,
2C1L /363/, NC1TRI /242/, PRTBL /128/, PRDTBL /128/, HDTBL /128/,
3PRLENL /128/, CONCL /128/, LEFTCL /4/, LEFTIL /56/, CONTL /0/,
4TRIPL /56/, PRIL /106/, PACK /5/, TOKEN /0/, IDENTV /50/,
5NUMBV /45/, STRV /46/, DIVIDE /0/, EOFILE /20/, PROCV /48/,
6SEMIV /1/, DECL /42/, DOV /15/, ENDV /21/, GROUPV /55/,
7STMTV /65/, SLISTV /82/
END