#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %BEGIN;                               !HAL-7502

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2  !    INPUT/OUTPUT STREAMS
  //     3  %OWNINTEGER MAIN=1, PRE=2;            !INPUT

  static int MAIN = 1;
  static int PRE = 2;

  //     4  %OWNINTEGER BIN=1, LIS=2;             !OUTPUT

  static int BIN = 1;
  static int LIS = 2;

  //     5  !    OPERAND TYPES
  //     6  %OWNINTEGER OPMASK=16_F000;           !MACHINE INSTRUCTION OR MACRO

  static int OPMASK = 61440;

  //     7  %OWNINTEGER MACRO=16_A000

  static int MACRO = 40960;

  //     8  %OWNINTEGER FMASK=16_0800;            !FORWARD REF

  static int FMASK = 2048;

  //     9  %OWNINTEGER UMASK=16_0200;            !UNDEF (FORWARD REF)

  static int UMASK = 512;

  //    10  %OWNINTEGER REG=16_0080;              !REGISTER

  static int REG = 128;

  //    11  %OWNINTEGER MEMMASK=16_0040;          !MEM REF

  static int MEMMASK = 64;

  //    12  %OWNINTEGER RELMASK=16_0020;          !RELOCATABLE

  static int RELMASK = 32;

  //    13  %OWNINTEGER XMASK=16_0010;            !INDEXED

  static int XMASK = 16;

  //    14  %OWNINTEGER REGXMASK=16_0090;         !=REG+XMASK

  static int REGXMASK = 144;

  //    15  %OWNINTEGER RELUXMASK=16_0230;        !=RELMASK+UMASK+XMASK

  static int RELUXMASK = 560;

  //    16  !    TEXT POINTERS (BYTE ADDRESSES)
  //    17  %OWNINTEGER CODEPOS;                  !(NOT ACTUALLY BYTE)

  static int CODEPOS;

  //    18  %OWNINTEGER STARTPOS;                 !START OF CURRENT LINE

  static int STARTPOS;

  //    19  %OWNINTEGER GETPOS;                   !INPUT POINTER (NEXT)

  static int GETPOS;

  //    20  %OWNINTEGER PUTPOS

  static int PUTPOS;

  //    21  %OWNINTEGER PSEUDOLIM

  static int PSEUDOLIM;

  //    22  %OWNINTEGER PRINTPOS;                 !START OF PRINT LINE

  static int PRINTPOS;

  //    23  %OWNINTEGER FAULTPOS

  static int FAULTPOS;

  //    24  %OWNINTEGER MACLIM;                   !MACRO DEF LIMIT

  static int MACLIM;

  //    25  !    OTHER POINTERS (WORD ADDRESSES)
  //    26  %OWNINTEGER MP;                       !MACRO-CALL PARAMETERS

  static int MP;

  //    27  %OWNINTEGER QBASE,QSTART,QLIM,TRANSF; !OPERAND QUEUE

  static int QBASE;
  static int QSTART;
  static int QLIM;
  static int TRANSF;

  //    28  %OWNINTEGER DEFMIN;                   !TAG MIN (DOWN - RESET)

  static int DEFMIN;

  //    29  %OWNINTEGER DEFLIM;                   !TAG LIM (FIXED)

  static int DEFLIM;

  //    30  %OWNINTEGER ALMAX;                    !ASSEMBLER LAB MAX (UP - RESET)

  static int ALMAX;

  //    31  %OWNINTEGER LABMIN;                   !USER LAB MIN (DOWN - RESET)

  static int LABMIN;

  //    32  %OWNINTEGER LABLIM;                   !USER LAB LIM (FIXED)

  static int LABLIM;

  //    33  %OWNINTEGER BP;                       !BLOCK POINTER (UP - DOWN)

  static int BP;

  //    34  %OWNINTEGER NP;                       !NEST POINTER (DOWN - UP)

  static int NP;

  //    35  %OWNINTEGER STORELIM;                 !(FIXED)

  static int STORELIM;

  //    36
  //    37  %INTEGER SYM;                         !CURRENT SYMBOL

  int SYM;

  //    38  %INTEGER TERM;                        !TAG TERMINATOR

  int TERM;

  //    39  %INTEGER FSYM;                        !FAULT FLAG SYMBOL

  int FSYM;

  //    40  %OWNINTEGER CHARS=0;                  !PRINT CHAR COUNT

  static int CHARS = 0;

  //    41  %OWNINTEGER LINES=0;                  !PRINT LINE COUNT

  static int LINES = 0;

  //    42  %OWNINTEGER PASS=-1;                  !CURRENT PASS (-1,0,1)

  static int PASS = -1;

  //    43  %OWNINTEGER LIST=-1;                  !LISTING CONTROL

  static int LIST = -1;

  //    44  %INTEGER ASSCOND,SKIP;                !ASSEMBLY CONDITIONS (BIT NEST)

  int ASSCOND;
  int SKIP;

  //    45  %OWNINTEGER SAVE=1;                   !REG SAVE DISPLACEMENT

  static int SAVE = 1;

  //    46  %OWNINTEGER TEMPS=12;                 !TEMPORARY REGISTER SET

  static int TEMPS = 12;

  //    47  %OWNINTEGER CONTROL=16_40;            !OBJECT CODE CONTROL FIELD

  static int CONTROL = 64;

  //    48  %OWNINTEGER CHECK=0;  !BINARY CHECKSUM

  static int CHECK = 0;

  //    49  %INTEGER LOCTYPE,LOC;                 !LOCATION COUNTER

  int LOCTYPE;
  int LOC;

  //    50  %INTEGER ACC,ATYPE,AVAL;              !MAIN TEMP REGISTER

  int ACC;
  int ATYPE;
  int AVAL;

  //    51  %INTEGER CREG;                        !CONDITION CODE

  int CREG;

  //    52  %INTEGER COND;                        !CONDITION CODE MASK

  int COND;

  //    53  %INTEGER DREG,DUSE;                   !DESTINATION REGISTER

  int DREG;
  int DUSE;

  //    54  %INTEGER TYPE,VAL;                    !CURRENT TYPE,VALUE

  int TYPE;
  int VAL;

  //    55  %INTEGER TAG1,TAG2;                   !TAG (CHARS 1:3, 4:6)

  int TAG1;
  int TAG2;

  //    56  %INTEGER MODE;                        !ASSEMBLY MODE

  int MODE;

  //    57  %INTEGER PEND;                        !TAG ALREADY RECOGNISED

  int PEND;

  //    58  %INTEGER FLAG;                        !JUMPS

  int FLAG;

  //    59
  //    60
  //    61  %INTEGER SBOUND

  int SBOUND;

  //    62      SBOUND = FREESTORE-260;           !ALLOW FOR INPUT BUFFER

  SBOUND = _imp_FREESTORE() - 260;

  //    63      SBOUND = SBOUND-256 %IF OUTDEV = 2

  if (_imp_OUTDEV() != 2) goto L_0001;
  SBOUND = SBOUND - 256;
L_0001:;

//    64      SELECT OUTPUT(LIS)

  _imp_SELECTOUTPUT(LIS);

  //    65      SBOUND = SBOUND-256 %IF OUTDEV = 2

  if (_imp_OUTDEV() != 2) goto L_0002;
  SBOUND = SBOUND - 256;
L_0002:;

