// cc -o recode recode.c -I/home/gtoal/src/compilers101/new-parser/imptoc/include/c /home/gtoal/src/compilers101/new-parser/imptoc/runtime/perms.c -lm

#include <perms.h>

int Exist(_imp_string File) {
  FILE *test = fopen(_imp_cstr_safe(&File), "rb");
  if (test) {
    fclose(test);
    return TRUE;
  }
  return FALSE;
}

#define Absf 1
#define Adc 2
#define Adcb 3
#define Add 4
#define Addf 5
#define Ash 6
#define Ashc 7
#define Asl 8
#define Aslb 9
#define Asr 10
#define Asrb 11
#define Beq 12
#define Bge 13
#define Bgt 14
#define Bhi 15
#define Bhis 16
#define Bic 17
#define Bicb 18
#define Bis 19
#define Bisb 20
#define Bit 21
#define Bitb 22
#define Ble 23
#define Blo 24
#define Blos 25
#define Blt 26
#define Bmi 27
#define Bne 28
#define Bpl 29
#define Bpt 30
#define Br 31
#define Bvc 32
#define Bvs 33
#define Cfcc 34
#define Clr 35
#define Clrb 36
#define Clrf 37
#define Cmp 38
#define Cmpb 39
#define Cmpf 40
#define Com 41
#define Comb 42
#define Dec 43
#define Decb 44
#define Div 45
#define Divf 46
#define Emt 47
#define Fadd 48
#define Fdiv 49
#define Fmul 50
#define Fsub 51
#define Halt 52
#define Inc 53
#define Incb 54
#define Iot 55
#define Jmp 56
#define Jsr 57
#define Ldcfd 58
#define Ldcif 59
#define Ldexp 60
#define Ldf 61
#define Ldfps 62
#define Mark 63
#define Mfpd 64
#define Mfpi 65
#define Modf 66
#define Mov 67
#define Movb 68
#define Mtpd 69
#define Mtpi 70
#define Mul 71
#define Mulf 72
#define Neg 73
#define Negb 74
#define Negf 75
#define Nop 76
#define Reset 77
#define Rol 78
#define Rolb 79
#define Ror 80
#define Rorb 81
#define Rti 82
#define Rts 83
#define Rtt 84
#define Sbc 85
#define Sbcb 86
#define Setd 87
#define Setf 88
#define Seti 89
#define Setl 90
#define Sob 91
#define Spl 92
#define Stcfd 93
#define Stcfi 94
#define Stexp 95
#define Stf 96
#define Stfps 97
#define Stst 98
#define Sub 99
#define Subf 100
#define Swab 101
#define Sxt 102
#define Trap 103
#define Tst 104
#define Tstb 105
#define Tstf 106
#define Wait 107
#define Xor 108

