mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-02-28 16:59:21 +00:00
Correct bad line endings in the repository files that caused problems between checking out in Windows vs Linux clients.
1511 lines
118 KiB
Plaintext
1511 lines
118 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 |