//    66  %INTEGERARRAY STORE(1:SBOUND)

  int STORE[SBOUND - 1 + 1];
  struct _imp_dv STORE_dv = {STORE, sizeof(int) /*, dims, <bounds> */};

  //    67
  //    68  %INTEGERFN CHAR(%INTEGER P)

  int CHAR(int P) {
    //    69  !BYTE FETCH
    //    70    %result = byteinteger(P)

    return *_imp_BYTEINTEGER(P);

    //    71  %END

  } /* end of CHAR */

  //    72
  //    73  %ROUTINE PUT CHAR(%INTEGER K)

  void PUTCHAR(int K) {
    //    74  !AT PUTPOS WITH POST-INCREMENT
    //    75     byteinteger(putpos) = k

    *_imp_BYTEINTEGER(PUTPOS) = K;

    //    76     putpos = putpos + 1

    PUTPOS = PUTPOS + 1;

    //    77   %END

    return;
  } /* end of PUTCHAR */

  //    78
  //    79  %ROUTINE FAULT(%INTEGER K)

  void FAULT(int K) {
    //    80  !RECORD (FIRST) FAULT
    //    81  !NOT NECESSARILY CULPABLE IN PASS 0
    //    82      FSYM = K %IF FSYM = ' '

    if (FSYM != 32) goto L_0003;
    FSYM = K;
  L_0003:;

  //    83  %END

    return;
  } /* end of FAULT */

  //    84
  //    85  %ROUTINE PRINT(%INTEGER K)

  void PRINT(int K) {
    //    86      INTEGER(CODEPOS+CHARS) = K

    *_imp_INTEGER(CODEPOS + CHARS) = K;

    //    87      CHARS = CHARS+1

    CHARS = CHARS + 1;

    //    88  %END

    return;
  } /* end of PRINT */

  //    89
  //    90  %ROUTINE PRINT WORD(%INTEGER V)

  void PRINTWORD(int V) {
    //    91      %ROUTINE PRINT HIT(%INTEGER V)

    void PRINTHIT(int V) {
      //    92      V = V&15+'0';  V = V+7 %IF V > '9'

      V = (V & 15) + 48;
      if (V <= 57) goto L_0004;
      V = V + 7;
    L_0004:;

    //    93      PRINT(V)

      PRINT(V);

      //    94      %END

      return;
    } /* end of PRINTHIT */

    //    95      %ROUTINE PRINT1(%INTEGER V)

    void PRINT1(int V) {
      //    96      PRINT HIT(V>>4);  PRINT HIT(V)

      PRINTHIT((unsigned int)V >> 4);
      PRINTHIT(V);

      //    97      %END

      return;
    } /* end of PRINT1 */

    //    98      PRINT1(V>>8);  PRINT1(V)

    PRINT1((unsigned int)V >> 8);
    PRINT1(V);

    //    99  %END

    return;
  } /* end of PRINTWORD */

  //   100
  //   101  %ROUTINE PRINT LOC

  void PRINTLOC(void) {
    //   102      PRINT WORD(LOC)

    PRINTWORD(LOC);

    //   103      %IF LOCTYPE&RELMASK # 0 %THEN PRINT('''') %ELSE PRINT(' ')

    if (LOCTYPE & RELMASK == 0) goto L_0005;
    PRINT(39);
    goto L_0006;
  L_0005:;
    PRINT(32);
  L_0006:;

  //   104      PRINT(' ')

    PRINT(32);

    //   105  %END

    return;
  } /* end of PRINTLOC */

  //   106
  //   107  %ROUTINE DO NEWLINE

  void DONEWLINE(void) {
    //   108      NEWLINE;  LINES = LINES+1

    _imp_NEWLINE();
    LINES = LINES + 1;

    //   109      NEWLINES(2) %AND LINES = 0 %IF LINES = 61

    if (LINES != 61) goto L_0007;
    _imp_NEWLINES(2);
    LINES = 0;
  L_0007:;

  //   110  %END

    return;
  } /* end of DONEWLINE */

  //   111
  //   112  %ROUTINE PRINT LINE

  void PRINTLINE(void) {
    //   113      %ROUTINE PRINTIT(%INTEGER SUB)

    void PRINTIT(int SUB) {
      //   114      %OWNINTEGER MARKER=124;            !VERTICAL BAR

      static int MARKER = 124;

      //   115      %INTEGER P,Q,K

      int P;
      int Q;
      int K;

      //   116      %RETURN %IF CHARS = 0 %AND CHAR(PRINTPOS) = NL

      if (CHARS != 0) goto L_0008;
      if (CHAR(PRINTPOS) != 10) goto L_0008;
      return;
    L_0008:;

    //   117      PRINT SYMBOL(FSYM);  SPACE

      _imp_PRINTSYMBOL(FSYM);
      _imp_SPACE();

      //   118      P = CODEPOS;  Q = P+CHARS

      P = CODEPOS;
      Q = P + CHARS;

      //   119      PRINT SYMBOL(INTEGER(P)) %AND P=P+1 %WHILE P # Q

    L_0009:;
      if (P == Q) goto L_000A;
      _imp_PRINTSYMBOL(*_imp_INTEGER(P));
      P = P + 1;
      goto L_0009;
    L_000A:;

    //   120      %RETURN %IF PRINTPOS = 0

      if (PRINTPOS != 0) goto L_000B;
      return;
    L_000B:;

    //   121      SPACES(17-CHARS)

      _imp_SPACES(17 - CHARS);

      //   122      P = PRINTPOS;  Q = 0

      P = PRINTPOS;
      Q = 0;

      //   123      %CYCLE

    L_000C:;

    //   124      PRINT SYMBOL(MARKER) %IF P = FAULTPOS

      if (P != FAULTPOS) goto L_000D;
      _imp_PRINTSYMBOL(MARKER);
    L_000D:;

    //   125      K = CHAR(P);  K = SUB %IF P = PSEUDOLIM

      K = CHAR(P);
      if (P != PSEUDOLIM) goto L_000E;
      K = SUB;
    L_000E:;

    //   126      PRINT SYMBOL('''') %IF (K!!Q)&128 # 0

      if ((K ^ Q) & 128 == 0) goto L_000F;
      _imp_PRINTSYMBOL(39);
    L_000F:;

    //   127      %RETURN %IF K = NL

      if (K != 10) goto L_0010;
      return;
    L_0010:;

    //   128      PRINT SYMBOL(K&127)

      _imp_PRINTSYMBOL(K & 127);

      //   129      P = P+1;  Q = K

      P = P + 1;
      Q = K;

      //   130      %REPEAT

      goto L_000C;

      //   131      %END

    } /* end of PRINTIT */

    //   132      %RETURN %IF PASS = 0

    if (PASS != 0) goto L_0011;
    return;
  L_0011:;

  //   133
  //   134      %UNLESS LIST < 0 %OR (PRINTPOS=0 %AND FSYM=' ' %AND LIST&1=0) %START

    if (LIST < 0) goto L_0012;
    if (PRINTPOS != 0) goto L_0013;
    if (FSYM != 32) goto L_0013;
    if (LIST & 1 == 0) goto L_0012;
  L_0013:;

  //   135      NEWLINES(3) %IF LINES = 0

    if (LINES != 0) goto L_0014;
    _imp_NEWLINES(3);
  L_0014:;

  //   136      PRINTIT(' ')

    PRINTIT(32);

    //   137      DO NEWLINE

    DONEWLINE();

    //   138      %FINISH

  L_0012:;

  //   139      %IF FSYM # ' ' %AND OUTDEV # 1 %START

    if (FSYM == 32) goto L_0015;
    if (_imp_OUTDEV() == 1) goto L_0015;

      //   140      SELECT OUTPUT(0)

    _imp_SELECTOUTPUT(0);

    //   141      PRINTPOS = STARTPOS %IF PRINTPOS = 0

    if (PRINTPOS != 0) goto L_0016;
    PRINTPOS = STARTPOS;
  L_0016:;

  //   142      PRINT LOC %IF CHARS = 0

    if (CHARS != 0) goto L_0017;
    PRINTLOC();
  L_0017:;

  //   143      PRINTIT(NL)

    PRINTIT(10);

    //   144      NEWLINE

    _imp_NEWLINE();

    //   145      SELECT OUTPUT(LIS)

    _imp_SELECTOUTPUT(LIS);

    //   146      %FINISH

  L_0015:;

  //   147      FSYM = ' ';  PRINTPOS = 0;  CHARS = 0

    FSYM = 32;
    PRINTPOS = 0;
    CHARS = 0;

    //   148  %END

    return;
  } /* end of PRINTLINE */

  //   149
  //   150  %ROUTINE PUT WORD(%INTEGER V)

  void PUTWORD(int V) {
    //   151      CHECK = CHECK!!V

    CHECK = CHECK ^ V;

    //   152      SELECT OUTPUT(BIN)

    _imp_SELECTOUTPUT(BIN);

    //   153      PRINT CH(V>>12&15+CONTROL)

    _imp_PRINTCH(((unsigned int)V >> 12 & 15) + CONTROL);

    //   154      PRINT CH(V>>8&15+16_40)

    _imp_PRINTCH(((unsigned int)V >> 8 & 15) + 64);

    //   155      PRINT CH(V>>4&15+16_40)

    _imp_PRINTCH(((unsigned int)V >> 4 & 15) + 64);

    //   156      PRINT CH(V&15+16_40)

    _imp_PRINTCH((V & 15) + 64);

    //   157      CONTROL = 16_50

    CONTROL = 80;

    //   158      SELECT OUTPUT(LIS)

    _imp_SELECTOUTPUT(LIS);

    //   159  %END

    return;
  } /* end of PUTWORD */

  //   160
  //   161  %ROUTINE PLANT VAL

  void PLANTVAL(void) {
    //   162      %IF PASS > 0 %START

    if (PASS <= 0) goto L_0018;

      //   163      %IF CHARS = 0 %START

    if (CHARS != 0) goto L_0019;

      //   164      %IF PRINTPOS#0 %THEN PRINT LOC %ELSE %START

    if (PRINTPOS == 0) goto L_001A;
    PRINTLOC();
    goto L_001B;
  L_001A:;

  //   165      PRINT(' '); PRINT(' '); PRINT(' ')

    PRINT(32);
    PRINT(32);
    PRINT(32);

    //   166      PRINT(' '); PRINT(' '); PRINT(' ')

    PRINT(32);
    PRINT(32);
    PRINT(32);

    //   167      %FINISH

  L_001B:;

  //   168      %FINISH

  L_0019:;

  //   169      PRINT(' ') %IF CHARS = 10

    if (CHARS != 10) goto L_001C;
    PRINT(32);
  L_001C:;

  //   170      PRINT WORD(VAL); PUT WORD(VAL)

    PRINTWORD(VAL);
    PUTWORD(VAL);

    //   171      PRINT('''') %IF TYPE&RELMASK # 0

    if (TYPE & RELMASK == 0) goto L_001D;
    PRINT(39);
  L_001D:;

  //   172      PRINT LINE %IF CHARS >= 15

    if (CHARS < 15) goto L_001E;
    PRINTLINE();
  L_001E:;

  //   173      %FINISH

  L_0018:;

  //   174      LOC = LOC+1

    LOC = LOC + 1;

    //   175  %END

    return;
  } /* end of PLANTVAL */

  //   176
  //   177  %ROUTINE PLANT(%INTEGER V)

  void PLANT(int V) {
    //   178  %INTEGER THOLD,VHOLD

    int THOLD;
    int VHOLD;

    //   179      THOLD = TYPE;  VHOLD = VAL

    THOLD = TYPE;
    VHOLD = VAL;

    //   180      TYPE = 0;  VAL = V

    TYPE = 0;
    VAL = V;

    //   181      PLANT VAL

    PLANTVAL();

    //   182      TYPE = THOLD;  VAL = THOLD

    TYPE = THOLD;
    VAL = THOLD;

    //   183  %END

    return;
  } /* end of PLANT */

  //   184
  //   185  %ROUTINE NEST(%INTEGER K)

  void NEST(int K) {
    //   186      NP = NP-1;  !!%MONITOR 23 %IF NP = BP

    NP = NP - 1;

    //   187      INTEGER(NP) = K

    *_imp_INTEGER(NP) = K;

    //   188  %END

    return;
  } /* end of NEST */

  //   189
  //   190  %ROUTINE SET LAB(%INTEGER DEST)

  void SETLAB(int DEST) {
    //   191  %INTEGER P,Q

    int P;
    int Q;

    //   192      Q = 0

    Q = 0;

    //   193      %CYCLE

  L_001F:;

  //   194      TYPE = INTEGER(NP);  P = TYPE&16_3FF+DEFLIM; !DEST SLOT

    TYPE = *_imp_INTEGER(NP);
    P = (TYPE & 1023) + DEFLIM;

    //   195      NP = NP+1

    NP = NP + 1;

    //   196      VAL = INTEGER(NP);             !LOC OF JUMP

    VAL = *_imp_INTEGER(NP);

    //   197      NP = NP+1

    NP = NP + 1;

    //   198      ATYPE = -1;  CREG = -1

    ATYPE = -1;
    CREG = -1;

    //   199      FLAG = 0;

    FLAG = 0;

    //   200      %IF TYPE&16_800 = 0 %START

    if (TYPE & 2048 != 0) goto L_0020;

      //   201      FLAG = 1 %IF DEST-VAL+PASS <= 128

    if (DEST - VAL + PASS > 128) goto L_0021;
    FLAG = 1;
  L_0021:;

  //   202      %finish %ELSE %IF TYPE&16_400 # 0 %START

    goto L_0022;
  L_0020:;
    if (TYPE & 1024 == 0) goto L_0023;

      //   203      FLAG = 2 %IF DEST-VAL+PASS+PASS = 1

    if (DEST - VAL + PASS + PASS != 1) goto L_0024;
    FLAG = 2;
  L_0024:;

  //   204      %FINISH

  L_0023:;
  L_0022:;

  //   205      %IF PASS = 0 %START

    if (PASS != 0) goto L_0025;

      //   206      DEST = DEST-FLAG;  INTEGER(P) = DEST

    DEST = DEST - FLAG;
    *_imp_INTEGER(P) = DEST;

    //   207      %IF FLAG # 0 %START

    if (FLAG == 0) goto L_0026;

      //   208      LOC = LOC-FLAG

    LOC = LOC - FLAG;

    //   209      %WHILE P # ALMAX %CYCLE

  L_0027:;
    if (P == ALMAX) goto L_0028;

      //   210      P = P+1;  INTEGER(P) = INTEGER(P)-FLAG

    P = P + 1;
    *_imp_INTEGER(P) = *_imp_INTEGER(P) - FLAG;

    //   211      %REPEAT

    goto L_0027;
  L_0028:;

  //   212      %FINISH

  L_0026:;

  //   213      %finish %ELSE %START

    goto L_0029;
  L_0025:;

  //   214      FAULT('P') %IF INTEGER(P) # DEST

    if (*_imp_INTEGER(P) == DEST) goto L_002A;
    FAULT(80);
  L_002A:;

  //   215      %FINISH

  L_0029:;

  //   216      %RETURN %IF INTEGER(NP)&16_1000 = 0

    if (*_imp_INTEGER(NP) & 4096 != 0) goto L_002B;
    return;
  L_002B:;

  //   217      %IF INTEGER(NP)&16_2000 # 0 %AND Q = 0 %START; !OR

    if (*_imp_INTEGER(NP) & 8192 == 0) goto L_002C;
    if (Q != 0) goto L_002C;

      //   218      DEST = VAL+1

    DEST = VAL + 1;

    //   219      DEST = VAL+2-FLAG %UNLESS TYPE&16_C00 = 16_C00

    if (TYPE & 3072 == 3072) goto L_002D;
    DEST = VAL + 2 - FLAG;
  L_002D:;

  //   220      Q = 1

    Q = 1;

    //   221      %FINISH

  L_002C:;

  //   222      %REPEAT

    goto L_001F;

    //   223  %END

  } /* end of SETLAB */

  //   224
  //   225  %ROUTINE ASSEMBLE

  void ASSEMBLE(void) {
    //   226  !   7502 OP-CODES
    //   227  %OWNINTEGER ADD=16_F400, SUB=16_F500, AND=16_F100

    static int ADD = 62464;
    static int SUB = 62720;
    static int AND = 61696;

    //   228  %OWNINTEGER OR=16_F000, XOR=16_F700, COMP=16_F200

    static int OR = 61440;
    static int XOR = 63232;
    static int COMP = 61952;

    //   229  %OWNINTEGER COPY=16_F300

    static int COPY = 62208;

    //   230  %OWNINTEGER LOADI=16_6000, SKIDI=16_7000, ADDI=16_8000

    static int LOADI = 24576;
    static int SKIDI = 28672;
    static int ADDI = 32768;

    //   231  %OWNINTEGER ANDI=16_9000

    static int ANDI = 36864;

    //   232  %OWNINTEGER BOC=16_5800, BOCR=16_5000, JUM=16_4000

    static int BOC = 22528;
    static int BOCR = 20480;
    static int JUM = 16384;

    //   233  %OWNINTEGER SKIP=16_4002, LOADC=16_20F2, ROT=16_3000

    static int SKIP = 16386;
    static int LOADC = 8434;
    static int ROT = 12288;

    //   234  %OWNINTEGER LOAD=16_2000, STORE=16_2008

    static int LOAD = 8192;
    static int STORE = 8200;

    //   235
    //   236  %INTEGER Q,NQ,OP,K,LITVAL,TYPE1,VAL1,FREE

    int Q;
    int NQ;
    int OP;
    int K;
    int LITVAL;
    int TYPE1;
    int VAL1;
    int FREE;

    //   237  %SWITCH ASS(-30:-1)

    int ASS_index;
    int ASS_line;
    char *ASS_file;
    static const void *ASS[30] = {
        &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_M26,
        &&case_ASS_M25,     &&case_ASS_M24,     &&case_ASS_M23,     &&case_ASS_M22,     &&case_ASS_M21,
        &&case_ASS_M20,     &&case_ASS_missing, &&case_ASS_M18,     &&case_ASS_M17,     &&case_ASS_M16,
        &&case_ASS_M15,     &&case_ASS_M14,     &&case_ASS_M13,     &&case_ASS_M12,     &&case_ASS_M11,
        &&case_ASS_missing, &&case_ASS_missing, &&case_ASS_M8,      &&case_ASS_M7,      &&case_ASS_M6,
        &&case_ASS_M5,      &&case_ASS_M4,      &&case_ASS_M3,      &&case_ASS_M2,      &&case_ASS_M1};

    //   238
    //   239  %ROUTINE COMBINE

    void COMBINE(void) {
      //   240  %INTEGER I,J,K

      int I;
      int J;
      int K;

      //   241      I = 11; K = 2048

      I = 11;
      K = 2048;

      //   242      I=I-1 %AND K=K>>1 %WHILE K&TYPE1 = 0 %AND I # 0

    L_002E:;
      if (K & TYPE1 != 0) goto L_002F;
      if (I == 0) goto L_002F;
      I = I - 1;
      K = (unsigned int)K >> 1;
      goto L_002E;
    L_002F:;

    //   243      J = K

      J = K;

      //   244      I =I-1 %AND J=J>>1 %WHILE J&VAL1 = 0 %AND I # 0

    L_0030:;
      if (J & VAL1 != 0) goto L_0031;
      if (I == 0) goto L_0031;
      I = I - 1;
      J = (unsigned int)J >> 1;
      goto L_0030;
    L_0031:;

    //   245      VAL = VAL<<I & (K<<1-1)

      VAL = VAL << I & (K << 1) - 1;

      //   246      TYPE = TYPE1-K

      TYPE = TYPE1 - K;

      //   247      VAL = VAL1-J+VAL

      VAL = VAL1 - J + VAL;

      //   248  %END

      return;
    } /* end of COMBINE */

    //   249
    //   250  %ROUTINE PLANT JUMP

    void PLANTJUMP(void) {
      //   251  %INTEGER I,V

      int I;
      int V;

      //   252      I = VAL-LOC

      I = VAL - LOC;

      //   253      %IF COND&6 = 0 %START

      if (COND & 6 != 0) goto L_0032;

        //   254      %IF COND = 8 %START

      if (COND != 8) goto L_0033;

        //   255      %RETURN %IF I=1

      if (I != 1) goto L_0034;
      return;
    L_0034:;

    //   256      PLANT(SKIP)

      PLANT(SKIP);

      //   257      %FINISH

    L_0033:;

    //   258      %finish %ELSE %START

      goto L_0035;
    L_0032:;

    //   259      FAULT('J') %AND I=0 %IF FLAG # 0 %AND |I| > 127

      if (FLAG == 0) goto L_0036;
      if (_imp_IMOD(I) <= 127) goto L_0036;
      FAULT(74);
      I = 0;
    L_0036:;

    //   260      %IF |I| <= 127 %START

      if (_imp_IMOD(I) > 127) goto L_0037;

        //   261      %IF TYPE&UMASK = 0 %OR FLAG # 0 %START

      if (TYPE & UMASK == 0) goto L_0038;
      if (FLAG == 0) goto L_0039;
    L_0038:;

    //   262      PLANT(BOC+(COND!!1)<<8+I&255)

      PLANT(BOC + ((COND ^ 1) << 8) + (I & 255));

      //   263      %RETURN

      return;

      //   264      %FINISH

    L_0039:;

    //   265      FAULT('S') %IF LIST >= 0 %AND LIST&8 # 0

      if (LIST < 0) goto L_003A;
      if (LIST & 8 == 0) goto L_003A;
      FAULT(83);
    L_003A:;

    //   266      %FINISH

    L_0037:;

    //   267      PLANT(BOC+COND<<8+2)

      PLANT(BOC + (COND << 8) + 2);

      //   268      %FINISH

    L_0035:;

    //   269      PLANT(JUM+(VAL-LOC)&4095)

      PLANT(JUM + (VAL - LOC & 4095));

      //   270  %END

      return;
    } /* end of PLANTJUMP */

    // ?V unused
    //   271
    //   272  %ROUTINE SET JUMP(%INTEGER CASE)

    void SETJUMP(int CASE) {
      //   273  %INTEGER THOLD,VHOLD,FHOLD

      int THOLD;
      int VHOLD;
      int FHOLD;

      //   274      CASE = CASE+16_0800 %IF COND&6 = 0

      if (COND & 6 != 0) goto L_003B;
      CASE = CASE + 2048;
    L_003B:;

    //   275      CASE = CASE+16_0400 %IF COND&1 # 0

      if (COND & 1 == 0) goto L_003C;
      CASE = CASE + 1024;
    L_003C:;

    //   276      ALMAX = ALMAX+1;  !!%MONITOR 22 %IF ALMAX = LABMIN

      ALMAX = ALMAX + 1;

      //   277      NEST(LOC);  NEST(ALMAX-DEFLIM+CASE)

      NEST(LOC);
      NEST(ALMAX - DEFLIM + CASE);

      //   278      THOLD = TYPE;  VHOLD = VAL;  FHOLD = FLAG

      THOLD = TYPE;
      VHOLD = VAL;
      FHOLD = FLAG;

      //   279      TYPE = LOCTYPE;  VAL = INTEGER(ALMAX);  FLAG = 0

      TYPE = LOCTYPE;
      VAL = *_imp_INTEGER(ALMAX);
      FLAG = 0;

      //   280      TYPE = TYPE+UMASK %IF PASS = 0

      if (PASS != 0) goto L_003D;
      TYPE = TYPE + UMASK;
    L_003D:;

    //   281      COND = COND!!1

      COND = COND ^ 1;

      //   282      PLANT JUMP;  COND = 0

      PLANTJUMP();
      COND = 0;

      //   283      TYPE = THOLD;  VAL = VHOLD;  FLAG = FHOLD

      TYPE = THOLD;
      VAL = VHOLD;
      FLAG = FHOLD;

      //   284  %END

      return;
    } /* end of SETJUMP */

    //   285
    //   286  %ROUTINE PLANT INST(%INTEGER CODE)

    void PLANTINST(int CODE) {
      //   287      SET JUMP(16_1000) %IF COND # 0

      if (COND == 0) goto L_003E;
      SETJUMP(4096);
    L_003E:;

    //   288      PLANT(CODE)

      PLANT(CODE);

      //   289  %END

      return;
    } /* end of PLANTINST */

    //   290
    //   291  %ROUTINE RELEASE

    void RELEASE(void) {
      //   292  %INTEGER I

      int I;

      //   293      %RETURN %IF TYPE&REGXMASK = 0

      if (TYPE & REGXMASK != 0) goto L_003F;
      return;
    L_003F:;

    //   294      I = TYPE&15;  I = VAL %IF TYPE = REG

      I = TYPE & 15;
      if (TYPE != REG) goto L_0040;
      I = VAL;
    L_0040:;

    //   295      %IF I = DREG %START

      if (I != DREG) goto L_0041;

        //   296      DUSE = DUSE-1

      DUSE = DUSE - 1;

      //   297      %finish %ELSE %START

      goto L_0042;
    L_0041:;

    //   298      I = 1<<I

      I = 1 << I;

      //   299      FREE = FREE!I %IF TEMPS&I # 0

      if (TEMPS & I == 0) goto L_0043;
      FREE = FREE | I;
    L_0043:;

    //   300      %FINISH

    L_0042:;

    //   301  %END

      return;
    } /* end of RELEASE */

    //   302
    //   303  %INTEGERFN TREG

    int TREG(void) {
      //   304  %INTEGER I,J

      int I;
      int J;

      //   305      %IF DREG >= 0 %AND DUSE = 0 %START

      if (DREG < 0) goto L_0044;
      if (DUSE != 0) goto L_0044;

        //   306      DUSE = 1

      DUSE = 1;

      //   307      %RESULT = DREG

      return DREG;

      //   308      %FINISH

    L_0044:;

    //   309      J = 1

      J = 1;

      //   310      %CYCLE I = 0,1,15

      // %for I = 0, 1, 15 %cycle
      {
        I = -1;
      L_0045:
        if (I == 15) goto L_0046;
        I += 1;

        //   311      ->OK %IF FREE&J # 0 %AND I # DREG

        if (FREE & J == 0) goto L_0048;
        if (I == DREG) goto L_0048;
        goto U_1000;
      L_0048:;

      //   312      J = J<<1

        J = J << 1;

        //   313      %REPEAT

        goto L_0045;
      }

    L_0046:;

    //   314      FAULT('R')

      FAULT(82);

      //   315  OK: FREE = FREE-J

    U_1000:;
      FREE = FREE - J;

      //   316      %RESULT = I

      return I;

      //   317  %END

    } /* end of TREG */

    //   318
    //   319  %ROUTINE LOAD CONST(%INTEGER R)

    void LOADCONST(int R) {
      //   320  %INTEGER I,J

      int I;
      int J;

      //   321      I = LOADI+R<<8

      I = LOADI + (R << 8);

      //   322      %IF VAL&(\255) = 0 %AND TYPE&UMASK = 0 %START

      if (VAL & (~255) != 0) goto L_0049;
      if (TYPE & UMASK != 0) goto L_0049;

        //   323      PLANT INST(I+VAL)

      PLANTINST(I + VAL);

      //   324      %finish %ELSE %IF \VAL&(\255) = 0 %AND TYPE&UMASK = 0 %START

      goto L_004A;
    L_0049:;
      if ((~VAL) & (~255) != 0) goto L_004B;
      if (TYPE & UMASK != 0) goto L_004B;

        //   325      PLANT INST(I+(\VAL))

      PLANTINST(I + (~VAL));

      //   326      PLANT INST(COMP+R<<4+R)

      PLANTINST(COMP + (R << 4) + R);

      //   327      CREG = R

      CREG = R;

      //   328      %finish %ELSE %START

      goto L_004A;
    L_004B:;

    //   329  !       PLANT INST(LOADC+R<<8)
    //   330  !       PLANT INST(SKIP)
    //   331  !       PLANT VAL
    //   332      J = VAL>>8&255

      J = (unsigned int)VAL >> 8 & 255;

      //   333      J = J+1 %IF VAL&128 # 0

      if (VAL & 128 == 0) goto L_004C;
      J = J + 1;
    L_004C:;

    //   334      PLANT INST(I+J)

      PLANTINST(I + J);

      //   335      PLANT INST(ROT+R<<8+7<<4+R)

      PLANTINST(ROT + (R << 8) + (7 << 4) + R);

      //   336      PLANT INST(ADDI+R<<8+VAL&255) %IF VAL&255 # 0

      if (VAL & 255 == 0) goto L_004D;
      PLANTINST(ADDI + (R << 8) + (VAL & 255));
    L_004D:;

    //   337      %FINISH

    L_004A:;

    //   338  %END

      return;
    } /* end of LOADCONST */

    //   339
    //   340  %ROUTINE LOAD REG(%INTEGER R)

    void LOADREG(int R) {
      //   341  %INTEGER OP

      int OP;

      //   342      %IF ATYPE = TYPE %AND AVAL = VAL %START

      if (ATYPE != TYPE) goto L_004E;
      if (AVAL != VAL) goto L_004E;

        //   343      TYPE = REG;  VAL = ACC

      TYPE = REG;
      VAL = ACC;

      //   344      %RETURN %IF R = ACC

      if (R != ACC) goto L_004F;
      return;
    L_004F:;

    //   345      %FINISH

    L_004E:;

    //   346      ATYPE = TYPE %AND AVAL = VAL %IF R = ACC

      if (R != ACC) goto L_0050;
      ATYPE = TYPE;
      AVAL = VAL;
    L_0050:;

    //   347      ATYPE = -1 %IF (ATYPE=REG %AND AVAL=R)

      if (ATYPE != REG) goto L_0051;
      if (AVAL != R) goto L_0051;
      ATYPE = -1;
    L_0051:;

    //   348      ATYPE = -1 %IF ATYPE&XMASK # 0 %AND ATYPE&15 = R

      if (ATYPE & XMASK == 0) goto L_0052;
      if (ATYPE & 15 != R) goto L_0052;
      ATYPE = -1;
    L_0052:;

    //   349      %IF TYPE = REG %START

      if (TYPE != REG) goto L_0053;

        //   350      PLANT INST(COPY+R<<4+VAL)

      PLANTINST(COPY + (R << 4) + VAL);

      //   351      CREG = R

      CREG = R;

      //   352      %finish %ELSE %IF TYPE&XMASK = 0 %START

      goto L_0054;
    L_0053:;
      if (TYPE & XMASK != 0) goto L_0055;

        //   353      LOAD CONST(R)

      LOADCONST(R);

      //   354         PLANT INST(LOAD+R<<8+R<<4) %IF TYPE&MEMMASK # 0

      if (TYPE & MEMMASK == 0) goto L_0056;
      PLANTINST(LOAD + (R << 8) + (R << 4));
    L_0056:;

    //   355      %finish %ELSE %START

      goto L_0054;
    L_0055:;

    //   356         %IF VAL&(\3) # 0 %OR TYPE&MEMMASK = 0 %START

      if (VAL & (~3) != 0) goto L_0057;
      if (TYPE & MEMMASK != 0) goto L_0058;
    L_0057:;

    //   357            %IF TYPE&15 # R %START

      if (TYPE & 15 == R) goto L_0059;

        //   358               %IF |VAL| <= 127 %START

      if (_imp_IMOD(VAL) > 127) goto L_005A;

        //   359                  PLANT INST(COPY+R<<4+TYPE&15)

      PLANTINST(COPY + (R << 4) + (TYPE & 15));

      //   360                  PLANT INST(ADDI+R<<8+VAL&255) %IF VAL # 0

      if (VAL == 0) goto L_005B;
      PLANTINST(ADDI + (R << 8) + (VAL & 255));
    L_005B:;

    //   361               %finish %ELSE %START

      goto L_005C;
    L_005A:;

    //   362                  LOAD CONST(R)

      LOADCONST(R);

      //   363                  PLANT INST(ADD+R<<4+TYPE&15)

      PLANTINST(ADD + (R << 4) + (TYPE & 15));

      //   364               %FINISH

    L_005C:;

    //   365               CREG = R

      CREG = R;

      //   366            %finish %ELSE %START

      goto L_005D;
    L_0059:;

    //   367               %IF |VAL| <= 127 %START

      if (_imp_IMOD(VAL) > 127) goto L_005E;

        //   368                  %IF VAL # 0 %START

      if (VAL == 0) goto L_005F;

        //   369                     PLANT INST(ADDI+R<<8+VAL&255)

      PLANTINST(ADDI + (R << 8) + (VAL & 255));

      //   370                     CREG = R

      CREG = R;

      //   371                  %FINISH

    L_005F:;

    //   372                  %finish %ELSE %START

      goto L_0060;
    L_005E:;

    //   373                  OP = TREG

      OP = TREG();

      //   374                  LOAD CONST(OP)

      LOADCONST(OP);

      //   375                  TYPE = REG;  VAL = OP

      TYPE = REG;
      VAL = OP;

      //   376                  RELEASE

      RELEASE();

      //   377                  PLANT INST(ADD+R<<4+OP)

      PLANTINST(ADD + (R << 4) + OP);

      //   378                  CREG = R

      CREG = R;

      //   379                  %FINISH

    L_0060:;

    //   380                  %FINISH

    L_005D:;

    //   381                  TYPE = TYPE&MEMMASK+XMASK+R;  VAL = 0

      TYPE = (TYPE & MEMMASK) + XMASK + R;
      VAL = 0;

      //   382                  %FINISH

    L_0058:;

    //   383      %IF TYPE&MEMMASK # 0 %START

      if (TYPE & MEMMASK == 0) goto L_0061;

        //   384      PLANT INST(LOAD+R<<8+(TYPE&15)<<4+VAL)

      PLANTINST(LOAD + (R << 8) + ((TYPE & 15) << 4) + VAL);

      //   385      CREG = -1

      CREG = -1;

      //   386  !   %FINISH  -- commenting out this line allows the program to compile
      //   387      %finish %ELSE %START

      goto L_0062;
    L_0061:;

    //   388      LOAD CONST(R)

      LOADCONST(R);

      //   389      PLANT INST(LOAD+R<<8+R<<4)

      PLANTINST(LOAD + (R << 8) + (R << 4));

      //   390      %FINISH

    L_0062:;

    //   391      %FINISH

    L_0054:;

    //   392      TYPE = REG;  VAL = R

      TYPE = REG;
      VAL = R;

      //   393  %END

      return;
    } /* end of LOADREG */

    //   394
    //   395  %ROUTINE LOAD TEMP

    void LOADTEMP(void) {
      //   396      RELEASE

      RELEASE();

      //   397      LOAD REG(TREG)

      LOADREG(TREG());

      //   398  %END

      return;
    } /* end of LOADTEMP */

    //   399
    //   400  %ROUTINE SWOP

    void SWOP(void) {
      //   401  %INTEGER K

      int K;

      //   402      K = TYPE1;  TYPE1 = TYPE;  TYPE = K

      K = TYPE1;
      TYPE1 = TYPE;
      TYPE = K;

      //   403      K = VAL1;  VAL1 = VAL;  VAL = K

      K = VAL1;
      VAL1 = VAL;
      VAL = K;

      //   404  %END

      return;
    } /* end of SWOP */

    //   405
    //   406      Q = QSTART

    Q = QSTART;

    //   407  NEW:NQ = QSTART;  FREE = TEMPS

  U_1001:;
    NQ = QSTART;
    FREE = TEMPS;

    //   408      TYPE = INTEGER(Q);  Q = Q+1

    TYPE = *_imp_INTEGER(Q);
    Q = Q + 1;

    //   409      VAL = INTEGER(Q);  Q = Q+1

    VAL = *_imp_INTEGER(Q);
    Q = Q + 1;

    //   410
    //   411  GET:%CYCLE

  U_1002:;
  L_0063:;

  //   412        %RETURN %IF Q = QLIM

    if (Q != QLIM) goto L_0064;
    return;
  L_0064:;

  //   413         K = INTEGER(Q);  Q = Q+1

    K = *_imp_INTEGER(Q);
    Q = Q + 1;

    //   414         ->ASS(K) %IF K < 0

    if (K >= 0) goto L_0065;
    ASS_line = __LINE__;
    ASS_file = __FILE__;
    ASS_index = K;
    goto case_ASS_dispatch;
  L_0065:;

  //   415         INTEGER(NQ) = TYPE1;  INTEGER(NQ+1) = VAL1

    *_imp_INTEGER(NQ) = TYPE1;
    *_imp_INTEGER(NQ + 1) = VAL1;

    //   416         NQ = NQ+2

    NQ = NQ + 2;

    //   417         TYPE1 = TYPE;  VAL1 = VAL

    TYPE1 = TYPE;
    VAL1 = VAL;

    //   418         TYPE = K;  VAL = INTEGER(Q);  Q = Q+1

    TYPE = K;
    VAL = *_imp_INTEGER(Q);
    Q = Q + 1;

    //   419      %REPEAT

    goto L_0063;

    //   420
    //   421  %PREDICATE TEMP

    int TEMP(void) {
      //   422      %FALSE %IF TYPE1 # REG

      if (TYPE1 == REG) goto L_0067;
      return 0 /*FALSE*/;
    L_0067:;

    //   423      %IF VAL1 = DREG %START

      if (VAL1 != DREG) goto L_0068;

        //   424      %FALSE %IF DUSE # 1

      if (DUSE == 1) goto L_0069;
      return 0 /*FALSE*/;
    L_0069:;

    //   425      %finish %ELSE %START

      goto L_006A;
    L_0068:;

    //   426      %FALSE %IF 1<<VAL1&TEMPS = 0

      if (1 << VAL1 & TEMPS != 0) goto L_006B;
      return 0 /*FALSE*/;
    L_006B:;

    //   427      %FINISH

    L_006A:;

    //   428      %TRUE

      return 1 /*TRUE*/;

      //   429  %END

    } /* end of TEMP */

    //   430
    //   431  NOP: K = 0;                           !NOT SYMMETRIC

  U_1003:;
    K = 0;

    //   432  BOP:%IF MODE <= 0 %OR (TYPE = 0 %AND TYPE1 = 0) %START

  U_1004:;
    if (MODE <= 0) goto L_0047;
    if (TYPE != 0) goto L_006C;
    if (TYPE1 != 0) goto L_006C;
  L_0047:;

  //   433      FAULT('A') %IF TYPE # 0

    if (TYPE == 0) goto L_006D;
    FAULT(65);
  L_006D:;

  //   434      TYPE = TYPE1;  VAL = LITVAL

    TYPE = TYPE1;
    VAL = LITVAL;

    //   435      %finish %ELSE %START

    goto L_006E;
  L_006C:;

  //   436      %IF %NOT TEMP %OR (TYPE=REG %AND VAL=DREG %AND DUSE=1 %AND K#0) %START

    if (!(TEMP())) goto L_006F;
    if (TYPE != REG) goto L_0070;
    if (VAL != DREG) goto L_0070;
    if (DUSE != 1) goto L_0070;
    if (K == 0) goto L_0070;
  L_006F:;

  //   437      SWOP

    SWOP();

    //   438      %IF K = 0 %OR %NOT TEMP %START

    if (K == 0) goto L_0071;
    if (TEMP()) goto L_0072;
  L_0071:;

  //   439      LOAD TEMP;  SWOP

    LOADTEMP();
    SWOP();

    //   440      %FINISH

  L_0072:;

  //   441      %FINISH

  L_0070:;

  //   442      %IF OP = AND %AND TYPE = 0 %AND VAL&(\255) = 0 %START

    if (OP != AND) goto L_0073;
    if (TYPE != 0) goto L_0073;
    if (VAL & (~255) != 0) goto L_0073;

      //   443      PLANT INST(ANDI+VAL1<<8+VAL)

    PLANTINST(ANDI + (VAL1 << 8) + VAL);

    //   444      %finish %ELSE %START

    goto L_0074;
  L_0073:;

  //   445      LOAD TEMP %IF TYPE # REG

    if (TYPE == REG) goto L_0075;
    LOADTEMP();
  L_0075:;

  //   446      RELEASE

    RELEASE();

    //   447      PLANT INST(OP+VAL1<<4+VAL)

    PLANTINST(OP + (VAL1 << 4) + VAL);

    //   448      %FINISH

  L_0074:;

  //   449      TYPE = REG;  VAL = VAL1

    TYPE = REG;
    VAL = VAL1;

    //   450      CREG = VAL

    CREG = VAL;

    //   451      ATYPE = -1 %IF ACC = VAL

    if (ACC != VAL) goto L_0076;
    ATYPE = -1;
  L_0076:;

  //   452      ATYPE = -1 %IF ATYPE&XMASK # 0 %AND ATYPE&15 = VAL

    if (ATYPE & XMASK == 0) goto L_0077;
    if (ATYPE & 15 != VAL) goto L_0077;
    ATYPE = -1;
  L_0077:;

  //   453      ATYPE = -1 %IF ATYPE = REG %AND AVAL = VAL

    if (ATYPE != REG) goto L_0078;
    if (AVAL != VAL) goto L_0078;
    ATYPE = -1;
  L_0078:;

  //   454      %FINISH

  L_006E:;

  //   455
  //   456  POP:NQ = NQ-2

  U_1005:;
    NQ = NQ - 2;

    //   457      TYPE1 = INTEGER(NQ);  VAL1 = INTEGER(NQ+1)

    TYPE1 = *_imp_INTEGER(NQ);
    VAL1 = *_imp_INTEGER(NQ + 1);

    //   458      ->GET

    goto U_1002;

    //   459
    //   460  ASS(-2):

  case_ASS_M2:;

  //   461      OP = SUB

    OP = SUB;

    //   462      ->NOP %IF MODE > 0 %AND TYPE # 0

    if (MODE <= 0) goto L_0079;
    if (TYPE == 0) goto L_0079;
    goto U_1003;
  L_0079:;

  //   463      TYPE1 = 0 %AND TYPE = 0 %IF MODE <= 0 %AND TYPE1 = TYPE

    if (MODE > 0) goto L_007A;
    if (TYPE1 != TYPE) goto L_007A;
    TYPE1 = 0;
    TYPE = 0;
  L_007A:;

  //   464      VAL = -VAL

    VAL = -VAL;

    //   465  ASS(-1):

  case_ASS_M1:;

  //   466      OP = ADD;  LITVAL = VAL1+VAL

    OP = ADD;
    LITVAL = VAL1 + VAL;

    //   467      ->BOP %UNLESS TYPE = 0

    if (TYPE == 0) goto L_007B;
    goto U_1004;
  L_007B:;

  //   468      %IF TYPE1&MEMMASK # 0 %AND MODE > 0 %START

    if (TYPE1 & MEMMASK == 0) goto L_007C;
    if (MODE <= 0) goto L_007C;

      //   469      SWOP;  LOAD TEMP;  SWOP

    SWOP();
    LOADTEMP();
    SWOP();

    //   470      %FINISH

  L_007C:;

  //   471      %IF TYPE1 = REG %AND %NOT TYPE=VAL=0 %START

    if (TYPE1 != REG) goto L_007D;
    {
      // Double-sided test on VAL (Part I)
      int tmp;
      if (TYPE != (tmp = VAL)) goto L_007E;
      // Double-sided test on VAL (Part II)
      if (tmp == 0) goto L_007D;
    }
  L_007E:;

  //   472      TYPE1 = XMASK+VAL1;  LITVAL = VAL

    TYPE1 = XMASK + VAL1;
    LITVAL = VAL;

    //   473      %FINISH

  L_007D:;

  //   474      TYPE = TYPE1;  VAL = LITVAL

    TYPE = TYPE1;
    VAL = LITVAL;

    //   475      ->POP

    goto U_1005;

    //   476  ASS(-6):

  case_ASS_M6:;

  //   477      LITVAL = VAL1<<VAL;  K = (-1)<<VAL

    LITVAL = VAL1 << VAL;
    K = (-1) << VAL;

    //   478      VAL = 16-VAL

    VAL = 16 - VAL;

    //   479      ->AS7

    goto U_1006;

    //   480  ASS(-7):

  case_ASS_M7:;

  //   481      LITVAL = VAL1>>VAL;  K = (16_FFFF)>>VAL

    LITVAL = (unsigned int)VAL1 >> VAL;
    K = (unsigned int)65535 >> VAL;

    //   482  AS7:K=0 %AND ->BOP %IF MODE <= 0

  U_1006:;
    if (MODE > 0) goto L_007F;
    K = 0;
    goto U_1004;
  L_007F:;

  //   483      FAULT('I') %IF TYPE # 0 %OR VAL&(\15) # 0

    if (TYPE != 0) goto L_0080;
    if (VAL & (~15) == 0) goto L_0081;
  L_0080:;
    FAULT(73);
  L_0081:;

  //   484      %IF %NOT TEMP %START

    if (TEMP()) goto L_0082;

      //   485      SWOP;  LOAD TEMP;  SWOP

    SWOP();
    LOADTEMP();
    SWOP();

    //   486      %FINISH

  L_0082:;

  //   487      OP = ROT+VAL1<<8+VAL1

    OP = ROT + (VAL1 << 8) + VAL1;

    //   488      PLANT INST(OP+16_0070) %IF VAL > 8

    if (VAL <= 8) goto L_0083;
    PLANTINST(OP + 112);
  L_0083:;

  //   489      PLANT INST(OP+(VAL-1)<<4) %IF VAL # 0

    if (VAL == 0) goto L_0084;
    PLANTINST(OP + (VAL - 1 << 4));
  L_0084:;

  //   490      TYPE = 0;  VAL = K;  K = -3

    TYPE = 0;
    VAL = K;
    K = -3;

    //   491  ASS(-3):

  case_ASS_M3:;

  //   492      OP = AND;  LITVAL = VAL1&VAL

    OP = AND;
    LITVAL = VAL1 & VAL;

    //   493      ->BOP

    goto U_1004;

    //   494  ASS(-4):

  case_ASS_M4:;

  //   495      OP = OR;  LITVAL = VAL1!VAL

    OP = OR;
    LITVAL = VAL1 | VAL;

    //   496      ->BOP

    goto U_1004;

    //   497  ASS(-5):

  case_ASS_M5:;

  //   498      OP = XOR;  LITVAL = VAL1!!VAL

    OP = XOR;
    LITVAL = VAL1 ^ VAL;

    //   499      ->BOP

    goto U_1004;

    //   500
    //   501  ASS(-8):                              !TYPE_VAL

  case_ASS_M8:;

  //   502      TYPE = VAL1

    TYPE = VAL1;

    //   503      TYPE = 0 %IF TYPE&OPMASK = MACRO; !SAFETY

    if (TYPE & OPMASK != MACRO) goto L_0085;
    TYPE = 0;
  L_0085:;

  //   504      TYPE = 0 %IF TYPE&(OPMASK+FMASK) = FMASK

    if (TYPE & OPMASK + FMASK != FMASK) goto L_0086;
    TYPE = 0;
  L_0086:;

  //   505      ->POP

    goto U_1005;

    //   506
    //   507  ASS(-11):                             !COMPARE

  case_ASS_M11:;

  //   508      K = INTEGER(Q);  Q = Q+1

    K = *_imp_INTEGER(Q);
    Q = Q + 1;

    //   509      %IF MODE <= 0 %START

    if (MODE > 0) goto L_0087;

      //   510      LITVAL = 2_01011000

    LITVAL = 88;

    //   511      LITVAL = 2_01100100 %IF VAL < 0

    if (VAL >= 0) goto L_0088;
    LITVAL = 100;
  L_0088:;

  //   512      LITVAL = 2_10101000 %IF VAL1 > VAL

    if (VAL1 <= VAL) goto L_0089;
    LITVAL = 168;
  L_0089:;

  //   513      K = LITVAL>>K&1;

    K = (unsigned int)LITVAL >> K & 1;

    //   514      %finish %ELSE  %START

    goto L_008A;
  L_0087:;

  //   515      %UNLESS K&6=4 %AND -256<VAL<0 %AND TYPE&XMASK#0 %START

    if (K & 6 != 4) goto L_008B;
    {
      // Double-sided test on VAL (Part I)
      int tmp;
      if (-256 >= (tmp = VAL)) goto L_008B;
      // Double-sided test on VAL (Part II)
      if (tmp >= 0) goto L_008B;
    }
    if (TYPE & XMASK != 0) goto L_008C;
  L_008B:;

  //   516      LOAD TEMP %IF TYPE # REG

    if (TYPE == REG) goto L_008D;
    LOADTEMP();
  L_008D:;

  //   517      PLANT INST(COPY+VAL<<4+VAL) %IF CREG # VAL

    if (CREG == VAL) goto L_008E;
    PLANTINST(COPY + (VAL << 4) + VAL);
  L_008E:;

  //   518      CREG = VAL

    CREG = VAL;

    //   519      %finish %ELSE  %START

    goto L_008F;
  L_008C:;

  //   520      PLANT INST(SKIDI+(TYPE&15)<<8-VAL)

    PLANTINST(SKIDI + ((TYPE & 15) << 8) - VAL);

    //   521      K = K+4;                    !8,9

    K = K + 4;

    //   522      %FINISH

  L_008F:;

  //   523      %FINISH

  L_008A:;

  //   524      COND = K

    COND = K;

    //   525      ->GET

    goto U_1002;

    //   526
    //   527  ASS(-12):                             !TEST CC

  case_ASS_M12:;

  //   528      COND = VAL!!1

    COND = VAL ^ 1;

    //   529      ->GET

    goto U_1002;

    //   530
    //   531  ASS(-13):                             !AND

  case_ASS_M13:;

  //   532      %IF MODE > 0 %START

    if (MODE <= 0) goto L_0090;

      //   533      SET JUMP(16_1000)

    SETJUMP(4096);

    //   534      %finish %ELSE  %START

    goto L_0091;
  L_0090:;

  //   535      %RETURN %IF COND = 0

    if (COND != 0) goto L_0092;
    return;
  L_0092:;

  //   536      %FINISH

  L_0091:;

  //   537      %RETURN %IF Q = QLIM

    if (Q != QLIM) goto L_0093;
    return;
  L_0093:;

  //   538      ->NEW

    goto U_1001;

    //   539
    //   540  ASS(-14):                             !OR

  case_ASS_M14:;

  //   541      %IF MODE > 0 %START

    if (MODE <= 0) goto L_0094;

      //   542      COND = COND!!1

    COND = COND ^ 1;

    //   543      SET JUMP(16_3000)

    SETJUMP(12288);

    //   544      %finish %ELSE  %START

    goto L_0095;
  L_0094:;

  //   545      %RETURN %IF COND # 0

    if (COND == 0) goto L_0096;
    return;
  L_0096:;

  //   546      %FINISH

  L_0095:;

  //   547      ->NEW

    goto U_1001;

    //   548
    //   549  ASS(-15):                             !IF

  case_ASS_M15:;

  //   550      SET JUMP(16_2000)

    SETJUMP(8192);

    //   551      %RETURN

    return;

    //   552
    //   553  ASS(-16):                             !ELSE

  case_ASS_M16:;

  //   554      COND = 1

    COND = 1;

    //   555      SET JUMP(16_4000)

    SETJUMP(16384);

    //   556      %RETURN

    return;

    //   557
    //   558  ASS(-17):                             !IF AFTER ELSE

  case_ASS_M17:;

  //   559      SET JUMP(16_6000)

    SETJUMP(24576);

    //   560      %RETURN

    return;

    //   561
    //   562  ASS(-18):                             !MACCALL IF

  case_ASS_M18:;

  //   563      SET JUMP(16_8000)

    SETJUMP(32768);

    //   564      %RETURN

    return;

    //   565
    //   566  ASS(-20):                             !HASH

  case_ASS_M20:;

  //   567      TYPE = TYPE&(UMASK+63)

    TYPE = TYPE & UMASK + 63;

    //   568      ->GET

    goto U_1002;

    //   569
    //   570  ASS(-21):                             !INDEX

  case_ASS_M21:;

  //   571      FAULT('I') %IF TYPE1&REGXMASK # 0

    if (TYPE1 & REGXMASK == 0) goto L_0097;
    FAULT(73);
  L_0097:;

  //   572      %IF TYPE&MEMMASK # 0 %START

    if (TYPE & MEMMASK == 0) goto L_0098;

      //   573      %IF MODE > 0 %THEN LOAD TEMP %ELSE FAULT('A')

    if (MODE <= 0) goto L_0099;
    LOADTEMP();
    goto L_009A;
  L_0099:;
    FAULT(65);
  L_009A:;

  //   574      %FINISH

  L_0098:;

  //   575      %IF TYPE = REG %START

    if (TYPE != REG) goto L_009B;

      //   576      TYPE = XMASK+VAL;  VAL = 0

    TYPE = XMASK + VAL;
    VAL = 0;

    //   577      %FINISH

  L_009B:;

  //   578      FAULT('I') %IF TYPE1&TYPE&RELMASK # 0

    if (TYPE1 & TYPE & RELMASK == 0) goto L_009C;
    FAULT(73);
  L_009C:;

  //   579      TYPE = TYPE1!TYPE!MEMMASK;  VAL = VAL1+VAL

    TYPE = TYPE1 | TYPE | MEMMASK;
    VAL = VAL1 + VAL;

    //   580      ->POP

    goto U_1005;

    //   581
    //   582  ASS(-22):                             !MINST SEPARATOR

  case_ASS_M22:;

  //   583      COMBINE

    COMBINE();

    //   584      ->POP

    goto U_1005;

    //   585
    //   586  ASS(-23):                             !PLANT INST

  case_ASS_M23:;

  //   587      MODE = 1

    MODE = 1;

    //   588      PLANT INST(VAL)

    PLANTINST(VAL);

    //   589      CREG = -1;  ATYPE = -1

    CREG = -1;
    ATYPE = -1;

    //   590      %RETURN

    return;

    //   591
    //   592  ASS(-24):                             !LOAD

  case_ASS_M24:;

  //   593      LOAD TEMP %IF TYPE # REG

    if (TYPE == REG) goto L_009D;
    LOADTEMP();
  L_009D:;

  //   594      Q = QBASE

    Q = QBASE;

    //   595      ->GET

    goto U_1002;

    //   596
    //   597  ASS(-25):                             !STORE (TYPE1,VAL1 -> TYPE,VAL)

  case_ASS_M25:;

  //   598      %IF TYPE = REG %START

    if (TYPE != REG) goto L_009E;

      //   599      SWOP %AND LOAD REG(VAL1) %IF VAL1 # VAL

    if (VAL1 == VAL) goto L_009F;
    SWOP();
    LOADREG(VAL1);
  L_009F:;

  //   600      %finish %ELSE  %START

    goto L_00A0;
  L_009E:;

  //   601      ATYPE = -1 %IF ATYPE&MEMMASK # 0

    if (ATYPE & MEMMASK == 0) goto L_00A1;
    ATYPE = -1;
  L_00A1:;

  //   602      %IF VAL1 = ACC %AND ATYPE < 0 %START

    if (VAL1 != ACC) goto L_00A2;
    if (ATYPE >= 0) goto L_00A2;

      //   603      K = TYPE&15

    K = TYPE & 15;

    //   604      ATYPE = TYPE %AND AVAL = VAL %IF TYPE&XMASK = 0 %OR 1<<K&TEMPS = 0

    if (TYPE & XMASK == 0) goto L_00A3;
    if (1 << K & TEMPS != 0) goto L_00A4;
  L_00A3:;
    ATYPE = TYPE;
    AVAL = VAL;
  L_00A4:;

  //   605      %FINISH

  L_00A2:;

  //   606      %IF TYPE&XMASK = 0 %OR VAL&(\3) # 0 %START

    if (TYPE & XMASK == 0) goto L_00A5;
    if (VAL & (~3) == 0) goto L_00A6;
  L_00A5:;

  //   607      TYPE = TYPE&(\MEMMASK)

    TYPE = TYPE & (~MEMMASK);

    //   608      LOAD TEMP

    LOADTEMP();

    //   609      TYPE = MEMMASK+XMASK+VAL;  VAL = 0

    TYPE = MEMMASK + XMASK + VAL;
    VAL = 0;

    //   610      %FINISH

  L_00A6:;

  //   611      PLANT INST(STORE+VAL1<<8+(TYPE&15)<<4+VAL)

    PLANTINST(STORE + (VAL1 << 8) + ((TYPE & 15) << 4) + VAL);

    //   612      %FINISH

  L_00A0:;

  //   613      %RETURN

    return;

    //   614
    //   615  ASS(-26):                             !JUMP

  case_ASS_M26:;

  //   616      SET JUMP(16_1000) %IF INTEGER(NP)&16_F000 = 16_3000; !OR

    if (*_imp_INTEGER(NP) & 61440 != 12288) goto L_00A7;
    SETJUMP(4096);
  L_00A7:;

  //   617      TYPE = TYPE!MEMMASK %IF TYPE # REG

    if (TYPE == REG) goto L_00A8;
    TYPE = TYPE | MEMMASK;
  L_00A8:;

  //   618      %IF TYPE&(\UMASK) = LOCTYPE %START

    if (TYPE & (~UMASK) != LOCTYPE) goto L_00A9;

      //   619         PLANT JUMP

    PLANTJUMP();

    //   620      %finish %ELSE  %START

    goto L_00AA;
  L_00A9:;

  //   621      TYPE = XMASK+VAL %AND VAL=0 %IF TYPE = REG

    if (TYPE != REG) goto L_00AB;
    TYPE = XMASK + VAL;
    VAL = 0;
  L_00AB:;

  //   622      FAULT('I') %IF TYPE&XMASK = 0 %OR VAL&(\15) # 0

    if (TYPE & XMASK == 0) goto L_00AC;
    if (VAL & (~15) == 0) goto L_00AD;
  L_00AC:;
    FAULT(73);
  L_00AD:;

  //   623      %IF COND&8 # 0 %START

    if (COND & 8 == 0) goto L_00AE;

      //   624      PLANT(SKIP) %IF COND = 8

    if (COND != 8) goto L_00AF;
    PLANT(SKIP);
  L_00AF:;

  //   625      COND = 1

    COND = 1;

    //   626      %FINISH

  L_00AE:;

  //   627      PLANT(BOCR+COND<<8+(TYPE&15)<<4+VAL)

    PLANT(BOCR + (COND << 8) + ((TYPE & 15) << 4) + VAL);

    //   628      %FINISH

  L_00AA:;

  //   629      COND = 0

    COND = 0;

    //   630      %RETURN

    return;

    //   631  %END


  case_ASS_dispatch:
    if (ASS_index < -30 || ASS_index > -1)
      _imp_signalf(6, 3, ASS_index, "->ASS(%d) out of bounds at %s line %d", ASS_index, ASS_file, ASS_line);
    goto *ASS[ASS_index - -30];

  case_ASS_missing:
    _imp_signalf(8, 2, ASS_index, "switch jump to undefined label ASS(%d): at %s line %d", ASS_index, ASS_file,
                 ASS_line);
  } /* end of ASSEMBLE */

  // ?LOADC unused
  //   632
  //   633  %ROUTINE GET SYM

  void GETSYM(void) {
    //   634      %CYCLE

  L_00B0:;

  //   635      SYM = CHAR(GETPOS);  GETPOS = GETPOS+1

    SYM = CHAR(GETPOS);
    GETPOS = GETPOS + 1;

    //   636      %RETURN %IF SYM # ' '

    if (SYM == 32) goto L_00B1;
    return;
  L_00B1:;

  //   637      %REPEAT

    goto L_00B0;

    //   638  %END

  } /* end of GETSYM */

  //   639
  //   640  %PREDICATE S(%INTEGER K)

  int S(int K) {
    //   641      %FALSE %UNLESS K = SYM

    if (K == SYM) goto L_00B2;
    return 0 /*FALSE*/;
  L_00B2:;

  //   642      GET SYM

    GETSYM();

    //   643      %TRUE

    return 1 /*TRUE*/;

    //   644  %END

  } /* end of S */

  //   645
  //   646  %PREDICATE SS(%INTEGER K)

  int SS(int K) {
    //   647      %FALSE %UNLESS K = SYM = CHAR(GETPOS)

    {
      // Double-sided test on SYM (Part I)
      int tmp;
      if (K != (tmp = SYM)) goto L_00B3;
      // Double-sided test on SYM (Part II)
      if (tmp == CHAR(GETPOS)) goto L_00B4;
    }
  L_00B3:;
    return 0 /*FALSE*/;
  L_00B4:;

  //   648      GETPOS = GETPOS+1

    GETPOS = GETPOS + 1;

    //   649      GET SYM

    GETSYM();

    //   650      %TRUE

    return 1 /*TRUE*/;

    //   651  %END

  } /* end of SS */

  //   652
  //   653  %PREDICATE TAG

  int TAG(void) {
    //   654  %INTEGER J,K

    int J;
    int K;

    //   655      %ROUTINE CODE SYM

    void CODESYM(void) {
      //   656      SYM = CHAR(GETPOS);  GETPOS = GETPOS+1

      SYM = CHAR(GETPOS);
      GETPOS = GETPOS + 1;

      //   657      K = SYM-'0'

      K = SYM - 48;

      //   658      %IF K >= 0 %START

      if (K < 0) goto L_00B5;

        //   659      TERM = -1 %AND %RETURN %IF K < 10

      if (K >= 10) goto L_00B6;
      TERM = -1;
      return;
    L_00B6:;

    //   660      K = SYM-'A'

      K = SYM - 65;

      //   661      %RETURN %IF K >= 0 %AND K < 26 %AND TERM = 0

      if (K < 0) goto L_00B7;
      if (K >= 26) goto L_00B7;
      if (TERM != 0) goto L_00B7;
      return;
    L_00B7:;

    //   662      %FINISH

    L_00B5:;

    //   663      TERM = SYM

      TERM = SYM;

      //   664      %END

      return;
    } /* end of CODESYM */

    //   665      %ROUTINE PACK TRIPLE

    void PACKTRIPLE(void) {
      //   666      ->T1 %IF TERM < 0

      if (TERM >= 0) goto L_00B8;
      goto U_1007;
    L_00B8:;

    //   667      J = ((K<<5+K)<<1+K)<<4+K+1111; !K*1073+1111

      J = (((K << 5) + K << 1) + K << 4) + K + 1111;

      //   668      CODE SYM

      CODESYM();

      //   669      ->T2 %IF TERM # 0

      if (TERM == 0) goto L_00B9;
      goto U_1008;
    L_00B9:;

    //   670      J = (K<<3+K)<<2+K+111+J;       !J+K*37+111

      J = ((K << 3) + K << 2) + K + 111 + J;

      //   671      CODE SYM

      CODESYM();

      //   672      ->T3 %IF TERM # 0

      if (TERM == 0) goto L_00BA;
      goto U_1009;
    L_00BA:;

    //   673      J = J+K+11

      J = J + K + 11;

      //   674      CODE SYM

      CODESYM();

      //   675      %RETURN

      return;

      //   676  T1: J = ((K<<1+K)<<1+K)<<4-K+1;    !K*111+1

    U_1007:;
      J = (((K << 1) + K << 1) + K << 4) - K + 1;

      //   677      CODE SYM

      CODESYM();

      //   678  T2: %RETURN %IF TERM > 0

    U_1008:;
      if (TERM <= 0) goto L_00BB;
      return;
    L_00BB:;

    //   679      J = (K<<2+K)<<1+K+1+J;         !J+K*11+1

      J = ((K << 2) + K << 1) + K + 1 + J;

      //   680      CODE SYM

      CODESYM();

      //   681  T3: %RETURN %IF TERM > 0

    U_1009:;
      if (TERM <= 0) goto L_00BC;
      return;
    L_00BC:;

    //   682      J = J+K+1

      J = J + K + 1;

      //   683      CODE SYM

      CODESYM();

      //   684      %END

      return;
    } /* end of PACKTRIPLE */

    //   685      K = SYM-'A'

    K = SYM - 65;

    //   686      %FALSE %UNLESS K >= 0 %AND K < 26

    if (K < 0) goto L_00BD;
    if (K < 26) goto L_00BE;
  L_00BD:;
    return 0 /*FALSE*/;
  L_00BE:;

  //   687      %FALSE %IF SYM = 'X' %AND CHAR(GETPOS)&128 # 0

    if (SYM != 88) goto L_00BF;
    if (CHAR(GETPOS) & 128 == 0) goto L_00BF;
    return 0 /*FALSE*/;
  L_00BF:;

  //   688      TERM = 0

    TERM = 0;

    //   689      PACK TRIPLE

    PACKTRIPLE();

    //   690      TAG1 = J;  J = 0

    TAG1 = J;
    J = 0;

    //   691      PACK TRIPLE %IF TERM <= 0

    if (TERM > 0) goto L_00C0;
    PACKTRIPLE();
  L_00C0:;

  //   692      TAG2 = J

    TAG2 = J;

    //   693      CODE SYM %WHILE TERM <= 0

  L_00C1:;
    if (TERM > 0) goto L_00C2;
    CODESYM();
    goto L_00C1;
  L_00C2:;

  //   694      GET SYM %IF TERM = ' '

    if (TERM != 32) goto L_00C3;
    GETSYM();
  L_00C3:;

  //   695      %TRUE

    return 1 /*TRUE*/;

    //   696  %END

  } /* end of TAG */

  //   697
  //   698  %PREDICATE TAGIF

  int TAGIF(void) {
    //   699      %FALSE %UNLESS SYM='I' %AND CHAR(GETPOS)='F' %AND CHAR(GETPOS+1)=' '

    if (SYM != 73) goto L_00C4;
    if (CHAR(GETPOS) != 70) goto L_00C4;
    if (CHAR(GETPOS + 1) == 32) goto L_00C5;
  L_00C4:;
    return 0 /*FALSE*/;
  L_00C5:;

  //   700      GETPOS = GETPOS+2

    GETPOS = GETPOS + 2;

    //   701      GET SYM

    GETSYM();

    //   702      %TRUE

    return 1 /*TRUE*/;

    //   703  %END

  } /* end of TAGIF */

  //   704
  //   705  %ROUTINE LOOKUP(%INTEGER CONTROL)

  void LOOKUP(int CONTROL) {
    //   706  !ALL DICT OPERATIONS LOCALISED HERE
    //   707  !CONTROL = 0 (LOOKUP ONLY), 1 (FORWARD OK),
    //   708  !          2 (REDEF), 3 (DEF),
    //   709  !          4 (MACPARM), 7 (LABEL)
    //   710  %INTEGER DP

    int DP;

    //   711      DP = DEFMIN;  DP = MP+5 %IF CONTROL = 4

    DP = DEFMIN;
    if (CONTROL != 4) goto L_00C6;
    DP = MP + 5;
  L_00C6:;

  //   712      %WHILE INTEGER(DP) # 0 %CYCLE

  L_00C7:;
    if (*_imp_INTEGER(DP) == 0) goto L_00C8;

      //   713         ->YES %IF INTEGER(DP) = TAG1 %AND INTEGER(DP+1) = TAG2

    if (*_imp_INTEGER(DP) != TAG1) goto L_00C9;
    if (*_imp_INTEGER(DP + 1) != TAG2) goto L_00C9;
    goto U_1007;
  L_00C9:;

  //   714         DP = DP+4

    DP = DP + 4;

    //   715      %REPEAT

    goto L_00C7;
  L_00C8:;

  //   716  !!%OWNINTEGER P
  //   717  !!    DP = DP-4
  //   718  !!REP:DP = DP+4
  //   719  !!    %LAC* DP; %OPR 640;!SNA; %JMP NO
  //   720  !!    %SAD TAG1; %OPR 512; %JMP REP
  //   721  !!    %LAC DP; %TAD #1; %DAC P
  //   722  !!    %LAC* P; %SAD TAG2; %JMP YES
  //   723  !!    ->REP
  //   724  NO:

  U_1008:;

  //   725      %RETURN %IF CONTROL&1 = 0;        !NO CREATION

    if (CONTROL & 1 != 0) goto L_00CA;
    return;
  L_00CA:;

  //   726  NEW:DEFMIN = DEFMIN-4;  DP = DEFMIN

  U_1009:;
    DEFMIN = DEFMIN - 4;
    DP = DEFMIN;

    //   727      !!%MONITOR 21 %IF DP-QLIM <= 0
    //   728      INTEGER(DP) = TAG1;  INTEGER(DP+1) = TAG2

    *_imp_INTEGER(DP) = TAG1;
    *_imp_INTEGER(DP + 1) = TAG2;

    //   729  SET:INTEGER(DP+2) = TYPE;  INTEGER(DP+3) = VAL

  U_100A:;
    *_imp_INTEGER(DP + 2) = TYPE;
    *_imp_INTEGER(DP + 3) = VAL;

    //   730      %RETURN

    return;

    //   731  YES:->NEW %IF CONTROL = 3 %AND DP-INTEGER(BP) >= 0

  U_1007:;
    if (CONTROL != 3) goto L_00CB;
    if (DP - *_imp_INTEGER(BP) < 0) goto L_00CB;
    goto U_1009;
  L_00CB:;

  //   732      %IF CONTROL&2 = 0 %START;         !NOT DEF CLASS

    if (CONTROL & 2 != 0) goto L_00CC;

      //   733      TYPE = INTEGER(DP+2);  VAL = INTEGER(DP+3)

    TYPE = *_imp_INTEGER(DP + 2);
    VAL = *_imp_INTEGER(DP + 3);

    //   734      %RETURN %UNLESS TYPE&OPMASK = MACRO %AND CONTROL = 0

    if (TYPE & OPMASK != MACRO) goto L_00CD;
    if (CONTROL == 0) goto L_00CE;
  L_00CD:;
    return;
  L_00CE:;

  //   735      %IF TYPE&31#25 %THEN INTEGER(DP+2)=TYPE+1 %ELSE INTEGER(DP+2) = TYPE+7

    if (TYPE & 31 == 25) goto L_00CF;
    *_imp_INTEGER(DP + 2) = TYPE + 1;
    goto L_00D0;
  L_00CF:;
    *_imp_INTEGER(DP + 2) = TYPE + 7;
  L_00D0:;

  //   736      %RETURN

    return;

    //   737      %FINISH

  L_00CC:;

  //   738      FAULT('D') %IF CONTROL = 3

    if (CONTROL != 3) goto L_00D1;
    FAULT(68);
  L_00D1:;

  //   739      ->SET %IF CONTROL # 7

    if (CONTROL == 7) goto L_00D2;
    goto U_100A;
  L_00D2:;

  //   740      %IF INTEGER(DP+2)&(OPMASK+FMASK) = FMASK %START

    if (*_imp_INTEGER(DP + 2) & OPMASK + FMASK != FMASK) goto L_00D3;

      //   741      VAL = INTEGER(DP+3)

    VAL = *_imp_INTEGER(DP + 3);

    //   742      %IF PASS = 0 %START

    if (PASS != 0) goto L_00D4;

      //   743      INTEGER(VAL) = LOC

    *_imp_INTEGER(VAL) = LOC;

    //   744      %finish %ELSE  %START

    goto L_00D5;
  L_00D4:;

  //   745      FAULT('P') %AND LOC=INTEGER(VAL) %IF INTEGER(VAL) # LOC

    if (*_imp_INTEGER(VAL) == LOC) goto L_00D6;
    FAULT(80);
    LOC = *_imp_INTEGER(VAL);
  L_00D6:;

  //   746      %FINISH

  L_00D5:;

  //   747      VAL = LOC

    VAL = LOC;

    //   748      %finish %ELSE  %START

    goto L_00D7;
  L_00D3:;

  //   749      ->NEW %IF DP-INTEGER(BP) >= 0

    if (DP - *_imp_INTEGER(BP) < 0) goto L_00D8;
    goto U_1009;
  L_00D8:;

  //   750      FAULT('D')

    FAULT(68);

    //   751      %FINISH

  L_00D7:;

  //   752      ->SET

    goto U_100A;

    //   753  %END

  } /* end of LOOKUP */

  // ?NO unused
  //   754
  //   755  %ROUTINE QUEUE(%INTEGER K)

  void QUEUE(int K) {
    //   756      INTEGER(QLIM) = K

    *_imp_INTEGER(QLIM) = K;

    //   757      QLIM = QLIM+1;  !!%MONITOR 21 %IF QLIM = DEFMIN

    QLIM = QLIM + 1;

    //   758  %END

    return;
  } /* end of QUEUE */

  //   759
  //   760  %ROUTINE GET EXP

  void GETEXP(void) {
    //   761  %OWNINTEGER W=24717

    static int W = 24717;

    //   762  %INTEGER I,NBASE

    int I;
    int NBASE;

    //   763
    //   764      NBASE = NP

    NBASE = NP;

    //   765      ->E3 %IF PEND # 0

    if (PEND == 0) goto L_00D9;
    goto U_100A;
  L_00D9:;

  //   766  E1: NEST(0) %WHILE S('(')

  U_100B:;
  L_00DA:;
    if (!(S(40))) goto L_00DB;
    NEST(0);
    goto L_00DA;
  L_00DB:;

  //   767      NEST(-20) %IF S('#')

    if (!(S(35))) goto L_00DC;
    NEST(-20);
  L_00DC:;

  //   768      %IF TAG %START

    if (!(TAG())) goto L_00DD;

      //   769  E3: %IF TAG1 = W %START;          !W

  U_100A:;
    if (TAG1 != W) goto L_00DE;

      //   770      TYPE = 0;  VAL = 0

    TYPE = 0;
    VAL = 0;

    //   771      %finish %ELSE  %START

    goto L_00DF;
  L_00DE:;

  //   772      %IF PEND >= 0 %START

    if (PEND < 0) goto L_00E0;

      //   773      TYPE = LOCTYPE+FMASK+UMASK;  VAL = LABMIN-1

    TYPE = LOCTYPE + FMASK + UMASK;
    VAL = LABMIN - 1;

    //   774      LOOKUP(1)

    LOOKUP(1);

    //   775      %IF TYPE&(OPMASK+FMASK) = FMASK %START

    if (TYPE & OPMASK + FMASK != FMASK) goto L_00E1;

      //   776      %IF VAL = LABMIN-1 %START

    if (VAL != LABMIN - 1) goto L_00E2;

      //   777      LABMIN = VAL;  !!%MONITOR 22 %IF LABMIN = ALMAX

    LABMIN = VAL;

    //   778      %FINISH

  L_00E2:;

  //   779      VAL = INTEGER(VAL)

    VAL = *_imp_INTEGER(VAL);

    //   780      FAULT('U') %IF VAL = 0

    if (VAL != 0) goto L_00E3;
    FAULT(85);
  L_00E3:;

  //   781      TYPE = TYPE-FMASK

    TYPE = TYPE - FMASK;

    //   782      %FINISH

  L_00E1:;

  //   783      %FINISH

  L_00E0:;

  //   784      %FINISH

  L_00DF:;

  //   785      PEND = 0

    PEND = 0;

    //   786      %IF TYPE = REG %AND TERM = '(' %START

    if (TYPE != REG) goto L_00E4;
    if (TERM != 40) goto L_00E4;

      //   787      TYPE = 0 %IF SAVE&1 = 0;  VAL = VAL+SAVE;   !?

    if (SAVE & 1 != 0) goto L_00E5;
    TYPE = 0;
  L_00E5:;
    VAL = VAL + SAVE;

    //   788      %FINISH

  L_00E4:;

  //   789      %IF MODE # 0 %START

    if (MODE == 0) goto L_00E6;

      //   790      FAULT('I') %AND TYPE=0 %IF TYPE&OPMASK # 0

    if (TYPE & OPMASK == 0) goto L_00E7;
    FAULT(73);
    TYPE = 0;
  L_00E7:;

  //   791      %IF TYPE&REGXMASK # 0 %START

    if (TYPE & REGXMASK == 0) goto L_00E8;

      //   792      I = TYPE&15;  I = VAL %IF I = 0

    I = TYPE & 15;
    if (I != 0) goto L_00E9;
    I = VAL;
  L_00E9:;

  //   793      DUSE = DUSE+1 %IF I = DREG

    if (I != DREG) goto L_00EA;
    DUSE = DUSE + 1;
  L_00EA:;

  //   794      %FINISH

  L_00E8:;

  //   795      %FINISH

  L_00E6:;

  //   796      %IF TERM = '(' %START

    if (TERM != 40) goto L_00EB;

      //   797      GET SYM

    GETSYM();

    //   798      I = TYPE&31

    I = TYPE & 31;

    //   799      QUEUE(TYPE-I);  QUEUE(VAL)

    QUEUE(TYPE - I);
    QUEUE(VAL);

    //   800      NEST(-21);  NEST(0)

    NEST(-21);
    NEST(0);

    //   801      %IF I # 0 %START

    if (I == 0) goto L_00EC;

      //   802      QUEUE(REG);  QUEUE(I&15)

    QUEUE(REG);
    QUEUE(I & 15);

    //   803      NEST(-1)

    NEST(-1);

    //   804      %FINISH

  L_00EC:;

  //   805      ->E1

    goto U_100B;

    //   806      %FINISH

  L_00EB:;

  //   807      %finish %ELSE  %IF '0' <= SYM <= '9' %START

    goto L_00ED;
  L_00DD:;
    {
      // Double-sided test on SYM (Part I)
      int tmp;
      if (48 > (tmp = SYM)) goto L_00EE;
      // Double-sided test on SYM (Part II)
      if (tmp > 57) goto L_00EE;
    }

    //   808      TYPE = 0;  VAL = SYM-'0'

    TYPE = 0;
    VAL = SYM - 48;

    //   809      %CYCLE

  L_00EF:;

  //   810      SYM = CHAR(GETPOS)-'0'

    SYM = CHAR(GETPOS) - 48;

    //   811      %EXIT %UNLESS 0 <= SYM <= 9

    {
      // Double-sided test on SYM (Part I)
      int tmp;
      if (0 > (tmp = SYM)) goto L_00F0;
      // Double-sided test on SYM (Part II)
      if (tmp <= 9) goto L_00F1;
    }
  L_00F0:;
    goto L_00F2;
  L_00F1:;

  //   812      VAL = (VAL<<2+VAL)<<1+SYM

    VAL = ((VAL << 2) + VAL << 1) + SYM;

    //   813      GETPOS = GETPOS+1

    GETPOS = GETPOS + 1;

    //   814      %REPEAT

    goto L_00EF;
  L_00F2:;

  //   815      GET SYM

    GETSYM();

    //   816      %finish %ELSE  %IF SYM = 'X' %START

    goto L_00ED;
  L_00EE:;
    if (SYM != 88) goto L_00F3;

      //   817      TYPE = 0;  VAL = 0

    TYPE = 0;
    VAL = 0;

    //   818      %CYCLE

  L_00F4:;

  //   819      SYM = CHAR(GETPOS)-128

    SYM = CHAR(GETPOS) - 128;

    //   820      %EXIT %IF SYM < 0

    if (SYM >= 0) goto L_00F5;
    goto L_00F6;
  L_00F5:;

  //   821      SYM = SYM-32 %IF SYM >= 96; !ENSURE UPPER-CASE

    if (SYM < 96) goto L_00F7;
    SYM = SYM - 32;
  L_00F7:;

  //   822      %IF '0' <= SYM <= '9' %OR 'A' <= SYM <= 'F' %START

    {
      // Double-sided test on SYM (Part I)
      int tmp;
      if (48 > (tmp = SYM)) goto L_00F8;
      // Double-sided test on SYM (Part II)
      if (tmp <= 57) goto L_00F9;
    }
  L_00F8:;
    {
      // Double-sided test on SYM (Part I)
      int tmp;
      if (65 > (tmp = SYM)) goto L_00FA;
      // Double-sided test on SYM (Part II)
      if (tmp > 70) goto L_00FA;
    }
  L_00F9:;

  //   823      VAL = VAL<<4+SYM-'0'

    VAL = (VAL << 4) + SYM - 48;

    //   824      VAL = VAL-7 %IF SYM >= 'A'

    if (SYM < 65) goto L_00FB;
    VAL = VAL - 7;
  L_00FB:;

  //   825      %finish %ELSE  FAULT('H')

    goto L_00FC;
  L_00FA:;
    FAULT(72);
  L_00FC:;

  //   826      GETPOS = GETPOS+1

    GETPOS = GETPOS + 1;

    //   827      %REPEAT

    goto L_00F4;
  L_00F6:;

  //   828      GET SYM

    GETSYM();

    //   829      %finish %ELSE  %IF SYM&128 # 0 %START

    goto L_00ED;
  L_00F3:;
    if (SYM & 128 == 0) goto L_00FD;

      //   830      TYPE = 0;  VAL = SYM-128

    TYPE = 0;
    VAL = SYM - 128;

    //   831      GET SYM

    GETSYM();

    //   832      %IF MODE >= 0 %AND SYM&128 # 0 %START

    if (MODE < 0) goto L_00FE;
    if (SYM & 128 == 0) goto L_00FE;

      //   833      VAL = VAL<<8+SYM-128;  GET SYM

    VAL = (VAL << 8) + SYM - 128;
    GETSYM();

    //   834      %FINISH

  L_00FE:;

  //   835      %finish %ELSE  %IF S('.') %START

    goto L_00ED;
  L_00FD:;
    if (!(S(46))) goto L_00FF;

      //   836      ->ERR %IF %NOT TAG

    if (TAG()) goto L_0100;
    goto U_100C;
  L_0100:;

  //   837      TYPE = 0;  VAL = TAG1

    TYPE = 0;
    VAL = TAG1;

    //   838      %finish %ELSE  %IF S('*') %START

    goto L_00ED;
  L_00FF:;
    if (!(S(42))) goto L_0101;

      //   839      TYPE = LOCTYPE&63;  VAL = LOC

    TYPE = LOCTYPE & 63;
    VAL = LOC;

    //   840      %IF SYM = 'L' %START;          !FOR NOW

    if (SYM != 76) goto L_0102;

      //   841      TYPE = 0;  VAL = LIST %IF TAG

    TYPE = 0;
    if (!(TAG())) goto L_0103;
    VAL = LIST;
  L_0103:;

  //   842      %FINISH

  L_0102:;

  //   843      %finish %ELSE  %IF SYM = '-' %START

    goto L_00ED;
  L_0101:;
    if (SYM != 45) goto L_0104;

      //   844      TYPE = 0;  VAL = 0

    TYPE = 0;
    VAL = 0;

    //   845      %finish %ELSE  %IF SYM = '\' %START

    goto L_00ED;
  L_0104:;
    if (SYM != 92) goto L_0105;

      //   846      TYPE = 0;  VAL = \0

    TYPE = 0;
    VAL = (~0);

    //   847      %finish %ELSE  ->ERR

    goto L_00ED;
  L_0105:;
    goto U_100C;
  L_00ED:;

  //   848      QUEUE(TYPE);  QUEUE(VAL)

    QUEUE(TYPE);
    QUEUE(VAL);

    //   849
    //   850      %WHILE NP # NBASE %CYCLE

  L_0106:;
    if (NP == NBASE) goto L_0107;

      //   851      %IF INTEGER(NP) < 0 %START

    if (*_imp_INTEGER(NP) >= 0) goto L_0108;

      //   852      QUEUE(INTEGER(NP))

    QUEUE(*_imp_INTEGER(NP));

    //   853      %finish %ELSE  %START

    goto L_0109;
  L_0108:;

  //   854      %EXIT %IF %NOT S(')')

    if (S(41)) goto L_010A;
    goto L_0107;
  L_010A:;

  //   855      %FINISH

  L_0109:;

  //   856      NP = NP+1

    NP = NP + 1;

    //   857      %REPEAT

    goto L_0106;
  L_0107:;

  //   858
  //   859      NEST(-1) %AND ->E1 %IF S('+')

    if (!(S(43))) goto L_010B;
    NEST(-1);
    goto U_100B;
  L_010B:;

  //   860      NEST(-2) %AND ->E1 %IF S('-')

    if (!(S(45))) goto L_010C;
    NEST(-2);
    goto U_100B;
  L_010C:;

  //   861      NEST(-3) %AND ->E1 %IF S('&')

    if (!(S(38))) goto L_010D;
    NEST(-3);
    goto U_100B;
  L_010D:;

  //   862      NEST(-4) %AND ->E1 %IF S('!')

    if (!(S(33))) goto L_010E;
    NEST(-4);
    goto U_100B;
  L_010E:;

  //   863      NEST(-5) %AND ->E1 %IF S('\')

    if (!(S(92))) goto L_010F;
    NEST(-5);
    goto U_100B;
  L_010F:;

  //   864      NEST(-6) %AND ->E1 %IF SS('<')

    if (!(SS(60))) goto L_0110;
    NEST(-6);
    goto U_100B;
  L_0110:;

  //   865      NEST(-7) %AND ->E1 %IF SS('>')

    if (!(SS(62))) goto L_0111;
    NEST(-7);
    goto U_100B;
  L_0111:;

  //   866      NEST(-8) %AND ->E1 %IF S('_')

    if (!(S(95))) goto L_0112;
    NEST(-8);
    goto U_100B;
  L_0112:;

  //   867      %RETURN %IF NP = NBASE

    if (NP != NBASE) goto L_0113;
    return;
  L_0113:;

  //   868  ERR:NP = NBASE

  U_100C:;
    NP = NBASE;

    //   869      !!%MONITOR 19
    //   870  %END

    return;
  } /* end of GETEXP */

  //   871
  //   872  %ROUTINE GET COND

  void GETCOND(void) {
    //   873  %OWNINTEGER AND=1717, OR=16873

    static int AND = 1717;
    static int OR = 16873;

    //   874  %INTEGER J,K

    int J;
    int K;

    //   875      TRANSF = QSTART;  QSTART = QLIM

    TRANSF = QSTART;
    QSTART = QLIM;

    //   876      J = 0

    J = 0;

    //   877      %CYCLE

  L_0114:;

  //   878      GET EXP

    GETEXP();

    //   879      %IF S('=') %START

    if (!(S(61))) goto L_0115;

      //   880      K = 5

    K = 5;

    //   881      %finish %ELSE  %IF S('#') %START

    goto L_0116;
  L_0115:;
    if (!(S(35))) goto L_0117;

      //   882      K = 4

    K = 4;

    //   883      %finish %ELSE  %IF S('<') %START

    goto L_0116;
  L_0117:;
    if (!(S(60))) goto L_0118;

      //   884      K = 3;  K = 7 %IF S('=')

    K = 3;
    if (!(S(61))) goto L_0119;
    K = 7;
  L_0119:;

  //   885      %finish %ELSE  %IF S('>') %START

    goto L_0116;
  L_0118:;
    if (!(S(62))) goto L_011A;

      //   886      K = 6;  K = 2 %IF S('=')

    K = 6;
    if (!(S(61))) goto L_011B;
    K = 2;
  L_011B:;

  //   887      %finish %ELSE  %START

    goto L_0116;
  L_011A:;

  //   888      QUEUE(-12)

    QUEUE(-12);

    //   889      %RETURN

    return;

    //   890      %FINISH

  L_0116:;

  //   891      GET EXP

    GETEXP();

    //   892      QUEUE(-2);  !SUBTRACT

    QUEUE(-2);

    //   893      QUEUE(-11);  QUEUE(K)

    QUEUE(-11);
    QUEUE(K);

    //   894      %RETURN %IF %NOT TAG

    if (TAG()) goto L_011C;
    return;
  L_011C:;

  //   895      %IF TAG1 = AND %AND TAG2 = 0 %START

    if (TAG1 != AND) goto L_011D;
    if (TAG2 != 0) goto L_011D;

      //   896      !!%MONITOR 19 %IF J < 0
      //   897      J = 1;  QUEUE(-13)

    J = 1;
    QUEUE(-13);

    //   898      %finish %ELSE  %START

    goto L_011E;
  L_011D:;

  //   899      !!%MONITOR 19 %IF TAG1 # OR %OR J > 0
  //   900      J = -1;  QUEUE(-14)

    J = -1;
    QUEUE(-14);

    //   901      %FINISH

  L_011E:;

  //   902      %REPEAT

    goto L_0114;

    //   903  %END

  } /* end of GETCOND */

  // ?OR unused
  //   904
  //   905  %ROUTINE GET INST

  void GETINST(void) {
    //   906  %INTEGER I

    int I;

    //   907      QUEUE(TYPE);  QUEUE(VAL)

    QUEUE(TYPE);
    QUEUE(VAL);

    //   908      %RETURN %IF TERM # ' ';           !NO OPERAND FOLLOWING =>

    if (TERM == 32) goto L_011F;
    return;
  L_011F:;

  //   909      %CYCLE

  L_0120:;

  //   910      GET EXP

    GETEXP();

    //   911      QUEUE(-22)

    QUEUE(-22);

    //   912      %RETURN %IF %NOT S(',')

    if (S(44)) goto L_0121;
    return;
  L_0121:;

  //   913      %REPEAT

    goto L_0120;

    //   914  %END

  } /* end of GETINST */

  // ?I unused
  //   915
  //   916  %ROUTINE READ LINE

  void READLINE(void) {
    //   917  %INTEGER Q

    int Q;

    //   918      PUTPOS = STARTPOS

    PUTPOS = STARTPOS;

    //   919      %IF MP = 0 %START

    if (MP != 0) goto L_0122;

      //   920      Q = 0;  PSEUDOLIM = 0

    Q = 0;
    PSEUDOLIM = 0;

    //   921      %CYCLE

  L_0123:;

  //   922      READ SYMBOL(SYM)

    _imp_READSYMBOL(/*?*/ &SYM);

    //   923      READ SYMBOL(SYM) %AND Q=Q!!128 %IF SYM = ''''

    if (SYM != 39) goto L_0124;
    _imp_READSYMBOL(/*?*/ &SYM);
    Q = Q ^ 128;
  L_0124:;

  //   924      %EXIT %IF SYM = NL

    if (SYM != 10) goto L_0125;
    goto L_0126;
  L_0125:;

  //   925      SYM = SYM-32 %IF SYM-Q >= 96; !LOWER-CASE -> UPPER-CASE

    if (SYM - Q < 96) goto L_0127;
    SYM = SYM - 32;
  L_0127:;

  //   926      SYM = SYM+Q

    SYM = SYM + Q;

    //   927      %EXIT %IF SYM = '/' %AND PSEUDOLIM # 0

    if (SYM != 47) goto L_0128;
    if (PSEUDOLIM == 0) goto L_0128;
    goto L_0126;
  L_0128:;

  //   928      %IF SYM = ' ' %START

    if (SYM != 32) goto L_0129;

      //   929      PSEUDOLIM = PUTPOS %IF PSEUDOLIM = 0

    if (PSEUDOLIM != 0) goto L_012A;
    PSEUDOLIM = PUTPOS;
  L_012A:;

  //   930      %finish %ELSE  PSEUDOLIM = 0

    goto L_012B;
  L_0129:;
    PSEUDOLIM = 0;
  L_012B:;

  //   931      PUT CHAR(SYM)

    PUTCHAR(SYM);

    //   932      %REPEAT

    goto L_0123;
  L_0126:;

  //   933      %IF PSEUDOLIM # 0 %START

    if (PSEUDOLIM == 0) goto L_012C;

      //   934      Q = PUTPOS;  PUTPOS = PSEUDOLIM

    Q = PUTPOS;
    PUTPOS = PSEUDOLIM;

    //   935      PUT CHAR(NL)

    PUTCHAR(10);

    //   936      PUTPOS = Q

    PUTPOS = Q;

    //   937      %FINISH

  L_012C:;

  //   938      %CYCLE

  L_012D:;

  //   939      PUT CHAR(SYM)

    PUTCHAR(SYM);

    //   940      %EXIT %IF SYM = NL

    if (SYM != 10) goto L_012E;
    goto L_012F;
  L_012E:;

  //   941      READ SYMBOL(SYM)

    _imp_READSYMBOL(/*?*/ &SYM);

    //   942      %REPEAT

    goto L_012D;
  L_012F:;

  //   943      PRINTPOS = STARTPOS

    PRINTPOS = STARTPOS;

    //   944      %finish %ELSE  %START

    goto L_0130;
  L_0122:;

  //   945      GETPOS = INTEGER(MP)

    GETPOS = *_imp_INTEGER(MP);

    //   946      %IF CHAR(GETPOS) = 0 %START

    if (CHAR(GETPOS) != 0) goto L_0131;

      //   947      QBASE = MP

    QBASE = MP;

    //   948      %IF INTEGER(MP+1)&16_8000 # 0 %START

    if (*_imp_INTEGER(MP + 1) & 32768 == 0) goto L_0132;

      //   949      %WHILE INTEGER(NP)&16_8000 = 0 %CYCLE

  L_0133:;
    if (*_imp_INTEGER(NP) & 32768 != 0) goto L_0134;

      //   950      FAULT('C');  NP = NP+2

    FAULT(67);
    NP = NP + 2;

    //   951      %REPEAT

    goto L_0133;
  L_0134:;

  //   952      SET LAB(LOC)

    SETLAB(LOC);

    //   953      %FINISH

  L_0132:;

  //   954      GETPOS = INTEGER(MP+2)

    GETPOS = *_imp_INTEGER(MP + 2);

    //   955      STARTPOS = INTEGER(MP+3)

    STARTPOS = *_imp_INTEGER(MP + 3);

    //   956      MP = INTEGER(MP+4)

    MP = *_imp_INTEGER(MP + 4);

    //   957      PRINTPOS = 0 %IF LIST&2 # 0

    if (LIST & 2 == 0) goto L_0135;
    PRINTPOS = 0;
  L_0135:;

  //   958      GET SYM;                    !TERMINATOR

    GETSYM();

    //   959      GET SYM %IF SYM = ';'

    if (SYM != 59) goto L_0136;
    GETSYM();
  L_0136:;

  //   960      %RETURN

    return;

    //   961      %FINISH

  L_0131:;

  //   962      PRINTPOS = STARTPOS %IF LIST&2 # 0

    if (LIST & 2 == 0) goto L_0137;
    PRINTPOS = STARTPOS;
  L_0137:;

  //   963      %CYCLE

  L_0138:;

  //   964      SYM = CHAR(GETPOS);  GETPOS = GETPOS+1

    SYM = CHAR(GETPOS);
    GETPOS = GETPOS + 1;

    //   965      %IF TAG %START

    if (!(TAG())) goto L_0139;

      //   966      SYM=TERM %AND GETPOS=GETPOS-1 %IF TERM = ' '

    if (TERM != 32) goto L_013A;
    SYM = TERM;
    GETPOS = GETPOS - 1;
  L_013A:;

  //   967      TYPE = INTEGER(MP);  VAL = GETPOS-1

    TYPE = *_imp_INTEGER(MP);
    VAL = GETPOS - 1;

    //   968      LOOKUP(4)

    LOOKUP(4);

    //   969      %WHILE TYPE # VAL %CYCLE

  L_013B:;
    if (TYPE == VAL) goto L_013C;

      //   970      PUT CHAR(CHAR(TYPE))

    PUTCHAR(CHAR(TYPE));

    //   971      TYPE = TYPE+1

    TYPE = TYPE + 1;

    //   972      %REPEAT

    goto L_013B;
  L_013C:;

  //   973      %FINISH

  L_0139:;

  //   974      %IF SYM = '?' %START

    if (SYM != 63) goto L_013D;

      //   975      PUT CHAR(INTEGER(MP+1)>>5&31+'A')

    PUTCHAR(((unsigned int)*_imp_INTEGER(MP + 1) >> 5 & 31) + 65);

    //   976      SYM = INTEGER(MP+1)&31+'A'

    SYM = (*_imp_INTEGER(MP + 1) & 31) + 65;

    //   977      %FINISH

  L_013D:;

  //   978      PUT CHAR(SYM)

    PUTCHAR(SYM);

    //   979      INTEGER(MP) = GETPOS

    *_imp_INTEGER(MP) = GETPOS;

    //   980      %EXIT %IF SYM = NL

    if (SYM != 10) goto L_013E;
    goto L_013F;
  L_013E:;

  //   981      %REPEAT

    goto L_0138;
  L_013F:;

  //   982      %FINISH

  L_0130:;

  //   983      QBASE = (PUTPOS+1)>>1

    QBASE = (unsigned int)PUTPOS + 1 >> 1;

    //   984      GETPOS = STARTPOS;  GET SYM

    GETPOS = STARTPOS;
    GETSYM();

    //   985  %END

    return;
  } /* end of READLINE */

  //   986
  //   987  %ROUTINE SCAN ARG

  void SCANARG(void) {
    //   988  !    SET TYPE,VAL TO START,LIM OF ARG IF NOT NULL
    //   989  %INTEGER I,J

    int I;
    int J;

    //   990      %RETURN %IF SYM='I' %AND CHAR(GETPOS)='F' %AND CHAR(GETPOS+1)=' '

    if (SYM != 73) goto L_0140;
    if (CHAR(GETPOS) != 70) goto L_0140;
    if (CHAR(GETPOS + 1) != 32) goto L_0140;
    return;
  L_0140:;

  //   991      I = GETPOS-1;  I = GETPOS %IF SYM = '['

    I = GETPOS - 1;
    if (SYM != 91) goto L_0141;
    I = GETPOS;
  L_0141:;

  //   992      J = 0

    J = 0;

    //   993      %CYCLE

  L_0142:;

  //   994      %EXIT %IF SYM = NL

    if (SYM != 10) goto L_0143;
    goto L_0144;
  L_0143:;

  //   995      %EXIT %IF (SYM=' ' %OR SYM=',' %OR SYM=';') %AND J<=0

    if (SYM == 32) goto L_0145;
    if (SYM == 44) goto L_0145;
    if (SYM != 59) goto L_0146;
  L_0145:;
    if (J > 0) goto L_0146;
    goto L_0144;
  L_0146:;

  //   996      J = J+1 %IF SYM = '['

    if (SYM != 91) goto L_0147;
    J = J + 1;
  L_0147:;

  //   997      %IF SYM = ']' %START

    if (SYM != 93) goto L_0148;

      //   998      J = J-1;  %EXIT %IF J = 0

    J = J - 1;
    if (J != 0) goto L_0149;
    goto L_0144;
  L_0149:;

  //   999      %FINISH

  L_0148:;

  //  1000      SYM = CHAR(GETPOS);  GETPOS = GETPOS+1

    SYM = CHAR(GETPOS);
    GETPOS = GETPOS + 1;

    //  1001      %REPEAT

    goto L_0142;
  L_0144:;

  //  1002      %IF GETPOS-1 # I %START

    if (GETPOS - 1 == I) goto L_014A;

      //  1003      TYPE = I;  VAL = GETPOS-1

    TYPE = I;
    VAL = GETPOS - 1;

    //  1004      %FINISH

  L_014A:;

  //  1005      GET SYM %IF SYM = ']'

    if (SYM != 93) goto L_014B;
    GETSYM();
  L_014B:;

  //  1006  %END

    return;
  } /* end of SCANARG */

  //  1007
  //  1008  %ROUTINE SET ACC

  void SETACC(void) {
    //  1009  %INTEGER I

    int I;

    //  1010      ACC = -1;  ATYPE = -1;  CREG = -1

    ACC = -1;
    ATYPE = -1;
    CREG = -1;

    //  1011      I = TEMPS

    I = TEMPS;

    //  1012      %RETURN %IF I = 0

    if (I != 0) goto L_014C;
    return;
  L_014C:;

  //  1013      %CYCLE

  L_014D:;

  //  1014      ACC = ACC+1

    ACC = ACC + 1;

    //  1015      %RETURN %IF I&1 # 0

    if (I & 1 == 0) goto L_014E;
    return;
  L_014E:;

  //  1016      I = I>>1

    I = (unsigned int)I >> 1;

    //  1017      %REPEAT

    goto L_014D;

    //  1018  %END

  } /* end of SETACC */

  //  1019
  //  1020  !MAIN PROGRAM
  //  1021
  //  1022  !RADIX 36 CONSTANTS
  //  1023  %OWNINTEGER B=2184, IF=9991, ELS=5950, E=5403, FIN=6907, ISH=10490

  static int B = 2184;
  static int IF = 9991;
  static int ELS = 5950;
  static int E = 5403;
  static int FIN = 6907;
  static int ISH = 10490;

  //  1024  %OWNINTEGER JUM=11642, P=17206, PS=17983, DEF=4605, END=6009

  static int JUM = 11642;
  static int P = 17206;
  static int PS = 17983;
  static int DEF = 4605;
  static int END = 6009;

  //  1025
  //  1026  %INTEGER I,J,K

  int I;
  int J;
  int K;

  //  1027  !!%FAULT 19 ->ERR;                      !RECOGNITION ERROR
  //  1028  !!%FAULT 9 ->BEND;                      !INPUT ENDED
  //  1029
  //  1030      %CYCLE I = 1,1,SBOUND

  // %for I = 1, 1, SBOUND %cycle
  {
    int _final = SBOUND;
    if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, SBOUND");
    I = 0;
  L_014F:
    if (I == _final) goto L_0150;
    I += 1;

    //  1031      STORE(I) = 0

    STORE[I - 1] = 0;

    //  1032      %REPEAT

    goto L_014F;
  }

