mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-01-13 23:25:24 +00:00
Commit additional transcription for B5500 APL source by Fausto Saporito, as of 2013-10-11.
This commit is contained in:
parent
e75b74d632
commit
e6bd06eba0
@ -1,4 +1,4 @@
|
||||
BEGIN 00000490
|
||||
BEGIN 00000490
|
||||
% THIS APL/B5500 PROGRAM WAS DEVELOPED BY THE COMPUTER SCIENCE GROUP
|
||||
% AT THE UNIVERSITY OF WASHINGTON UNDER THE SPONSORSHIP OF PROFESSOR
|
||||
% HELLMUT GOLDE. THE PROGRAM MAY BE NOT BE OFFERED FOR SALE OR LEASE
|
||||
@ -399,6 +399,7 @@ INTEGER PROCEDURE FREEPAGE(INDEX,TYPEZERO,START,FINISH);
|
||||
OWN INTEGER FIRST,AVAIL,MAXBUFF,CURBUFF;
|
||||
REAL GT1;
|
||||
LABEL MOREPAGES;
|
||||
COMMENT
|
||||
IF MEMBUG.[21:1] THEN DUMPMEMORY(MODE,TYPE,N,M); 00005620
|
||||
IF MODE=8 THEN NPAGES:=NPAGES+N;
|
||||
MOREPAGES:
|
||||
@ -688,7 +689,7 @@ INTEGER PROCEDURE FREEPAGE(INDEX,TYPEZERO,START,FINISH);
|
||||
END;
|
||||
COMMENT -- ASSIGN A FREE PAGE (SUBS T);
|
||||
T:=TYPS[0].BF; TYPS[0].BF:=T:=T-1;
|
||||
|
||||
|
||||
PG:=INDX[T,P];
|
||||
FOR K:=T+1 STEP 1 UNTIL CURPAGE DO
|
||||
MOVE(INDX[K,0],RECSIZE+SKIP+EXTRAROOM,INDX[K-1,0]);
|
||||
@ -896,7 +897,7 @@ INTEGER PROCEDURE FREEPAGE(INDEX,TYPEZERO,START,FINISH);
|
||||
END UNTIL I:=I+1 GTR NPAGES OR N NEQ 0 ELSE N:=0;
|
||||
IF I GTR NPAGES THEN N:=REAL(WRITEBUFFER); 00010240
|
||||
END OF FILE UPDATE;
|
||||
%------- MODE=10 ------EEMERGENCY FILE MAINTENANCE -------
|
||||
%------- MODE=10 ------ EMERGENCY FILE MAINTENANCE -------
|
||||
DO MEMORY(9,TYPE,A,N,M) UNTIL N NEQ 1
|
||||
%------- MODE=11 ------- SET THE KIND OF STORAGE FOR TYPE ----------
|
||||
;COMMENT TYPE "TYPE" STORAGE IS BEING SET TO SEQUENTIAL;
|
||||
@ -1316,7 +1317,7 @@ DEFINE
|
||||
CAPHEADING=11:47:1#,
|
||||
APLCODE = STATIONPARAMS#,
|
||||
|
||||
|
||||
|
||||
SPECMODE = BOUNDARY.[1:3]#,
|
||||
DISPLAYIMG=1#,
|
||||
EDITING=2#,
|
||||
@ -1332,7 +1333,7 @@ DEFINE
|
||||
BOOLEAN LINETOG; %GO TO NEXT LINE IF TRUE WHEN WRITING OUT
|
||||
INTEGER BUFFSIZE,ITEMCOUNT,RESULT,
|
||||
LOGINSIZE,
|
||||
%%%
|
||||
%%%
|
||||
ERR,
|
||||
NROWS,
|
||||
%%%
|
||||
@ -1510,7 +1511,7 @@ PROCEDURE INITIALIZETABLE;
|
||||
FILL IDTABLE[*] WITH
|
||||
"1+481-49", "1&501%07", "1.171@19", "1#411(08",
|
||||
"1)091/06", "3XEQ623L", "OG541;15", OCT0333777601040177,
|
||||
%CAST IN ABOVE LINE IS REALLY 3["]141"
|
||||
%LAST IN ABOVE LINE IS REALLY 3["]141"
|
||||
"202:=042", "[]101[11", "1]123AND", "212OR223",
|
||||
"NOT233LS", "S243LEQ2", "53GEQ273", "GTR283NE", "Q292=:05",
|
||||
"2GO051=2", "63MAX304", "CEIL303F", "LR313MIN",
|
||||
@ -1526,12 +1527,12 @@ PROCEDURE INITIALIZETABLE;
|
||||
IN SYNTAX CHECKING. FOR SCAN TO WORK, THE TWO-DIGIT CODE MUST
|
||||
BE GREATER THAN 3 AND IDTABLE MUST HAVE AT LEAST ONE "0" AT THE
|
||||
END TO MARK THE END. TABSIZE IS THE DEFINE (LINE 30000) GIVING
|
||||
THE SIZE OF TDTABLE;
|
||||
THE SIZE OF IDTABLE;
|
||||
IF STACKSIZE=0 THEN STACKSIZE:=100 ELSE
|
||||
IF STACKSIZE GTR 1022 THEN STACKSIZE:=1022;
|
||||
BUFFSIZE:=MAXBUFFSIZE;
|
||||
LINETOG := TRUE; %USUALLY GO TO NEXT LINE WHEN WRITING OUT
|
||||
|
||||
|
||||
INITBUFF(OUTBUFF, 10);
|
||||
INITBUFF(BUFFER,BUFFSIZE);
|
||||
NROWS:=-1;
|
||||
@ -1565,7 +1566,7 @@ PROCEDURE INITIALIZETABLE;
|
||||
"4LIST ",
|
||||
"5DEBUG ",
|
||||
"5FILES ";
|
||||
|
||||
|
||||
IF LIBSIZE=-1 THEN
|
||||
BEGIN LIBSIZE~1;GTA[0]~" ";STOREORD(LIBRARY,GTA,0);WRAPUP;
|
||||
END ELSE BEGIN LIBSIZE~SIZE(LIBRARY);
|
||||
@ -1732,16 +1733,16 @@ PROCEDURE FORMWD(CC,WD); VALUE CC,WD; REAL WD; INTEGER CC;
|
||||
IF L:=LINESIZE LEQ 9 OR L GTR 72 THEN L:=72; K:=2;
|
||||
IF CC GTR 1 AND CHRCOUNT GTR OTHEN TERPRINT;
|
||||
IF CHRCOUNT+(I:=OCTAL(WD.[1:11])) GTR L THEN
|
||||
|
||||
|
||||
BEGIN APPENDTOBUFF(LINEBUFFER,CHRCOUNT,
|
||||
0,WD,2,K:=L-CHRCOUNT);
|
||||
CHRCOUNT:=L; TERPRINT;
|
||||
|
||||
|
||||
I:=I-K;
|
||||
|
||||
|
||||
END;
|
||||
APPENDTOBUFF(LINEBUFFER,CHRCOUNT,0,WD,K,I);
|
||||
|
||||
|
||||
CHRCOUNT:=CHRCOUNT+I;
|
||||
IF BOOLEAN(CC) THEN
|
||||
IF CC=-1 THEN BEGIN LINETOG:=FALSE;
|
||||
@ -1750,13 +1751,13 @@ PROCEDURE FORMWD(CC,WD); VALUE CC,WD; REAL WD; INTEGER CC;
|
||||
END;
|
||||
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR);
|
||||
ARRAY SPECS[0]; REAL HADDR; FORWARD;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
REAL PROCEDURE LINENUMBER(R); VALUE R; REAL R;
|
||||
COMMENT STARTS ON 8030000;
|
||||
FORWARD;
|
||||
|
||||
|
||||
PROCEDURE INDENT(R); VALUE R; REAL R;
|
||||
BEGIN
|
||||
INTEGER STREAM PROCEDURE FORM(A,I,K);VALUE K,I;
|
||||
@ -1791,7 +1792,7 @@ PROCEDURE INDENT(R); VALUE R; REAL R;
|
||||
END;
|
||||
IF R LSS 0 THEN R:=LINENUMBER(-R) ELSE R:=ABS(R); % -0
|
||||
CHRCOUNT:=FORM(LINEBUFF,R,MARGINSIZE)+1
|
||||
|
||||
|
||||
END;
|
||||
INTEGER PROCEDURE HEADER(ADDR1,ADDR2,BUF); VALUE ADDR1,ADDR2;
|
||||
INTEGER ADDR1, ADDR2; ARRAY BUF[0];
|
||||
@ -1839,9 +1840,9 @@ INTEGER PROCEDURE HEADER(ADDR1,ADDR2,BUF); VALUE ADDR1,ADDR2;
|
||||
END OF PHONY HEADER;
|
||||
PROCEDURE STARTSCAN;
|
||||
BEGIN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LADDRESS:=
|
||||
ADDRESS:=ABSOLUTEADDRESS;
|
||||
BEGIN TERPRINT;
|
||||
@ -1870,7 +1871,7 @@ PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,BL,S,N; INTEGER CC,BL,
|
||||
BL:=0;
|
||||
END;
|
||||
APPENDTOBUFFER(LINEBUFFER,CHRCOUNT,BL,A,S,N);
|
||||
|
||||
|
||||
CHRCOUNT:=CHRCOUNT+N+BL;
|
||||
IF BOOLEAN(CC) THEN
|
||||
IF CC=-1 THEN BEGIN LINETOG:=FALSE;
|
||||
@ -1880,7 +1881,7 @@ PROCEDURE FORMROW(CC,BL,A,S,N); VALUE CC,BL,S,N; INTEGER CC,BL,
|
||||
PROCEDURE NUMBERCON(R,A); VALUE R; REAL R; ARRAY A[0];
|
||||
BEGIN FORMAT F(F24.*), G(E24.*);
|
||||
REAL S; DEFINE MAXIM = 10@9#;
|
||||
|
||||
|
||||
STREAM PROCEDURE ADJUST(A,B);
|
||||
BEGIN LOCAL T,FRAC,MANT,T1,TSI,TDI;
|
||||
DI:=LOC T; DI:=DI+1; T1:=DI;
|
||||
@ -1902,7 +1903,7 @@ PROCEDURE NUMBERCON(R,A); VALUE R; REAL R; ARRAY A[0];
|
||||
TALLY:=TALLY+1; DS:=CHR
|
||||
END);
|
||||
SI:=LOC MANT; SI:=SI+7; IF SC="0" THEN MANT:=TALLY;
|
||||
|
||||
|
||||
TALLY:=MANT; SI:=LOC FRAC; SI:=SI+7; IF SC GTR "0"
|
||||
THEN TALLY:=TALLY+1; TALLY:=TALLY+FRAC; MANT:=TALLY;
|
||||
SI:=T1; IF SC="1" THEN BEGIN
|
||||
@ -1911,19 +1912,317 @@ PROCEDURE NUMBERCON(R,A); VALUE R; REAL R; ARRAY A[0];
|
||||
TALLY:=TALLY+4; MANT:=TALLY; END;
|
||||
SI:=LOC MANT; SI:=SI+6; DI:=A; DS:=2CHR;
|
||||
END;
|
||||
IF S:=ABS(R) GEQ MAXIM OR S LEQ 10*(-DIGITS) AND S NEQ 0 THEN
|
||||
IF S:=ABS(R) GEQ MAXIM OR S LEQ 10*(-DIGITS) AND S NEQ 0 THEN
|
||||
WRITE(SCR[*],G,DIGITS,R) ELSE
|
||||
WRITE(SCR[*],F,DIGITS,R);
|
||||
ADJUST(A,SCR)
|
||||
END;
|
||||
...
|
||||
IF SCAN THEN 00501600 P25
|
||||
...
|
||||
INTEGER K; 03002210 P26
|
||||
...
|
||||
REAL PROCEDURE BUILDALPHA(LASTCONSTANT); 03100440 P27
|
||||
...
|
||||
BEGIN INFIX[ITOP].TYPEFIELD:=OPERATOR; 03101550 P28
|
||||
WRITE(SCR[*],F,DIGITS,R);
|
||||
ADJUST(A,SCR)
|
||||
END;
|
||||
PROCEDURE STOREPSR;
|
||||
BEGIN INTEGER I;
|
||||
DELETE1(WORKSPACE,0);
|
||||
I:=STORESEQ(WORKSPACE,PSR,PSRSIZE|8);
|
||||
COMMENT USED TO CALL WRAPUP;
|
||||
END;
|
||||
PROCEDURE RESCANLINE;
|
||||
BEGIN ADDRESS:=ABSOLUTEADDRESS; EOB:=0; END;
|
||||
PROCEDURE PROCESS(MODE);VALUE MODE; INTEGER MODE; FORWARD;
|
||||
PROCEDURE MESSAGEHANDLER; FORWARD;
|
||||
PROCEDURE FUNCTIONHANDLER; FORWARD;
|
||||
PROCEDURE ERRORMESS(N,ADDR,R); VALUE N,ADDR,R; REAL R;
|
||||
INTEGER N;REAL ADDR;FORWARD; COMMENT LINE 5000000;
|
||||
STREAM PROCEDURE SETFIELD(A,S,L,R); VALUE S,L,R;
|
||||
BEGIN DI:=A; DI:=DI+S; SI:=LOC R; SI:=SI+8; L(SI:=SI-1);
|
||||
DS:=L CHR;
|
||||
END;
|
||||
COMMENT: VALUE OF GETFIELD IS L CHARACTERS, STARTING AT J-TH
|
||||
CHARACTER OF A, RIGHT-ADJUSTED. L MUST BE LEQ 8 AND
|
||||
J MUST BE LESS THAT 64;
|
||||
REAL STREAM PROCEDURE GETFIELD(A,S,L); VALUE S,L;
|
||||
BEGIN SI:=A; SI:=SI+S; DI:=LOC GETFIELD; DI:=DI+8; L(DI:=DI-1);
|
||||
DS:=L CHR;
|
||||
END;
|
||||
REAL PROCEDURE TOPLINE(ORD); VALUE ORD; INTEGER ORD;
|
||||
BEGIN
|
||||
INTEGER STREAM PROCEDURE CON(A); VALUE A;
|
||||
BEGIN SI:=LOC A; DI:=LOC CON; DS:=8OCT END;
|
||||
ARRAY A[0:1]; INTEGER I;
|
||||
I:=CONTENTS(ORD,SIZE(ORD)-1,A);
|
||||
TOPLINE:=CON(A[0])/10000
|
||||
END;
|
||||
BOOLEAN PROCEDURE FUNCTIONHEADER(SPECS,HADDR);
|
||||
ARRAY SPECS[0]; REAL HADDR;
|
||||
BEGIN
|
||||
LABEL A,B,C;
|
||||
INTEGER P;
|
||||
DEFINE NOTE=HADDR.[24:24]:=ADDRESS#,P8=8|P+1#;
|
||||
ERR:=0;
|
||||
SPECS[0]:=SPECS[1]:=SPECS[2]:=SPECS[3]:=0;
|
||||
NOTE; HADDR.[1:23]:=GT1:=ADDRESS;
|
||||
IF SCAN AND IDENT THEN
|
||||
BEGIN
|
||||
TRANSFER(ACCUM,2,SPECS,1,7);
|
||||
NOTE;
|
||||
IF SCAN THEN
|
||||
IF LFTARROW THEN
|
||||
BEGIN
|
||||
SPECS[1]:=1;
|
||||
SPECS[3]:=1;
|
||||
TRANSFER(SPECS,1,SPECS,33,7);
|
||||
GT2:=ADDRESS;
|
||||
IF SCAN AND IDENT THEN
|
||||
BEGIN
|
||||
TRANSFER(ACCUM,2,SPECS,1,7);
|
||||
NOTE;
|
||||
IF SCAN THEN 00501600
|
||||
C: IF IDENT THEN
|
||||
BEGIN
|
||||
P:=(SPECS[3]:=SPECS[3]+1)+3;
|
||||
TRANSFER(ACCUM,2,SPECS,P8,7);
|
||||
SPECS[2]:=1;
|
||||
NOTE;
|
||||
IF SCAN THEN IF IDENT THEN
|
||||
BEGIN SPECS[2]:=2;
|
||||
P:=(SPECS[3]:=SPECS[3]+1)+2;
|
||||
TRANSFER(SPECS,1,SPECS,P8+8,7);
|
||||
TRANSFER(SPECS,P8,SPECS,1,7);
|
||||
TRANSFER(ACCUM,2,SPECS,P8,7);
|
||||
|
||||
B: NOTE; IF SCAN THEN
|
||||
A: IF SEMICOLON THEN IF SCAN THEN
|
||||
IF IDENT THEN
|
||||
BEGIN
|
||||
P:=(SPECS[3]:=SPECS[3]+1)+3;
|
||||
TRANSFER(ACCUM,2,SPECS,P8,7);
|
||||
GO TO B;
|
||||
END ELSE GO TO A
|
||||
ELSE ELSE ELSE
|
||||
END ELSE GO TO A
|
||||
ELSE END
|
||||
ELSE GO TO A ELSE
|
||||
END ELSE ERRORMESS(ERR:=1,GT2,0)
|
||||
END ELSE GO TO C
|
||||
ELSE
|
||||
END ELSE ERRORMESS(ERR:=SYNTAXERROR,GT1,0);
|
||||
FUNCTIONHEADER:=ERR=0;
|
||||
ADDRESS:=HADDR.[24:24];
|
||||
END FUNCTIONHEADER;
|
||||
|
||||
INTEGER PROCEDURE DAYTIME(B); ARRAY B[0]; FORWARD;
|
||||
COMMENT ON LINE 8014000, ARRAY B MUST HAVE LENGTH
|
||||
AT LEAST 3 WDS;
|
||||
PROCEDURE EDITLINE; FORWARD;
|
||||
INTEGER PROCEDURE LENGTH(A,M);VALUE M; BOOLEAN M; ARRAY A[0];
|
||||
FORWARD; COMMENT LINE 8007900;
|
||||
BOOLEAN PROCEDURE LABELSCAN(L,K); VALUE K; INTEGER K;
|
||||
ARRAY L[0]; FORWARD; COMMENT LINE 8013910;
|
||||
|
||||
|
||||
PROCEDURE CHECKSEQ(SEQ,L,INC); REAL SEQ,L,INC; FORWARD;
|
||||
COMMENT ON LINE 8040000;
|
||||
PROCEDURE RELEASEARRAY(D);VALUE D; REAL D;
|
||||
BEGIN COMMENT RELEASE PERMANENT STORAGE FOR THE ARRAY DESC D;
|
||||
INTEGER K,J,PT;
|
||||
ARRAY BLOCK[0:32]; %SEE MAXWORDSTORE, LINE 17260
|
||||
ARRAY TEMP[0:1];
|
||||
IF D.RF NEQ 0 THEN
|
||||
BEGIN DELETE1(WS,D.DIMPTR);
|
||||
K:=CONTENTS(WS,D.INPTR,BLOCK)-1;
|
||||
DELETE1(WS,D,INPTR);
|
||||
FOR J:=0 STEP 2 UNTIL K DO
|
||||
BEGIN TRANSFER(BLOCK,J,TEMP,6,2);
|
||||
PT:=TEMP[0]; DELETE1(WS,PT); END;
|
||||
END;
|
||||
END;
|
||||
PROCEDURE TRANSFERSP(DIR,SP,L,B,M,N); VALUE DIR,N,M,L;
|
||||
INTEGER DIR,N,M,L;
|
||||
ARRAY SP[0,0],B[0];
|
||||
BEGIN COMMENT
|
||||
DIR= INTO: TRANSFER N WORDS FROM B[L] INTO SP[M]
|
||||
(ACTUALLY SP[*,M] SINCE ARRAY ROW IS USUALLY THE ARG)
|
||||
DIR= OUTOF (OPPOSITE);
|
||||
STREAM PROCEDURE MOVER(DIR,SP,M,B,L,N); VALUE DIR,
|
||||
L,M,N;
|
||||
BEGIN LOCAL T;
|
||||
SI:=LOC L; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
||||
SI:=SP; T(16(SI:=SI+32)); L(SI:=SI+8); L:=SI;
|
||||
SI:=LOC M; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
||||
SI:=B; T(16(SI:=SI+32)); M(SI:=SI+8); M:=SI;
|
||||
SI:=LOC N; DI:=LOC T; DI:=DI+1; DS:=7CHR;
|
||||
SI:=LOC DIR; SI:=SI+7;
|
||||
IF SC="0" THEN
|
||||
BEGIN SI:=M; DI:=L
|
||||
END ELSE
|
||||
BEGIN SI:=L ; DI:=M
|
||||
END;
|
||||
T(2(DS:=32WDS)); DS:=N WDS;
|
||||
END;
|
||||
INTEGER K; 03002210
|
||||
WHILE N:=N-K GTR 0 DO
|
||||
MOVER(DIR,SP[(L:=L+K)DIV SPRSIZE,*],
|
||||
M:=M+K,B,K:=L MOD SPRSIZE,
|
||||
K:=MIN(SPRSIZE-K,N))
|
||||
END;
|
||||
|
||||
PROCEDURE DUMPOLISH(SP,PD); VALUE PD; REAL PD; ARRAY SP[0,0];
|
||||
BEGIN INTEGER L;
|
||||
LABEL SKIPREST;
|
||||
INTEGER I,N,M,U; REAL T;
|
||||
L:=PD.SPF;
|
||||
I:=SP[LOC]+L;
|
||||
FOR L:=L+2 STEP 1 UNTIL I DO
|
||||
IF (T:=SP[LOC]).TYPEFIELD=FUNCTION THEN
|
||||
BEGIN % OUTPUT MESSAGE AND NAME
|
||||
FORMWD(2,"5FUNC: ");
|
||||
N:=T.LOCFIELD; % N HAS LOCATION OF DESCRIPTOR
|
||||
N:=N-1; % BACK UP ONE TO GET NAME
|
||||
GTA[0]:=SP[NOC];
|
||||
FORMROW(1,1,GTA,1,7);
|
||||
END
|
||||
ELSE % MIGHT BE AN OPERATOR
|
||||
IF T.TYPEFIELD=OPERATOR THEN
|
||||
BEGIN COMMENT OUTPUT MESSAGE AND OP CODE;
|
||||
FORMWD(2,"5ATOR: ");
|
||||
NUMBERCON(T.OPTYPE,ACCUM);
|
||||
FORMROW(0,1,ACCUM,2,ACOUNT);
|
||||
NUMBERCON(T.LOCFIELD,ACCUM);
|
||||
FORMROW(1,1,ACCUM,2,ACOUNT);
|
||||
END ELSE %MAY BE A CONSTANT
|
||||
IF T.TYPEFIELD=CONSTANT THEN
|
||||
BEGIN COMMENT GET DATA DESCRIPTOR;
|
||||
N:=T.LOCFIELD;
|
||||
FORMWD(2,"5CONS: ");
|
||||
T:=SP[NOC]; %T HAS THE DATA DESCRIPTOR
|
||||
IF T.SPF=0 THEN BEGIN % A NULL VECTOR
|
||||
FORMWD(1,"4NULL ");
|
||||
GO TO SKIPREST; END;
|
||||
N:=T.SPF; %N HAS THE SCALAR OR TOP OF VECTOR LOC.
|
||||
IF BOOLEAN(T.SCALAR) THEN M:=U:=N ELSE
|
||||
BEGIN U:=SP[NOC]+N; M:=N+1; %UPPER AND LOWER BOUNDS
|
||||
END;
|
||||
IF BOOLEAN(T.CHRMODE) THEN %CHARACTER FORMAT
|
||||
BEGIN COMMENT SP[NOC] IS NUMBER OF CHRS;
|
||||
TRANSFERSP(OUTOF,SP,M,BUFFER,0,ENTIER(((T:=
|
||||
SP[NOC])-1)DIV 8+1));
|
||||
FORMROW(1,1,BUFFER,0,T);
|
||||
END ELSE % SHOULD TEST FOR NULL...DO IT LATER.
|
||||
FOR N:=M STEP 1 UNTIL U DO
|
||||
BEGIN NUMBERCON(SP[NOC],ACCUM);
|
||||
FORMROW(0,1,ACCUM,2,ACOUNT);
|
||||
END;
|
||||
TERPRINT;
|
||||
SKIPREST:
|
||||
END ELSE COMMENT MUST BE AN OPERAND;
|
||||
IF T.TYPEFIELD=LOCALVAR THEN
|
||||
BEGIN FORMWD(2,"5LOCL: ");
|
||||
N:=T.SPF; % N HAS LOCATION OF NAME;
|
||||
GTA[0]:=SP[NOC]; % PUT NAME IN GTA
|
||||
FORMROW(1,1,GTA,1,7);
|
||||
END ELSE
|
||||
BEGIN COMMENT TREAT IT AS VARIABLE;
|
||||
N:=T.LOCFIELD; COMMENT N HAS LOC OF DESCRIPTOR;
|
||||
N:=N-1; COMMENT BACKUP OVER THE DESCRIPTOR;
|
||||
GTA[0]:=SP[NOC];
|
||||
FORMWD(2,"5AND : ");
|
||||
FORMROW(1,1,GTA,1,7);
|
||||
END;
|
||||
END;
|
||||
|
||||
PROCEDURE PROCESS(MODE); VALUE MODE; INTEGER MODE;
|
||||
BEGIN
|
||||
OWN INTEGER J;
|
||||
OWN REAL RESULTD;
|
||||
LABEL EXPOVRL,INTOVRL,INDEXL,FLAGL,ZEROL;
|
||||
MONITOR EXPOVR,INTOVR,INDEX,FLAG,ZERO;
|
||||
LABEL DEBUGSP; %DEBUGGING PURPOSES ONLY.
|
||||
INTEGER PROCEDURE BUILDCONSTANT(LASTCONSTANT);
|
||||
INTEGER LASTCONSTANT; FORWARD;
|
||||
INTEGER PROCEDURE GETSPACE(LENGTH); VALUE LENGTH;
|
||||
INTEGER LENGTH; FORWARD;
|
||||
PROCEDURE OPERANDTOSYMTAB(L);VALUE L;INTEGER L;FORWARD;
|
||||
REAL PROCEDURE BUILDALPHA(LASTCONSTANT); 03100440
|
||||
INTEGER LASTCONSTANT; FORWARD;
|
||||
INTEGER PROCEDURE BUILDNULL(LASTCONSTANT);
|
||||
INTEGER LASTCONSTANT; FORWARD;
|
||||
PROCEDURE SCRATCHDATA(D);VALUE D;REAL D; FORWARD;
|
||||
COMMENT LINE 3121400;
|
||||
PROCEDURE FORGETPROGRAM(U);VALUE U;REAL U; FORWARD;
|
||||
COMMENT ANALYZE IS IN PROCESS BECAUSE OWN ARRAY SP
|
||||
IS ADDRESSED INCORRECTLY OTHERWISE;
|
||||
REAL PROCEDURE ANALYZE(DISPLAYOP); VALUE DISPLAYOP;BOOLEAN DISPLAYOP;
|
||||
BEGIN COMMENT
|
||||
BC= BUILDCONSTANT,
|
||||
GS= GET SPACE PROCEDURE ;
|
||||
ARRAY INFIX[0:MAXPOLISH];
|
||||
|
||||
INTEGER LASTCONSTANT;
|
||||
DEFINE GS=GETSPACE#;
|
||||
BOOLEAN STREAM PROCEDURE EQUAL(A,B);
|
||||
BEGIN SI:=A; SI:=SI+1; DI:=B; DI:=DI+2;
|
||||
IF 7SC=DC THEN TALLY:=1;
|
||||
EQUAL:=TALLY;
|
||||
END;
|
||||
PROCEDURE UNSTACK(DEST,L,ORIG,OTOP,N,CHR1,CHR2);
|
||||
VALUE N,CHR1,CHR2;
|
||||
INTEGER N,CHR1,CHR2,L,OTOP;
|
||||
ARRAY DEST[0,0],ORIG[0];
|
||||
BEGIN
|
||||
REAL T,U;
|
||||
WHILE OTOP GTR 0 AND N GTR 0 AND ERR=0 DO
|
||||
IF(IF (T:=ORIG[OTOP]).TYPEFIELD=FUNCTION THEN FALSE ELSE
|
||||
U:=T.LOCFIELD=CHR1 OR U=CHR2) THEN %UNSTACK
|
||||
BEGIN
|
||||
IF N GTR 1 THEN
|
||||
IF U=CHR2 THEN ERR:=SYNTAXERROR ELSE
|
||||
OTOP:=OTOP-1;
|
||||
N:=N-1;
|
||||
END ELSE
|
||||
COMMENT WE ARE LOOKING AT AN OPERATOR OR A FUNCTION;
|
||||
|
||||
|
||||
BEGIN
|
||||
IF J NEQ 0 THEN
|
||||
BEGIN L:=L+1;
|
||||
DEST[LOC]:=ORIG[OTOP]
|
||||
END;
|
||||
OTOP:OTOP-1
|
||||
END;
|
||||
IF N GTR 1 THEN ERR:=SYNTAXERROR;
|
||||
END;
|
||||
INTEGER ITOP,K,L,I;
|
||||
INTEGER M,N,FLOC; REAL T;
|
||||
LABEL SKIPSCAN,FILLER;
|
||||
LABEL SPFULLAB;
|
||||
|
||||
|
||||
PROCEDURE FORGETSPACE(L,LENGTH,SP); VALUE L,LENGTH;
|
||||
INTEGER L,LENGTH; ARRAY SP[0,0];
|
||||
BEGIN IF LENGTH GTR 0 THEN
|
||||
BEGIN SP[LOC]:=SP[0,0];
|
||||
SP[LOC].LEN:=LENGTH; SP[0,0]:=L
|
||||
END;
|
||||
END;
|
||||
|
||||
IF CURRENTMODE=FUNCMODE OR STACKBASE=0 THEN FLOC:=0 ELSE
|
||||
|
||||
BEGIN L:=STACKBASE+1;L:=SP[LOC].SPF+1;M:=SP[LOC].SPF+L;
|
||||
FLOC:= IF M=L OR BOOLEAN(T:=SP[MOC]).SUSPENDED THEN 0 ELSE T.SPF
|
||||
|
||||
END;
|
||||
|
||||
T:=ADDRESS;
|
||||
ITOP:=0;
|
||||
DO
|
||||
SKIPSCAN:
|
||||
IF ITOP LSS MAXPOLISH THEN
|
||||
BEGIN
|
||||
INFIX[ITOP:=ITOP+1].ADDRFIELD:=T;
|
||||
IF SPECIAL THEN
|
||||
IF QUOTEV THEN % CONSTANT VECTOR
|
||||
BEGIN INFIX[ITOP].TYPEFIELD:=CONSTANT;
|
||||
IF T:=BUILDALPHA(LASTCONSTANT) NEQ 0 THEN
|
||||
INFIX[ITOP].LOCFIELD:=T ELSE ERR:=SYNTAXERROR
|
||||
END ELSE % ORDINARY OPERATOR
|
||||
BEGIN INFIX[ITOP].TYPEFIELD:=OPERATOR; 03101550
|
||||
...
|
||||
UNTIL NOT(SCAN AND ERR=0); %DROP THRU WHEN INPUT FIN OR ERR 03104040 P29
|
||||
...
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user