#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};
struct _imp_dv OPCODES_dv = {OPCODES, sizeof(int) /*, dims, <bounds> */};
// 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};
struct _imp_dv XSYM_dv = {XSYM, sizeof(unsigned char) /*, dims, <bounds> */};
// 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};
struct _imp_dv XSYM_dv = {XSYM, sizeof(unsigned char) /*, dims, <bounds> */};
// 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