L_0150:;

//  1033      CODEPOS = ADDR(STORE(1))

  CODEPOS = _imp_ADDR(/*?*/ &STORE[0]);

  //  1034      MACLIM = (CODEPOS+20)<<1

  MACLIM = CODEPOS + 20 << 1;

  //  1035      STORELIM = ADDR(STORE(SBOUND))

  STORELIM = _imp_ADDR(/*?*/ &STORE[SBOUND - 1]);

  //  1036      NP = STORELIM

  NP = STORELIM;

  //  1037      LABLIM = NP-60

  LABLIM = NP - 60;

  //  1038      BP = LABLIM

  BP = LABLIM;

  //  1039      DEFLIM = STORELIM-(SBOUND>>2)

  DEFLIM = STORELIM - ((unsigned int)SBOUND >> 2);

  //  1040      DEFMIN = DEFLIM

  DEFMIN = DEFLIM;

  //  1041      INTEGER(BP) = DEFLIM

  *_imp_INTEGER(BP) = DEFLIM;

  //  1042      SELECT INPUT(PRE)

  _imp_SELECTINPUT(PRE);

  //  1043  DO PASS:

U_100D:;

//  1044      PUT WORD(0) %AND CONTROL=16_20 %IF PASS > 0

  if (PASS <= 0) goto L_0152;
  PUTWORD(0);
  CONTROL = 32;
