.CONDITIONAL .PROCEDURE NUMERICAL;
.BEGIN
.WHEN BASIC(
OCTALSYMBOL)
.THEN .GOTO OK;
.WHEN BASIC(
MINUSSYMBOL)
.THEN .GOTO OK;
.WHEN DIGIT .THEN
OK:
.EXITTRUE;
.END;
@
.PROCEDURE OCTAL3;
.INTEGER TX;
.BEGIN @ := @
.SHDRL 9;
OUT1(
SPACE);
.FOR TX := -3
.DO
OUT1(
.Z .SHDLL 3 + '260);
.END;
@
.PROCEDURE OUTSIX;
.BEGIN %
IAB;
OUT1(
SPACE); @ :=
.Z .SHDLL 1;
.FOR # := -6
.DO
.BEGIN OUT1(@ +
ZEROSYMBOL); @ :=
.Z .SHDLL 3;
.END;
.END;
@
.PROCEDURE OUT1;
.BEGIN %
SKS,'104; %
JMP,*-1; %
OCP,'104;
%
OTA,4; %
JMP,*-1;
.END;
@
.PROCEDURE OUT2;
.BEGIN OUT1(
.SWOP @ );
OUT1 (
.SWOP @);
.END;
@
.PROCEDURE OUT3X;
.INTEGER H,
I;
.BEGIN @ := @
.SHDRL 15;
.FOR I := -3
.DO
.WHEN .Z .SHDLL 5
.NZ .THEN
.IF @ =
FLAGSYMBOL .THEN IDFLAG := -1
.ELSE
.BEGIN H := @; %
IRS,
TAB;
.IF IDFLAG .LZ .THEN
.BEGIN IDFLAG :=
.Z; @ :=
H +
DDCONSTANT
.END .ELSE .IF H .LE 26
.THEN @ := @ +
LCONSTANT
.ELSE @ := @ +
DCONSTANT;
OUT1(@);
.END;
.END;
@
.PROCEDURE PLUGJUMP;
.INTEGER WHERE TO;
.BEGIN
WHERE TO := @;
INDEX :=
UNSTACK +
LSTART;
CODE[#] :=
JMPSO +
WHERE TO;
.END;
.PROCEDURE PRINTNAMELISTENTRY;
.BEGIN
NEWLINE;
PRINTIDENT; %
IRS,0;
OCTAL3(
NAMELIST[#]); %
IRS,0;
OUTSIX(
NAMELIST[#]);
.END;
.PROCEDURE PROCCALL;
.BEGIN ENTER;
.IF TYPE .AND '177774 =
PROC .THEN
.BEGIN
.WHEN TYPE .ODD .THEN
.BEGIN FAILIFNOT(
LRBSYMBOL);
ID :=
.Z;
STACK(
ADD);
EXPRESSION;
.WHEN BSCOMMA .THEN
.BEGIN
NBS;
GENERATE(
IAB);
EXPRESSION;
.END;
.WHEN BSCOMMA .THEN
.BEGIN
NBS;
CELL;
GENVADDINST(
LDX);
.END;
ADD :=
UNSTACK;
FAILIFNOT(
RRBSYMBOL);
.END;
GENERATE(
JSTI +
ADD);
.END .ELSE FAIL(
NOTAPROC);
LEAVE;
.END;
@
.PROCEDURE DAPDECODE;
.BEGIN
.FOR # :=
MCODESIZE .DO
.BEGIN
%
IRS,0;
.WHEN @ =
MCODE[#]
.THEN .GOTO FOUND;
.END;
@ :=
.Z;
.GOTO EXIT;
FOUND:
INDEX :=
INDEX - 1;
@ :=
MCODE[#];
EXIT: ;
.END;
.ORIGIN 0;
.ARRAY TEST[0];
.SET CPOOL[
CPOOLSIZE];
.ORIGIN 0;
.PROCEDURE PRINTIDENT;
.BEGIN TAB := -7;
IDFLAG :=
.Z;
OUT3X(
NAMELIST[
LOCDP]);
.WHEN NAMELIST[
LOCDP]
.LZ .THEN
.BEGIN %
IRS,0;
OUT3X(
NAMELIST[#]);
.END;
LL:
OUT1(
SPACE); %
IRS,
TAB;
.GOTO LL;
.END;
@
.PROCEDURE PUTARRAYVALUE;
.INTEGER VAL;
.BEGIN
VAL := @;
.IF K .GE SIZE .THEN
FAIL(
TOOMANYVALUES)
.ELSE
.BEGIN
INDEX :=
LOCAL +
K;
CODE[#] :=
VAL;
%
IRS,
K;
.END;
.END;
@
.PROCEDURE PUTADD;
.BEGIN # :=
POS; %
IRS,0;
NAMELIST[#] := @;
.END;
.PROCEDURE SDEBUG;
.BEGIN
.END;
.PROCEDURE SETFJADD;
.BEGIN
FJADD :=
LA;
%
IRS,
LA;
.END;
.PROCEDURE SETIDENT;
.INTEGER DOUBLE,
I;
.BEGIN
IDFLAG,
IDENT2,
DOUBLE :=
.Z;
.IF IDSYMBOL .THEN IDENT1 := @
.ELSE FAIL(
NOTALETTER);
.FOR I := -2
.DO
.BEGIN
.IF IDSYMBOL .THEN
IDENT1 := @
.SHDRL 5 +
IDENT1 .SHDLL 5
.ELSE .GOTO FIN;
.END;
.FOR I := -3
.DO
.BEGIN
.IF IDSYMBOL .THEN
.BEGIN IDENT2 := @
.SHDRL 5 +
IDENT2 .SHDLL 5;
DOUBLE := '100000;
.END .ELSE .GOTO FIN;
.END;
.WHILE IDSYMBOL .DO;
FIN:
RETAIN :=
BS;
KEPT := -1;
IDENT1 :=
IDENT1 +
DOUBLE;
.END;
.PROCEDURE SETKWITHPROCTYPE;
.BEGIN
.WHEN CLEVEL .EVEN .THEN FAIL(
NESTEDPROC);
K := 8;
.WHEN BASIC(
ACSYMBOL)
.THEN
.BEGIN %
IRS,
K;
NBS;
.END;
.WHEN BASIC(
CONDSYMBOL)
.THEN
.BEGIN %
IRS,
K; %
IRS,
K;
NBS;
.END;
FAILIFNOT(
PROCSYMBOL);
.END;
.PROCEDURE SETWORD;
.BEGIN
INDEX :=
.IF ADD .GE '1000
.THEN @ - '1000 +
LSTART .ELSE @;
CODE[#] :=
VALUE;
.END;
@
.PROCEDURE STACK;
.BEGIN ST[
STACKPOINTER] := @;
%
IRS,
STACKPOINTER;
.GOTO EXIT;
FAIL(
STFULL);
EXIT:
.END;
.PROCEDURE STATEMENT;
.INTEGER FORADDRESS;
.SWITCH S =
SBUG,
BEGIN,
IND,
AC,
DAP,
EXITT,
EXITF,
FOR,
IF,
WHILE,
BASSIGN,
REPT,
GET,
UNTIL,
XUNLESS,
EXIT,
GOTO,
XSYM,
WHEN;
.BEGIN
ENTER;
WORKING :=
.Z;
AGAIN:
.IF LETTER .THEN
.BEGIN IDENTIFIER;
.IF BASIC(
COLONSYMBOL)
.THEN
.BEGIN
.IF TYPE .NE LABEL .THEN
.BEGIN
NOTDECLAREDCHECK;
TYPE :=
LABEL;
MAKEDEC;
PUTADD(
LA);
.END
.ELSE
.BEGIN .IF LEVEL .ODD .THEN
.BEGIN .IF ADD .GEZ .THEN FAIL(
GLOB2LABEL)
.ELSE
.BEGIN PUTADD(
.SSP @);
INDEX :=
ADD;
CODE[#] :=
LOCAL;
.END
.END
.ELSE
.BEGIN .IF ADD .GEZ .THEN FAIL(
LOC2LABEL)
.ELSE .WHEN @
.NE '100777
.THEN
BACKPLUG(
.SSP @);
PUTADD(
LA);
.END
.END;
NBS;
.GOTO AGAIN;
.END
.ELSE .IF TYPE .AND '17776 = '10
.THEN PROCCALL
.ELSE
.BEGIN ID := -1;
ASSIGNMENTSTATEMENT;
.END
.END
.ELSE .FOR # :=
NUMOFTYPES .DO
.WHEN BASIC(
TYPES[#])
.THEN .GOTO S[#];
.GOTO COMMON;
SBUG:
GENERATE(
JSTI +
.ADDRESS SDEBUG);
NBS;
.GOTO COMMON;
BEGIN:
COMPSTATEMENT;
.GOTO COMMON;
IND:
AC:
ASSIGNMENTSTATEMENT;
.GOTO COMMON;
DAP:
CODESTATEMENT;
.GOTO COMMON;
EXITT:
EXITF:
.WHEN PROCPOSITION .LZ .THEN FAIL(
BADEXIT);
.WHEN BASIC(
EXITTRUE)
.THEN GENERATE(
IRS +
PROCPOSITION);
EXIT:
GENERATE(
.SSP PROCPOSITION +
JMPI);
NBS;
.GOTO COMMON;
REPT:
STACK(
LA);
NBS;
STATEMENT;
GENERATE(
UNSTACK +
JMPSO);
.GOTO COMMON;
BASSIGN:
NBS;
FAILIFNOT(
BECOMES);
EXPRESSION;
GENERATE(
IAB);
.GOTO COMMON;
FOR:
NBS;
.IF BASIC(
XSYMBOL)
.THEN
.BEGIN XASSIGNMENTSTATEMENT;
FORADDRESS :=
.Z;
.END
.ELSE
.BEGIN .IF BASIC(
STARSYMBOL)
.THEN
.BEGIN NBS;
FORADDRESS := '100000;
.END
.ELSE FORADDRESS :=
.Z;
IDENTIFIER;
.WHEN TYPE .NE INT .THEN FAIL(
FORNOTINT);
FORADDRESS :=
ADD +
FORADDRESS;
FAILIFNOT(
BECOMESSYMBOL);
EXPRESSION;
GENERATE(
STA +
FORADDRESS);
.END;
FAILIFNOT(
DOSYMBOL);
STACK(
LA);
STACK(
FORADDRESS);
STATEMENT;
GENERATE(
UNSTACK +
IRS);
GENERATE(
UNSTACK +
JMPSO);
.GOTO COMMON;
IF:
STMARK := -1;
IFSTATEMENT;
.GOTO COMMON;
WHILE:
@ :=
.Z; %
SKP;
UNTIL:
INVERT := '1000;
NBS;
STACK(
LA);
CONDITION;
STACK(
FJADD);
FAILIFNOT(
DOSYMBOL);
STATEMENT;
PLUGJUMP(
LA+1);
GENERATE(
UNSTACK +
JMPSO);
.GOTO COMMON;
GET:
GETMARKER := -1;
NBS;
IDENTIFIER;
TYPEFIRST :=
.Z;
.IF TYPE .NE TABLE .THEN FAIL(
GETWRONGTYPE)
.ELSE SUBSCRIPT;
.WHEN BSCOMMA .THEN .GOTO GET;
GETMARKER :=
.Z;
.GOTO COMMON;
GOTO:
NBS;
IDENTIFIER;
.IF TYPE =
LABEL .THEN
.BEGIN .IF LEVEL = 1
.THEN GENERATE(
ADD .AND '77777 +
JMPI)
.ELSE .BEGIN
.IF ADD .LZ .THEN
.BEGIN PUTADD('100000 +
LA);
GENERATE(
ADD .AND '777 +
JMPSO);
.END
.ELSE GENERATE(@ +
JMPSO);
.END
.END
.ELSE .IF TYPE =
SWTCH .THEN
.BEGIN
STACK(
ADD);
TYPEFIRST :=
.Z;
SUBSCRIPT;
GENERATE(
UNSTACK +
JMPI);
.END
.ELSE
.BEGIN
NOTDECLAREDCHECK;
TYPE :=
LABEL;
MAKEDEC;
PUTADD ('100000 +
LA);
GENERATE(
JMPSO + '777);
.END;
.GOTO COMMON;
XSYM:
XASSIGNMENTSTATEMENT;
.GOTO COMMON;
WHEN:
@ :=
.Z; %
SKP;
XUNLESS:
INVERT := '1000;
NBS;
CONDITION;
STACK(
FJADD);
FAILIFNOT(
THENSYMBOL);
STATEMENT;
PLUGJUMP(
LA);
COMMON:
LEAVE;
.END;