1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-02-15 19:46:23 +00:00
Files
retro-software.B5500-software/Mark-XVI/PATCHES/ESPOL-116.txt

1511 lines
119 KiB
Plaintext

?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,<X40,"SOURCE FILE: ",A1,A6,"/",A1,A6,//>, 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<MULOP 13337000
GOTSCHK,FIELDDEC,AUXMEMERR, 14016000
STREAMERR,DEFINEDEC,AUXMEMERR,FIELDDEC; 14021000
AUXMEMERR:FLAG(618);J:=J+1;GO TO REALDEC; 14136100
FIELDDEC: 14269020
BEGIN 14269040
REAL SAVEINFO, SB, NB; 14269060
BOOLEAN FOUNDLB; % TRUE IF LFFT-BRACKET WAS USED IN FIELD SPEC. 14269080
LABEL EXIT, SAVEIT; 14269100
STOPENTRY := STOPGSP := TRUE; 14269120
I := I - 1; 14269140
DO 14269160
BEGIN 14269180
STOPDEFINE := TRUE; 14269200
STEPIT; 14269220
ENTRY(FIELDID); 14269240
SAVEINFO := LASTINFO; 14269260
BEGIN 14269280
IF ELCLASS = RELOP AND ACCUM[1] = "1=0000" THEN 14269300
IF STEPI = LFTBRKET THEN % REMEMBER THIS 14269320
BEGIN 14269340
FOUNDLB := TRUE; 14269360
STEPIT; 14269380
END 14269400
ELSE 14269420
FOUNDLB := FALSE; 14269440
IF ELCLASS = FIELDID THEN 14269442
BEGIN 14269444
SB := ELBAT[I].SBITF; 14269446
NB := ELBAT[I].NBITF; 14269448
GO TO SAVEIT; 14269450
END; 14269452
IF ELCLASS = LITNO THEN 14269460
IF STEPI = COLON THEN 14269480
IF STEPI = LITNO THEN 14269500
IF (SB := ELBAT[I-2].ADDRESS) | 14269520
(NB := ELBAT[I].ADDRESS) ! 0 AND 14269540
SB | NB { 48 THEN 14269560
BEGIN 14269580
SAVEIT: 14269590
PUT(TAKE(SAVEINFO) & SB SBITF & NB NBITF, 14269600
SAVEINFO); 14269620
STEPIT; 14269640
IF FOUNDLB THEN % BETTER HAVE RIGHT BRACKET. 14269660
IF ELCLASS = RTBRKET THEN 14269680
BEGIN 14269700
STEPIT; 14269705
GO TO EXIT; 14269710
END 14269715
ELSE % MISSING RIGHT BRACKET, 14269720
ELSE 14269740
GO TO EXIT; 14269760
END; 14269780
END; 14269800
FLAG(114); 14269820
DO STEPIT UNTIL ELCLASS = COMMA OR ELCLASS = SEMICOLON; 14269840
EXIT: 14269860
END 14269880
UNTIL 14269900
ELCLASS ! COMMA; 14269920
STOPENTRY := STOPGSP := FALSE; 14269940
END; 14269960
GO TO START; 14269980
ARRAY IDTYPE[0:(IDMAX+4)|4-1]; 17047100
"LABEL. ", % 32 17084300
"FIELD, "; % 33 (CLASS = 125) 17084400
XREFAY1[9].CLASS) > 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
$: <FLELD DECLARATION> ::= FIELD <FIELD LIST> 99991200
$: 99991300
$: <FIELD LIST> ::= <FIELD> / <FIELD LIST> , <FIELD> 99991400
$: 99991500
$: <FIELD> ::= <FIELD IDENTIFIER> = <FIELD SPECIFICATION> 99991600
$: 99991700
$: <FIELD IDENTIFIER> ::= <IDENTIFIER> 99991800
$: 99991900
$: <FIELD SPECIFICATION> ::= <INTEGER> : <INTEGER> / 99992000
$: [ <INTEGER> : <INTEGER> ] / 99992100
$: <FIELD IDENTIFIER> / 99992200
$: [ <FIELD IDENTIFIER> ] 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 <AEXP> OF BEGIN <COMPOUND TAIL> *%07646075
%* *%07646080
%* THE CODE GENERATED FOR THIS STATEMENT IS: *%07646085
%* *%07646090
%* <AEXP> *%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
?END