L_0152:;

//  1045      STARTPOS = MACLIM

  STARTPOS = MACLIM;

  //  1046      MP = 0

  MP = 0;

  //  1047      ALMAX = DEFLIM

  ALMAX = DEFLIM;

  //  1048      LABMIN = LABLIM

  LABMIN = LABLIM;

  //  1049      ASSCOND = 1;  SKIP = 0

  ASSCOND = 1;
  SKIP = 0;

  //  1050      LOCTYPE = MEMMASK+RELMASK;  LOC = 0

  LOCTYPE = MEMMASK + RELMASK;
  LOC = 0;

  //  1051      SET ACC

  SETACC();

  //  1052  READ: FSYM = ' ';  FAULTPOS = 0

U_100E:;
  FSYM = 32;
  FAULTPOS = 0;

  //  1053      READ LINE

  READLINE();

  //  1054  NEXT:

U_100F:;

//  1055      DREG = -1

  DREG = -1;

  //  1056      MODE = 0

  MODE = 0;

  //  1057      PEND = 0;  COND = 0

  PEND = 0;
  COND = 0;

  //  1058      QSTART = QBASE;  QLIM = QSTART

  QSTART = QBASE;
  QLIM = QSTART;

  //  1059      FLAG = 0

  FLAG = 0;

  //  1060      %IF S('$') %START

  if (!(S(36))) goto L_0153;

    //  1061      ->NEWPAGE %IF SYM = '/'

  if (SYM != 47) goto L_0154;
  goto U_1010;
