#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  ! reconstituted from intexts
//     2
//     3  %EXTERNALROUTINE RECODE(%INTEGER S, TO, BASE)

void RECODE(int S, int TO, int BASE) {
  //     4  %CONSTINTEGERARRAY OPCODES(0 : 255) =    %C

  const int OPCODES[256] = {[0 ... 3] = 0,
                            1397771552,
                            1111575634,
                            1111708754,
                            1111708192,
                            1397967648,
                            1230195488,
                            1398162208,
                            [11 ... 15] = 0,
                            1280332320,
                            1280201248,
                            1280594464,
                            1279480352,
                            1314005024,
                            1129075232,
                            1330782240,
                            1481777184,
                            1280450592,
                            1129455648,
                            1095901216,
                            1397891104,
                            1297227808,
                            1146232864,
                            1095520800,
                            1397510688,
                            1280328786,
                            1280197714,
                            1280590930,
                            1279476818,
                            1212437024,
                            1280459858,
                            1297633824,
                            1297630290,
                            1279545888,
                            1128550944,
                            1094996512,
                            1396986400,
                            1296323104,
                            1145328160,
                            1096241696,
                            1398231584,
                            1280329042,
                            1280197970,
                            1280591186,
                            1279477074,
                            1212502560,
                            1280460114,
                            1096307232,
                            1398297120,
                            1279611424,
                            1128616480,
                            1095062048,
                            1397051936,
                            1296388640,
                            1145393696,
                            1096110624,
                            1398100512,
                            1398032416,
                            1279336480,
                            1398031136,
                            1229135904,
                            1163403296,
                            1111575584,
                            1111708704,
                            1111695392,
                            1279795232,
                            1128800288,
                            1095245856,
                            1397235744,
                            1296572448,
                            0,
                            1129727008,
                            1129726496,
                            1398022176,
                            [81 ... 83] = 0,
                            1310728224,
                            1129062432,
                            1327505440,
                            1478500384,
                            1277173792,
                            1126178848,
                            1092624416,
                            1394614304,
                            1293951008,
                            1142956064,
                            1095508000,
                            1397497888,
                            1398031392,
                            [97 ... 102] = 0,
                            1297630240,
                            1279533088,
                            1128538144,
                            1094983712,
                            1396973600,
                            1296310304,
                            1145315360,
                            1096228896,
                            1398218784,
                            1398031648,
                            [113 ... 119] = 0,
                            1279598624,
                            1128603680,
                            1095049248,
                            1397039136,
                            1296375840,
                            1145380896,
                            1096097824,
                            1398087712,
                            5460813,
                            0,
                            1280332631,
                            1145651527,
                            1465009184,
                            1380205600,
                            1113081888,
                            1113082949,
                            1397902368,
                            1397509152,
                            1397899552,
                            1397506336,
                            1397900364,
                            1397507148,
                            1397900353,
                            1397507137,
                            1398033696,
                            1414340640,
                            1297500448,
                            1414733856,
                            1313415200,
                            1129072928,
                            1330192416,
                            1481187360,
                            1280122912,
                            [153 ... 155] = 0,
                            1397313312,
                            1414090528,
                            1212763936,
                            1413695520,
                            [160 ... 208] = 0,
                            1297501728,
                            1297498912,
                            1297504800,
                            1313021984,
                            1129071392,
                            1329799200,
                            1480794144,
                            [216 ... 219] = 0,
                            1414668320,
                            1414681632,
                            1162092576,
                            1162104139,
                            [224 ... 240] = 0,
                            1297501984,
                            1346454347,
                            1431195723,
                            [244 ... 247] = 0,
                            1514229792,
                            1129324576,
                            1095770144,
                            1397760032,
                            1297096736,
                            1146101792,
                            0,
                            0};

  //     5+      0(4),
  //     6+ M'SPM ',M'BALR',M'BCTR',M'BCR ',M'SSK ',M'ISK ',M'SVC ',     0(5),
  //     7+ M'LPR ',
  //     8+ M'LNR ',M'LTR ',M'LCR ',M'NR  ',M'CLR ',M'OR  ',M'XR  ',M'LR  ',
  //     9+ M'CR  ',
  //    10+ M'AR  ',M'SR  ',M'MR  ',M'DR  ',M'ALR ',M'SLR ',M'LPDR',M'LNDR',
  //    11+ M'LTDR',
  //    12+ M'LCDR',M'HDR ',M'LRDR',M'MXR ',M'MXDR',M'LDR ',M'CDR ',M'ADR ',M'SDR ',
  //    13+ M'MDR ',
  //    14+ M'DDR ',M'AWR ',M'SWR ',M'LPER',M'LNER',M'LTER',M'LCER',M'HER ',M'LRER',
  //    15+ M'AXR ',
  //    16+ M'SXR ',M'LER ',M'CER ',M'AER ',M'SER ',M'MER ',M'DER ',M'AUR ',M'SUR ',
  //    17+ M'STH ',
  //    18+ M'LA  ',M'STC ',M'IC  ',M'EX  ',M'BAL ',M'BCT ',M'BC  ',M'LH  ',M'CH  ',
  //    19+ M'AH  ',
  //    20+ M'SH  ',M'MH  ',     0,
  //    21+ M'CVD ',
  //    22+ M'CVB ',M'ST  ',     0(3),M'N   ',M'CL  ',M'O   ',
  //    23+ M'X   ',
  //    24+ M'L   ',M'C   ',M'A   ',M'S   ',M'M   ',M'D   ',M'AL  ',M'SL  ',M'STD ',
  //    25+      0(6),
  //    26+ M'MXD ',
  //    27+ M'LD  ',M'CD  ',M'AD  ',M'SD  ',M'MD  ',M'DD  ',M'AW  ',M'SW  ',
  //    28+ M'STE ',
  //    29+      0(7),
  //    30+ M'LE  ',
  //    31+ M'CE  ',M'AE  ',M'SE  ',M'ME  ',M'DE  ',M'AU  ',M'SU  ',
  //    32+ M'SSM',
  //    33+      0,M'LPSW',M'DIAG',M'WRD ',M'RDD ',M'BXH ',M'BXLE',M'SRL ',M'SLL ',
  //    34+ M'SRA ',
  //    35+ M'SLA ',M'SRDL',M'SLDL',M'SRDA',M'SLDA',M'STM ',M'TM  ',M'MVI ',
  //    36+ M'TS  ',
  //    37+ M'NI  ',M'CLI ',M'OI  ',M'XI  ',M'LM  ',     0(3),
  //    38+ M'SIO ',
  //    39+ M'TIO ',M'HIO ',
  //    40+ M'TCH ',
  //    41+      0(49),
  //    42+ M'MVN ',
  //    43+ M'MVC ',M'MVZ ',M'NC  ',M'CLC ',M'OC  ',M'XC  ',     0(4),
  //    44+ M'TR  ',
  //    45+ M'TRT ',M'ED  ',M'EDMK',     0(17),M'MVO ',M'PACK',M'UNPK',     0(4),
  //    46+ M'ZAP ',
  //    47+ M'CP  ',M'AP  ',M'SP  ',M'MP  ',M'DP  ',     0,     0
  //    48  %INTEGER J, K, L, M

  int J;
  int K;
  int L;
  int M;

  //    49  %INTEGER T

  int T;
  auto void HEX(int N);

  auto void HEX8(int N);

  auto void PUT(int SP, int SYMS);

  //    50  %ROUTINESPEC HEX(%INTEGER N)
  //    51  %ROUTINESPEC HEX8(%INTEGER N)
  //    52  %ROUTINESPEC PUT(%INTEGER S, C)
  //    53
  //    54  !printstring("RECODE(X'"); HEX8(S)
  //    55  !printstring("', X'"); HEX8(TO)
  //    56  !printstring("', X'"); HEX8(BASE)
  //    57  !printstring("')".snl)
  //    58            S = S&(\1)

  S = S & (~1);

  //    59  BASE = BASE-S

  BASE = BASE - S;

  //    60  L1:        NEWLINE

U_1000:;
  _imp_NEWLINE();

  //    61            NEWLINE %AND %RETURN %IF S >= TO

  if (S < TO) goto L_0001;
  _imp_NEWLINE();
  return;
L_0001:;

//    62  PRINT STRING("C ")

  _imp_PRINTSTRING(_imp_str_literal("C "));

  //    63            HEX8(BASE+S)

  HEX8(BASE + S);

  //    64            SPACES(4)

  _imp_SPACES(4);

  //    65            J = SHORTINTEGER(S);  S = S+2

  J = *_imp_SHORTINTEGER(S);
  S = S + 2;

  //    66            M = J>>8&255

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

  //    67            T = OPCODES(M)

  T = OPCODES[M];

  //    68            HEX(J)

  HEX(J);

  //    69            -> L1 %IF T = 0

  if (T != 0) goto L_0002;
  goto U_1000;
L_0002:;

//    70            %IF M>>6 = 0 %THEN %START;    ! RR

  if ((unsigned int)M >> 6 != 0) goto L_0003;

    //    71               PUT(12,T)

  PUT(12, T);

  //    72               WRITE(J>>4&15,4)

  _imp_WRITE((unsigned int)J >> 4 & 15, 4);

  //    73               print symbol(',')

  _imp_PRINTSYMBOL(44);

  //    74               WRITE(J&15,2)

  _imp_WRITE(J & 15, 2);

  //    75               -> L1

  goto U_1000;

  //    76            %FINISH

L_0003:;

//    77            K = SHORTINTEGER(S);  S = S+2

  K = *_imp_SHORTINTEGER(S);
  S = S + 2;

  //    78            HEX(K)

  HEX(K);

  //    79            %IF M>>6 = 1 %THEN %START;    !  RX

  if ((unsigned int)M >> 6 != 1) goto L_0004;

    //    80               PUT(8,T)

  PUT(8, T);

  //    81               WRITE(J>>4&15,4);  print symbol(',')

  _imp_WRITE((unsigned int)J >> 4 & 15, 4);
  _imp_PRINTSYMBOL(44);

  //    82               WRITE(K&X'FFF',4);  print symbol('(')

  _imp_WRITE(K & 4095, 4);
  _imp_PRINTSYMBOL(40);

  //    83               WRITE(J&15,2);  print symbol(',')

  _imp_WRITE(J & 15, 2);
  _imp_PRINTSYMBOL(44);

  //    84  L3:           WRITE(K>>12&15,2);  print symbol(')')

U_1001:;
  _imp_WRITE((unsigned int)K >> 12 & 15, 2);
  _imp_PRINTSYMBOL(41);

  //    85               -> L1

  goto U_1000;

  //    86            %FINISH

L_0004:;

//    87            %IF M&X'F8' = X'88' %THEN %START

  if (M & 248 != 136) goto L_0005;

    //    88               PUT(8,T)

  PUT(8, T);

  //    89               WRITE(J>>4&15,4);  print symbol(',')

  _imp_WRITE((unsigned int)J >> 4 & 15, 4);
  _imp_PRINTSYMBOL(44);

  //    90  L2:           WRITE(K&X'FFF',4);  print symbol('(')

U_1002:;
  _imp_WRITE(K & 4095, 4);
  _imp_PRINTSYMBOL(40);

  //    91               -> L3

  goto U_1001;

  //    92            %FINISH

L_0005:;

//    93            %IF M > 192 %THEN %START

  if (M <= 192) goto L_0006;

    //    94               L = SHORTINTEGER(S);  S = S+2

  L = *_imp_SHORTINTEGER(S);
  S = S + 2;

  //    95               HEX(L)

  HEX(L);

  //    96               PUT(4,T)

  PUT(4, T);

  //    97               WRITE(K&X'FFF',5);  print symbol('(')

  _imp_WRITE(K & 4095, 5);
  _imp_PRINTSYMBOL(40);

  //    98               %IF M>>4&15 # 15 %THEN WRITE(J&255+1,2) %C

  if ((unsigned int)M >> 4 & 15 == 15) goto L_0007;
  _imp_WRITE((J & 255) + 1, 2);
  goto L_0008;
L_0007:;
  _imp_WRITE((unsigned int)J >> 4 & 15, 2);
L_0008:;

//    99+                 %ELSE WRITE(J>>4&15,2)
//   100               print symbol(',')

  _imp_PRINTSYMBOL(44);

  //   101               WRITE(K>>12&15,2);  print symbol(')');  print symbol(',')

  _imp_WRITE((unsigned int)K >> 12 & 15, 2);
  _imp_PRINTSYMBOL(41);
  _imp_PRINTSYMBOL(44);

  //   102               WRITE(L&X'FFF',4);  print symbol('(')

  _imp_WRITE(L & 4095, 4);
  _imp_PRINTSYMBOL(40);

  //   103               %IF M>>4&15 = 15 %THEN %START

  if ((unsigned int)M >> 4 & 15 != 15) goto L_0009;

    //   104                  WRITE(J&15,2);  print symbol(',')

  _imp_WRITE(J & 15, 2);
  _imp_PRINTSYMBOL(44);

  //   105               %FINISH

L_0009:;

//   106               WRITE(L>>12&15,2);  print symbol(')')

  _imp_WRITE((unsigned int)L >> 12 & 15, 2);
  _imp_PRINTSYMBOL(41);

  //   107               -> L1

  goto U_1000;

  //   108            %FINISH

L_0006:;

//   109            %IF M = 134 %OR M = 135 %OR M = 144 %OR M = 152 %THEN %START

  if (M == 134) goto L_000A;
  if (M == 135) goto L_000A;
  if (M == 144) goto L_000A;
  if (M != 152) goto L_000B;
L_000A:;

//   110               PUT(8,T)

  PUT(8, T);

  //   111               WRITE(J>>4&15,4);  print symbol(',')

  _imp_WRITE((unsigned int)J >> 4 & 15, 4);
  _imp_PRINTSYMBOL(44);

  //   112               WRITE(J&15,2);  print symbol(',')

  _imp_WRITE(J & 15, 2);
  _imp_PRINTSYMBOL(44);

  //   113               -> L2

  goto U_1002;

  //   114            %FINISH

L_000B:;

//   115            PUT(8,T)

  PUT(8, T);

  //   116            WRITE(K&X'FFF',5);  print symbol('(')

  _imp_WRITE(K & 4095, 5);
  _imp_PRINTSYMBOL(40);

  //   117            WRITE(K>>12&15,2);  print symbol(')')

  _imp_WRITE((unsigned int)K >> 12 & 15, 2);
  _imp_PRINTSYMBOL(41);

  //   118            print symbol(',')

  _imp_PRINTSYMBOL(44);

  //   119            WRITE(J&255,2)

  _imp_WRITE(J & 255, 2);

  //   120            -> L1

  goto U_1000;

  //   121
  //   122  %ROUTINE HEX(%INTEGER N)

  void HEX(int N) {
    //   123  %CONSTBYTEINTEGERARRAY XSYM(0 : 15) = %C

    const unsigned char XSYM[16] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70};

    //   124+    '0', '1', '2', '3',
    //   125+    '4', '5', '6', '7',
    //   126+    '8', '9', 'A', 'B',
    //   127+    'C', 'D', 'E', 'F'
    //   128  %INTEGER J, S

    int J;
    int S;

    //   129            %CYCLE J = 1,1,4; !8

    // %for J = 1, 1, 4 %cycle
    {
      J = 0;
    L_000C:
      if (J == 4) goto L_000D;
      J += 1;

      //   130               S = (N>>12)&15; !S = N>>28

      S = (unsigned int)N >> 12 & 15;

      //   131               N = N<<4

      N = N << 4;

      //   132               PRINTSYMBOL(XSYM(S))

      _imp_PRINTSYMBOL(XSYM[S]);

      //   133            %REPEAT

      goto L_000C;
    }

  L_000D:;

  //   134  %END

    return;
  } /* end of HEX */

  //   135
  //   136  %ROUTINE HEX8(%INTEGER N)

  void HEX8(int N) {
    //   137  %CONSTBYTEINTEGERARRAY XSYM(0 : 15) = %C

    const unsigned char XSYM[16] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70};

    //   138+    '0', '1', '2', '3',
    //   139+    '4', '5', '6', '7',
    //   140+    '8', '9', 'A', 'B',
    //   141+    'C', 'D', 'E', 'F'
    //   142  %INTEGER J, S

    int J;
    int S;

    //   143            %CYCLE J = 1,1,8

    // %for J = 1, 1, 8 %cycle
    {
      J = 0;
    L_000F:
      if (J == 8) goto L_0010;
      J += 1;

      //   144               S = (N>>28)&15

      S = (unsigned int)N >> 28 & 15;

      //   145               N = N<<4

      N = N << 4;

      //   146               PRINTSYMBOL(XSYM(S))

      _imp_PRINTSYMBOL(XSYM[S]);

      //   147            %REPEAT

      goto L_000F;
    }

  L_0010:;

  //   148  %END

    return;
  } /* end of HEX8 */

  //   149
  //   150  %ROUTINE PUT(%INTEGER SP, SYMS)

  void PUT(int SP, int SYMS) {
    //   151  %INTEGER I

    int I;

    //   152           SPACES(SP)

    _imp_SPACES(SP);

    //   153           %CYCLE I = 1,1,4

    // %for I = 1, 1, 4 %cycle
    {
      I = 0;
    L_0011:
      if (I == 4) goto L_0012;
      I += 1;

      //   154              PRINT SYMBOL(SYMS>>24&127); SYMS = SYMS << 8

      _imp_PRINTSYMBOL((unsigned int)SYMS >> 24 & 127);
      SYMS = SYMS << 8;

      //   155           %REPEAT

      goto L_0011;
    }

  L_0012:;

  //   156  %END

    return;
  } /* end of PUT */

  //   157
  //   158  %END

  return;
} /* end of RECODE */

//   159
//   160  %ENDOFFILE