/* static const */ _imp_string Optext[1+108 /*1:108*/] = {_imp_str_literal("ERROR"),
    _imp_str_literal("Absf "), _imp_str_literal("Adc  "),
    _imp_str_literal("Adcb "), _imp_str_literal("Add  "),
    _imp_str_literal("Addf "), _imp_str_literal("Ash  "),
    _imp_str_literal("Ashc "), _imp_str_literal("Asl  "),
    _imp_str_literal("Aslb "), _imp_str_literal("Asr  "),
    _imp_str_literal("Asrb "), _imp_str_literal("Beq  "),
    _imp_str_literal("Bge  "), _imp_str_literal("Bgt  "),
    _imp_str_literal("Bhi  "), _imp_str_literal("Bhis "),
    _imp_str_literal("Bic  "), _imp_str_literal("Bicb "),
    _imp_str_literal("Bis  "), _imp_str_literal("Bisb "),
    _imp_str_literal("Bit  "), _imp_str_literal("Bitb "),
    _imp_str_literal("Ble  "), _imp_str_literal("Blo  "),
    _imp_str_literal("Blos "), _imp_str_literal("Blt  "),
    _imp_str_literal("Bmi  "), _imp_str_literal("Bne  "),
    _imp_str_literal("Bpl  "), _imp_str_literal("Bpt  "),
    _imp_str_literal("Br   "), _imp_str_literal("Bvc  "),
    _imp_str_literal("Bvs  "), _imp_str_literal("Cfcc "),
    _imp_str_literal("Clr  "), _imp_str_literal("Clrb "),
    _imp_str_literal("Clrf "), _imp_str_literal("Cmp  "),
    _imp_str_literal("Cmpb "), _imp_str_literal("Cmpf "),
    _imp_str_literal("Com  "), _imp_str_literal("Comb "),
    _imp_str_literal("Dec  "), _imp_str_literal("Decb "),
    _imp_str_literal("Div  "), _imp_str_literal("Divf "),
    _imp_str_literal("Emt  "), _imp_str_literal("Fadd "),
    _imp_str_literal("Fdiv "), _imp_str_literal("Fmul "),
    _imp_str_literal("Fsub "), _imp_str_literal("Halt "),
    _imp_str_literal("Inc  "), _imp_str_literal("Incb "),
    _imp_str_literal("Iot  "), _imp_str_literal("Jmp  "),
    _imp_str_literal("Jsr  "), _imp_str_literal("Ldcfd"),
    _imp_str_literal("Ldcif"), _imp_str_literal("Ldexp"),
    _imp_str_literal("Ldf  "), _imp_str_literal("Ldfps"),
    _imp_str_literal("Mark "), _imp_str_literal("Mfpd "),
    _imp_str_literal("Mfpi "), _imp_str_literal("Modf "),
    _imp_str_literal("Mov  "), _imp_str_literal("Movb "),
    _imp_str_literal("Mtpd "), _imp_str_literal("Mtpi "),
    _imp_str_literal("Mul  "), _imp_str_literal("Mulf "),
    _imp_str_literal("Neg  "), _imp_str_literal("Negb "),
    _imp_str_literal("Negf "), _imp_str_literal("Nop  "),
    _imp_str_literal("Reset"), _imp_str_literal("Rol  "),
    _imp_str_literal("Rolb "), _imp_str_literal("Ror  "),
    _imp_str_literal("Rorb "), _imp_str_literal("Rti  "),
    _imp_str_literal("Rts  "), _imp_str_literal("Rtt  "),
    _imp_str_literal("Sbc  "), _imp_str_literal("Sbcb "),
    _imp_str_literal("Setd "), _imp_str_literal("Setf "),
    _imp_str_literal("Seti "), _imp_str_literal("Setl "),
    _imp_str_literal("Sob  "), _imp_str_literal("Spl  "),
    _imp_str_literal("Stcfd"), _imp_str_literal("Stcfi"),
    _imp_str_literal("Stexp"), _imp_str_literal("Stf  "),
    _imp_str_literal("Stfps"), _imp_str_literal("Stst "),
    _imp_str_literal("Sub  "), _imp_str_literal("Subf "),
    _imp_str_literal("Swab "), _imp_str_literal("Sxt  "),
    _imp_str_literal("Trap "), _imp_str_literal("Tst  "),
    _imp_str_literal("Tstb "), _imp_str_literal("Tstf "),
    _imp_str_literal("Wait "), _imp_str_literal("Xor  ")};
/* static const */ unsigned char Optype[110 /*-1:108*/] = {
    0, 0, 1, 1, 1, 2, 3, 3, 3, 1, 1, 1, 1, 5, 5, 5, 5, 5, 2, 2, 2, 2,
    2, 2, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 0, 1, 1, 1, 2, 2, 3, 1, 1,
    1, 1, 3, 3, 9, 4, 4, 4, 4, 0, 1, 1, 0, 1, 3, 3, 3, 3, 3, 1, 7, 1,
    1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 4, 0, 1, 1,
    0, 0, 0, 0, 1, 6, 3, 3, 3, 3, 1, 1, 2, 3, 1, 1, 9, 1, 1, 1, 0, 3};
/* static const */ int Special[128 /*0:127*/] = {
    2155, 2588, 3098, 3607, 57,   360,  870,  870,  67,   67,   67,   67, 67,
    67,   67,   67,   38,   38,   38,   38,   38,   38,   38,   38,   21, 21,
    21,   21,   21,   21,   21,   21,   17,   17,   17,   17,   17,   17, 17,
    17,   19,   19,   19,   19,   19,   19,   19,   19,   4,    4,    4,  4,
    4,    4,    4,    4,    71,   45,   6,    7,    108,  1843, 1843, 91, 4125,
    4633, 5153, 5656, 6247, 617,  1105, 1105, 68,   68,   68,   68,   68, 68,
    68,   68,   39,   39,   39,   39,   39,   39,   39,   39,   22,   22, 22,
    22,   22,   22,   22,   22,   18,   18,   18,   18,   18,   18,   18, 18,
    20,   20,   20,   20,   20,   20,   20,   20,   99,   99,   99,   99, 99,
    99,   99,   99,   1642, 1608, 1597, 1636, 1632, 1631, 1629, 1595};