L_0154:;

//  1062      ->ERR %IF %NOT TAG

  if (TAG()) goto L_0155;
  goto U_1011;
L_0155:;

//  1063      ->ASSIF %IF TAG1 = IF

  if (TAG1 != IF) goto L_0156;
  goto U_1012;
L_0156:;

//  1064      ->ASSELSE %IF TAG1 = ELS

  if (TAG1 != ELS) goto L_0157;
  goto U_1013;
L_0157:;

//  1065      ->ASSFIN %IF TAG1 = FIN

  if (TAG1 != FIN) goto L_0158;
  goto U_1014;
L_0158:;

//  1066      ->LEND %IF SKIP # 0

  if (SKIP == 0) goto L_0159;
  goto U_1015;
L_0159:;

//  1067      ->DEFINE %IF TAG1 = DEF

  if (TAG1 != DEF) goto L_015A;
  goto U_1000;
L_015A:;

//  1068      ->DEFINE %IF TAG1 = 19625;     !RED

  if (TAG1 != 19625) goto L_015B;
  goto U_1000;
L_015B:;

//  1069      ->LISTC %IF TAG1 = 13350;      !LIS

  if (TAG1 != 13350) goto L_015C;
  goto U_1016;
L_015C:;

//  1070      ->TEMP %IF TAG1 = 21780;       !TEM

  if (TAG1 != 21780) goto L_015D;
  goto U_1001;
