#include <perms.h>
int _imp_mainep(int _imp_argc, char **_imp_argv) {
  _imp_enter();
  extern int CONV(int X);
  extern void VECORPOINT(int I, int J, int K, int L);
  extern void PAUSE(void);
  extern void LOAD42(_imp_string FILE);
  extern void SET42(int NM);
  extern void CLEAR42(void);
  extern void CH3(int CHAR);
  extern void MODE42(int N);
  extern void LBR(void);
  extern void RBR(void);
  const int INITGRAPHP = 0x202E;
  extern int GRAPHP42;
  extern int CUR42MODE;
  extern int DDATA;
  extern int DSTART;
  extern int DLAST;
  extern int GRAPHP;
  extern int VECTORM;
  extern int POINTM;
  extern int CHARM;
  extern int BLEEP;
  extern int CHTXT;
  extern int CHPIC;
  extern int GRADV;
  extern int ADD2;
  extern int SET;
  extern int ADD1;
  extern int SETN;
  extern int WAIT;
  extern int PMOV;
  extern int CLR;
  extern int ACK;
  static int PEN = 0x4000;
  static int NORMAL = 0x9E54;
  static int DJUMP = 0xE000;
  static int FRAMETIME = 50;
  const int COREBOTTOM = 0x3FF0;
  const int CALL = 0;
  const int POSNAT = 0xC000;
  const int LINETO = 0x8000;
  int TEXTFLAG;
  int GMODE;
  int CURPIC;
  int CURMOVIE;
  int CURFRAME;
  int DEFPICTURE;
  int CURMODE;
  int FRAMEFLAG;
  int GRABLIST;
  int PICTUREPOINTER;
  const int TURTLESTART = 0x201A;
  const _imp_string GT42EXEC = _imp_str_literal("ECMI05.EXEC26");
  static int SHOWTURTLE42 = 1;

  typedef struct PICDIR {
    int PTR;
    int PTR42;
    int X;
    int Y;
    int FADDR;
    int MOVED;
    int MODE;
    int LASTMOVETIME;

  } PICDIR;
  static PICDIR INDEX42[1022 - 0 + 1];
  _imp_string SAVEPROMP;
  static int CAPFLAG = 0;
  int XCRANE;
  int YCRANE;
  int HDCRANE;
  const int CRANEMARK = 0x000F0000;
  const int CRANEMASK = 0xFFFF0000;
  extern void DRESUME(int LNB, int PC, int ADDR18);
  extern void REROUTECONTINGENCY(int EP, int CLASS, long int MASK,
                                 void (*RR)(void), int *FLAG);
  extern int READID(int ADR);
  extern void EDINNER(int ST, int SL, int SC1, int SC2, int AWSP, int *L);
  extern void DISCONNECT(_imp_string S);
  extern void CLOSESM(int CH);
  extern _imp_string UINFS(int TYPE);
  typedef struct F {
    int COUNT;
    int SPARE1;
    int SPARE2;
    _imp_string DATE;
    _imp_string TIME;
    _imp_string TRANS;
    int AD;
    int TYPE;
    int DST;
    int DEND;
    int SIZE;
    int RUP;
    int EEP;
    int MODE;
    int CONS;
    int ARCH;

  } F;
  extern void FINFO(_imp_string S, int LEV, F *R, int *FLAG);
  extern void FILL(int LEN, int ADDR, int VAL);
  extern void MOVE(int LENGTH, int FROM, int TO);
  extern _imp_string DATE(void);
  extern void LIST(_imp_string S);
  extern _imp_string TIME(void);
  extern double CPUTIME(void);
  extern int SMADDR(int CHANN, int *LENGTH);
  extern void DEFINE(_imp_string S);
  extern void PERMIT(_imp_string S);
  extern void NEWSMFILE(_imp_string S);
  extern void CHERISH(_imp_string S);
  extern void PROMPT(_imp_string M);
  extern void DESTROY(_imp_string S);
  extern void CLOSESTREAM(int CH);
  extern float RANDOM(int *I, int J);
  extern _imp_string INTERRUPT(void);
  extern void RENAME(_imp_string S);
  extern void CLEAR(_imp_string S);
  typedef struct RF {
    int CONAD;
    int TYPE;
    int START;
    int END;

  } RF;
  extern void CONNECT(_imp_string FILE, int MODE, int HOLE, int PROT, RF *R,
                      int *FLAG);
  auto void BADERROR(_imp_string ERRMESS, int CULPRIT);
  auto void APPLYUSR(int ENVIR, int FUN, int TSTFLG, int VAL, int *SEVERITY);
  auto void NOOLINE(int N);
  auto void PRSTRING(_imp_string WORD);
  auto int UNSTACK(void);
  auto int CHECKSTACK(void);
  auto void PRINTLIST(int LIST);
  auto void PRINTEL(int I);
  auto int HD(int LIST);
  auto int TL(int LIST);
  auto void PRINTLINE(int LINE);
  auto int READLINE(void);
  auto void LOGO(int STKTOP, int ENVIR, int SEVERITY);
  auto void DUMP(_imp_string ERRMESS);
  auto void GETPAGE(int FLAG);
  int FLENGTH;
  int FSTART;
  _imp_string EMASUSER;
  const int MAXSOURCE = 50000;
  extern void SIGNAL(int EP, int PARM, int EXTRA, int *FLAG);
  static int I;
  static int K;
  static int FLAG;
  static int ADUMP;
  static int R3;
  char INBUFF[500 - 0 + 1];
  int INPTR;
  int HEADIN;
  int UNUSEDHD;
  _imp_string *WA;
  _imp_string SFORM1[1022 - 0 + 1];
  static int WM = 1;
  static int NM = 4;
  static int T8 = 0xFF000000;
  int NUMTOP;
  int NUMBOT;
  static int MAXINT = 0x7FFFFFFF;
  static int RANSEED = 50003;
  _imp_string *WORK1;
  int LOGOTIME;
  int INTSTR[20 - 1 + 1];
  _imp_string SPACE4;
  int *HASHVAL;
  int *LBRAK;
  int *RBRAK;
  int *DOTS;
  int *EMPTY;
  int *UNDEF;
  int *AND;
  int *REPEAT;
  int *APPLY;
  int *DO;
  int *COMMA;
  int *QUOTE;
  int *LPAR;
  int *RPAR;
  int *MINUS;
  int *IF;
  int *THEN;
  int *ELSE;
  int *CLOSE;
  int *WHILE;
  int *UNMINUS;
  int *IFT;
  int *IFF;
  int *TRUE;
  int *FALSE;
  int *END;
  int *DELETE;
  int *UNDO;
  int *UNDOS;
  int *TO;
  int *ERR;
  int *LOGONAME;
  int *DEF;
  int *LANGBRKS;
  int *RANGBRKS;
  int *QUIT;
  int *BREAK;
  int *SPACE1;
  int *TAB;
  int *ENEL;
  int *START;
  int *FINISH;
  int *COMMENT;
  int NAMES[100 - 1 + 1];
  static int SPECHAR[14 - 1 + 1] = {':', '<', '>', '\'', '(', ')', '*',
                                    '+', ',', '-', '/',  '=', '[', ']'};
  int PRNUM;
  _imp_string PROMP;
  int EVALIMIT;
  int EVALCNT;
  int PARSELIMIT;
  int PARSECNT;
  char PARSEFORM[1022 - 0 + 1];
  char *FNPARSE;
  int *FNVAL;
  int *OLDFN;
  int *ASSOCWA;
  int *FNTEXT;
  int *FNLEN;
  int INTFORM1[1022 - 0 + 1];
  static int SYSPRE = 0x1000000;
  static int INFIX = 0x2000000;
  static int INTERP = 0x4000000;
  static int USERPRE = 0x8000000;
  static int B3B = 0x7F0000;
  static int B2 = 0xFFFF;
  static int B4 = 0x3F000000;
  static int M16 = 0xFFFF00;
  static int TRACEFLG = 0xC0000000;
  static int UNMASK = 0x3FFFFFFF;
  static int TRACE1 = 0x40000000;
  static int TRACE2 = 0x80000000;
  static int RESTART = 0;
  int INDENT;
  int *STK;
  int STKTOP;
  int STKPNT;
  int *SYSTK;
  int INTFORM2[2000 - 1 + 1];
  int SYSTKPNT;
  int *LA;
  int INTFORM3[65536 - 1 + 1];
  char *SOURCE;
  char SOURCEFORM[50000 - 0 + 1];
  int LINENUMLIST;
  int LEVEL;
  int FNDEFN;
  int SOURCEPTR;
  int PARLEVEL;
  int CONDFLAG;
  int DIAGFLAG;
  int PLEVEL;
  int GOFLAG;
  static int LA1B = 1;
  static int LA1T = 24576;
  static int LA2B = 24577;
  static int LA2T = 49152;
  static int LAFNB = 49153;
  static int LAFNT = 65536;
  int CLECTFLG;
  int LISTOP;
  int LPOINT;
  int LPOINT1;
  int LABASE;
  int SEMISIZE;
  float CFRACT;
  int QUOTEON;
  int BLEVEL;
  int *NIL;
  _imp_string SEP;
  static _imp_string STERMIN = _imp_str_literal("\n");
  static int TERMIN = 10;
  int CHAROUT;
  int ENUF;
  static int LM = 2;
  int *BNAME;
  int *BVALUE;
  int INTFORM4[3000 - 1023 + 1];
  int INTFORM5[3000 - 0 + 1];
  int BASENVIR;
  int TOPMARK;
  int *FACTKEYS;
  int *INFKEYS;
  int *IMPKEYS;
  int *FACT;
  int *IMPLIES;
  int *TOINFER;
  int *DATABASE;
  int *IMPRULES;
  int *INFRULES;
  int *THINKALOUD;
  int *NEW;
  int *VBL;
  int *NOT;
  int GENOS;
  int DBASE[3 - 1 + 1], IMPLINKS[3 - 1 + 1], INFLINKS[3 - 1 + 1];
  int JUMPFLAG;
  int JUMPOUT;
  int SENDFLAG;
  int LIBLOAD;
  int SUPERJMP;
  int QUITFLAG;
  int HOLDFLAG;
  int *QUITOTOP;
  static int TTY = 0;
  static int DISC = 1;
  static int SRCE = 2;
  int DEVICE;
  int INDEX;
  int NEWFN;
  int CACTFILE;
  int FLEN;
  int FILSTART;
  int TSTART;
  int SINDEX;
  int MDP;
  int MDIND;
  int UDP;
  int TXTP;
  _imp_string USERFILE;
  _imp_string MASWRITE;
  _imp_string MASREAD;
  _imp_string MASFILE;
  const _imp_string MASNUM = _imp_str_literal("ECMI05.");
  static _imp_string SYSFILES[2 - 1 + 1] = {_imp_str_literal("LOGALERT"),
                                            _imp_str_literal("EXEC26")};
  _imp_string OWNER;
  char *MDENTS;
  char *TMDENTS;
  char *UDENTS;
  char *TUDENTS;
  char *MDNEXT;
  char *TMDNEXT;
  char *UDNEXT;
  char *TUDNEXT;
  char *TXTNEXT;
  char *TTXTNEXT;
  char *ENDTXT;
  char *TENDTXT;
  char *TXTENTS;
  char *TTXTENTS;
  char *ENDIND;
  char *TENDIND;
  _imp_string *UDNAM;
  _imp_string *TUDNAM;
  _imp_string *FUNNAM;
  _imp_string *TFUNNAM;
  char *TXTIND;
  char *TTXTIND;
  char *FNTXT;
  char *TFNTXT;
  char *UDPAGE;
  char *TUDPAGE;
  char *TXTPAGE;
  char *TTXTPAGE;
  _imp_string DF[62 - 1 + 1];
  _imp_string FF[60 - 1 + 1];
  char XF[60 - 1 + 1];
  char PF[62 - 1 + 1];
  char SF[2 - 1 + 1];
  char NF[2 - 1 + 1][60 - 1 + 1];
  char TF[4092 - 0 + 1];
  int TDEV;
  static _imp_string TDEVNAMES[8 - 1 + 1] = {
      _imp_str_literal("PLOTTERA"), _imp_str_literal("PLOTTERB"),
      _imp_str_literal("DISPLAY"),  _imp_str_literal("TURTLE"),
      _imp_str_literal("TAPE"),     _imp_str_literal("MUSIC"),
      _imp_str_literal("MECCANO"),  _imp_str_literal("GT42")};
  float XTURTLE;
  float YTURTLE;
  int HDTURTLE;
  int PENTURTLE;
  static int HOOTBIT = 0x8080;
  static int PENBIT = 0x4000;
  static int FDBITS = 0x2800;
  static int BDBITS = 0x1800;
  static int RTBITS = 0x3800;
  static int LTBITS = 0x800;
  static int PINDLBIT = 0x1000;
  static int PINDRBIT = 0x4000;
  int *UP;
  int *DOWN;
  char BINBUFF[13 - 0 + 1];
  int ADDRBINBUFF;
  const int QU = 0x10;
  const int DTS = 0x20;
  const int FNM = 0x40;
  const int LP = 0x80;
  const int MARKERMASK = 0xFFFFFF0F;
  const int INTR = -1;
  const int FAULT = -2;
  int HASHINFO[1022 - 0 + 1];
  int HASH1023;
  int HASH1024;
  auto int HASH(_imp_string WORD) {
    _imp_enter();
    int WPOINT;
    int FULLMARK;
    int HASH;
    _imp_string W;
    auto int HASHFUN(void) {
      _imp_enter();
      *WORK1 = SPACE4;
      *WORK1 = WORD;
      return (HASHVAL - 1023 * (HASHVAL / 1023));
      _imp_leave();
    }
    FULLMARK = 0;
    WPOINT = HASHFUN();
    HASH = WPOINT;
  LP:;
    W = WA;
    HASH1023 = HASH1023 + 1;
    if (W == _imp_str_literal("?")) {
      *WA(/*index missing*/) = WORD;
      HASHINFO[WPOINT] = HASH;
      HASH1024 = HASH1024 + 1;
      return (WPOINT << 8 | WM);
    }
    if (W == WORD) {
      HASH1024 = HASH1024 + 1;
      return (WPOINT << 8 | WM);
    }
    WPOINT = WPOINT + 1;
    if (WPOINT > 1022) {
      if (FULLMARK == 1)
        BADERROR(_imp_str_literal("WORD AREA OVERFLOW"), EMPTY);
      else {
        FULLMARK = 1;
        WPOINT = 0;
      }
    }
    goto LP;
    _imp_leave();
  }
  auto int PUT(_imp_string WORD) {
    _imp_enter();
    int NUM;
    int I;
    int J;
    int CHAR;
    int TOOLONG;
    char STRBYTE[64 - 0 + 1];
    *STRING(ADDR) = WORD;
    I = STRBYTE[0];
    if (I > 7)
      TOOLONG = 1;
    else
      TOOLONG = 0;
    NUM = 0;
    J = 1;
    if (WORD == _imp_str_literal("")) return (HASH(WORD));
    while (I > 0) {
      CHAR = STRBYTE[I];
      if (47 < CHAR && CHAR < 58) {
        if (TOOLONG == 1) {
          I = I - 1;
          NUM = NUMTOP + 1;

        } else {
          NUM = NUM + (CHAR - 48) * J;
          J = J * 10;
          I = I - 1;
        }

      } else
        return (HASH(WORD));
    }
    if (NUM > NUMTOP) {
      PRSTRING(_imp_str_literal("NUMBER OUTSIDE RANGE."));
      SPACE();
      PRSTRING(_imp_str_literal("MAX. SUBSTITUTED"));
      NOOLINE(1);
      NUM = NUMTOP;
    }
    return (NUM << 8 | NM);
    _imp_leave();
  }
  auto _imp_string NUMTOSTR(int NUM) {
    _imp_enter();
    static int TENS[7 - 1 + 1] = {1000000, 100000, 10000, 1000, 100, 10, 1};
    int I;
    int J;
    int K;
    int L;
    int WIND;
    int MARK;
    char WORD[64 - 0 + 1];
    WIND = 1;
    MARK = 0;
    NUM = NUM >> 8;
    for (I = 1; I != 7 + 1; I += 1) {
      J = TENS[I];
      K = J;
      L = 0;
      while (NUM >= K) {
        K = K + J;
        L = L + 1;
        MARK = 1;
      }
      NUM = NUM - K + J;
      if (MARK == 1) {
        WORD[WIND] = L + 48;
        WIND = WIND + 1;
      }
    }
    if (WIND == 1) {
      WORD[WIND] = 48;
      WIND = 2;
    }
    WORD[0] = WIND - 1;
    return (STRING(ADDR));
    _imp_leave();
  }
  auto void CLUSERFL(void) {
    _imp_enter();
    CLOSESM(4);
    CLEAR(_imp_str_literal("4"));
    DISCONNECT(MASFILE);
    _imp_leave();
  }
  auto void GETMASTER(void) {
    _imp_enter();
    DEFINE(_imp_str_literal("4,LOGOFILE"));
    FILSTART = SMADDR(4, FLEN);
    _imp_leave();
  }
  auto void FREEMASTER(void) {
    _imp_enter();
    CLOSESM(4);
    PERMIT(MASREAD);
    if (CACTFILE != 2) GETMASTER();
    _imp_leave();
  }
  auto int STATUS(_imp_string FILENAME, int LEVEL) {
    _imp_enter();
    F R;
    int FLAG;
    int RES;
    FINFO(_imp_str_literal("NOFILE"), 0, R, FLAG);
    FINFO(FILENAME, LEVEL, R, FLAG);
    if (FLAG > 0) return (-FLAG);
    RES = R.MODE;
    if (R.CONS == 0) return (0);
    return (RES);
    _imp_leave();
  }
  auto void PRINTFNLINE(int *SPTR);
  auto void BADERROR(_imp_string ERRMESS, int CULPRIT) {
    _imp_enter();
    int FUNLIST;
    int FUN;
    int PTR;
    float FAIL17;
    if (TDEV == 8) SET42(CHTXT);
    NOOLINE(1);
    PRSTRING(ERRMESS);
    SPACE();
    PRINTEL(CULPRIT);
    NOOLINE(1);
    DUMP(ERRMESS);
    RESTART = 1;
    PRSTRING(_imp_str_literal("SAVING NEW FUNCTIONS IN TEMPORARY FILE"));
    NOOLINE(1);
    DEFINE(_imp_str_literal("3,T#TEMP"));
    SELECTOUTPUT(3);
    DEVICE = TTY;
    FUNLIST = NEWFN;
    while (FUNLIST != NIL) {
      PTR = FNTEXT;
      do {
        FUN = PTR;
        PRINTFNLINE(PTR);
      } while (SOURCE != 'E' || SOURCE != 'N' || SOURCE != 'D') FUNLIST =
          TL(FUNLIST);
    }
    PRSTRING(_imp_str_literal("GETTY"));
    NOOLINE(1);
    SELECTOUTPUT(0);
    PRSTRING(_imp_str_literal("SAVED"));
    NOOLINE(1);
    CLOSESTREAM(3);
    CLUSERFL();
    CLOSESM(6);
    CLEAR(_imp_str_literal("6"));
    DESTROY(_imp_str_literal("T#LOGOSTK"));
    FAIL17 = 1.0 / 0;
    _imp_leave();
  }
  auto int TIME100(void) {
    _imp_enter();
    double X;
    X = CPUTIME();
    return (INT(CPUTIME() * 100));
    _imp_leave();
  }
  auto void MDMAP(int MDSTART) {
    _imp_enter();
    MDENTS = BYTEINTEGER(MDSTART + 1);
    MDNEXT = BYTEINTEGER(MDSTART + 3); /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    UDNAM = &; /*ERROR: name_sym_idx is -1!*/                         /*C_NAME*/
    UDPAGE = &;
    _imp_leave();
  }
  auto void TMDMAP(int START) {
    _imp_enter();
    TMDENTS = BYTEINTEGER(START + 1);
    TMDNEXT = BYTEINTEGER(START + 3); /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    TUDNAM = &; /*ERROR: name_sym_idx is -1!*/                       /*C_NAME*/
    TUDPAGE = &;
    _imp_leave();
  }
  auto void UDMAP(int UDSTART) {
    _imp_enter();
    UDENTS = BYTEINTEGER(UDSTART + 5);
    UDNEXT = BYTEINTEGER(UDSTART + 7); /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    FUNNAM = &; /*ERROR: name_sym_idx is -1!*/                        /*C_NAME*/
    TXTPAGE = &; /*ERROR: name_sym_idx is -1!*/                       /*C_NAME*/
    TXTIND = &;
    _imp_leave();
  }
  auto void TUDMAP(int START) {
    _imp_enter();
    TUDENTS = BYTEINTEGER(START + 5);
    TUDNEXT = BYTEINTEGER(START + 7); /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    TFUNNAM = &; /*ERROR: name_sym_idx is -1!*/                      /*C_NAME*/
    TTXTPAGE = &; /*ERROR: name_sym_idx is -1!*/                     /*C_NAME*/
    TTXTIND = &;
    _imp_leave();
  }
  auto void TXTMAP(int TXTSTART) {
    _imp_enter();
    /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/ TXTENTS = &;
    TXTNEXT = BYTEINTEGER(TXTSTART + 3);
        /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    FNTXT = &;
    _imp_leave();
  }
  auto void TTXTMAP(int START) {
    _imp_enter();
    /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/ TTXTENTS = &;
    TTXTNEXT = BYTEINTEGER(START + 3); /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    TFNTXT = &;
    _imp_leave();
  }
  auto void ENDMAP(void) {
    _imp_enter();
    ENDTXT = BYTEINTEGER(FILSTART + 4097);
        /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    ENDIND = &;
    _imp_leave();
  }
  auto void TENDMAP(void) {
    _imp_enter();
    TENDTXT = BYTEINTEGER(TSTART + 4097);
        /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
    TENDIND = &;
    _imp_leave();
  }
  auto int SHORTINT(char *INDEX) {
    _imp_enter();
    return (INDEX << 8 | BYTEINTEGER(ADDR + 1));
    _imp_leave();
  }
  auto void SETSHORTINT(char *NAME, int VALUE) {
    _imp_enter();
    *NAME = VALUE >> 8;
    *BYTEINTEGER(ADDR + 1) = VALUE & 0xFF;
    _imp_leave();
  }
  auto void MAPEND(void) {
    _imp_enter();
    TXTP = ENDTXT;
    if (TXTP != 0) TXTMAP(FILSTART + TXTP * 4096);
    if (TXTP == 0 || SHORTINT(ENDIND) == 4093) {
      GETPAGE(4);
      *ENDTXT = TXTP;
      *ENDIND(/*index missing*/) = 0;
      *ENDIND(/*index missing*/) = 1;
    }
    INDEX = SHORTINT(ENDIND);
    _imp_leave();
  }
  auto void GETUDP(void) {
    _imp_enter();
    UDP = UDPAGE;
    UDMAP(FILSTART + UDP * 4096);
    _imp_leave();
  }
  auto void GETTXTP(int IND) {
    _imp_enter();
    TXTP = TXTPAGE;
    TXTMAP(FILSTART + TXTP * 4096);
    _imp_leave();
  }
  auto int HD(int LIST) {
    _imp_enter();
    if ((LIST() & LM) == 0 || LIST() == NIL)
      BADERROR(_imp_str_literal("NON-LIST ARG FOR HEAD - "), LIST());
    return (LA);
    _imp_leave();
  }
  auto void REPHEAD(int LIST, int NEWHEAD) {
    _imp_enter();
    if ((LIST() & LM) == 0 || LIST() == NIL)
      BADERROR(_imp_str_literal("NON-LIST ARG FOR REPHEAD"), LIST());
    *LA(/*index missing*/) = NEWHEAD;
    _imp_leave();
  }
  auto int TL(int LIST) {
    _imp_enter();
    if ((LIST() & LM) == 0 || LIST() == NIL)
      BADERROR(_imp_str_literal("NON-LIST ARG FOR TAIL - "), LIST());
    return (LA);
    _imp_leave();
  }
  auto void REPTAIL(int LIST, int NEWTAIL) {
    _imp_enter();
    if ((LIST() & LM) == 0 || LIST() == NIL)
      BADERROR(_imp_str_literal("NONLIST FIRST ARG FOR REPTAIL - "), LIST());
    if ((NEWTAIL & LM) == 0)
      BADERROR(_imp_str_literal("NON-LIST SECOND ARG FOR REPTAIL - "), NEWTAIL);
    *LA(/*index missing*/) = NEWTAIL;
    _imp_leave();
  }
  auto int CONS(int X, int LIST) {
    _imp_enter();
    int I;
    I = LPOINT;
    if ((LIST() & LM) == 0)
      BADERROR(_imp_str_literal("NON-LIST SECOND ARG FOR CONS - "), LIST());
    *LA(/*index missing*/) = X;
    *LA(/*index missing*/) = LIST();
    LPOINT = LPOINT + 2;
    if ((LPOINT - LABASE) > CFRACT * SEMISIZE) CLECTFLG = 1;
    return (I << 8 | LM);
    _imp_leave();
  }
  auto int CONS1(int X, int LIST) {
    _imp_enter();
    int I;
    I = LPOINT1;
    if (LPOINT1 >= (LAFNT - 1))
      BADERROR(_imp_str_literal("FNSPACE OVERFLOW"), EMPTY);
    if ((LIST() & LM) == 0)
      BADERROR(_imp_str_literal("NON-LIST SECOND ARG FOR CONS1 - "), LIST());
    *LA(/*index missing*/) = X;
    *LA(/*index missing*/) = LIST();
    LPOINT1 = LPOINT1 + 2;
    return (I << 8 | LM);
    _imp_leave();
  }
  auto int CONSG(int X, int LIST) {
    _imp_enter();
    return (CONS);
    _imp_leave();
  }
  auto int WITHOUT(int ITEM, int LIST) {
    _imp_enter();
    if (LIST() == NIL) return (NIL);
    if (ITEM != HD(LIST())) return (CONS);
    return (WITHOUT(ITEM, TL(LIST())));
    _imp_leave();
  }
  auto int AMONGQ(int ITEM, int LIST) {
    _imp_enter();
    if (LIST() == NIL) return (0);
    if (ITEM == HD(LIST())) return (1);
    return (AMONGQ(ITEM, TL(LIST())));
    _imp_leave();
  }
  auto int APPENDL(int L1, int L2) {
    _imp_enter();
    int L3;
    L3 = NIL;
    while (L1 != NIL) {
      L3 = CONS;
      L1 = TL(L1);
    }
    while (L3 != NIL) {
      L2 = CONS;
      L3 = TL(L3);
    }
    return (L2);
    _imp_leave();
  }
  auto int FROMLIST(int ITEM, int LIST) {
    _imp_enter();
    int NEWLIST;
    if (HD(LIST()) == ITEM) return (TL(LIST()));
    NEWLIST = LIST();
    while (TL(NEWLIST) != NIL) {
      if (HD(TL(NEWLIST)) == ITEM) {
        REPTAIL(NEWLIST, TL(TL(NEWLIST)));
        return (LIST());
      }
      NEWLIST = TL(NEWLIST);
    }
    return (LIST());
    _imp_leave();
  }
  auto void COLLECT(int ENVIR) {
    _imp_enter();
    int *FREEPOINTER;
    int STADDR;
    int LEN;
    int I;
    int ITEM;
    int USEDBEFORE;
    int USEDAFTER;
    int COLLECTED;
    auto int GENCOPY(int LIST) {
      _imp_enter();
      int NEWLIST;
      int HEAD;
      int TAIL;
      if ((LIST & LM) != LM || LIST == NIL || (LIST >> 8) >= LAFNB)
        return (LIST);
      if (HD(LIST) == -1) return (TL(LIST));
      HEAD = HD(LIST);
      TAIL = TL(LIST);
      NEWLIST = CONS;
      REPHEAD(LIST, -1);
      REPTAIL(LIST, NEWLIST);
      REPTAIL(NEWLIST, GENCOPY(TAIL));
      REPHEAD(NEWLIST, GENCOPY(HEAD));
      return (NEWLIST);
      _imp_leave();
    }
    USEDBEFORE = LPOINT - LABASE;
    if (LABASE == LA1B)
      LABASE = LA2B;
    else
      LABASE = LA1B;
    LPOINT = LABASE;
    for (I = 0; I != BASENVIR + 1; I += 1) {
      ITEM = BVALUE;
      if (ITEM != 0) *BVALUE(/*index missing*/) = GENCOPY(ITEM);
      ITEM = ASSOCWA;
      if (ITEM != NIL) *ASSOCWA(/*index missing*/) = GENCOPY(ITEM);
    }
    if (ENVIR > BASENVIR) {
      for (I = BASENVIR; I != ENVIR + 1; I += 1) {
        *BVALUE(/*index missing*/) = GENCOPY(BVALUE);
      }
    }
    if (STKPNT > 0) {
      for (I = 1; I != STKPNT + 1; I += 1) {
        *STK(/*index missing*/) = GENCOPY(STK);
      }
    }
    if (SYSTKPNT > 0) {
      for (I = 1; I != SYSTKPNT + 1; I += 1) {
        *SYSTK(/*index missing*/) = GENCOPY(SYSTK);
      }
    }
    NEWFN = GENCOPY(NEWFN);
    for (I = 0; I != 1022 + 1; I += 1) {
      if (INDEX42[I].PTR != 0) INDEX42[I].PTR = GENCOPY(INDEX42[I].PTR);
    }
    CURPIC = GENCOPY(CURPIC);
    CURFRAME = GENCOPY(CURFRAME);
    CURMOVIE = GENCOPY(CURMOVIE);
    USEDAFTER = LPOINT - LABASE;
    if (STATUS(_imp_join(MASNUM, _imp_str_literal("LOGOMON")), 0) >= 0) {
      DEFINE(_imp_join(_imp_str_literal("7,"),
                       _imp_join(MASNUM, _imp_str_literal("LOGOMON"))));
      STADDR = SMADDR(7, LEN);
      FREEPOINTER = INTEGER(STADDR);
      if (FREEPOINTER + 48 > LEN) goto CLOSE;
      STADDR = STADDR + FREEPOINTER;
      *FREEPOINTER = FREEPOINTER + 48;
      *STRING(STADDR) = _imp_join(TIME, DATE);
      *STRING(STADDR + 19) = EMASUSER;
      *INTEGER(STADDR + 28) = USEDBEFORE;
      *INTEGER(STADDR + 32) = ENVIR - BASENVIR;
      *INTEGER(STADDR + 36) = STKPNT;
      *INTEGER(STADDR + 40) = SYSTKPNT;
      *INTEGER(STADDR + 44) = USEDAFTER;
    CLOSE:;
      CLOSESM(7);
      CLEAR(_imp_str_literal("7"));
      DISCONNECT(_imp_join(MASNUM, _imp_str_literal("LOGOMON")));
    }
    CLECTFLG = 0;
    COLLECTED = USEDBEFORE - USEDAFTER;
    if (COLLECTED < 100)
      BADERROR(_imp_str_literal("TOO FEW LIST CELLS COLLECTED"),
               COLLECTED << 8 | NM);
    _imp_leave();
  }
  auto int COPY(int LIST) {
    _imp_enter();
    int MARK;
    MARK = LIST() & 0xF0;
    if ((LIST() & LM) != LM || (LIST() & MARKERMASK) == NIL) return (LIST());
    return (CONS | MARK);
    _imp_leave();
  }
  auto int MOVE1(int LIST) {
    _imp_enter();
    auto int COPY1(int LIST) {
      _imp_enter();
      int MARK;
      MARK = LIST & 0xF0;
      if ((LIST & LM) != LM || (LIST & MARKERMASK) == NIL) return (LIST);
      return (CONS1(COPY1(HD(LIST)), COPY1(TL(LIST))) | MARK);
      _imp_leave();
    }
    if ((LIST & LM) != LM)
      BADERROR(_imp_str_literal("NON-LIST ARG FOR MOVE1 - "), LIST);
    if ((LIST >> 8) >= LAFNB) return (LIST);
    return (COPY1(LIST));
    _imp_leave();
  }
  auto int REVERSE(int LIST) {
    _imp_enter();
    int LIST1;
    LIST1 = NIL;
    while ((LIST() & MARKERMASK) != NIL) {
      LIST1 = CONS;
      *LIST() = TL(LIST());
    }
    return (LIST1);
    _imp_leave();
  }
  auto int REVERSE1(int LIST) {
    _imp_enter();
    int LIST1;
    LIST1 = NIL;
    while ((LIST() & MARKERMASK) != NIL) {
      LIST1 = CONS1(HD(LIST()), LIST1);
      *LIST() = TL(LIST());
    }
    return (LIST1);
    _imp_leave();
  }
  auto int FINDBIND(int NAME, int ENVIR) {
    _imp_enter();

  LOCAL:;
    while (ENVIR > 1022) {
      if (BNAME == 0) {
        ENVIR = ENVIR - 1;
        goto LOCAL;
      }
      if (BNAME == NAME) return (ENVIR);
      ENVIR = ENVIR - 1;
    }
    *NAME = NAME >> 8;
    if (BVALUE == 0)
      return (UNDEF);
    else
      return (NAME);
    _imp_leave();
  }
  auto void SETVAL(int NAME, int VALUE, int ENVIR) {
    _imp_enter();
    int BINDING;
    BINDING = FINDBIND(NAME, ENVIR);
    if (BINDING == UNDEF) {
      *BVALUE(/*index missing*/) = VALUE;

    } else
      *BVALUE(/*index missing*/) = VALUE;
    _imp_leave();
  }
  auto int GETVAL(int NAME, int ENVIR) {
    _imp_enter();
    int BINDING;
    BINDING = FINDBIND(NAME, ENVIR);
    if (BINDING == UNDEF)
      return (UNDEF);
    else
      return (BVALUE);
    _imp_leave();
  }
  auto int SETBIND(int PARMLIST, int ENVIR) {
    _imp_enter();
    while (PARMLIST != NIL) {
      if (ENVIR == 3000)
        BADERROR(_imp_str_literal("ENVIRONMENT OVERFLOW"), EMPTY);
      ENVIR = ENVIR + 1;
      *BNAME(/*index missing*/) = HD(PARMLIST);
      if (CHECKSTACK() == FAULT) return (FAULT);
      *BVALUE(/*index missing*/) = UNSTACK();
      PARMLIST = TL(PARMLIST);
    }
    if (ENVIR > TOPMARK) TOPMARK = ENVIR;
    return (ENVIR);
    _imp_leave();
  }
  auto int MAKEBIND(int PARMLIST, int ENVIR, int FNAME) {
    _imp_enter();
    if (ENVIR == 3000)
      BADERROR(_imp_str_literal("ENVIRONMENT OVERFLOW"), EMPTY);
    ENVIR = ENVIR + 1;
    *BNAME(/*index missing*/) = 0;
    *BVALUE(/*index missing*/) = FNAME;
    return (SETBIND(PARMLIST, ENVIR));
    _imp_leave();
  }
  auto int UNSTACK(void) {
    _imp_enter();
    if (STKPNT == 0) BADERROR(_imp_str_literal("STACK UNDERFLOW"), EMPTY);
    STKPNT = STKPNT - 1;
    return (STK);
    _imp_leave();
  }
  auto void STACK(int I) {
    _imp_enter();
    if (STKPNT == 2000) BADERROR(_imp_str_literal("STACK OVERFLOW"), EMPTY);
    STKPNT = STKPNT + 1;
    *STK(/*index missing*/) = I;
    _imp_leave();
  }
  auto int CHECKSTACK(void) {
    _imp_enter();
    if (STKPNT == 0) return (FAULT);
    return (0);
    _imp_leave();
  }
  auto int UNSTKSYS(void) {
    _imp_enter();
    if (SYSTKPNT == 0) BADERROR(_imp_str_literal("SYSTACK UNDERFLOW"), EMPTY);
    SYSTKPNT = SYSTKPNT - 1;
    return (SYSTK);
    _imp_leave();
  }
  auto void STKSYS(int I) {
    _imp_enter();
    if (SYSTKPNT == 2000) BADERROR(_imp_str_literal("SYSTACK OVERFLOW"), EMPTY);
    SYSTKPNT = SYSTKPNT + 1;
    *SYSTK(/*index missing*/) = I;
    _imp_leave();
  }
  auto void CHKIND(int *INDEX) {
    _imp_enter();
    if (INDEX > SHORTINT(TXTENTS)) {
      if (TXTNEXT == 0) {
        BADERROR(_imp_str_literal("NEXT TEXT PAGE NOT INDICATED"), EMPTY);
      }
      TXTP = TXTNEXT;
      TXTMAP(FILSTART + TXTP * 4096);
      INDEX = 1;
    }
    _imp_leave();
  }
  auto void LGREADSYM(int *SYM) {
    _imp_enter();
    *SYM = INBUFF[INPTR];
    INPTR = INPTR + 1;
    {
      _imp_leave();
      return;
    }
    _imp_leave();
  }
  auto int LGNEXTSYM(void) {
    _imp_enter();
    return (INBUFF[INPTR]);
    _imp_leave();
  }
  auto void LGSKIPSYM(void) {
    _imp_enter();
    INPTR = INPTR + 1;
    {
      _imp_leave();
      return;
    }
    _imp_leave();
  }
  auto void LGREADITEM(_imp_string * ITEM) {
    _imp_enter();
    ITEM = TOSTRING(INBUFF[INPTR]);
    INPTR = INPTR + 1;
    {
      _imp_leave();
      return;
    }
    _imp_leave();
  }
  auto int GETITEM(void) {
    _imp_enter();
    int SYM;
    int SKIPMARK;
    _imp_string ITEM;
    _imp_string WORD;
    int SYMCOUNT;
    SYMCOUNT = 0;
    WORD = _imp_str_literal("");
    SKIPMARK = 0;
    if (QUOTEON == 1 && (LGNEXTSYM() < _imp_str_literal("0") ||
                         _imp_str_literal("9") < LGNEXTSYM() &&
                             LGNEXTSYM() < _imp_str_literal("A") ||
                         LGNEXTSYM() > _imp_str_literal("Z")))
      return (EMPTY);
  LP:;
    if (LGNEXTSYM() == _imp_str_literal(" ")) {
      LGSKIPSYM();
      if (SYMCOUNT == 0)
        goto LP;
      else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    if (LGNEXTSYM() == '@') {
      if (SYMCOUNT == 0) {
        LGSKIPSYM();
        if (LGNEXTSYM() == NL) LGSKIPSYM();
        goto LP;

      } else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    if (LGNEXTSYM() == TERMIN) {
      if (SYMCOUNT == 0) {
        if (LEVEL > BLEVEL || PARLEVEL > BLEVEL) {
          PRSTRING(_imp_str_literal("MISSING RIGHT BRACKET INSERTED"));
          NOOLINE(1);
        }
        LEVEL = BLEVEL;
        PARLEVEL = BLEVEL;
        return (RBRAK);

      } else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    if (LGNEXTSYM() == LBRAK || LGNEXTSYM() == RBRAK) {
      if (SYMCOUNT == 0) {
        LGREADSYM(SYM);
        if (SYM == LBRAK)
          LEVEL = LEVEL + 1;
        else
          LEVEL = LEVEL - 1;
        return (SYM);

      } else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    if (LGNEXTSYM() == '-' && LEVEL != 1) {
      if (SYMCOUNT == 0) {
        LGSKIPSYM();
        SYM = GETITEM();
        if ((SYM & NM) == 0) {
          PRSTRING(_imp_str_literal("INVALID '-'  BEFORE "));
          PRINTEL(SYM);
          SPACE();
          PRSTRING(_imp_str_literal("IGNORED"));
          NOOLINE(1);

        } else {
          return ((-SYM >> 8) << 8 | NM);
        }

      } else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    if (LGNEXTSYM() < 48 || (LGNEXTSYM() > 57 && LGNEXTSYM() < 65) ||
        LGNEXTSYM() > 90) {
      if (SYMCOUNT == 0) {
        LGREADITEM(ITEM);
        if ((ITEM == _imp_str_literal("<") || ITEM == _imp_str_literal(">")) &&
            LGNEXTSYM() == '=') {
          ITEM = _imp_join(ITEM, _imp_str_literal("="));
          LGSKIPSYM();
        }
        if (ITEM == _imp_str_literal("<") && LGNEXTSYM() == '<') {
          ITEM = _imp_str_literal("<<");
          LGSKIPSYM();
        }
        if (ITEM == _imp_str_literal(">") && LGNEXTSYM() == '>') {
          ITEM = _imp_str_literal(">>");
          LGSKIPSYM();
        }
        return (PUT(ITEM));

      } else {
        if (SKIPMARK == 1) NOOLINE(1);
        return (PUT(WORD));
      }
    }
    LGREADITEM(ITEM);
    if (SYMCOUNT == 64) {
      if (SKIPMARK == 1)
        PRSTRING(ITEM);
      else {
        SKIPMARK = 1;
        PRSTRING(_imp_str_literal("EXCESS CHARS IGNORED - "));
        PRSTRING(ITEM);
      }

    } else {
      WORD = _imp_join(WORD, ITEM);
      SYMCOUNT = SYMCOUNT + 1;
    }
    goto LP;
    _imp_leave();
  }
  auto void TAILIN(void) {
    _imp_enter();
    HEADIN = GETITEM();
    UNUSEDHD = 0;
    _imp_leave();
  }
  auto void READINSYM(int *SYM) {
    _imp_enter();
    if (DEVICE == TTY)
      READSYMBOL(SYM);
    else {
      if (DEVICE == SRCE) {
        *SYM = SOURCE;
        SINDEX = SINDEX + 1;

      } else {
        CHKIND(INDEX);
        *SYM = FNTXT;
        INDEX = INDEX + 1;
      }
    }

    _imp_leave();
  }
  auto int NEXTINSYM(void) {
    _imp_enter();
    if (DEVICE == TTY) return (NEXTSYMBOL());
    if (DEVICE == SRCE) return (SOURCE);
    CHKIND(INDEX);
    return (FNTXT);
    _imp_leave();
  }
  auto void SKIPINSYM(void) {
    _imp_enter();
    if (DEVICE == TTY) {
      SKIPSYMBOL();
    }
    if (DEVICE == SRCE)
      SINDEX = SINDEX + 1;
    else
      INDEX = INDEX + 1;
    _imp_leave();
  }
  auto void READINLINE(_imp_string PROMP) {
    _imp_enter();
    int PTR;
    int SYM;
    LEVEL = BLEVEL;
    PARLEVEL = BLEVEL;
    PROMPT(PROMP);
    PTR = 1;
    while (NEXTINSYM() == NL) SKIPINSYM();
    do {
      if (PTR >= 255) {
        PRSTRING(_imp_str_literal("LINE TOO LONG"));
        NOOLINE(1);
        break;
      }
      READINSYM(SYM);
      INBUFF[PTR] = SYM;
      PTR = PTR + 1;
      if (SYM == '@') {
        while (NEXTINSYM() != NL) {
          SKIPINSYM();
        }
        if (PTR >= 255) {
          PRSTRING(_imp_str_literal("LINE TOO LONG"));
          NOOLINE(1);
          break;
        }
        READINSYM(SYM);
        INBUFF[PTR] = SYM;
        PTR = PTR + 1;
        PROMPT(_imp_str_literal("C:"));
      }
    } while (NEXTINSYM() != NL) INBUFF[PTR] = NL;
    PROMPT(PROMP);
    INBUFF[0] = PTR;
    INPTR = 1;
    HEADIN = GETITEM();
    UNUSEDHD = 0;
    if (HEADIN == RBRAK) READINLINE(PROMP);
    _imp_leave();
  }
  auto void COPYLINE(void) {
    _imp_enter();
    if (SOURCEPTR + INBUFF[0] > MAXSOURCE)
      BADERROR(_imp_str_literal("FILE SOURCE SPACE OVERFLOW"), EMPTY);
    MOVE(INBUFF[0], ADDR, ADDR);
    SOURCEPTR = SOURCEPTR + INBUFF[0];
    _imp_leave();
  }
  auto int READLIST(void) {
    _imp_enter();
    int THISPOINT;
    int ITEM;
    THISPOINT = LPOINT;
    ITEM = HEADIN;
    TAILIN();
    if (ITEM == RBRAK) {
      UNUSEDHD = 1;
      return (NIL);

    } else {
      LPOINT = LPOINT + 2;
      if ((LPOINT - LABASE) > CFRACT * SEMISIZE) CLECTFLG = 1;
      if (ITEM == LBRAK) {
        *LA(/*index missing*/) = READLIST();

      } else
        *LA(/*index missing*/) = ITEM;
      *LA(/*index missing*/) = READLIST();
      return (THISPOINT << 8 | LM);
    }

    _imp_leave();
  }
  auto int READLINE(void) {
    _imp_enter();
    BLEVEL = 1;
    READINLINE(PROMP);
    return (READLIST());
    _imp_leave();
  }
  auto void GETPAGE(int FLAG) {
    _imp_enter();
    _imp_string SIZE;
    int LEN;
    int I;
    int J;
    int K;
    I = (FLAG & 1) + ((FLAG & 2) / 2) + ((FLAG & 4) / 4);
    SIZE = NUMTOSTR((FLEN + 4096 * I) << 8);
    DEFINE(_imp_str_literal("10,T#JUNK"));
    NEWSMFILE(_imp_join(_imp_str_literal("T#JUNK,"), SIZE));
    TSTART = SMADDR(10, LEN);
    for (I = 0; I != FLEN - 4096 + 4096; I += 4096) {
      J = FILSTART + I;
      K = TSTART + I;
      MOVE(4096, J, K);
    }
    CLOSESM(10);
    CLEAR(_imp_str_literal("10"));
    CLOSESM(4);
    CLEAR(_imp_str_literal("4"));
    DESTROY(MASFILE);
    RENAME(_imp_join(_imp_str_literal("T#JUNK,"), MASFILE));
    CHERISH(MASFILE);
    PERMIT(_imp_join(MASFILE, _imp_str_literal(",,R")));
    PERMIT(MASWRITE);
    GETMASTER();
    MDMAP(FILSTART + MDP * 4096);
    if (FLAG == 4) {
      ENDMAP();
      if (TXTP != 0) {
        TXTMAP(FILSTART + TXTP * 4096);
      }
      TXTP = LEN / 4096 - 1;
      TXTMAP(FILSTART + TXTP * 4096);
      *TXTENTS(/*index missing*/) = 0;
      *TXTENTS(/*index missing*/) = 0;
      INDEX = 1;
      *TXTNEXT = 0;

    } else {
      if (FLAG == 3) {
        *MDENTS = 63;
        *MDNEXT = LEN / 4096 - 2;
        MDP = MDNEXT;
        MDMAP(FILSTART + MDP * 4096);
        *MDENTS = 0;
      }
      if (UDP != 0) {
        UDMAP(FILSTART + UDP * 4096);
        *UDENTS = 61;
        *UDNEXT = LEN / 4096 - 1;
      }
      UDP = LEN / 4096 - 1;
      UDMAP(FILSTART + UDP * 4096);
      *UDENTS = 0;
      ENDMAP();
      if (UDP == 1) {
        *ENDTXT = 0;
        SETSHORTINT(ENDIND, 1);
      }
    }

    _imp_leave();
  }
  auto void NOOLINE(int N) {
    _imp_enter();
    while (N > 0) {
      NEWLINE();
      N = N - 1;
    }
    CHAROUT = 0;
    _imp_leave();
  }
  auto void PRSTRING(_imp_string WORD) {
    _imp_enter();
    int N;
    N = LENGTH;
    if ((CHAROUT + N) > 72) {
      NEWLINE();
      if (_imp_cond_resolve(WORD, NULL, _imp_str_literal(" "), WORD)) N = N - 1;
      SPACES(3);
      PRINTSTRING(WORD);
      CHAROUT = N + 3;

    } else {
      PRINTSTRING(WORD);
      CHAROUT = CHAROUT + N;
    }

    _imp_leave();
  }
  auto void LGPRNTSTR(_imp_string WORD) {
    _imp_enter();
    int SAVE;
    int NEWIND;
    if (DEVICE == TTY) {
      PRSTRING(WORD);
    }
    if (DEVICE == SRCE) {
      SAVE = SOURCE;
      *STRING(ADDR) = WORD;
      NEWIND = SOURCEPTR + SOURCE;
      *SOURCE(/*index missing*/) = SAVE;
      SOURCEPTR = NEWIND;
    }
    _imp_leave();
  }
  auto void LGNEWLINE(void) {
    _imp_enter();
    if (DEVICE == TTY)
      NOOLINE(1);
    else
      LGPRNTSTR(STERMIN);
    _imp_leave();
  }
  auto void PRINTWORD(_imp_string WORD) {
    _imp_enter();
    if (WORD == _imp_str_literal("]") || WORD == _imp_str_literal(")")) {
      LGPRNTSTR(WORD);
      SEP = _imp_str_literal(" ");
      {
        _imp_leave();
        return;
      }
    }
    if (WORD == _imp_str_literal("(") || WORD == _imp_str_literal("[") ||
        WORD == _imp_str_literal("\"") || WORD == _imp_str_literal(":")) {
      LGPRNTSTR(_imp_join(SEP, WORD));
      SEP = _imp_str_literal("");
      {
        _imp_leave();
        return;
      }
    }
    if (WORD == _imp_str_literal("+") || WORD == _imp_str_literal("-") ||
        WORD == _imp_str_literal("*") || WORD == _imp_str_literal("/") ||
        WORD == _imp_str_literal("<") || WORD == _imp_str_literal("<=") ||
        WORD == _imp_str_literal(">") || WORD == _imp_str_literal(">=") ||
        WORD == _imp_str_literal("=")) {
      LGPRNTSTR(WORD);
      SEP = _imp_str_literal("");
      {
        _imp_leave();
        return;
      }
    }
    LGPRNTSTR(_imp_join(SEP, WORD));
    SEP = _imp_str_literal(" ");
    {
      _imp_leave();
      return;
    }
    _imp_leave();
  }
  auto void PRINTWN(int I) {
    _imp_enter();
    _imp_string WORD;
    if ((I & NM) == NM) {
      if (I < 0)
        WORD = _imp_join(_imp_str_literal("-"), NUMTOSTR(~I + 256));
      else
        WORD = _imp_join(_imp_str_literal(" "), NUMTOSTR(I));

    } else
      WORD = WA;
    PRINTWORD(WORD);
    _imp_leave();
  }
  auto void PRINTLCON(int LIST) {
    _imp_enter();
    int I;

  LP:;
    if (ENUF == 1 ||
        (INTERRUPT() == _imp_str_literal("ENUF") && DEVICE == TTY)) {
      ENUF = 1;
      {
        _imp_leave();
        return;
      }
    }
    if (LIST() == NIL) {
      _imp_leave();
      return;
    }
    I = HD(LIST());
    if ((I & LM) == LM)
      PRINTLIST(I);
    else
      PRINTWN(I);
    *LIST() = TL(LIST());
    goto LP;
    _imp_leave();
  }
  auto void PRINTLIST(int LIST) {
    _imp_enter();
    SEP = _imp_str_literal("");
    PRINTWORD(_imp_str_literal("["));
    PRINTLCON(LIST());
    PRINTWORD(_imp_str_literal("]"));
    _imp_leave();
  }
  auto void PRINTEL(int I) {
    _imp_enter();
    int J;
    ENUF = 0;
    SEP = _imp_str_literal("");
    for (J = 1; J != 14 + 1; J += 1) {
      if (SPECHAR[J] == I) goto SPCHAR;
    }
    if ((I & LM) == LM)
      PRINTLIST(I);
    else
      PRINTWN(I);
    {
      _imp_leave();
      return;
    }
  SPCHAR:;
    PRINTWORD(TOSTRING(I));
    _imp_leave();
  }
  auto void PRINTLINE(int LINE) {
    _imp_enter();
    int HEAD;
    SEP = _imp_str_literal("");
    if (LINE == NIL) {
      ENUF = 0;
      PRINTLIST(NIL);
    }
    while (LINE != NIL) {
      HEAD = HD(LINE);
      if ((HEAD & LM) == LM) {
        ENUF = 0;
        PRINTLIST(HEAD);

      } else
        PRINTWN(HEAD);
      LINE = TL(LINE);
    }
    LGNEWLINE();
    _imp_leave();
  }
  auto void PRINTFNLINE(int *SPTR) {
    _imp_enter();
    int SYM;
    int I;
    int CONT;
    CONT = 0;
    if (DEVICE == TTY) {
      for (I = 0; I != 255 + 1; I += 1) {
        SYM = SOURCE;
        PRINTSYMBOL(SYM);
        if (SYM == '@') {
          for (;;) {
            SYM = SOURCE;
            if (SYM == NL) break;
            PRINTSYMBOL(SYM);
            *SPTR = SPTR + 1;
          }
          CONT = 1;

        } else {
          if (SYM == NL) {
            if (CONT != 1) break;
            CONT = 0;
          }
        }
      }

    } else {
      for (I = 0; I != 255 + 1; I += 1) {
        if (INDEX == 4093) {
          SETSHORTINT(TXTENTS, 4092);
        }
        SYM = SOURCE;
        *FNTXT(/*index missing*/) = SYM;
        INDEX = INDEX + 1;
        if (SYM == '@') {
          while (SOURCE != NL) {
            *SPTR = SPTR + 1;
          }
          CONT = 1;
        }
        if (SYM == NL) {
          if (CONT != 1) break;
          CONT = 0;
        }
      }
      SETSHORTINT(TXTENTS, INDEX - 1);
    }
    *SPTR = SPTR + I + 1;
    if (I == 255) {
      PRSTRING(_imp_str_literal("LINE TOO LONG - TRUNCATED"));
      if (DEVICE == TTY)
        PRINTSYMBOL(NL);
      else
        *FNTXT(/*index missing*/) = NL;
      NOOLINE(1);
    }
    _imp_leave();
  }
  auto void PRINTHEX(char I) {
    _imp_enter();
    const char HEX[15 - 0 + 1] = {'0', '1', '2', '3', '4', '5', '6', '7',
                                  '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    int CYC;
    _imp_string H;
    H = _imp_str_literal("");
    for (CYC = 0; CYC != 1 + 1; CYC += 1) {
      H = _imp_join(TOSTRING(HEX[(I >> (CYC * 4)) & 15]), H);
    }
    PRINTSTRING(H);
    _imp_leave();
  }
  auto void SETUPINF(void) {
    _imp_enter();
    *BVALUE(/*index missing*/) = NIL;
    *BVALUE(/*index missing*/) = NIL;
    *BVALUE(/*index missing*/) = NIL;
    *BVALUE(/*index missing*/) = NIL;
    *BVALUE(/*index missing*/) = NIL;
    *BVALUE(/*index missing*/) = NIL;
    GENOS = 0;
    _imp_leave();
  }
  auto void INITINF(void) {
    _imp_enter();
    DBASE[1] = DATABASE;
    IMPLINKS[1] = IMPRULES;
    INFLINKS[1] = INFRULES;
    DBASE[2] = FACT;
    IMPLINKS[2] = IMPLIES;
    INFLINKS[2] = TOINFER;
    DBASE[3] = FACTKEYS;
    IMPLINKS[3] = IMPKEYS;
    INFLINKS[3] = INFKEYS;
    SETUPINF();
    _imp_leave();
  }
  auto int FINDLINENUMS(int LIST) {
    _imp_enter();
    int NUM;
    NUM = UNSTACK();
    while (LIST() != NIL) {
      if (HD(HD(LIST())) == NUM) {
        GOFLAG = 0;
        STACK(NUM);
        return (TL(HD(LIST())));
      }
      *LIST() = TL(LIST());
    }
    STACK(NUM);
    return (0);
    _imp_leave();
  }
  auto int CHECKFNHEAD(int *NAME);
  auto void PARSEERR(int ERRMESS, int CULPRIT);
  auto void EDIT(int *NAME) {
    _imp_enter();
    int SSTART;
    int SLEN;
    int WSP;
    int LWSP;
    int FLAG;
    int USERFUN;
    USERFUN = NAME >> 8;
    SSTART = ADDR;
    SLEN = FNLEN;
    WSP = ADDR;
    LWSP = MAXSOURCE - SOURCEPTR + 1;
    PROMPT(_imp_str_literal(">"));
    EDINNER(SSTART, SLEN, SSTART, SLEN, WSP, LWSP);
    PROMPT(PROMP);
    *FNTEXT(/*index missing*/) = SOURCEPTR;
    *FNLEN(/*index missing*/) = LWSP;
    SOURCEPTR = SOURCEPTR + LWSP;
    if (LWSP > 4) {
      for (WSP = 5; WSP != LWSP + 1; WSP += 1) {
        if (SOURCE == NL) goto CHEND;
      }
    }
  CHEND:;
    if (SOURCE == 'E' && SOURCE == 'N' && SOURCE == 'D') goto CHFNHD;
  INSEND:;
    if (SOURCEPTR + 4 > MAXSOURCE)
      BADERROR(_imp_str_literal("SOURCE FILE SPACE OVERFLOW"), EMPTY);
    *SOURCE(/*index missing*/) = 'E';
    *SOURCE(/*index missing*/) = 'N';
    *SOURCE(/*index missing*/) = 'D';
    *SOURCE(/*index missing*/) = NL;
    SOURCEPTR = SOURCEPTR + 4;
    *FNLEN(/*index missing*/) = LWSP + 4;
    PRSTRING(_imp_str_literal("END INSERTED"));
    NOOLINE(1);
  CHFNHD:;
    FLAG = CHECKFNHEAD(NAME);
    if (FLAG == FAULT) *FNPARSE(/*index missing*/) = 255;
    _imp_leave();
  }
  auto int COUNTARGS(void);
  auto int CHECKFNHEAD(int *USERFUN) {
    _imp_enter();
    int FN;
    int SAVEDEV;
    int NUMARGS;
    int RES;
    int FNSPEC;
    RES = 0;
    NUMARGS = 0;
    *FNPARSE(/*index missing*/) = 0;
    *FNVAL(/*index missing*/) = USERPRE;
    SAVEDEV = DEVICE;
    DEVICE = SRCE;
    SINDEX = FNTEXT;
    READINLINE(PROMP);
    DEVICE = SAVEDEV;
    if (HEADIN != TO) {
      PARSEERR(-17, USERFUN);
      RES = FAULT;
      goto EXIT;
    }
    TAILIN();
    FN = HEADIN;
    if ((FN & WM) != WM) {
      PARSEERR(-14, FN);
      RES = FAULT;
      goto EXIT;
    }
    if (FN != USERFUN) {
      if (NEWFN != NIL) NEWFN = FROMLIST(FN, NEWFN);
      FNSPEC = FNVAL;
      if (FNSPEC != 0 && (FNSPEC & USERPRE) != USERPRE) {
        PARSEERR(-15, FN);
        RES = FAULT;
        goto EXIT;
      }
      if (FNTEXT != 0) *OLDFN(/*index missing*/) = FNLEN << 16 | FNTEXT;
      *FNTEXT(/*index missing*/) = FNTEXT;
      *FNLEN(/*index missing*/) = FNLEN;
      *FNPARSE(/*index missing*/) = FNPARSE;
      *FNTEXT(/*index missing*/) = 0;
      *FNLEN(/*index missing*/) = 0;
      *FNVAL(/*index missing*/) = 0;
      *USERFUN = FN;
    }
    TAILIN();
    NUMARGS = COUNTARGS();
    if (NUMARGS > 127) {
      PARSEERR(-13, USERFUN);
      RES = FAULT;
      goto EXIT;
    }
    if (NUMARGS < 0) {
      RES = FAULT;
      NUMARGS = 0;
    }
  EXIT:;
    *FNVAL(/*index missing*/) = USERPRE + NUMARGS;
    return (RES);
    _imp_leave();
  }
  auto int COUNTARGS(void) {
    _imp_enter();
    int LEN;
    LEN = 0;
    while (HEADIN != RBRAK) {
      if (HEADIN != QUOTE) goto ERRLAB;
      TAILIN();
      if ((HEADIN & WM) != WM || HEADIN == RBRAK) goto ERRLAB;
      LEN = LEN + 1;
      TAILIN();
    }
    return (LEN);
  ERRLAB:;
    PARSEERR(-16, EMPTY);
    return (FAULT);
    _imp_leave();
  }
  auto void PARSEERR(int ERRMESS, int CULPRIT) {
    _imp_enter();
    int SAVEDEV;
    int ERRNUM;
    const _imp_string MESSAGE[22 - 1 + 1] = {
        _imp_str_literal("NAME MISSING AFTER : "),
        _imp_str_literal("NON-WORD AFTER : -  "),
        _imp_str_literal("MISSING >> "),
        _imp_str_literal("MISPLACED CLOSING BRACKET - "),
        _imp_str_literal("MISPLACED INFIX FN "),
        _imp_str_literal("THEN MISSING - "),
        _imp_str_literal("THEN NOT FOUND - "),
        _imp_str_literal("FINISH MISSING - "),
        _imp_str_literal("NO NUMBER ON FN LINE - LINE IGNORED - "),
        _imp_str_literal("ERROR IN FN TYPE "),
        _imp_str_literal("UNDEFINED PROCEDURE "),
        _imp_str_literal("NOT ENOUGH ARGS FOR -  "),
        _imp_str_literal("TOO MANY ARGS FOR "),
        _imp_str_literal("TO MUST BE GIVEN A WORD AS PROCEDURE NAME - "),
        _imp_str_literal("YOU CAN'T REDEFINE A SYSTEM PROCEDURE - "),
        _imp_str_literal("INCORRECT FORMAT FOR ARGS "),
        _imp_str_literal("INCORRECT FORMAT FOR FN DEFN - TO MISSING - "),
        _imp_str_literal("RUN OUT OF FILE SPACE "),
        _imp_str_literal("FN DEFN NOT AT OUTER LEVEL"),
        _imp_str_literal("LINE IGNORED - "),
        _imp_str_literal("CONDITION CLAUSE MISSING"),
        _imp_str_literal("THEN CLAUSE MISSING")};
    ERRNUM = -ERRMESS;
    SAVEDEV = DEVICE;
    DEVICE = TTY;
    PRSTRING(MESSAGE[ERRNUM]);
    SPACE();
    PRINTEL(CULPRIT);
    NOOLINE(1);
    DEVICE = SAVEDEV;
    _imp_leave();
  }
  auto int PARSELINE(int PREC);
  auto void EVALAPPL(int *ENVIR, int *FUN, int *CURFUN, int *IN, int *TSTFLG,
                     int *VAL, int *SEVERITY) {
    _imp_enter();
    auto void EVAL(int IN, int *EACHVAL);
    auto void ERROR(_imp_string ERRMESS, int CULPRIT, int SEVERITY, int *IN) {
      _imp_enter();
      int SAVEDEV;
      int TXTPTR;
      if (TDEV == 8) SET42(CHTXT);
      SAVEDEV = DEVICE;
      DEVICE = TTY;
      NOOLINE(1);
      PRSTRING(ERRMESS);
      SPACE();
      PRINTEL(CULPRIT);
      NOOLINE(1);
      if (FUN == NIL) goto ERR1;
      PRSTRING(_imp_str_literal("IN "));
      PRINTEL(HD(TL(HD(FUN))));
      NOOLINE(1);
      if (CURFUN != NIL) {
        TXTPTR = (HD(CURFUN) >> 16) & 0xFFFF;
        PRINTFNLINE(TXTPTR);
        NOOLINE(1);
      }
      if (GETVAL(QUITOTOP, ENVIR) == FALSE) {
        STKSYS(IN);
        STKSYS(VAL);
        LOGO(STKPNT, MAKEBIND(NIL, ENVIR, LOGONAME), SEVERITY);
        VAL = UNSTKSYS();
        IN = UNSTKSYS();
        DEVICE = SAVEDEV;
        {
          _imp_leave();
          return;
        }
      }
    ERR1:;
      JUMPFLAG = 1;
      IN = NIL;
      STACK(ERR);
      DEVICE = SAVEDEV;
      _imp_leave();
    }
    auto void ERROR1(_imp_string ERRMESS, int CULPRIT) {
      _imp_enter();
      int SAVEDEV;
      SAVEDEV = DEVICE;
      DEVICE = TTY;
      PRSTRING(ERRMESS);
      SPACE();
      PRINTEL(CULPRIT);
      NOOLINE(1);
      DEVICE = SAVEDEV;
      _imp_leave();
    }
    auto int NEGATE(int I) {
      _imp_enter();
      if ((I & NM) != NM) {
        PRSTRING(_imp_str_literal("INVALID UNARY MINUS BEFORE "));
        PRINTEL(I);
        PRSTRING(_imp_str_literal(" IGNORED"));
        NOOLINE(1);
        return (I);
      }
      if (I < 0)
        return ((-I >> 8 | T8) << 8 | NM);
      else
        return ((-I >> 8) << 8 | NM);
      _imp_leave();
    }
    auto void CHKLIST(int LIST) {
      _imp_enter();
      int WORD;
      if ((LIST & LM) != LM) {
        ERROR(_imp_str_literal("NEW CANNOT HAVE A NUMBER AS ARGUMENT - "), LIST,
              1, IN);
        {
          _imp_leave();
          return;
        }
      }
      while (LIST != NIL) {
        if (QUITFLAG == 1) {
          QUITFLAG = 0;
          JUMPOUT = 0;
          JUMPFLAG = 1;
          STACK(QUIT);
          {
            _imp_leave();
            return;
          }
        }
        if (HOLDFLAG == 1) {
          HOLDFLAG = 0;
          STKSYS(LIST);
          ERROR(_imp_str_literal("USER INTERRUPT"), EMPTY, 0, IN);
          LIST = UNSTKSYS();
          if (JUMPFLAG == 1) {
            _imp_leave();
            return;
          }
        }
        WORD = HD(LIST);
        if ((WORD & WM) != WM) {
          ERROR(_imp_str_literal(" NEW MUST HAVE A WORD AS ARGUMENT - "), WORD,
                1, IN);
          {
            _imp_leave();
            return;
          }
        }
        LIST = TL(LIST);
      }

      _imp_leave();
    }
    auto int LISTLEN(int LIST) {
      _imp_enter();
      int LEN;
      LEN = 0;
      while (LIST != NIL) {
        LEN = LEN + 1;
        LIST = TL(LIST);
      }
      return (LEN);
      _imp_leave();
    }
    auto int GETMATCH(int *CLAUSE, int *IN) {
      _imp_enter();
      int HEAD;
      int RES;
      *CLAUSE = CONS;
      IN = TL(IN);
      while (IN != NIL) {
        HEAD = HD(IN);
        if (HEAD == RPAR) {
          IN = TL(IN);
          *CLAUSE = CONS;
          return (EMPTY);
        }
        if (HEAD == LPAR) {
          RES = GETMATCH(CLAUSE, IN);
          if (RES != EMPTY) return (RES);

        } else {
          IN = TL(IN);
          *CLAUSE = CONS;
        }
      }
      return (RPAR);
      _imp_leave();
    }
    auto void STRTRACE(int FN) {
      _imp_enter();
      INDENT = INDENT + 1;
      SPACES(INDENT);
      PRINTSTRING(_imp_str_literal(">"));
      PRINTEL(FN);
      NOOLINE(1);
      INDENT = INDENT + 1;
      _imp_leave();
    }
    auto void ENDTRACE(int FN) {
      _imp_enter();
      INDENT = INDENT - 1;
      SPACES(INDENT);
      PRINTSTRING(_imp_str_literal("<"));
      PRINTEL(FN);
      NOOLINE(1);
      INDENT = INDENT - 1;
      _imp_leave();
    }
    auto void SENDBIN(char TYPE, char N) {
      _imp_enter();
      N = 2 * N;
      BINBUFF[1] = TDEV - 1;
      BINBUFF[2] = TYPE;
      if (TYPE == 0) {
        BINBUFF[3] = N;
      }
      _imp_leave();
    }
    auto void BINARG(int ARGN, int VAL) {
      _imp_enter();
      int I;
      I = 2 * ARGN + 2;
      BINBUFF[I] = (VAL >> 8) & 0xFF;
      BINBUFF[I + 1] = VAL & 0xFF;
      _imp_leave();
    }
    auto void CLESET(void) {
      _imp_enter();
      if (TDEV == 8) CLEAR42();
      SENDBIN(1, 0);
      XTURTLE = 0;
      YTURTLE = 0;
      HDTURTLE = 0;
      PENTURTLE = DOWN;
      _imp_leave();
    }
    auto void APPLYSYS(int SW, int *FN, int *IN, int *EACHVAL) {
      _imp_enter();
      auto void ADDFACT(int FACT, int INDENT);
      auto int DEDUCEQ(int PATTERN, int INDENT);
      auto int TRYINFQ(int PAT, int INDENT);
      static void *SYSFUN[300 - 1 + 1] = {
          /* These need to be filled in from associated code block */};
      static void *FDSW[8 - 0 + 1] = {
          /* These need to be filled in from associated code block */};
      float RW1;
      float RW2;
      float DX;
      float DY;
      int XC;
      int YC;
      int ARG1;
      int ARG2;
      int ARG3;
      int ARG4;
      int W1;
      int W2;
      int W3;
      int W4;
      int SAVEDEV;
      int STARTTEXT;
      int COND;
      int TBRANCH;
      int FBRANCH;
      int RES;
      int CONDLIST;
      float TSTOR[2 - 1 + 1];
      int TSTORI[4 - 3 + 1];
      int MOVIERECORD[FRAMETIME - 1 + 1];
      int CURRENTMOVIETIME;
      int *WPTR1;
      int REDEF;
      _imp_string WSTR1;
      _imp_string WSTR2;
      auto void VECTOR(float X, float Y);
      auto void CALCTURTLE(void);
      auto int EVALSTARTFIN(int BRANCH) {
        _imp_enter();
        int LNUMBERS;
        int POLIST;
        BRANCH = TL(BRANCH);
        LNUMBERS = HD(BRANCH);
        BRANCH = TL(BRANCH);
      EVALNEXTLINE:;
        POLIST = TL(HD(BRANCH));
        for (;;) {
          if (POLIST != NIL) {
            if (HD(POLIST) == FINISH) break;
            if (BRANCH == NIL) return (NIL);
            STKSYS(IN);
            STKSYS(CONDLIST);
            STKSYS(LNUMBERS);
            STKSYS(BRANCH);
            EVAL(POLIST, EACHVAL);
            BRANCH = UNSTKSYS();
            LNUMBERS = UNSTKSYS();
            CONDLIST = UNSTKSYS();
            IN = UNSTKSYS();
            if (JUMPFLAG == 1) return (NIL);
            if (GOFLAG == 1) break;
            VAL = UNSTACK();
            if (FUN != NIL && CURFUN == NIL) return (VAL);
          }
          BRANCH = TL(BRANCH);
          POLIST = TL(HD(BRANCH));
        }
        if (GOFLAG == 1) {
          BRANCH = FINDLINENUMS(LNUMBERS);
          if (BRANCH == 0) return (NIL);
          VAL = UNSTACK();
          goto EVALNEXTLINE;
        }
        return (VAL);
        _imp_leave();
      }
      auto int EQUAL(int L1, int L2);
      auto int FINDASS(int LIST, int ATT) {
        _imp_enter();
        W1 = LIST;
        W2 = LIST;
        while (W2 != NIL) {
          if (EQUAL(HD(HD(W2)), ATT) == FALSE) {
            W1 = W2;
            W2 = TL(W2);

          } else
            return (W2);
        }
        return (NIL);
        _imp_leave();
      }
      auto void CHECKNUM(void) {
        _imp_enter();
        if ((ARG1 & NM) != NM || (ARG2 & NM) != NM)
          ERROR(_imp_str_literal("ARITHMETIC REQUIRES NUMBERS - "), CONS, 1,
                IN);
        {
          _imp_leave();
          return;
        }
        _imp_leave();
      }
      auto int CHECKSIZE(int I) {
        _imp_enter();
        if (I > NUMTOP) {
          PRSTRING(_imp_str_literal("ARITHMETIC RESULT OUT OF RANGE."));
          WRITE(I, 0);
          SPACE();
          PRSTRING(_imp_str_literal("MAX SUBSTITUTED"));
          NOOLINE(1);
          return (NUMTOP);
        }
        if (I < NUMBOT) {
          PRSTRING(_imp_str_literal(
              "ARITHMETIC RESULT OUT OF RANGE. MIN SUBSTITUTED"));
          NOOLINE(1);
          return (NUMBOT);
        }
        return (I);
        _imp_leave();
      }
      auto void CHECKSUM(int ARG1, int ARG2) {
        _imp_enter();
        if (ARG1 > 0) {
          if (ARG2 > 0 && MAXINT - ARG1 < ARG2) {
            ERROR(_imp_str_literal("INTEGER OVERFLOW IN SUM/DIFFERENCE"), EMPTY,
                  1, IN);
            {
              _imp_leave();
              return;
            }
          }

        } else {
          if (ARG2 < 0 && MAXINT + ARG2 < IMOD(ARG1)) {
            ERROR(_imp_str_literal("INTEGER OVERFLOW IN SUM/DIFFERENCE"), EMPTY,
                  1, IN);
            {
              _imp_leave();
              return;
            }
          }
        }

        _imp_leave();
      }
      auto void READYNUM(void) {
        _imp_enter();
        ARG1 = UNSTACK();
        ARG2 = UNSTACK();
        CHECKNUM();
        if (JUMPFLAG == 1) {
          _imp_leave();
          return;
        }
        if (ARG1 < 0)
          ARG1 = ARG1 >> 8 | T8;
        else
          ARG1 = ARG1 >> 8;
        if (ARG2 < 0)
          ARG2 = ARG2 >> 8 | T8;
        else
          ARG2 = ARG2 >> 8;
        _imp_leave();
      }
      auto void WORD(void) {
        _imp_enter();
        if ((ARG1 & LM) == LM || ARG1 < 0) {
          ERROR(_imp_str_literal("WORD MUST HAVE A WORD OR NON-NEGATIVE NUMBER "
                                 "AS ARGUMENT - "),
                ARG1, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        if ((ARG2 & LM) == LM || ARG2 < 0) {
          ERROR(_imp_str_literal("WORD MUST HAVE A WORD OR NON-NEGATIVE NUMBER "
                                 "AS ARGUMENT - "),
                ARG2, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        if ((ARG1 & NM) == NM)
          WSTR1 = NUMTOSTR(ARG1);
        else
          WSTR1 = WA;
        if ((ARG2 & NM) == NM)
          WSTR2 = NUMTOSTR(ARG2);
        else
          WSTR2 = WA;
        if (LENGTH + LENGTH > 64) {
          ERROR(_imp_str_literal("WORD LENGTH EXCEEDED - "), CONS, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        STACK(PUT(_imp_join(WSTR1, WSTR2)));
        {
          _imp_leave();
          return;
        }
        _imp_leave();
      }
      auto void LASTPUT(void) {
        _imp_enter();
        if ((ARG2 & LM) != LM) {
          ERROR(_imp_str_literal(
                    "LASTPUT MUST HAVE A LIST AS SECOND ARGUMENT - "),
                ARG2, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        ARG3 = NIL;
        while (ARG2 != NIL) {
          if (QUITFLAG == 1) {
            QUITFLAG = 0;
            JUMPOUT = 0;
            JUMPFLAG = 1;
            STACK(QUIT);
            {
              _imp_leave();
              return;
            }
          }
          if (HOLDFLAG == 1) {
            HOLDFLAG = 0;
            STKSYS(ARG2);
            STKSYS(ARG3);
            ERROR(_imp_str_literal("USER INTERRUPT"), EMPTY, 0, IN);
            ARG3 = UNSTKSYS();
            ARG2 = UNSTKSYS();
            if (JUMPFLAG == 1) {
              _imp_leave();
              return;
            }
          }
          ARG3 = CONS;
          ARG2 = TL(ARG2);
        }
        ARG2 = CONS;
        while (ARG3 != NIL) {
          ARG2 = CONS;
          ARG3 = TL(ARG3);
        }
        STACK(ARG2);
        {
          _imp_leave();
          return;
        }
        _imp_leave();
      }
      auto int EQUAL(int LIST1, int LIST2) {
        _imp_enter();
        if (QUITFLAG == 1) {
          QUITFLAG = 0;
          JUMPOUT = 0;
          JUMPFLAG = 1;
          return (QUIT);
        }
        if (HOLDFLAG == 1) {
          HOLDFLAG = 0;
          STKSYS(LIST1);
          STKSYS(LIST2);
          ERROR(_imp_str_literal("USER INTERRUPT"), EMPTY, 0, IN);
          LIST2 = UNSTKSYS();
          LIST1 = UNSTKSYS();
          if (JUMPFLAG == 1) return (UNSTACK());
        }
        if (LIST1 == LIST2) return (TRUE);
        if ((LIST1 & LM) == 0 || (LIST2 & LM) == 0 || LIST1 == NIL ||
            LIST2 == NIL)
          return (FALSE);
        if (EQUAL(HD(LIST1), HD(LIST2)) == TRUE)
          return (EQUAL(TL(LIST1), TL(LIST2)));
        return (FALSE);
        _imp_leave();
      }
      auto void RESTFILE(void) {
        _imp_enter();
        OWNER = WSTR2;
        USERFILE = WSTR1;
        MDP = W1;
        MDIND = W2;
        if (CACTFILE != 2) GETMASTER();
        _imp_leave();
      }
      auto void SAVEFILE(void) {
        _imp_enter();
        WSTR2 = OWNER;
        OWNER = WSTR1;
        WSTR1 = USERFILE;
        W1 = MDP;
        W2 = MDIND;
        _imp_leave();
      }
      auto void NOFILE(void) {
        _imp_enter();
        CACTFILE = 0;
        USERFILE = _imp_str_literal("");
        OWNER = EMASUSER;
        MDP = 0;
        MDIND = 0;
        _imp_leave();
      }
      auto void FROTHDIR(void) {
        _imp_enter();
        CLOSESM(4);
        CLEAR(_imp_str_literal("4"));
        DISCONNECT(_imp_join(OWNER, _imp_join(_imp_str_literal("."), MASFILE)));
        _imp_leave();
      }
      auto void SHAREFILE(_imp_string FILENAME) {
        _imp_enter();
        int STAT;
        STAT = STATUS(FILENAME, 0);
        if (STAT < 0 || (STAT != 0 && (STAT & 4) == 0)) {
          if (SW == 86) RESTFILE();
          if (SW == 85) {
            NOFILE();
          }

        } else {
          _imp_leave();
          return;
        }
        if (STAT < 0)
          ERROR(_imp_str_literal("FINFO CALL FAILS - "), (-STAT) << 8 | NM, 1,
                IN);
        else
          ERROR(_imp_str_literal("LIBRARY  IS BEING UPDATED - TRY AGAIN"),
                EMPTY, 1, IN);
        _imp_leave();
      }
      auto int FINDFILE(void) {
        _imp_enter();
        int I;
        MDP = 0;
        UDP = 0;
        TXTP = 0;
      FF1:;
        MDMAP(FILSTART + MDP * 4096);
        if (MDENTS != 0) {
          I = 1;
          while (I <= MDENTS) {
            if (QUITFLAG == 1) {
              QUITFLAG = 0;
              JUMPOUT = 0;
              JUMPFLAG = 1;
              if (SW == 75)
                NOFILE();
              else
                FROTHDIR();
              if (SW == 86) RESTFILE();
              if (SW == 85) {
                NOFILE();
              }
              return (QUIT);
            }
            if (HOLDFLAG == 1) {
              HOLDFLAG = 0;
              if (SW == 75)
                NOFILE();
              else
                FROTHDIR();
              if (SW == 86) RESTFILE();
              if (SW == 85) {
                NOFILE();
              }
              ERROR(_imp_str_literal("USER INTERRUPT -  PROCESS ABANDONNED"),
                    EMPTY, 1, IN);
              return (UNSTACK());
            }
            if (I == 63) {
              MDP = MDNEXT;
              goto FF1;
            }
            if (UDNAM == USERFILE) return (I);
            I = I + 1;
          }
        }
        return (-1);
        _imp_leave();
      }
      auto void GOTHDIR(void) {
        _imp_enter();
        int TEMP;
        SHAREFILE(_imp_join(OWNER, _imp_join(_imp_str_literal("."), MASFILE)));
        if (JUMPFLAG == 1) {
          _imp_leave();
          return;
        }
        DEFINE(_imp_join(
            _imp_str_literal("4,"),
            _imp_join(OWNER, _imp_join(_imp_str_literal("."), MASFILE))));
        FILSTART = SMADDR(4, FLEN);
        TEMP = FINDFILE();
        if (JUMPFLAG == 1) {
          STACK(TEMP);
        }
        if (TEMP < 0) {
          FROTHDIR();
          if (SW == 86) RESTFILE();
          if (SW == 85) {
            NOFILE();
          }
          ERROR(_imp_str_literal("CANNOT FIND LIBRARY FILE "), EMPTY, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        MDIND = TEMP;
        _imp_leave();
      }
      auto void CLAIMMASTER(void) {
        _imp_enter();
        int STAT;
        STAT = STATUS(MASFILE, 0);
        if (STAT == 0)
          PERMIT(MASWRITE);
        else {
          if (SW == 75) NOFILE();
          if (SW == 104 || SW == 105) /*ERROR: name_sym_idx is -1!*/ /*C_NAME*/
              /*ERROR: name_sym_idx is -1!*/                         /*C_NAME*/
            MISSING_RHS;
          if (CACTFILE != 2) GETMASTER();
          if (STAT < 0)
            ERROR(_imp_str_literal("FINFO CALL FAILS - "), (-STAT) << 8 | NM, 1,
                  IN);
          else
            ERROR(
                _imp_str_literal("YOUR FILE IS IN USE BY ANOTHER - TRY AGAIN"),
                EMPTY, 1, IN);
          {
            _imp_leave();
            return;
          }
        }
        GETMASTER();
        _imp_leave();
      }
      auto void FILETIDY(void) {
        _imp_enter();
        _imp_string SIZE;
        int TLEN;
        int PAGE;
        int TMDP;
        int TTXTP;
        int TINDEX;
        int I;
        int J;
        int K;
        if (CACTFILE != 2) CLUSERFL();
        CLAIMMASTER();
        if (JUMPFLAG == 1) {
          _imp_leave();
          return;
        }
        MDMAP(FILSTART);
        if (MDENTS == 0) {
          CLOSESM(4);
          PERMIT(MASREAD);
          {
            _imp_leave();
            return;
          }
        }
        TMDP = 0;
        PAGE = 0;
        TXTP = 0;
        SIZE = NUMTOSTR(FLEN << 8);
        DEFINE(_imp_str_literal("10,T#JUNK"));
        NEWSMFILE(_imp_join(_imp_str_literal("T#JUNK,"), SIZE));
        TSTART = SMADDR(10, TLEN);
        TMDMAP(TSTART);
        TENDMAP();
        *TENDTXT = 0;
        *TMDENTS = 0;
      FT1:;
        I = 1;
        while (I <= MDENTS) {
          if (I == 63) {
            MDMAP(FILSTART + MDNEXT * 4096);
          }
          if (UDNAM != _imp_str_literal("")) {
            *TMDENTS = TMDENTS + 1;
            if (TMDENTS == 63) {
              PAGE = PAGE + 1;
              *TMDNEXT = PAGE;
              TMDP = PAGE;
              TMDMAP(TSTART + PAGE * 4096);
              *TMDENTS = 1;
            }
            *TUDNAM(/*index missing*/) = UDNAM;
            if (CACTFILE == 1) {
              if (UDNAM == USERFILE) {
                MDP = TMDP;
                MDIND = TMDENTS;
              }
            }
            PAGE = PAGE + 1;
            *TUDPAGE(/*index missing*/) = PAGE;
            TUDMAP(TSTART + PAGE * 4096);
            *TUDENTS = 0;
            UDMAP(FILSTART + UDPAGE * 4096);
          FT2:;
            J = 1;
            while (J <= UDENTS) {
              if (J == 61) {
                UDMAP(FILSTART + UDNEXT * 4096);
              }
              if (FUNNAM != _imp_str_literal("")) {
                *TUDENTS = TUDENTS + 1;
                if (TUDENTS == 61) {
                  PAGE = PAGE + 1;
                  *TUDNEXT = PAGE;
                  TUDMAP(TSTART + PAGE * 4096);
                  *TUDENTS = 1;
                }
                *TFUNNAM(/*index missing*/) = FUNNAM;
                if (TENDTXT == 0 || SHORTINT(TENDIND) == 4093) {
                  PAGE = PAGE + 1;
                  TTXTP = PAGE;
                  if (TENDTXT != 0) *TTXTNEXT = PAGE;
                  TTXTMAP(TSTART + PAGE * 4096);
                  TINDEX = 0;
                  *TTXTNEXT = 0;
                  *TENDTXT = PAGE;
                  *TENDIND(/*index missing*/) = 0;
                  *TENDIND(/*index missing*/) = 1;
                }
                if (TXTP != TXTPAGE) GETTXTP(J);
                INDEX = SHORTINT(TXTIND);
              FT3:;
                if (TINDEX == 4092) {
                  PAGE = PAGE + 1;
                  *TTXTNEXT = PAGE;
                  TTXTP = PAGE;
                  SETSHORTINT(TTXTENTS, 4092);
                  TTXTMAP(TSTART + PAGE * 4096);
                  TINDEX = 0;
                  *TTXTNEXT = 0;
                }
                TINDEX = TINDEX + 1;
                READINSYM(K);
                *TFNTXT(/*index missing*/) = K;
                if (K == TERMIN) {
                  if (INDEX <= SHORTINT(TXTENTS) || TXTNEXT != 0) {
                    if (NEXTINSYM() != 'T') goto FT3;
                  }

                } else
                  goto FT3;
                *TTXTPAGE(/*index missing*/) = TENDTXT;
                *TTXTIND(/*index missing*/) = TENDIND;
                *TTXTIND(/*index missing*/) = TENDIND;
                *TENDTXT = TTXTP;
                SETSHORTINT(TENDIND, TINDEX + 1);
                SETSHORTINT(TTXTENTS, TINDEX);
              }
              J = J + 1;
            }
          }
          I = I + 1;
        }
        CLOSESM(4);
        CLEAR(_imp_str_literal("4"));
        DESTROY(MASFILE);
        if (PAGE * 4096 + 4096 < TLEN) {
          SIZE = NUMTOSTR((PAGE * 4096 + 4096) << 8);
          DEFINE(_imp_join(_imp_str_literal("4,"), MASFILE));
          NEWSMFILE(_imp_join(MASFILE, _imp_join(_imp_str_literal(","), SIZE)));
          FILSTART = SMADDR(4, FLEN);
          for (I = 0; I != FLEN - 4096 + 4096; I += 4096) {
            J = FILSTART + I;
            K = TSTART + I;
            MOVE(4096, K, J);
          }
          CLOSESM(10);
          DESTROY(_imp_str_literal("T#JUNK"));
          CLOSESM(4);

        } else {
          CLOSESM(10);
          RENAME(_imp_join(_imp_str_literal("T#JUNK,"), MASFILE));
        }
        CLEAR(_imp_str_literal("10"));
        CHERISH(MASFILE);
        PERMIT(MASREAD);
        PERMIT(_imp_join(MASFILE, _imp_str_literal(",,R")));
        _imp_leave();
      }
auto void UPDIR)(int NAME
)auto int FNENTS, FNENTSEM, QUITFLAG, JUMPOUT, JUMPFLAG, QUIT, HOLDFLAG, HOLDFLAG, STKSYS, LIST1, STKSYS, LIST2, ERROR, EMPTY, IN, LIST2, UNSTKSYS, LIST1, UNSTKSYS, JUMPFLAG, UNSTACK, LIST1, LIST2, TRUE, LIST2, LM, LIST1, NIL, LIST2, NIL, LIST1, LM, FALSE, EQUAL, HD, LIST1, HD, LIST2, TRUE, EQUAL, TL, LIST1, TL, LIST2, FALSE, FNENTSEM, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, FNENTSEMRING, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, e, FNENTSEMRING, FNENTSEMRING,