.ORIGIN START + '204;
.PROCEDURE CLEARPOOL;
.INTEGER I;
.BEGIN .WHEN CPPT .Z .THEN .GOTO EXIT;
.FOR I :=
CPPT .DO
.BEGIN K :=
CPOOL[
I]; %
IRS,
I;
BACKPLUG(
CPOOL[
I]);
GENERATE(
K);
.END;
CPPT :=
.Z;
EXIT:
.END;
.PROCEDURE DECTEST;
.BEGIN
NBS;
IDENTIFIER;
NOTDECLAREDCHECK;
.END;
.PROCEDURE SUBSCRIPT;
.ARRAY TYPEOF[5](
INT,
CONST,
COMPCONST,
ARRAY,
TABLE);
.SWITCH TO =
ISYM,
CSYM,
CCSYM,
ARSYM,
TABSYM;
.BEGIN
ENTER;
FAILIFNOT(
LSBSYMBOL);
ARRTYPE :=
TYPE;
TYPEFIRST :=
.Z;
OTHER:
STACK(
ADD);
.WHEN BASIC(
XSYMBOL)
.THEN
.BEGIN
NBS;
.WHEN TYPEFIRST .NZ .THEN
.BEGIN
TYPEFIRST :=
.Z;
FAIL(
CORRUPTINDEX);
.END;
.GOTO CONT;
.END;
.IF LETTER .THEN
.BEGIN
IDENTIFIER;
.FOR # := -5
.DO
.WHEN TYPE =
TYPEOF[#]
.THEN .GOTO TO[#];
FAIL(
BADSUBSCRIPT);
.GOTO CONT;
TABSYM:
@ :=
ADD + '100001;
.GOTO TABARR;
ARSYM:
@ :=
.SSM ADD;
TABARR:
STACK(@);
STACK(
ARRTYPE);
SUBSCRIPT;
ARRTYPE :=
UNSTACK;
ADD :=
UNSTACK;
.GOTO ISYM;
CCSYM:
VALUE :=
ADD;
ADD :=
.Z;
ISYM:
CSYM:
.END
.ELSE
.BEGIN
CONSTANT;
ADD :=
.Z;
.END;
%
IRS,
TYPEFIRST;
.IF STATELHS .LZ .THEN
.BEGIN
.IF ADD .Z .THEN
.BEGIN
LHSPUT(
.Z);
LHSPUT(
LDX);
LHSPUT(
VALUE);
.END .ELSE LHSPUT(
LDX +
ADD);
.END
.ELSE
.BEGIN
.WHEN ADD .Z .THEN MAKECONST;
GENERATE(
LDX +
ADD);
.END;
CONT:
ADD :=
UNSTACK;
.WHEN ARRTYPE =
TABLE .THEN
.BEGIN
ARRTYPE :=
ARRAY;
.WHEN TYPEFIRST .NZ .THEN
.IF STATELHS .LZ .THEN
.BEGIN
LHSPUT(
LDXI +
ADD);
LHSPUT(
STX1 +
ADD);
.END
.ELSE
.BEGIN
GENERATE(
LDXI +
ADD);
GENERATE(
STX1 +
ADD);
.END;
%
IRS,
ADD;
.WHEN GETMARKER .NZ .THEN .GOTO GETEXIT;
FAILIFNOT(
COMMASYMBOL);
.GOTO OTHER;
.END;
GETEXIT:
FAILIFNOT(
RSBSYMBOL);
LEAVE;
.END;
.PROCEDURE TERM;
.INTEGER J;
.SWITCH JOB =
AC,
ZERO,
LRB,
IF,
ONE,
B,
DQUOTE,
CASE;
.BEGIN ENTER;
OPCOUNT :=
.Z;
MOREUNARY:
.WHEN ID .Z .THEN
.WHEN BSIS(
UNARY)
.THEN
.BEGIN %
IRS,
OPCOUNT;
STACK(
ADDBS);
NBS;
.GOTO MOREUNARY;
.END;
STACK(
OPCOUNT);
.WHEN ID .LZ .THEN .GOTO OK;
.IF LETTER .THEN
.BEGIN IDENTIFIER;
OK:
.IF TYPE .AND '177776 = '10
.THEN
.BEGIN PROCCALL;
ID :=
.Z;
.END .ELSE
.BEGIN ID := -1;
CELL;
GENVADDINST(
LDA);
.END;
.END .ELSE
.BEGIN
.FOR # :=
WAYS OF BEGINNING .DO
.WHEN BASIC(
TERMTYPES[#])
.THEN .GOTO JOB[#];
.GOTO PASSON;
DQUOTE:
GENERATE(
LA + '5002);
& LDA '1002 + LA;
STACK(
LA); %
IRS,
LA;
GENERATE(
LOCAL + '40001);
MORETEXT:
J :=
.SWOP INCHAR;
.WHEN BASIC(
DOUBLEQUOTES)
.THEN .GOTO TEXTFIN;
GENERATE(
INCHAR +
J);
.WHEN BASIC(
DOUBLEQUOTES)
.THEN .GOTO TEXTFIN;
.GOTO MORETEXT;
TEXTFIN:
PLUGJUMP(
LA);
NBS;
.GOTO DONE;
CASE:
STMARK :=
.Z;
CASESTATEMENT;
.GOTO DONE;
AC:
NBS;
.GOTO DONE;
ZERO:
NBS;
GENERATE(
CRA);
.GOTO DONE;
LRB:
NBS;
EXPRESSION;
FAILIFNOT(
RRBSYMBOL);
.GOTO DONE;
IF:
STMARK :=
.Z;
IFSTATEMENT;
.GOTO DONE;
ONE:
NBS;
GENERATE('140402);
& LOAD ONE INTO A-REG
.GOTO DONE;
B:
NBS;
GENERATE(
IAB);
.GOTO DONE;
PASSON:
CELL;
GENVADDINST(
LDA);
.END;
DONE:
.WHEN UNSTACK .NZ .THEN
.FOR OPCOUNT :=
.NEG @
.DO
.BEGIN ADDBS :=
UNSTACK;
GENMACRO;
.END;
LEAVE;
.END;
.PROCEDURE TYPEIDENT;
.ARRAY TYPES [3] (0,
COMPCONST,
LABEL);
.LABEL BAD,
LABELTYPE;
.SWITCH S =
BAD,
BAD,
LABELTYPE;
.BEGIN
IDENTIFIER;
.FOR # := -3
.DO
.WHEN TYPE =
TYPES[#]
.THEN .GOTO S[#];
.GOTO SKIP;
BAD:
FAIL(
WRONGTYPE);
.GOTO SKIP;
LABELTYPE:
.WHEN LEVEL > 1
.THEN
.BEGIN
.WHEN ADD .LZ .THEN
PUTADD('100000 +
LA);
ADD :=
ADD + '1000;
.END;
SKIP:
ADD :=
ADD .AND '1777;
.END;
.PROCEDURE UNSTACK;
.BEGIN STACKPOINTER :=
STACKPOINTER - 1;
@ :=
ST[
STACKPOINTER];
.END;
.PROCEDURE XASSIGNMENTSTATEMENT;
.BEGIN
NBS;
FAILIFNOT(
BECOMESSYMBOL);
CELL;
GENVADDINST(
LDX);
.END;
&MAIN
.ORIGIN START;
.BEGIN
.GOTO COMPILE;
.GOTO ESCAPE;
&ENTRY AT SECOND WORD
.GOTO NEWMAINPROG;
COMPILE:
NEWLINE;
OUT2('120655);
CYCLE :=
CYCLESIZE;
.FOR # :=
CYCLESIZE .DO TRACE[#] :=
.Z;
@ := '40000;
%
STA,
CODE;
& CODE IS NOW THE CORE STORE
CLEVEL := 1;
DECPOINTER :=
PERMANENTDECLARATIONS;
STACKPOINTER :=
STACKHEIGHT;
MAXWORK,
WORKING,
WORKFLAG,
INDEVICE,
ID,
EXPLICITCONST,
KEPT,
ALLOWSPACE,
CPPT,
GETMARKER,
ERRORS,
LA :=
.Z;
GA := '100;
LSTART := '2000;
READLINE;
NBS;
DECLARATIONS;
DECPOINTER :=
DECPOINTER - 3;
NAMELIST[
DECPOINTER] :=
.Z; %
IRS,0;
NAMELIST[#] := 1;
CLEVEL := 2;
PROCPOSITION := -1;
COMPSTATEMENT;
GENERATE(
HLT);
CLEARWORKSPACE;
CLEARPOOL;
GLOBCOLLAPSE;
NEWLINE;
OUT2(
.IF ERRORS .Z .THEN $
OK .ELSE $
ER);
NEWLINE;
OUTSIX(
LOCAL);
OCTAL3(
GA);
%
HLT;
%
JMP *
LSTART;
& START PROGRAM AT LIKELY PLACE
ESCAPE: ;
INDEVICE :=
.Z;
&TELETYPR
NEWLINE;
OUT2($->);
NEWMAINPROG:
READLINE;
DECPOINTER :=
LOCDP;
CLEVEL := 2;
KEPT :=
.Z;
TESTSTART :=
.CODEWORD TEST .AND '37777;
LSTART :=
TESTSTART .AND '177000;
LA :=
TESTSTART .AND '777;
NBS;
.WHEN BASIC(
EMSYMBOL)
.THEN .GOTO REPEAT;
STATEMENT;
GENERATE(
.ADDRESS ESCAPE +
JMPI);
CLEARWORKSPACE;
CLEARPOOL;
LOCALCOLLAPSE;
NEWLINE;
REPEAT:
%
JMP*
TESTSTART;
.END;