L_015D:;

//  1071      ->LOCC %IF TAG1 = 13556;       !LOC

  if (TAG1 != 13556) goto L_015E;
  goto U_1002;
L_015E:;

//  1072      ->LOCC %IF TAG1 = 1917;        !ASS

  if (TAG1 != 1917) goto L_015F;
  goto U_1002;
L_015F:;

//  1073      ->SAVC %IF TAG1 = 20568;       !SAV

  if (TAG1 != 20568) goto L_0160;
  goto U_1017;
L_0160:;

//  1074      ->MACDEF %IF TAG1 = 14111;     !MAC

  if (TAG1 != 14111) goto L_0161;
  goto U_1003;
L_0161:;

//  1075      ->BEGIN %IF TAG1 = 2460;       !BEG

  if (TAG1 != 2460) goto L_0162;
  goto U_1004;
L_0162:;

//  1076      ->BEND %IF TAG1 = END

  if (TAG1 != END) goto L_0163;
  goto U_1005;
L_0163:;

//  1077      FAULT('U')

  FAULT(85);

  //  1078      ->LEND

  goto U_1015;

  //  1079      %FINISH

L_0153:;

//  1080      ->LEND %IF SKIP # 0 %OR SYM = '/'

  if (SKIP != 0) goto L_0151;
  if (SYM != 47) goto L_0164;
