mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-01-25 03:15:38 +00:00
2. Commit Mark XVI LISP/APTLIB interpreter, transcribed by Fausto Saporino of Naples, Italy, and generously donated to the project.
1613 lines
129 KiB
Plaintext
1613 lines
129 KiB
Plaintext
? COMPILE LISP/LISP WITH XALGOL LIBRARY
|
|
? XALGOL STACK = 1000
|
|
?LABEL 0 0CARD
|
|
$ CARD LIST SINGLE
|
|
BEGIN %8 SEPTEMBER 1969 00001000
|
|
% 00002000
|
|
% CONSTANT DEFINES 00003000
|
|
% 00004000
|
|
FILE DATA REMOTE(2,10); 00005000
|
|
DEFINE MEMORYROWS = 127#,NOOFPROCESSOPS=44#,STKSZ=2#; 00006000
|
|
REAL LASTUSEDSPACE,XADDR,LINKTONIL,CARADDR,NEXTTOKEN; 00007000
|
|
REAL HASH,PRIORITY,TKNO,LABTAB,T,XX1,XX2; 00008000
|
|
POINTER CP;ARRAY JUNKARRAY[0:0],STACK[0:STKSZ,0:511]; 00009000
|
|
DEFINE CHR=JUNKARRAY[0]#,LEXTREE=HASH#; 00010000
|
|
REAL LASTRPID,STACKPOSITION; 00011000
|
|
BOOLEAN TRACE; 00012000
|
|
REAL ATOMUNDEF,NULLIST,AT0,AT1,AT2,AT3,AT4,AT5,AT6,AT7,RC1,RC9; 00013000
|
|
ARRAY SYSMARRAY[0:2], TYPEARRAY[0:15]; 00014000
|
|
ARRAY PROCESSARRAY[0:NOOFPROCESSOPS]; 00015000
|
|
ARRAY MEMORY[0:MEMORYROWS, 0:511]; 00016000
|
|
ARRAY C1[0:0], C2[0:0],C3[0:0],C4[0:0],C5[0:0],C6[0:0]; 00016050
|
|
REAL CURROW; 00016060
|
|
DEFINE TYPE = [22:4]#, 00017000
|
|
ADDR=[18:19]#; 00018000
|
|
DEFINE TYPEGARBAGE =0#, 00019000
|
|
TYPECONS=1#, 00020000
|
|
TYPELIST=2#, 00021000
|
|
TYPEAREA=3#, 00022000
|
|
TYPEFIELD=4#, 00023000
|
|
TYPESYMB=5#, 00024000
|
|
TYPELOGIC=6#, 00025000
|
|
TYPELINK =7#, 00026000
|
|
TYPEPROCESS=8#, 00027000
|
|
TYPEMONITOR=9#, 00028000
|
|
TYPEGENERAL=10#, 00029000
|
|
TYPETOKEN=11#, 00030000
|
|
TYPECODE=11#; 00031000
|
|
% 00032000
|
|
% TOKEN ASSIGNMENTS 00033000
|
|
% 00034000
|
|
% 1 TO 30= ALGOL RETURN LABELS 00035000
|
|
% 100 = ASGN 00036000
|
|
% 101 = REF 00037000
|
|
% 102 = CAR 00038000
|
|
% 103 = CDR 00039000
|
|
% 104 = CONS 00040000
|
|
% 105 = NEWSYMB 00041000
|
|
% 106 = AMTSPACE 00042000
|
|
% 107 = MAKE 00043000
|
|
% 108 = PRINT 00044000
|
|
% 109 = INLEX 00045000
|
|
% 110 = GCL 00046000
|
|
% 111 = CREATE 00047000
|
|
% 112 = DELETE 00048000
|
|
% 113 = SUSPEND 00049000
|
|
% 114 = RESUME 00050000
|
|
% 115 = RETURN 00051000
|
|
% 116 = IDENTITY 00052000
|
|
% 117 = HALT 00053000
|
|
% 118 = 00054000
|
|
% 119 = 00055000
|
|
% 120 = TRACE 00056000
|
|
% 121 = EQLIST 00057000
|
|
% 122 = QUOTE 00058000
|
|
% 123 = ASGNENV 00059000
|
|
% 124 = REFENV 00060000
|
|
% 125 = EXE 00061000
|
|
% 126 = DEBUG 00062000
|
|
% 127 = LDMODE 00063000
|
|
% 128 = CONSTRUCT 00064000
|
|
% 129 = AREA 00065000
|
|
% 130 = TOKEN 00066000
|
|
% 131 = SINGLESTEP 00067000
|
|
% 132 = UP 00068000
|
|
% 133 = DP 00069000
|
|
% 134 = READ 00070000
|
|
% 135 = 00071000
|
|
% 136 = LIST 00072000
|
|
% 137 = COND 00073000
|
|
% 138 = EQ 00074000
|
|
% 139 = ATOM 00075000
|
|
% 140 = BLOCKOP 00076000
|
|
% 141 = NEQ 00077000
|
|
% 142 = IF 00078000
|
|
% 143 = NONTERM 00079000
|
|
%144=USERL 00079010
|
|
%145=LTAB 00079020
|
|
%146=COPY 00079030
|
|
%147=ADD 00079035
|
|
%148=SUB 00079040
|
|
%149=MUL 00079045
|
|
%150 =DIV 00079050
|
|
%151=EX 00079055
|
|
%152=NEG 00079060
|
|
% 00080000
|
|
% 512 TO 576 = SPECIAL CHARACTERS 00081000
|
|
% 00082000
|
|
% 118 = ALTERNATIVE OP IN BNF INTERPRETERS 00083000
|
|
% 1000 = RESULT VARIABLE FOR BASE LANGUAGE 00084000
|
|
% 1001 = LIST FORMAL PARAMETER 00085000
|
|
% 1002 = QUOTED FORMAL PARAMETER 00086000
|
|
% 1003 = QUOTED LIST FORMAL PARAMETER 00087000
|
|
% 1004 = BASE LANGUAGE INTERPRETER 00088000
|
|
% 1005 = BNF INTERPRETER 00089000
|
|
% 1006 = STRING VARIABLE FOR BNF 00090000
|
|
% 1007 = QUOTED SYMBOL IN SCANNER 00091000
|
|
% 1008 = SINGLE STEP VARIABLE 00092000
|
|
% 1009 = TRACE VARIABLE 00093000
|
|
% 1010 = REMOTE TERMINAL DEVICE 00094000
|
|
% 1011 = DISK DEVICE 00095000
|
|
% 1012 = # IN BNF ALTERNATIVE 00096000
|
|
% 1013 = LEXUNIT 00097000
|
|
% 1014 = ID 00098000
|
|
% 1015 = INT 00099000
|
|
% 1016 = SPCHAR 00100000
|
|
% 1017 = CODE GENERATOR INTERPRETER 00101000
|
|
% 1018 = TREE VARIABLE IN BNF INTERPRETER 00102000
|
|
% 1019 = N VARIABLE IN BNF INTERPRETER 00103000
|
|
%1020 = NUMBER 00103010
|
|
% 00104000
|
|
% 2000 TO 10000 = IDENTIFIERS 00105000
|
|
% 00106000
|
|
% 262144 TO 524287 = USER TOKENS 00107000
|
|
% 00108000
|
|
% DEFINED SUBROUTINES 00109000
|
|
% 00110000
|
|
DEFINE FNS(FNS1)=PSCAN(1,FNS1,F)#,STATS=PSCAN(0,0,V1)#; 00111000
|
|
DEFINE M[M1]=(IF BOOLEAN(M1)THEN 00112000
|
|
MEMORY[(M1).[18:9],(M1).[9:9]].[22:23] ELSE 00113000
|
|
MEMORY[(M1).[18:9],(M1).[9:9]].[45:23])#, 00114000
|
|
STEPSPACE=(LASTUSEDSPACE:=LASTUSEDSPACE+1)#, 00115000
|
|
AT(AT1)=(AT0+AT1)#, 00116000
|
|
TOKEN(TOKEN1)=(TKNO+TOKEN1)#, 00117000
|
|
ATOM(ATOM1)=((T:=ATOM1.TYPE)=TYPELOGIC OR T=TYPESYMB OR T=TYPETOKEN)#, 00118000
|
|
DELETE(DELETE1)=BEGIN ASGN(AT2,DELETE1,ATOMDELETED)END#, 00119000
|
|
SUSPEND(SUSPEND1)=BEGIN IF REF(AT2,SUSPEND1) NEQ ATOMRESUMED THEN 00120000
|
|
PRIMERROR("SPND",SUSPEND1)ELSE ASGN(AT2,SUSPEND1,ATOMSUSPENDED)END#, 00121000
|
|
AMTSPACE=((0&(MEMORYROWS+1)[18:8:9])-LASTUSEDSPACE-1)#, 00122000
|
|
ATOMUND=ATOMUNDEF#, 00123000
|
|
ATOMCAR=AT1#, 00124000
|
|
ATOMCDR=AT0#, 00125000
|
|
ATOMASSO=AT0#, 00126000
|
|
ATOMPRIORITY=AT1#, 00127000
|
|
ATOMSUSPENDED=AT1#, 00128000
|
|
ATOMRESUMED=AT2#, 00129000
|
|
ATOMDELETED=AT3#, 00130000
|
|
LOGIC(LOGIC1)=MAKE(TYPELOGIC,LOGIC1)#, 00131000
|
|
DEC(DEC1)=(DEC1-1)#, 00132000
|
|
MAKE(MAKE1,MAKE2)=((MAKE2)&(MAKE1)[22:3:4])#, 00133000
|
|
QQ(QQ1)=QU(1,QQ1)#, 00134000
|
|
UQ=QU(2,0)#, 00135000
|
|
INQ(INQ1)=QU(3,INQ1)#, 00136000
|
|
GCL=QU(4,0)#; 00137000
|
|
DEFINE SMEM(SMEM1)=QU(6," "&SMEM1[41:35:36])#; 00138000
|
|
DEFINE LMEM(LMEM1)=QU(7," "&LMEM1[41:35:36])#; 00139000
|
|
DEFINE INLEX(INLEX1)=IL(1,0,0,INLEX1)#,INTLX=IL(0,0,0,0)#, 00140000
|
|
LOADMODE(LOADMODE1,LOADMODE2)=IL(2,LOADMODE1,LOADMODE2,0)#; 00141000
|
|
DEFINE ID(ID1)=(ID1.TYPE=TYPECODE AND ID1.ADDR LSS 10000 00142000
|
|
AND ID1.ADDR GEQ 2000)#, 00143000
|
|
INT(INT1)=(INT1.TYPE=TYPELOGIC)#, 00144000
|
|
NBR(NBR1)=(NBR1.TYPE=TYPELOGIC OR (IF NBR1.TYPE=TYPEAREA 00144010
|
|
THEN (IF REF(AT0,NBR1).ADDR EQL 3 THEN TRUE ELSE FALSE)ELSE FALSE))#, 00144020
|
|
SPCHAR(SPCHAR1)=(SPCHAR1.TYPE=TYPECODE AND SPCHAR1.ADDR 00145000
|
|
LEQ 576 AND SPCHAR1.ADDR GEQ 512)#; 00146000
|
|
% 00147000
|
|
% FORWARD PROCEDURE DECLARATIONS 00148000
|
|
% 00149000
|
|
REAL PROCEDURE TAIL(STRING); VALUE STRING; REAL STRING; FORWARD; 00150000
|
|
REAL PROCEDURE USERS(F);REAL F ;FORWARD; 00151000
|
|
REAL PROCEDURE USERL(X);REAL X ;FORWARD; 00152000
|
|
REAL PROCEDURE PSCAN(IJ,X,F);REAL X,F;INTEGER IJ;FORWARD; 00153000
|
|
REAL PROCEDURE BNFTREE(F);REAL F ;FORWARD; 00154000
|
|
PROCEDURE MEMSAVE(X,N,Y); 00155000
|
|
VALUE N,Y;ARRAY X[0];REAL N,Y; FORWARD; 00156000
|
|
PROCEDURE UNSAVE(X,N,FID); 00157000
|
|
VALUE FID;ARRAY X[0];REAL N,FID;FORWARD; 00158000
|
|
PROCEDURE GARBAGECOLLECT(QMEM,N); 00159000
|
|
VALUE N;ARRAY QMEM[0];REAL N; 00160000
|
|
FORWARD; 00161000
|
|
REAL PROCEDURE COPY(X);VALUE X;REAL X;FORWARD; 00162000
|
|
PROCEDURE DOTRACE(PROCESS);VALUE PROCESS;REAL PROCESS;FORWARD; 00163000
|
|
PROCEDURE EQLIST(X,Y);VALUE X,Y;REAL X,Y;FORWARD; 00164000
|
|
PROCEDURE PRINT(X);VALUE X;REAL X;FORWARD; 00165000
|
|
PROCEDURE UREAD(FIL,BUF);VALUE FIL;REAL FIL;ARRAY BUF[0];FORWARD; 00166000
|
|
BOOLEAN PROCEDURE EQ(X,Y);VALUE X,Y;REAL X,Y;FORWARD; 00167000
|
|
REAL PROCEDURE LEXFIND;FORWARD; 00168000
|
|
REAL PROCEDURE QU(P,Y); 00169000
|
|
VALUE P,Y;INTEGER P;REAL Y; 00170000
|
|
FORWARD; 00171000
|
|
PROCEDURE PRIMERROR(A,V); 00172000
|
|
VALUE A,V;REAL A,V;FORWARD; 00173000
|
|
REAL PROCEDURE CONS(X,Y);VALUE X,Y;REAL X,Y;FORWARD; 00174000
|
|
REAL PROCEDURE CAR(X);VALUE X;REAL X; FORWARD; 00175000
|
|
REAL PROCEDURE CDR(X);VALUE X;REAL X; FORWARD; 00176000
|
|
PROCEDURE MASGN(A,V);VALUE A,V;REAL A,V;FORWARD; 00177000
|
|
PROCEDURE RESUME(PROCESS);VALUE PROCESS;REAL PROCESS;FORWARD; 00178000
|
|
PROCEDURE RETURN(PROCESS,VAL); 00179000
|
|
VALUE PROCESS,VAL;REAL PROCESS,VAL;FORWARD; 00180000
|
|
PROCEDURE DEBUG;FORWARD; 00181000
|
|
PROCEDURE INTERP;FORWARD; 00182000
|
|
PROCEDURE SYSM;FORWARD; 00183000
|
|
REAL PROCEDURE CREATE(START,ENV,INTERPRETER,PROCESS); 00184000
|
|
VALUE START,ENV,INTERPRETER,PROCESS; 00185000
|
|
REAL START,ENV,INTERPRETER,PROCESS;FORWARD; 00186000
|
|
PROCEDURE ASGN(X,Y,Z);VALUE X,Y,Z;REAL X,Y,Z;FORWARD; 00187000
|
|
REAL PROCEDURE NEWSYMB(ASSO);VALUE ASSO;REAL ASSO;FORWARD; 00188000
|
|
REAL PROCEDURE REF(X,Y);VALUE X,Y;REAL X,Y; 00189000
|
|
FORWARD; 00190000
|
|
REAL PROCEDURE HANGON (X,Y); 00191000
|
|
VALUE X,Y; REAL X,Y;FORWARD; 00192000
|
|
REAL PROCEDURE IL(M,C,CM,F); 00193000
|
|
INTEGER M; REAL C,CM,F; FORWARD; 00194000
|
|
REAL PROCEDURE CHAR(P,N); 00195000
|
|
POINTER P; INTEGER N; FORWARD; 00196000
|
|
REAL PROCEDURE PMAKE(T,N);VALUE T,N;REAL T,N;FORWARD; 00197000
|
|
REAL PROCEDURE DA(X);VALUE X;REAL X;FORWARD; 00197010
|
|
REAL PROCEDURE AD(X);VALUE X;REAL X;FORWARD; 00197020
|
|
REAL PROCEDURE AR(X,Y,Z);VALUE X,Y,Z;REAL X,Y,Z;FORWARD; 00197030
|
|
PROCEDURE APLPNT(X);VALUE X;REAL X;FORWARD; 00197040
|
|
REAL PROCEDURE TAIL(STRING);VALUE STRING;REAL STRING; 00198000
|
|
BEGIN REAL X; 00198010
|
|
IF CAR(TAIL:=X:=CDR(STRING)).TYPE=TYPEAREA AND NOT NBR(CAR(X)) THEN 00199000
|
|
ASGN(AT0,STRING,(TAIL:=CONS(USERS(CAR(X)),X))) END; 00200000
|
|
REAL PROCEDURE QU(P,Y); 00201000
|
|
VALUE P,Y;INTEGER P;REAL Y; 00202000
|
|
BEGIN OWN INTEGER N;REAL V; 00203000
|
|
DEFINE PR(PR1)=(PR1.[41:19])#; 00204000
|
|
FORMAT F1(I4,": ",A4,I6,", ",A4,I6); 00205000
|
|
INTEGER L,LP; ALPHA A; 00206000
|
|
LABEL B1,B2,BB,BB1; 00207000
|
|
SWITCH PSW:=B1,B2,BB,B2,B2,B2,B2,B2; 00208000
|
|
GO TO PSW[P]; 00209000
|
|
BB:N:=0; 00210000
|
|
V:=MAKE(TYPELOGIC,0); 00211000
|
|
Y:=CONS(LABTAB,CONS(Y,NULLIST)); 00212000
|
|
P:=8; 00213000
|
|
GO TO BB1; 00214000
|
|
B1:QU:=ATOMUND; 00215000
|
|
V:=REF(ATOMPRIORITY,Y); 00216000
|
|
BB1:N:=N+1; 00217000
|
|
A:=Y&V[45:22:23]; 00218000
|
|
B2: BEGIN OWN ALPHA ARRAY X[0:N]; 00219000
|
|
LABEL B3,B4,B5,B6,B7,B8,B9; 00220000
|
|
LABEL B10,QDUMP,MEMDP,MEMLD,QIN,QSET; 00221000
|
|
INTEGER I,K,IS; 00222000
|
|
ALPHA XS; 00223000
|
|
SWITCH SW:=B3,B4,B5,B10,QDUMP,MEMDP,MEMLD,QIN,QSET; 00224000
|
|
GO TO SW[P]; 00225000
|
|
QSET:K:=LASTUSEDSPACE.[18:18]+2; 00225010
|
|
FOR I:=0 STEP 1 UNTIL N DO 00225020
|
|
X[I]:=MEMORY[(K+I).[17:9],(K+I).[8:9]]; 00225030
|
|
LABTAB:=CAR(X[0].[45:23]);HASH:=CAR(CDR(X[0].[45:23])); 00225031
|
|
GO TO B9; 00225040
|
|
QIN: X[0]:=Y&Y[45:22:23]; 00226000
|
|
GO TO B3; 00227000
|
|
QDUMP:FOR P:=0 STEP 1 UNTIL N DO 00228000
|
|
WRITE(DATA,F1,P,TYPEARRAY[X[P].[45:4]],X[P].[41:19], 00229000
|
|
TYPEARRAY[X[P].TYPE],X[P].ADDR); 00230000
|
|
GO TO B9; 00231000
|
|
MEMDP:MEMSAVE(X,N,Y); GO TO B9; 00232000
|
|
MEMLD:UNSAVE(X,N,Y);P:=9;GO TO B2; 00233000
|
|
B10:GARBAGECOLLECT(X,N); 00234000
|
|
LABTAB:=CAR(X[0].[45:23]); 00235000
|
|
HASH:=CAR(CDR(X[0].[45:23]));GO TO B9; 00236000
|
|
B3:X[N]:=A; 00237000
|
|
; 00238000
|
|
I:=N; 00239000
|
|
B6:IS:=I DIV 2; 00240000
|
|
IF I LSS 2 THEN GO TO B9 00241000
|
|
ELSE IF PR(X[I]) GTR PR(X[IS]) THEN 00242000
|
|
BEGIN XS:=X[IS]; 00243000
|
|
X[IS]:=X[I]; 00244000
|
|
X[I]:=XS; 00245000
|
|
I:=IS; GO TO B6 END 00246000
|
|
ELSE GO TO B9; 00247000
|
|
B4:QU:=X[1].[22:23]; 00248000
|
|
X[0]:=X[0]&X[1][22:22:23]; 00249000
|
|
00250000
|
|
I:=1 00251000
|
|
; 00252000
|
|
IS:= 2|I; 00253000
|
|
WHILE IS LSS N DO BEGIN 00254000
|
|
IF PR(X[IS]) GTR PR(X[IS+1]) 00255000
|
|
THEN BEGIN X[I]:=X[IS]; 00256000
|
|
I:=IS END 00257000
|
|
ELSE BEGIN X[I]:=X[IS+1]; 00258000
|
|
I:=IS+1 END; 00259000
|
|
IS:=2|I END 00260000
|
|
; 00261000
|
|
IF IS GTR N THEN BEGIN 00262000
|
|
N:=N-1 00263000
|
|
; 00264000
|
|
FOR K:=I STEP 1 UNTIL N DO 00265000
|
|
X[K]:=X[K+1]; 00266000
|
|
IF N EQL 0 THEN BEGIN 00267000
|
|
N:=N+1; GO TO B9 END END 00268000
|
|
ELSE BEGIN N:=N-1;X[I]:=X[IS]END; 00269000
|
|
P:=3; GO TO B2; 00270000
|
|
B5:P:=2; 00271000
|
|
B9: PRIORITY:=X[1].[45:23] END 00272000
|
|
END QU; 00273000
|
|
PROCEDURE PRIMERROR (A,V); 00274000
|
|
VALUE A,V;REAL A,V; 00275000
|
|
BEGIN FORMAT F1("SERR:",A4,X1,A4,I6); 00276000
|
|
WRITE(DATA,F1,A,TYPEARRAY[V.TYPE],V.ADDR); 00277000
|
|
A:=0/0; 00278000
|
|
END PRIMERROR; 00279000
|
|
% 00280000
|
|
% B A S E L A N G U A G E I N T E R P R E T E R 00281000
|
|
% 00282000
|
|
%ROUTINE INTERPRET(PROCESS)= 00283000
|
|
% [ INT1: WHEN STATUS/PROCESS NEQ "SUSPENDED"; 00284000
|
|
% IF STATUS/PROCESS NEQ "RESUMED" THEN DELETE(SELF); 00285000
|
|
% INSTVAL(PROCESS); 00286000
|
|
% GO TO INT1 ]; 00287000
|
|
% 00288000
|
|
%ROUTINE INSTVAL(PROCESS)= 00289000
|
|
% [ INST:= INST/NEXT/PROCESS; 00290000
|
|
% NEXT/PROCESS:= SUCCESSOR/NEXT/PROCESS; 00291000
|
|
% ARGVAL(INST, PROCESS); 00292000
|
|
% RETURN(CALLER/SELF); DELETE(SELF) ]; 00293000
|
|
% 00294000
|
|
%ROUTINE ARGVAL(ARG,PROCESS)= 00295000
|
|
% [ IF ATOM(ARG) THEN ARG:= I(ARG)/ENV/PROCESS ELSE 00296000
|
|
% ARG:= APPLY(OPVAL(AP/ARG,PROCESS),ARGLIST/ARG,PROCESS); 00297000
|
|
% RETURN(CALLER/SELF,ARG); DELETE(SELF)]; 00298000
|
|
% 00299000
|
|
%ROUTINE OPVAL(OP,PROCESS)= 00300000
|
|
% [ IF NOT ATOM(OP) THEN OP:= ARGVAL(OP,PROCESS); 00301000
|
|
% IF ATOM OP THEN OP:= I(OP)/MACHINE; 00302000
|
|
% RETURN(CALLER/SELF,OP); DELETE(SELF) ]; 00303000
|
|
% 00304000
|
|
%ROUTINE APPLY(ROUTINE,ARGLIST,PROCESS)= 00305000
|
|
% IF ATOM(ROUTINE) THEN 00306000
|
|
% [RETURN(CALLER/SELG, PRIMVAL(ROUTINE, 00307000
|
|
% LISTVAL(ARGLIST,PROCESS),PROCESS)); DELETE(SELF)]; 00308000
|
|
% ENV:=PARAPASS(FPARA/ROUTINE,MAKE("CONSTRUCT"), 00309000
|
|
% ARGLIST,PROCESS); 00310000
|
|
% RETURN(CALLER/SELF, CALL(ROUTINE,ENV,PROCESS)); 00311000
|
|
% DELETE(SELF) ]; 00312000
|
|
% 00313000
|
|
%ROUTINE CALL(ROUTINE,ENV,PROCESS)= 00314000
|
|
% [ RESUME(CREATE(START/ROUTINE,ENV,INTERPRETER/ROUTINE, 00315000
|
|
% PROCESS)); 00316000
|
|
% DELETE(SELF) ]; 00317000
|
|
% 00318000
|
|
%ROUTINE PARAPASS(FPARA,ENV,ARGLIST,PROCESS)= 00319000
|
|
% [ IF FPARA NEQ "NIL" AND ARGLIST NEQ "NIL" THEN 00320000
|
|
% IF CAR(FPARA) = "UNDEF" THEN 00321000
|
|
% CAR(CDR(FPARA))/ENV:= LISTVAL(ARGLIST,PROCESS) ELSE 00322000
|
|
% [ CAR(FPARA)/ENV:= ARGVAL(CAR(ARGLIST),PROCESS); 00323000
|
|
% ENV:= PARAPASS(CDR(FPARA),ENV,CDR(ARGLIST),PROCESS) ]; 00324000
|
|
% RETURN(CALLER/SELF,ENV) ]; 00325000
|
|
% 00326000
|
|
%ROUTINE LISTVAL(ARGLIST,PROCESS)= 00327000
|
|
% [ IF ARGLIST="NIL" THEN 00328000
|
|
% RETURN(CALLER/SELF,"NIL") ELSE 00329000
|
|
% RETURN(CALLER/SELF,CONS(ARGVAL(CAR(ARGLIST),PROCESS), 00330000
|
|
% LISTVAL(CDR(ARGLIST),PROCESS)) ]; 00331000
|
|
% 00332000
|
|
PROCEDURE INTERP; 00333000
|
|
BEGIN REAL ARG,ARGLIST,STRING,OP,ENV,FPARA,SAV,T,PROCESS; 00334000
|
|
DEFINE ROUTINE=OP#; 00335000
|
|
DEFINE GET1=CAR(ARG)#,GET=CAR((ARG:=CDR(ARG)))#; 00336000
|
|
DEFINE STACK(STACK1)=SAV:=CONS(STACK1,SAV)#, 00337000
|
|
EXIT=BEGIN T:=CAR(SAV);SAV:=CDR(SAV); 00338000
|
|
IF T.TYPE NEQ TYPECODE THEN PRIMERROR("EXIT",T); 00339000
|
|
GO TO RETSW[T.ADDR]END#; 00340000
|
|
LABEL INTERPRET,INSTVAL,ARGVAL,APPLY,CALL,OPVAL,PARAPASS, 00341000
|
|
LISTVAL,PRIMVAL,RETURNVAL,INT1,OP1,L1, 00342000
|
|
R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15, 00343000
|
|
R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31, 00344000
|
|
R32,R33,R34,R35,R36,R37,R38,R39,R40,R41,R42,R43,R44,R45, 00345000
|
|
R46,LEND,R47,R48,R49,R50,R51,R52,R53,R54,R55,R56,R57; 00346000
|
|
SWITCH RETSW:=R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15, 00347000
|
|
R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31, 00348000
|
|
R32,R33,R34,R35,R36,R37,R38,R39,R40,R41,R42,R43,R44,R45,R46,R47,R48, 00349000
|
|
R49,R50,R51,R52,R53,R54,R55,R56,R57; 00350000
|
|
REAL RC2,RC3,RC4,RC5,RC6,RC7,RC8,RC10; 00350001
|
|
REAL PROCEDURE UNSTCK(SAV);REAL SAV; 00351000
|
|
BEGIN UNSTCK:=CAR(SAV);SAV:=CDR(SAV)END; 00352000
|
|
DEFINE LV(LV1)=BEGIN STACK(MAKE(TYPECODE,LV1)); 00353000
|
|
GO TO LISTVAL;END#; 00354000
|
|
DEFINE UNSTACK=UNSTCK(SAV)#; 00355000
|
|
LABEL BNFINSTVAL,BNFEXITVAL,BNFTERMVAL,BNFRETURNVAL, 00356000
|
|
BNFNONTERMVAL,WAITRETURN,BNFL1,BNFL2,BNFL3; 00357000
|
|
REAL INST,X,VAL; 00358000
|
|
DEFINE STR=CODE(1006)#,SLEXUNIT=CODE(1013)#, 00359000
|
|
SID=CODE(1014)#,SINT=CODE(1015)#, 00360000
|
|
SSPCHAR=CODE(1016)#,SQUOTE=CODE(122)#, 00361000
|
|
SCGINT=CODE(1017)#,TREE=CODE(1018)#, 00362000
|
|
N=CODE(1019)#,CODE(CODE1)=TOKEN(CODE1)#; 00363000
|
|
DEFINE SNBR=CODE(1020)#; 00364000
|
|
BOOLEAN PROCEDURE LOOK1(X,Y);VALUE X,Y;REAL X,Y; 00364010
|
|
IF(X=SLEXUNIT)OR(X=SID AND ID(Y)) OR(X=SINT AND INT(Y)) 00364020
|
|
OR(X=SNBR AND NBR(Y))OR(X=SSPCHAR AND SPCHAR(Y)) 00364030
|
|
OR(X=Y)OR(X.TYPE EQL TYPELIST) 00364040
|
|
OR(X=CODE(1012)) THEN LOOK1:=TRUE ELSE LOOK1:=FALSE; 00364050
|
|
PROCESS:=UQ; 00364060
|
|
SAV:=REF(AT7,PROCESS); 00365000
|
|
RC2:=MAKE(TYPECODE,2); 00366000
|
|
RC3:=MAKE(TYPECODE,3); 00367000
|
|
RC4:=MAKE(TYPECODE,4); 00368000
|
|
RC5:=MAKE(TYPECODE,5); 00369000
|
|
RC6:=MAKE(TYPECODE,6); 00370000
|
|
RC7:=MAKE(TYPECODE,7); 00371000
|
|
RC8:=MAKE(TYPECODE,8); 00372000
|
|
RC10:=MAKE(TYPECODE,10); 00373000
|
|
EXIT; 00374000
|
|
INTERPRET:R1: %(PROCESS) 00375000
|
|
IF REF(AT2,PROCESS) NEQ ATOMRESUMED THEN GO TO INT1; 00376000
|
|
IF REF(AT1,PROCESS) LSS PRIORITY THEN 00377000
|
|
BEGIN STACK(RC1);T:=QQ(PROCESS); 00378000
|
|
INT1:ASGN(AT7,PROCESS,SAV); 00379000
|
|
PROCESS:=UQ;SAV:=REF(AT7,PROCESS); EXIT END; 00380000
|
|
IF TRACE THEN BEGIN ASGN(AT7,PROCESS,SAV); 00381000
|
|
DOTRACE(PROCESS) END; 00382000
|
|
STACK(RC1); 00383000
|
|
IF (OP:=REF(AT5,PROCESS))=TOKEN(1004) THEN GO TO INSTVAL; 00384000
|
|
IF OP=TOKEN(1005) THEN GO TO BNFINSTVAL; 00385000
|
|
IF OP=TOKEN(1017) THEN GO TO INSTVAL; 00386000
|
|
ASGN(AT1,(ENV:=PMAKE(TYPECONS,0)),PROCESS); 00387000
|
|
GO TO CALL; 00388000
|
|
INSTVAL: %(PROCESS)=ARG 00389000
|
|
ARG:=REF(AT3,PROCESS); 00390000
|
|
ASGN(AT3,PROCESS,CDR(ARG)); 00391000
|
|
IF ARG=NULLIST THEN GO TO RETURNVAL; 00392000
|
|
ARG:=CAR(ARG); 00393000
|
|
STACK(TOKEN(27)); GO TO ARGVAL;R27: 00394000
|
|
ASGN(TOKEN(1000),REF(AT4,PROCESS),ARG); 00395000
|
|
EXIT; 00396000
|
|
ARGVAL: %(ARG,PROCESS)=ARG 00397000
|
|
IF ATOM(ARG) THEN ARG:=REF(ARG,REF(AT4,PROCESS)) ELSE 00398000
|
|
BEGIN STACK(CDR(ARG)); 00399000
|
|
OP:=CAR(ARG); 00400000
|
|
STACK(RC2); GO TO OPVAL;R2: 00401000
|
|
ARGLIST:=UNSTACK; 00402000
|
|
GO TO APPLY END; EXIT; 00403000
|
|
APPLY: %(OP,ARGLIST,PROCESS)=ARG 00404000
|
|
IF ROUTINE.TYPE=TYPECODE THEN GO TO PRIMVAL; 00405000
|
|
FPARA:=REF(AT1,ROUTINE); 00406000
|
|
ENV:=PMAKE(TYPECONS,0); 00407000
|
|
STACK(ROUTINE); 00408000
|
|
STACK(RC3);GO TO PARAPASS; R3: 00409000
|
|
ROUTINE:=UNSTACK; 00410000
|
|
%GO TO CALL; 00411000
|
|
CALL: %(OP,ENV,PROCESS)=ARG 00412000
|
|
ASGN(AT7,PROCESS,SAV); 00413000
|
|
PROCESS:=CREATE(REF(AT2,ROUTINE),ENV,REF(AT3,ROUTINE),PROCESS); 00413010
|
|
R39:ASGN(AT2,PROCESS,ATOMRESUMED); 00414000
|
|
GO TO INTERPRET; 00415000
|
|
R9:IF REF(AT5,PROCESS)=CODE(1005) THEN %BNFINT 00416000
|
|
BEGIN VAL:=UNSTACK;GO TO BNFRETURNVAL END; 00417000
|
|
ARG:=UNSTACK; 00418000
|
|
EXIT; 00419000
|
|
OPVAL: %(OP,PROCESS)=ARG 00420000
|
|
IF ATOM(OP) THEN GO TO OP1; 00421000
|
|
BEGIN 00422000
|
|
ARG:=OP; 00423000
|
|
STACK(RC4); GO TO ARGVAL;R4: 00424000
|
|
OP:=ARG END; 00425000
|
|
OP1:EXIT; 00426000
|
|
PARAPASS: %(FPARA,ENV,ARGLIST,PROCESS)=ENV 00427000
|
|
IF FPARA NEQ NULLIST THEN IF ARGLIST NEQ NULLIST THEN 00428000
|
|
IF CAR(FPARA)=ATOMUNDEF THEN 00429000
|
|
BEGIN STACK(ENV);STACK(CAR(CDR(FPARA))); 00430000
|
|
STACK(RC5);GO TO LISTVAL;R5: 00431000
|
|
ASGN(UNSTACK,UNSTACK,ARG)END ELSE 00432000
|
|
BEGIN STACK(FPARA);STACK(ENV);STACK(CDR(ARGLIST)); 00433000
|
|
ARG:=CAR(ARGLIST); 00434000
|
|
STACK(RC6);GO TO ARGVAL;R6: 00435000
|
|
ARGLIST:=UNSTACK;ENV:=UNSTACK;FPARA:=UNSTACK; 00436000
|
|
ASGN(CAR(FPARA),ENV,ARG); 00437000
|
|
FPARA:=CDR(FPARA);GO TO PARAPASS;END; 00438000
|
|
EXIT; 00439000
|
|
LISTVAL: %(ARGLIST,PROCESS)=ARG 00440000
|
|
IF ARGLIST NEQ NULLIST THEN 00441000
|
|
BEGIN STACK(CDR(ARGLIST));ARG:=CAR(ARGLIST); 00442000
|
|
STACK(RC7);GO TO ARGVAL;R7: 00443000
|
|
ARGLIST:=UNSTACK;STACK(ARG); 00444000
|
|
STACK(RC8);GO TO LISTVAL;R8: 00445000
|
|
ARG:=CONS(UNSTACK,ARG); 00446000
|
|
END ELSE ARG:=ARGLIST; EXIT; 00447000
|
|
RETURNVAL: %(PROCESS) 00448000
|
|
IF(OP:=REF(AT6,PROCESS))NEQ ATOMUNDEF THEN 00449000
|
|
BEGIN ARG:=REF(TOKEN(1000),REF(AT4,PROCESS)); 00450000
|
|
RETURN(OP,ARG)END; 00451000
|
|
DELETE(PROCESS);GO TO INT1 ; 00452000
|
|
BNFINSTVAL: %(PROCESS) 00453000
|
|
ASGN(AT3,PROCESS,CDR((INST:=REF(AT3,PROCESS)))); 00454000
|
|
IF INST=NULLIST THEN GO TO BNFEXITVAL ELSE 00455000
|
|
IF ATOM((ARG:=CAR(INST))) THEN GO TO BNFTERMVAL ELSE 00456000
|
|
GO TO BNFNONTERMVAL; 00457000
|
|
00458000
|
|
BNFEXITVAL: %(PROCESS) 00459000
|
|
SUSPEND(PROCESS); RETURN(COPY(REF(AT6,PROCESS)),PROCESS); 00460000
|
|
ASGN(AT5,PROCESS,SCGINT); EXIT; 00461000
|
|
00462000
|
|
BNFTERMVAL: %(ARG,PROCESS) 00463000
|
|
X:=CAR((STRING:=REF(STR,(ENV:=REF(AT4,PROCESS))))); 00464000
|
|
IF ARG=SLEXUNIT THEN GO TO BNFL1; 00465000
|
|
IF ARG=SID THEN GO TO (IF ID(X) THEN BNFL1 ELSE BNFL2); 00466000
|
|
IF ARG=SINT THEN GO TO (IF INT(X) THEN BNFL1 ELSE BNFL2); 00467000
|
|
IF ARG=SSPCHAR THEN GO TO (IF SPCHAR(X) THEN BNFL1 ELSE BNFL2); 00468000
|
|
IF ARG=SNBR THEN GO TO(IF NBR(X) THEN BNFL1 ELSE BNFL2); 00469000
|
|
IF ARG=(OP:=CODE(117)) THEN GO TO PRIMVAL; 00469010
|
|
IF ARG=CODE(1012) THEN GO TO BNFEXITVAL; 00470000
|
|
IF X=ARG THEN 00471000
|
|
ASGN(STR,ENV,TAIL(STRING)) ELSE GO TO BNFL2; 00472000
|
|
EXIT; 00473000
|
|
BNFL1: INST:=CONS(SQUOTE,CONS(X,NULLIST)); 00474000
|
|
X:=CREATE(CONS(INST,NULLIST),PMAKE(TYPECONS,0),SCGINT,PROCESS); 00475000
|
|
ASGN(STR,ENV,TAIL(STRING)); 00476000
|
|
ASGN(TREE,ENV,CONS(X,REF(TREE,ENV))); 00477000
|
|
ASGN(N,ENV,REF(N,ENV)+1);EXIT; 00478000
|
|
BNFL2:DELETE(PROCESS); EXIT; 00479000
|
|
00480000
|
|
BNFRETURNVAL: %(PROCESS,VAL) 00481000
|
|
ASGN(AT4,PROCESS,ENV:=COPY(REF(AT4,PROCESS))); 00482000
|
|
ASGN(TREE,ENV,CONS(VAL,REF(TREE,ENV))); 00483000
|
|
ASGN(STR,ENV,REF(STR,REF(AT4,VAL))); 00484000
|
|
ASGN(N,ENV,REF(N,ENV)+1); EXIT; 00485000
|
|
00486000
|
|
BNFNONTERMVAL: %(ARG,PROCESS) 00487000
|
|
IF CAR(ARG) NEQ CODE(118) THEN PRIMERROR("BNF ",ARG); 00488000
|
|
X:=NULLIST;ENV:=REF(AT4,PROCESS); 00489000
|
|
ARGLIST:=CDR(ARG); 00490000
|
|
WHILE ARGLIST NEQ NULLIST DO 00491000
|
|
IF LOOK1(CAR(CAR(ARGLIST)),CAR(REF(STR,ENV))) THEN 00492000
|
|
BEGIN ENV:=COPY(ENV); 00493000
|
|
ASGN(TREE,ENV,NULLIST); 00493010
|
|
ASGN(N,ENV,AT0); 00494000
|
|
X:=CONS(CREATE(CAR(ARGLIST),ENV,CODE(1005),PROCESS),X); 00495000
|
|
ARGLIST:=CDR(ARGLIST) END ELSE ARGLIST:=CDR(ARGLIST) ; 00496000
|
|
GO TO WAITRETURN; 00497000
|
|
WAITRETURN: %(X) 00498000
|
|
WHILE X NEQ NULLIST DO 00499000
|
|
BEGIN RESUME(CAR(X)); X:=CDR(X) END; 00500000
|
|
GO TO INT1; 00501000
|
|
PRIMVAL: %(OP,ARGLIST,PROCESS)=ARG 00502000
|
|
CASE ROUTINE.ADDR-100 OF BEGIN 00503000
|
|
IF ATOM(CAR(ARGLIST)) THEN % ASGN=CODE 100 00504000
|
|
BEGIN STACK(CAR(ARGLIST)); ARGLIST:=CDR(ARGLIST); 00505000
|
|
LV(41);R41:ASGN(UNSTACK,GET1,ARG:=GET) END ELSE 00506000
|
|
BEGIN LV(11);R11:ASGN(GET1,GET,(ARG:=GET))END; %ASGN=CODE100 00507000
|
|
IF ATOM(CAR(ARGLIST)) THEN % REF=CODE 101 00508000
|
|
BEGIN STACK(CAR(ARGLIST));ARGLIST:=CDR(ARGLIST); 00509000
|
|
LV(42);R42:ARG:=REF(UNSTACK,GET1) END ELSE 00510000
|
|
BEGIN LV(12);R12:ARG:=REF(GET1,GET)END; %REF=CODE101 00511000
|
|
BEGIN LV(13);R13:ARG:=CAR(GET1)END; %CAR=CODE 102 00512000
|
|
BEGIN LV(14);R14:ARG:=CDR(GET1)END; %CDR=CODE103 00513000
|
|
BEGIN LV(15);R15:ARG:=CONS(GET1,GET)END; %CONS=CODE 104 00514000
|
|
BEGIN LV(16);R16:ARG:=NEWSYMB(GET1)END; %NEWSYMB 00515000
|
|
ARG:=AMTSPACE; %AMTSPACE 00516000
|
|
BEGIN LV(17);R17:ARG:=PMAKE(GET1.TYPE,GET)END; %MAKE 00517000
|
|
BEGIN LV(18);R18:PRINT((ARG:=GET1))END; %PRINT 00518000
|
|
BEGIN LV(19);R19:ARG:=INLEX(GET1)END; %INLEX 00519000
|
|
BEGIN SUSPEND(PROCESS);RESUME(PROCESS);GCL; 00520000
|
|
PROCESS:=UQ;ARG:=AMTSPACE END; % GCL 00521000
|
|
BEGIN LV(20);R20:ARG:=CREATE(GET1,GET,GET,GET)END; %CREATE 00522000
|
|
BEGIN LV(21);R21: DELETE(GET1);ARG:=ATOMUNDEF END;%DELETE 00522010
|
|
BEGIN LV(22);R22: ARG:=GET1;SUSPEND(ARG)END; %SUSPEND 00523000
|
|
BEGIN LV(23);R23:RESUME((ARG:=GET1))END; %RESUME 00524000
|
|
BEGIN LV(24);R24:RETURN(GET1,(ARG:=GET))END; %RETURN=CODE115 00525000
|
|
BEGIN LV(25);R25:ARG:=GET1 END; %IDENTITY=CODE116 00526000
|
|
BEGIN SUSPEND(PROCESS);SMEM("RERUN1") ; GO TO LEND END;%HALT = CODE 1100527000
|
|
PRIMERROR("C118",PROCESS);%RESERVED FOR CODE118 00528000
|
|
PRIMERROR("C119",PROCESS);%RESERVED FOR CODE119 00529000
|
|
BEGIN LV(33);R33:ASGN(TOKEN(1009),REF(AT4,PROCESS), 00530000
|
|
(ARG:=GET))END; % TRACE=CODE120 00531000
|
|
BEGIN LV(26);R26:EQLIST(GET1,(ARG:=GET))END; %EQLIST 00532000
|
|
ARG:=CAR(ARGLIST); %QUOTE=CODE122 00533000
|
|
IF ATOM(CAR(ARGLIST)) THEN % ASGNENV=CODE 123 00534000
|
|
BEGIN STACK(CAR(ARGLIST)); ARGLIST:=CDR(ARGLIST); 00535000
|
|
LV(43);R43:ASGN(UNSTACK,REF(AT4,PROCESS),(ARG:=GET1)) END ELSE 00536000
|
|
BEGIN LV(28);R28:ASGN(GET1,REF(AT4,PROCESS),(ARG:=GET))END;%ASGNENV=CODE00537000
|
|
IF ATOM(CAR(ARGLIST)) THEN %REFENV=CODE 124 00538000
|
|
BEGIN STACK(CAR(ARGLIST)); ARGLIST:=CDR(ARGLIST); 00539000
|
|
LV(44);R44:ARG:=REF(UNSTACK,REF(AT4,PROCESS)) END ELSE 00540000
|
|
BEGIN LV(29);R29:ARG:=REF(GET1,REF(AT4,PROCESS))END; %REFENV=CODE124 00541000
|
|
BEGIN LV(30);R30:ARG:=GET1;GO TO ARGVAL END; %EXE=CODE125 00542000
|
|
DEBUG; %DEBUG=CODE126 00543000
|
|
BEGIN LV(49);R49:ARG:=LOADMODE(GET1,GET) END; %LDMODE=127 00544000
|
|
ARG:=PMAKE(TYPECONS,0); %CONSTRUCT=CODE128 00545000
|
|
BEGIN LV(31);R31:ARG:=PMAKE(TYPEAREA,GET1)END; 00546000
|
|
%AREA = CODE129 00547000
|
|
BEGIN LV(48);R48:ARG:=TOKEN(GET1.ADDR) END;%TOKEN=CODE 130 00548000
|
|
BEGIN LV(32);R32:ASGN(TOKEN(1008),REF(AT4,PROCESS), 00549000
|
|
(ARG:=GET1))END; % SINGLESTEP=CODE131 00550000
|
|
BEGIN ASGN(AT1,PROCESS,REF(AT1,PROCESS)+1); 00551000
|
|
ARG:=ATOMUNDEF END; %UP=CODE132 00552000
|
|
BEGIN ASGN(AT1,PROCESS,REF(AT1,PROCESS)-1); 00553000
|
|
ARG:=ATOMUNDEF END; %DP=CODE133 00554000
|
|
;%BEGIN LV(34);R34:UREAD((ARG:=GET1))END; %READ=CODE134 00555000
|
|
;% RESERVED FOR CODE 135 00556000
|
|
GO TO LISTVAL; % LIST=CODE 136 00557000
|
|
BEGIN STACK(CDR(ARGLIST)); ARG:=CAR(ARGLIST); %COND=CODE 137 00558000
|
|
STACK(TOKEN(36));GO TO ARGVAL;R36:ARGLIST:=UNSTACK; 00559000
|
|
IF ARG.TYPE=TYPELOGIC THEN 00560000
|
|
BEGIN ARG:=(IF BOOLEAN(ARG) THEN CAR(ARGLIST) ELSE REF(AT2,ARGLIST)); 00561000
|
|
GO TO ARGVAL END ELSE ARG:=ATOMUNDEF END; 00562000
|
|
BEGIN LV(37);R37:ARG:=(IF EQ(GET1,GET) THEN AT(524287) 00563000
|
|
ELSE AT0) END; % EQ=CODE 138 00564000
|
|
BEGIN LV(38);R38:ARG:=GET1; % ATOM=CODE 139 00565000
|
|
ARG:=(IF ATOM(ARG) THEN AT(524287) ELSE AT0) END; 00566000
|
|
BEGIN PROCESS:=CREATE(ARGLIST,REF(AT4,PROCESS),REF(AT5, 00567000
|
|
PROCESS),PROCESS); 00568000
|
|
GO TO R29 END ; % BLOCKOP=CODE 140 00569000
|
|
BEGIN LV(40);R40:ARG:=(IF EQ(GET1,GET) THEN AT0 00570000
|
|
ELSE AT(524287)) END; % NEG=CODE 141 00571000
|
|
BEGIN STACK(CAR(CDR(ARGLIST))); ARG:=CAR(ARGLIST);%IF=CODE 142 00572000
|
|
STACK(TOKEN(45));GO TO ARGVAL;R45:ARGLIST:=UNSTACK; 00573000
|
|
IF BOOLEAN(ARG) THEN ASGN(AT3,PROCESS,ARGLIST) END; 00574000
|
|
BEGIN ENV:=REF(AT4,PROCESS);%NONTERM=CODE143 00575000
|
|
ASGN(STR,ENV,AT0); 00576000
|
|
BNFL3:IF (ARG:=REF(N,ENV)).ADDR GTR 0 THEN 00577000
|
|
BEGIN ASGN(N,ENV,ARG-1);ASGN(STR,ENV,REF(STR,ENV)+1); 00577050
|
|
ASGN(AT6,ARG:=REF(ARG,REF(TREE,ENV)),PROCESS); 00578000
|
|
STACK(CODE(46));RESUME(ARG); 00579000
|
|
GO TO INT1;R46: 00579050
|
|
ENV:=REF(AT4,PROCESS); 00580000
|
|
ASGN(REF(STR,ENV),ENV,ARG);GO TO BNFL3 END; 00581000
|
|
ARG:=REF(AT1,ENV); 00582000
|
|
ASGN(TREE,ENV,ATOMUNDEF); 00583000
|
|
ASGN(STR,ENV,ATOMUNDEF); 00583050
|
|
ASGN(N,ENV,ATOMUNDEF) END NONTERM; 00584000
|
|
BEGIN LV(47);R47:ARG:=USERL(GET1) END;%USERL=CODE 144 00585000
|
|
ARG:=LABTAB; %LTAB=CODE 145 00586000
|
|
BEGIN LV(50);R50:ARG:=COPY(GET1) END; %COPY=CODE 146 00586010
|
|
BEGIN LV(51);R51:ARG:=AR(0,GET1,GET) END; %ADD=CODE 147 00586020
|
|
BEGIN LV(52);R52:ARG:=AR(1,GET1,GET) END; %SUB=CODE 148 00586030
|
|
BEGIN LV(53);R53:ARG:=AR(2,GET1,GET) END; %MUL=CODE 149 00586035
|
|
BEGIN LV(54);R54:ARG:=AR(3,GET1,GET) END; %DIV=CODE 150 00586040
|
|
BEGIN LV(55);R55:ARG:=AR(4,GET1,GET) END; %EX=CODE 151 00586045
|
|
BEGIN LV(56);R56:ARG:=AR(2,GET1,AD(-1)) END; %NEG=CODE 152 00586050
|
|
BEGIN LV(57);R57:ARG:=IF LOOK1(GET1,GET) THEN AT(524287) 00586055
|
|
ELSE AT0 END % LOOK1=CODE 153 00586060
|
|
END CASE STATEMENT; 00586070
|
|
EXIT; 00586080
|
|
L1:ASGN(AT7,PROCESS,SAV);DOTRACE(PROCESS); 00587000
|
|
R10:R35:R34: % THESE ARE TO BE LATER MOVED 00588000
|
|
LEND:XX1:=PROCESS; END INTERP; 00589000
|
|
PROCEDURE GARBAGECOLLECT(QMEM,N); 00590000
|
|
VALUE N;ARRAY QMEM[0];REAL N; 00591000
|
|
BEGIN REAL RP,WP,X,XADDR,BASE,TYP,I; 00592000
|
|
LABEL L1,L2,L3,L4,L5,L6; 00593000
|
|
ARRAY TMEM[0:MEMORYROWS,0:511]; 00594000
|
|
DEFINE CP(CP1,CP2)=%CONSTRUCT PROCESSING 00595000
|
|
BEGIN IF (X:=M[XADDR]).TYPE NEQ TYPEGARBAGE THEN 00596000
|
|
BEGIN TMASGN((WP:=WP+1),X); 00597000
|
|
MASGN(XADDR,MAKE(TYPEGARBAGE,WP)); 00598000
|
|
CP1(RP,MAKE(XADDR.TYPE,WP),CP2)END ELSE 00599000
|
|
CP1(RP,MAKE(XADDR.TYPE,X),CP2)END#; 00600000
|
|
DEFINE LP(LP1,LP2)= 00601000
|
|
BEGIN IF (X:=CAR(XADDR)).TYPE = TYPEGARBAGE THEN 00602000
|
|
LP1(RP,MAKE(TYPELIST,X),LP2)ELSE 00603000
|
|
IF CARADDR=NULLIST THEN LP1(RP,NULLIST,LP2)ELSE 00604000
|
|
BEGIN LP1(RP,MAKE(TYPELIST,(WP:=WP+1)),LP2)#, 00605000
|
|
LLP(LLP1)=TMASGN(WP,X); 00606000
|
|
MASGN(CARADDR,MAKE(TYPEGARBAGE,WP)); 00607000
|
|
XADDR:=CDR(XADDR); 00608000
|
|
IF (X:=CAR(XADDR)).TYPE NEQ TYPEGARBAGE THEN 00609000
|
|
IF CARADDR NEQ NULLIST THEN 00610000
|
|
BEGIN WP:=WP+1;GO TO LLP1 END ELSE 00611000
|
|
TMASGN((WP:=WP+1),LINKTONIL)ELSE 00612000
|
|
TMASGN((WP:=WP+1),MAKE(TYPELINK,X))END END #; 00613000
|
|
DEFINE TM[TM1]=(IF BOOLEAN(TM1) THEN 00614000
|
|
TMEM[(TM1).[18:9],(TM1).[9:9]].[22:23]ELSE 00615000
|
|
TMEM[(TM1).[18:9],(TM1).[9:9]].[45:23])#, 00616000
|
|
Q[Q1]=(IF BOOLEAN(Q1) THEN QMEM[Q1.[10:10]].[22:23] ELSE 00617000
|
|
QMEM[Q1.[10:10]].[45:23])#, 00618000
|
|
TMASGN(TMASGN1,TMASGN2)=TA(TMASGN1,TMASGN2,TMEM)#, 00619000
|
|
QASGN(QASGN1,QASGN2)=QA(QASGN1,QASGN2,QMEM)#; 00620000
|
|
PROCEDURE TA(A,V,M);VALUE A,V;REAL A,V;ARRAY M[0,0]; 00621000
|
|
IF BOOLEAN(A) THEN M[A.[18:9],A.[9:9]].[22:23]:=V ELSE 00622000
|
|
M[A.[18:9],A.[9:9]].[45:23]:=V; 00623000
|
|
PROCEDURE QA(A,V,M);VALUE A,V;REAL A,V;ARRAY M[0]; 00624000
|
|
IF BOOLEAN(A) THEN M[A.[10:10]].[22:23]:=V ELSE 00625000
|
|
M[A.[10:10]].[45:23]:=V; 00626000
|
|
FORMAT F1("GCL:",I6," WORDS RECOVERED.",I6," WORDS IN USE."); 00627000
|
|
WP:=0; 00628000
|
|
% COPY FROM M TO TM UPSIDE DOWN USING Q 00629000
|
|
FOR RP:=N+N+1 STEP -1 UNTIL 0 DO 00630000
|
|
CASE (XADDR:=Q[RP]).TYPE OF 00631000
|
|
BEGIN PRIMERROR("GCL1",XADDR);%GARBAGE 00632000
|
|
L1:CP(QA,QMEM); %CONSTRUCT 00633000
|
|
LP(QA,QMEM);L2:LLP(L2);%LIST 00634000
|
|
L5:IF (X:=M[XADDR]).TYPE=TYPEGARBAGE THEN %AREA 00635000
|
|
QASGN(RP,MAKE(XADDR.TYPE,X))ELSE 00636000
|
|
BEGIN WP:=WP+1; 00637000
|
|
FOR I:=X.ADDR STEP -1 UNTIL 0 DO 00638000
|
|
TMASGN(WP+I,M[XADDR-I]); 00639000
|
|
QASGN(RP,MAKE(XADDR.TYPE,WP)); 00640000
|
|
MASGN(XADDR,MAKE(TYPEGARBAGE,WP)); 00641000
|
|
WP:=WP+X.ADDR END; 00642000
|
|
PRIMERROR("GCL2",XADDR); %FIELD 00643000
|
|
IF XADDR NEQ ATOMUNDEF THEN GO TO L1; %SYMBOL 00644000
|
|
; %LOGIC 00645000
|
|
PRIMERROR("GCL3",XADDR); %LINK 00646000
|
|
GO TO L5; %PROCESS 00647000
|
|
GO TO L5; %MONITOR 00648000
|
|
GO TO L5; %GENERAL 00649000
|
|
; %TOKEN 00650000
|
|
PRIMERROR("GCL4",XADDR); %TP12 00651000
|
|
PRIMERROR("GCL5",XADDR); %TP13 00652000
|
|
PRIMERROR("GCL6",XADDR); %TP14 00653000
|
|
PRIMERROR("GCL7",XADDR); %TP15 00654000
|
|
END CASE STATEMENT; 00655000
|
|
%COPY FROM M TO TM UPSIDE DOWN USING TM 00656000
|
|
FOR RP:=1 STEP 1 UNTIL WP DO 00657000
|
|
CASE (XADDR:=TM[RP]).TYPE OF BEGIN 00658000
|
|
PRIMERROR("GCL8",XADDR); %GARBAGE 00659000
|
|
L3:CP(TA,TMEM); %CONSTRUCT 00660000
|
|
LP(TA,TMEM);L4:LLP(L4);%LIST 00661000
|
|
L6:IF (X:=M[XADDR]).TYPE=TYPEGARBAGE THEN %AREA 00662000
|
|
TMASGN(RP,MAKE(XADDR.TYPE,X))ELSE 00663000
|
|
BEGIN WP:=WP+1; 00664000
|
|
FOR I:=X.ADDR STEP -1 UNTIL 0 DO 00665000
|
|
TMASGN(WP+I,M[XADDR-I]); 00666000
|
|
TMASGN(RP,MAKE(XADDR.TYPE,WP)); 00667000
|
|
MASGN(XADDR,MAKE(TYPEGARBAGE,WP)); 00668000
|
|
WP:=WP+X.ADDR END; 00669000
|
|
PRIMERROR("GCL9",XADDR); %FIELD 00670000
|
|
IF XADDR NEQ ATOMUNDEF THEN GO TO L3; %SYMBOL 00671000
|
|
; %LOGIC 00672000
|
|
; %LINK 00673000
|
|
GO TO L6; %PROCESS 00674000
|
|
GO TO L6; %MONITOR 00675000
|
|
GO TO L6; %GENERAL 00676000
|
|
; %TOKEN 00677000
|
|
END CASE STATEMENT; 00678000
|
|
% COPY FROM TM TO M AND INVERT 00679000
|
|
BASE:=WP+1; 00680000
|
|
LASTUSEDSPACE:=0; 00681000
|
|
FOR RP:=WP STEP -1 UNTIL 1 DO 00682000
|
|
BEGIN X:=TM[RP]; 00683000
|
|
IF (TYP:=X.TYPE) NEQ TYPELOGIC THEN 00684000
|
|
IF TYP NEQ TYPECODE THEN 00685000
|
|
IF X.ADDR NEQ 524287 THEN 00686000
|
|
X:=MAKE(TYP,BASE-X.ADDR); 00687000
|
|
MASGN(STEPSPACE,X) END; 00688000
|
|
% FIX ADDRESSES IN Q 00689000
|
|
FOR RP:=N+N+1 STEP -1 UNTIL 0 DO 00690000
|
|
IF (TYP:=Q[RP].TYPE) NEQ TYPELOGIC THEN 00691000
|
|
IF TYP NEQ TYPECODE THEN 00692000
|
|
IF Q[RP].ADDR NEQ 524287 THEN 00693000
|
|
QASGN(RP,MAKE(TYP,BASE-Q[RP].ADDR)); 00694000
|
|
WRITE(DATA,F1,AMTSPACE,LASTUSEDSPACE); 00695000
|
|
END GARBAGE COLLECT; 00696000
|
|
REAL PROCEDURE COPY(X);VALUE X;REAL X; 00697000
|
|
BEGIN LABEL L1,L2;REAL I; 00698000
|
|
CASE X.TYPE OF BEGIN 00699000
|
|
L1:PRIMERROR("COPY",X); %GARBAGE 00700000
|
|
MASGN((COPY:=PMAKE(X.TYPE,0)),COPY(M[X]));%CONSTRUCT 00701000
|
|
COPY:=(IF X=NULLIST THEN NULLIST ELSE CONS(CAR(X),COPY(CDR 00702000
|
|
(X)))); %LIST 00703000
|
|
L2:BEGIN FOR I:=M[X].ADDR STEP -1 UNTIL 0 DO %AREA 00704000
|
|
MASGN(STEPSPACE, M[X-I]); 00705000
|
|
COPY:=MAKE(X.TYPE,LASTUSEDSPACE)END; 00706000
|
|
GO TO L1; %FIELD 00707000
|
|
COPY:=X; %SYMBOL 00708000
|
|
COPY:=X; %LOGIC 00709000
|
|
GO TO L1; %LINK 00710000
|
|
GO TO L2; %PROCESS 00711000
|
|
GO TO L2; %MONITOR 00712000
|
|
GO TO L2; %GENERAL 00713000
|
|
COPY:=X; %TOKEN 00714000
|
|
END CASE STATEMENT; 00715000
|
|
END COPY; 00716000
|
|
BOOLEAN PROCEDURE EQ(X,Y);VALUE X,Y; REAL X,Y; 00717000
|
|
IF X=Y THEN EQ:=TRUE ELSE 00718000
|
|
IF X.TYPE NEQ Y.TYPE THEN EQ:= FALSE ELSE 00719000
|
|
IF X.TYPE NEQ TYPELIST THEN EQ := FALSE ELSE 00720000
|
|
BEGIN X:=CAR(X); X:=CARADDR; 00721000
|
|
Y:=CAR(Y);EQ:=X=CARADDR 00722000
|
|
END OF EQ; 00723000
|
|
REAL PROCEDURE CAR(Y);VALUE Y;REAL Y; 00724000
|
|
BEGIN LABEL L1,L2; 00725000
|
|
IF Y.TYPE NEQ TYPELIST THEN 00726000
|
|
IF Y.TYPE NEQ TYPELINK THEN PRIMERROR("CAR ",Y); 00727000
|
|
IF Y=NULLIST THEN GO TO L2; 00728000
|
|
L1:CARADDR:=Y; 00729000
|
|
IF (Y:=M[Y]).TYPE=TYPELINK THEN 00730000
|
|
IF Y NEQ LINKTONIL THEN GO TO L1 ELSE 00731000
|
|
L2:BEGIN CAR:=ATOMUNDEF; 00732000
|
|
CARADDR:=NULLIST END ELSE 00733000
|
|
CAR:=Y END CAR; 00734000
|
|
REAL PROCEDURE CDR(Y);VALUE Y;REAL Y; 00735000
|
|
BEGIN Y:=CAR(Y); 00736000
|
|
IF CARADDR NEQ NULLIST THEN Y:=CAR(MAKE(TYPELIST,DEC(CARADDR))); 00737000
|
|
CDR:=MAKE(TYPELIST,CARADDR); 00738000
|
|
END CDR; 00739000
|
|
PROCEDURE EQLIST(X,Y);VALUE X,Y;REAL X,Y; 00740000
|
|
BEGIN REAL T1,T2;LABEL LEND; 00741000
|
|
T1:=CAR(Y);T1:=CARADDR;T2:=CAR(X); 00742000
|
|
IF T1=CARADDR THEN GO TO LEND; 00743000
|
|
IF CARADDR=NULLIST THEN PRIMERROR("EQL2",X); 00744000
|
|
MASGN(X,MAKE(TYPELINK,T1)); 00745000
|
|
LEND:END EQLIST; 00746000
|
|
REAL PROCEDURE CONS(X,Y);VALUE X,Y;REAL X,Y; 00747000
|
|
BEGIN IF Y.TYPE NEQ TYPELIST THEN PRIMERROR("CONS",Y); 00748000
|
|
IF Y.ADDR NEQ LASTUSEDSPACE THEN MASGN(STEPSPACE,MAKE(TYPELINK,Y)); 00749000
|
|
MASGN(STEPSPACE,X); 00750000
|
|
CONS:=MAKE(TYPELIST,LASTUSEDSPACE)END CONS; 00751000
|
|
REAL PROCEDURE REF(X,Y);VALUE X,Y;REAL X,Y; 00752000
|
|
BEGIN LABEL L1,L2,L3,L4;REAL T1,T2; 00753000
|
|
CASE Y.TYPE OF 00754000
|
|
BEGIN PRIMERROR("REF1",Y);%GARBAGE 00755000
|
|
L1:BEGIN T1:=M[Y];%CONSTRUCT 00756000
|
|
L2:IF CAR(T1) NEQ ATOMUNDEF THEN 00757000
|
|
IF CAR(T1) NEQ X THEN 00758000
|
|
BEGIN T1:=CDR(T1)-1;GO TO L2 END ELSE 00759000
|
|
REF:=CAR(CDR(T1))ELSE 00760000
|
|
REF:=ATOMUNDEF END; 00761000
|
|
IF X=ATOMCAR THEN REF:=CAR(Y) ELSE%LIST 00762000
|
|
IF X=ATOMCDR THEN REF:=CDR(Y) ELSE 00763000
|
|
IF X.TYPE NEQ TYPELOGIC THEN REF:=ATOMUNDEF ELSE 00764000
|
|
BEGIN FOR X:=X.ADDR STEP -1 UNTIL 2 DO Y:=CDR(Y); 00765000
|
|
REF:=CAR(Y) END; 00766000
|
|
L3:BEGIN IF X.TYPE=TYPELOGIC THEN %AREA 00767000
|
|
IF X.ADDR LEQ M[Y].ADDR THEN 00768000
|
|
BEGIN REF:=M[Y-X.ADDR];GO TO L4 END; 00769000
|
|
REF:=ATOMUNDEF; 00770000
|
|
L4:END; 00771000
|
|
PRIMERROR("REF4",Y);%FIELD 00772000
|
|
IF X=ATOMASSO THEN %SYMBOL 00773000
|
|
REF:=(IF Y=ATOMUNDEF THEN Y ELSE M[Y])ELSE 00774000
|
|
PRIMERROR("REF5",Y); 00775000
|
|
PRIMERROR("REF6",Y);%LOGIC 00776000
|
|
PRIMERROR("REF7",Y);%LINK 00777000
|
|
GO TO L3; %PROCESS 00778000
|
|
GO TO L3;%MONITOR 00779000
|
|
PRIMERROR("REF8",Y);%GENERAL 00780000
|
|
PRIMERROR("REF9",Y);%CODE 00781000
|
|
END CASE STATEMENT; 00782000
|
|
END REF; 00783000
|
|
PROCEDURE ASGN(X,Y,Z);VALUE X,Y,Z;REAL X,Y,Z; 00784000
|
|
BEGIN LABEL L1,L2,L3;REAL T1,T2; 00785000
|
|
CASE Y.TYPE OF 00786000
|
|
BEGIN PRIMERROR("ASG1",Y);%GARBAGE 00787000
|
|
L1:BEGIN T1:=M[Y];%CONSTRUCT 00788000
|
|
IF X=ATOMUNDEF THEN PRIMERROR("ASGD",Y); 00789000
|
|
L2:IF CAR(T1) NEQ ATOMUNDEF THEN 00790000
|
|
IF CAR(T1) NEQ X THEN 00791000
|
|
BEGIN T1:=DEC(CDR(T1));GO TO L2 END ELSE 00792000
|
|
IF Z NEQ ATOMUNDEF THEN 00793000
|
|
MASGN(CDR(T1),Z) ELSE 00794000
|
|
IF T1=M[Y] THEN MASGN(Y,CDR(CDR(T1)))ELSE 00795000
|
|
MASGN(T1,MAKE(TYPELINK,CDR(CDR(T1))))ELSE 00796000
|
|
IF Z NEQ ATOMUNDEF THEN MASGN(Y,CONS(X,CONS(Z,M[Y])))END; 00797000
|
|
BEGIN T1:=CAR(Y);%LIST 00798000
|
|
IF CARADDR=NULLIST THEN PRIMERROR("ASG0",Y); 00799000
|
|
IF X=ATOMCAR THEN MASGN(CARADDR,Z)ELSE 00800000
|
|
IF X=ATOMCDR THEN 00801000
|
|
IF Z.TYPE NEQ TYPELIST THEN PRIMERROR("ASGC",Z)ELSE 00802000
|
|
MASGN(CARADDR,MAKE(TYPELINK,CONS(M[CARADDR],Z)))ELSE 00803000
|
|
IF X.TYPE NEQ TYPELOGIC THEN PRIMERROR("ASG2",X ) ELSE 00804000
|
|
BEGIN T1:=CARADDR; 00805000
|
|
FOR X:=X.ADDR STEP -1 UNTIL 2 DO 00806000
|
|
BEGIN IF (Y:=CDR(Y))=NULLIST THEN MASGN(T1-1,(Y:=MAKE(TYPELINK, 00807000
|
|
CONS(ATOMUNDEF,NULLIST)))); 00808000
|
|
T1:=Y END; 00809000
|
|
MASGN(Y,Z) END END; 00810000
|
|
L3:BEGIN IF X.TYPE NEQ TYPELOGIC THEN PRIMERROR("ASG3",X);%AREA 00811000
|
|
IF (X:=X.ADDR) GTR M[Y].ADDR THEN PRIMERROR("ASGA",Y); 00812000
|
|
IF X=0 THEN 00813000
|
|
IF X.TYPE NEQ TYPELOGIC OR X GTR M[Y] THEN PRIMERROR("ASGB",Z); 00814000
|
|
MASGN(Y-X,Z)END; 00815000
|
|
PRIMERROR("ASG4",Y);%FIELD 00816000
|
|
IF X=ATOMASSO AND Y NEQ ATOMUNDEF THEN MASGN(Y,Z)ELSE%SYMBOL 00817000
|
|
PRIMERROR("ASG5",Y); 00818000
|
|
PRIMERROR("ASG6",Y);%LOGIC 00819000
|
|
PRIMERROR("ASG7",Y);%LINK 00820000
|
|
GO TO L3; %PROCESS 00821000
|
|
GO TO L3;%MONITOR 00822000
|
|
PRIMERROR("ASG8",Y);%GENERAL 00823000
|
|
PRIMERROR("ASG9",Y);%CODE 00824000
|
|
END CASE STATEMENT; 00825000
|
|
END ASGN; 00826000
|
|
REAL PROCEDURE PMAKE(T,N);VALUE T,N;REAL T,N; 00827000
|
|
BEGIN LABEL L1,L2,L3; REAL I; 00828000
|
|
CASE T OF BEGIN 00829000
|
|
L1:PRIMERROR("MK1 ",T); %GARBAGE 00830000
|
|
L2:BEGIN MASGN(STEPSPACE,NULLIST); %CONSTRUCT 00831000
|
|
PMAKE:=MAKE(T,LASTUSEDSPACE)END; 00832000
|
|
PMAKE:= NULLIST; %LIST 00833000
|
|
L3:IF N.TYPE NEQ TYPELOGIC THEN PRIMERROR("MK2 ",N)ELSE%AREA 00834000
|
|
BEGIN FOR I:=N.ADDR STEP -1 UNTIL 1 DO 00835000
|
|
MASGN(STEPSPACE,ATOMUNDEF); 00836000
|
|
MASGN(STEPSPACE,N); 00837000
|
|
PMAKE:=MAKE(T,LASTUSEDSPACE)END; 00838000
|
|
GO TO L1; %FIELD 00839000
|
|
PMAKE:=NEWSYMB(N); %SYMBOL 00840000
|
|
PMAKE:=AT0; %LOGIC 00841000
|
|
GO TO L1; %LINK 00842000
|
|
GO TO L3; %PROCESS 00843000
|
|
GO TO L3; %MONITOR 00844000
|
|
GO TO L3;%GENERAL 00845000
|
|
PMAKE:=NEXTTOKEN:=NEXTTOKEN+1; %TOKEN 00846000
|
|
END CASE STATEMENT; 00847000
|
|
END PMAKE; 00848000
|
|
REAL PROCEDURE NEWSYMB(ASSO);VALUE ASSO;REAL ASSO; 00849000
|
|
BEGIN MASGN(STEPSPACE,ASSO); 00850000
|
|
NEWSYMB:=MAKE(TYPESYMB,LASTUSEDSPACE)END NEWSYMB; 00851000
|
|
REAL PROCEDURE CHAR(P,N); 00852000
|
|
POINTER P; INTEGER N; 00853000
|
|
BEGIN REAL ARRAY X[0:0]; 00854000
|
|
X[0]:=0; 00855000
|
|
IF N LSS 8 AND N GTR 0 THEN 00856000
|
|
REPLACE POINTER(X)+(8-N) BY P FOR N; 00857000
|
|
CHAR:=X[0] END; % END OF CHAR 00858000
|
|
REAL PROCEDURE HANGON (X,Y); 00859000
|
|
VALUE X,Y; REAL X,Y; 00860000
|
|
BEGIN LABEL L1,L2; 00861000
|
|
POINTER P;REAL ARRAY XD[0:0],X1[0:0];REAL Z 00862000
|
|
; 00863000
|
|
P:=POINTER(STACK[STACKPOSITION.[18:7],*])+STACKPOSITION.[11:12]; 00864000
|
|
X1[0]:=1;Z:=NULLIST; 00865000
|
|
WHILE Y NEQ NULLIST DO 00866000
|
|
BEGIN Z:=CONS(CAR(Y),Z);Y:=CDR(Y)END; 00867000
|
|
WHILE Z NEQ NULLIST DO 00868000
|
|
BEGIN 00869000
|
|
XD[0]:=CAR(Z); 00870000
|
|
REPLACE P:=P+1 BY POINTER(XD)+7 FOR 1; 00871000
|
|
X1[0]:=X1[0]+1; 00872000
|
|
Z:=CDR(Z) END; 00873000
|
|
REPLACE POINTER(STACK[STACKPOSITION.[18:7],*])+ 00874000
|
|
STACKPOSITION.[11:12] BY POINTER(X1)+7 FOR 1; 00875000
|
|
IF X1[0] EQL 2 THEN BEGIN 00876000
|
|
X1[0]:=LOADMODE(XD[0],X1[0]).ADDR; 00877000
|
|
IF X1[0] EQL 2 OR X1[0] EQL 66 THEN BEGIN 00878000
|
|
HANGON:=TOKEN(XD[0].ADDR+512);X1[0]:=LOADMODE(XD[0],X1[0]); 00879000
|
|
GO TO L2 END; 00880000
|
|
X1[0]:=LOADMODE(XD[0],X1[0]) END; 00881000
|
|
HANGON:=LEXFIND; 00882000
|
|
L2:END OF HANGON; 00883000
|
|
REAL PROCEDURE IL(M,C,CM,F); 00884000
|
|
INTEGER M; REAL C,CM,F; 00885000
|
|
BEGIN % PROCEDURE BLOCK; 00886000
|
|
DEFINE N=72#, NCPW=8#; 00887000
|
|
DEFINE FILIN=DATA#, 00888000
|
|
LAST="$"#; 00889000
|
|
DEFINE TOTCHAR = 64#; 00890000
|
|
DEFINE X=LEXTREE#; 00891000
|
|
BEGIN % OWN BLOCK; 00892000
|
|
OWN ALPHA ARRAY D[0:N DIV NCPW]; 00893000
|
|
OWN REAL ARRAY MODE [0:TOTCHAR]; 00894000
|
|
OWN INTEGER COUNT; 00895000
|
|
OWN POINTER P; 00896000
|
|
OWN REAL ARRAY SS[0:63]; 00897000
|
|
CASE M OF BEGIN 00898000
|
|
BEGIN INTEGER I; % M IS 0; 00898050
|
|
I:=0; 00899000
|
|
WHILE I LEQ 9 DO 00900000
|
|
BEGIN MODE[I]:=1;I:=I+1 END; 00901000
|
|
WHILE I LEQ 63 DO 00902000
|
|
BEGIN MODE[I]:=0; I:=I+1 END; 00903000
|
|
MODE[" "] := 3; 00904000
|
|
MODE[I]:=68; 00905000
|
|
FILL SS[*] WITH ".","[","(","&","$","*",")",";", 00906000
|
|
""","/",",","%","=","]",""","#","@",":","+","?","|" ; 00907000
|
|
FOR I:=0 STEP 1 UNTIL 20 DO MODE[SS[I]]:=2 ; 00907050
|
|
COUNT:=0 END ; % E0 M0 00907060
|
|
BEGIN % M IS 1; 00907080
|
|
LABEL L1,L2,L3,L4,L5,L6; 00908000
|
|
INTEGER I,J,IE;REAL IL1; 00909000
|
|
BOOLEAN EOL,IE1; 00910000
|
|
REAL E; 00911000
|
|
REAL Y; 00912000
|
|
I:=0; 00913000
|
|
L4: IF COUNT EQL 0 THEN 00914000
|
|
BEGIN 00915000
|
|
UREAD(F,D[*]); 00916000
|
|
P:=POINTER(D); 00917000
|
|
GO TO L6; 00918000
|
|
END 00919000
|
|
ELSE IF COUNT EQL N 00920000
|
|
THEN BEGIN 00921000
|
|
E:=MAKE(TYPELOGIC,LAST); 00922000
|
|
J:=MODE[TOTCHAR].[5:6]; 00923000
|
|
EOL:=TRUE END 00924000
|
|
ELSE L6:BEGIN 00925000
|
|
E:=MAKE(TYPELOGIC,CHAR(P,1)); 00926000
|
|
J:=MODE[CHAR(P,1)];P:=P+1; 00927000
|
|
EOL:=BOOLEAN(J.[6:1]); 00928000
|
|
J:=J.[5:6] END; 00929000
|
|
L5: CASE J OF BEGIN 00930000
|
|
BEGIN % -J IS 0; 00931000
|
|
CASE I OF BEGIN 00932000
|
|
BEGIN % I IS 0; 00933000
|
|
Y:=CONS(E,NULLIST); 00934000
|
|
I:=1; 00935000
|
|
GO TO L1 END; % E0 I0 00936000
|
|
BEGIN % I IS 1; 00937000
|
|
Y:=CONS(E,Y); 00938000
|
|
GO TO L1 END; % E0 I1; 00939000
|
|
BEGIN %I IS 2 00940000
|
|
J:=2;GO TO L5 END % E0 I2 00941000
|
|
END % CASE OF I; 00942000
|
|
END; % E0 -J0 00943000
|
|
BEGIN % -J IS 1; 00944000
|
|
CASE I OF BEGIN 00945000
|
|
BEGIN % I IS 0; 00946000
|
|
IL1:=E.ADDR; I:=2;IE1:=FALSE; 00947000
|
|
GO TO L1 END; % E0 I0; 00948000
|
|
BEGIN % I IS 1; 00949000
|
|
Y:=CONS(E,Y); 00950000
|
|
GO TO L1 END; % EQ I1; 00951000
|
|
BEGIN % I IS 2; 00952000
|
|
IF IE1 THEN 00953000
|
|
IL1:=IL1+E.ADDR/10|(IE:=IE+1) ELSE 00954000
|
|
IL1:=IL1|10+E.ADDR; 00954010
|
|
GO TO L1 END % E0 I2; 00954020
|
|
END % CASES OF I; 00955000
|
|
END; % E0 -J1; 00956000
|
|
BEGIN % -J IS 2 SPECIAL; 00957000
|
|
CASE I OF BEGIN 00958000
|
|
BEGIN % I IS 0; 00959000
|
|
IL:=HANGON(X,CONS(E,NULLIST)); 00960000
|
|
GO TO L3 END; % E0 I0; 00961000
|
|
BEGIN % I IS 1; 00962000
|
|
IL:=HANGON(X,Y); 00963000
|
|
P:=P-1; 00964000
|
|
GO TO L2 END; % E0 I1; 00965000
|
|
BEGIN % I IS 2; 00966000
|
|
IF E.ADDR EQL "." THEN 00967000
|
|
BEGIN IE:=0;IE1:=TRUE;GO TO L1 END; 00968000
|
|
IL:=AD(IL1);IE1:=FALSE; 00968010
|
|
P:=P-1; GO TO L2 END % E0 I2; 00968020
|
|
END % CASES OF I; 00969000
|
|
END;% E0 -J2; 00970000
|
|
BEGIN % -J IS 3 SPACE; 00971000
|
|
CASE I OF BEGIN 00972000
|
|
BEGIN % I IS 0; 00973000
|
|
GO TO L1 END; % E0 I0; 00974000
|
|
BEGIN % I IS 1; 00975000
|
|
IL:=HANGON(X,Y); 00976000
|
|
GO TO L3 END; % E0 I1; 00977000
|
|
BEGIN % I IS 2; 00978000
|
|
IL:=AD(IL1);IE1:=FALSE; 00979000
|
|
GO TO L3 END % E0 I2; 00980000
|
|
END % CASES OF I; 00981000
|
|
END; % E0 -J3; 00982000
|
|
00983000
|
|
BEGIN % -J IS 4 IGNORE; 00984000
|
|
GO TO L1 END % E0-J4; 00985000
|
|
END;% CASES OF -J; 00986000
|
|
L1: IF EOL THEN COUNT:=0 00987000
|
|
ELSE COUNT:=COUNT+1; 00988000
|
|
GO TO L4; 00989000
|
|
L3: IF EOL THEN COUNT:=0 00990000
|
|
ELSE COUNT:=COUNT+1; 00991000
|
|
L2: END; % E0 M1 00992000
|
|
BEGIN % M IS 2; 00993000
|
|
IL:=MAKE(TYPELOGIC,MODE[C.ADDR]); 00994000
|
|
MODE[ C.ADDR]:=CM.ADDR; 00995000
|
|
END % E0 M2; 00996000
|
|
END % CASES OF M; 00997000
|
|
END % OWN BLOCK; 00998000
|
|
END;% PROCEDURE BLOCK *** END OF INLEX *** 00999000
|
|
REAL PROCEDURE LEXFIND; 01000000
|
|
BEGIN INTEGER T1,T,T2,T3; 01001000
|
|
DEFINE X=STACKPOSITION#, 01002000
|
|
P(P1)=POINTER(STACK[(P1.[18:7]),*])+P1.[11:12]#; 01003000
|
|
LABEL LEND; 01004000
|
|
CHR:=0; 01005000
|
|
REPLACE CP BY P(X) FOR 1; 01006000
|
|
T1:=CHR; 01007000
|
|
REPLACE CP-5 BY P(X) FOR (IF T1 LSS 6 THEN T1 ELSE 6); 01008000
|
|
T:=T3:=REF((T2:=AT(CHR MOD 127 )+1), HASH); 01009000
|
|
WHILE T NEQ NULLIST DO 01010000
|
|
IF P(X) NEQ P((CAR(T)-2000)) FOR T1 THEN 01011000
|
|
T:=CDR(T) ELSE 01012000
|
|
BEGIN LEXFIND:=CAR(T); GO TO LEND END; 01013000
|
|
ASGN(T2,HASH,CONS(LEXFIND:=TOKEN(X+2000),T3)); 01014000
|
|
X:=X+T1; 01015000
|
|
LEND:END LEXFIND; 01016000
|
|
PROCEDURE UREAD(FIL,BUF); VALUE FIL; REAL FIL; ARRAY BUF[0]; 01017000
|
|
BEGIN 01018000
|
|
FILE IN DISKFIL DISK RANDOM (1,10,150,SAVE 999); 01019000
|
|
POINTER PX; 01020000
|
|
LABEL REM, L1,EOF; 01021000
|
|
REAL MFID,FID,N,X; 01022000
|
|
IF REF(AT6,FIL)=TOKEN(1010)THEN GO TO REM; %REMOTE DEVICE 01023000
|
|
IF REF(AT6,FIL)=TOKEN(1011)THEN %DISK 01024000
|
|
BEGIN CHR:=0; 01025000
|
|
X:= REF(AT2,FIL)-2000; 01026000
|
|
PX:=POINTER(STACK[(X.[18:7]),*])+(X.[11:12]); 01027000
|
|
REPLACE CP BY PX:PX FOR 1; 01028000
|
|
N:=(IF CHR GTR 7 THEN 7 ELSE (CHR-1)); 01029000
|
|
REPLACE CP-5 BY " " FOR 6; 01030000
|
|
REPLACE CP-6 BY PX:PX FOR N; 01031000
|
|
MFID:=CHR; 01032000
|
|
CHR:=0; 01033000
|
|
X:= REF(AT3,FIL)-2000; 01034000
|
|
PX:=POINTER(STACK[(X.[18:7]),*])+(X.[11:12]); 01035000
|
|
REPLACE CP BY PX:PX FOR 1; 01036000
|
|
N:=(IF CHR GTR 7 THEN 7 ELSE (CHR-1)); 01037000
|
|
REPLACE CP-5 BY " " FOR 6; 01038000
|
|
REPLACE CP-6 BY PX:PX FOR N; 01039000
|
|
FID:=CHR; 01040000
|
|
FILL DISKFIL WITH MFID, FID; 01041000
|
|
READ(DISKFIL [REF(AT1,FIL).ADDR],10,BUF[*])[EOF]; 01042000
|
|
WRITE(DATA,10,BUF[*]); 01043000
|
|
ASGN(AT1,FIL,REF(AT1,FIL)+1); 01043010
|
|
GO TO L1 END; 01044000
|
|
EOF: PRIMERROR("URED",FIL); 01045000
|
|
REM: READ(DATA,9,BUF[*]); 01046000
|
|
L1: END UREAD; 01047000
|
|
PROCEDURE MEMSAVE(X,N,Y); 01048000
|
|
VALUE N,Y;ARRAY X[0];REAL N,Y; 01049000
|
|
BEGIN INTEGER I,K;REAL M00; 01050000
|
|
SAVE FILE MEMFL DISK SERIAL[20:25] (2,512,512,SAVE 999); 01051000
|
|
FILL MEMFL WITH Y,TIME(-1); 01052000
|
|
K:=LASTUSEDSPACE.[18:18]+1; 01053000
|
|
MEMORY[K.[17:9],K.[8:9]]:=M00:=MEMORY[0,0]; 01054000
|
|
MEMORY[0,0]:=N&LASTUSEDSPACE[45:22:23]; 01055000
|
|
FOR I:=0 STEP 1 UNTIL N DO BEGIN 01056000
|
|
K:=K+1; MEMORY[K.[17:9],K.[8:9]]:=X[I] END; 01057000
|
|
FOR I:=0 STEP 1 UNTIL K.[17:9] DO 01058000
|
|
WRITE (MEMFL,512,MEMORY[I,*]); 01059000
|
|
STACK[0,0]:=STACKPOSITION; I:=-1; 01060000
|
|
WHILE I:=I+1 LEQ STACKPOSITION.[18:7] DO 01061000
|
|
WRITE (MEMFL,512,STACK[I,*]); 01062000
|
|
LOCK(MEMFL); 01063000
|
|
MEMORY[0,0]:=M00;END OF SAVE; 01064000
|
|
PROCEDURE UNSAVE(X,N,FID); 01065000
|
|
VALUE FID;ARRAY X[0];REAL N,FID; 01066000
|
|
BEGIN INTEGER I,K; 01067000
|
|
SAVE FILE MEMFL DISK SERIAL(1,512,512); 01068000
|
|
IF BOOLEAN(XX1)THEN FILL MEMFL WITH FID,TIME(-1)ELSE 01069000
|
|
FILL MEMFL WITH FID, XX2 & "B0005"[41:29:30]; 01070000
|
|
READ (MEMFL,512,MEMORY[0,*]); 01071000
|
|
LASTUSEDSPACE:=M[0].ADDR; N:=M[1].ADDR; 01072000
|
|
K:=LASTUSEDSPACE.[18:18]+N+2; 01073000
|
|
FOR I:=1 STEP 1 UNTIL K.[17:9] DO 01074000
|
|
READ (MEMFL,512,MEMORY[I,*]); K:=K-N; 01075000
|
|
READ (MEMFL,512,STACK[0,*]); 01076000
|
|
STACKPOSITION:=STACK[0,0]; I:=0; 01077000
|
|
WHILE I:=I+1 LEQ STACKPOSITION.[18:7] DO 01078000
|
|
READ (MEMFL,512,STACK[I,*]); 01079000
|
|
MEMORY[0,0]:=MEMORY[(K-1).[17:9],(K-1).[8:9] 01080000
|
|
] END OF UNSAVE; 01081000
|
|
REAL PROCEDURE BNFTREE(F); 01082000
|
|
REAL F; 01083000
|
|
BEGIN INTEGER I; 01084000
|
|
REAL X,Y,Y1,Z,Z1; 01085000
|
|
LABEL L1,L2,L3,L4,L5,L6,L7; 01086000
|
|
REAL ARRAY SS[0:5]; 01087000
|
|
PROCEDURE ERR(I);INTEGER I; 01088000
|
|
BEGIN 01089000
|
|
FORMAT F1(X3,"$ ON LHS"); 01090000
|
|
FORMAT F2(X3,"NON-TERMINAL IS TYPE LOGIC"); 01091000
|
|
CASE I OF BEGIN; 01092000
|
|
WRITE(DATA,F1); 01093000
|
|
WRITE(DATA,F2); 01094000
|
|
END END OF ERR; 01095000
|
|
SWITCH SW :=L5,L6,L4; 01096000
|
|
FILL SS[*] WITH "=",";","$",":","@","#"; 01097000
|
|
FOR I:= 0 STEP 1 UNTIL 5 DO BEGIN 01098000
|
|
X:=LOADMODE(SS[I],2); 01099000
|
|
X:=CONS(MAKE(TYPELOGIC,SS[I]),NULLIST); 01100000
|
|
SS[I]:=HANGON(X,X) END; 01101000
|
|
X:=LOADMODE("%",68); 01102000
|
|
L6:Z:=CONS(MAKE(TYPECODE,118),NULLIST); 01103000
|
|
Y1:=CONS(ATOMUNDEF,NULLIST); 01104000
|
|
WHILE (X:=USERS(F)) NEQ SS[0] DO BEGIN 01105000
|
|
IF X EQL SS[2] THEN BEGIN ERR(1);GO TO L4 END; %$ ON LHS 01106000
|
|
IF X.TYPE EQL TYPELOGIC THEN BEGIN ERR(2); GO TO L4 END; % LOGIC ON L01107000
|
|
EQLIST(Y1,(Y1:=USERL(X))) END; 01108000
|
|
IF(X:=USERS(F)) EQL SS[4] AND CAR(Y1) NEQ ATOMUNDEF 01109000
|
|
THEN BEGIN EQLIST(Z,Y1); GO TO L5 END 01110000
|
|
ELSE BEGIN EQLIST(Y1,Z); Y1:=Y:=CONS(MAKE(TYPECODE,119),NULLIST); 01111000
|
|
GO TO L7 END; 01112000
|
|
L5:Y1:=Y:=CONS(MAKE(TYPECODE,119),NULLIST); 01113000
|
|
L2:X:=USERS(F); 01114000
|
|
L7:IF X EQL SS[2] THEN BEGIN 01115000
|
|
ASGN(ATOMCDR,Y1,(Y1:=CONS(USERS(F),NULLIST))); 01116000
|
|
GO TO L2 END; % TERMINAL 01117000
|
|
IF X EQL SS[4] THEN 01118000
|
|
BEGIN I:=1; GO TO L3 END; % @ 01119000
|
|
IF X EQL SS[5] THEN 01120000
|
|
BEGIN 01121000
|
|
ASGN(ATOMCDR,Y1,(Y1:=CONS(USERL(X),NULLIST))); 01122000
|
|
ASGN(ATOMCDR,Y1,FNS(X)); 01123000
|
|
GO TO L7 END; 01124000
|
|
IF X EQL SS[1] THEN 01125000
|
|
BEGIN I:=2; GO TO L3 END; % SEMICOLON 01126000
|
|
IF X EQL SS[3] THEN 01127000
|
|
BEGIN I:=3; GO TO L3 END; % COLON 01128000
|
|
IF X.TYPE EQL TYPELOGIC THEN BEGIN ERR(2); GO TO L4 END; % NON-TERMINA01129000
|
|
ASGN(ATOMCDR,Y1,(Y1:=CONS(USERL(X),NULLIST))); 01130000
|
|
GO TO L2; 01131000
|
|
L3:ASGN(ATOMCDR,Z,CONS(CDR(Y),CDR(Z))); 01132000
|
|
GO TO SW[I]; 01133000
|
|
L4:BNFTREE:=LABTAB 01134000
|
|
END; % END OF BNFTREE 01135000
|
|
REAL PROCEDURE DA(X);VALUE X;REAL X; 01136000
|
|
BEGIN IF X.TYPE EQL TYPELOGIC THEN 01137000
|
|
DA:=X.ADDR ELSE 01138000
|
|
IF X.TYPE EQL TYPEAREA 01138010
|
|
THEN DA:=0&REF(AT1,X)[46:8:9]&REF(AT2,X)[37:18:19] 01138011
|
|
&REF(AT3,X)[18:18:19]ELSE PRIMERROR("DA",X) END; 01138012
|
|
REAL PROCEDURE AD(X);VALUE X;REAL X;IF X GTR 0 AND 01138013
|
|
X.[38:39] LSS 524288 THEN AD:=MAKE(TYPELOGIC,X) 01138014
|
|
ELSE BEGIN REAL AD1;AD1:=AD:=PMAKE(TYPEAREA,MAKE(TYPELOGIC,3)); 01138015
|
|
ASGN(AT1,AD1,MAKE(TYPELOGIC,X.[46:9])); 01138016
|
|
ASGN(AT2,AD1,MAKE(TYPELOGIC,X.[37:19])); 01138017
|
|
ASGN(AT3,AD1,MAKE(TYPELOGIC,X.[18:19]))END ; 01138018
|
|
REAL PROCEDURE AR(X,Y,Z);VALUE X,Y,Z;REAL X,Y,Z; 01138019
|
|
BEGIN REAL AR1,AR2; 01138020
|
|
REAL PROCEDURE FN(I,J,K);VALUE I,J,K;REAL I,J,K; 01138021
|
|
BEGIN REAL F;CASE I OF BEGIN 01138030
|
|
F:=J+K;F:=J-K;F:=J|K;F:=J/K;F:=J*K END; %END OF CASE 01138035
|
|
FN:=AD(F) END; 01138040
|
|
IF Y.TYPE EQL TYPELIST THEN 01138045
|
|
BEGIN AR2:=AR1:=CONS(ATOMUNDEF,NULLIST); 01138050
|
|
IF Z.TYPE EQL TYPELIST THEN 01138055
|
|
BEGIN WHILE Y NEQ NULLIST AND Z NEQ NULLIST DO 01138060
|
|
BEGIN ASGN(AT0,AR1,AR1:=CONS(FN(X,DA(CAR(Y)),DA(CAR(Z))), 01138065
|
|
NULLIST));Y:=CDR(Y);Z:=CDR(Z) END; 01138070
|
|
IF Y NEQ Z THEN PRIMERROR("AR",Y) ELSE AR:=CDR(AR2) END 01138080
|
|
ELSE BEGIN Z:=DA(Z); 01138085
|
|
WHILE Y NEQ NULLIST DO BEGIN 01138090
|
|
ASGN(AT0,AR1,AR1:=CONS(FN(X,DA(CAR(Y)),Z),NULLIST)); 01138100
|
|
Y:=CDR(Y) END; AR:=CDR(AR2) END 01138105
|
|
END ELSE IF Z.TYPE EQL TYPELIST THEN 01138110
|
|
BEGIN Y:=DA(Y);AR2:=AR1:=CONS(ATOMUNDEF,NULLIST); 01138115
|
|
WHILE Z NEQ NULLIST DO BEGIN 01138120
|
|
ASGN(AT0,AR1,AR1:=CONS(FN(X,Y,DA(CAR(Z))),NULLIST)); 01138125
|
|
Z:=CDR(Z) END; AR:=CDR(AR2) END 01138130
|
|
ELSE AR:=FN(X,DA(Y),DA(Z)) END; 01138140
|
|
PROCEDURE RETURN(PROCESS,VAL);VALUE PROCESS,VAL; 01138145
|
|
REAL PROCESS,VAL; 01139000
|
|
BEGIN IF PROCESS.TYPE NEQ TYPEPROCESS THEN PRIMERROR("RTRN", 01140000
|
|
PROCESS); 01141000
|
|
ASGN(AT7,PROCESS,CONS(RC9,CONS(VAL,REF(AT7,PROCESS)))); 01142000
|
|
PROCESS:=QQ(PROCESS)END RETURN; 01143000
|
|
PROCEDURE RESUME(PROCESS);VALUE PROCESS; REAL PROCESS; 01144000
|
|
BEGIN IF PROCESS.TYPE NEQ TYPEPROCESS THEN 01145000
|
|
PRIMERROR("RSM1",PROCESS); 01146000
|
|
IF REF(AT2,PROCESS) NEQ ATOMSUSPENDED THEN 01147000
|
|
PRIMERROR("RSM2",PROCESS); 01148000
|
|
ASGN(AT2,PROCESS,ATOMRESUMED); 01149000
|
|
ASGN(AT7,PROCESS,CONS(RC1,REF(AT7,PROCESS))); 01150000
|
|
PROCESS:=QQ(PROCESS) END RESUME; 01151000
|
|
REAL PROCEDURE CREATE(START,ENV,INTERPRETER,PROCESS); 01152000
|
|
VALUE START,ENV,INTERPRETER,PROCESS; 01153000
|
|
REAL START,ENV,INTERPRETER,PROCESS; 01154000
|
|
BEGIN REAL Y; 01155000
|
|
Y:=PMAKE(TYPEPROCESS,LOGIC(7)); 01156000
|
|
ASGN(AT1,Y,REF(AT1,PROCESS)); 01157000
|
|
ASGN(AT2,Y,ATOMSUSPENDED); 01158000
|
|
ASGN(AT3,Y,START); 01159000
|
|
ASGN(AT4,Y,ENV); 01160000
|
|
ASGN(AT5,Y,INTERPRETER); 01161000
|
|
ASGN(AT6,Y,PROCESS); 01162000
|
|
ASGN(AT7,Y,NULLIST); 01163000
|
|
CREATE:=Y END CREATE; 01164000
|
|
PROCEDURE DEBUG; 01165000
|
|
BEGIN FORMAT F1(8U),F2(A4,I6),F3(I6,":",A4,I6), 01166000
|
|
NOTE1("DEBUG?"), 01167000
|
|
NOTE2("INVALID PROCESS OPERATION"), 01168000
|
|
NOTE3("INVALID TYPE ON FIRST PARAMETER"), 01169000
|
|
NOTE4("INVALID TYPE ON SECOND PARAMETER"), 01170000
|
|
NOTE5("INVALID TYPE ON THIRD PARAMETER"), 01171000
|
|
NOTE7("SYSTEM SAVE AS FILE--",A6), 01172000
|
|
NOTE8("SYSTEM LOADED FROM FILE--",A6), 01173000
|
|
NOTE9("#"), 01174000
|
|
NOTE10("SYSTEM LOADED FROM FILE--",A6,X1,A2), 01175000
|
|
NOTE6("NO PREVIOUS EXECUTE"); 01176000
|
|
FORMAT FMTLUSP("AMTSPACE=",I6,", LASTUSEDSPACE=",I6); 01177000
|
|
REAL OP,T1,V1,T2,V2,T3,V3,I,JUNK,J; 01178000
|
|
REAL ENV,PROCESS,X; 01179000
|
|
BOOLEAN APLI;REAL APLENV,AP1,AP2,AP3,AP4; 01180000
|
|
LABEL L1,L2,L3,L4,L5,L6,LEND; 01180010
|
|
MONITOR ZERO; 01181000
|
|
DEFINE PP(PP1,PP2,PP3)=J:=0;WHILE TYPEARRAY[J] NEQ PP1 DO 01182000
|
|
IF J NEQ 15 THEN J:=J+1 ELSE 01183000
|
|
BEGIN WRITE(DATA,PP2);GO TO L2 END; 01184000
|
|
PP3:=MAKE(J,PP3)#, 01185000
|
|
P1=BEGIN PP(T1,NOTE3,V1)END#, 01186000
|
|
P2=BEGIN P1;PP(T2,NOTE4,V2)END#, 01187000
|
|
P3=BEGIN P2;PP(T3,NOTE5,V3)END#; 01188000
|
|
ZERO:=L2; 01189000
|
|
L1:WRITE(DATA,NOTE1); 01190000
|
|
L2:T1:=T2:=T3:="SYMB"; 01191000
|
|
V1:=V2:=V3:=524287; 01192000
|
|
READ(DATA[STOP],F1,OP,T1,V1,T2,V2,T3,V3,JUNK); 01193000
|
|
FOR I:=0 STEP 1 UNTIL NOOFPROCESSOPS DO 01194000
|
|
IF OP=PROCESSARRAY[I] THEN GO TO L3; 01195000
|
|
WRITE(DATA,NOTE2);GO TO L2; 01196000
|
|
L3:CASE I OF BEGIN 01197000
|
|
GO TO LEND; % E N D 01198000
|
|
BEGIN P3;ASGN(V1,V2,(V1:=V3))END; %ASGN 01199000
|
|
BEGIN P2; V1:=REF(V1,V2) END; %REF 01200000
|
|
BEGIN P1;V1:=QQ(V1);GO TO L2 END; %QQ 01201000
|
|
V1:=UQ; %UQ 01202000
|
|
BEGIN P1;V1:=CAR(V1) END; %CAR 01203000
|
|
BEGIN P1;V1:=CDR(V1) END; %CDR 01204000
|
|
BEGIN P2;V1:=CONS(V1,V2) END; %CONS 01205000
|
|
BEGIN P1;V1:=NEWSYMB(V1)END; %NEWSYMB 01206000
|
|
BEGIN WRITE(DATA,FMTLUSP,AMTSPACE,LASTUSEDSPACE);GO TO L2 END;%AMTSP 01207000
|
|
BEGIN P2;V1:=PMAKE(V1.TYPE,V2)END; %MAKE 01208000
|
|
BEGIN P1;PRINT(V1);WRITE(DATA,NOTE9);GO TO L2 END; %PRINT 01209000
|
|
;%BEGIN P3;V1:=LOADMODE(V1,V2,V3)END; %LDMODE 01210000
|
|
BEGIN GCL;GO TO L2 END;%GCL 01211000
|
|
BEGIN P1;IF V1 NEQ ATOMUNDEF THEN %INTERP 01212000
|
|
RESUME(V1);INTERP;GO TO L2 END; 01213000
|
|
V1:=LABTAB; 01214000
|
|
V1:=LEXTREE; 01215000
|
|
BEGIN P1;V1:=USERS(V1) END; % USERS 01216000
|
|
BEGIN SMEM(T1);WRITE(DATA,NOTE7,T1);GO TO L2 END;%SMEM 01217000
|
|
BEGIN XX1:=1;LMEM(T1); %LMEM 01218000
|
|
APLI:=FALSE; 01219000
|
|
WRITE(DATA,NOTE8,T1); 01219010
|
|
I:=41;T1:="LIST";V1:=REF(AT2,REF(TOKEN(2742),LABTAB)).ADDR; 01220000
|
|
T2:="AREA";V2:=REF(TOKEN(2608),LABTAB);GO TO L3 END; 01221000
|
|
BEGIN P1;V1:=STATS END;% PSCAN 01222000
|
|
BEGIN P1;V1:=BNFTREE(V1) END; % BNFTRE 01223000
|
|
BEGIN P2;V2:=USERS(V2);ASGN(V2,LABTAB,V1)END; % INCODE 01224000
|
|
BEGIN V1:=QU(5,0);WRITE(DATA,NOTE9);GO TO L2 END; %QDUMP 01225000
|
|
BEGIN FOR I:=T1 STEP 1 UNTIL V1 DO %DUMP 01226000
|
|
WRITE(DATA,F3,I,TYPEARRAY[M[I].TYPE],M[I].ADDR); 01227000
|
|
WRITE(DATA,NOTE9);GO TO L2 END; 01228000
|
|
BEGIN P1;PRIMERROR(T2,V1);GO TO L2 END; 01229000
|
|
BEGIN P1;MASGN(T2,V1) END; %MASGN 01230000
|
|
BEGIN P1; XX1:=V1;XX2:=T2;V1:=QU(5,1);GO TO L2 END;%QASGN 01231000
|
|
V1:=M[T1]; %M 01232000
|
|
BEGIN XX2:=T1;V1:=QU(5,2)END; %Q 01233000
|
|
BEGIN P1;ENV:=IF APLI THEN APLENV 01233010
|
|
ELSE PMAKE(TYPECONS,0); % EXE 01234000
|
|
LOADMODE("$",2); 01235000
|
|
PROCESS:= CREATE(NULLIST,ENV,TOKEN(1004),CONS(AT(262144),NULLIST)); 01236000
|
|
ASGN(AT6,PROCESS,ATOMUNDEF); 01237000
|
|
L4:ASGN(AT2,PROCESS,ATOMSUSPENDED); 01238000
|
|
ASGN(AT3,PROCESS,(X:=V1)); 01239000
|
|
WHILE CDR(X) NEQ NULLIST DO X:=CDR(X); 01240000
|
|
ASGN(AT0,X,CONS(CONS(TOKEN(117),NULLIST),NULLIST)); 01241000
|
|
RESUME (PROCESS); 01242000
|
|
INTERP; 01243000
|
|
ENV:=REF(AT4,PROCESS:=XX1); 01244000
|
|
ASGN(AT7,PROCESS,NULLIST); 01244010
|
|
V1:=REF(TOKEN(1000),ENV); 01244020
|
|
IF APLI THEN BEGIN APLPNT(V1); APLENV:=ENV; 01244025
|
|
I:=36;T1:="LIST";T2:="AREA";V1:=REF(TOKEN(5003),LABTAB); 01244030
|
|
V2:=REF(AT2,V1).ADDR;V1:=REF(AT1,V1).ADDR; 01245000
|
|
GO TO L3 END ; 01247000
|
|
END; 01248000
|
|
IF PROCESS.TYPE EQL TYPEPROCESS THEN GO TO L4 %CEXE 01249000
|
|
ELSE BEGIN WRITE(DATA,NOTE6);GO TO L2 END; 01250000
|
|
BEGIN XX1:=0;XX2:=" "; 01251000
|
|
LMEM(T1);WRITE(DATA,NOTE10,T1);GO TO L2 END; 01252000
|
|
BEGIN ARRAY X[0:9]; %READ 01253000
|
|
P1; UREAD(V1,X); 01254000
|
|
WRITE(DATA,9,X[*]); GO TO L2 END; 01255000
|
|
BEGIN POINTER SP,XP; % DSTACK 01256000
|
|
REAL N; ARRAY X[0:8]; 01257000
|
|
XP:=POINTER(X); SP:=POINTER(STACK[0,*]); 01258000
|
|
CHR:=N:=8; 01259000
|
|
WHILE N LSS STACKPOSITION DO 01260000
|
|
BEGIN REPLACE XP BY " " FOR 72; 01261000
|
|
REPLACE CP BY SP+N FOR 1; 01262000
|
|
REPLACE XP BY N+2000 FOR 4 DIGITS; 01263000
|
|
REPLACE XP+6 BY SP+N+1 FOR CHR-1; 01264000
|
|
N:=N+CHR; 01265000
|
|
WRITE(DATA,9,X[*]) END; 01266000
|
|
WRITE(DATA,NOTE9);GO TO L2 END DSTACK; 01267000
|
|
BEGIN P1;X:=V1; % MODELD 01268000
|
|
L6:V1:=ATOMUNDEF;T1:=3;T2:=T3:=0; 01269000
|
|
READ(DATA,F1,V1,T1,T2,T3,V2,V3,OP,JUNK); 01270000
|
|
IF V1=ATOMUNDEF THEN GO TO L2; 01271000
|
|
V1:=AT(V1+1);T1:=T1&T2[14:3:4]&T3[18:3:4]; 01272000
|
|
ASGN(V1,X,AT(T1));GO TO L6 END; 01273000
|
|
BEGIN P2;ENV:=PMAKE(TYPECONS,0); %PARSE 01274000
|
|
ASGN(TOKEN(1018),ENV,NULLIST); 01275000
|
|
ASGN(TOKEN(1019),ENV,AT0); 01276000
|
|
ASGN(TOKEN(1006),ENV,CONS(USERS(V2),CONS(V2,NULLIST))); 01277000
|
|
PROCESS:=CREATE(NULLIST,ENV,TOKEN(1005),CONS(AT(262144),NULLIST)); 01278000
|
|
ASGN(AT6,PROCESS,ATOMUNDEF); 01279000
|
|
ASGN(AT3,PROCESS,CONS(V1,CONS(TOKEN(117),NULLIST))); 01280000
|
|
ASGN(AT7,PROCESS,NULLIST); 01281000
|
|
RESUME(PROCESS); INTERP; 01281010
|
|
IF APLI THEN 01281020
|
|
BEGIN T1:="PRCS";V1:=XX1.ADDR; 01281030
|
|
I:=37;GO TO L3 END; 01282000
|
|
V1:=XX1 END PARSE; 01283000
|
|
BEGIN P1;WHILE PRIORITY.ADDR GTR 0 DO JUNK:=UQ;%TRANS 01284000
|
|
ASGN(AT3,V1,CONS(CONS(TOKEN(143),NULLIST),CONS( 01284001
|
|
CONS(TOKEN(117),NULLIST),NULLIST))); 01284050
|
|
ASGN(AT7,V1,NULLIST);ASGN(AT5,V1,TOKEN(1017)); 01284060
|
|
RESUME(V1); 01285000
|
|
INTERP; 01286000
|
|
V1:=REF(AT1,REF(AT4,XX1)); 01286010
|
|
IF APLI THEN 01286020
|
|
BEGIN T1:="LIST";V1:=V1.ADDR; 01286030
|
|
I:=30;GO TO L3 END END TRANS ; 01287000
|
|
BEGIN TRACE:=NOT TRACE; GO TO L2 END;%TRACE 01288000
|
|
BEGIN PRINT(HASH);GO TO L2 END; %HASH 01288010
|
|
BEGIN INTERP;V1:=XX1;END;%RSTART 01288020
|
|
BEGIN APLI:=TRUE;I:=36; 01288030
|
|
ASGN(TOKEN(5003),LABTAB,CONS(MAKE(TYPELIST,V1), 01288035
|
|
CONS(MAKE(TYPEAREA,V2),NULLIST))); 01288040
|
|
APLENV:=PMAKE(TYPECONS,0); GO TO L3 END; %APL 01288050
|
|
BEGIN XX1:=1;LMEM(T1);APLI:=FALSE; 01288060
|
|
WRITE(DATA,NOTE8,T1);GO TO L2 END; % LSTRT 01289000
|
|
END CASE STATEMENT; 01290000
|
|
L5:WRITE(DATA,F2,TYPEARRAY[V1.TYPE],V1.ADDR); 01291000
|
|
GO TO L2; 01292000
|
|
LEND:END DEBUG; 01293000
|
|
PROCEDURE DOTRACE(PROCESS);VALUE PROCESS;REAL PROCESS; 01294000
|
|
BEGIN PRINT(PROCESS); 01295000
|
|
PRINT(REF(AT3,PROCESS)); 01296000
|
|
PRINT(REF(AT4,PROCESS)); 01297000
|
|
PRINT(REF(AT7,PROCESS))END DOTRACE; 01298000
|
|
PROCEDURE MASGN(A,V);VALUE A,V;REAL A,V; 01299000
|
|
BEGIN IF BOOLEAN(A) THEN 01300000
|
|
MEMORY[A.[18:9],A.[9:9]].[22:23]:=V ELSE 01301000
|
|
MEMORY[A.[18:9],A.[9:9]].[45:23]:=V END MASGN; 01302000
|
|
PROCEDURE PRINT(X);VALUE X;REAL X; 01303000
|
|
BEGIN REAL I; 01304000
|
|
LABEL L1,L2; 01305000
|
|
FORMAT F1(":",A4,I6), 01306000
|
|
F2(X3,A4,I6,"=",A4,I6), 01307000
|
|
F3(X3,I4,"=",A4,I6), 01308000
|
|
F4(X3,I4,"=NIL"); 01309000
|
|
WRITE(DATA,F1,TYPEARRAY[X.TYPE],X.ADDR); 01310000
|
|
CASE X.TYPE OF BEGIN 01311000
|
|
; %GARBAGE 01312000
|
|
L1:BEGIN X:=M[X]; %CONS 01313000
|
|
WHILE X NEQ NULLIST DO 01314000
|
|
BEGIN WRITE(DATA,F2,TYPEARRAY[CAR(X).TYPE],CAR(X).ADDR, 01315000
|
|
TYPEARRAY[CAR((X:=CDR(X))).TYPE],CAR(X).ADDR); 01316000
|
|
X:=CDR(X)END END; 01317000
|
|
BEGIN I:=1; WHILE X NEQ NULLIST DO %LIST 01318000
|
|
BEGIN WRITE(DATA,F3,I,TYPEARRAY[CAR(X).TYPE],CAR(X).ADDR); 01319000
|
|
I:=I+1;X:=CDR(X) END; 01320000
|
|
WRITE(DATA,F4)END; 01321000
|
|
L2:FOR I:=0 STEP 1 UNTIL M[X].ADDR DO %AREA 01322000
|
|
WRITE(DATA,F3,I,TYPEARRAY[M[X-I].TYPE],M[X-I].ADDR); 01323000
|
|
;%FIELD 01324000
|
|
;%SYMBOL 01325000
|
|
;%LOGIC 01326000
|
|
;%LINK 01327000
|
|
GO TO L2; %PROCESS 01328000
|
|
GO TO L2; %MONITOR 01329000
|
|
GO TO L2;%GENERAL 01330000
|
|
END CASE STATEMENT; 01331000
|
|
END PRINT; 01331010
|
|
PROCEDURE APLPNT(X);VALUE X;REAL X; 01331015
|
|
BEGIN REAL I;FORMAT F1(X2,R12.5),F2(A4,I6); 01331020
|
|
I:=0; 01331025
|
|
IF X.TYPE EQL TYPELIST THEN BEGIN 01331030
|
|
WHILE X NEQ NULLIST DO BEGIN 01331035
|
|
IF NBR(CAR(X)) THEN 01331040
|
|
BEGIN IF I MOD 4 EQL 3 THEN WRITE(DATA,F1,DA(CAR(X))) 01331045
|
|
ELSE WRITE(DATA[STOP],F1,DA(CAR(X))); 01331050
|
|
I:=I+1;X:=CDR(X) END ELSE BEGIN 01331060
|
|
WRITE(DATA,F2,TYPEARRAY[X.TYPE],X.ADDR); 01331065
|
|
X:=NULLIST END END;WRITE (DATA) END 01331070
|
|
ELSE IF NBR(X) THEN WRITE(DATA,F1,DA(X)) 01331075
|
|
ELSE WRITE(DATA,F2,TYPEARRAY[X.TYPE],X.ADDR) END; 01332000
|
|
PROCEDURE SYSM; 01333000
|
|
BEGIN FORMAT F1(5U), 01334000
|
|
NOTE1("SYSTEM?"), 01335000
|
|
NOTE2("INVALID OPERATION"), 01336000
|
|
NOTE3("CANDE?"); 01337000
|
|
ARRAY X[0:4];INTEGER I; 01338000
|
|
DEFINE LA=X[0],X[1],X[2],X[3],X[4]#; 01339000
|
|
LABEL L1,L2,L3,LEND; 01340000
|
|
LASTUSEDSPACE:=0;CURROW:= 0 ; 01341000
|
|
NEXTTOKEN:=TOKEN(2000); 01342000
|
|
TRACE:=FALSE; 01343000
|
|
CP:=POINTER(JUNKARRAY)+7; 01344000
|
|
HASH:=PMAKE(TYPEAREA,AT(127)); 01345000
|
|
FOR I:=AT1 STEP 1 UNTIL AT(127)DO ASGN(I,HASH,NULLIST); 01346000
|
|
STACKPOSITION:=8; 01347000
|
|
MASGN (0,LINKTONIL); 01348000
|
|
LABTAB:=PMAKE(TYPECONS,0); 01349000
|
|
INQ(HASH); 01350000
|
|
INTLX; 01358000
|
|
DEBUG; 01361000
|
|
LEND:END SYSM; 01362000
|
|
REAL PROCEDURE USERS(F); 01363000
|
|
REAL F; 01364000
|
|
BEGIN REAL X,X1; 01365000
|
|
USERS:=INLEX(F) 01366000
|
|
END OF USERS; 01367000
|
|
REAL PROCEDURE USERL(X); 01368000
|
|
REAL X; 01369000
|
|
BEGIN 01370000
|
|
IF (USERL:=REF(X,LABTAB)) EQL ATOMUNDEF THEN 01371000
|
|
ASGN(X,LABTAB,(USERL:=CONS(ATOMUNDEF,NULLIST))); 01372000
|
|
END OF USERL; 01373000
|
|
REAL PROCEDURE PSCAN(IJ,X,F);REAL X,F;INTEGER IJ; 01374000
|
|
BEGIN OWN REAL ARRAY SS[0:11]; 01375000
|
|
REAL Y; 01376000
|
|
PROCEDURE ERR; 01377000
|
|
BEGIN 01378000
|
|
FORMAT F1(X3,"ARG MISSING"); 01379000
|
|
WRITE(DATA,F1) END; 01380000
|
|
REAL PROCEDURE QT(X);VALUE X;REAL X; 01381000
|
|
IF REF(X,LABTAB) NEQ ATOMUNDEF THEN BEGIN 01382000
|
|
IF (X:=USERL(X)) EQL TOKEN(1007) THEN 01383000
|
|
QT:=CONS(TOKEN(122),CONS(QT(USERS(F)),NULLIST)) 01384000
|
|
ELSE QT:=X END ELSE QT:=X; 01385000
|
|
REAL PROCEDURE FSCAN(X,Y,F);VALUE X; REAL X,Y,F; 01386000
|
|
BEGIN REAL FSTK,F1,FN; 01387000
|
|
LABEL L1,L2,L3,L4,L5,L6,LEND; 01388000
|
|
FSTK:=NULLIST; 01389000
|
|
L1: IF Y NEQ SS[0] THEN BEGIN FSCAN:=X; GO TO LEND END; 01390000
|
|
F1:=FN:=CONS(X,NULLIST); 01391000
|
|
L2: IF (X:=USERS(F)) EQL SS[4] THEN 01392000
|
|
BEGIN X:=ATOMUNDEF; GO TO L4 END; %DUMMY ARG 01393000
|
|
IF X EQL SS[1] THEN 01394000
|
|
BEGIN X:=ATOMUNDEF; GO TO L5 END; % DUMMY ARG LIST 01395000
|
|
L6:X:=QT(X); 01396000
|
|
IF (Y:=USERS(F)) EQL SS[4] THEN 01397000
|
|
L4: BEGIN ASGN (ATOMCDR,FN,(FN:=CONS(X,NULLIST))); 01398000
|
|
GO TO L2 END; % COMMA 01399000
|
|
IF Y EQL SS[1] THEN 01400000
|
|
BEGIN ASGN (ATOMCDR,FN,CONS(X,NULLIST)); 01401000
|
|
L5:X:=FN:=F1; 01402000
|
|
IF CAR(FSTK) EQL ATOMUNDEF THEN 01403000
|
|
BEGIN Y:=USERS(F);GO TO L1 END; 01404000
|
|
; F1:=CAR(FSTK); FSTK:=CDR(FSTK); 01405000
|
|
FN:=CAR(FSTK); 01406000
|
|
FSTK:=CDR(FSTK); 01407000
|
|
GO TO L6 END; % RPAREN 01408000
|
|
IF X EQL QT(SS[8]) THEN 01409000
|
|
BEGIN X:=USERL(Y); GO TO L6 END; % LABEL 01410000
|
|
FSTK:=CONS(FN,FSTK); 01411000
|
|
FSTK:=CONS(F1,FSTK); 01412000
|
|
GO TO L1; 01413000
|
|
LEND: END OF FSCAN; 01414000
|
|
REAL PROCEDURE SSCAN(F); 01415000
|
|
REAL F; 01416000
|
|
BEGIN REAL X,Y,Z,S1,S2; 01417000
|
|
LABEL L1,L2,L3,L4,L5,LEND,L6; 01418000
|
|
SSCAN:=Z:=CONS(ATOMUNDEF,NULLIST); 01419000
|
|
GO TO L1; 01420000
|
|
L3:Z:=CONS(ATOMUNDEF,NULLIST); 01421000
|
|
L2:L1: IF (X:=USERS(F)) EQL SS[10] OR X EQL SS[1] THEN 01422000
|
|
L6:BEGIN 01423000
|
|
GO TO LEND END % END 01424000
|
|
ELSE L5: IF X EQL SS[5] THEN 01425000
|
|
GO TO L1; % SEMICOLON 01426000
|
|
IF (Y:=USERS(F)) EQL SS[6] THEN 01427000
|
|
BEGIN EQLIST(USERL(X),Z); 01428000
|
|
GO TO L1 END % COLON 01429000
|
|
ELSE ASGN(ATOMCAR,Z,FSCAN(QT(X),Y,F)); 01430000
|
|
IF ATOM(CAR(Z)) THEN BEGIN ERR;GO TO L2 END; 01431000
|
|
IF (X:=Y) EQL SS[5] THEN 01432000
|
|
BEGIN ASGN(ATOMCDR,Z,(Z:=CONS(ATOMUNDEF,NULLIST))); 01433000
|
|
GO TO L2 END % NO SUCCESSOR GIVEN 01434000
|
|
;IF X EQL SS[10] THEN GO TO L6 01435000
|
|
; IF X EQL SS[1] THEN GO TO LEND 01436000
|
|
ELSE ASGN(ATOMCDR,Z,CONS(ATOMUNDEF,NULLIST)); EQLIST(REF(AT0,Z),USERL( 01437000
|
|
X)); 01438000
|
|
GO TO L3; % SUCCESSOR GIVEN 01439000
|
|
LEND: END OF SSCAN; 01440000
|
|
PROCEDURE LDSS; BEGIN INTEGER I,J,K,KK; REAL STK; 01441000
|
|
FILL SS[*] WITH "E","N","D","R","O","U","T","I","N","E"; 01442000
|
|
K:=2;KK:=0; FOR J:=0 STEP 1 UNTIL 1 DO 01443000
|
|
BEGIN STK:=NULLIST; 01444000
|
|
FOR I:=KK STEP 1 UNTIL K DO 01445000
|
|
STK:=CONS(MAKE(TYPELOGIC,SS[I]),STK); 01446000
|
|
SS[J+10]:=HANGON(STK,STK); 01447000
|
|
K:=9;KK:=3 END; 01448000
|
|
FILL SS[*] WITH "(",")","[","]",",",";",":","*","#"; 01449000
|
|
FOR I:=0 STEP 1 UNTIL 8 DO 01450000
|
|
BEGIN K:=LOADMODE(SS[I],2); 01451000
|
|
STK:=CONS(MAKE(TYPELOGIC,SS[I]),NULLIST); 01452000
|
|
SS[I]:=HANGON(STK,STK) END; 01453000
|
|
K:=LOADMODE("%",68) 01454000
|
|
END OF LDSS; 01455000
|
|
LDSS; 01456000
|
|
CASE IJ OF BEGIN 01457000
|
|
PSCAN:=SSCAN(F); 01458000
|
|
IF (Y:=QT(USERS(F))) EQL SS[0] 01459000
|
|
THEN BEGIN PSCAN:=SSCAN(F); 01460000
|
|
X:= USERS(F) END ELSE 01461000
|
|
BEGIN X:= USERS(F); PSCAN:=CONS(FSCAN(Y,X,F),NULLIST) 01462000
|
|
END END END OF PSCAN; 01463000
|
|
AT0:=LOGIC(0); 01464000
|
|
AT1:=LOGIC(1); 01465000
|
|
AT2:=LOGIC(2); 01466000
|
|
AT3:=LOGIC(3); 01467000
|
|
AT4:=LOGIC(4); 01468000
|
|
AT5:=LOGIC(5); 01469000
|
|
AT6:=LOGIC(6); 01470000
|
|
AT7:=LOGIC(7); 01471000
|
|
TKNO:=MAKE(TYPETOKEN,0); 01472000
|
|
RC1:=MAKE(TYPECODE,1); 01473000
|
|
RC9:=MAKE(TYPECODE,9); 01474000
|
|
ATOMUNDEF:=MAKE(TYPESYMB+1,0)-1; 01475000
|
|
LINKTONIL:=MAKE(TYPELINK+1,0)-1; 01476000
|
|
NULLIST:=MAKE(TYPELIST+1,0)-1; 01477000
|
|
FILL SYSMARRAY[*] WITH "END","DEBUG"; 01478000
|
|
FILL PROCESSARRAY[*] WITH "END","ASGN","REF","QQ","UQ","CAR", 01479000
|
|
"CDR","CONS","NEWSYM","AMTSP","MAKE","PRINT", 01480000
|
|
"LDMODE","GCL","INTERP","LABEL","NODES", 01481000
|
|
"USERS","SMEM","LMEM","PSCAN","BNFTRE","INCODE","QDUMP", 01482000
|
|
"DUMP","PERROR","MAASGN","QASGN","M","Q","EXE","CEXE","LOAD", 01483000
|
|
"READ","DSTACK","MODELD","PARSE","TRANS","TRACE","HASH","RSTART", 01483010
|
|
"APL","PARLD"; 01484000
|
|
FILL TYPEARRAY[*] WITH "GRBG","CONS","LIST","AREA", 01485000
|
|
"BITS","SYMB","LGIC","LINK", 01486000
|
|
"PRCS","MNTR","GNRL","CODE", 01487000
|
|
"TP12","TP13","TP14","TP15"; 01488000
|
|
SYSM; 01489000
|
|
END. END PROGRAM 01490000
|
|
? END |