/* static const */ _imp_string Regid[8 /*0:7*/] = {
    _imp_str_literal("R0"), _imp_str_literal("R1"),  _imp_str_literal("R2"),
    _imp_str_literal("R3"), _imp_str_literal("LNB"), _imp_str_literal("DS"),
    _imp_str_literal("SP"), _imp_str_literal("PC")};

/* static const */ unsigned char Clrgroup[8 /*0:7*/] = {Clr, Com, Inc, Dec,
                                                        Neg, Adc, Sbc, Tst};
/* static const */ unsigned char Clrbgroup[8 /*0:7*/] = {
    Clrb, Comb, Incb, Decb, Negb, Adcb, Sbcb, Tstb};
/* static const */ unsigned char Rorgroup[8 /*0:7*/] = {Ror,  Rol,  Asr,  Asl,
                                                        Mark, Mfpi, Mtpi, Sxt};
/* static const */ unsigned char Rorbgroup[8 /*0:7*/] = {Rorb, Rolb, Asrb, Aslb,
                                                         0,    Mfpd, Mtpd, 0};
/* static const */ unsigned char Oldfp[8 /*0:7*/] = {Fadd, Fsub, Fsub, Fdiv,
                                                     0,    0,    0,    0};
/* static const */ unsigned char Fpsingle[4 /*0:3*/] = {Clrf, Tstf, Absf, Negf};

/* static const */ unsigned char Floating[16 /*0:15*/] = {
    0,   0,    Mulf,  Modf,  Addf,  Ldf,   Subf,  Cmpf,
    Stf, Divf, Stexp, Stcfi, Stcfd, Ldexp, Ldcif, Ldcfd};

/* static const */ unsigned char Fpsets[16 /*0:15*/] = {
    Cfcc, Setf, Seti, [3 ... 8] = 0, Setd, Setl, [11 ... 15] = 0};
/* static const */ unsigned char Halts[7 /*0:6*/] = {Halt, Wait,  Rti, Bpt,
                                                     Iot,  Reset, Rtt};
/* static const */ unsigned char Pair[10+16 /*10:25*/] = {0,0,0,0,0,0,0,0,0,0,
    Bne, Beq,  Bge, Blt, Bgt,  Ble, Bpl, Bmi,
    Bhi, Blos, Bvc, Bvs, Bhis, Blo, Emt, Trap};

static int Alisting = 0;
static _imp_string *Global = NULL;

void Printoctal(int N, int P) {
  int J;
  int K;
  for (J = 15; J >= 0; J -= 3) {
    K = (unsigned)N >> J & 7;
    if (K != 0 || P != 0 || J == 0) {
      Printsymbol(K + '0');
      P = 1;
    }
  }
} // Printoctal

static int More(int Mb) {
  int Base;
  int Mode;
  Base = Mb & 7;
  Mode = (unsigned)Mb >> 3;
  if (Mode >= 6 || (Base == 7 && (Mode | 1) == 3)) return (-1);
  return (0);
} // More