L_0151:;
  goto U_1015;
L_0164:;

//  1081      %IF SYM = NL %START

  if (SYM != 10) goto L_0165;

    //  1082      ->LEND %IF LINES < 54

  if (LINES >= 54) goto L_0166;
  goto U_1015;
L_0166:;

//  1083      DO NEWLINE %WHILE LINES # 0

L_0167:;
  if (LINES == 0) goto L_0168;
  DONEWLINE();
  goto L_0167;
L_0168:;

//  1084      ->READ

  goto U_100E;

  //  1085      %FINISH

L_0165:;

//  1086      %IF TAG %START

  if (!(TAG())) goto L_0169;

    //  1087      ->LABDEF %IF TERM = ':'

  if (TERM != 58) goto L_016A;
  goto U_1006;
L_016A:;

//  1088      MODE = 1

  MODE = 1;

  //  1089      ->ASSIGN %IF TERM = '(' %OR SYM = '='

  if (TERM == 40) goto L_016B;
  if (SYM != 61) goto L_016C;
L_016B:;
  goto U_1018;
L_016C:;

//  1090      ->JUMP %IF TAG1 = JUM %AND (TAG2=P %OR TAG2=PS)

  if (TAG1 != JUM) goto L_016D;
  if (TAG2 == P) goto L_016E;
  if (TAG2 != PS) goto L_016D;
L_016E:;
  goto U_1019;
L_016D:;

//  1091      ->IFC %IF TAG1 = IF

  if (TAG1 != IF) goto L_016F;
  goto U_101A;
L_016F:;

//  1092      ->ELSE %IF TAG1 = ELS %AND TAG2 = E

  if (TAG1 != ELS) goto L_0170;
  if (TAG2 != E) goto L_0170;
  goto U_101B;
L_0170:;

//  1093      ->FINISH %IF TAG1 = FIN %AND TAG2 = ISH

  if (TAG1 != FIN) goto L_0171;
  if (TAG2 != ISH) goto L_0171;
  goto U_101C;
L_0171:;

//  1094      ->WHILE %IF TAG1 = 25106 %AND TAG2 = 13173

  if (TAG1 != 25106) goto L_0172;
  if (TAG2 != 13173) goto L_0172;
  goto U_101D;
L_0172:;

//  1095      ->CYCLE %IF TAG1 = 4269 %AND TAG2 = 13173

  if (TAG1 != 4269) goto L_0173;
  if (TAG2 != 13173) goto L_0173;
  goto U_101E;
L_0173:;

//  1096      ->REPEAT %IF TAG1 = 19637 %AND TAG2 = 5544

  if (TAG1 != 19637) goto L_0174;
  if (TAG2 != 5544) goto L_0174;
  goto U_101F;
L_0174:;

//  1097      MODE=-2 %AND ->DATA %IF TAG1 = B

  if (TAG1 != B) goto L_0175;
  MODE = -2;
  goto U_1020;
L_0175:;

//  1098      TYPE = UMASK;  LOOKUP(0)

  TYPE = UMASK;
  LOOKUP(0);

  //  1099      ->MACCALL %IF TYPE&OPMASK = MACRO

  if (TYPE & OPMASK != MACRO) goto L_0176;
  goto U_1021;
L_0176:;

//  1100      ->MINST %IF TYPE&OPMASK # 0

  if (TYPE & OPMASK == 0) goto L_0177;
  goto U_1022;
L_0177:;

//  1101      FAULT('U') %AND ->LEND %IF TYPE&UMASK # 0

  if (TYPE & UMASK == 0) goto L_0178;
  FAULT(85);
  goto U_1015;
L_0178:;

//  1102      PEND = -1

  PEND = -1;

  //  1103      %FINISH

L_0169:;

//  1104      MODE = -1

  MODE = -1;

  //  1105  DATA:

U_1020:;

//  1106      %CYCLE

L_0179:;

//  1107      GET EXP;  ASSEMBLE

  GETEXP();
  ASSEMBLE();

  //  1108      FAULT('I') %IF TYPE&REGXMASK # 0

  if (TYPE & REGXMASK == 0) goto L_017A;
  FAULT(73);
L_017A:;

//  1109      I = 1

  I = 1;

  //  1110      %IF S('$') %START

  if (!(S(36))) goto L_017B;

    //  1111      I = VAL %IF VAL < 1000

  if (VAL >= 1000) goto L_017C;
  I = VAL;
L_017C:;

//  1112      QLIM = QSTART

  QLIM = QSTART;

  //  1113      GET EXP;  ASSEMBLE

  GETEXP();
  ASSEMBLE();

  //  1114      %FINISH

L_017B:;

//  1115      %WHILE I > 0 %CYCLE

L_017D:;
  if (I <= 0) goto L_017E;

    //  1116      %IF MODE # -1 %START

  if (MODE == -1) goto L_017F;

    //  1117      FAULT('T') %IF VAL&16_FF00 # 0

  if (VAL & 65280 == 0) goto L_0180;
  FAULT(84);
L_0180:;

//  1118      %IF MODE = -2 %START

  if (MODE != -2) goto L_0181;

    //  1119      J = VAL<<8;  MODE = -3

  J = VAL << 8;
  MODE = -3;

  //  1120      %finish %ELSE  %START

  goto L_0182;
L_0181:;

//  1121      VAL = VAL+J;  MODE = -2

  VAL = VAL + J;
  MODE = -2;

  //  1122      PLANT VAL

  PLANTVAL();

  //  1123      %FINISH

L_0182:;

//  1124      %finish %ELSE  %START

  goto L_0183;
L_017F:;

//  1125      PLANT VAL;  VAL = VAL&255

  PLANTVAL();
  VAL = VAL & 255;

  //  1126      %FINISH

L_0183:;

//  1127      I = I-1

  I = I - 1;

  //  1128      %REPEAT

  goto L_017D;
L_017E:;

//  1129      %EXIT %UNLESS S(',') %OR SYM&128 # 0

  if (S(44)) goto L_0184;
  if (SYM & 128 != 0) goto L_0184;
  goto L_0185;
L_0184:;

//  1130      %IF SYM = NL %START

  if (SYM != 10) goto L_0186;

    //  1131      PRINT LINE %IF PRINTPOS # 0;  READ LINE

  if (PRINTPOS == 0) goto L_0187;
  PRINTLINE();
L_0187:;
  READLINE();

  //  1132      QSTART = QBASE

  QSTART = QBASE;

  //  1133      %FINISH

L_0186:;

//  1134      QLIM = QSTART

  QLIM = QSTART;

  //  1135      %REPEAT

  goto L_0179;
L_0185:;

//  1136      VAL=J %AND PLANT VAL %IF MODE = -3

  if (MODE != -3) goto L_0188;
  VAL = J;
  PLANTVAL();
L_0188:;

//  1137      ->SEND

  goto U_1023;

  //  1138
  //  1139  LABDEF:

U_1006:;

//  1140      CREG = -1;  ATYPE = -1

  CREG = -1;
  ATYPE = -1;

  //  1141      GET SYM

  GETSYM();

  //  1142      FAULT('C') %AND NP=STORELIM %IF NP # STORELIM

  if (NP == STORELIM) goto L_0189;
  FAULT(67);
  NP = STORELIM;
L_0189:;

//  1143      TYPE = LOCTYPE;  VAL = LOC

  TYPE = LOCTYPE;
  VAL = LOC;

  //  1144      LOOKUP(7)

  LOOKUP(7);

  //  1145      ->NEXT

  goto U_100F;

  //  1146
  //  1147  ASSIGN:

U_1018:;

//  1148      PEND = 1

  PEND = 1;

  //  1149      GET EXP

  GETEXP();

  //  1150      ->ERR %IF %NOT S('=')

  if (S(61)) goto L_018A;
  goto U_1011;
L_018A:;

//  1151      QUEUE(-25);                       !'STORE'

  QUEUE(-25);

  //  1152      %IF INTEGER(QBASE) = REG %START

  if (*_imp_INTEGER(QBASE) != REG) goto L_018B;

    //  1153      DREG = INTEGER(QBASE+1)

  DREG = *_imp_INTEGER(QBASE + 1);

  //  1154      DUSE = 0

  DUSE = 0;

  //  1155      %FINISH

L_018B:;

//  1156      QSTART = QLIM;  MODE = 2

  QSTART = QLIM;
  MODE = 2;

  //  1157      GET EXP

  GETEXP();

  //  1158      QUEUE(-24);                       !'LOAD'

  QUEUE(-24);

  //  1159
  //  1160  CONDQ:

U_1024:;

//  1161      %IF TAGIF %START

  if (!(TAGIF())) goto L_018C;

    //  1162      MODE = MODE+4;  DREG = DREG-16; !SCARIFY

  MODE = MODE + 4;
  DREG = DREG - 16;

  //  1163      GET COND;  ASSEMBLE

  GETCOND();
  ASSEMBLE();

  //  1164      MODE = MODE-4;  DREG = DREG+16; !RESTORE

  MODE = MODE - 4;
  DREG = DREG + 16;

  //  1165      QLIM = QSTART;  QSTART = TRANSF

  QLIM = QSTART;
  QSTART = TRANSF;

  //  1166      %FINISH

L_018C:;

//  1167      ASSEMBLE

  ASSEMBLE();

  //  1168      ->SEND

  goto U_1023;

  //  1169
  //  1170  JUMP:

U_1019:;

//  1171      FLAG = TAG2-P;                    !POSITIVE IF SHORT

  FLAG = TAG2 - P;

  //  1172      GET EXP

  GETEXP();

  //  1173      QUEUE(-26);                       !'JUMP'

  QUEUE(-26);

  //  1174      ->CONDQ

  goto U_1024;

  //  1175
  //  1176  MINST:

U_1022:;

//  1177      MODE = -1

  MODE = -1;

  //  1178      GET INST

  GETINST();

  //  1179      QUEUE(-23);                       !'PLANT'

  QUEUE(-23);

  //  1180      ->CONDQ

  goto U_1024;

  //  1181
  //  1182  MACCALL:

U_1021:;

//  1183      QUEUE(VAL);                       !DEFPOS

  QUEUE(VAL);

  //  1184      QUEUE(TYPE&1023);                 !JOKER

  QUEUE(TYPE & 1023);

  //  1185      QUEUE(0);                         !(CALLPOS)

  QUEUE(0);

  //  1186      QUEUE(STARTPOS)

  QUEUE(STARTPOS);

  //  1187      QUEUE(MP)

  QUEUE(MP);

  //  1188      %CYCLE

L_018D:;

//  1189      %EXIT %IF CHAR(INTEGER(QBASE)) = NL; !END OF MAC DEF

  if (CHAR(*_imp_INTEGER(QBASE)) != 10) goto L_018E;
  goto L_018F;
L_018E:;

//  1190      I = GETPOS-1;                  !SAVE CALLPOS

  I = GETPOS - 1;

  //  1191      GETPOS = INTEGER(QBASE);  GET SYM

  GETPOS = *_imp_INTEGER(QBASE);
  GETSYM();

  //  1192      !!%MONITOR 24 %IF %NOT TAG
  //  1193      TYPE = 0;  VAL = 0

  TYPE = 0;
  VAL = 0;

  //  1194      SCAN ARG

  SCANARG();

  //  1195      GET SYM %IF SYM = ','

  if (SYM != 44) goto L_0190;
  GETSYM();
L_0190:;

//  1196      INTEGER(QBASE) = GETPOS-1;        !UPDATE DEFPOS

  *_imp_INTEGER(QBASE) = GETPOS - 1;

  //  1197      GETPOS = I;  GET SYM;             !RESTORE CALLPOS

  GETPOS = I;
  GETSYM();

  //  1198      SCAN ARG

  SCANARG();

  //  1199      GET SYM %IF SYM = ','

  if (SYM != 44) goto L_0191;
  GETSYM();
L_0191:;

//  1200      QUEUE(TAG1);  QUEUE(TAG2)

  QUEUE(TAG1);
  QUEUE(TAG2);

  //  1201      QUEUE(TYPE);  QUEUE(VAL)

  QUEUE(TYPE);
  QUEUE(VAL);

  //  1202      %REPEAT

  goto L_018D;
L_018F:;

//  1203      GET SYM %IF SYM = ' '

  if (SYM != 32) goto L_0192;
  GETSYM();
L_0192:;

//  1204      %IF TAGIF %START

  if (!(TAGIF())) goto L_0193;

    //  1205      GET COND; QUEUE(-18); ASSEMBLE

  GETCOND();
  QUEUE(-18);
  ASSEMBLE();

  //  1206      QLIM = QSTART

  QLIM = QSTART;

  //  1207      INTEGER(QBASE+1) = INTEGER(QBASE+1)+16_8000

  *_imp_INTEGER(QBASE + 1) = *_imp_INTEGER(QBASE + 1) + 32768;

  //  1208      %FINISH

L_0193:;

//  1209      QUEUE(0)

  QUEUE(0);

  //  1210      MP = QBASE; STARTPOS = QLIM<<1

  MP = QBASE;
  STARTPOS = QLIM << 1;

  //  1211      INTEGER(MP) = INTEGER(MP)+1

  *_imp_INTEGER(MP) = *_imp_INTEGER(MP) + 1;

  //  1212      INTEGER(MP+2) = GETPOS-1

  *_imp_INTEGER(MP + 2) = GETPOS - 1;

  //  1213      PRINT LINE %IF PRINTPOS # 0 %AND LIST&2 # 0

  if (PRINTPOS == 0) goto L_0194;
  if (LIST & 2 == 0) goto L_0194;
  PRINTLINE();
L_0194:;

//  1214      ->READ

  goto U_100E;

  //  1215
  //  1216  !CODING OF JUMPS: 1000 (SINGLE INST), 2000 (MAIN IF)
  //  1217  !                 4000 (ELSE), 6000 (IF AFTER ELSE)
  //  1218
  //  1219  IFC:

U_101A:;

//  1220      GET COND;  QUEUE(-15);  ASSEMBLE

  GETCOND();
  QUEUE(-15);
  ASSEMBLE();

  //  1221      ->SEND

  goto U_1023;

  //  1222
  //  1223  ELSE:

U_101B:;

//  1224      ->CERR %IF INTEGER(NP)&16_2000 = 0

  if (*_imp_INTEGER(NP) & 8192 != 0) goto L_0195;
  goto U_1025;
L_0195:;

//  1225      QUEUE(0);  QUEUE(0)

  QUEUE(0);
  QUEUE(0);

  //  1226      QUEUE(-16);  ASSEMBLE

  QUEUE(-16);
  ASSEMBLE();

  //  1227      ATYPE = -1; CREG = -1

  ATYPE = -1;
  CREG = -1;

  //  1228      %IF TAGIF %START

  if (!(TAGIF())) goto L_0196;

    //  1229      GET COND;  QUEUE(-17);  ASSEMBLE

  GETCOND();
  QUEUE(-17);
  ASSEMBLE();

  //  1230      %FINISH

L_0196:;

