From f8ef3f4bd396db1ca31f7d7ae7d1545bdba5a73f Mon Sep 17 00:00:00 2001 From: "paul.kimpel@digm.com" Date: Sat, 20 Jul 2013 15:49:15 +0000 Subject: [PATCH] Commit Mark XVI ESPOL compiler patches through #116, as transcribed and donated to the project by Paul Cumberworth. --- Mark-XVI/PATCHES/ESPOL-116.txt | 1557 ++++++++++++++++++++++++++++++++ 1 file changed, 1557 insertions(+) create mode 100644 Mark-XVI/PATCHES/ESPOL-116.txt diff --git a/Mark-XVI/PATCHES/ESPOL-116.txt b/Mark-XVI/PATCHES/ESPOL-116.txt new file mode 100644 index 0000000..6a33dd8 --- /dev/null +++ b/Mark-XVI/PATCHES/ESPOL-116.txt @@ -0,0 +1,1557 @@ +?EXECUTE PATCH/MERGE +?FILE CARD = PMCARD +?DATA PMCARD +$@CARD CONFLICTS LISTI MERGE ZIP +$. 20 PATCHES FOR ESPOL +$*COMPILE ESPOL16/DISK ALGOL LIBRARY +$* ALGOL STACK = 1000 +$*ALGOL FILE TAPE = SYMBOL/ESPOL16 DISK SERIAL +$* FILE LINE = LINE PRINT OR BACK UP +$* DATA CARD +$- ***** THIS LISTING SHOWS PATCHES IMPLEMENTED AT UCSC ***** +$ TAPE LIST PRT CHECK +$ SET LISTA SINGLE FORMAT PRT XREF LIST TAPE +$#PATCH NUMBER 101 FOR ESPOL CONTAINS 2 CARD + IF T = INFO[GT1, GT2] THEN BEGIN 02877010 + T:= 0; GO TO COMPLETE END; 02877020 +$:THIS PATCH ELIMINATES A COMPILER LOOP CAUSED WHEN A FORMAL PARAMETER +$: IN A PROCEDURE DECLARATION IS NOT INDICATED IN THE SPECIFICIATION +$: LIST +$:********************************************************************** +$#PATCH NUMBER 102 FOR ESPOL CONTAINS 1 CARD + IF BUP ! BUP:=BUP- TAKE(BUP + 1).PURPT THEN 14088000 +$: THIS PATCH ELEMINATES A COMPILER LOOP CAUSED WHEN THE FORMAL +$: PARAMETER IN A PROCEDURE DECLARATION IS FOLLOWED BY A COMMA. +$: +$:********************************************************************** +$#PATCH NUMBER 103 FOR ESPOL CONTAINS 2 CARDS +FOUND: 02315000 + IF OPINX +1>OPARSIZE THEN FLAG(602) ELSE % TOO MANY USER OPTIONS 02316000 +$: THIS PATCH CORRECTS AN INVALID INDEX CONDITION CAUSED WHEN TOO MANY +$: USER OPTIONS HAVE BEEN SPECIFIED. +$:********************************************************************** +$#PATCH NUMBER 104 FOR ESPOL CONTATNS 4 CARDS +FLAG (120); 07025000 +FCR:= (LCR:=MKABS(CBUFF[9]))-9; 07025010 + IF LISTER THEN PRINTCARD; 07025020 +FCR:= (LCR:=MKABS(TBUFF[9]))-9 END; 07025030 +$:THIS PATCH CORRECTS A PROBLEM WHERE A PATCH CARD IS LOST WHEN BEGIN +$:END PAIRS ARE NOT MATCHED AND PATCH CARD SEQUENCE NUMBERS ARE GREATER +$:THAN THE SEQUENCE NUMRER OF THE "END."CARD IN THE SOURCE FILE. +$:********************************************************************** +$#PATCH NUMBER 105 FOR ESPOL CONTAINS 11 CARDS +LABEL ENDREADTAPE, EOFT; 02201510 +READ (TAPE, 10, TBUFF[*])[EOFT]; 02201750 + LCR:=MKABS(TBUFF[9]); 02202000 +GO TO ENDREADTAPE; 02202010 +EOFT: 02202020 +DEFINEARRAY[25]:="ND;END."& "E"[1:43:5]; 02202030 +DEFINEARRAY[34]:="9999" & "9999"[1:25:23]; 02202040 +TLCR:= MKABS(DEFINEARRAY[34]); 02202050 +PUTSEQNO (DEFINEARRAY[33],TLCR-8); 02202060 +TURNONSTOPLIGHT("%", TLCR-8); 02202070 +ENDREADTAPE: 02202080 +$: THIS PATCH CORRECTS AN EOF NO LABEL ENCOUNTERED WHEN THE SOURCE +$: "END" CARD IS PATCHED OVER AND THE PATCH DECK CONTAINS CARD SEQUENCE +$:NUMBERS GREATER THAN THE SEQUENCE NUMBER OF THE "END." CARD IN THE +$:SOURCE FILE. +$:********************************************************************** +$#PATCH NUMBER 106 FOR ESPOL CONTAINS 2 CARDS. + IF ERRNUM = 200 THEN I := 1/0; % SEGMENT TOO LARGE. 05107100 + IF ERRNUM = 611 THEN I := 1/0; % ERRMAX EXCEEDED. 05107200 +$: DATE 6/27/75 99990000 +$: BY MWG - MSA CENTRAL. 99990100 +$: THIS PATCH CAUSES ESPOL TO ABORT WITH A DIVIDE BY ZERO ERROR FOR 99990300 +$: THE ERRORS "SEGMENT TOO LARGE" AND "ERROR LIMIT EXCEEDED". 99990400 +$#PATCH NUMBER 107 FOR ESPOL CONTAINS 12 CARDS. 00000000 + LABEL EXIT,NEXTCHK; 06315000 + IF STEPI = RTBRKET THEN % WE WILL TAKE CARE OF THE RES06320000 + IF (FIRST := ELBAT[I-3].ADDRESS) | 06320100 + (THIRD := ELBAT[I-1].ADDRESS) ! 0 THEN 06320200 + BEGIN 06320300 + SECOND := 48 - THIRD; % SOURCE IS RIGHT JUST, 06320400 + GO TO NEXTCHK; 06320500 + END 06320600 + ELSE % BAD BITS, FALL THROUGH TO ERROR. 06320700 + ELSE % MAYBE A COLON. 06320800 + IF ELCLASS = COLON THEN % 06320900 + NEXTCHK: IF FIRST + THIRD { 48 THEN % SO FAR SO GOOD. 06327000 +$: DATE 1/22/76 99990000 +$: BY JTC - MSA CENTRAL 99990100 +$: THIS PATCH ALTERS THE SYNTAX FOR THE CONCATENATE OPERATOR TO ALLOW 99990200 +$: THE SECOND VALUE IN THE CONCAT, LIST TO BE OMITTED (THE 99990300 +$: STARTING BIT NUMBER FN THE SOURCE WORD) IF THE RIGHT-MOST 99990400 +$: N BITS ARE BEING SELECTED FROM THE SOURCE WORD. THUS 99990500 +$: 99990600 +$: I := I & J [2:20] 99990700 +$: 99990800 +$: IS THE SAME AS 99990900 +$: 99991000 +$: I := I & J [2:28:20] 99991100 +$: 99991200 +$: THIS IS ESPECIALLY CONVENIENT FOR ESPOL SINCE THIS ALLOWS SOME 99991300 +$: FIELD DEFINES TO BE USED IN CONCATENATE EXPRESSIONS, THIS IF WE 99991400 +$: HAVE THE FOLLOWING FIELD DEFINITION 99991500 +$: 99991600 +$: PBIT = [2:1] 99991700 +$: 99991800 +$: 99991900 +$: WE CAN USE THE SAME FIELD DEFINITION IN A CONCATENATE STATEMENT 99992000 +$: AS FOLLOWS 99992100 +$: 99992200 +$: DESC := DESC & 1 PBIT 99992300 +$: 99992400 +$: 99992500 +$: NOTE: FUTURE PATCHES TO THE MCP AND INTRINSICS WILL TAKE ADVANTAGE 99992600 +$: OF THIS PATCH. 99992700 +$#PATCH NUMBER 108 FOR ESPOL CONTATNS 252 CARDS 00000000 + XREFBIT = 26#, 01001170 + BENDBIT = 27#, 01001171 + USEROPINX = 28#; 01001172 + XREF = OPTIONWORD.[XREFBIT:1] #, 01001461 + BEND = OPTIONWORD.[BENDBIT:1]#, 01001462 +DEFINE XREFINFO(XREFINFO1,XREFINFO2)= 01001750 + XINFO[XREFINFO1,(XREFINFO2)DIV 2]#, 01001760 + XMARK= IF XREF THEN XREFAY2[XREFPT-1].[1:1]-1#; 01001770 + ARRAY XREFAY2[0:29],XREFAY1[0:10],XINFO[0:31,0:127]; 01007100 +INTEGER XREFPT,XLUN; %DFB01007200 + ARRAY BEGINSTACK[0:255]; INTEGER BSPOINT; 01007600 + BOOLEAN DEFINING; 01007650 + FILE DSK1 DISK SERIAL [20:816](2,10,30); 01561085 + FILE DSK2 DISK SERIAL [20:450](2,30,30); 01561087 + PROCEDURE BEGINPRINT; 02196510 +BEGIN 02196520 + STREAM PROCEDURE STUFF(N,L); VALUE N; 02196530 + BEGIN 02196540 + DI:=L; DS:=8 LIT " "; SI:=L; DS:=13 WDS; 02196550 + SI:=LOC N; DS:=8 DEC; 02196560 + END; 02196570 + STUFF(BEGINSTACK[BSPOINT],LIN); 02196580 + IF NOHEADING THEN DATIME; WRITELINE; 02196590 +END BEGINPRINT; 02196610 + CARDNUMBER:=CONV(INFO[LASTSEQROW,LASTSEQUENCE-1],5,8); 02214260 +$ 02228000 + CARDNUMBER:= IF SEQTOG THEN TOTALNO+ADDVALUE ELSE 02234800 + CONV(INFO[LASTSEQROW,LASTSEQUENCE-1],5,8); 02234900 + IF Q = "4XREF0" THEN BEGIN SWITCHIT(XREFBIT); IF BOOLEAN(XMODE) THEN 02419100 + DEFINING := BOOLEAN(REAL(DEFINING)&L[1:47:1]); 02419110 + GO AGAIN END; 02419120 + IF Q = "4BEND0" THEN BEGIN SWITCHIT(BENDBIT); GO AGAIN END; 02419200 + IF XREF THEN 02882100 + IF GT1!1 THEN 02882200 + BEGIN 02882300 + IF XREFPT=30 THEN 02882400 + BEGIN 02882500 + WRITE (DSK2,30,XREFAY2[*]); 02882600 + XREFPT ~ 0; 02882700 + END; 02882800 + XREFAY2[XREFPT]-CARDNUMBER&XREFINFO(GT1,GT2)[09:36:12]; 02882900 + XREFPT ~ XREFPT+1; 02882910 + END; 02882920 + IF NOT DEFINING THEN 02910100 + IF T.CLASS = BEGINV THEN 02910200 + BEGINSTACK[BSPOINT:=BSPOINT+1]:=CARDNUMBER ELSE 02910300 + IF T.CLASS = ENDV THEN 02910400 +BEGIN 02910500 + IF LISTER THEN IF BEND THEN BEGINPRINT; 02910600 + BSPOINT:= BSPOINT - REAL(BSPOINT > 0); % PREVENT INVALID INDEX 02910700 +END; 02910800 + "4BEND0",0, % 50, 51 09251285 + "4XREF0",0, % 52, 53 09251286 +STREAM PROCEDURE XREFMOVE(S,C,SN,SQ,L,D); %DFB13301100 + VALUE C,L; %DFB13301130 + BEGIN %DFB13301160 + DI:=D; %DFB13301190 + DS:= 8 LIT" "; %DFB13301220 + SI:=D; %DFB13301250 + DS:=8 WDS; %DFB13301280 + DI:=D; %DFB13301310 + SI:=S; %DFB13301340 + SI:=SI+3; %DFB13301370 + DS:=C CHR; %DFB13301400 + DI:= D; %DFB13301430 + DI:=DI+60; %DFB13301460 + SI:=SN; %DFB13301490 + DS:=4 DFC; %DFB13301520 + SI:=SQ %DFB13301610 + DS:=8 DFC; %DFB13301640 + SI:=LOC L; %DFB13301670 + DS:=WDS; %DFB13301700 + END; %DFB13301730 + IF XREF AND (NOT PTOG OR STREAMTOG) THEN 13310100 + BEGIN %DFB13310200 + XREFMOVE(ACCUM[1],COUNT,SGNO ,CARDNUMBER, %DFB13310300 + XREFINFO(NEXTINFO.LINKR,NEXTINFO.LINKC):=XLUNI:=XLUN+L, %DFB13310400 + XREFAY1); 13310450 + WRITE(DSKL,10,XREFAY1[*]); %DFB13310500 + END; %DFB13310600 + IF XREF AND PTOG THEN 13341200 + XREFPT:=XREFPT-REAL(ELBAT[I]!0); % GET RID OF LAST CREF 13341300 +$VOIDT 13366105 13366001 + DEFINING := BOOLEAN(REAL(DEFINING) & 1[47:47:1]); 14255500 + DEFINING := BOOLEAN(REAL(DEFINING) & 0[47:47:1]); 14268500 +L1: 15092000 + XMARK; 15092010 + IF TALL.FORMALNAME THEN 15092020 + ENDOFITALL: 16495210 +IF XREF OR DEFINING.[1:1] THEN 16495300 + BEGIN DEFINE LSS = <#,GTR=>#,NEQ= !#,LEQ ={=#; %DFB17002000 + DEFINE XREFINFO =INFO#; 17002005 + CLOSE(CARD,RELEASE); 17002490 + CLOSE(TAPE,RELEASE); 17002500 + LOCK(NEWTAPE); 17002510 + WRITE(LINE[PAGE]); 17002520 + FOR XREFPT:=XREFPT STEP 1 UNTIL 29 DO XREFAY2[XREFPT]:=100000000; 17003000 + WRITE(DSK2,30,XREFAY2[*]); %DFB17004000 + TOTALNO~REAL(XLUN >500)|1000+3000+XLUN; 17004500 + XREFPT~XLUN~0; %DFB17004600 + BEGIN %DFB17005000 + BOOLEAN PROCEDURE INPUT1(A); %DFB17006000 + ARRAY A[0]; %DFB17007000 + BEGIN %DFB17008000 + LABEL L,EOF; %DFB17009000 + READ(DSK1,10,A[*])[EOF]; %DFB17010000 + GO TO L; %DFB17011000 + EOF: INPUT1:=TRUE; %DFB17012000 + REWIND(DSK1); %DFB17013000 + L: %DFB17014000 + END; %DFB17015000 + PROCEDURE OUTPUT1(B,A); %DFB17016000 + VALUE B; %DFB17017000 + BOOLEAN B; %DFB17018000 + ARRAY A[0]; %DFB17019000 + BEGIN %DFB17020000 + IF B THEN %DFB17021000 + REWIND(DSK1) %DFB17022000 + ELSE %DFB17023000 + BEGIN %DFB17024000 + A[9]:=XREFINFO(A[9].LINKR,A[9].LINKC):=XLUN:=XLUN+1;%DFB17025000 + WRITE(DSK1,10,A[*]); %DFB17026000 + END; %DFB17027000 + END; %DFB17028000 + BOOLEAN STREAM PROCEDURE COMPS1(A,B); %DFB17029000 + BEGIN %DFB17030000 + SI:=A; %DFB17031000 + DI:=B; %DFB17032000 + IF 63 SC LSS DC THEN TALLY:=1; %DFB17033000 + COMPS1:=TALLY; %DFB17034000 + END; %DFB17035000 + STREAM PROCEDURE HVS1(A); %DFB17036000 + BEGIN %DFB17037000 + DI:=A; %DFB17038000 + DS:=8 LIT "9"; %DFB17039000 + SI:=A; %DFB17040000 + DS:= 7 WDS; %DFB17041000 + END; %DFB17042000 + BOOLEAN PROCEDURE COMP1(A,B); %DFB17042100 + ARRAY A,B[0]; %DFB17042200 + COMP1:=COMPS1(A,B); %DFB17042300 + PROCEDURE HV1(A); %DFB17042400 + ARRAY A[0]; %DFB17042500 + HVS1(A); %DFB17042600 + XLUN:=0; %DFB17043000 + REWIND(DSK1); %DFB17044000 + SORT(OUTPUT1,INPUT1,0,HV1,COMP1,10,TOTALNO ); %DFB17045000 + END; %DFB17046000 + BEGIN %DFB17047000 + STREAM PROCEDURE PUP(S,D); %DFB17048000 + BEGIN %DFB17049000 + SI:=S; %DFB17050000 + DI:=D; %DFB17051000 + DS:=7 WDS; 8(DS:=8 LIT " "); 17052000 +$VOIDT 17054551 17053000 + END; %DFB17055000 + STREAM PROCEDURE PUP1(S,D); 17055100 + BEGIN 17055200 + SI:=S; SI:=SI+32; SI:=SI+28; 17055300 + DI:=D; DS:=2 LIT " "; DS:=4 CHR; DS:=2 LIT " *"; 17055400 + DS:=9 CHR; DS:=LIT "*"; DS:= 38 LIT " "; 17055500 + END; 17055550 + STREAM PROCEDURE PUP2(STAR,S,C,D); 17056000 + VALUE STAR,S,C; 17056500 + BEGIN %DFB17057000 + DI:=D; %DFB17058000 + C(DI:=DI+10); 17059000 + STAR(DI~DI-1; DS~LIT"*"); 17059100 + SI:=LOC S; %DFB17060000 + DS:= 8 DEC; %DFB17061000 + DS:=LIT " "; STAR(DI:=DI-1; DS:=LIT "*"); 17061100 + END; %DFB17062000 + STREAM PROCEDURE BLANKET(A); %DFB17063000 + BEGIN %DFB17064000 + DI:=A; %DFB17065000 + DS:= 8 LIT " "; %DFB17066000 + SI:=A; %DFB17067000 + DS:= 14 WDS; %DFB17068000 + END; %DFB17069000 + ARRAY PAY[0:17]; %DFB17069500 + BOOLEAN PROCEDURE INPUT2(A); %DFB17070000 + ARRAY A[0]; %DFB17071000 + BEGIN %DFB17072000 + LABEL L,EOF; %DFB17073000 + DEFINE I=XLUN#; %DFB17073100 + IF XREFPT:=XREFPT+1=30 THEN %DFB17074000 + BEGIN %DFB17075000 + READ(DSK2,30,XREFAY2[*])[EOF]; %DFB17076000 + XREFPT:=0; %DFB17077000 + END; %DFB17078000 + IF ( I :=XREFAY2[XREFPT]).[21:27] GTR 99999999 THEN GO TO EOF;17079000 + A[0]:= I&XREFINFO(I.[ 9:4],I.[13:8])[ 9:36:12]; %DFB17080000 + GO TO L; %DFB17081000 + EOF: INPUT2:=TRUE; %DFB17082000 + BLANKET(PAY); %DFB17083000 + XREFAY1[9]:=-1; XREFPT~0; %DFB17084000 + L: %DFB17085000 + END; %DFB17086000 + PROCEDURE OUTPUT2(B,A); %DFB17087000 + VALUE B; %DFB17088000 + BOOLEAN B; %DFB17089000 + ARRAY A[0]; %DFB17090000 + BEGIN DEFINE PRINTER=LINE#; %DFB17091000 + LABEL LOOP,EOF2; 17091100 + OWN BOOLEAN B2; 17091110 + LABEL DUN; 17091200 + IF NOT B2 THEN 17091210 + IF B THEN %DFB17092000 + WRITE(PRINTER,15,PAY[*]) %DFB17093000 + ELSE %DFB17094000 + IF LASTADDRESS ! LASTADDRESS~A[0] AND LASTADDRESS.[9 :121! 0 THEN 17094100 + BEGIN %DFB17095000 + LOOP: %DFB17095050 + IF A[0].[ 9:12] GTR XREFAY1[9] THEN %DFB17095100 + BEGIN %DFB17095200 +$ 17096000 + WRITE(PRTNTER,15,PAY[*]); 17097000 +$ 17098000 + BLANKET(PAY ); XREFPT:=0; 17099000 + READ(DSK1,10,XREFAY1[*])[EOF2]; 17099100 + PUP(XREFAY1,PAY); 17099200 + WRITE(PRINTER[DBL]); 17099900 + WRITE(PRINTER,10,PAY[*]); %DFB17100000 + PUP1(XREFAY1,PAY); 17100100 + WRITE(PRINTER[DBL],10,PAY[*]); 17100200 + BLANKET(PAY); %DFB17101000 + GO LOOP; %DFB17101100 + END; %DFB17102000 +DUN: 17102100 + PUP2(LASTADDRESS < 0,LASTADORESS.[21:27],17103000 + XREFPT,PAY[L]); 17103010 + IF XREFPT:=XREFPT+1 = 11 THEN 17103100 + BEGIN %DFB17103200 + XREFPT:=0; %DFB17103300 + WRITE(PRINTER,15,PAY[*]); %DFB17103400 + BLANKET(PAY); %DFB17103500 + END; %DFB17103600 + END; %DFB17110000 + IF FALSE THEN EOF2: B2:=TRUE; 17110500 + END; %DFB17111000 + PROCEDURE HV2(A); %DFB17112000 + ARRAY A[0]; %DFB17113000 + A[0]:=549755813887; %DFB17114000 + BOOLEAN PROCEDURE COMP2(A,B); %DFB17115000 + ARRAY A,B[0]; %DFB17116000 + COMP2~ ABS(A[0]) LEQ ABS(B[0]); 17117000 + XREFPT:=29; REWIND(DSK2); %DFB17118000 + SORT(OUTPUT2,INPUT2,0,HV2,COMP2,1,TOTALNO ); %DFB17119000 + END; %DFB17120000 + END; %DFB17121000 + END MAIN BLOCK; 17121500 + END. %DFB17122000 +$: BY JTC - MSC DETROIT 99990000 +$:**********************************************************************99990100 +$#PATCH NUMBER 110 FOR ESPOL CONTAINS 503 CARDS 00000000 +$ VOIDT 01001771 01001750 +%***********************************************************************01007005 +% X R E F S T U F F 01007010 +%***********************************************************************01007015 +% 01007020 +ARRAY 01007025 + XREFAY2[0:29], % ARRAY OF ONE WORD REFERENCE RECORDS. 01007030 + % THE LAYOUT OF EACH WORD IS 01007035 + % 01007040 + % .[1:5] TYPE OF REFERENCE 01007045 + % = 0 FOR FORWARD DECL 01007050 + % = 1 FOR LABEL OCCURENCE 01007051 + % = 2 FOR NORMAL DECL 01007055 + % = 4 FOR NORMAL REFERENCE 01007060 + % = 5 FOR ASSIGNMENT 01007065 + % 01007070 + % NOTE: THE LOWER ORDER BIT 01007075 + % OF THIS FIELD IS ON 01007080 + % IF YOU WANT STARS 01007085 + % AROUND THIS REFERENCE 01007090 + % IN THE XREF 01007095 + % 01007100 + % .[6:15] IDENTIFIER ID. NO. 01007105 + % THIS IS A UNIQUE NUMBER THAT 01007110 + % IS ASSIGNED WHEN THE 01007115 + % IDENTIFIER IS ENCOUNTERE 01007120 + % FOR THE FIRST TIME. 01007125 + % 01007130 + % .[21:27] SEQUENCE NUMBER 01007135 + % 01007140 +XREFAY1[0:9], % RECORD BUFFER AREA FOR WRITING OUT THE 01007145 + % NAME INFORMATION RECORDS, ONE RECORD 01007150 + % IS WRITTEN FOR EACH IDENTIFIER IN THE SYMBOL 01007155 + % TABLE WHEN THE IDENTIFIER IS PURGED FROM THE 01007160 + % SYMBOL TABLE, I.E., WHEN LEAVING THE BLOCK 01007165 + % IN WHICH THE IDENTIFIER IS DECLARED. 01007170 + % 01007175 + % THE LAYOUT OF EACH RECORD IS 01007180 + % 01007185 + % WORDS 0-7 THE IDENTIFIER WITH BLANK 01007190 + % FILL ON THE RIGHT 01007195 + % 01007200 + % WORD 8 01007205 + % .[21:12] SEGMENT NUMBER IN WHICH 01007210 + % THIS IDENTIFIER WAS DECLARED01007215 + % 01007220 + % .[33:15] IDENTIFIER ID. NO. 01007225 + % 01007230 + % WORD 9 ELBAT WORD 01007235 + % 01007240 +XINFO[0:31,0:0127]; % THIS ARRAY CONTAINS ONE ENTRY FOR EACH ENTRY 01007245 + % IN THE INFO TABLE. IF YOU HAVE THE INDEX 01007250 + % OF THE ELBAT WORD FOR AN IDENTIFIER IN 01007255 + % THE INFO TABLE YOU CAN FIND THE XINFO WORD 01007260 + % FOR THE IDENTIFIER BY REFERRING TO: 01007265 + % 01007270 + % XINFO[INDEX.LINKR,INDEX.LINKC DIV 2] 01007275 + % 01007280 + % EACH ENTRY CONTAINS: 01007285 + % 01007290 + % .[21:12] SEGMENT NUMBER IN WHICH 01007295 + % THIS IDENTIFIER WAS DECL01007300 + % 01007305 + % .[33:15] IDENTIFIER ID. NO. 01007310 + % IF THIS ID. NO. IS ZERO 01007315 + % THEN XREF WAS NOT ON 01007320 + % AT THE TIME THE IDENT 01007325 + % WAS DECLARED AND ALL 01007330 + % FUTURE REFERENCES WILL 01007335 + % BE DISCARDED. 01007340 + % 01007345 +INTEGER % 01007350 + XREFPT, % CONTAINS INDEX OR NEXT AVAILABLE SLOT IN 01007355 + % XREFAY2. WHEN THIS BECOMES GREATER 01007360 + % THAN 30 THE CURRENT ARRAY IS DUMPED TO DISK 01007365 + % AND XREFPT IS RESET TO ZERO. 01007370 + % 01007375 + XLUN; % THIS VARIABLE CONTROLS THE ASSIGNING OF 01007380 + % ID. NO. TO IDENTIFIERS. IT IS INCREMENTED 01007385 + % EACH TIME A NEW IDENTIFIER IS ENCOUNTERED. 01007390 + % 01007395 +DEFINE % 01007400 + SEGNOF = [21:12]#, % FIELDS IN XINFO ENTRIES AND WORD 8 OF 01007405 + IDNOF = [33:15]#, % IDENTIFIER RECORDS. 01007410 + % 01007415 + TYPEREF = [1:5]#, % FIELDS OF REFERENCE WORDS 01007420 + REFIDNOF =[6:5]#, % 01007425 + SEQNOF = [21:27]#, % 01007430 + % 01007435 + XREFIT(INDEX,SEQNO,REFTYPE) = % DEFINE TO ADD INFO TO REF TABLE 01007440 + BEGIN IF XREF THEN CROSSREFIT(INDEX,SEQNO,REFTYPE); END#, 01007445 + % 01007450 + XMARK(REFTYPE) = % DEFINE TO CHANGE LAST ENTRY IN REF TABLE TO A 01007455 + BEGIN IF XREF THEN XREFAY2[XREFPT-1].TYPEREF := REFTYPE END#, 01007460 + % 01007465 + XREFDUMP(INDEX) = % DEFINE TO DUMP SYMBOL TABLE INFO FOR IDENTIFIER01007470 + BEGIN IF DEFINING.[1:1] THEN CROSSREFDUMP(INDEX); END#, 01007475 + % 01007480 + XREFINFO(INDEX) = % DEFINE TO TRANSLATE INFO ROW AND COLUMN TO 01007481 + XINFO[(INDEX).LINKR,(INDEX).LINKC DIV 2]#, % XINFO ROW AND COL 01007482 + % 01007483 + FORWARDREF = 0#, % DEFINES FOR DIFFERENT REFERENCE TYPES 01007485 + LBLREF = 1#, % 01007486 + DECLREF = 2#, % 01007490 + NORMALREF = 4#, % 01007495 + ASSIGNREF = 5#; % 01007500 +$VOIDT 01723000 +%***********************************************************************02001605 +% 02001610 +% MISCELLANEOUS CROSS REFERENCE PROCEDURES 02001615 +% 02001620 +$ VOIDT 02001831 02001625 +%***********************************************************************02001630 +% 02001635 +PROCEDURE CROSSREFIT(INDEX,SEQNO,REFTYPE); 02001640 + VALUE INDEX,SEQNO,REFTYPE; 02001645 + REAL INDEX,SEQNO,REFTYPE; 02001650 +BEGIN 02001655 + IF XREFINFO(INDEX).IDNOF ! 0 THEN % SAVE 02001660 + BEGIN 02001665 + IF XREFPT > 29 THEN % NO SLOTS LEFT IN ARRAY. WRITE IT OUT. 02001670 + BEGIN 02001675 + WRITE(DSK2,30,XREFAY2[*]); 02001680 + XREFPT := 0; 02001685 + END; 02001690 + XREFAY2[XREFPT] := SEQNO & REFTYPE TYPEREF & XREFINFO(INDEX) 02001695 + REFIDNOF; 02001700 + XREFPT := XREFPT + 1; % EVEN THOUGH THE ARRAY MAY BE FULL NOW WE 02001705 + % CANT WRITE IT OUT BECAUSE SOME ROUTINES 02001710 + % WILL LOOK BACK AT THE ENTRY WE JUST PUT 02001715 + % IN AND FIX IT UP. 02001720 + END; 02001725 +END OF CROSSREFIT; 02001730 +% 02001735 +PROCEDURE CROSSREFDUMP(INDEX); 02001740 + VALUE INDEX; 02001745 + REAL INDEX; 02001750 +BEGIN 02001755 + STREAM PROCEDURE MOVEXREFINFO(S,D,N); 02001760 + VALUE N; 02001765 + BEGIN 02001770 + SI := D; DI := D; DS := 8 LIT " "; DS := 7 WDS; % BLANK RECORD 02001775 + SI := S; SI:= SI + 3; DI := D; DS := N CHR; % MOVE IDENTIFIER 02001780 + END OF MOVEXREFINFO; 02001785 + % 02001790 +IF XREFINFO(INDEX).IDNOF ! 0 THEN % DUMP IT 02001795 +BEGIN 02001800 + MOVEXREFINFO(INFO[INDEX.LINKR,INDEX.LINKC+1],XREFAY1[*], 02001805 + TAKE(INDEX+1).[12:6]); 02001810 + XREFAY1[8] := XREFINFO(INDEX); 02001815 + XREFAY1[9] := TAKE(INDEX); % ELBAT WORD 02001820 + WRITE(DSK1,10,XREFAY1[*]); 02001821 + XREFINFO(INDEX) := 0; 02001822 + END; 02001825 +END OF CROSSREFDUMP; 02001830 +$VOIDT 02882921 02882099 + IF GT1 !1 AND NOT MACROID THEN % NOT RESERVED WORD 02882100 + XREFIT(T.LINK,CARDNUMBER,NORMALREF); % BUILD XREF ENTRY 02882200 + XMARK(LBLREF); % THIS WILL SORT AHEAD OF DECLARATION 07598100 + % WHEN WE GET AROUND TO THE XREF. 07598200 + XMARK(ASSIGNREF); % FILL STATEMENT 07660600 + XMARK(ASSIGNREF); % FOR STATEMENT 08178100 + XREFDUMP(POINTER); % DUMP XREF INFO 13283500 +$ VOIDT 13301731 13301099 + IF XREF THEN % MAKE DECLARATION REFERENCE 13310050 +% IF (ACCUM[0].CLASS ! DEFINEDID OR NOT 13310075 +% BOOLEAN(ACCUM[0].FORMAL)) THEN % NOT DEFINE PARAMETER 13310080 +$ VOIDT 13310601 13310099 + BEGIN 13310100 + XREFINFO(NEXTINFO) := 13310200 + IF SPECTOG THEN 13310300 + XREFINFO(ELBAT[I]) 13310350 + ELSE 13310400 + ((XLUN := XLUN + 1) & SGNO SEGNOF); 13310450 + IF SPECTOG THEN % JUST GO BACK AND FIX UP XREF ENTRY 13310500 + XMARK(DECLREF) 13310525 + ELSE 13310550 + XREFIT(NEXTINFO,CARDNUMBER,IF PTOG AND NOT STREAMTOG 13310575 + THEN NORMALREF ELSE DECLREF); 13310580 + END 13310600 +% ELSE % DEFINE PARAMETERS - DONT CROSS REF. 13310700 +% XREFINFO(NEXTINFO) := 0 13310750 + ELSE 13310800 + IF DEFINING.[1:1] THEN % WE ARE DOING XREFING 13310900 + XREFINFO(NEXTINFO) := 0; 13310950 + IF XREF AND NOT SPECTOG THEN % ERASE PREVIOUS XRFF ENTRY. 13341200 + XMARK(DECLREF); % PROCEDURE DECLARED FORWARD: MARK LAST 14312100 + % XREF ENTRY AS A DECLARATION. 14312101 + XREFDUMP(J); % DUMP XREF INFO 14445100 + XREFIT(PROINFO,0,FORWARDREF); % WE NEED THIS SO WE CAN FIND 14469100 + % THE FORWARD DECL. DURING XREF 14469101 + REAL REMEMBERSEQNO; % REMEMBERS SEQUENCE NUMRER OR VARIABLE 15075550 + % ON LEFT HAND SIDE OF ASSIGNMENT SO WE 15075551 + % CAN XREF IT CORRECTLY. 15075552 + REMEMBERSEQNO := CARDNUMBER; 15085100 + XMARK(ASSIGNREF); % ASSIGNMENT TO SIMPLE VARIABLE. 15091100 +$VOIDT 15092010 + BEGIN 15113100 + BEGIN 15115000 + ERR(201); % PARTIAL WORD NOT LEFT-MOST 15115100 + GO TO EXIT; 15115200 + END; 15115300 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); 15116000 + GO TO L1; 15116100 + END; 15116200 + JAZZ: XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); STEPIT; AEXP; 15233012 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); % ASSIGNMENT TO15301100 + % SUBSCRIPTED VARIABLE. 15301200 + IF STEPI = ASSIGNOP THEN 15342000 + IF P1 = FS THEN % PARTIAL WORD IS LEFT-MOST 15342100 + BEGIN 15342200 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); % PARTIAL15342300 + % WORD ASSIGNMENT TO SUBSCR. VAR. 15342400 + GO TO LAST; 15342500 + END 15342600 + XMARK(LBLREF); % MARK LABEL OCCURENCE FOR XREF 16159100 + XMARK(ASSIGNREF); 16318500 +IF (XREF OR DEFINING.[1:1]) AND XLUN > 0 THEN 16495300 + DEFINE XREFINFO(INDEX) = INFO[((INDEX).CF DIV 2).[33:7], 17002005 + ((INDEX).CF DIV 2).LINKC]#, 17002006 + CF = [33:15]#, 17002007 + FF = [18:15]#, 17002008 + NEWID[INDEX] = (IF BOOLEAN(INDEX) THEN XREFINFO(INDEX).FF 17002009 + ELSE XREFINFO(INDEX).CF)#; 17002010 + ARRAY TIMINGS[0:2,0:3]; 17002012 + PROCEDURE SAVETIMES(I); 17002015 + VALUE I; INTEGER I; 17002020 + BEGIN 17002025 + INTEGER J; 17002030 + FOR J := 1 STEP 1 UNTIL 3 DO 17002035 + TIMINGS[I,J] := TIME(J); 17002040 + END; 17002045 + PROCEDURE UPDATETIMES(I); 17002050 + VALUE I; INTEGER I; 17002055 + BEGIN 17002060 + INTEGER J; 17002065 + FOR J := 1 STEP 1 UNTIL 3 DO 17002070 + TIMINGS[I,J] := TIME(J) - TIMINGS[I,J]; 17002075 + END; 17002080 + SAVETIMES(0); % SAVE TIMES FOR START OF IDENTIFIER SORT. 17002525 + TOTALNO := XLUN; % REMEMBER NUMBER OF IDENTIFIERS. 17004500 + FOR I := 0 STEP 1 UNTIL 8191 DO 17004700 + PUT(0,I); 17004710 + BEGIN 17022000 + REWIND(DSK1); 17022100 + UPDATETIMES(0); % UPDATE TIMES FOR IDENTIFIER SORT. 17022200 + TIMINGS[0,0] := XLUN; % NUMBER OF IDENTIFIERS SORTED. 17022300 + END 17022400 + IF BOOLEAN(A[8]) THEN 17025000 + XREFINFO(A[8]).FF := XLUN := XLUN + 1 17025100 + ELSE 17025200 + XREFINFO(A[8]).CF := XLUN := XLUN + 1; 17025300 + A[8].IDNOF := XLUN; 17025400 + IF 63 SC < DC THEN 17033000 + TALLY := 1 17033100 + ELSE 17033200 + BEGIN 17033300 + SI := A; 17033400 + DI := B; 17033500 + IF 63 SC = DC THEN 17033600 + TALLY := 2; 17033700 + END; 17033800 + DS := 8 LIT 3"777777777"; % ID.NO, AND SEQ.NO. FIELDS 17041100 + IF REAL(COMP1:=COMPS1(A,B)) = 2 THEN % IDS EQUAL 17042300 + COMP1 := A[8].IDNOF < B[8].IDNOF; 17042350 + SORT(OUTPUT1,INPUT1,0,HV1,COMP1,10,IF TOTALNO < 1000 THEN 17045000 + 7000 ELSE 10000); 17045100 +$ VOIDT 17069001 17047001 + ARRAY IDTYPE[0:(IDMAX+3)|4-1]; 17047100 + STREAM PROCEDURE SETUPHEADING(S,D,SEG,SEQNO,FWDTOG,LBLTOG, 17047200 + FWDSEQNO,TYPE,OWNTOG,PARAMTOG, 17047300 + VALTOG); 17047350 + VALUE SEG,SEQNO,FWDTOG,LBLTOG,FWDSEQNO,OWNTOG,PARAMTOG, 17047400 + VALTOG; 17047450 + BEGIN 17047500 + SI := S; 17047700 + DI := D; 17047800 + 63 (IF SC = " " THEN JUMP OUT ELSE DS := CHR); 17047900 + DS := 6 LIT " -- "; 17048000 + OWNTOG (DS := 4 LIT "OWN "); 17048100 + SI := TYPE; 17049300 + 32 (IF SC = "." THEN JUMP OUT ELSE DS := CHR); 17049400 + PARAMTOG (DS := 6 LIT " -- "; 17049410 + DS := 4 LIT "NAME"; 17049420 + VALTOG (DI := DI - 4; DS := 5 LIT "VALUE"); 17049430 + DS := 10 LIT " PARAMETER"); 17049440 + DS := 18 LIT " -- DECLARED AT "; 17049500 + SI := LOC SEQNO; 17050400 + DS := 8 DEC; 17050500 + FWDTOG (DS := 17 LIT " -- FORWARD AT "; 17050600 + SI := LOC FWDSEQNO; 17050700 + DS := 8 DEC); 17050800 + LBLTOG (DS := 16 LIT " -- OCCURS AT "; 17050900 + SI := LOC FWDSEQNO; 17051000 + DS := 8 DEC); 17051100 + END OF SETUPHEADING; 17051200 + 17051300 + STREAM PROCEDURE ADDASEQNO(SEQNO,N,STARS,D); 17051400 + VALUE SEQNO,N,STARS; 17051500 + BEGIN 17051600 + DI := D; 17051700 + DI := DI + 8; 17051800 + N (DI := DI + 10); 17051900 + STARS(DI := DI - 1; DS := LIT "*"); 17052000 + SI := LOC SEQNO; 17052100 + DS := 8 DEC; 17052200 + DS := LIT " "; 17052300 + STARS (DI := DI - 1; DS := LIT "*"); 17052400 + END; 17052500 + STREAM PROCEDURE BLANKET(D); 17052600 + BEGIN 17052700 + DI := D; 17052800 + DS := 8 LIT " "; 17052900 + SI := D; 17053000 + DS := 16 WDS; 17053100 + END OF BLANKET; 17053200 + PROCEDURE PRINTXREFSTATISTICS; 17053300 + BEGIN 17053400 + SWITCH FORMAT STATS := 17053500 + (///, "CROSS REFERENCE STATISTICS", /, 17053600 + "----- --------- ----------", /), 17053700 + ("PHASE ONE - SORT",I6," IDENTIFIERS"), 17053800 + ("PHASE TWO - SORT",I7," REFERENCES"), 17053900 + ("PHASE THREE - PRINT CROSS REFERENCE (",I7," LINES)"), 17054000 + (X5,I4,":",2I1," ELAPSED TIME (MIN:SEC)"), 17054100 + (X5,I4,":",2I1," PROCESSOR TIME"), 17054200 + (X5,I4,":",2I1," I/O TIME",/); 17054300 + INTEGER I,J,K; 17054400 + WRITE(LINE,STATS[0]); 17054500 + FOR I := 1 STEP 1 UNTIL 2 DO 17054600 + BEGIN 17054700 + WRITE(LINE,STATS[I+1],TIMINGS[I,0]); 17054800 + FOR J := 1 STEP 1 UNTIL 3 DO 17054900 + BEGIN 17055000 + K := (TIMINGS[I,J] + 30) DIV 60; % ROUND TO NEAREST SECON17055010 + WRITE(LINE,STATS[J+3],K DIV 60,(K:=K MOD 60) DIV 10, 17055020 + K MOD 10); 17055025 + END; 17055030 + END; 17055100 + END PRINTXREFSTATISTICS; 17055200 + DEFINE REFCOUNT = TIMINGS[1,0]#; % NUMBER OF REFERENCES SORTED.17069300 + BOOLEAN FIRSTTIME; % TRUE ON FIRST CALL OF OUTPUT PROCEDURE. 17069400 + REAL LASTADDRESS; 17069600 + DEFINE I = LASTADDRESS#; 17073100 + A[0] := I & NEWID[I.REFIDNOF] REFIDNOF; 17080000 + REFCOUNT := REFCOUNT + 1; 17080100 + XREFAY1[8] := XREFPT := LASTADDRESS := 0; 17084000 + FILL IDTYPE[*] WITH 17084010 + "UNKNOWN. ", % 0 17084020 + "STREAM LABEL. ", % 1 17084030 + "STREAM VARIABLE. ", % 2 17084040 + "DEFINE. ", % 3 17084050 + "LIST. ", % 4 17084060 + "FORMAT. ", % 5 17084070 + "SWITCH FORMAT. ", % 6 17084080 + "REAL SUBROUTINE. ", % 7 17084090 + "SUBROUTINE. ", % 8 17084100 + "SWITCH LABEL. ", % 9 17084110 + "PROCEDURE. ", % 10 17084120 + "INTRINSIC. ", % 11 17084130 + "STREAM PROCEDURE. ", % 12 17084140 + "BOOLEAN STREAM PROCEDURE. ", % 13 17084150 + "REAL STREAM PROCEDURE. ", % 14 17084160 + "INTEGER STREAM PROCEDURE. ", % 15 17084170 + "INTEGER STREAM PROCEDURE. ", % 16 17084180 + "BOOLEAN PROCEDURE. ", % 17 17084182 + "REAL PROCEDURE. ", % 18 17084184 + "INTEGER PROCEDURE. ", % 19 17084186 + "INTEGER PROCEDURE. ", % 20 17084188 + "BOOLEAN. ", % 21 17084190 + "REAL. ", % 22 17084200 + "INTEGER. ", % 23 17084210 + "INTEGER. ", % 24 17084220 + "BOOLEAN ARRAY. ", % 25 17084230 + "REAL ARRAY. ", % 26 17084240 + "INTEGER ARRAY. ", % 27 17084250 + "INTEGER ARRAY. ", % 28 17084260 + " ", % 29 17084270 + "NAME. ", % 30 17084280 + "INTEGER NAME. ", % 31 17084290 + "LABEL. "; % 32 17084300 + LABEL EOF2, SKIP; 17091100 + OWN BOOLEAN B2, FWDTOG, LBLTOG, WAITINGFORFWDREF; 17091110 + DEFINE MATCH(A,B) = REAL(BOOLEAN(A) EQV BOOLEAN(B)) = 17091115 + REAL(NOT FALSE)#; 17091116 + REAL I; 17091120 + DEFINE LINECOUNT = TIMINGS[2,0]#; % NUMBER OR LINES PRINTED. 17091140 + OWN REAL FWDSEQNO; 17091150 + IF FIRSTTIME THEN % PRINT HEADINGS AND SAVE TIMINGS. 17091155 + BEGIN 17091160 + FIRSTTIME := FALSE; 17091162 + TIME1 := TIME(1); 17091165 + DATIME; 17091170 + UPDATETIMES(1); 17091175 + SAVETIMES(2); % SAVE TIMES FOR START OF XREF PRINT. 17091180 + END; 17091200 +$VOIDT 17111001 17091201 + IF NOT B2 THEN 17091210 + IF B THEN % END OF SORT - LIST OUT REST OF SEQ. NO. 17091300 + IF XREFPT ! 0 THEN % WE GOT SOME TO LIST OUT 17091400 + BEGIN 17091500 + WRITE(LINE[DBL],15,PAY[*]); 17091510 + LINECOUNT := LINECOUNT + 1; 17091520 + END 17091530 + ELSE % NOTHING TO LIST OUT 17091600 + ELSE % NOT END OF SORT 17091700 + IF NOT MATCH(LASTADDRESS,A[0]) AND A[0].REFIDNOF ! 0 AND 17091800 + A[0].REFIDNOF } XREFAY1[8].IDNOF THEN 17091900 + IF A[0].TYPEREF = FORWARDREF THEN % 17092000 + WAITINGFORFWDREF := TRUE 17092100 + ELSE 17092200 + IF A[0].TYPEREF = LBLREF THEN % 17092300 + BEGIN 17092400 + LBLTOG := TRUE; 17092500 + FWDSEQNO := A[0].SEQNOF; 17092600 + END 17092700 + ELSE 17092800 + IF A[0].TYPEREF = DECLREF THEN 17092900 + IF WAITINGFORFWDREF THEN % THIS MUST BE IT 17093000 + BEGIN 17093100 + WAITINGFORFWDREF := FALSE; 17093200 + FWDTOG := TRUE; 17093300 + FWDSEQNO := A[0].SEQNOF; 17093400 + END 17093500 + ELSE % ITS A NORMAL DECLARATION - NOT FORWARD 17093600 + BEGIN 17093700 + IF A[0].REFIDNOF > XREFAY1[8].IDNOF THEN 17093800 + DO 17093900 + READ(DSK1,10,XREFAY1[*]) [EOF2] 17093950 + UNTIL 17094000 + A[0].REFIDNOF { XREFAY1[8].IDNOF; 17094050 + IF A[0]. REFIDNOF < XREFAY1[8].IDNOF THEN 17094100 + GO TO SKIP; 17094150 + IF XREFPT > 0 THEN % THERE IS STUFF TO PRINT 17094200 + BEGIN 17094240 + IF SINGLTOG THEN 17094250 + WRITE(LINE,15,PAY[*]) 17094300 + ELSE 17094350 + WRITE(LINE[DBL],15,PAY[*]); 17094400 + LINECOUNT := LINECOUNT + L; 17094410 + END 17094420 + ELSE 17094450 + IF NOT SINGLTOG THEN 17094500 + WRITE(LINE); 17094550 + XREFPT := 0; 17094600 + BLANKET(PAY[*]); 17094650 + SETUPHEADING(XREFAY1[*],PAY[*],XREFAY1[8]. 17094700 + SEGNOF,A[0].SEQNOF,FWDTOG,LBLTOG, 17094800 + FWDSEQNO,IDTYPE[(IF (I := 17094900 + XREFAY1[9].CLASS) > IDMAX THEN 17095000 + 0 ELSE I) | 4], 17095100 + REAL(I } BOOID AND XREFAY1[9].[9:2] = 1), 17095300 + REAL((I } BOOID OR I = LOCLID) AND BOOLEAN 17095310 + (XREFAY1[9].[9:1])), XREFAY1[9].[10:1]); 17095320 + FWDTOG := LBLTOG := FALSE; 17095400 + WRITE(LINE,15,PAY[*]); 17095500 + LINECOUNT := LINECOUNT + 1; 17095510 + BLANKET(PAY[*]); 17095550 + END 17095600 + ELSE % IT MUST BE A NORMAL REFERENCE 17095700 + IF A[0].SEQNOF ! LASTADDRESS.SEQNOF THEN 17095750 + BEGIN 17095800 + ADDASEQNO(A[0].SEQNOF,XREFPT,A[0].[5:1], 17095900 + PAY[*]); 17096000 + IF (XREFPT := XREFPT + 1) = 11 THEN %FULL 17096100 + BEGIN 17096200 + WRITE(LINE,15,PAY[*]); 17096300 + LINECOUNT := LINECOUNT + 1; 17096350 + XREFPT := 0; 17096400 + BLANKET(PAY[*]); 17096450 + END 17096500 + END 17096550 + ELSE % REFERENCE TO SAME SEQ. NO. SKIP IT 17096575 + ELSE % THIS IS A REFERENCE TO THE SAME SEQ. NO. - SKIP 17096600 + ELSE % HIT END OF IDENTIFIER FILE - JUST SKIP OVER REFERENCES 17096700 + EOF2: B2 := TRUE; % SO SORT CAN GO TO NORMAL EOJ 17096800 + IF NOT B THEN SKIP: LASTADDRESS := A[0]; 17096850 + END OF OUTPUT2; 17096900 + A[0] := 3"777777777777777"; % BIGGEST FLOATING PT. NO. 17114000 + COMP2 := IF A[0].REFIDNOF = B[0].REFIDNOF THEN % DIF IDS 17117000 + TRUE 17117100 + ELSE 17117200 + IF A[0].REFIDNOF = B[0].REFIDNOF THEN 17117300 + IF A[0].[1:4] LSS B[0].[1:4] THEN 17117400 + TRUE 17117500 + ELSE 17117600 + IF A[0].[1:4] = B[0].[1:4] THEN 17117700 + IF A[0].SEQNOF < B[0].SEQNOF THEN 17117702 + TRUE 17117704 + ELSE 17117706 + IF A[0].SEQNOF = B[0].SEQNOF THEN 17117708 + BOOLEAN(A[0].[5:1]) 17117710 + ELSE 17117712 + FALSE 17117714 + ELSE 17117720 + FALSE 17117730 + ELSE 17117800 + FALSE; 17117900 + SAVETIMES(1); % SAVE TIMES FOR START OF REFERENCES SORT 17117910 + FIRSTTIME := TRUE; % LET OUTPUT PROCEDURE KNOW ABOUT FIRST CAL 17117920 + SORT(OUTPUT2,INPUT2,0,HV2,COMP2,1,6000); 17119000 + UPDATETIMES(2); % UPDATE TIMES FOR PRINTING CROSS REFERENCE 17119100 + PRINTXREFSTATISTICS; 17119200 +$: DATE 2/1/76 99990000 +$: 99990100 +$: BY JTC - MSA CENTRAL: 99990200 +$: THIS PATCH IS NEARLY A COMPLETE REWRITE OF THE ALGOL 99990300 +$: CROSS REFERENCE ROUTINES IN AN ATTEMPT TO REDUCE 99990400 +$: THE AMOUNT OF PAPER PRODUCED AND ALSO TO PROVIDE MORE 99990500 +$: INFORMATTON ABOUT THE IDENTIFIERS. IN PARTICULAR, 99990600 +$: THE FOLLOWING CHANGES HAVE BEEN MADE: 99990700 +$: 99990800 +$: 1). ONE LINE IS LISTED IN THE CROSS REFFRENCE FOR EACH 99990900 +$: IDENTIFIER WHICH INCLUDES THE FOLLOWING INFORMATION: 99991000 +$: A. THE NAME OF THE IDENTIFIER. 99991100 +$: B. THE CLASS OF THE IDENTIFIER, E.G., REAL, 99991200 +$: INTEGER, BOOLEAN. PROCEDURE, ETC. 99991300 +$: C. IF THE IDENTIFIER IS A FORMAL PARAMETER IT IS 99991400 +$: MARKED AS A "NAME PARAMETER" OR "VALUE PARAMETER". 99991550 +$: D. THE SEGMENT AND SEQUENCE NUMBER AT WHICH THE 99991600 +$: IDENTIFIER IS DECLARED. 99991700 +$: E. IF THE IDENTIFIER IS A PROCEDURE IDENTIFIER, THEN 99991800 +$: IF THE PROCEDURE IS DECLARED FORWARD THE SEQUENCE 99991900 +$: NUMBER OF THE FORWARD DECLARATION IS LISTED. 99992000 +$: F. IF THE IDENTFIER IS A LABEL IDENTIFIER. THE SEQUENCE 99992100 +$: NUMBER AT WHICH THE LABEL OCCURS IS LISTED. 99992200 +$: 99992300 +$: 2). ASSIGNMENTS TO IDENTIFIERS ARE NOW STARRED IN THE 99992400 +$: CROSS REFERENCE IN THE FOLLOWING ADDITIONAL CASES: 99992500 +$: A. WHEN A SUBSCRIPTED VARIABLE IS USED IN ASSIGNMENT. 99992600 +$: B. WHEN AN ARRAY ROW IS USED IN A FILL STATEMENT. 99992700 +$: C. WHEN AN ARRAY ROW IS USED IN A SEARCH STATEMENT. 99992800 +$: C. WHEN A SIMPLE VARIABLE IS USED IN A FOR STATEMENT. 99992900 +$: D. WHEN A LOCAL VARIABLE OR STREAM PARAMETER IS CHANGED 99993000 +$: BY BEING ASSIGNED THE VALUE OF SI,DI,CI OR TALLY. 99993100 +$: 99993200 +$: 3). DEFINE PARAMETERS ARE NO LONGER CROSS REFERENCED. 99993300 +$: 99993400 +$: 4). IDENTIFIERS REFERRED TO IN THE RIGHT HAND SIDE OF A 99993500 +$: DEFINE DECLARATION ARE NO LONGER CROSS 99993600 +$: REFERENCED AGAINST THE DEFINE DECLARATION. 99993700 +$: 99993800 +$: 5): IF NO IDENTIFIERS WERE CROSS REFERENCED, THE IDENTIFIER 99993900 +$: SORT WOULD BLOW UP WITH AN I/O ERROR 86. NOW, XREF 99994000 +$: CHECKS TO MAKE SURE THERE IS SOMETHING TO SORT BEFORE 99994100 +$: BEGTNNING. 99994200 +$: 99994300 +$: 6): IT SHOULD NOW BE POSSIBLE TO SET AND RESET XREF 99994400 +$: INDISCRIMINANTLY DURING A COMPILE WITHOUT CAUSING THE XREF 99994500 +$: TO GET CONFUSED. PREVIOUSLY, REFERENCES WOULD GET 99994600 +$: ASSOCIATED WITH THE WRONG IDENTIFIERS. THE RULE NOW IS THAT 99994700 +$: XREF MUST BE ON AT THE POINT OF DECLARATION FOR AN 99994800 +$: IDENTIFIER TO BE CROSS REFERENCED AT ALL. 99994900 +$: 99995000 +$: 7). PREVIOUSLY, WHEN THE SAME IDENTIFIER OCCURRED IN 99995100 +$: DIFFERENT BLOCKS, THE IDENTIFIERS WOULD BE LISTED 99995200 +$: IN NO PARTICULAR ORDER. NOW. THE IDENTIFIER THAT 99995300 +$: APPEARS FIRST WILL BE LISTED FIRST IN THE XREF. 99995400 +$: 99995500 +$#PATCH NUMBER 111 FOR ESPOL CONTAINS 3 CARDS: 00000000 + IF MERGETOG THEN % INDICATE NAME OF SOURCE FILE. 01835600 + WRITE(LINE,, 01835700 + (N1:=TAPE.MFID).[6:6],N1,(N2:=TAPE.FID).[6:6],N2); 01835800 +$: DATE 2/6/76 99990000 +$: BY JTC - MSA CENTRAL. 99990100 +$: 99990200 +$: THIS PATCH PRINTS THE NAME OF THE SOURCE FILE BELOW 99990300 +$: THE NAME OF THE OBJECT FILE ON THE PRINTED LISTING IF TAPE 99990400 +$: IS SET AT THE TIME THE HEADING IS PRINTED. 99990500 +$# PATCH NUMBER 112 FOR ESPOL CONTAINS 116 CARDS. 00000000 + 094 PARSE: MISSING RIGHT BRACKET 00069975 + 618 BLOCK: AUXMEM APPEARS IMMEDIATELY BEFORE IDENTIFIER (NO TYPE) 00418000 + SBITF =[21:6]#, % STARTING BIT FOR FIELD ID. 01154200 + NBITF =[27:6]#, % NUMRER OF BITS FOR FIELD NO. 01154300 + FIELDID =125#, COMMENT 175; 01278700 + DEFINEV =19#, COMMENT 23; 01298000 + AUXMEMV =20#, COMMENT 24; 01298500 + FIELDV =21#; COMMENT 25; 01298600 + DEFINE LASTSEQUENCE = 147#, 01569000 + IF STEPI = FIELDID THEN % GET INFO FROM INFO 05273100 + BEGIN 05273200 + FIRST := ELBAT[I].SBITF; 05273300 + SECOND := ELBAT[I].NBITF; 05273400 + GO TO EXIT; 05273500 + END 05273600 + ELSE 05273700 + IF ELCLASS = LFTBRKET THEN 05273800 + IF STEPI = FIELDID THEN 05273900 + BEGIN 05274000 + FIRST := ELBAT[I].SBITF; 05274100 + SECOND := ELBAT[I].NBITF; 05274200 + IF STEPI = RTBRKET THEN 05274300 + GO TO EXIT; 05274400 + END 05274500 + ELSE 05274600 + IF ELCLASS = LITNO THEN 05275000 + IF ELCLASS = FIELDID THEN 06315100 + BEGIN 06315200 + FIRST := ELBAT[I].SBITF; 06315300 + SECOND := 48 - (THIRD := ELBAT[I].NBITF); 06315400 + GO TO NEXTCHK; 06315500 + END 06315600 + ELSE 06315700 + IF STEPI = FIELDID THEN 06316100 + BEGIN 06316200 + FIRST := ELBAT[I].SBITF; 06316300 + SECOND := 48 - (THIRD := ELBAT[I].NBITF); 06316400 + IF STEPI ! RTBRKET THEN 06316500 + BEGIN 06316600 + ERR(94); 06316700 + GO TO EXIT; 06316800 + END; 06316900 + GO TO NEXTCHK; 06317000 + END 06317100 + ELSE 06317200 + IF ELCLASS = LITNO THEN 06317300 + OCT1310157730000002, "3SCS00", %652 09128600 + OCT0500000250000000, "5FIELD", %654 09128700 + IF ELCLASS>IDMAX AND ELCLASS IDMAX THEN IF I = 17095000 + FIELDID THEN 33 ELSE 0 ELSE I) | 4], 17095100 +$: DATE 2/2/76 99990000 +$: BY JTC - MSA CENTRAL 99990100 +$: 99990200 +$: THIS PATCH IMPLEMENTS A NEW DECLARATION TYPE OF "FIELD" WHICH 99990300 +$: PROVIDES A CONVENIENT METHOD FOR DESIGNATING A PARTIAL WORD FIELD 99990400 +$: A LA THE 6700 ESPOL AND ALGOL MECHANISM. THIS METHOD IS CONSIDERABLY 99990500 +$: MORE EFFICIENT THAN A DEFINE BECAUSE THE PARTIAL WORD FIELD INFOR- 99990600 +$: MATION IS STORED OFF WITH THE IDENTIFIER IN THE SYMBOL TABLE THUS 99990700 +$: MAKING REFERENCES TO THE PARTIAL WORD FIELD VERY INEXPENSIVE. 99990800 +$: 99990900 +$: THE SYNTAX FOR A PARTIAL WORD DECLARATION IS AS FOLLOWS: 99991000 +$: 99991100 +$: ::= FIELD 99991200 +$: 99991300 +$: ::= / , 99991400 +$: 99991500 +$: ::= = 99991600 +$: 99991700 +$: ::= 99991800 +$: 99991900 +$: ::= : / 99992000 +$: [ : ] / 99992100 +$: / 99992200 +$: [ ] 99992300 +$: 99992400 +$: SOME EXAMPLES: 99992500 +$: 99992600 +$: FIELD CF = [33:15]; 99992700 +$: 99992800 +$: FIELD FF = 18:15, 99992900 +$: SIZE = 08:10; 99993000 +$: 99993100 +$: FIELDS MAY BE USED ANYWHERE PARTIAL WORD DESIGNATORS MAY BE USED 99993200 +$: AND MAY BE ENCLOSED IN BRACKETS OR NOT AS DESIRED. ENCLOSING 99993300 +$: THE FIELD IDENTIFIER IN BRACKETS MAY HELP THE READABILITY OF 99993400 +$: THE CODE BUT OF COURSE REQUIRES EXTRA SCANNING BY THE 99993500 +$: COMPILER TO PROCESS THE BRACKETS. 99993600 +$: 99993700 +$: SOME EXAMPLES. 99993800 +$: 99993900 +$: I := I.FF; 99994000 +$: 99994100 +$: J := I.CF & 10 (SIZE] & K FF; 99994200 +$: 99994300 +$: I.FF := J.[CF]; 99994400 +$: 99994500 +$:**********************************************************************99999999 +$#PATCH NUMBER 113 FOR ESPOL CONTAINS 2 CARDS. 00000000 + $SET OMIT LISTA = LIST 00000999 + $POP OMIT LISTA 00499999 +$: DATE 3/2/76 99990000 +$: BY JTC = MSA CENTRAL 99990100 +$: 99990200 +$: THIS PATCH SETS OMIT AROUND THE COMMENT AT THE BEGINNING OF THE 99990300 +$: ESPOL COMPILER TO SPEED UP SCANNTNG OF THE COMMENT. 99990400 +$:**********************************************************************99999999 +$#PATCH NUMBER 114 FOR ESPOL CONTAINS 222 CARDS. 00000000 +$ VOIDT 01476001 01471000 + LABEL EXIT, NEXT, LASS; 15076000 + DEFINE 15076100 + FORMALNAME = [9:2] = 2#, 15076110 + LONGID = NAMEID#, 15076120 + PARTIALWORD = (T1 ! 0)#, 15076130 + ERREXIT(NUM) = BEGIN ERR(NUM); GO TO EXIT; END#; 15076140 + BOOLEAN 15076200 + SPCLMON, 15076300 + DUPIT; % TRUE IF WE ARE DOING UPDATE TYPE ASSIGN- 15076400 + % MENT. I.E., I := * + 1.. 15076500 +$ VOIDT 15127001 15085150 + IF TALL.CLASS { INTID THEN % SIMPLE VAR OR FORMAL NAME 15085200 + BEGIN 15085400 + IF STEPI ! ASSIGNOP THEN 15085600 + IF P1 = FL THEN 15085800 + BEGIN 15086000 + IF ELCLASS < AMPERSAND THEN 15086200 + EMITN(TALL.ADDRESS) 15086400 + ELSE 15086600 + EMITV(TALL.ADDRESS); 15086800 + GO TO EXIT; 15087000 + END 15087200 + ELSE 15087400 + IF ELCLASS = PERIOD THEN % PARTIAL WORD 15087600 + IF DOTSYNTAX(T1,T2) THEN % ERROR 15087800 + GO TO EXIT 15088000 + ELSE 15088200 + STEPIT; 15088400 + IF ELCLASS = ASSIGNOP THEN 15088600 + BEGIN 15088800 + STACKCT := 1; 15089000 + IF PARTIALWORD THEN % MAKE SURE LEFT-MOST 15089200 + BEGIN 15089400 + IF P1 ! FS THEN % NOT LEFT-MOST 15089600 + ERREXIT(201); 15089800 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); 15090600 + END 15090800 + ELSE 15091000 + XMARK(ASSIGNREF); 15091200 + IF TABLE(I+1) = ASTRISK THEN % MIGHT BE UPDATE 15091400 + IF (DUPIT:=(TABLE(I+2) } EQVOP AND TABLE(I+2) 15091600 + { MULOP) OR TABLE(I+2) = AMPERSAND) THEN 15091800 + STEPIT; % STEP OVER ASTERISK 15092000 + IF TALL.FORMALNAME THEN % FORMAL PARAMETER 15092200 + BEGIN 15092400 + EMITN(TALL.ADDRESS); 15092600 + IF PARTIALWORD OR DUPIT THEN % NEED VALUE 15092800 + BEGIN 15093000 + EMITO(DUP); 15093200 + EMITO(COC); 15093400 + END; 15093600 + END 15094800 + ELSE % ITS A SIMPLE VARIABLE 15095000 + IF PARTIALWORD OR DUPIT THEN 15095400 + EMITV(TALL.ADDRESS); 15095600 + IF PARTIALWORD AND DUPIT THEN 15095700 + BEGIN 15095800 + EMITO(DUP); 15095900 + EMITI(0,T1,T2); 15096000 + END; 15096100 + STACKCT := REAL(PARTIALWORD OR DUPIT); 15096400 + STEPIT; 15096600 + IF DUPIT THEN % ALREADY GOT FIRST PRIMARY 15096800 + SIMPARITH 15097000 + ELSE 15097200 + AEXP; 15097400 + EMITD(48-T2,T1,T2); 15097600 + STACKCT := 0; 15097800 + GT1 := IF TALL.CLASS = INTID THEN 15098000 + IF P1 = FS THEN 15098200 + ISD 15098400 + ELSE 15098600 + ISN 15098800 + ELSE 15099000 + IF P1 = FS THEN 15099200 + STD 15099400 + ELSE 15099600 + SND; 15099800 + IF TALL.FORMALNAME THEN 15100000 + BEGIN 15100200 + EMITO(XCH); % TO GET DESCRIPTOR ON TOP 15100400 + IF TALL.ADDRESS > 1023 THEN % SET VARIANT 15100600 + EMITO(PRTE); 15100800 + EMITO(GT1); 15101000 + END 15101200 + ELSE 15101400 + EMITPAIR(TALL.ADDRESS,GT1); 15101600 + END 15101800 + ELSE % NOT ASSIGNMENT TO SIMPLE VARIABLE 15102000 + BEGIN 15102200 + IF P1 ! FP THEN % EXPECTED ASSIGNMENT 15102400 + ERREXIT(202); 15102600 + EMITI(TALL,T1,T2); % EMIT OP CALL AND PARTIAL 15103400 + END; % WORD CODE 15103600 + END OF SIMPLE VARIABLES 15103800 +$ VOIDT 15233028 15183050 + IF STEPI ! LFTBRKET THEN % ARRAY ITEM NOT FOLLOWED BY 15183100 + BEGIN % A SUBSCRIPT 15183200 + IF ELCLASS = PERIOD THEN 15183300 + IF DOTSYNTAX(T1,T2) THEN % ERROR IN PARTIAL WORD 15183400 + GO TO EXIT 15183500 + ELSE 15183600 + STEPIT; 15183700 + IF ELCLASS = ASSIGNOP THEN 15183800 + BEGIN 15183900 + IF PARTIALWORD THEN 15184000 + BEGIN 15184100 + IF P1 ! FS THEN % PARTIAL WORD NOT LEFT-MOST 15184200 + ERREXIT(209); 15184300 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); 15184400 + END 15184500 + ELSE % ASSIGNMENT TO ID WITH NO PARTIAL WORD 15184600 + XMARK(ASSIGNREF); 15184700 + IF TABLE(I+1) = ASTRISK THEN 15184750 + IF (DUPIT := (TABLE(I+2) } EQVOP AND TABLE(I+2) 15184800 + { MULOP) OR TABLE(I+2) = AMPERSAND) THEN 15184850 + STEPIT; 15185000 + IF PARTIALWORD OR DUPIT THEN % NEED VALUE ON STACK 15185100 + IF TALL.CLASS { INTARRAYID THEN % NOT NAME ITEM 15185200 + EMITPAIR(TALL.ADDRESS,LOD) 15185300 + ELSE 15185400 + EMITN(TALL.ADDRESS); 15185500 + IF PARTIALWORD AND DUPIT THEN 15185600 + BEGIN 15185700 + EMITO(DUP); 15185800 + EMITI(0,T1,T2); 15185900 + END; 15186000 + STACKCT := STACKCT + REAL(PARTIALWORD OR DUPIT); 15186100 + STEPIT; 15186200 + IF DUPIT THEN % WE HANDLED FIRST PRIMARY 15186300 + SIMPARITH 15186400 + ELSE 15186500 + AEXP; 15186600 + EMITD(48-T2,T1,T2); 15186700 + EMITPAIR(TALL.ADDRESS,IF P1 = FS THEN STD ELSE 15186800 + SND); 15186900 + STACKCT := 0; % A AND B ARE EMPTY 15187000 + END 15187100 + ELSE % NOT ASSIGNMENT 15187200 + EMITI(TALL,T1,T2); 15187300 + GO TO EXIT; 15187400 + END OF ASSIGNMENT TO NON SIMPLE NON SUBSCRIPTED 15187500 + VARIABLE; 15187600 +$ VOIDT 15273000 +$ VOIDT 15370001 15299050 + IF STEPI = PERIOD THEN % PARTIAL WORD 15300000 + IF DOTSYNTAX(T1,T2) THEN % ERROR 15300100 + GO TO EXIT 15300200 + ELSE 15300300 + STEPIT; 15300400 + IF ELCLASS = ASSIGNOP THEN % ASSIGNMENT TO SUBSCRIPTED 15300500 + BEGIN % VARIABLE 15300600 + IF PARTIALWORD THEN 15300700 + IF P1 ! FS THEN 15300800 + ERREXIT(209); % PARTIALWORD NOT LEFT-MOST 15300900 + XREFIT(TALL,REMEMBERSEQNO,ASSIGNREF); 15301000 + IF J = 1 THEN % SINGLE-DIMENSIONED 15301100 + EMITN(TALL.ADDRESS) 15301200 + ELSE 15301300 + EMITO(CDC); 15301400 + IF TALL.CLASS } LONGID THEN % EXPLICIT INDEX OP 15301500 + EMITO(INX); % REQUIRED 15301600 + IF P1 = FR THEN % CALLED FROM FOR STATEMENT 15301700 + GO TO EXIT; 15301800 + IF TABLE(I+1) = ASTRISK THEN 15301900 + IF (DUPIT:=(TABLE(I+2) } EQVOP AND TABLE(I+2) 15302000 + { MULOP) OR TABLE(I+2) = AMPERSAND) THEN 15302100 + STEPIT; 15302200 + IF PARTIALWORD OR DUPIT THEN % NEED VALUE ON STACK 15302300 + BEGIN 15302400 + EMITO(DUP); 15302500 + EMITO(LOD); 15302600 + END; 15302700 + IF PARTIALWORD AND DUPIT THEN 15302800 + BEGIN 15302900 + EMITO(DUP); 15303000 + EMITI(0,T1,T2); 15303100 + END; 15303200 + STEPIT; 15303300 + IF DUPIT THEN 15303400 + SIMPARITH 15303500 + ELSE 15303600 + AEXP; 15303700 + EMITD(48-T2,T1,T2); 15303800 + EMITO(XCH); 15303900 + IF TALL.ADDRESS > 1023 THEN 15304000 + EMITO(PRTE); 15304100 + EMITO(IF TALL.CLASS MOD 2 = INTARRAYID MOD 2 THEN 15304200 + IF P1 = FS THEN ISD ELSE ISN 15304300 + ELSE IF P1 = FS THEN STD ELSE SND); 15304400 + STACKCT := 0; % A & B ARE EMPTY 15304500 + P1 := 0; 15304600 + END OF ASSIGNMENT TO SUBSCRIPTED VARIABLE 15304700 + ELSE 15304800 + BEGIN % HANDLING OF NO ASSIGNMENT CASE 15304900 + SPCLMON := P1 = FP OR PARTIALWORD OR ELCLASS } 15305000 + AMPERSAND; 15305100 + IF J = 1 THEN % SINGLE DIMENSIONED 15305200 + IF TALL.CLASS } LONGID THEN % NAME ITEM 15305300 + BEGIN 15305400 + EMITN(TALL.ADDRESS); 15305500 + EMITO(INX); 15305600 + IF SPCLMON THEN 15305700 + EMITO(LOD); 15305800 + END 15305900 + ELSE % REFERENCE TO SINGLE DIMENSIONED ARRAY 15306000 + IF SPCLMON THEN 15306100 + EMITV(TALL.ADDRESS) 15306200 + ELSE 15306300 + EMITN(TALL.ADDRESS) 15306400 + ELSE % MULTI=DIMENSIONED CASE 15306500 + EMITO(IF SPCLMON THEN COC ELSE CDC); 15306600 + IF P1 = FS THEN % EXPECTED AN ASSIGNMENT 15306700 + ERREXIT(210); 15306800 + STACKCT := 1; % BECAUSE REGISTERS ARE NON-EMPTY 15306900 + IF PARTIALWORD THEN 15307000 + BEGIN 15307100 + EMITI(0,T1,T2); 15307200 + P1 := 0; 15307300 + END; 15307400 + END OF NO ASSIGNMENT CASE; 15307500 +$#PATCH NUMBER 115 FOR ESPOL CONTAINS 150 CARDS 00000000 + CASEV =49#, COMMENT 061; 01229000 + DEFINE LASTSEQUENCE = 149#, 01569000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%07646010 +%**********************************************************************%07646015 +%* *%07646020 +%* C A S E *%07646025 +%* = = = = *%07646030 +%* *%07646035 +%* S T A T E M E N T *%07646040 +%* = = = = = = = = = *%07646045 +%* *%07646050 +%* *%07646055 +%* THIS PROCEDURE HANDLES THE CASE STATEMENT. THE SYNTAX FOR THE CASE *%07646060 +%* STATMENT IS: *%07646065 +%* *%07646070 +%* CASE OF BEGIN *%07646075 +%* *%07646080 +%* THE CODE GENERATED FOR THIS STATEMENT IS: *%07646085 +%* *%07646090 +%* *%07646095 +%* LITC ? *%07646100 +%* BFW BRANCH TO BRANCH TABLE *%07646105 +%* STMT 0 *%07646110 +%* LITC ? *%07646115 +%* BFW BRANCH TO RESUME *%07646120 +%* STMT 1 *%07646125 +%* LITC ? *%07646130 +%* BFW BRANCH TO RESUME *%07646135 +%* . *%07646140 +%* . *%07646145 +%* . *%07646150 +%* BRANCH TABLE: *%07646155 +%* DUP *%07646160 +%* ADD *%07646165 +%* BFW BRANCH INTO TABLE *%07646170 +%* LITC ? *%07646175 +%* BBW BRANCH TO STATEMENT 0 *%07646180 +%* LITC ? *%07646185 +%* BBW BRANCH TO STATEMENT 1 *%07646190 +%* . *%07646195 +%* . *%07646200 +%* . *%07646205 +%* LITC ? *%07646210 +%* BBW BRANCH TO STATEMENT N *%07646215 +%* RESUME: *%07646220 +%* *%07646225 +%* *%07646230 +%* NOTICE THAT: *%07646235 +%* . *%07646240 +%* 1) THE CASE INDEX IS NOT INTEGERIZED. IF YOU HAVE ANYTHING THAT *%07646245 +%* MIGHT CAUSE THE INDEX TO BE UNNORMALIZED YOU WILL HAVE TO *%07646250 +%* INTEGERIZE IT YOURSELF. *%07646255 +%* *%07646260 +%* 2) NO RANGE CHECKING IS DONE ON THE INDEX. IF YOU USE A NUMBER *%07646265 +%* OUT OF RANGE THEN YOU WILL FALL OFF THE END OF THE WORLD. *%07646270 +%* *%07646275 +%* 3) IF A STATEMENT IN THE CASE COMPOUND TAIL IS NULL, NO CODE IS *%07646280 +%* GENERATED FOR THE STATEMENT. INSTEAD, THE BRANCH TABLE GOES *%07646285 +%* DIRECTLY TO RESUME. *%07646290 +%* *%07646295 +%* 4) IF A STATEMENT IN THE CASE COMPOUND TAIL IS A SIMPLE GO TO, *%07646300 +%* THE STATEMENT DOES NOT HAVE A BRANCH TO RESUME AFTER IT. *%07646305 +%* *%07646310 +%**********************************************************************%07646315 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%07646320 +PROCEDURE CASESTATEMENT; 07646325 +BEGIN 07646330 + ARRAY CASEADDRESS[0:99]; % THIS ARRAY HOLDS THE RELATIVE 07646335 + % ADDRESS OF THE BEGINNING OF EACH 07646340 + % CASE. 07646345 + INTEGER 07646350 + LINK, % HOLDS RELATIVE ADDRESS OF FIRST OF 07646355 + % BRANCHES THAT MUST BE FIXED UP TO 07646360 + % BRANCH TO THE RESUME POINT. 07646365 + ADR, % HOLDS RELATIVE ADDRESS OF THE BRANCH 07646370 + % AROUND THE CASE STATEMENTS TO THE 07646375 + % BRANCH TABLE. THIS BRANCH GETS FIXED 07646380 + % UP WHEN WE FIND WHERE THE BRANCH TABLE 07646385 + % GOES. 07646390 + N, % COUNT OF NUMBER OF CASE STATEMENT 07646395 + % ENCOUNTERED. 07646400 + ENDOFIT, % ADDRESS OF RESUME POINT 07646405 + J, % TEMPORARY 07646410 + K; % TEMPORARY 07646415 + % 07646420 + BOOLEAN 07646425 + GOTOG; % TRUE IF WE ARE COMPILING A SIMPLE 07646430 + % GO TO. 07646435 + LABEL XIT; 07646436 +% 07646440 +% 07646445 + STEPIT; % STEP OVER "CASE" 07646450 + AEXP; % GENERATE CODE FOR CASE INDEX 07646455 + IF STEPI ! BEGINV THEN % NOTICE WE JUST JUMPED OVER "OF" 07646456 + BEGIN 07646457 + ERR(70); GO TO XIT; 07646458 + END; 07646459 + EMIT(0); % GENERATE DUMMY BRANCH TO BRANCH TABLE. WILL FIX 07646460 + EMITO(BFW); % IT UP LATER. 07646465 + ADR := L; 07646470 + WHILE STEPI ! ENDV DO 07646475 + BEGIN % PROCESSING CASE STATEMENTS 07646480 + ERRORTOG := TRUE; 07646485 + IF ELCLASS = SEMICOLON THEN % NULL STATEMENT. NO CODE NEEDED 07646490 + N := N + 1 % THIS LEAVES A ZERO IN CASEADDRESS[N] 07646495 + ELSE 07646500 + BEGIN 07646505 + CASEADDRESS[N] := L; % REMEMBER BEGINNING ADDRESS OF 07646510 + N := N + 1; % THIS CASE. 07646515 + IF (GOTOG := SIMPGO) THEN 07646520 + ELBAT[I:=I-1] := ELCLASS := GOV; % REMEMBER IF SIMPLE 07646525 + STMT; % PROCESS THE STATEMENT 07646530 + IF ELCLASS = SEMICOLON THEN 07646535 + IF NOT GOTOG THEN % GENERATE DUMMY BRANCH TO RESUME 07646540 + BEGIN 07646545 + EMIT(LINK); 07646550 + EMITO(BFW); 07646555 + LINK := L; 07646560 + END 07646565 + ELSE % SIMPLE GO TO, NO CODE TO GENERATE 07646570 + ELSE 07646575 + IF ELCLASS ! ENDV THEN 07646580 + ERR(71); 07646585 + END; 07646590 + END OF WHILE LOOP; 07646595 + ENDTOG := TRUE; % SKIP OVER COMMENT AFTER END 07646601 + DO STOPDEFINE := TRUE UNTIL 07646602 + STEPI { ENDV AND ELCLASS } UNTILV OR NOT ENDTOG; 07646603 + ENDTOG := FALSE; 07646604 + EMITB(BFW,ADR,L); % FIX UP BRANCH TO BRANCH TABLE 07646605 + EMITO(DUP); % GENERATE CODE TO MULTIPLY INDEX 07646610 + EMITO(ADD); % BY TWO AND BRANCH INTO BRANCH TABLE 07646615 + EMITO(BFW); 07646620 + ENDOFIT := L + 2|N; % CALCULATE WHERE RESUME IS 07646625 + WHILE (J:=J+1) { N DO % GENERATE THE BRANCH TABLE 07646630 + EMITB(BBW,L:=L+2,IF (K:=CASEADDRESS[J-L]) = 0 THEN 07646635 + ENDOFIT ELSE K); 07646640 + J := LINK; % TO MAKE THE LOOP WORK 07646645 + WHILE (LINK:=J) ! 0 DO 07646650 + BEGIN % FIXING UP BRANCHES TO RESUME 07646655 + J := GET(LINK-2); % LOCATION OF NEXT BRANCH TO FIX 07646660 + EMITB(BFW,LINK,L); 07646665 + END; 07646670 +XIT: 07646674 +END OF CASE STATEMENT; 07646675 + L49: 07759100 + CASESTATEMENT; GO TO EXIT; 07759200 +L41: 07770000 + OCT0500000250000002, "5FIELD", %654 09128700 + OCT0610000000000000, "4CASEO", %656 09128800 +$: BY JTC - MSC DETROIT 99990000 +$: THIS PATCH ADDS A -CASE- STATEMENT TO ESPOL. SEE 99990100 +$: DOCUMENTATION AT BEGTNNTNG OF PROCEDURE TO SEE HOW 99990200 +$: IT IS USED. 99990300 +$:**********************************************************************99990400 +$#PATCH NUMRER 116 FOR ESPOL CONTAINS 1 CARD 00000000 +SAVE ARRAY DEFINEARRAY[0:34]; 01491000 +$: DATE 6/29/76 99990000 +$: BY JTC - MSA CENTRAL 99990100 +$: 99990200 +$: THIS PATCH FIXES A PRORLEM WITH ESPOL THAT COULD CAUSE THE 99990300 +$: COMPILER TO ABORT WITH AN INVALID INDEX AT END OF FILE ON 99990400 +$: EITHER THE CARD OR TAPE FILE IF NO 99999999 CARD WAS PROVIDED. 99990500 +$#PATCH NUMBER 117 FOR ESPOL CONTAINS 3 CARDS. 00000000 +% MARK XVI.0.116 00001030 +% MAY 9, 1977 00001040 +"XVI.0.116" 01831000 +$: BY DJZ - MSC DETROTT 99990000 +$: DATE 05/09/77 99990100 +$: THIS PATCH UPDATES THE MARK LEVELS OF THE SYMBOL FILE 99990200 +$:**********************************************************************99990300 +$# PATCH NUMBER 901 FOR ESPOL CONTAINS 1 CARD C +$: THIS PATCH CHANGES INPUT TAPE BLOCKING TO ALLOW INCREASED +$: EFFICIENCY IN STORING SOURCE FILES ON TAPE +$: BY TJP, 2/16/77. USE UTILITY COMPTP/UTILITY TO CREATE SOURCE TAPES. +BEGIN RR8~50|10+50+1; RR9~10 END; 00538000 +$#PATCH NUMBER 902 FOR ESPOL CONTAINS 1 CARD. PAGE SKIP BETWEEN PROCEDURES +$: THIS PATCH CHANGES THE EFFECT OF THE FORMAT OPTION TO CAUSE A +$: PAGE SKIP BETWEEN PROCEDURES INSTEAD OF A FOUR-LINE SKIP +$: BY J.H., USC, 4 MAY 77 + SPACEITDOWN = WRITE(LINE[PAGE])#; 14023100 +$# PATCH NUMBER 950 FOR ESPOL CONTAINS 6 CARD +$: RESTORE DECLARATION REMOVED FROM INITIAL XVI SYMBOL TRANSCRIPTION +$: CHANGE OCTAL CONSTANTS TO REFLECT ALGOL XIII SYNTAX +$: PC 17 JUL 13 + NESTOG = OPTIONWORD.[NESTBIT:1] #, 01001310 + DS := 63 SET; % ID.NO, AND SEQ.NO. FIELDS 17041100 + DS := 63 SET; % TOTAL OF 216 BITS 17041101 + DS := 63 SET; % 17041102 + DS := 27 SET; % WAS 8 BY 9 OCTETS: 8 LIT 3"777777777" 17041103 + A[0] := REAL(NOT FALSE)&0[1:1:3]; % BIGGEST FLOATING PT. NO. 17114000 +$# PATCH NUMBER 951 FOR ESPOL CONTAINS 34 CARDS +$: FIX PATCH 110 AND 112 FILL DECLARATION FOR ALGOL MARK III COMPATABILITY +$: PC 19 JUL 13 + "UNKNOWN."," "," "," ", % 0 17084020 + "STREAM L","ABEL. "," "," ", % 1 17084030 + "STREAM V","ARIABLE."," "," ", % 2 17084040 + "DEFINE. "," "," "," ", % 3 17084050 + "LIST. "," "," "," ", % 4 17084060 + "FORMAT. "," "," "," ", % 5 17084070 + "SWITCH F","ORMAT. "," "," ", % 6 17084080 + "REAL SUB","ROUTINE."," "," ", % 7 17084090 + "SUBROUTI","NE. "," "," ", % 8 17084100 + "SWITCH L","ABEL. "," "," ", % 9 17084110 + "PROCEDUR","E. "," "," ", % 10 17084120 + "INTRINSI","C. "," "," ", % 11 17084130 + "STREAM P","ROCEDURE",". "," ", % 12 17084140 + "BOOLEAN ","STREAM P","ROCEDURE",". ", % 13 17084150 + "REAL STR","EAM PROC","EDURE. "," ", % 14 17084160 + "INTEGER ","STREAM P","ROCEDURE",". ", % 15 17084170 + "INTEGER ","STREAM P","ROCEDURE",". ", % 16 17084180 + "BOOLEAN ","PROCEDUR","E. "," ", % 17 17084182 + "REAL PRO","CEDURE. "," "," ", % 18 17084184 + "INTEGER ","PROCEDUR","E. "," ", % 19 17084186 + "INTEGER ","PROCEDUR","E. "," ", % 20 17084188 + "BOOLEAN."," "," "," ", % 21 17084190 + "REAL. "," "," "," ", % 22 17084200 + "INTEGER."," "," "," ", % 23 17084210 + "INTEGER."," "," "," ", % 24 17084220 + "BOOLEAN ","ARRAY. "," "," ", % 25 17084230 + "REAL ARR","AY. "," "," ", % 26 17084240 + "INTEGER ","ARRAY. "," "," ", % 27 17084250 + "INTEGER ","ARRAY. "," "," ", % 28 17084260 + " "," "," "," ", % 29 17084270 + "NAME. "," "," "," ", % 30 17084280 + "INTEGER ","NAME. "," "," ", % 31 17084290 + "LABEL. "," "," "," ", % 32 17084300 + "FIELD, "," "," "," "; % 33(CLASS=125) 17084400 +?END \ No newline at end of file