void Decode11(int C, int V, int R, int Sp) {
  static int State = 0;
  static int Expected = -1;
  static int Ca;
  static int P = 0;
  static int Op;
  static int T;
  static int Key;
  static int Extra;
  static int Marker = ' ';
  int N;
  static int Val[1+2 /*1:2*/] = {0, [0 ... 1] = 0};
  static int Rel[1+2 /*1:2*/] = {0, [0 ... 1] = 0};

  void Spaceout(void) {
    Spaces(Sp);
    Printsymbol(Marker);
    Marker = ' ';
  } // Spaceout
  
  void Expend(int N) {
    Spaceout();
    Printoctal(Expected, 1);
    Expected += 2;
    Printstring(_imp_str_literal(": "));
    Printoctal(N, 1);
    Newline();
  } // Expend
  
  if (C != Expected) {
    Expected -= 2 * P;
    if (State) {
      Expected -= 2;
      Expend(Op);
    }
    if (P) Expend(Val[1]);
    if (P == 2) Expend(Val[2]);
    Expected = C;
    State = 0;
    Marker = '=';
  }
  Expected += 2;
  if (!State) {
    Op = V & 0xFFFF;
    Ca = C;
    P = 0;
    Key = Special[(unsigned)Op >> 9];
    N = (unsigned)Key >> 8;
    Key = Key & 255;
    if (N >= 10) {
      if (Op & 0400) N++;
      Key = Pair[N];
      goto Ok;
    } else {
      switch (N) {
        case 1:
          Key = Clrgroup[(unsigned)Op >> 6 & 7];
          goto Ok;
        case 2:
          Key = Clrbgroup[(unsigned)Op >> 6 & 7];
          goto Ok;
        case 3:
          Key = Rorgroup[(unsigned)Op >> 6 & 7];
          goto Ok;
        case 4:
          Key = Rorbgroup[(unsigned)Op >> 6 & 7];
          goto Ok;
        case 6:
          N = (unsigned)Op >> 8 & 15;
          if (N > 1)
            Key = Floating[N];
          else if (N == 1)
            Key = Fpsingle[(unsigned)Op >> 6 & 3];
          else
            Key = Fpsets[Op & 15];
          goto Ok;
        case 7:
          Key = Oldfp[(unsigned)Op >> 3 & 7];
          goto Ok;
        case 8:
          if (Op <= 6)
            Key = Halts[Op];
          else if ((Op & 0400) == 0400)
            Key = Br;
          else if ((Op & 0700) == 0300)
            Key = Swab;
          else if (Op == 0240)
            Key = Nop;
          else if ((Op & 0700) == 0100)
            Key = Jmp;
          else if ((Op & 0770) == 0200)
            Key = Rts;
          else if ((Op & 0770) == 0230)
            Key = Spl;
          else if ((Op & 0177740) == 0000240)
            Key = -1;
          else
            Key = 0;
        Ok:;
        case 0:
          T = Optype[Key+1];// adjust for -1 lower bound
          Extra = 0;
          if (1 <= T && T <= 3) {
            if (More(Op & 077)) Extra++;
            if (T == 2 && More((unsigned)Op >> 6 & 077) != 0) Extra++;
            State = Extra;
          }
          break;
      }
    }
  } else {
    if (V & 0x8000) V = V | (-1) << 16;
    P++;
    Val[P] = V;
    Rel[P] = R;
    State--;
  }
  if (State) return;
  
  void Printreloc(int R) {
    if (R > 0) {
      if (R & 1) Printstring(_imp_str_literal("-Pc"));
      R = (unsigned)R >> 1;
      if (R) {
        Printsymbol('+');
        Write(R, 0);
      }
    }
  } // Printreloc
  
  void Printoper(int Mb) {
    int M;
    int B;
    int V;
    int R;
    M = (unsigned)Mb >> 3;
    B = Mb & 7;
    if (M >= 6) {
      P++;
      V = Val[P];
      R = Rel[P];
      Ca += 2;
      if (M == 7) Printsymbol('@');
      if (B == 7) {
        Printsymbol('=');
        Printoctal(V + Ca, 0);
      } else {
        Printoctal(V, 0);
        Printreloc(R);
        Printsymbol('(');
        Printstring(Regid[B]);
        Printsymbol(')');
      }
    } else if (M <= 1) {
      if (M) Printsymbol('(');
      Printstring(Regid[B]);
      if (M) Printsymbol(')');
    } else if (B == 7 && (M | 1) == 3) {
      if (M & 1) Printsymbol('@');
      Printsymbol('#');
      P++;
      V = Val[P];
      R = Rel[P];
      Ca += 2;
      if (V < 0) {
        V = -V;
        Printsymbol('-');
      }
      if (Global != NULL) {
        Printstring(*Global);
        if (V) {
          Printstring(_imp_str_literal(" + "));
          Printoctal(V, 0);
        }
      } else
        Printoctal(V, 0);
      Printreloc(R);
    } else {
      if (M & 1) Printsymbol('@');
      if ((M | 1) == 5) Printsymbol('-');
      Printsymbol('(');
      Printstring(Regid[B]);
      Printsymbol(')');
      if ((M | 1) == 3) Printsymbol('+');
    }
  } // Printoper
  
  void Printjump(int D) {
    if (D & 128) D = D | (-1) << 8;
    Printoctal(D * 2 + Ca, 0);
  } // Printjump
  
  Spaceout();
  Printoctal(Ca, 1);
  Printstring(_imp_str_literal(": "));
  Printoctal(Op, 1);
  if (Key) {
    Space();
    if (Extra)
      Printoctal(Val[1], 1);
    else
      Spaces(6);
    Space();
    if (Extra == 2)
      Printoctal(Val[2], 1);
    else
      Spaces(6);
    Space();
    if (Key < 0) {
      if (!(Op & 020))
        Printstring(_imp_str_literal("Clear"));
      else
        Printstring(_imp_str_literal("Set"));
      if (Op & 8) Printstring(_imp_str_literal(" N"));
      if (Op & 4) Printstring(_imp_str_literal(" Z"));
      if (Op & 2) Printstring(_imp_str_literal(" V"));
      if (Op & 1) Printstring(_imp_str_literal(" C"));
    } else {
      Printstring(Optext[Key]);
      Ca += 2;
      if (T) Space();
    }
    P = 0;
    switch (T) {
      case 2:
        Printoper((unsigned)Op >> 6 & 077);
        Printstring(_imp_str_literal(", "));
      case 1:
        Printoper(Op & 077);
        break;
      case 3:
        if ((Op & 0170000) == 0170000) Op = Op & 0377;
        Printstring(Regid[(unsigned)Op >> 6 & 7]);
        Printstring(_imp_str_literal(", "));
        Printoper(Op & 077);
        break;
      case 4:
        Printstring(Regid[Op & 7]);
        break;
      case 5:
        Printjump(Op & 255);
        break;
      case 6:
        Write(Op & 7, 1);
        break;
      case 7:
        Write(Op & 077, 1);
        break;
      case 8:
        Printjump(-(Op & 077));
        break;
      case 9:
        Write(Op & 255, 1);
      case 0:;
        break;
      default:
        fprintf(stderr, "\nSwitch label 'Spec(%d):' not set in %s\n", T, __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
    }
  }  // !Key
  Newline();
  P = 0;
  return;
} // Decode11

void Code11(_imp_string File) {

  void Fspec(_imp_string S, _imp_string * Sfile, _imp_string * Ofile,
             _imp_string * Lfile) {
    _imp_string Fu;
    _imp_string Pd;
    _imp_string F1;
    _imp_string F2;
    _imp_string F3;
    _imp_string Ext;
    // _imp_string Fn;
    static const _imp_string Dfext = _imp_str_literal(".imp");
    _imp_string Temp;
    if (_imp_resolve(S, &F1, _imp_str_literal(","), &Temp) &&
        _imp_resolve(Temp, &F2, _imp_str_literal("/"), &F3))
      S = _imp_join(
          F1, _imp_join(_imp_str_literal(","),
                        _imp_join(F2, _imp_join(_imp_str_literal(","), F3))));
    if (_imp_resolve(S, &F1, _imp_str_literal("/"), &F2))
      S = _imp_join(F1, _imp_join(_imp_str_literal(",,"), F2));
    S = _imp_join(S, _imp_str_literal(","));
    if (!_imp_resolve(S, &F1, _imp_str_literal(","), &F2)) _imp_signal(7, 0, 0, _imp_str_literal(""));
    if (_imp_strcmp(F2, _imp_str_literal(""))!=0) {
      if (!_imp_resolve(F2, &F2, _imp_str_literal(","), &F3))
        _imp_signal(7, 0, 0, _imp_str_literal(""));
      else
        F3 = _imp_str_literal("");
    }
    if (_imp_resolve(F1, &Fu, _imp_str_literal("."), &F1))
      Fu = _imp_join(Fu, _imp_str_literal("."));
    else
      Fu = _imp_str_literal("");
    if (_imp_resolve(F1, &Pd, _imp_str_literal("_"), &F1))
      Pd = _imp_join(Pd, _imp_str_literal("_"));
    else
      Pd = _imp_str_literal("");
    if (_imp_resolve(F1, &F1, _imp_str_literal("."), &Ext))
      Ext = _imp_join(_imp_str_literal("."), Ext);
    else
      Ext = _imp_str_literal("");
    if (!Exist(_imp_join(Fu, _imp_join(Pd, _imp_join(F1, Ext))))) {
      if (_imp_strcmp(Ext, _imp_str_literal(""))==0 &&
          Exist(_imp_join(Fu, _imp_join(Pd, _imp_join(F1, Dfext)))) == 0) {
        Printstring(_imp_join(
            _imp_str_literal("Source file "),
            _imp_join(
                Fu,
                _imp_join(
                    Pd,
                    _imp_join(
                        F1, _imp_join(Ext,
                                      _imp_str_literal(
                                          " does not exist or no access")))))));
        Newline();
        *Sfile = _imp_str_literal("");
        *Ofile = _imp_str_literal("");
        *Lfile = _imp_str_literal("");
        return;
      } else {
        Ext = Dfext;
      }
    }
    if (_imp_strcmp(F2, _imp_str_literal(""))==0) {
      if (Exist(_imp_join(F1, _imp_str_literal(".rel"))))
        F2 = _imp_join(F1, _imp_str_literal(".rel"));
      else
        F2 = _imp_join(Fu,
                       _imp_join(Pd, _imp_join(F1, _imp_str_literal(".rel"))));
    }
    if (!Exist(F2)) {
      Printstring(_imp_join(
          _imp_str_literal("Object file "),
          _imp_join(F2, _imp_str_literal(" does not exist or no access"))));
      Newline();
      *Sfile = _imp_str_literal("");
      *Ofile = _imp_str_literal("");
      *Lfile = _imp_str_literal("");
      return;
    }
    if (_imp_strcmp(F3, _imp_str_literal(""))==0)
      F3 = _imp_join(F1, _imp_str_literal(".lst"));
    *Sfile = _imp_join(Fu, _imp_join(Pd, _imp_join(F1, Ext)));
    *Ofile = F2;
    *Lfile = F3;
  } // Fspec
  
  void Printoctal(int N, int P) {
    N = N & 0xFFFF;
    for (P = 15; P >= 0; P -= 3) Printsymbol(((unsigned)N >> P & 7) + '0');
  } // Printoctal
  
  //int Codebase;
  //int Glabase;
  //int Constantbase;
  static int Type = 0;
  static int Chain;
  static int Module;
  //static int Glob;
  #define Maxglobals 40
  //static _imp_string *Global = NULL;
  static _imp_string Externals[Maxglobals];
  _imp_string Listing;
  _imp_string Object;
  _imp_string Source;
  static int Ca = 0;
  static int Start = 0;
  int Sym;
  int N;
  int Line;
  
  void Getsourceline(int L) {
    int S;
    static int Here = 0;
    if (Here >= L) return;
    Selectinput(1);
    do {
      Here++;
      if (Start <= Line) {
        Write(Here, 4);
        Space();
        if (Alisting) {
          Printoctal(Ca, 7);
          Spaces(5);
        }
      }
      do {
        Readsymbol(&S);
        if (Start <= Line) Printsymbol(S);
      } while (S != Nl);
    } while (Here != L);
    Selectinput(2);
  } // Getsourceline
  
  int Twobytes(void) {
    int B1;
    int B2;
    Readch(&B1);
    Readch(&B2);
    return ((B2 << 8) + B1);
  } // Twobytes
  
  _imp_string Qstring(void) {
    _imp_string P;
    int L;
    int S;
    P = _imp_str_literal("");
    Readch(&L);
    while (L > 0) {
      Readch(&S);
      Printsymbol(S);
      P = _imp_join(P, Tostring(S));
      L--;
    }
    return (P);
  } // Qstring
  
  void Pstring(void) {
    _imp_string S;
    S = Qstring();
    Printstring(S);
  } // Pstring
  
  void Dumpdefinitions(void) {
    int N;
    int J;
    int Code;
    N = Twobytes();
    if (!N) {
      Printstring(_imp_str_literal("No external definitions"));
      Newline();
    } else {
      Printstring(_imp_str_literal("External definitions:"));
      Newline();
      for (J = 1; J <= N; J++) {
        Readch(&Code);
        if (Code == 5)
          Printstring(_imp_str_literal("Code+"));
        else if (Code == 6)
          Printstring(_imp_str_literal(" Gla+"));
        else
          Printstring(_imp_str_literal("   ?+"));
        Printoctal(Twobytes(), 0);
        Space();
        Pstring();
        Newline();
      }
    }
    Newline();
  } // Dumpdefinitions
  
  void Dumpreferences(void) {
    int N;
    int J;
    N = Twobytes();
    if (!N) {
      Printstring(_imp_str_literal("No external references"));
      Newline();
    } else {
      Printstring(_imp_str_literal("External references:"));
      Newline();
      for (J = 1; J <= N; J++) {
        Write(J, 3);
        Space();
        if (J < Maxglobals)
          Externals[J] = Qstring();
        else
          Externals[Maxglobals] = Qstring();
        Newline();
      }
    }
    Newline();
  } // Dumpreferences
  
  Global = NULL;
  Fspec(File, &Source, &Object, &Listing);
  if (_imp_strcmp(Source, _imp_str_literal(""))==0) exit(0);
  Openinput(1, Source);
  Openinput(2, Object);
  Openoutput(3, Listing);
  Selectoutput(3);
  Selectinput(0);
  Start = 1;
  Selectinput(2);
  Module = 0;
Go:
  Chain = Twobytes();
  //Codebase = 0;
  //Glabase = 0;
  //Constantbase = 0;
  if (Chain) {
    Module++;
    Printstring(_imp_str_literal("Module #"));
    Write(Module, 0);
    Newline();
  }
  Printstring(_imp_str_literal("Code Size: "));
  Write(Twobytes(), 1);
  Printstring(_imp_str_literal(" bytes"));
  Newline();
  Printstring(_imp_str_literal(" Gla Size: "));
  Write(Twobytes(), 1);
  Printstring(_imp_str_literal(" bytes"));
  Newline();
  Printstring(_imp_str_literal("Diag Size: "));
  Write(Twobytes(), 1);
  Printstring(_imp_str_literal(" bytes"));
  Newline();
  Printstring(_imp_str_literal("Line Size: "));
  Write(Twobytes(), 1);
  Printstring(_imp_str_literal(" bytes"));
  Newline();
  Printstring(_imp_str_literal("Event Size:"));
  Write(Twobytes(), 1);
  Printstring(_imp_str_literal(" bytes"));
  Newline();
  Printstring(_imp_str_literal("Section: "));
  Pstring();
  Newline();
  Dumpdefinitions();
  Dumpreferences();
  for (;;) {
    Readch(&Sym);
    if (1 <= Sym && Sym <= 15) switch (Sym) {
        case 1:
          Type = 0;
          Ca = Twobytes();
          continue;
        case 2:
          Type = 'G';
          Ca = Twobytes();
          continue;
        case 3:
          Type = 'D';
          Ca = Twobytes();
          continue;
        case 4:
          Type = 'L';
          Ca = Twobytes();
          continue;
        case 5:
          continue;
        case 6:
          continue;
        case 7:
          continue;
        case 8:
          continue;
        case 9:
          N = Twobytes();
          if (N < Maxglobals) Global = &Externals[N];
          continue;
        case 10:
          continue;
        case 11:
          Readch(&N);
          Ca++;
          continue;
        case 12:
          N = Twobytes();
          if (Start <= Line && Type == 0 && Alisting == 0)
            Decode11(Ca, N, 0, 8);
          Global = NULL;
          Ca += 2;
          continue;
        case 13:
          Line = Twobytes();
          Getsourceline(Line);
          continue;
        case 14:
          Printstring(_imp_str_literal("Event: "));
          Printstring(_imp_str_literal("Mask:"));
          Printoctal(Twobytes(), 1);
          Printstring(_imp_str_literal("  Ep:"));
          Printoctal(Twobytes(), 1);
          Printstring(_imp_str_literal("  Low:"));
          Printoctal(Twobytes(), 1);
          Printstring(_imp_str_literal("  High:"));
          Printoctal(Twobytes(), 1);
          Newline();
          continue;
        case 15:;
          if (Chain) {
            Printstring(_imp_str_literal("End of Module"));
            Newline();
            Newpage();
            goto Go;
          }
          Printstring(_imp_str_literal("End of file"));
          Newline();
          return;
        default:
          fprintf(stderr, "\nSwitch label 'T(%d):' not set in %s\n", Sym, __PRETTY_FUNCTION__);
          fflush(stderr);
          abort();
      }
    else {
      Printstring(_imp_str_literal("Corrupt object file"));
      Write(Sym, 1);
      Newline();
      exit(0);
    }
  }
} // Code11

int _imp_mainep(int argc, char **argv) {
  Alisting = 1; // ALIST11 command. Otherwise you get CODE11 command.
  Code11(_imp_c2istr(argv[1]));
  exit(0);
  return 0;
} // main