//  1231      ->SEND

  goto U_1023;

  //  1232
  //  1233  FINISH:

U_101C:;

//  1234      ->CERR %IF INTEGER(NP)&16_6000 = 0

  if (*_imp_INTEGER(NP) & 24576 != 0) goto L_0197;
  goto U_1025;
L_0197:;

//  1235      I = LOC

  I = LOC;

  //  1236      %WHILE INTEGER(NP)&16_4000 # 0 %CYCLE

L_0198:;
  if (*_imp_INTEGER(NP) & 16384 == 0) goto L_0199;

    //  1237      %IF INTEGER(NP)&16_2000 # 0 %START; !IF AFTER ELSE

  if (*_imp_INTEGER(NP) & 8192 == 0) goto L_019A;

    //  1238      SET LAB(I)

  SETLAB(I);

  //  1239      %finish %ELSE  %START

  goto L_019B;
L_019A:;

//  1240      SET LAB(LOC)

  SETLAB(LOC);

  //  1241      I = VAL+1

  I = VAL + 1;

  //  1242      %FINISH

L_019B:;

//  1243      %REPEAT

  goto L_0198;
L_0199:;

//  1244      SET LAB(I)

  SETLAB(I);

  //  1245      ->SEND

  goto U_1023;

  //  1246
  //  1247  WHILE:

U_101D:;

//  1248      I = LOC;  ATYPE = -1;  CREG = -1

  I = LOC;
  ATYPE = -1;
  CREG = -1;

  //  1249      GET COND;  QUEUE(-13); ASSEMBLE

  GETCOND();
  QUEUE(-13);
  ASSEMBLE();

  //  1250      NEST(I);  NEST(1)

  NEST(I);
  NEST(1);

  //  1251      ->SEND

  goto U_1023;

  //  1252
  //  1253  CYCLE:

U_101E:;

//  1254      NEST(LOC);  NEST(1)

  NEST(LOC);
  NEST(1);

  //  1255      ->SEND

  goto U_1023;

  //  1256
  //  1257  REPEAT:

U_101F:;

//  1258      ->CERR %IF INTEGER(NP) # 1

  if (*_imp_INTEGER(NP) == 1) goto L_019C;
  goto U_1025;
L_019C:;

//  1259      QUEUE(LOCTYPE);  QUEUE(INTEGER(NP+1))

  QUEUE(LOCTYPE);
  QUEUE(*_imp_INTEGER(NP + 1));

  //  1260      NP = NP+2

  NP = NP + 2;

  //  1261      QUEUE(-26);                       !'JUMP'

  QUEUE(-26);

  //  1262      FLAG = -1

  FLAG = -1;

  //  1263      ->CONDQ

  goto U_1024;

  //  1264
  //  1265  CERR:

U_1025:;

//  1266      FAULT('C')

  FAULT(67);

  //  1267      ->LEND

  goto U_1015;

  //  1268
  //  1269  SEND:

U_1023:;

//  1270      SET LAB(LOC) %IF INTEGER(NP)&16_1000 # 0

  if (*_imp_INTEGER(NP) & 4096 == 0) goto L_019D;
  SETLAB(LOC);
L_019D:;

//  1271      ->LEND %IF SYM = NL

  if (SYM != 10) goto L_019E;
  goto U_1015;
L_019E:;

//  1272      ->NEXT %IF S(';')

  if (!(S(59))) goto L_019F;
  goto U_100F;
L_019F:;

//  1273
//  1274  ERR:FSYM = 'F';  FAULTPOS = GETPOS-1

U_1011:;
  FSYM = 70;
  FAULTPOS = GETPOS - 1;

  //  1275      PRINTPOS = STARTPOS

  PRINTPOS = STARTPOS;

  //  1276
  //  1277  LEND:

U_1015:;

//  1278      ->READ %IF SKIP # 0 %AND LIST&4 = 0

  if (SKIP == 0) goto L_01A0;
  if (LIST & 4 != 0) goto L_01A0;
  goto U_100E;
L_01A0:;

//  1279      ->READ %IF FSYM = ' ' %AND CHARS = 0 %AND %C

  if (FSYM != 32) goto L_01A1;
  if (CHARS != 0) goto L_01A1;
  if (PRINTPOS == 0) goto L_01A2;
  if (MP == 0) goto L_01A1;
  if (LIST & 2 != 0) goto L_01A1;
L_01A2:;
  goto U_100E;
L_01A1:;

//  1280+      (PRINTPOS = 0 %OR (MP#0 %AND LIST&2=0))
//  1281      PRINT LINE

  PRINTLINE();

  //  1282      ->READ

  goto U_100E;

  //  1283
  //  1284  ASSIF:

U_1012:;

//  1285      ASSCOND = ASSCOND<<1

  ASSCOND = ASSCOND << 1;

  //  1286      ->LEND %IF SKIP # 0

  if (SKIP == 0) goto L_01A3;
  goto U_1015;
L_01A3:;

//  1287  A1: GET COND; ASSEMBLE

U_1026:;
  GETCOND();
  ASSEMBLE();

  //  1288      SKIP = ASSCOND %IF COND # 0

  if (COND == 0) goto L_01A4;
  SKIP = ASSCOND;
L_01A4:;

//  1289      PRINT LINE %IF PRINTPOS # 0

  if (PRINTPOS == 0) goto L_01A5;
  PRINTLINE();
L_01A5:;

//  1290      ->LEND

  goto U_1015;

  //  1291
  //  1292  ASSELSE:

U_1013:;

//  1293      %IF SKIP = 0 %START

  if (SKIP != 0) goto L_01A6;

    //  1294      ->CERR %IF ASSCOND&1 # 0

  if (ASSCOND & 1 == 0) goto L_01A7;
  goto U_1025;
L_01A7:;

//  1295      SKIP = ASSCOND

  SKIP = ASSCOND;

  //  1296      %finish %ELSE  %START

  goto L_01A8;
L_01A6:;

//  1297      ->LEND %IF SKIP # ASSCOND

  if (SKIP == ASSCOND) goto L_01A9;
  goto U_1015;
L_01A9:;

//  1298      SKIP = 0

  SKIP = 0;

  //  1299      ->A1 %IF TAGIF

  if (!(TAGIF())) goto L_01AA;
  goto U_1026;
L_01AA:;

//  1300      %FINISH

L_01A8:;

//  1301      ASSCOND = ASSCOND+1

  ASSCOND = ASSCOND + 1;

  //  1302      ->LEND

  goto U_1015;

  //  1303
  //  1304  ASSFIN:

U_1014:;

//  1305      ->CERR %IF ASSCOND = 1

  if (ASSCOND != 1) goto L_01AB;
  goto U_1025;
L_01AB:;

//  1306      ASSCOND = ASSCOND>>1

  ASSCOND = (unsigned int)ASSCOND >> 1;

  //  1307      SKIP = 0 %IF SKIP>>1 = ASSCOND

  if ((unsigned int)SKIP >> 1 != ASSCOND) goto L_01AC;
  SKIP = 0;
L_01AC:;

//  1308      ->LEND

  goto U_1015;

  //  1309
  //  1310  DEFINE:

U_1000:;

//  1311      FAULT('C') %IF NP # STORELIM

  if (NP == STORELIM) goto L_01AD;
  FAULT(67);
L_01AD:;

//  1312      I = TAG1

  I = TAG1;

  //  1313      %CYCLE

L_01AE:;

//  1314      ->ERR %IF %NOT (TAG %AND S('='))

  if (!(TAG())) goto L_01AF;
  if (S(61)) goto L_01B0;
L_01AF:;
  goto U_1011;
L_01B0:;

//  1315      J = TAG1;  K = TAG2

  J = TAG1;
  K = TAG2;

  //  1316      %IF TAG %START

  if (!(TAG())) goto L_01B1;

    //  1317      TYPE = UMASK;  LOOKUP(0)

  TYPE = UMASK;
  LOOKUP(0);

  //  1318      %IF TYPE&OPMASK # 0 %START

  if (TYPE & OPMASK == 0) goto L_01B2;

    //  1319      GET INST

  GETINST();

  //  1320      %finish %ELSE  %START

  goto L_01B3;
L_01B2:;

//  1321      PEND = -1;  GET EXP

  PEND = -1;
  GETEXP();

  //  1322      %FINISH

L_01B3:;

//  1323      %finish %ELSE  GET EXP

  goto L_01B4;
L_01B1:;
  GETEXP();
L_01B4:;

//  1324      ASSEMBLE

  ASSEMBLE();

  //  1325      TAG1 = J;  TAG2 = K

  TAG1 = J;
  TAG2 = K;

  //  1326      %IF I=DEF %THEN LOOKUP(3) %ELSE LOOKUP(2)

  if (I != DEF) goto L_01B5;
  LOOKUP(3);
  goto L_01B6;
L_01B5:;
  LOOKUP(2);
L_01B6:;

//  1327      %EXIT %UNLESS S(',')

  if (S(44)) goto L_01B7;
  goto L_01B8;
L_01B7:;

//  1328      QLIM = QSTART

  QLIM = QSTART;

  //  1329      %REPEAT

  goto L_01AE;
L_01B8:;

//  1330      ->SEND

  goto U_1023;

  //  1331
  //  1332  NEWPAGE:

U_1010:;

//  1333      DO NEWLINE %WHILE LINES # 0

L_01B9:;
  if (LINES == 0) goto L_01BA;
  DONEWLINE();
  goto L_01B9;
L_01BA:;

//  1334      ->LEND

  goto U_1015;

  //  1335
  //  1336  LISTC:

U_1016:;

//  1337      GET EXP;  ASSEMBLE

  GETEXP();
  ASSEMBLE();

  //  1338      LIST = VAL

  LIST = VAL;

  //  1339      ->SEND

  goto U_1023;

  //  1340
  //  1341  TEMP:

U_1001:;

//  1342      I = 0

  I = 0;

  //  1343      %IF SYM # NL %START

  if (SYM == 10) goto L_01BB;

    //  1344      %CYCLE

L_01BC:;

//  1345      GET EXP

  GETEXP();

  //  1346      FAULT('I') %IF TYPE # REG

  if (TYPE == REG) goto L_01BD;
  FAULT(73);
L_01BD:;

//  1347      I = I!1<<VAL

  I = I | 1 << VAL;

  //  1348      %EXIT %UNLESS S(',')

  if (S(44)) goto L_01BE;
  goto L_01BF;
L_01BE:;

//  1349      %REPEAT

  goto L_01BC;
L_01BF:;

//  1350      %FINISH

L_01BB:;

//  1351      TEMPS = I

  TEMPS = I;

  //  1352      SET ACC

  SETACC();

  //  1353      ->SEND

  goto U_1023;

  //  1354
  //  1355  LOCC:

U_1002:;

//  1356      I = TAG1

  I = TAG1;

  //  1357      GET EXP;  ASSEMBLE

  GETEXP();
  ASSEMBLE();

  //  1358      %IF TYPE&16_FF9F = 0 %START

  if (TYPE & 65439 != 0) goto L_01C0;

    //  1359      LOCTYPE = TYPE&RELMASK+MEMMASK;  LOC = VAL

  LOCTYPE = (TYPE & RELMASK) + MEMMASK;
  LOC = VAL;

  //  1360      PUT WORD(VAL-1) %AND CONTROL=16_30 %IF PASS > 0

  if (PASS <= 0) goto L_01C1;
  PUTWORD(VAL - 1);
  CONTROL = 48;
L_01C1:;

//  1361      %finish %ELSE  FAULT('I')

  goto L_01C2;
L_01C0:;
  FAULT(73);
L_01C2:;

//  1362      ->SEND

  goto U_1023;

  //  1363
  //  1364  SAVC:

U_1017:;

//  1365      GET EXP;  ASSEMBLE

  GETEXP();
  ASSEMBLE();

  //  1366      SAVE = VAL

  SAVE = VAL;

  //  1367      ->SEND

  goto U_1023;

  //  1368
  //  1369  MACDEF:

U_1003:;

//  1370      ->CERR %IF MP # 0

  if (MP == 0) goto L_01C3;
  goto U_1025;
L_01C3:;

//  1371      ->ERR %IF %NOT TAG

  if (TAG()) goto L_01C4;
  goto U_1011;
L_01C4:;

//  1372      J = TAG1;  K = TAG2

  J = TAG1;
  K = TAG2;

  //  1373      I = GETPOS-1

  I = GETPOS - 1;

  //  1374      %IF SYM # NL %START

  if (SYM == 10) goto L_01C5;

    //  1375      %CYCLE

L_01C6:;

//  1376      ->ERR %IF %NOT TAG

  if (TAG()) goto L_01C7;
  goto U_1011;
L_01C7:;

//  1377      SCAN ARG

  SCANARG();

  //  1378      %EXIT %IF %NOT S(',')

  if (S(44)) goto L_01C8;
  goto L_01C9;
L_01C8:;

//  1379      %REPEAT

  goto L_01C6;
L_01C9:;

//  1380      %FINISH

L_01C5:;

//  1381      ->ERR %IF SYM # NL

  if (SYM == 10) goto L_01CA;
  goto U_1011;
L_01CA:;

//  1382      TAG1 = J;  TAG2 = K

  TAG1 = J;
  TAG2 = K;

  //  1383      TYPE = MACRO;  VAL = I

  TYPE = MACRO;
  VAL = I;

  //  1384      LOOKUP(3)

  LOOKUP(3);

  //  1385      %CYCLE

L_01CB:;

//  1386      PRINT LINE

  PRINTLINE();

  //  1387      %EXIT %IF S('$') %AND TAG %AND TAG1 = END

  if (!(S(36))) goto L_01CC;
  if (!(TAG())) goto L_01CC;
  if (TAG1 != END) goto L_01CC;
  goto L_01CD;
L_01CC:;

//  1388      STARTPOS = PUTPOS

  STARTPOS = PUTPOS;

  //  1389      STARTPOS = PSEUDOLIM+1 %IF PSEUDOLIM # 0

  if (PSEUDOLIM == 0) goto L_01CE;
  STARTPOS = PSEUDOLIM + 1;
L_01CE:;

//  1390      READ LINE

  READLINE();

  //  1391      %REPEAT

  goto L_01CB;
L_01CD:;

//  1392      PUTPOS = STARTPOS;  PUT CHAR(0)

  PUTPOS = STARTPOS;
  PUTCHAR(0);

  //  1393      STARTPOS = PUTPOS

  STARTPOS = PUTPOS;

  //  1394      MACLIM = STARTPOS

  MACLIM = STARTPOS;

  //  1395      ->LEND

  goto U_1015;

  //  1396
  //  1397  %ROUTINE BNEST

  void BNEST(void) {
    //  1398      BP = BP+4;  !!%MONITOR 23 %IF BP-NP >= 0

    BP = BP + 4;

    //  1399      INTEGER(BP-3) = SAVE;  INTEGER(BP-2) = TEMPS

    *_imp_INTEGER(BP - 3) = SAVE;
    *_imp_INTEGER(BP - 2) = TEMPS;

    //  1400      INTEGER(BP-1) = MACLIM;  INTEGER(BP) = DEFMIN

    *_imp_INTEGER(BP - 1) = MACLIM;
    *_imp_INTEGER(BP) = DEFMIN;

    //  1401  %END

    return;
  } /* end of BNEST */

  //  1402
  //  1403  BEGIN:

U_1004:;

//  1404      BNEST

  BNEST();

  //  1405      ->NEWPAGE %IF SYM # NL

  if (SYM == 10) goto L_01CF;
  goto U_1010;
L_01CF:;

//  1406      ->LEND

  goto U_1015;

  //  1407
  //  1408  BEND:

U_1005:;

//  1409      FAULT('C') %IF NP # STORELIM %OR MP # 0

  if (NP != STORELIM) goto L_01D0;
  if (MP == 0) goto L_01D1;
L_01D0:;
  FAULT(67);
L_01D1:;

//  1410      MP = 0;  NP = STORELIM

  MP = 0;
  NP = STORELIM;

  //  1411      %IF BP # LABLIM %START

  if (BP == LABLIM) goto L_01D2;

    //  1412      SAVE = INTEGER(BP-3);  TEMPS = INTEGER(BP-2)

  SAVE = *_imp_INTEGER(BP - 3);
  TEMPS = *_imp_INTEGER(BP - 2);

  //  1413      MACLIM = INTEGER(BP-1);  STARTPOS = MACLIM

  MACLIM = *_imp_INTEGER(BP - 1);
  STARTPOS = MACLIM;

  //  1414      DEFMIN = INTEGER(BP)

  DEFMIN = *_imp_INTEGER(BP);

  //  1415      SET ACC

  SETACC();

  //  1416      BP = BP-4

  BP = BP - 4;

  //  1417      ->LEND %IF BP # LABLIM

  if (BP == LABLIM) goto L_01D3;
  goto U_1015;
L_01D3:;

//  1418      %FINISH

L_01D2:;

//  1419      CLOSE INPUT;  SELECT INPUT(MAIN)

  _imp_CLOSEINPUT();
  _imp_SELECTINPUT(MAIN);

  //  1420      BNEST

  BNEST();

  //  1421      LIST = 5

  LIST = 5;

  //  1422      PASS = PASS+1

  PASS = PASS + 1;

  //  1423      ->DO PASS %IF PASS # 2

  if (PASS == 2) goto L_01D4;
  goto U_100D;
L_01D4:;

//  1424
//  1425      PUT WORD(CHECK!!16_0100);  CONTROL = 16_30

  PUTWORD(CHECK ^ 256);
  CONTROL = 48;

  //  1426      PUT WORD(16_0100)

  PUTWORD(256);

  //  1427      SELECT OUTPUT(BIN);  PRINT CH(16_60);  SELECT OUTPUT(LIS)

  _imp_SELECTOUTPUT(BIN);
  _imp_PRINTCH(96);
  _imp_SELECTOUTPUT(LIS);

  //  1428      FAULT('$')

  FAULT(36);

  //  1429      PRINT LOC;  PRINT LINE

  PRINTLOC();
  PRINTLINE();

  //  1430      LINES = 60 %IF OUTDEV = 1

  if (_imp_OUTDEV() != 1) goto L_01D5;
  LINES = 60;
L_01D5:;

//  1431      DO NEWLINE %WHILE LINES # 0

L_01D6:;
  if (LINES == 0) goto L_01D7;
  DONEWLINE();
  goto L_01D6;
L_01D7:;

//  1432
//  1433  %ENDOFPROGRAM

  _imp_stop(0);
  return 0;
end_0:;
}