1,8c1,23
< %BEGIN;                                     !IMP15 COMPILER
< %OWNINTEGER ERR=0, OBJ=1, MAP=2;            !OUTPUT STREAMS
< %OWNINTEGER PC=37, QU=39;                   !SPECIAL SYMBOLS
< %OWNINTEGER MONI=4, NST=5, LE=6, GE=7, AR=8;!PRIM SUBROUTINE TAGS
< %OWNINTEGER ADEC=9, SH=10
< %OWNINTEGER ENT=16, FLT=17, PTXT=25
< %OWNINTEGER BAR=20, BGET=21, BPUT=22
< %OWNINTEGER BEG=111;                        !DECL CODE FOR BEGIN
---
> %BEGIN; !IMP15 COMPILER  30/10/78
> !OUTPUT STREAMS
> %CONSTINTEGER ERR=0, OBJ=1, MAP=2
> !PRIMITIVE ROUTINE TAGS
> %CONSTINTEGER MONI=4;                       !MONITOR
> %CONSTINTEGER NST=5;                        !NEST
> %CONSTINTEGER LE=6;                         !TEST LESS-THAN OR EQUAL
> %CONSTINTEGER GE=7;                         !TEST GREATER-THAN OR EQUAL
> %CONSTINTEGER AR=8;                         !ARRAY REFERENCE
> %CONSTINTEGER ADEC=9;                       !ARRAY DECLARATION
> %CONSTINTEGER SH=10;                        !SHIFT
> %CONSTINTEGER ENT=16;                       !PROCEDURE ENTRY/EXIT
> %CONSTINTEGER FLT=17;                       !FAULT TRAP
> %CONSTINTEGER BAR=20;                       !BYTE ARRAY-REF
> %CONSTINTEGER BGET=21;                      !BYTE FETCH
> %CONSTINTEGER BPUT=22;                      !BYTE STORE
> %CONSTINTEGER ADR=28;                       !ADDR
> %CONSTINTEGER INT=29;                       !INTEGER
> %CONSTINTEGER PTXT=38;                      !PRINT TEXT
> !DECLARATION CODES
> %CONSTINTEGER BEG=108;                      !BEGIN
> %CONSTINTEGER EXT=128, OWN=64, BODY=64
> %CONSTINTEGER REF=32, ARRAY=8, PROC=4
11,19c26,38
< %OWNINTEGER SYM;                            !CURRENT INPUT SYMBOL
< %OWNINTEGER SYMTYPE; !-2:LET, -1:DIG, 0:TERM, 1:OTHER, 2:KEYLET
< %OWNINTEGER DECL;                           !DECLARATOR TYPE
< %OWNINTEGER SECTION;                        !0:INSTR, 1:DATA
< %OWNINTEGER OWN;                            !OWN COUNT
< %OWNINTEGER FAULTY;                         !FAULT INDICATOR
< 
< %OWNINTEGER POS1;                           !START-OF-ATOM POSITION
< %OWNINTEGER POS;                            !CURRENT CHAR POSITION
---
> %OWNINTEGER LINES=0;                        !LINE COUNT
> %OWNINTEGER ICOUNT=0;                       !INSTRUCTION COUNT
> %OWNINTEGER SYM=0;                          !CURRENT INPUT SYMBOL
> %OWNINTEGER SYMTYPE=0;                      !-2:LET, -1:DIG, 0:TERM
>                                             ! 1:OTHER, 2:KEYLET
> %OWNINTEGER DECL=0;                         !DECLARATOR TYPE
> %OWNINTEGER SSTYPE=1;                       !STATEMENT TYPE
> %OWNINTEGER SECTION=0;                      !0:INSTR, 1:DATA
> %OWNINTEGER OWNC=0;                         !OWN COUNT
> %OWNINTEGER FAULTY=0;                       !FAULT INDICATOR
> !CURRENT INPUT LINE
> %OWNINTEGER POS1=0;                         !START-OF-ATOM POSITION
> %OWNINTEGER POS=0;                          !CURRENT CHAR POSITION
21,28c40,46
< 
< %INTEGER KMAX;                              !KEYDICT MAX (FIXED)
< %INTEGER DMAX;                              !NAME DICT MAX
< %OWNINTEGER DLIM=800;                       !UPPER BOUND (FIXED)
< %INTEGERARRAY DICT(32:DLIM)
< 
< %OWNINTEGER GLOBAL;                         !ZERO OR ENDOFPRIM TAG
< %OWNINTEGER TMAX;                           !TAG MAX
---
> !NAME DICTIONARY
> %OWNINTEGER DMAX=0;                         !NAME DICT MAX
> %CONSTINTEGER DBOUND=500;                   !UPPER BOUND (CHANGED FROM 350)
> %INTEGERARRAY DICT(1:DBOUND)
> !TAG INFO
> %OWNINTEGER GLOBAL=0;                       !ZERO OR ENDOFPRIM TAG
> %OWNINTEGER TMAX=0;                         !TAG MAX
31,33c49,50
< %INTEGERNAME TT0;                           !==TAGTYPE(0)
< %INTEGERNAME TTX;                           !==TAGTYPE(X)
< %INTEGERARRAY TAGTYPE,INDEX(0:210)
---
> %INTEGERNAME TT0,TTX;                       !==TAGTYPE(0),TAGTYPE(X)
> %INTEGERARRAY TAGTYPE,INDEX(0:223)
35,75c52,191
< !  VAL256+   VAL128  VAL64  VAL32  VAL16  VAL8  VAL0:7
< !     0         0     SET     1      0      0     000  LABEL
< ! BOUNDS AD     0      0      1      0      0     001  SWITCH
< !     0         0      0     OWN    NAME  BYTE    010  VAR
< !     0         0      0     OWN    NAME  BYTE    011  ARRAY
< !  GRAM AD  SAFE/EXT  BODY  STATIC  NAME  BYTE    100  MAP
< !  GRAM AD  SAFE/EXT  BODY  STATIC  NAME  BYTE?   101  FN
< !  GRAM AD  SAFE/EXT  BODY  STATIC  NAME    0     110  PRED
< !  GRAM AD  SAFE/EXT  BODY  STATIC  NAME    0     111  ROUT
< !     0         0      1      1      0      1     111  BEGIN (111)
< ! OTHER DECL VALUES NOT STORED IN TT
< !     0         0      0      0      0      1     110  SPEC (14)
< !     1         0      0      0      0      0     100  END  (260)
< !     1         0      0      0      0      0     101  ENDPROG  (261)
< 
< %INTEGER SS0,SS1,SS2,SS3;                   !GRAM START POINTS (FIXED)
< %INTEGER APP;                               !BASIC APP (FIXED)
< %INTEGER GMAX1;                             !ORIGINAL GRAM MAX (FIXED)
< %INTEGER GMAX;                              !GRAM MAX
< %INTEGERNAME P111;                          !==PHRASE(111) -- APP
< %INTEGERARRAY ATOMIC(64:111), PHRASE(96:111)
< %INTEGERARRAY GRAM(1:255)
< ! GRAM LAYOUT:  MORE<1> ORDER<2> LINK<8> CLASS<7>
< ! LINK = 255: END OF PHRASE
< ! LINK = 0: END OF SS
< 
< %INTEGER A;                                 !ATOM NODE POINTER
< %INTEGER P;                                 !PHRASE NODE POINTER
< %INTEGER SS;                                !SS POINTER
< %OWNINTEGER SSTYPE; !0:LAB, 1:DECL, 2:FPP, 3:STAT
< %INTEGERARRAY REF,CO,SUB(-100:-1)
< 
< %ROUTINESPEC COMPILE BLOCK(%INTEGER LEVEL,BTAG %INTEGERNAME BTYPE,GD)
< 
<     READ(GMAX1);  GMAX = GMAX1;  READ(KMAX);  DMAX = KMAX
<     READ(SS0);  READ(SS1);  READ(SS2);  READ(SS3)
<     %CYCLE X = 96,1,111;  READ(PHRASE(X));  %REPEAT
<     %CYCLE X = 64,1,111;  READ(ATOMIC(X));  %REPEAT
<     %CYCLE X = 1,1,255;  READ(GRAM(X));  %REPEAT
<     %CYCLE X = 32,1,511;  READ(DICT(X));  %REPEAT
<     P111 == PHRASE(111);  APP = P111
---
> !  VAL256+   VAL128  VAL64  VAL32  VAL0:15
> !     0         0     SET     0    0 0 0 0   LABEL
> !     0        EXT    OWN    REF   0 0 0 1   INTEGER  (EXT+OWN=CONST)
> !     0         0     OWN    REF   0 0 1 0   BYTE
> !  GRAM AD  SAFE/EXT  BODY   REF   0 1 0 0   PRED
> !  GRAM AD  SAFE/EXT  BODY   REF   0 1  T    T FN
> !     0         0      0      0    0 1 1 1   STRING
> ! BOUNDS AD     0      1      0    1 0 0 0   SWITCH
> !     0         0     OWN    REF   1 0  T    T ARRAY
> !  GRAM AD  SAFE/EXT  BODY   REF   1 1 0 0   ROUTINE
> !  GRAM AD  SAFE/EXT  BODY   REF   1 1  T    T MAP
> !     0         0      1      1    1 1 0 0   BEGIN
> ! NEVER STORED IN TAGTYPE
> !     0         0      0      1    0 1 0 0   SPEC
> !ANALYSIS RECORD
> %INTEGER SS;                                !START OF SS
> %CONSTINTEGER NODEBOUND=70
> %INTEGERARRAY REFCO,SUB(1:NODEBOUND)
> 
> !* GRAMMAR AND KEYDICT GENERATED BY TAKEON PROGRAM
> %OWNINTEGER GMAX1= 196
> %OWNINTEGER GMAX= 196
> 
> %OWNINTEGERARRAY PHRASE(112:127) = %C
>  194,  69,  72,  77,  81, 115, 125, 147,
>  153, 156, 159, 168, 173, 176, 188,   0
> 
> %OWNINTEGERARRAY ATOMIC(80:111) = %C
>   64,  70,  72,  77,  68,  69,  73,  67,
>   73,  73,  74,  77,  76,  77,  78,  78,
>   65,  65,  66,  66,  74,  78,  74,  12,
>   18,  15,  15,  65,  10,  15,   9,  42
> 
> %OWNINTEGERARRAY INITIAL(1:79) = %C
>             36225,   35842,   33923,    3332,   68741,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0, -118767,       0,       0,    3604,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0, -131041,
>        0,       0, -117854, -117981,    3876, -117595, -117722,       0,
>     2088,    4009,       0,       0,       0,       0,   33838,   33071,
>        0,       0,    1842,    1075,    1460,    3765,       0,   66615,
>    99384,   33849,   33850,   98363,       0,       0,       0,       0,
>    35664, -118944, -118429,       0,       0,       0,       0,       0,
>    35794, -118058, -118044,       0, -118196, -118061, -118043,       0
> 
> %OWNINTEGERARRAY GRAM(0:255) = %C
>        0,     756, -129612, -129999,    1140,  -94156,  -94155, -129132,
>        9, -126846,    4996,    1653, -128746,    1073, -131063,   33918,
>  -129978,    1095, -129999,    2676, -130640,       9,      10,    5134,
>     1137,    5329,    5745,    6129,    6526,    6517,   39367,   33913,
>    33909,    4465, -126452,     110,   37625, -126739,     110,    6726,
>    40441,    5376, -123378,       9,   38642, -127729,       9,   39027,
>  -127601,       9,    1074,    7825,   39667, -124020,     110, -123127,
>     7417, -123923,     110,    2832,    8070,    1088,    7040,    8262,
>  -122481, -123002,    1040, -122810,    8070,    9030, -122225,       0,
>     9358,    9594,    9610,    9850,      16,    9998,   10233,   10348,
>     9849, -118944, -118767, -118196, -118058, -118061, -131041, -117981,
>  -117854, -118429, -118044, -118043, -117722,   13477, -117492,   46494,
>  -131008,   46664, -117492,   46750,   46960,   47216,   32890,   32887,
>    46915,   32839,   46970,   79735,   65648,   79736, -116497,       0,
>    80231,     116,  112506, -115978,   15482,  -82774,  -82645,       0,
>    32768,   15862,   15222,  -82774,       0, -114546, -114004, -113852,
>    16890, -121227,   17402, -112979,   32768,     118,   32880,   17424,
>  -112870, -112741, -112612, -112979,   32768,   51450,   50301,   50428,
>    50555, -117971,       0, -111775, -113832,   17243,  -78819,       0,
>    65658, -111774, -113818,   17247, -117608, -117607,   32839, -110439,
>  -109800,   53629, -110438, -109669, -109796,       0,   53883,   53756,
>    54525, -109542, -109029,       0,   54652,   55165, -108902,       0,
>  -131007, -131001, -131006, -113847, -113851, -113843, -113846, -113842,
>  -121458,   23826,   24061,     104,   24299,   24332,   57338,   24681,
>    57594,   13162,   24974,   25210,      16,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0,
>        0,       0,       0,       0,       0,       0,       0,       0
> 
> %OWNINTEGERARRAY KDICT(32: 425) = %C
>        0,     387,     131,     403,     131,     131,     407,     131,
>      411,     415,     419,     431,     447,     451,     131,     475,
>      129,     129,     129,     129,     129,     129,     129,     129,
>      129,     129,     487,     490,     495,     523,     539,     131,
>      131,     556,     628,     656,     708,     752,     904,     128,
>      128,     972,    1152,     128,    1188,    1232,    1248,    1256,
>     1284,     128,    1348,    1440,    1552,    1604,     128,    1636,
>     1648,     128,     128,     131,    1695,     131,     131,     131,
>  -118367,  -64814,   66268,   66204,  106541,   65947,   65550,   65552,
>  -117462,   66331,   66522, -116949,  -65448,   65628,   66013,   65551,
>  -116051, -116162,  -65384,   65692,   65553,   66077, -115665,   66459,
>    66395,   65546,   65545, -114500, -114627, -114754,   69677,   65818,
>    77869,   65818, -113987,  -57332,   73773,   66142, -113347, -113474,
>   110637,   65882,  102445, -112188,    8782, -112349, -112470,  -60760,
>    65578,   71336,   68265, -111039, -111676,      82,   70696, -111197,
>  -111318,   70056,   71080,   68009,   71592, -110395,   10841,      69,
>    65728,    9415,      78,   65591, -108534, -109361,    8665,    8908,
>    65586, -108851,   10702,      84,   77827,    8909,   10830,   65547,
>    65536, -107711,    9946, -107862,   69864,   70888, -107325,      68,
>    71528, -107094,   69736,   70760, -102452, -105010,      88, -105271,
>       84, -105659,    9426,   10702,    8649,   73731,   10066,    9793,
>    73728,      84,   66847,      68, -104625,   65592,      70, -102842,
>       80, -103099,      82, -103351,    9167,    8402,      77,   65595,
>       77,   65593,    9938,   65594,    9801,      69,   65595,    8915,
>   -65489,   65584, -100671, -101559,   10575,   65556,    9422,    9299,
>  -101051,   65582,   10700,      69,   65583, -100148,    9813,      84,
>    65572,    8915,   66719,  -94266,  -98738,  -98993,   11603,  -99158,
>    70248,   71272,      84,   70568,    8916,    8903,      82,  -95295,
>   -96186,  -97075,  -97586,  -65470,   65606,    9921,      69,  -63422,
>    67654,   10305,  -96557,  -60603,   70470,    8912,      67,   66373,
>       78,  -95661,  -61115,   69958,    8912,      67,   65861,   10578,
>    11457,  -94770,   66116,    9921,      69,  -62910,   68166,   66356,
>       77,  -93360,      83,  -93526,   69800,   70824,  -93142,   70440,
>    71464,  -92607,   10825,   67817,  -92221,      68,   71656,  -91741,
>   -91862,   69928,   70952,   67881,   10063,   10825,   10575,   65573,
>    10831,   65580,  -90160,  -90286,   10071,   69635,   65579,      82,
>    70632,      82,  -89019,   10057,   10836,   11333,      84,   65574,
>     9412,    8387,    8916,  -88237,  -61179,   69894,    8912,      67,
>    65797,  -86587,   10959,    9428,    8910,  -86957,  -60667,   70406,
>     8912,      67,   66309,  -85296,  -85933,   10964,   10066,   66591,
>     9813,    7892,  -85443,   65571,   65570,    8389,      84,   65587,
>   -82111,  -82488,  -82736,  -83884,    9431,    8660,      72,   70145,
>   -83007,  -83249,    9426,    9166,   65990,      80,   66783,   10834,
>    65585,    8645,   67845,   10575,      84,   65536,      68,  -81501,
>   -81622,   70376,   71400,   68329,  -80447,  -80696,   10962,      69,
>    66655,   10053,   65558,      68,  -79837,  -79958,   70120,   71144,
>    68073,      78,  -79028,    9428,      76,   67061,   10693,      83,
>    66484,    9416,    8908,   66869,  -77373,   10575,  -77533,  -77654,
>    69992,   71016,   67945,      84,  -77014,   70184,   71208,  -76611,
>    65753,  106541
> 
> !!END OF GENERATED SECTION
> 
> %INTEGERNAME APP;                           !== PHRASE(112)
> %INTEGER BAPP;                              !BASIC APP IE LB EXP RB
> %INTEGERNAME MREF;                          !== MAP RESULT REF
> 
> %ROUTINESPEC COMPILE BLOCK(%INTEGER LEVEL, BTAG %INTEGERNAME BTYPE,GD)
> 
>     APP == PHRASE(112);  BAPP = APP
76a193
>     MREF == GRAM(INITIAL(34)>>7&255)
80d196
< 
83,85c199,204
< %ROUTINESPEC ANALYSE SS(%INTEGER CONT)
< %ROUTINESPEC COMPILE SS
< %INTEGER TBASE,DBASE,LSTACK,ESTACK,PMAX,AC,ATAG,DANGER,ACCESS
---
> %INTEGERFNSPEC GAPP
> %ROUTINESPEC FAULT(%INTEGER N)
> %ROUTINESPEC ANALYSE
> %ROUTINESPEC COMPILE
> %OWNINTEGER AC=\255, ACLIT=0
> %INTEGER TBASE,DBASE,LSTACK,ESTACK,PMAX,ATAG,DANGER,ACCESS,EXTIND,IBASE
87,90c206,215
<     LSTACK = 0;  ESTACK = 0
<     %IF BTYPE # BEG %THEN %START;           !PROCEDURE (NOT BEGIN)
<         ANALYSE SS(1);                      !FORMAL PARAMETERS
<         ->9 %IF BTYPE&80 # 64;              !SPEC ->
---
>     LSTACK = 3;  ESTACK = 0
>     %IF BTYPE # BEG %START;                 !PROCEDURE (NOT BEGIN)
>        ANALYSE;                             !FORMAL PARAMETERS
>        X = GAPP<<8
>        %IF BTYPE&(\255) # 0 %START
>           FAULT(18) %IF BTYPE&(\255) # X %AND GLOBAL # 0
>        %FINISH %ELSE %START
>           BTYPE = BTYPE+X
>        %FINISH
>        ->FIN %IF BTYPE&BODY = 0;            !SPEC ->
92c217
<     PRINT SS(MAP);  SELECT OUTPUT(OBJ)
---
>     PRINT SS(MAP+8) %IF BTAG # 0
94c219,220
<     AC = \255;  ATAG = 0
---
>     EXTIND = BTYPE&EXT;  BTYPE = BTYPE!!EXTIND
>     ATAG = 0;  IBASE = ICOUNT
96,107c222,235
<     AC=\PMAX %IF PMAX-1=TBASE %AND TAGTYPE(PMAX)&31=2
< 1:  %IF SYM = NL %AND LINE # 0 %THEN %START
<         LINE = LINE+1;  NEWLINE;            !LINE-END CODE
<     %FINISH
<     ANALYSE SS(0);  COMPILE SS %IF SS # 0
<     ->1 %IF DECL&4 = 0
<     %IF DECL&256 = 0 %THEN %START;          !BLOCK HEAD
<         COMPILE BLOCK(LEVEL+3,X,TAGTYPE(X),DANGER)
<         ->1 %UNLESS DECL = 261;             !PREMATURE ENDOFPROG
<     %FINISH
<     PRINT SS(MAP);  SELECT OUTPUT(OBJ)
< 9:  TMAX = TBASE;  DMAX = DBASE
---
>     AC=\PMAX %AND ACLIT=0 %IF PMAX-1=TBASE %AND TAGTYPE(PMAX)&62=0
>     %CYCLE
>        LINE = LINE+LINES
>        NEWLINES(LINES);                     !LINE-END CODE
>        LINES = 0
>        ANALYSE; COMPILE %IF SS # 0
>        %IF SSTYPE < 0 %START;               !START OR END OF BLOCK
>           AC = \255
>           %EXIT %IF SSTYPE<<1 # 0;          !END
>           COMPILE BLOCK(LEVEL+3,X,TAGTYPE(X),DANGER)
>        %FINISH
>     %REPEAT
>     PRINT SS(MAP)
> FIN:TMAX = TBASE;  DMAX = DBASE
111c239,240
<     SELECT OUTPUT(S);  %RETURN %IF POS = 0
---
> %INTEGER K,P
>     SELECT OUTPUT(S&7)
113,118c242,253
<     SPACES(LEVEL) %IF S = MAP
<     S = 1
< 1:  ->2 %IF S = POS %OR (S+1=POS %AND CHAR(S)=PC)
<     PRINT SYMBOL(CHAR(S));  S = S+1
<     ->1
< 2:  NEWLINE
---
>     SPACES(LEVEL) %AND POS1=0 %IF S # ERR
>     P = 1
>     %CYCLE
>        PRINT SYMBOL('^') %IF P = POS1
>        %EXIT %IF P = POS
>        K = CHAR(P);  P = P+1
>        %EXIT %IF K = NL %OR (K = '%' %AND P = POS)
>        PRINT SYMBOL(K)
>     %REPEAT
>     WRITE(ICOUNT-IBASE,5) %IF S = MAP
>     NEWLINE
>     SELECT OUTPUT(OBJ)
125,129c260,266
<     I = I&511+KMAX;  J = J&7
< 1:  %RETURN %IF J = 0;  J = J-1
<     %CYCLE L = 12,-6,0
<         K = DICT(I-J)>>L&63
<         PRINT SYMBOL(K+32) %IF K # 0
---
>     I = I&511;  J = J&7
>     %WHILE J # 0 %CYCLE
>        J = J-1
>        %CYCLE L = 12,-6,0
>           K = DICT(I-J)>>L&63
>           PRINT SYMBOL(K+32) %IF K # 0
>        %REPEAT
131c268,299
<     ->1
---
> %END
> 
> %INTEGERFN GAPP;                            !GRAMMAR FOR APP
> %CONSTINTEGER COMMA=15, LB=14
> %INTEGER I,L
> 
> %INTEGERFN CLASS(%INTEGER K)
>     %RESULT = K&15+80 %IF K&(ARRAY+PROC) # 0; !PROC AND ARRAY PARAMS
>     %RESULT = 122 %IF K&REF = 0;            !INTEGER->EXP(122)
>     %RESULT = 119 %IF K&2 = 0;              !INTEGERNAME->REF(119)
>     %RESULT = 120;                          !BYTEINTEGERNAME->BREF(120)
> %END
> 
> %ROUTINE SET GCELL(%INTEGER C)
>     C = L<<7+C;                             !LINK + CLASS
>     %WHILE L # GMAX %CYCLE
>        L = L+1;  %RETURN %IF GRAM(L) = C
>     %REPEAT
>     GMAX = GMAX+1;  L = GMAX;  GRAM(L) = C
> %END
> 
>     I = TMAX
>     %RESULT = 255 %IF I = TBASE;            !NULL APP (FOR NOW)
>     L = GMAX1;                              !')' CELL
>     %CYCLE
>        SET GCELL(CLASS(TAGTYPE(I)))
>        I = I-1
>        %EXIT %IF I = TBASE
>        SET GCELL(COMMA);                    !',' CELL
>     %REPEAT
>     SET GCELL(LB);                          !'(' CELL
>     %RESULT = L
135,136c303,307
< %SWITCH S(0:17)
<        PRINT SS(ERR);  PRINT SYMBOL('*')
---
> %SWITCH S(0:18)
>        POS1 = 0 %IF N > 2
>        PRINT SS(ERR) %IF POS # 0
>        SELECT OUTPUT(ERR)
>        PRINT SYMBOL('*')
138,152c309,321
< S(0):  %PRINTTEXT 'FORM';  ->1
< S(1):  %PRINTTEXT 'ATOM';  ->1
< S(2):  %PRINTTEXT 'NAME'
< 1:     SPACES(POS1);  PRINT SYMBOL(94);     !UP-ARROW
<        ->9
< S(3):  %PRINTTEXT 'DUPLICATE';  ->9
< S(4):  %PRINTTEXT 'MATCH';  ->9
< S(5):  %PRINTTEXT '%BEGIN';  ->8
< S(6):  %PRINTTEXT '%START';  ->8
< S(7):  %PRINTTEXT '%CYCLE';  ->8
< S(8):  %PRINTTEXT '%END';  ->8
< S(9):  %PRINTTEXT '%REPEAT';  ->8
< S(10): %PRINTTEXT '%FINISH';  ->8
< S(11): %PRINTTEXT '%RESULT';  ->8
< S(12): PRINT SYMBOL(QU)
---
> S(0):  %PRINTTEXT 'FORM';  ->F
> S(1):  %PRINTTEXT 'ATOM';  ->F
> S(2):  %PRINTTEXT 'NAME';  ->F
> S(3):  %PRINTTEXT 'SIZE'; ->F
> S(4):  %PRINTTEXT 'DUPLICATE';  ->F
> S(5):  %PRINTTEXT '%BEGIN';  ->M
> S(6):  %PRINTTEXT '%CYCLE';  ->M
> S(7):  %PRINTTEXT '%START'; ->M
> S(8):  %PRINTTEXT '%END';  ->M
> S(9):  %PRINTTEXT '%REPEAT';  ->M
> S(10): %PRINTTEXT '%FINISH';  ->M
> S(11): %PRINTTEXT '%RESULT';  ->M
> S(12): PRINT SYMBOL('''')
154,162c323,333
<        PRINT SYMBOL(QU)
< 8:     %PRINTTEXT ' MISSING';  ->9
< S(13): %PRINTTEXT 'BOUNDS';  ->9
< S(14): %PRINTTEXT 'INDEX';  ->9
< S(15): %PRINTTEXT 'CONTEXT';  ->10
< S(16): %PRINTTEXT 'ACCESS';  ->10
< S(17): %PRINTTEXT 'ORDER'
< 9:     FAULTY = 1
< 10:    NEWLINE;  SELECT OUTPUT(OBJ)
---
>        PRINT SYMBOL('''')
> M:     %PRINTTEXT ' MISSING';  ->F
> S(13): %PRINTTEXT 'BOUNDS';  ->F
> S(14): %PRINTTEXT 'INDEX';  ->F
> S(15): %PRINTTEXT 'CONTEXT';  ->E
> S(16): %PRINTTEXT 'ACCESS';  ->A
> S(17): %PRINTTEXT 'ORDER';  ->F
> S(18): %PRINTTEXT 'MATCH'
> F:     FAULTY = 1
> A:     ACCESS = -1
> E:     NEWLINE;  SELECT OUTPUT(OBJ)
166,169c337,342
< %ROUTINE ANALYSE SS(%INTEGER CONT)
< %INTEGER I,ATOM1,ATOM2,SUBATOM,HEAD,MAX,TYPE,DUP,TEXT,CLASS,LIM
< %OWNINTEGER QUOTE,KEY
< %INTEGERNAME INDEX0
---
> %ROUTINE ANALYSE
> %CONSTINTEGER COMMA=15
> %INTEGER ATOM1,ATOM2,SUBATOM,LAST,HEAD,MAX,DUP,TEXT,LIM,INDEX0
> %INTEGER K,N,S,G,CLASS,NMIN,NMAX
> %INTEGERNAME Z
> %OWNINTEGER QUOTE=0, KEY=0, GG=0
172,176c345,349
<     ->3 %UNLESS SYM = NL
< 1:  POS = 0;  POS1 = 0
< 2:  SYMTYPE = 1
< 3:  READ SYMBOL(SYM)
< 4:  POS = POS+1 %UNLESS POS = 73
---
>     ->2 %UNLESS SYM = NL
>     POS = 0;  POS1 = 0
> 1:  SYMTYPE = 1
> 2:  READ SYMBOL(SYM)
>     POS = POS+1 %UNLESS POS = 73
178,210c351,360
<     %RETURN %IF QUOTE # 0
<     ->2 %IF SYM = ' '
<     %IF SYM = PC %THEN %START
<         SYMTYPE = 2;  READ SYMBOL(SYM)
<         ->4 %UNLESS SYM='C' %AND NEXTSYMBOL=NL
<         READ SYMBOL(SYM)
<         ->1
<     %FINISH
<     %IF SYM # NL %THEN %START
<         !DICT(33:95) := LINK<9>:CODE<2>
<         SYM = SYM-32 %IF SYM >= 96
<         KEY = DICT(SYM)
<         SYMTYPE = KEY&3-2 %UNLESS KEY&3=0 %AND SYMTYPE=2
<     %FINISH %ELSE SYMTYPE = 0
< %END; !READ SYM
< 
< %ROUTINE LOOKUP(%INTEGER P)
< %INTEGER J,K
< %INTEGERNAME INDP
< 1:  %RETURN %IF P = LIM
<     INDP == INDEX0++P
<     %IF INDP&(\511) = HEAD %THEN %START
<         ->3 %IF MAX = DMAX
<         J = INDP&511+KMAX;  K = MAX
< 2:      %IF DICT(J) = DICT(K) %THEN %START
<             J = J-1;  K = K-1
<             ->2 %UNLESS K = DMAX
< 3:          TYPE = TAGTYPE(P);  ATOM2 = TYPE&7+40
<             SUBATOM = P
<             !GRAM FOR PARAMETERS
<             %IF TYPE&4#0 %THEN P111=TYPE>>8 %ELSE P111=APP
<             %RETURN
<         %FINISH
---
>     %IF SYM # NL %START
>        %RETURN %IF QUOTE # 0
>        ->1 %IF SYM = ' '
>        SYMTYPE=2 %AND ->2 %IF SYM = '%'
>       !KDICT(33:95) := LINK<9>:CODE<2>
>        SYM = SYM-32 %IF SYM >= 96
>        KEY = KDICT(SYM)
>        SYMTYPE = KEY&3-2 %UNLESS KEY&3=0 %AND SYMTYPE=2
>     %FINISH %ELSE %START
>        LINES = LINES+1;  SYMTYPE = QUOTE;   !0,>0
212,214c362
<     P = P-1
<     ->1
< %END;  !LOOKUP
---
> %END; !READ SYM
216,232c364,368
< %ROUTINE DECLARE IDENT
< %INTEGER T
<     %IF SUBATOM # 0 %THEN %START;           !IDENT ALREADY EXISTS
<         T = TYPE&255
<         %RETURN %IF DECL-64 = T; !LAB AFTER JMP, BODY AFTER SPEC
<         %RETURN %IF DECL=14 %AND T&4#0 %AND TYPE!!T=0; !SPEC
<         DUP = 1;  %RETURN %IF DECL = 0
<     %FINISH
<     DECL = 32 %IF DECL = 0;                 !JMP LAB
<     TMAX = TMAX+1;  SUBATOM = TMAX;  DMAX = MAX
<     TAGTYPE(TMAX) = DECL;  INDEX(TMAX) = HEAD+MAX-KMAX
< %END
< %ROUTINE CODE ATOM
< %OWNINTEGER PRE
< %INTEGER I,J,K,LAST
<     POS1 = POS;  LAST = ATOM1
<     ATOM1 = 1;  ATOM2 = 0;  SUBATOM = 0
---
> %ROUTINE CODE ATOM(%INTEGER TARGET)
> !TARGET (IF SPECIFIED) IS FIRST ATOM CLASS FROM GRAMMAR
> %INTEGER I,J,K
> 1:  POS1 = POS
>     ATOM1 = 9;  ATOM2 = 0;  SUBATOM = 0
234,237c370,374
<     ->20 %IF SYMTYPE = -2;                  !LETTER ->
<     ->15 %IF SYMTYPE < 0;                   !DIGIT ->
<     ->10 %IF QUOTE # 0;                     !QUOTED STRING ->
<     ->11 %IF SYM = QU;                      !QUOTE ->
---
>     ->NAME %IF SYMTYPE = -2;                !LETTER ->
>     ->NUMBER %IF SYMTYPE < 0;               !DIGIT ->
>     ->QUOTED %IF QUOTE # 0;                 !QUOTED SYMBOL ->
>     ->QUOTEMARK %IF SYM = ''''
>     ->STRING %IF SYM = '"'
240,251c377,397
< !DICT(96:KMAX) := MORE<1>:0<1>:LINK<9>:SYM<7>
< !                 OR MORE<1>:1<1>:SUBCLASS<10>:CLASS<6>
< 1:  I = KEY>>2;  READ SYM
< 2:  J = DICT(I)
<     %IF J&65536 = 0 %THEN %START
<         %IF J&127#SYM %OR SYMTYPE<0 %THEN %START
<             ->99 %UNLESS J < 0;  I = I+1
<         %FINISH %ELSE %START
<             I = J>>7&511;  READ SYM
<         %FINISH
<         ->2
<     %FINISH
---
> !KDICT(96:KMAX) := MORE<1>:0<1>:LINK<9>:SYM<7>
> !               OR MORE<1>:1<1>:SUBCLASS<10>:CLASS<6>
>     I = KEY>>2;  READ SYM
>     %CYCLE
>        J = KDICT(I)
>        %EXIT %IF J&65536 # 0
>        %IF J&127 # SYM %OR SYMTYPE < 0 %START
>           ->ERR %UNLESS J < 0
>           I = I+1
>        %FINISH %ELSE %START
>           K = J>>7&511;  READ SYM
>           %IF J > 0 %START
>              %IF K # 0 %START
>                 ->ERR %IF K # SYM %OR SYMTYPE < 0
>                 READ SYM
>              %FINISH
>              K = I+1
>           %FINISH
>           I = K
>        %FINISH
>     %REPEAT
254,293c400,411
<     %IF ATOM1 = 0 %THEN %START;             !EXT,OWN,BYTE,SHORT
<         ->99 %UNLESS PRE&SUBATOM = 0
<         PRE = PRE+SUBATOM;  ->1
<     %FINISH
<     ATOM2 = DICT(I+1)&63 %IF J < 0;         !VARIANT ATOM CLASS
<     %RETURN %UNLESS ATOM1&(\7) = 32;        !DECLARATOR
<     %IF PRE&32 # 0 %THEN %START;            !OWN
<         ->99 %UNLESS ATOM1=33 %OR ATOM1=35
<         ATOM1 = ATOM1+1
<     %FINISH
<     DECL = SUBATOM+PRE;  PRE = 0
<     DECL = DECL!!48 %IF LAST # 0 %AND DECL&4 # 0; !R PAR: SET DYN,NAME
<     %RETURN
< 
< 10: %IF LAST # 7 %THEN %START
<         ATOM1 = 7;  %RETURN;                !INFILTRATE COMMA
<     %FINISH
< 11: QUOTE = 1;  READ SYM
<     %IF LAST # 15 %THEN %START;             !LAST ATOM # PTEXT
<         ATOM1 = 50;  SUBATOM = SYM;         !SCONST
<         READ SYM %IF SYM = QU = NEXT SYMBOL
<         %RETURN %IF NEXT SYMBOL # QU
<         READ SYM
<     %FINISH %ELSE %START
<         ATOM1 = 49;  SUBATOM = TEXT;        !STRING
<         J = 0
< 12:     %UNLESS SYM=QU#NEXTSYMBOL %THEN %START
<             ->99 %IF TEXT = DMAX;           !TOO LONG
<             READ SYM %IF SYM = QU
<             %IF J&(\127) # 0 %THEN %START
<                 DICT(TEXT) = J;  TEXT = TEXT-1
<                 J = 0
<             %FINISH
<             J = J<<7+SYM
<             READ SYM
<             ->12
<         %FINISH
<         DICT(TEXT) = -131072+J;  TEXT = TEXT-1
<     %FINISH
<     QUOTE = 0;  READ SYM
---
>     ->1 %IF ATOM1 = 0 %AND SUBATOM = 0;     !% C NL, (SHORT)
>     ATOM2 = KDICT(I+1)&63 %IF J < 0;        !VARIANT ATOM CLASS
>     %RETURN %UNLESS ATOM1 < 8;              !DECLARATOR
>     DECL = 0 %UNLESS LAST < 8
>     !CUMULATE SUBATOM INFO IN DECL (FOR MULTI-WORD KEYWORDS)
>     DECL = DECL!!SUBATOM
>     !ADJUST PROCEDURE-TYPE PARAMETERS
>     DECL = DECL-BODY+REF %IF LAST # 0 %AND DECL&PROC # 0;  !PROC PAR
>     %RETURN %UNLESS ATOM1 = 0
>    !EXTERNAL, BYTE
>     ->1 %IF SYMTYPE > 0
> ERR:ATOM1 = -1
296,310c414,421
< !NUMERIC CONSTANT
< 15: ->20 %IF (LAST=0 %AND SECTION=0) %OR LAST = 9; !LAB OR JUMP
<     ATOM1 = 50;  SUBATOM = SYM-'0';         !SCONST
< 16: READ SYM
<     ->17 %IF SYMTYPE # -1
<     SUBATOM = (SUBATOM<<2+SUBATOM)<<1-'0'+SYM
<     ->16
< 17: %RETURN %UNLESS SYM = '_'
< !SPECIAL RADIX
<     I = SUBATOM;  SUBATOM = 0
<     READ SYM
<     ->99 %UNLESS SYMTYPE < 0
< 18: %IF SYMTYPE=-1 %THEN K=SYM-'0' %ELSE K=SYM-55
<     ->99 %IF K >= I
<     SUBATOM = SUBATOM+K
---
> QUOTED:
>     ATOM1 = COMMA %AND %RETURN %IF LAST # COMMA;  !INFILTRATE COMMA
> QUOTEMARK:
>     ->STRING %IF LAST = 38;                 !PRINTTEXT
>     QUOTE = SYM;  READ SYM
>     ATOM1 = 71;  SUBATOM = SYM;             !SCONST
>     READ SYM %IF SYM = QUOTE %AND NEXT SYMBOL = QUOTE
>     %RETURN %IF NEXT SYMBOL # QUOTE
312,335c423,442
<     ->17 %IF SYMTYPE >= 0
<     J = I;  K = SUBATOM;  SUBATOM = 0;      !MULTIPLY BY RADIX
< 19: SUBATOM = SUBATOM+K %IF J&1 # 0
<     K = K<<1;  J = J>>1
<     ->19 %IF J # 0
<     ->18
< 
< !IDENTIFIER
< 20: %IF LAST = 50 %THEN %START;             !PRECEDED BY CONST
<         ATOM1 = 19;  SUBATOM = 12;          !IMPLICIT MULT
<         %RETURN
<     %FINISH
<     HEAD = (SYM-32)<<6<<6;  MAX = DMAX
< 21: READ SYM;  ->25 %IF SYMTYPE >= 0
<     HEAD = HEAD+512;  MAX = MAX+1
<     J = SYM-32
<     READ SYM;  ->24 %IF SYMTYPE >= 0
<     J = J<<6+SYM-32
<     READ SYM;  ->24 %IF SYMTYPE >= 0
<     DICT(MAX) = J<<6+SYM-32
<     ->21
< 24: DICT(MAX) = J
< 25: ATOM1 = 48;  ATOM2 = ATOM1
<     LIM = TBASE;  LOOKUP(TMAX)
---
>     ->ENDQUOTE
> STRING:
>     QUOTE = SYM;  READ SYM
>     ATOM1 = 67; SUBATOM = TEXT;             !STRING
>     J = 0
>     %WHILE SYM # QUOTE %OR NEXTSYMBOL = QUOTE %CYCLE
>        READ SYM %IF SYM = QUOTE
>        %IF J&(\127) # 0 %START
>           DICT(TEXT) = J;  TEXT = TEXT-1
>           %IF TEXT = DMAX %START;           !TOO LONG
>              ATOM1 = -3;  TEXT = TEXT+1
>           %FINISH
>           J = 0
>        %FINISH
>        J = J<<7+SYM
>        READ SYM
>     %REPEAT
>     DICT(TEXT) = J-131072;  TEXT = TEXT-1
> ENDQUOTE:
>     QUOTE = 0;  READ SYM
337,341d443
< 99: ATOM1 = 0
< %END; !CODE ATOM
< 
< %INTEGERFN GAPP;                            !GRAMMAR FOR APP
< %INTEGER I,L
343,358c445,466
< %INTEGERFN CLASS(%INTEGER K)
<     %RESULT = K&15+69 %IF K&7 # 2;          !A(72),M(73),F(74),P(75),
<                                             !R(76),BA(80),BM(81)
<     %RESULT = 106 %IF K&16 = 0;             !INTEGER->EXP(106)
<     %RESULT = 103 %IF K&8 = 0;              !INTEGERNAME->REF(103)
<     %RESULT = 104;                          !BYTEINTEGERNAME->BREF(104)
< %END
< 
< %ROUTINE SET GCELL(%INTEGER C)
<     C = L<<7+C;                             !LINK + CLASS
< 1:  %IF L # GMAX %THEN %START
<         L = L+1;  %RETURN %IF GRAM(L) = C
<         ->1
<     %FINISH
<     GMAX = GMAX+1;  L = GMAX;  GRAM(L) = C
< %END
---
> NUMBER:
>     ->NAME %IF LAST=17 %OR (LAST=0 %AND SECTION=0); !JUMP OR LAB
>     ATOM1 = 71;                             !SCONST
>     I = 10;                                 !DECIMAL
>     %CYCLE
>        SUBATOM = 0
>        %CYCLE
>           %IF SYMTYPE=-1 %THEN K=SYM-'0' %ELSE K=SYM-'A'+10
>           ->ERR %IF K >= I
>           SUBATOM = SUBATOM+K
>           READ SYM
>           %EXIT %IF SYMTYPE >= 0
>           J = I;  K = SUBATOM;  SUBATOM = 0; !MULTIPLY BY RADIX
>           %WHILE J # 0 %CYCLE
>              SUBATOM = SUBATOM+K %IF J&1 # 0
>              K = K<<1;  J = J>>1
>           %REPEAT
>        %REPEAT
>        %RETURN %IF SYM # '_'
>        I = SUBATOM
>        READ SYM;  ->ERR %IF SYMTYPE >= 0
>     %REPEAT
360,369c468,496
<     %RESULT = 255 %IF TMAX = TBASE;         !NULL APP
<     I = TMAX;  L = GMAX1;                   !RB CELL
< 1:  SET GCELL(CLASS(TAGTYPE(I)))
<     I = I-1
<     %IF I # TBASE %THEN %START
<         SET GCELL(7);  ->1;                 !COMMA CELL
<     %FINISH
<     SET GCELL(6);                           !LB CELL
<     %RESULT = L
< %END
---
> %ROUTINE LOOKUP(%INTEGER D)
> %OWNINTEGER I;                              !OWN FOR OPTIMISATION
> %INTEGER J,K,L,M
>     I = INDEX0+TMAX+1;  L = INDEX0+LIM
> REP:I = I-1
>     ->NEW %IF I = L
>     ->REP %UNLESS INTEGER(I)&(\511) = HEAD
>     J = INTEGER(I)&511;  K = MAX
>     %WHILE K # DMAX %CYCLE
>        M = DICT(K)
>        ->REP %IF DICT(J) # M
>        J = J-1; K = K-1
>     %REPEAT
>     SUBATOM = I-INDEX0
>     TTX == TAGTYPE(SUBATOM);  ATOM1 = TTX&15+64
>     !SET UP GRAM FOR PARAMETERS
>     %IF TTX&PROC # 0 %THEN APP=TTX>>8 %ELSE APP=BAPP
>     !NON-DECLARATIVE CONTEXT
>     %RETURN %IF D&255 = 0
>     !SPEC FOR PROC PARAMETER
>     %RETURN %IF D = 36 %AND APP = 0
>     !LABEL AFTER JUMP, PROC AFTER SPEC
>     TTX=TTX+BODY %AND %RETURN %IF TTX&255+BODY = D
>     DUP = 1
> NEW:%RETURN %IF D = 0
>     TMAX = TMAX+1;  SUBATOM = TMAX
>     TTX == TAGTYPE(SUBATOM);  TTX = D;  ATOM1 = TTX&15+64
>     INDEX(TMAX) = HEAD+MAX;  DMAX = MAX
> %END;  !LOOKUP
371,372c498,519
< %ROUTINE ANALYSE(%INTEGER G)
< %INTEGER I,J,K,N,A1,NODE
---
> NAME:
>     HEAD = (SYM-32)<<12;  MAX = DMAX
>     %CYCLE
>        READ SYM;  ->25 %IF SYMTYPE >= 0
>        HEAD = HEAD+512;  MAX = MAX+1
>        J = SYM-32
>        READ SYM;  %EXIT %IF SYMTYPE >= 0
>        J = J<<6+SYM-32
>        READ SYM;  %EXIT %IF SYMTYPE >= 0
>        J = J<<6+SYM-32;  DICT(MAX) = J
>     %REPEAT
>     DICT(MAX) = J
> 25: ATOM1 = -2;  ATOM2 = 70;                !IDENT
>     LIM = TBASE;                            !LOCAL
>     LOOKUP(64) %AND %RETURN %IF LAST = 0 %AND SYM = ':'; !LABEL
>     LOOKUP(256) %AND %RETURN %IF LAST = 17; !JUMP
>     LOOKUP(DECL) %AND %RETURN %IF TARGET = 70 %AND DECL # 0; !IDENT
>     LIM = GLOBAL
>     %IF LAST = 40 %THEN LOOKUP(256) %ELSE LOOKUP(0); !MCODE,NORMAL
>     %RETURN %UNLESS ATOM1 = 65 %AND TTX&(\255) # 0
>     ATOM1 = 71;  SUBATOM = DICT(TTX>>8);    !CONSTINTEGER
> %END; !CODE ATOM
374,434c521,591
< %ROUTINE REORDER
< %OWNINTEGERNAME X,Y
< !STARTING AT END OF PHRASE,
< !  1) CHANGE FROM BACK-LINKED TO FORWARD-LINKED STRUCTURE
< !  2) DROP TRANSPARENT ATOMS
< !  3) REORDER AS SPECIFIED BY ORDERING CODE
<     K = 0
< 1:  %RETURN %IF N >= 0
<     I = REF(N);  J = CO(N)
<     %IF I&112 # 0 %THEN %START;             !CLASS >= 16
<         X == K;  I = I&98304
< 2:      %IF X # 0 %THEN %START
<             Y == REF(X)
<             %IF Y&98304 > I %THEN %START
<                 Y = Y-32768;  X == CO(X);   !DECREMENT ORDERING CODE
<                 ->2
<             %FINISH
<         %FINISH
<         CO(N) = X;  X = N
<     %FINISH
<     N = J
<     ->1
< %END
< 
<     A = 0;  A1 = 0;  N = 0;  NODE = 0;  P = -101
< 1:  J = GRAM(G)
<     K = J&127
<     ->10 %IF K = 0
<     CLASS = K
<     CLASS = ATOMIC(CLASS) %IF CLASS&64 # 0
<     %IF ATOM2=48 %AND 42<=CLASS<=47 %THEN %START
<         LIM = GLOBAL;  LOOKUP(TBASE)
<     %FINISH
<     %IF CLASS=ATOM1 %OR CLASS=ATOM2 %THEN %START; !ATOM MATCH
<         DECLARE IDENT %IF CLASS = 48
<         A = A-1;  ->90 %IF A = P
<         REF(A) = J;  CO(A) = N
<         SUB(A) = SUBATOM
<         ->15 %IF J&32640 = 0;               !END OF SS
<         ->5 %UNLESS K = 5;                  !AMBIGUOUS '(', ALAS
<     %FINISH %ELSE %START
<         %IF K >= 96 %THEN %START;           !PHRASE
<             P = P+1;  ->90 %IF P = A
<             REF(P) = J;  CO(P) = N
<             N = -P;  G = PHRASE(K)
<             ->1
<         %FINISH
<     %FINISH
<     G = G+1
<     ->1 %IF J < 0
< 5:  %IF NODE = A1 %THEN %START;             !LAST NODE FOR THIS ATOM
<         ->90 %IF NODE = A;                  !NO NEW NODES ADDED ->
<         A1 = A;  CODE ATOM;                 !READ NEXT ATOM
<     %FINISH
<     NODE = NODE-1;  N = NODE
<     ->11
< 10: REORDER;  N = -N;  SUB(N) = K
< 11: G = REF(N)>>7&255;                      !CONTINUATION
<     ->1 %IF G # 0
< 15: N = A;  REORDER;  SS = K
<     FAULT(3) %IF DUP # 0
---
> ! GRAM LAYOUT: MORE<1> ORDER<2> LINK<8> CLASS<7>
>     SS = 0;  SSTYPE = 1;  DECL = 0
>     ATOM1 = 0;  LAST = 0;  DUP = 0
>     TEXT = DBOUND;  INDEX0 = ADDR(INDEX(0))
>     MREF = MREF&(\127)+119;  MREF = MREF+1 %IF BTYPE&2 # 0
>     NMAX = 0;  NMIN = NODEBOUND+1;  N = 0
>     %IF GG = 0 %OR SECTION # 0 %START
>        READ SYM %IF SYMTYPE = 0
>        ->SKP %IF SYMTYPE = 0 %OR SYM = '!'
>        CODE ATOM(0);  ->SKP %IF ATOM1 = 11; !COMMENT
>     %FINISH
>     ->L4 %IF GG # 0
>     ->91 %IF ATOM1 <= 0
>     GG = INITIAL(ATOM1)
>     ->91 %IF GG = 0
>     SSTYPE = GG<<1&8_600000
>     %IF GG < 0 %START;                      !INIT ATOM FOR IMP
>        NMAX = 1;  REFCO(NMAX) = 0;  SUB(NMAX) = 1
>     %FINISH
> L1: LAST = ATOM1;  ATOM1 = 0
>     S = SUBATOM
> L2: CLASS = GG&127
>     %IF CLASS >= 24 %START;                 !NOT TRANSPARENT
>        NMIN = NMIN-1;  ->90 %IF NMIN = NMAX
>        SUB(NMIN) = S
> L3:    Z == N
>        %CYCLE;                              !INSERT CELL IN ORDER
>           K = Z&127
>           %EXIT %IF K = 0 %OR GG&98304 = 0
>           GG = GG-32768;  Z == REFCO(K)
>        %REPEAT
>        REFCO(NMIN) = CLASS<<7+K;  Z = Z!!K+NMIN
>     %FINISH
> L4: G = GG>>7&255
>     %CYCLE
>        GG = GRAM(G);  CLASS = GG&127
>        %EXIT %IF CLASS = 0
>        %IF CLASS < 112 %START
>           CLASS = ATOMIC(CLASS) %IF CLASS >= 80
>           CODE ATOM(CLASS) %IF ATOM1 = 0
>           ->L1 %IF CLASS = ATOM1 %OR CLASS = ATOM2
>           ->91 %IF GG >= 0
>           G = G+1
>        %FINISH %ELSE %START
>           NMAX = NMAX+1;  ->90 %IF NMAX = NMIN
>           REFCO(NMAX) = N; SUB(NMAX) = G
>           N = 0
>           G = PHRASE(CLASS)
>        %FINISH
>     %REPEAT
>     S = 0
>     %WHILE N # 0 %CYCLE;                    !REVERSE LINKS
>        Z == REFCO(N)
>        K = Z&127;  Z = Z!!K+S
>        S = N; N = K
>     %REPEAT
>     ->L5 %IF NMAX = 0
>     N = REFCO(NMAX);  G = SUB(NMAX)
>     NMAX = NMAX-1
>     K = GG;                                 !EXIT-POINT CODE
>     %CYCLE
>        GG = GRAM(G)
>        %EXIT %IF K = 0
>        ->91 %IF GG >= 0
>        K = K-32768;  G = G+1
>     %REPEAT
>     ->L2 %UNLESS S # 0 %AND Z&127 = 0;  !SINGLETON
>     CLASS = Z>>7;  !DON'T BOTHER WITH NEW NODE
>     ->L3
> L5: SS = S
>     FAULT(4) %IF DUP # 0
435a593
> 
437,464c595,599
< 90: ->91 %IF SYM = NL
<     READ SYM
<     ->90
< 91: %UNLESS ATOM2=48 %AND LIM=GLOBAL %THEN %START
<         %IF ATOM1>0 %THEN FAULT(0) %ELSE FAULT(1)
<     %FINISH %ELSE FAULT(2)
<     QUOTE = 0;  SYMTYPE = 0;  DECL = 0
< %END
< 
<     SS = 0;  DECL = 0;  ATOM1 = 0;  DUP = 0
<     TEXT = DLIM;  INDEX0 == INDEX(0)
<     ->5 %IF CONT # 0
<     READ SYM %IF SYMTYPE = 0
<     %IF SYMTYPE=0 %OR SYM='!' %THEN %START
< 1:      %RETURN %IF SYMTYPE = 0;  READ SYM
<         ->1
<     %FINISH
<     CODE ATOM;  ->1 %IF ATOM1 = 3;          !COMMENT ->
<     %IF ATOM1=48 %AND (SYM=':' %OR ATOM2=41) %THEN %START
<         DECL = 96
<         SSTYPE = 0;  ANALYSE(SS0);          !LABEL
<     %FINISH %ELSE %START
<         %IF DECL # 0 %OR SECTION # 0 %THEN %START
<             SSTYPE = 1;  ANALYSE(SS1);      !DECLARATION
<         %FINISH %ELSE %START
<             SSTYPE = 3;  ANALYSE(SS3);      !STATEMENT
<         %FINISH
<     %FINISH
---
> 90: ATOM1 = -3
> 91: READ SYM %WHILE SYM # NL
>     %IF ATOM1 < 0 %THEN FAULT(-ATOM1) %ELSE FAULT(0)
>     QUOTE = 0;  SYMTYPE = 0;  DECL = 0;  SECTION = 0
>     GG = 0
466,481c601,611
< 5:  CODE ATOM
<     SSTYPE = 2;  ANALYSE(SS2);              !FORMAL PARAMETERS
<     I = GAPP<<8
<     %IF BTYPE&(\255) # 0 %THEN %START
<         FAULT(4) %IF BTYPE&(\255)#I %AND GLOBAL#0
<         BTYPE = BTYPE+64;                   !SET 'BODY'
<     %FINISH %ELSE BTYPE = BTYPE+I
< %END; !ANALYSE SS
< 
< 
< %ROUTINE COMPILE SS
< %INTEGER I,J,K,L,LINK,NEXT,CLASS,DCLASS,REFDEST,BOWN,RANGE
< %INTEGER PEND,APEND,PENDOPR,LABEL,ELSE,LTAG,LNEST,SINGLE
< %INTEGER CONTROL,START,INC,END,ILIT,ELIT
< %OWNINTEGER LIT,ACLIT,LIT1
< %SWITCH C(0:111), D(32:37)
---
> SKP:READ SYM %WHILE SYMTYPE # 0
> %END; !ANALYSE
> 
> 
> %ROUTINE COMPILE
> %CONSTINTEGER LAC=68,LAD=95,TAD=71,ADA=64,DAC=65,DAD=93
> %INTEGER I,J,K,NEXT,LINK,CLASS,REFDEST,BOWN
> %INTEGER PEND,PEND1,PENDOPR,LABCODE,ELSE,MAIN,LTAG,LNEST,FINAL
> %INTEGER CONTROL,INC,END,ILIT,ELIT
> %OWNINTEGER LIT=0,LIT1=0
> %SWITCH C(1:112)
485,487c615,619
<     %RETURN %IF X = 0;  I = !X!
< 1:  PRINT SYMBOL(I&15+'0');                 !'HEX' DIGIT
<     I = I>>4;  ->1 %IF I # 0
---
>     I = !X!
>     %WHILE I # 0 %CYCLE
>        PRINT SYMBOL(I&15+'0');              !'HEX' DIGIT
>        I = I>>4
>     %REPEAT
490a623,635
> %ROUTINE PLANT NAME(%INTEGER X);            !PROCEDURES, EXT SPECS
> %INTEGER I,J
> %ROUTINE NEXT
>     SPACE
>     J = J-1 %AND PR(DICT(I-J)) %IF J # 0
> %END
>     I = INDEX(X);  J = I>>9&7
>     PR(I&(\511)+TAGTYPE(X)&15);             !SYM1+LENGTH+TYPE
>     I = I&511
>     NEXT;  NEXT
>     SPACE
> %END
> 
493,498c638,646
<     %IF LEVEL < 0 %THEN %START
<         %IF SECTION = 0 %THEN %START
<             PRINT SYMBOL('(');  T = X
<         %FINISH %ELSE %START
<             PR(T);  PRINT SYMBOL(')')
<         %FINISH
---
>     %IF LEVEL < 0 %START
>        %IF SECTION = 0 %START
>           PRINT SYMBOL('(');  T = X
>        %FINISH %ELSE %START
>           PR(T);  PRINT SYMBOL(')')
>           %IF GLOBAL # 0 %START;  !EXTERNAL NOT PERM
>              PLANT NAME(T);  PR(T);  PRINT SYMBOL('!')
>           %FINISH
>        %FINISH
509,510c657,658
< %ROUTINE PLANT(%INTEGER V);                 !PLANT VALUE
<     PR(V);  PRINT SYMBOL('#')
---
> %ROUTINE OP(%INTEGER OP);                   !OUTPUT OP-CODE
>     PRINT SYMBOL(OP);  ICOUNT = ICOUNT+1
513,514c661,662
< %ROUTINE OP(%INTEGER OP);                   !OUTPUT OP CODE
<     PRINT SYMBOL(OP)
---
> %ROUTINE PLANT(%INTEGER V);                 !PLANT VALUE
>     PR(V);  OP('#')
518,528c666,676
<     %IF PENDOPR >= 0 %THEN %START
<         SINGLE = 0 %UNLESS NEXT = 0 %AND LINK = 0
<         PENDOPR = PENDOPR!!SINGLE;          !INVERT SKIP IF SINGLE
<         %IF PENDOPR # 0 %THEN %START
<             PR(PENDOPR);  OP(79);           !OPR
<         %FINISH
<         %IF SINGLE = 0 %THEN %START
<             LABEL = L;  PR(LMIN);  OP(76);  !JMP
<         %FINISH
<         DEF(LTAG-1) %IF LNEST&1 # 0
<         PENDOPR = -1;  ACCESS = 1
---
>     %IF PENDOPR >= 0 %START
>        FINAL = 0 %UNLESS NEXT = LINK
>        PENDOPR = PENDOPR!!FINAL;            !INVERT SKIP IF FINAL
>        %IF PENDOPR # 0 %START
>           PR(PENDOPR);  OP(79);             !OPR
>        %FINISH
>        %IF FINAL = 0 %START
>           LABCODE = MAIN;  PR(LMIN);  OP(76); !JMP
>        %FINISH
>        DEF(LTAG-1) %IF LNEST&1 # 0
>        PENDOPR = -1;  ACCESS = 1
534c682,686
<     PRINT(NST);  OP(66);  AC = \AC;         !JMS NST
---
>     PRINT(NST);  OP(66);  AC = \AC;         !JMS NST (PRESERVES AC)
> %END
> 
> %ROUTINE POP
>     OP(84);  AC = 255;                      !LAC* T0
538c690
< %INTEGER T
---
> %INTEGER C
541,545c693,703
<     %IF PEND = 0 %THEN %START;              !CONSTANT
<         %UNLESS \AC=0 %AND ACLIT=LIT %THEN %START
<             PRINT(LIT);  OP(36);            !LAL LIT (PSEUDO-OP)
<             ACLIT = LIT
<         %FINISH
---
>     %UNLESS \AC = PEND %START
>        %IF PEND = 0 %START;                 !CONSTANT
>           PRINT(LIT);  OP(36);              !LAC #LIT (PSEUDO-OP)
>        %FINISH %ELSE %START
>           C = LAC; C = LAD %IF PEND&256 # 0
>           %IF LIT # 0 %START
>              PRINT(LIT);  OP(36)
>              C = TAD;  C = ADA %IF PEND&256 # 0
>           %FINISH
>           PRINT(PEND&255);  OP(C)
>        %FINISH
547,550c705,735
<         %UNLESS \AC = PEND %THEN %START
<             T = PEND&255;  PRINT(T)
<             %IF T=PEND %THEN OP(68) %ELSE OP(95); !LAC OR LAD
<         %FINISH
---
>        %IF ACLIT # LIT %START
>           %IF PEND = 0 %START
>              PRINT(LIT);  OP(36)
>           %FINISH %ELSE %START
>              PRINT(LIT-ACLIT);  OP(39);     !TAD #
>           %FINISH
>        %FINISH
>     %FINISH
>     AC = PEND;  ACLIT = LIT;  PEND = -1
> %END
> 
> %ROUTINE LOAD(%INTEGER T);                  !LOAD AC
>     EXPEND;  PEND = T;  LIT = 0
> %END
> 
> %ROUTINE DO(%INTEGER C);                    !(ADD),TAD,AND,XOR,SAD
>     %IF PEND >= 0 %START
>        %IF PEND = 0 %START;                 !CONSTANT
>           PRINT(LIT);  OP(C-32);            !PSEUDO-OP
>        %FINISH %ELSE %START
>           %IF LIT # 0 %START
>              %IF C = TAD %START
>                 PRINT(LIT);  OP(39);        !TAD #LIT (PSEUDO-OP)
>              %FINISH %ELSE %START
>                 EXPEND;  ->1
>              %FINISH
>           %FINISH
>           PRINT(PEND);  OP(C)
>        %FINISH
>     %FINISH %ELSE %START
> 1:     OP(C+16);                            !<OP>* T0
552,572c737
<     AC = PEND;  PEND = -1
< %END
< 
< %ROUTINE LAC(%INTEGER T);                   !LOAD AC
<     EXPEND;  PEND = T
< %END
< 
< %ROUTINE LAL(%INTEGER L);                   !LOAD AC LITERAL
<     EXPEND;  PEND = 0;  LIT = L
< %END
< 
< %ROUTINE DO(%INTEGER I);                    !ADD,TAD,AND,XOR,SAD
<     %IF PEND >= 0 %THEN %START
<         %IF PEND = 0 %THEN %START;          !CONSTANT
<             PRINT(LIT);  OP(I-32);          !PSEUDO-OP
<         %FINISH %ELSE %START
<             PRINT(PEND);  OP(I)
<         %FINISH
<         PEND = -1
<         AC = 255 %UNLESS I = 75;            !SAD
<     %FINISH %ELSE OP(I+16);                 !<OP>* T0
---
>     PEND = -1;  AC = 255 %UNLESS C = 75;    !SAD
575,578c740,744
< %ROUTINE DAC(%INTEGER T);                   !DEPOSIT AC
<     %IF PEND = 0 %AND LIT = 0 %THEN %START
<         PEND = -1;  AC = \255 %IF \AC = T
<         SINGLE = 512;  PRINT(T);  OP(67);   !DZM T
---
> %ROUTINE STORE(%INTEGER T);                 !DEPOSIT AC
> %CONSTINTEGER DZM=67, ISZ=73
>     %IF PEND = 0 %AND LIT = 0 %START
>        PEND = -1;  AC = \255 %IF \AC = T
>        FINAL = 512; PRINT(T);  OP(DZM)
580,582c746,754
<         EXPEND
<         AC = T %IF PENDOPR < 0;  AC = \AC
<         SINGLE = 512;  PRINT(T);  OP(65);   !DAC T
---
>        %IF PEND = T %AND LIT = 1 %AND \AC # T %START
>           PEND = -1
>           FINAL = 512;  PRINT(T);  OP(ISZ)
>           OP(79);                           !NOP
>        %FINISH %ELSE %START
>           EXPEND
>           AC=T %AND ACLIT=0 %IF PENDOPR < 0;  AC = \AC; !??
>           FINAL = 512;  PRINT(T);  OP(DAC)
>        %FINISH
591,592c763,764
< %ROUTINE CMA;                               !COMPLEMENT AC
<     OPR(1)
---
> %ROUTINE NOT;                               !COMPLEMENT AC
>     %IF PEND # 0 %THEN OPR(1) %ELSE LIT=\LIT
596,598c768,771
<     %IF PEND # 0 %THEN %START
<         CMA;  PRINT(1);  OP(39);            !CMA:TAD #1
<     %FINISH %ELSE LIT = -LIT
---
>     %IF PEND < 0 %START
>        PRINT(-1);  OP(39);
>     %FINISH %ELSE LIT = LIT-1
>     NOT
601,602c774,775
< %ROUTINE JMS(%INTEGER T);                   !SUBROUTINE JUMP
<     EXPEND;  PRINT(T);  OP(66);  AC = 255
---
> %ROUTINE CALL(%INTEGER T);                  !SUBROUTINE JUMP
>     EXPEND;  PRINT(T);  OP(66);  AC = 255;  !JMS T
606,607c779,780
<     %IF PEND >= 0 %THEN %START;             !SECOND PARAM SIMPLE
<         PRINT(2);  OP(65);  AC = \AC;       !DAC T2
---
>     %IF PEND >= 0 %START;                   !SECOND PARAM SIMPLE
>        PRINT(2);  OP(DAC);  AC = \AC
609,610c782
<         DAC(1);  OP(84);  DAC(2);           !DAC T1:LAC* T0:DAC T2
<         PEND = 1;                           !LAC T1
---
>        STORE(1);  POP;  STORE(2);  LOAD(1)
612c784
<     JMS(T)
---
>     CALL(T)
615c787
< %ROUTINE JMP(%INTEGER T);                   !JUMP
---
> %ROUTINE JUMP(%INTEGER T);                  !JUMP
620c792
<     PRINT(MONI);  OP(82);  PLANT(N&255);    !JMS* MONI: FLT-NUM
---
>     PRINT(MONI);  OP(82);  PLANT(N&255+256);!JMS* MONI: FLTNUM
625,626c797
<     %IF TTX&8=0 %THEN JMS(AR) %ELSE JMS(BAR); !WORD,BYTE
<     PRINT(X);  OP(95);                      !LAD X
---
>     CALL(AR);  PRINT(X);  OP(LAD)
629,634c800,801
< %ROUTINE PLANT OWN
<     OWN = OWN-1
<     %IF OWN&BOWN = 0 %THEN %START
<         LIT = LIT<<9+LIT1 %IF BOWN # 0
<         PLANT(LIT)
<     %FINISH %ELSE LIT1 = LIT
---
> %ROUTINE BAREF
>     CALL(BAR);  PRINT(X);  OP(LAD)
637,650c804,809
< %ROUTINE PLANT NAME(%INTEGER OP);           !EXTERNALS
< %INTEGER I,J
< %ROUTINE NEXT
<     SPACE
<     %IF J # 0 %THEN %START
<         J = J-1;  PRINT(DICT(I-J))
<     %FINISH
< %END
<     PRINT(X);  SPACE;                       !TAG
<     I = INDEX(X);  J = I>>9&7
<     PRINT(I&(\511)+TTX&63);                 !SYM1+LENGTH+TYPE
<     I = I&511+KMAX
<     NEXT;  NEXT
<     PRINT SYMBOL(OP)
---
> %ROUTINE PLANT OWN
>     OWNC = OWNC-1
>     %IF OWNC&BOWN = 0 %START
>        LIT = LIT<<9+LIT1 %IF BOWN # 0
>        PLANT(LIT)
>     %FINISH %ELSE LIT1 = LIT
655,659c814,817
< 1:  %IF LSTACK # 0 %THEN %START
<         FAULT(LSTACK&1+9)
<         LMIN = LMIN+2;  LSTACK = LSTACK>>2
<         ->1
<     %FINISH
---
>     %WHILE LSTACK # 3 %CYCLE
>        FAULT(LSTACK&1+9)
>        LMIN = LMIN+2;  LSTACK = LSTACK>>2
>     %REPEAT
662,701c820,866
<     PLANT(0) %IF DANGER # 0;  I = -1
< 6:  %IF X # TBASE %THEN %START
<         TTX == TT0++X;  K = TTX&255
<         FAULT(12) %IF K = 32 %OR K&196 = 4; !LABEL OR PROC MISSING
<         %IF K = 33 %THEN %START;            !SWITCH
<             J = TTX>>8;  ->8 %IF J = 0
<             SWOP;  DEF(X);  PLANT(DICT(J-1))
<             J = DICT(J);  PLANT(J)
< 7:          OP(79);  J = J-1;  ->7 %IF J>0; !NOP (JMP SET BY LOAD)
<             SWOP
<         %FINISH
<         %IF K&32 = 0 %THEN %START;          !DYNAMIC
<             %IF K&23 = 2 %AND DANGER = 0 %THEN %START
<                 DEF(X);                     !DEFINE TAG DIRECT
<             %FINISH %ELSE %START
<                 DEF(-X);                    !DEFINE TAG INDIRECT
<             %FINISH
<             %IF K&23 = 2 %AND DANGER # 0 %THEN %START
<                 PLANT(-1);                  !POINTER SLOT
<             %FINISH %ELSE %START
<                 PLANT(0)
<             %FINISH
<             I = I-1
<         %FINISH
< 8:      X = X-1
<         ->6
<     %FINISH
<     %IF BTAG # 0 %THEN %START
<         DEF(BTAG);  PLANT(0);               !ENTRY POINT
<         %IF DANGER = 0 %THEN %START
<             ->25 %IF PMAX = TBASE
< 16:         PRINT(PMAX);  OP(93);           !DAD PMAX
<             PMAX = PMAX-1
<             ->25 %IF PMAX = TBASE;  OP(84); !LAC* T0
<             ->16
<         %FINISH
<         J = PMAX-TBASE;  J = J-1 %IF J # 0
<         JMS(ENT);                           !JMS ENTRY/EXIT
<         PLANT(I);  PLANT(I+J-1);            !-SLOTS:-NEST
< 25:     %IF BTAG#DANGER>0 %THEN GD=BTAG %ELSE BTYPE=BTYPE+128
---
>     PLANT(0) %IF DANGER # 0
>     I = -1
>     %WHILE X # TBASE %CYCLE
>        TTX == TT0++X;  K = TTX&255
>        %IF K = OWN+ARRAY %START;            !SWITCH
>           J = TTX>>8
>           %IF J # 0 %START
>              SWOP;  DEF(X);  PLANT(DICT(J-1))
>              J = DICT(J);  PLANT(J)
>              OP(79) %AND J=J-1 %WHILE J > 0; !NOP (JMP SET BY LOAD)
>              SWOP
>           %FINISH
>        %FINISH
>        %IF K&(EXT+OWN) = 0 %START
>           %IF K = 0 %OR K&(PROC+REF) = PROC %THEN FAULT(12) %ELSE %START
>           %IF K&(REF+ARRAY+PROC) = 0 %AND DANGER = 0 %START
>              DEF(X);                        !DEFINE TAG DIRECT
>           %FINISH %ELSE %START
>              DEF(-X);                       !DEFINE TAG INDIRECT
>           %FINISH
>           %IF K&(REF+ARRAY+PROC) = 0 %AND DANGER # 0 %START
>              PLANT(-1);                     !POINTER SLOT
>           %FINISH %ELSE %START
>              PLANT(0)
>           %FINISH
>           I = I-1
>        %FINISH
>        %FINISH
>        X = X-1
>     %REPEAT
>     %IF BTAG # 0 %START
>        DEF(BTAG);  PLANT(0);                !ENTRY POINT
>        %IF DANGER = 0 %START
>           %IF PMAX # TBASE %START
>              %CYCLE
>                 PRINT(PMAX);  OP(DAD)
>                 PMAX = PMAX-1
>                 %EXIT %IF PMAX = TBASE
>                 POP
>              %REPEAT
>           %FINISH
>        %FINISH %ELSE %START
>           J = PMAX-TBASE;  J = J-1 %IF J # 0
>           CALL(ENT);                        !JMS ENTRY/EXIT
>           PLANT(I);  PLANT(I+J-1);          !-SLOTS:-NEST
>        %FINISH
>        %IF BTAG#DANGER>0 %THEN GD=BTAG %ELSE BTYPE=BTYPE+EXT
707,708c872,891
<     PEND = -1;  LIT = 0;  RANGE = 0
<     LABEL = 0;  ELSE = 0;  PENDOPR = -1
---
> 
> %ROUTINE GET NEXT
> %INTEGER I
>     %IF NEXT = 0 %START
>        NEXT = REFCO(LINK)&127;  LINK = SUB(LINK)
>     %FINISH
>     %CYCLE
>        X = SUB(NEXT);  TTX == TT0++X
>        I = REFCO(NEXT);  CLASS = I>>7
>        %EXIT %IF CLASS < 112 %OR X = 0;     !ATOM OR NULL PHRASE
>        %IF I&127 # 0 %START
>           SUB(NEXT) = LINK;  LINK = NEXT
>        %FINISH
>        NEXT = X
>     %REPEAT
>     NEXT = I&127
> %END
> 
>     PEND = -1;  LIT = 0
>     LABCODE = 0;  ELSE = 0;  PENDOPR = -1
710,735c893,902
<     LINK = 0;  NEXT = SS
<     %IF ACCESS=0 %AND SSTYPE=3 %AND REF(-1)&127#58 %THEN %START
<         FAULT(16);  ACCESS = -1;            !INACCESSIBLE STATEMENT
<     %FINISH
< 1:  X = SUB(NEXT)
<     %IF X < 0 %AND NEXT <= P %THEN %START;  !PHRASE
<         %IF CO(NEXT) # 0 %THEN %START
<             SUB(NEXT) = LINK;  LINK = NEXT
<         %FINISH
<         NEXT = X
<         ->1
<     %FINISH
<     CLASS = REF(NEXT)&127;  NEXT = CO(NEXT)
<     ->C(X) %IF CLASS <= 29 %OR CLASS = 100
<     TTX == TT0++X;                          !FOR USE WHEN X IS TAG
<     ->C(CLASS) %UNLESS CLASS = 48;          !IDENT
<     ->D(DCLASS)
< 8:  FAULT(4) %IF TTX&8 # RANGE
<     RANGE = 0
< 9:  ->1 %IF NEXT # 0
<     ->10 %IF LINK = 0
<     NEXT = CO(LINK);  LINK = SUB(LINK)
<     ->9
< 10: %RETURN %IF LABEL = 0
<     JMP(-(LMIN+1)) %IF LABEL = 2;           !JUMP BACK FOR LOOPS
<     DEF(LMIN) %UNLESS LABEL = 3
---
>     NEXT = SS;  LINK = 0
>     FAULT(16) %IF SSTYPE = 0 %AND ACCESS = 0
> 1:  GET NEXT
> 2:  ->C(X) %IF CLASS <= 31;                 !OPERATORS,SIMP
>     ->C(CLASS)
> 9:  ->1 %IF NEXT # LINK
> 10: %RETURN %IF LABCODE = 0
> 11: JUMP(-(LMIN+1)) %AND ACCESS=0 %IF LABCODE&1=0; !JUMP BACK FOR LOOPS
>     %RETURN %IF LABCODE = 0
>     DEF(LMIN) %UNLESS LABCODE = 3
738a906
> 
740,755c908,948
< C(32):C(33):C(34):C(35):C(36):C(37):        !DECLARATORS
<     DCLASS = CLASS;                         !FOR FOLLOWING IDENTS
<     ->1
< 
< %ROUTINE SET SIZE(%INTEGERNAME I)
<     PEND = -1;  I = LIT-LIT1+1
<     %RETURN %IF 1 <= I <= 4096
<     FAULT(13);  I = 200
< %END
< D(32):                                      !SWITCH
<     DMAX = DMAX+2;  TTX = DMAX<<8+TTX
<     DICT(DMAX-1) = -LIT
<     SET SIZE(DICT(DMAX))
<     ->9
< D(33):->9;                                  !INTEGER
< D(34):                                      !OWNINTEGER
---
> %INTEGERFN SIZE
> %INTEGER I
>     I = LIT-LIT1+1
>     %IF I <= 0 %OR I > 4095 %START
>        FAULT(13);  I = 200
>     %FINISH
>     %RESULT = I
> %END
> 
> %ROUTINE SAVE(%INTEGER V)
>     DMAX = DMAX+1;  DICT(DMAX) = V
> %END
> 
> C(70):                                      !IDENT
>     %IF TTX&OWN = 0 %START
>        ->811 %IF TTX&EXT # 0
>        ->9 %IF TTX&(REF+ARRAY) # ARRAY;     !SCALAR
>        %IF TTX&2 # 0 %START;                !BYTE
>           PRINT(3);  OP(67);                !DZM T3 (AS INDIC)
>        %FINISH
>        %IF AC >= 0 %START;                  !FIRST IN GROUP
>           FAULT(17) %IF LSTACK # 3
>           JMSX(ADEC);                       !JMS ADEC
>        %FINISH %ELSE %START;                !BOUNDS ALREADY SET
>           LOAD(1);  CALL(ADEC);             !LAC T1:JMS ADEC
>        %FINISH
>        ATAG = X;  PRINT(ATAG);  OP(DAD)
>        AC = \255
>        ->9
>     %FINISH
>     OWNC = 0;  PEND = -1
>     %IF TTX&3 = 0 %START;                   !SWITCH
>        SAVE(-LIT)
>        SAVE(SIZE)
> 701:   TTX = DMAX<<8+TTX
>        ->9
>     %FINISH
>     %IF TTX&EXT # 0 %START;                 !CONST
>        SAVE(LIT)
>        ->701
>     %FINISH
757,769c950,955
<     X = -X %IF TTX&16 # 0;                  !NAME
<     DEF(X);  PLANT(LIT)
<     OWN = 0;  PEND = -1
<     ->9
< D(35):                                      !INTEGERARRAY
<     %IF TTX&8 # 0 %THEN %START
<         PRINT(3);  OP(67);                  !DZM T3
<     %FINISH
<     %IF AC >= 0 %THEN %START;               !FIRST IN GROUP
<         FAULT(17) %IF LSTACK # 0
<         JMSX(ADEC);                         !JMS ADEC
<     %FINISH %ELSE %START;                   !BOUNDS ALREADY SET
<         PEND = 1;  JMS(ADEC);               !LAC T1:JMS ADEC
---
>     X = -X %IF TTX&REF # 0
>     DEF(X)
>     %IF TTX&(REF+ARRAY) # ARRAY %START
>        PLANT(LIT)
>        SWOP %IF LEVEL < 0
>        ->9
771,772c957,961
<     ATAG = X;  PRINT(ATAG);  OP(93);        !DAD ATAG
<     AC = \255
---
>     PLANT(-LIT)
>     OWNC = SIZE;  PLANT(OWNC)
>     LIT = 0;  BOWN = 0
>     ->9 %IF TTX&2 = 0
>     BOWN = 1;  OWNC = OWNC&1+OWNC
774c963
< C(83):                                      !BOUND SEP (COLON)
---
> C(108):                                     !CONST BOUND SEP (COLON)
777,785c966,967
< D(36):                                      !OWNINTEGERARRAY
<     SWOP;  DEF(X);  PLANT(-LIT)
<     SET SIZE(OWN);  PLANT(OWN)
<     LIT = 0;  BOWN = 0
<     ->9 %IF TTX&8 = 0
<     BOWN = 1;  OWN = OWN&1+OWN
<     ->9
< C(84):                                      !OWNSEP (COMMA)
<     PLANT OWN %IF OWN > 0
---
> C(109):                                     !OWNSEP (COMMA)
>     PLANT OWN %IF OWNC > 0
788,793c970,993
< C(94):                                      !OWNT (T)
< 941:%IF OWN > 0 %THEN %START
<         PLANT OWN;  LIT = 0
<         ->941
<     %FINISH
<     SWOP;  PEND = -1;                       !REVERT TO INSTR SECTION
---
> C(110):                                     !OWNT (T)
>     PLANT OWN %AND LIT = 0 %WHILE OWNC > 0
>     SWOP %IF SECTION # 0;                   !REVERT TO INSTR SECTION
>     %RETURN
> C(81):                                      !PROCEDURE IDENT
>     %IF TTX&(EXT+BODY) = 0 %START;         !INTERNAL SPEC
>        TTX = TTX+EXT %IF GLOBAL = 0;  !PERM
>        %RETURN
>     %FINISH
> 811:PRINT SYMBOL('(');                      !BODY OR EXT SPEC
>     ->9 %IF TTX&BODY # 0;               !BODY
>     PLANT NAME(X)
>     PRINT(X);  PRINT SYMBOL(',')
>     PRINT SYMBOL(')')
>     ->9
> 
> !COMPILE BEGIN,END
> C(57):                                      !ENDOFPRIM
>     TBASE = TMAX
>     %RETURN
> C(58):                                      !ENDOFPERM
>     GLOBAL = TBASE;  TBASE = TMAX
>     LINE = 1;  LINES = 0;  ICOUNT = 0
>     CLOSE OUTPUT
795,797c995,998
< D(37):                                      !PROCEDURE
<     %IF DECL&64 = 0 %THEN %START
<         PLANT NAME(',') %IF DECL&128 # 0;   !EXT SPEC
---
> C(55):                                      !BEGIN
>     %IF LEVEL < 0 %START;                   !MAIN BEGIN
>        SSTYPE = 0;  ACCESS = 1;  LEVEL = 0
>        PRINT SYMBOL('!');                   !ENTRY-POINT
799,804c1000,1003
<        %IF DECL&128 # 0 %THEN %START
<             FAULT(15) %UNLESS LEVEL < 0
<             TTX = TTX-128;                  !REMOVE EXT
<             PLANT NAME('!');                !EXT ENTRY
<         %FINISH
<         PRINT SYMBOL('(')
---
>        TMAX = TMAX+1;  X = TMAX;            !TREAT AS ROUTINE
>        TAGTYPE(X) = BEG;  INDEX(X) = 0
>        CALL(X);  AC = \255
>        PRINT SYMBOL('(')
807,844c1006,1021
< C(39): !BEGEND: ENDOFPRIM(1), ENDOFPERM(2), BEGIN(111),
<               ! END(260), ENDOFPROGRAM(261)
<     %IF X = 1 %THEN %START
<         TBASE = TMAX %IF TBASE = 0
<     %FINISH
<     %IF X = 2 %THEN %START
<         GLOBAL = TBASE;  TBASE = TMAX;  LINE = 0
<         CLOSE OUTPUT
<     %FINISH
<     %IF X = BEG %THEN %START
<         %IF LEVEL < 0 %THEN %START;         !MAIN BEGIN
<             DECL = 0;  LINE = 1
<             ACCESS = 1;  LEVEL = 0
<             PRINT SYMBOL('!');              !ENTRY-POINT
<         %FINISH %ELSE %START
<             TMAX = TMAX+1;  X = TMAX
<             TAGTYPE(X) = DECL;  INDEX(X) = 0
<             JMS(X);  AC = \255
<             PRINT SYMBOL('(')
<         %FINISH
<     %FINISH
<     %IF X = 260 %THEN %START
<         FAULT(5) %IF BTAG = 0;              !MAIN PROG
<         %IF ACCESS # 0 %THEN %START
<             FAULT(11) %IF BTYPE&7 # 7 %AND GLOBAL # 0
<             PRINT(BTAG);  OP(92);           !JMP* BTAG
<         %FINISH
<         DANGER = -ATAG %IF DANGER = 0
<         COMPILE END
<         PRINT(TBASE);  PRINT SYMBOL(')');   !END OF BLOCK
<     %FINISH
<     %IF X = 261 %THEN %START
<         FAULT(8) %IF BTAG # 0
<         MON(0) %IF ACCESS # 0
<         DANGER = 0
<         COMPILE END %UNLESS LEVEL < 0
<         PRINT SYMBOL(')');                  !END OF BLOCK
<     %FINISH
---
> C(56):                                      !END
>     %IF BTAG = 0 %START;                    !MAIN PROGRAM
>        FAULT(5);  SSTYPE = 0
>        %RETURN
>     %FINISH
>     %IF ACCESS # 0 %START
>        FAULT(11) %IF ACCESS > 0 %AND BTYPE&15 # 12 %AND GLOBAL # 0
>        PRINT(BTAG);  OP(92);                !JMP* BTAG
>     %FINISH
>     DANGER = -ATAG %IF DANGER = 0
>     COMPILE END
>     PLANT NAME(TBASE) %IF GLOBAL # 0;       !NAME UNLESS PERM
>     PRINT(TBASE);  PRINT SYMBOL(')')
>     %RETURN %IF EXTIND = 0
>     FAULT(15) %UNLESS LEVEL = 0
>     PLANT NAME(TBASE);  PR(TBASE);  PRINT SYMBOL('!')
845a1023,1030
> C(59):                                      !ENDOFPROGRAM, ENDOFFILE
>     MON(0) %IF ACCESS # 0
>     DANGER = 0
>     COMPILE END %UNLESS LEVEL < 0
>     PRINT SYMBOL(')');                      !END OF BLOCK
>     %RETURN %IF BTAG = 0
>     FAULT(8);                               !MISSING END
>     %MONITOR 192
846a1032
> !COMPILE LOOPS AND CONDITIONS
851a1038
> !    00   CYCLE
853c1040
< !    10   CYCLE,WHILE,UNTIL
---
> !    10   FOR,WHILE,UNTIL
866,869c1053,1054
<     %IF LSTACK=0 %OR LSTACK&IND # 0 %THEN %START
<         FAULT(IND+6);  %RETURN
<     %FINISH
<     LABEL = LSTACK&3;  ELSE = ESTACK&1
---
>     FAULT(IND+6) %AND %RETURN %IF LSTACK=3 %OR LSTACK&1 # IND
>     LABCODE = LSTACK&3;  ELSE = ESTACK&1
874,876c1059,1061
< !COMPILE FOR, CYCLE
< ! ORDER =  (START) CONTROL (INC) CSEP1 (END) CSEP2 STARTT
< C(42):                                      !VARIABLE
---
> !COMPILE FOR LOOP
> ! ORDER =  (START) CONTROL (INC) CSEP1 (END) CSEP2 (CYCLE,IMP)
> C(107):                                     !CONTROL VARIABLE
878c1063
<     START = PEND;  LIT1 = LIT;              !START VALUE
---
>     PEND1 = PEND;  LIT1 = LIT;              !START VALUE
880a1066
> 
882,885c1068,1071
<     %IF PEND # 0 %THEN %START
<         TMAX = TMAX+1;  W = TMAX
<         TAGTYPE(W) = 2;  INDEX(W) = 0;      !DECLARE WL
<         DAC(W)
---
>     %IF PEND # 0 %START
>        TMAX = TMAX+1;  W = TMAX
>        TAGTYPE(W) = 1;  INDEX(W) = 0;       !DECLARE WL (INTEGER=1)
>        STORE(W);  LIT = 0
887c1073
<         W = 0;  PEND = -1
---
>        W = 0;  PEND = -1
890,891c1076,1077
< C(89):                                      !CSEP1
<     SET(INC);  ILIT = LIT;                  !INCREMENT
---
> C(105):                                     !CSEP1
>     SET(INC);  ILIT = LIT
893c1079
< C(90):                                      !CSEP2
---
> C(106):                                     !CSEP2
895,896c1081,1084
<     %IF START = INC = 0 %THEN %START
<         LAL(LIT1-ILIT)
---
>     LOAD(INC);  LIT = ILIT;                 !LAC INC
>     NEG
>     %IF PEND1 < 0 %START
>        POP %IF AC < 0;  DO(TAD)
898,905c1086,1090
<         LAC(INC);  LIT = ILIT;              !LAC INC
<         NEG
<         %IF START < 0 %THEN %START
<             OP(84) %IF AC < 0;              !LAC* T0
<         %FINISH %ELSE %START
<             LAC(START);  LIT = LIT1
<         %FINISH
<         DO(71);                             !TAD
---
>        %IF PEND # 0 %START
>           LOAD(PEND1);  LIT = LIT1;  DO(TAD)
>        %FINISH %ELSE %START
>           PEND = PEND1;  LIT = LIT+LIT1
>        %FINISH
907c1092
<     DAC(CONTROL);                           != START-INC
---
>     STORE(CONTROL);                         != START-INC
909,917c1094,1099
<     LAC(CONTROL);                           !LAC CONTROL
<     LAC(END);  LIT = ELIT;  DO(75);         !SAD END
<     JMP(LMIN);                              !JMP (NEXT INSTR)
<     LAC(INC);  LIT = ILIT;  DO(71);         !TAD INC
<     DAC(CONTROL);                           !DAC CONTROL
<     LABEL = 2
<     ->9
< C(57):                                      !REPEAT
<     POP LABEL(1)
---
>     LOAD(CONTROL);                          !LAC CONTROL
>     LOAD(END);  LIT = ELIT;  DO(75);        !SAD END
>     JUMP(LMIN);                             !JMP (NEXT INSTR)
>     LOAD(INC);  LIT = ILIT;  DO(TAD);       !TAD INC
>     STORE(CONTROL);                         !DAC CONTROL
>     LABCODE = 2
918a1101,1103
> C(51):                                      !REPEAT
>     POP LABEL(0)
>     ->11
921,922c1106,1107
< !STAT ORDER  = CWORD COND IMP, CWORD COND START,
< !              CWORD COND IMP ELSE IMP, CWORD COND IMP ELSE START
---
> !STAT ORDER  = CWORD COND IMP, CWORD COND START'
> !            CWORD COND IMP ELSE IMP, CWORD COND IMP ELSE START
925,926c1110,1111
< C(56):                                      !LWORD: WHILE(20), UNTIL(23)
<     JMP(LMIN-1) %IF X&1 # 0;                !UNTIL: JUMP OVER TEST
---
> C(53):!LWORD: WHILE(20), UNTIL(23)
>     JUMP(LMIN-1) %IF X&1 # 0;               !UNTIL - JUMP OVER TEST
928,929c1113,1114
< C(51):                                      !CWORD: IF(12), UNLESS(14)
<     LABEL = 0;  L = X>>3;  LNEST = X&7
---
> C(52):                                      !CWORD: IF(12), UNLESS(14)
>     LABCODE = 0;  MAIN = X>>3; LNEST = X&7
934,935c1119,1120
<     %IF LNEST&2 # ANDOR %THEN %START
<         ANDOR = ANDOR+4;  LNEST = LNEST!1
---
>     %IF LNEST&2 # ANDOR %START
>        ANDOR = ANDOR+4;  LNEST = LNEST!1
937c1122
<     LTAG = -(LNEST&1)+LTAG
---
>     LTAG = LTAG-1 %IF LNEST&1 # 0
941c1126
< C(52):                                      !AND
---
> C(42):                                      !AND
944c1129
< C(53):                                      !OR
---
> C(43):                                      !OR
947c1132
< C(54):                                      !NOT
---
> C(44):                                      !NOT
951c1136
< C(55): !COP: <(64), =(128), <=(192), >=(576), #(640), >(704)
---
> C(45): !COP: <(64), =(128), <=(192), >=(576), #(640), >(704)
953,955c1138,1140
<     %IF PEND = 0 %AND LIT = 0 %THEN %START; !COMPARISON WITH ZERO
<         PEND = -1
<         X = X+4096 %IF NEXT # 0;            !+CLA IF DOUBLE
---
>     %IF PEND = 0 %AND LIT = 0 %START;       !COMPARISON WITH ZERO
>        PEND = -1
>        X = X+4096 %IF NEXT # 0;             !+CLA IF DOUBLE
957,992c1142,1177
<         K = PEND
<         %IF X&64 # 0 %THEN %START;          !<,<=,>=,>
<             %IF PEND=0 %AND LIT>0 %AND NEXT=0 %THEN %START
<                 PRINT(64);  OP(79);         !SMA
<                 LIT = -LIT;  DO(71);        !TAD (-LIT
<             %FINISH %ELSE %START
<                 %IF X&128 # 0 %THEN %START; !<=,>
<                     JMSX(LE);  X = X!!448;  !SZL,SNL
<                 %FINISH %ELSE %START
<                     JMSX(GE);  X = X!!832;  !SZL,SNL
<                 %FINISH
<                 AC = K %IF K >= 0;          !ACLIT STILL SET
<             %FINISH
<         %FINISH %ELSE %START;               !=,#
<             DO(75);                         !SAD
<             %IF X = 640 %THEN %START;       !#
<                 %IF K>=0 %AND NEXT#0 %THEN %START
<                     PEND = K;  AC = \255
<                 %FINISH
<                 X = 0
<             %FINISH %ELSE X = 512;          !SKP
<         %FINISH
<     %FINISH
< 551:X = X!!512 %IF LNEST&2 # 0;             !INVERT
<     %IF LNEST&(\7) # 0 %OR L = 2 %THEN %START
<         OPR(X) %UNLESS X = 0
<         AC = \AC %UNLESS NEXT # 0
<         I = LTAG;  J = LNEST
< 552:    %IF J&4 = 0 %THEN %START
<             J = J>>3;  I = J&1+I
<             ->552
<         %FINISH
<         JMP(I);  LABEL = L %IF I = LMIN
<         DEF(LTAG-1) %IF LNEST&1 # 0
<         LNEST = LNEST>>3
<         LTAG = LNEST&1+LTAG
---
>        K = PEND
>        %IF X&64 # 0 %START;                 !<,<=,>=,>
>           %IF PEND=0 %AND LIT>0 %AND NEXT=0 %START
>              PRINT(64);  OP(79);            !SMA
>              NEG;  DO(TAD)
>           %FINISH %ELSE %START
>              %IF X&128 # 0 %START;          !<=,>
>                 JMSX(LE);  X = X!!448;      !SZL,SNL
>              %FINISH %ELSE %START
>                 JMSX(GE);  X = X!!832;      !SZL,SNL
>              %FINISH
>              AC = K %IF K >= 0;             !ACLIT STILL SET
>           %FINISH
>        %FINISH %ELSE %START;                !=,#
>           DO(75);                           !SAD
>           %IF X = 640 %START;               !#
>              %IF K >= 0 %AND NEXT # 0 %START
>                 PEND = K;  AC = \255
>              %FINISH
>              X = 0
>           %FINISH %ELSE X = 512;            !SKP
>        %FINISH
>     %FINISH
> CONDSKIP:
>     X = X!!512 %IF LNEST&2 # 0;             !INVERT
>     %IF LNEST&(\7) # 0 %OR MAIN = 2 %START
>        OPR(X) %UNLESS X = 0
>        AC = \AC %UNLESS NEXT # 0
>        I = LTAG;  J = LNEST
>        %WHILE J&4 = 0 %CYCLE
>           J = J>>3;  I = J&1+I
>        %REPEAT
>        JUMP(I);  LABCODE = MAIN %IF I = LMIN
>        DEF(LTAG-1) %IF LNEST&1 # 0
>        LNEST = LNEST>>3
>        LTAG = LNEST&1+LTAG
994,995c1179,1180
<         PENDOPR = X;  SINGLE = 0
<         AC = \AC;  AC = \255 %IF LNEST&1 # 0
---
>        PENDOPR = X;  FINAL = 0
>        AC = \AC;  AC = \255 %IF LNEST&1 # 0
999,1000c1184,1185
< !COMPILE START, FINISH, ELSE, EXIT, CONTINUE
< C(92):                                      !STARTT (T)
---
> !COMPILE START, FINISH, ELSE, EXIT
> C(49):C(50):                                !START, CYCLE
1002,1005c1187,1189
<     %IF LABEL = 0 %THEN %START
<         LABEL = 2;  DEF(LMIN+1);            !INDEFINITE CYCLE
<     %FINISH
<     LSTACK = LSTACK<<2+LABEL
---
>     DEF(LMIN+1) %IF LABCODE = 0;            !INDEFINITE CYCLE
>     %MONITOR 21 %IF LSTACK < 0
>     LSTACK = LSTACK<<2+LABCODE
1009,1033c1193,1210
< C(58):                                      !FINISH
<     POP LABEL(0)
<     ->9 %IF LABEL # 0
<     %RETURN
< C(59):                                      !ELSE
<     POP LABEL(0) %IF LABEL = 0
<     %IF LABEL = 1 %THEN %START
<         %IF ACCESS # 0 %THEN %START
<             JMP(LMIN+1);  ELSE = 1
<         %FINISH
<         LABEL = 3
<         DEF(LMIN)
<         ->9
<     %FINISH
<     FAULT(15)
<     ->10
< C(20): C(21):                               !EXIT, CONTINUE
<     J = LMIN+2;  K = LSTACK
< 201:%IF K&1 # 0 %THEN %START
<         J = J+2;  K = K>>2
<         ->201
<     %FINISH
<     FAULT(15) %IF K = 0
<     ACCESS = 0;  SINGLE = 512
<     %IF X = 20 %THEN JMP(J) %ELSE JMP(-(J+1))
---
> C(46):                                      !FINISH
>     POP LABEL(1)
>     ->9
> C(47):                                      !FINISH ELSE
>     POP LABEL(1)
>     FAULT(15) %IF LABCODE = 3
> C(48):                                      !ELSE
>     %IF ACCESS # 0 %START
>        JUMP(LMIN+1); ELSE = 1
>     %FINISH
>     LABCODE = 3;  DEF(LMIN)
>     ->9
> C(20):                                      !EXIT
>     J = LMIN+2;  K = 1
>     J = J+2 %AND K = K<<2 %WHILE K&LSTACK # 0
>     FAULT(15) %AND K=0  %IF (-K)&LSTACK = 0
>     ACCESS = 0;  FINAL = 512
>     JUMP(J);  LSTACK = K<<1!LSTACK
1037c1214
< C(66):                                      !LAB
---
> C(80):                                      !LAB
1039c1216
<     TTX = 96;  DEF(X)
---
>     DEF(X)
1041,1043c1218,1219
< C(40):C(65):                                !L,JLAB
<     ACCESS = 0;  SINGLE = 512
<     JMP(X)
---
> C(64):                                      !L
>     ACCESS = 0;  FINAL = 512;  JUMP(X)
1045c1221
< C(64):                                      !SLAB
---
> C(82):                                      !SLAB
1048,1053c1224,1229
<     %IF LIT <= 0 %THEN %START
<         LIT = DICT(I)+LIT;                  !+ NUMBER
<         %IF LIT > 0 %THEN %START
<             PRINT(LIT+1);  SPACE;  DEF(X)
<             %RETURN
<         %FINISH
---
>     %IF LIT <= 0 %START
>        LIT = DICT(I)+LIT;                   !+ NUMBER
>        %IF LIT > 0 %START
>           PRINT(LIT+1);  SPACE;  DEF(X)
>           %RETURN
>        %FINISH
1057c1233
< C(41):                                      !SNAME
---
> C(72):                                      !SNAME
1060c1236
<     ->9
---
>     ->10
1064,1065c1240,1242
<     FAULT(15) %IF BTYPE&15 # 7;             !SHOULD BE ROUTINE
< 161:ACCESS = 0;  SINGLE = 512
---
>     I = 12;                                 !SHOULD BE ROUTINE
> PEX:FAULT(15) %IF BTYPE&15 # I
>     ACCESS = 0;  FINAL = 512
1070,1071c1247,1248
< 171:FAULT(15) %IF BTYPE&7 # 6;              !SHOULD BE PRED
<     ->161
---
> 171:I = 4;                                  !SHOULD BE PRED
>     ->PEX
1075,1083c1252,1261
< C(19):                                      !RESULT
<     FAULT(15) %IF BTYPE&6 # 4;              !SHOULD BE FN OR MAP
<     %IF BTYPE&7 = 5 %THEN %START
<         J = AC;  K = ACLIT;  EXPEND
<         AC = J;  AC = \255 %IF AC >= 0
<         ACLIT = K
<     %FINISH %ELSE DAC(3)
<     NEXT = 0
<     ->161
---
> C(35):                                      !FRESULT
> 
>     I = BTYPE&3+4;                          !SHOULD BE FN
>     J = AC;  K = ACLIT;  EXPEND
>     AC = J;  AC = \255 %IF AC >= 0;  ACLIT = K
>     ->PEX
> C(34):                                      !MRESULT
>     I = BTYPE&3+12;                         !SHOULD BE MAP
>     STORE(3)
>     ->PEX
1086c1264
< C(27):                                      !STOP
---
> C(19):                                      !STOP
1089c1267
< C(28):                                      !FAULT
---
> C(36):                                      !FAULT
1091c1269
<     JMS(FLT);  PLANT(1);  JMP(SUB(NEXT));   !JMS FLT: SLOT FOR NP: JMP
---
>     CALL(FLT);  PLANT(1);                   !JMS FLT: SLOT FOR NP
1093,1094c1271,1274
<     %RETURN
< C(29):                                      !MONITOR
---
>     GET NEXT
>     JUMP(X)
>     ->9
> C(37):                                      !MONITOR
1097c1277
< C(30):                                      !MCODE (OPERAND AFTER)
---
> C(40):                                      !MCODE (OPERAND AFTER)
1099c1279
< C(31):                                      !LMCODE (CONST BEFORE)
---
> C(41):                                      !LMCODE (CONST BEFORE)
1101c1281
<     AC = \255;  PEND = -1
---
>     AC = \255
1103,1106c1283,1287
< C(49):                                      !STRING (PRINTTEXT)
<     JMS(PTXT);                              !PTEXT SR (TEXT FOLLOWS)
< 491:I = DICT(X);  PLANT(I);  X = X-1
<     ->491 %UNLESS I < 0
---
> C(67): C(87):                               !STRING (PRINTTEXT)
>     CALL(PTXT);                             !PTEXT SR (TEXT FOLLOWS)
>     %UNTIL I < 0 %CYCLE
>        I = DICT(X);  PLANT(I);  X = X-1
>     %REPEAT
1107a1289
>     GET NEXT;                               !IGNORE CALL
1111,1112c1293,1295
< %ROUTINE CALL
<     JMS(X)
---
> %ROUTINE PCALL
> !PROCEDURE CALL
>     CALL(X)
1114c1297
<     DANGER = X %IF TTX&128=0 %AND X<=PMAX;  !NOT SAFE
---
>     DANGER = X %IF TTX&EXT=0 %AND X<=PMAX;  !NOT SAFE
1116,1129c1299,1305
< C(50): C(105):                              !CONST, SCONST
<     LAL(X)
<     ->9
< C(87):                                      !ASSA: =
<     APEND = PEND;  LIT1 = LIT;  PEND = -1
<     ->9
< C(69):                                      !DEST: V
<     %IF NEXT # 0 %AND REF(NEXT)&127 # 85 %THEN %START
<         REFDEST = X;  FAULT(15) %IF TTX&16 = 0
<         ->9
<     %FINISH
<     %IF TTX&8 = 0 %THEN DAC(X) %ELSE %START
<         JMS(BPUT);  PRINT(X);  OP(95);      !JMS BPUT:LAD X
<         AC = \255
---
> 
> %ROUTINE MCALL
> !MAP CALL
>     %IF X=INT %AND PEND>0 %AND LIT=0 %AND TAGTYPE(PEND)&(OWN+REF)=OWN %START
>        I = PEND;  PEND = -1
>     %FINISH %ELSE %START
>        PCALL;  I = 3
1131,1145c1307,1314
<     ->9
< C(9):                                       !REFASS: ==
<     EXPEND
<     %IF AC # 255 %THEN %START
<         TTX == TT0++(AC&255)
<         %IF TTX&16 = 0 %THEN %START
<             PRINT(-65537);  OP(42);         !AND #-65537
<         %FINISH
<     %FINISH
<     PRINT(REFDEST);  OP(93);                !DAD REFDEST
<     AC = \(256+REFDEST)
<     ->9
< C(109):                                     !SEXP: V
<     %IF TTX&8 = 0 %THEN LAC(X) %ELSE %START
<         LAC(256+X);  JMS(BGET);             !LAD X:JMS BGET
---
> %END
> 
> %ROUTINE RESTORE
>     %IF PEND1 >= 0 %START
>        PEND = PEND1;  LIT = LIT1
>        AC = \255;  EXPEND
>     %FINISH %ELSE %START
>        POP
1146a1316,1368
> %END
> 
>  C(71):                                     !SCONST
>     I = X
>     GET NEXT
>     %IF PEND >= 0 %AND CLASS = 28 %AND X <= 2 %START
>        !EXP +- LIST
>        I = -I %IF X # 1;  LIT = LIT+I
>        ->9
>     %FINISH
>     LOAD(0);  LIT = I
>     ->2
> C(103):                                     !ASSA: = (EXP = APP (A,M))
>     PEND1 = PEND;  LIT1 = LIT;  PEND = -1
>     ->9
> C(65):                                      !V
>     LOAD(X)
>     ->9
> C(73):                                      !ARRAY ELEMENT (VAL)
>     AREF;  I = 3
> VG: PRINT(I);  OP(84);                      !LAC*
>     ->9
> C(77):                                      !MAP ELEMENT (VAL)
>     MCALL
>     ->VG %IF I = 3
>     NEST %IF AC >= 0;  AC = 255
>     ->VG
> C(66):                                      !BV
>     LOAD(256+X)
> BG: CALL(BGET)
>     ->9
> C(74):                                      !BYTE ARRAY ELEMENT (VAL)
>     BAREF
>     ->BG
> C(78):                                      !BYTE MAP ELEMENT (VAL)
>     PCALL
>     ->BG
> C(96):                                      !VDEST: V
>     STORE(X)
>     ->9
> C(86):                                      !ARRAY ELEMENT (DEST)
>     AREF;  I = 3
> VP: RESTORE
> VP1:PRINT(I);  OP(81);                      !DAC*
>     AC = \AC
>     ->9
> C(83):                                      !MAP ELEMENT (DEST)
>     MCALL
>     ->VP %IF I = 3 %OR AC < 0
>     ->VP1
> C(99):                                      !BVDEST: BV
>     CALL(BPUT);  PRINT(X);  OP(LAD)
>     AC = \255
1148,1159c1370,1373
< C(43):                                      !ARRAY ELEMENT (VAL)
<     AREF
<     ->441
< C(44):                                      !MAP ELEMENT (VAL)
<     CALL
< 441:%IF TTX&8 = 0 %THEN %START
<         PRINT(3);  OP(84);                  !LAC* T3
<     %FINISH %ELSE JMS(BGET);                !JMS BGET
<     ->9
< C(70):                                      !ARRAY ELEMENT (DEST)
<     AREF
<     ->711 %IF APEND < 0
---
> C(100):                                     !BADEST: BA
>     BAREF
> BP: RESTORE
>     CALL(BPUT);  PRINT(3);  OP(LAC)
1161,1172d1374
<     PEND = APEND;  LIT = LIT1;  EXPEND
<     ->712
< C(71):                                      !MAP ELEMENT (DEST)
<     CALL
< 711:OP(84);                                 !LAC* T0
< 712:%IF TTX&8 = 0 %THEN %START
<         PRINT(3);  OP(81);                  !DAC* T3
<         AC = \AC
<     %FINISH %ELSE %START
<         JMS(BPUT);  PRINT(3);  OP(68);      !JMS BPUT:LAC T3
<         AC = \255
<     %FINISH
1174c1376,1379
< C(111):                                     !APP (NULL)
---
> C(101):                                     !BMDEST: BM
>     PCALL
>     ->BP
> C(112):                                     !APP (NULL)
1177,1184c1382,1386
< C(80): C(81): C(82):                        !BAPAR, BMPAR, BVREF
<     RANGE = 8
< C(72):C(73):C(74):C(75):C(76):C(77): !APAR,MPAR,FPAR,PPAR,RPAR,VREF
<     LAC(256+X);                             !LAD X
<     ->8
< C(78):                                      !BYTE AREF
<     RANGE = 8
< C(67):                                      !ARRAY ELEMENT (REF)
---
> C(84):C(85):C(89):C(90):C(92):              !PPAR,FPAR,APAR,BAPAR,RPAR
> C(93):C(94):C(97):C(98):                    !MPAR,BMPAR,VREF,BVREF
>     LOAD(256+X);                            !LAD X
>     ->9
> C(88):                                      !ARRAY ELEMENT (REF)
1186,1193d1387
<     ->8
< C(79):                                      !BYTE MREF
<     RANGE = 8
< C(68):                                      !MAP ELEMENT (REF)
<     CALL
<     ->8
< C(45):                                      !F (CALL)
<     CALL %UNLESS X = 28;                    !T28: ADDR
1195,1196c1389,1399
< C(46):                                      !P (CALL)
<     CALL
---
> C(102):                                     !BYTE AREF
>     BAREF
>     ->9
> C(91):C(95):                                !MAP ELEMENT (REF,BREF)
>     PCALL %UNLESS X = INT
>     ->9
> C(69):                                      !F (CALL)
>     PCALL %UNLESS X = ADR
>     ->9
> C(68):                                      !P (CALL)
>     PCALL
1198,1201c1401,1404
<     ->551
< C(47):                                      !R (CALL)
<     EXPEND;  SINGLE = 512
<     CALL;  AC = \255
---
>     ->CONDSKIP
> C(76):                                      !R (CALL)
>     EXPEND;  FINAL = 512;  PCALL
>     AC = \255
1204c1407
< C(85): ->9;                                 !SEP
---
> C(111): ->9;                                !SEP
1207c1410
< C(88):                                      !MOD
---
> C(104):                                     !MOD
1211,1212c1414,1430
< C(0):                                       !PLUS-SIGN
<     DO(71) %IF CLASS # 16;                  !TAD (UNLESS UNARY)
---
> C(1):                                       !PLUS-SIGN
>     DO(TAD) %IF CLASS # 24;                 !TAD (UNLESS UNARY)
>     ->9
> C(2):                                       !MINUS-SIGN
>     %IF CLASS # 24 %START
>        %IF PEND > 0 %START
>           PRINT(1);  OP(79);                !INFILTRATE CMA
>           DO(TAD);  NOT;                    !TAD: CMA
>        %FINISH %ELSE %START
>           NEG; DO(TAD)
>        %FINISH
>     %FINISH %ELSE %START
>        NEG
>     %FINISH
>     ->9
> C(3):                                       !UOP: \
>     NOT
1214,1233c1432,1441
< C(1):                                       !MINUS-SIGN
<     %IF CLASS # 16 %THEN %START
<         %IF PEND > 0 %THEN %START
<             PRINT(1);  OP(79);              !INFILTRATE CMA
<             DO(71);  CMA;                   !TAD: CMA
<         %FINISH %ELSE %START
<             NEG;  DO(71)
<         %FINISH
<     %FINISH %ELSE NEG
<     ->9
< C(2):                                       !UOP: \
<     %IF PEND # 0 %THEN CMA %ELSE LIT = \LIT
<     ->9
< C(3): C(4):                                 !LEFT-SHIFT, RIGHT-SHIFT
<     %IF PEND=0 %AND LIT&(\7)=0 %THEN %START
<         PEND = -1
< 31:     ->9 %IF LIT = 0
<         %IF X=3 %THEN OPR(2056) %ELSE OPR(2064); !RCL,RCR
<         LIT = LIT-1
<         ->31
---
> C(4): C(5):                                 !LEFT-SHIFT, RIGHT-SHIFT
>     %IF PEND = 0 %AND LIT&(\7) = 0 %START
>        PEND = -1
>        %WHILE LIT # 0 %CYCLE
>           %IF X # 5 %THEN OPR(2056) %ELSE OPR(2064); !RCL,RCR
>           LIT = LIT-1
>        %REPEAT
>     %FINISH %ELSE %START
>        NEG %IF X = 5
>        JMSX(SH)
1235,1236d1442
<     NEG %IF X # 3
<     JMSX(SH)
1246,1247c1452,1453
<     ->9
< C(8):                                       !REFOP --
---
>    ->9
> C(8):                                       !REFOP -- (DISP -- REF)
1249,1257c1455,1469
< C(7):                                       !REFOP ++
<     X = SUB(NEXT);  TTX == TT0++X;  NEXT = 0
<     %IF PEND = 0 %AND LIT = 1 %AND REFDEST = X %THEN %START
<         I = CO(LINK)
<         %IF I # 0 %AND REF(I)&127 = 22 %THEN %START; !REFASS
<             CO(LINK) = CO(I);  PEND = -1
<             AC = \255 %IF \(AC&255) = X
<             SINGLE = 512;  PRINT(X);  OP(89); !ISZ* X (FOR ISZ X)
<         %FINISH
---
> C(7):                                       !REFOP ++ (DISP ++ REF)
>     GET NEXT
>     %IF PEND = 0 %START
>        PEND = 256+X;                        !AD OF X PLUS LIT
>     %FINISH %ELSE %START
>        EXPEND
>        PRINT(X);  OP(ADA)
>        AC = 255
>     %FINISH
>     ->9
> C(9):                                       !REFASS: ==
>     GET NEXT;  FAULT(15) %IF TTX&REF = 0
>     %IF PEND-256 = X %AND LIT = 1 %START
>        PRINT(X);  OP(89);                   !ISZ* (FOR ISZ)
>        AC = \255 %IF \AC&255 = X
1259,1260c1471,1479
<         EXPEND;  AC = 255
<         PRINT(X);  OP(94);                  !ADA X
---
>        %IF PEND > 0 %START
>           TTX == TT0++(PEND&255)
>           EXPEND
>           %IF TTX&(OWN+REF) = 0 %START
>              PRINT(-65537);  OP(42);        !AND #-65537
>           %FINISH
>        %FINISH
>        PRINT(X);  OP(DAD)
>        AC = \(X+256);  ACLIT = 0
1262c1481
<     ->8
---
>     ->9
