// cc -o allimpc1 -g -Wno-multichar allimpc1.c -I ../new-parser/imps ../new-parser/imps/perms.c -lm #include <perms.h> #undef Unass #undef Printsymbol #define Printsymbol(C) printf("%c", (C)&128 ? (((C)&127)-'A'+'a') : (C)) void Recode(int Start, int Finish, int Ca) { } int Com(int N) { if (N == 2) { // address of free stack? } if (N == 24) { //List = 2; //Linenos = 4; //Unass = 16; //Checks = 32; //Printmap = 0x8000; //Diags1 = 64; return 0x8000 | 2 | 4 | 16;// | 32; | 64; } return 0; } void Setcom(int I, int J) { } void Lput(int A, int B, int C, int D) { if (Com(24)&64) fprintf(stderr, "LPUT(%d,%d,%d,%08x);\n", A,B,C,D); } //%SYSTEMINTEGERFNSPEC COM(%INTEGER N) //%SYSTEMROUTINESPEC SET COM(%INTEGER I,J) //%SYSTEMROUTINESPEC IOCP(%INTEGER A,B) //%SYSTEMROUTINESPEC LPUT(%INTEGER A,B,C,D) int _imp_mainep(int _imp_argc, char **_imp_argv) { int I; int J; int K; int Ss; static unsigned char Clett[1+425 /*1:425*/] = {0, 1, 43, 1, 45, 1, 92, 1, 40, 1, 41, 1, 33, 1, 44, 2, 42, 42, 2, 33, 33, 1, 42, 2, 47, 47, 1, 47, 1, 38, 2, 62, 62, 2, 60, 60, 1, 46, 1, 63, 2, 201, 198, 6, 213, 206, 204, 197, 211, 211, 7, 201, 206, 212, 197, 199, 197, 210, 4, 210, 197, 193, 204, 4, 194, 217, 212, 197, 5, 211, 200, 207, 210, 212, 4, 204, 207, 206, 199, 6, 211, 212, 210, 201, 206, 199, 7, 210, 207, 213, 212, 201, 206, 197, 2, 198, 206, 3, 205, 193, 208, 4, 206, 193, 205, 197, 6, 210, 197, 195, 207, 210, 196, 4, 211, 212, 207, 208, 7, 195, 207, 205, 208, 201, 204, 197, 6, 201, 199, 206, 207, 210, 197, 2, 207, 206, 3, 207, 198, 198, 5, 193, 210, 210, 193, 217, 3, 193, 206, 196, 2, 207, 210, 2, 61, 61, 1, 61, 2, 60, 45, 2, 45, 62, 4, 211, 208, 197, 195, 6, 206, 207, 210, 205, 193, 204, 6, 214, 197, 195, 212, 207, 210, 1, 58, 2, 62, 61, 1, 62, 1, 35, 2, 60, 61, 1, 60, 2, 92, 61, 4, 197, 204, 211, 197, 1, 95, 6, 211, 217, 211, 212, 197, 205, 8, 197, 216, 212, 197, 210, 206, 193, 204, 5, 195, 204, 193, 201, 205, 7, 210, 197, 204, 197, 193, 211, 197, 1, 80, 3, 80, 85, 84, 1, 64, 9, 208, 210, 201, 206, 212, 212, 197, 216, 212, 6, 210, 197, 212, 213, 210, 206, 7, 210, 197, 211, 213, 204, 212, 61, 7, 205, 207, 206, 201, 212, 207, 210, 5, 211, 212, 193, 210, 212, 7, 209, 213, 197, 210, 201, 197, 211, 5, 195, 217, 195, 204, 197, 6, 210, 197, 208, 197, 193, 212, 4, 212, 200, 197, 206, 3, 197, 206, 196, 7, 195, 207, 205, 205, 197, 206, 212, 5, 210, 197, 193, 204, 211, 5, 194, 197, 199, 201, 206, 2, 207, 198, 7, 208, 210, 207, 199, 210, 193, 205, 6, 211, 215, 201, 212, 195, 200, 8, 210, 197, 199, 201, 211, 212, 197, 210, 3, 207, 215, 206, 5, 205, 195, 207, 196, 197, 5, 198, 193, 213, 204, 212, 4, 198, 201, 204, 197, 6, 196, 197, 198, 201, 206, 197, 1, 210, 7, 211, 208, 197, 195, 201, 193, 204, 4, 204, 201, 211, 212, 7, 195, 207, 206, 212, 210, 207, 204, 6, 198, 201, 206, 201, 211, 200, 6, 198, 207, 210, 205, 193, 212}; static short Symbol[1300+849 /*1300:2148*/] = {[ 0 ... 1299 ] = 0, 1309, 1303, 1, 1305, 3, 1307, 5, 1309, 1000, 1316, 1312, 1, 1314, 3, 1316, 1000, 1335, 1321, 1001, 1342, 1706, 1323, 1003, 1329, 7, 1300, 1316, 1335, 9, 1335, 11, 1300, 1316, 1335, 11, 1342, 1340, 1361, 1316, 1335, 1342, 1000, 1352, 1350, 7, 1300, 1316, 1335, 1352, 9, 1352, 1000, 1361, 1359, 13, 1300, 1316, 1335, 1352, 1361, 1000, 1388, 1364, 15, 1366, 1, 1368, 3, 1370, 18, 1372, 11, 1374, 21, 1376, 23, 1378, 26, 1380, 28, 1382, 30, 1384, 33, 1386, 36, 1388, 1000, 1393, 1391, 38, 1393, 1000, 1398, 1396, 13, 1398, 1000, 1403, 1401, 40, 1403, 43, 1420, 1406, 50, 1408, 58, 1411, 63, 50, 1414, 68, 50, 1417, 74, 58, 1420, 79, 1883, 1426, 1423, 86, 1426, 1403, 1426, 1431, 1429, 94, 1431, 97, 1445, 1435, 1420, 1467, 1438, 1403, 1472, 1441, 1462, 101, 1445, 106, 1462, 101, 1450, 1448, 1005, 1450, 1001, 1457, 1453, 113, 1455, 118, 1457, 126, 1462, 1460, 133, 1462, 136, 1467, 1465, 140, 1467, 1000, 1472, 1470, 101, 1472, 1000, 1484, 1477, 101, 140, 101, 1480, 140, 101, 1482, 101, 1484, 1000, 1493, 1491, 7, 1431, 1009, 1493, 9, 1493, 1000, 1501, 1499, 1393, 1431, 1009, 1493, 1501, 1000, 1520, 1513, 1010, 1300, 1316, 1335, 1669, 1300, 1316, 1335, 1520, 1011, 1520, 7, 1010, 1501, 1528, 1011, 9, 1528, 1526, 1669, 1300, 1316, 1335, 1528, 1000, 1539, 1533, 146, 1501, 1539, 1537, 150, 1501, 1546, 1539, 1000, 1546, 1544, 146, 1501, 1539, 1546, 1000, 1553, 1551, 150, 1501, 1546, 1553, 1000, 1562, 1560, 1562, 1300, 1316, 1335, 1388, 1562, 1000, 1571, 1565, 153, 1567, 156, 1569, 158, 1571, 161, 1576, 1574, 164, 1576, 1000, 1581, 1579, 74, 1581, 169, 1588, 1586, 13, 1714, 1581, 1588, 1000, 1599, 1592, 1472, 1009, 1596, 1467, 140, 1599, 1599, 176, 1613, 1607, 1607, 1009, 7, 1714, 1581, 9, 1607, 1613, 1611, 13, 1599, 1613, 1000, 1618, 1618, 1009, 1635, 1618, 1624, 1622, 13, 1613, 1624, 1000, 1635, 1629, 1001, 1723, 1006, 1635, 140, 1001, 1635, 1890, 1004, 1644, 1644, 7, 1309, 1003, 183, 1309, 1003, 9, 1651, 1649, 13, 1005, 1644, 1651, 1000, 1661, 1659, 13, 1005, 1644, 161, 1445, 1651, 1661, 1000, 1669, 1667, 13, 1009, 1635, 1661, 1669, 1000, 1686, 1672, 156, 1674, 185, 1676, 188, 1678, 190, 1680, 192, 1682, 195, 1684, 197, 1686, 161, 1694, 1689, 1006, 1694, 1398, 1501, 1528, 1006, 1700, 1698, 200, 1902, 1700, 1000, 1706, 1704, 205, 1001, 1706, 1000, 1714, 1712, 205, 1001, 1342, 1706, 1714, 1000, 1723, 1723, 1300, 1316, 1335, 183, 1300, 1316, 1335, 1730, 1728, 156, 1300, 1003, 1730, 1000, 1737, 1733, 207, 1735, 214, 1737, 1000, 1742, 1740, 223, 1742, 229, 1747, 1745, 140, 1747, 106, 1757, 1755, 1393, 1403, 1467, 140, 1599, 1747, 1757, 1000, 1764, 1762, 1431, 1009, 1493, 1764, 1000, 1772, 1768, 1001, 1857, 1772, 195, 1445, 188, 1785, 1780, 1005, 7, 1005, 13, 1005, 9, 1785, 1764, 7, 1005, 9, 1792, 1789, 1764, 1883, 1792, 1005, 1792, 1805, 1799, 7, 1005, 13, 1005, 9, 1803, 7, 1005, 9, 1805, 1000, 1811, 1809, 13, 1003, 1811, 1000, 1817, 1814, 1764, 1817, 1005, 1883, 1857, 1823, 1012, 1005, 13, 1005, 1828, 1013, 1005, 13, 1785, 1835, 1014, 1005, 13, 1005, 13, 1811, 1839, 1015, 1811, 1805, 1844, 1016, 1005, 13, 1811, 1849, 1017, 1772, 13, 1811, 1854, 1018, 1772, 13, 1772, 1857, 1019, 1005, 1863, 1861, 1, 1005, 1863, 1000, 1883, 1872, 21, 1005, 13, 1895, 1001, 1342, 1706, 1876, 161, 237, 1005, 1879, 1002, 1817, 1883, 239, 205, 1003, 1890, 1888, 7, 1005, 9, 1890, 1000, 1895, 1893, 156, 1895, 1000, 1902, 1898, 243, 1900, 156, 1902, 1000, 1943, 1910, 1010, 1001, 1342, 1706, 1011, 1553, 1918, 161, 1001, 7, 1300, 1316, 1335, 9, 1921, 161, 1445, 1924, 245, 1008, 1926, 255, 1931, 262, 1300, 1316, 1335, 1933, 113, 1936, 270, 113, 1938, 278, 1940, 270, 1943, 284, 1457, 2149, 1949, 1010, 1902, 1011, 1686, 1967, 292, 1001, 1342, 1706, 156, 1300, 1316, 1335, 13, 1300, 1316, 1335, 13, 1300, 1316, 1335, 1006, 1970, 298, 1006, 1973, 1445, 183, 1985, 1398, 1010, 1501, 1528, 305, 1011, 1010, 1902, 1011, 1694, 1006, 1988, 11, 1007, 1992, 1403, 1588, 1006, 1995, 310, 1006, 2004, 1010, 1730, 1420, 1011, 1571, 1001, 1484, 1006, 2007, 314, 1007, 2011, 322, 1576, 1006, 2014, 328, 1006, 2019, 310, 334, 337, 1006, 2026, 1001, 7, 1309, 1003, 9, 183, 2032, 345, 1009, 1635, 1661, 1006, 2036, 1450, 284, 1006, 2040, 352, 1001, 1006, 2044, 361, 1403, 1624, 2050, 1737, 1742, 352, 1001, 1006, 2053, 365, 1006, 2057, 68, 86, 1006, 2061, 21, 1863, 1006, 2069, 371, 1005, 1644, 161, 1445, 1651, 1006, 2074, 310, 334, 377, 1006, 2079, 310, 334, 365, 1006, 2084, 382, 118, 389, 1006, 2090, 164, 1001, 1706, 1484, 1006, 2095, 391, 101, 1001, 1006, 2098, 399, 1006, 2103, 310, 334, 399, 1006, 2107, 404, 1003, 1006, 2111, 412, 1694, 1006, 2120, 106, 419, 1001, 7, 1757, 1747, 9, 1006, 2129, 106, 1010, 1588, 1011, 7, 1001, 9, 1006, 2136, 1010, 1420, 101, 1011, 1009, 1006, 2147, 106, 164, 1010, 1001, 1700, 1011, 7, 1001, 9, 1006, 2149, 1006}; Ss = 1943; static unsigned char Opc[121 /*0:120*/] = { 0, 8, 9, 0x10, 0x11, 0x12, 0x13, 0x20, 0x21, 0x22, 0x23, 0x30, 0x31, 0x32, 0x33, 0x24, 0x34, 0, 0x45, 0x46, 0x47, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0, 0x70, 0x60, 0x50, 0x4E, 0x4F, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x44, 0x43, 0x42, 0x41, 0x40, 0, 0x90, 0x98, 0x86, 0x87, 0, 0x91, 0x92, 0x94, 0x95, 0x96, 0x97, 0x9C, 0x9E, 0x9D, 0x9F, 0x82, 0x84, 0x85, 0, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0, 0xD0, 0xD1, 0xD2, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xDC, 0xDd, 0xDE, 0xDF, 0xD3, 0, 0xF1, 0xF2, 0xF3, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0, 10, 4, 0x80}; static int Nem[121 /*0:120*/] = { 'CNOP', 'ISK', 'SSK', 'LP', 'LN', 'LT', 'LC', 'LPD', 'LND', 'LTD', 'LCD', 'LPE', 'LNE', 'LTE', 'LCE', 'HD', 'HE', 0, 'BAL', 'BCT', 'BC', 'N', 'CL', 'O', 'X', 'L', 'C', 'A', 'S', 'M', 'D', 'AL', 'SL', 'LD', 'CD', 'AD', 'SD', 'MD', 'DD', 'AW', 'SW', 'LE', 'CE', 'AE', 'SE', 'ME', 'DE', 'AU', 'SU', 0, 'STE', 'STD', 'ST', 'CVD', 'CVB', 'MH', 'SH', 'AH', 'CH', 'LH', 'EX', 'IC', 'STC', 'LA', 'STH', 0, 'STM', 'LM', 'BXH', 'BXLE', 0, 'TM', 'MVI', 'NI', 'CLI', 'OI', 'XI', 'SDV', 'HDV', 'TDV', 'CKC', 'PC', 'WRD', 'RDD', 0, 'SRL', 'SLL', 'SRA', 'SLA', 'SRDL', 'SLDL', 'SRDA', 'SLDA', 0, 'SSP', 'MVN', 'MVC', 'NC', 'CLC', 'OC', 'XC', 'LSP', 'TR', 'TRT', 'ED', 'EDMK', 'MVZ', 0, 'MVO', 'PACK', 'UNPK', 'ZAP', 'CP', 'AP', 'SP', 'MP', 'DP', 0, 'SVC', 'SPM', 'IDL'}; static short Clods[89 /*0:88*/] = { 4, 0x50CD, 0x001C, 0x58CD, 0x5C, 4, 0x50FB, 0x003C, 0x45FC, 0x4C, 6, 0x5820, 0x2000, 0x0620, 0x8920, 24, 0x1602, 0, 8, 0x50B0, 0, 0x4AB0, 0x4002, 0x41BB, 0x7, 0x54BD, 84, 4, 0x581D, 36, 0x9200, 0x1001, 11, 0x0510, 0x2826, 0x6E6D, 0x48, 0x6A6D, 0x28, 0x2B26, 0x47B0, 0x1014, 0x6A2D, 0x30, 4, 0x9003, 0xB000, 0x41BB, 0x10, 5, 0x4100, 0, 0x58EC, 186, 0x5FE, 5, 0x904E, 0xB010, 0x98CE, 0xD000, 0x5FE, 7, 0x904E, 0xB010, 0x98CF, 0, 0x9859, 0xF014, 0x5FE, 5, 0x4100, 255, 0x8900, 0x18, 0x1610, 6, 0x4100, 4, 0x59BD, 0x44, 0x4720, 0xC054, 6, 0x6000, 0xB040, 0x4100, 12, 0x5000, 0xB048}; static unsigned char Tsname[51 /*0:50*/] = {[0 ... 7] = 0, 1, [9 ... 13] = 0, 1, 26, 1, 1, 26, [19 ... 20] = 0, 2, 1, [23 ... 30] = 26, 3, 9, 17, [34 ... 35] = 26, 1, 0, 1, 26, [40 ... 41] = 0, 5, [43 ... 50] = 0}; Newlines(3); Spaces(30); printf("%s", "E.R.C.C. IMP(SYS1) COMPILER "); printf("%s", " RELEASE 5 ALL-IMP VERSION"); printf("%s", " DATED 1/5/70"); Newlines(3); static unsigned char Bytes[4 /*0:3*/] = {4, 1, 2, 8}; static unsigned char Precedence[1+12 /*1:12*/] = {0, 0, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5}; static unsigned char Typeflag[1+6 /*1:6*/] = {0, 1, 2, 0b1001, 0b10001, 0b11010, 5}; static int Mask1 = 0x0F0F0F0F; static int Mask2 = 0x0F0F0F0F; static short Maxlevels = 11; static int Coder = 12; static int Link = 15; static int Wspr = 11; static int Gla = 13; short Ccsize; short Arsize; short Dsize; short Nrouts; auto void Sizes(void); int Asl; int Nnames; int Cabuf; int Ppcurr; int Qpreal; int Oldline; int Line; int Length; int Lengthp; int N0; int Num; int Snum; int Rlevel; int Nmax; int Ownlink; int Constptr; int Plabel; int Level; int Ca; int Marker1; int Marker2; int Labset; int R13; int Rp13; int Sigfigs; unsigned char Aflag; unsigned char Fflag; unsigned char Checks; unsigned char Sbflag; unsigned char Faulty; unsigned char Mone; unsigned char Hit; unsigned char Qu; unsigned char Perm; unsigned char Mcswitch; unsigned char List; unsigned char Alllong; unsigned char Linenos; unsigned char Diags1; unsigned char Diags2; unsigned char Checksp; unsigned char Ctype; unsigned char Dcomp; unsigned char Compiler; unsigned char Cprmode; unsigned char Unass; unsigned char Printmap; double Cvalue; double Imax; int Mask; int Rbase; int Sflabel; int Next; int N; int Nr; int Item; int Strinst; int P; int Q; int R; int S; int T; int U; int V; int Nest; int Fname; int Xreflink; int Ldptr; short Neps; short Eplink; int Sstl; int Qmax; int Stmts; int Register[16 /*0:15*/]; int St[1301 /*0:1300*/]; int Set[Maxlevels + 1]; int Codebase[Maxlevels + 1]; int Freg[Maxlevels + 1]; int Ral[Maxlevels + 1]; short Cycle[Maxlevels + 1]; short Jump[Maxlevels + 1]; short Name[Maxlevels + 1]; short Label[Maxlevels + 1]; short Flag[Maxlevels + 1]; short Sbr[Maxlevels + 1]; short Wsp[Maxlevels + 1]; short L[Maxlevels + 1]; short M[Maxlevels + 1]; short Lwsp[Maxlevels + 1]; short Mdarr[Maxlevels + 1]; short Rnext[Maxlevels + 1]; short Nmdecs[Maxlevels + 1]; short Strwsp[Maxlevels + 1]; short Code[193 /*0:192*/]; short Pagenos[51 /*0:50*/]; int Uvarreg[5+4 /*5:8*/]; Sizes(); unsigned char Cc[Ccsize + 1]; unsigned char Aslist[Asl + 1]; unsigned char Lett[(Dsize + 20) + 1]; short Ra[Nrouts + 1]; short A[Arsize - -2 + 1]; short Word[Nnames + 1]; short Tags[Nnames + 1]; //extern int Com(int N); //extern void Setcom(int I, int J); //extern void Iocp(int A, int B); auto void Cnop(int I, int J); auto void Pconst(int X); auto void Psi(int Opcode, int J, int Base, int Disp); auto void Pss(int Opcode, int N, int Base, int Disp, int P, int Q); auto void Prx(int Opcode, int R1, int R2, int Base, int Disp); auto void Paclod(int Ptr, int At, int Value); auto void Pclod(int Ptr); auto void Plant(int Value); auto void Prr(int Opcode, int R1, int R2); //extern void Lput(int A, int B, int C, int D); auto void Plug(int J, int K); auto void Prhex(int Value, int Places); auto void Initialise(void); auto void Psym(int X); auto void Compare(void); auto void Pname(void); auto void Const(unsigned char Mode); auto void Constlist(void); auto void Texttext(void); auto void XFromar8(int Ptr, double *Value); #define Fromar8(Ptr, Value) XFromar8(Ptr, &Value) auto void XFromar4(int Ptr, int *Value); #define Fromar4(Ptr, Value) XFromar4(Ptr, &Value) auto void Toar8(int Ptr, double Value); auto void Toar4(int Ptr, int Value); auto void Css(int P); auto void Fault(unsigned char N); auto void Finalise(void); auto void Printname(int N); //void Recode(int Start, int Finish, int Ca); auto void Readline(unsigned char N); if (_imp_on_event(9, 18)) { if (_imp_caught_on_event(EVENT.EVENT, 9)) goto Inend; if (_imp_caught_on_event(EVENT.EVENT, 18)) goto Subschar; } Initialise(); Lput(0, 1, 1, Addr(Lett[1])); L__8: Readline(0); Q = 1; L__5: R = 1; P = Ss; Oldline = Line; Compare(); if (R > Arsize) Fault(102); if (!Hit) goto L__6; Stmts++; Css(1); if (Dcomp != 0 && Ca > Cabuf) { Recode(Addr(Code[0]), Addr(Code[Ppcurr]), Cabuf); Newline(); Lput(1, Ca - Cabuf, Cabuf, Addr(Code[0])); Ppcurr = 0; Cabuf = Ca; } if (A[1] == 13) goto L__7; L__9: if (Q >= Length) goto L__8; goto L__5; L__6: Fault(100); goto L__9; L__7:; Finalise(); if (Compiler == 0 && Faulty == 0) Setcom(24, 0); exit(0); Inend: Fault(108); Subschar: Line++; Fault(48); Spaces(5); L__15: Readsymbol(&I); if (I == 10) goto L__8; Printsymbol(I); goto L__15; void Finalise(void) { if ((N0 & 1) != 1) N0++; Cnop(0, 8); St[0] = 0x20000; St[1] = 0x10100000; St[4] = -1; St[6] = 255; St[8] = Ownlink; St[12] = 0x41100000; St[14] = 0x41200000; St[18] = 0x4E000000; St[20] = -4; St[21] = -8; St[22] = Xreflink; Xreflink = 88; St[26] = 0x80000000; St[27] = 0x06492350; St[28] = 'ERMA'; St[29] = 0x904EB010; St[30] = 0x5A10D01C; St[31] = 0x07F10700; St[32] = 0x80808080; St[33] = 0x80808080; St[38] = 0x80000000; St[39] = 0x06532349; St[40] = 'OCP '; K = Ca; if (Ca != Cabuf) Lput(1, Ca - Cabuf, Cabuf, Addr(Code[0])); Lput(2, (N0 << 2) + 4, 0, Addr(St[0])); if (N0 > 1023) Fault(99); I = 0xE2E2E2E2; Lput(4, 4, Sstl, Addr(I)); if (Constptr & 1) Psym(0); if (Faulty) goto L__129; Newline(); Write(Stmts, 4); printf("%s", " STATEMENTS COMPILED SUCCESSFULLY"); L__120: printf("%s", "\nCODE OCCUPIES "); Write(K, 3); printf("%s", " BYTES GLAP "); Write(N0 << 2, 3); printf("%s", " +"); Write(Constptr << 2, 1); printf("%s", " BYTES DIAG TABLES "); Write(Sstl + 4, 4); printf("%s", " BYTES Total "); St[0] = Ca; St[1] = (N0 << 2) + 4; St[2] = ((Ldptr << 2) + 7) & (-8); St[3] = (Sstl + 11) & (-8); St[4] = Constptr << 2; St[5] = Ca + St[1] + St[2] + St[3] + St[4]; Write(St[5], 5); printf("%s", " Bytes"); Newline(); Newline(); Lput(7, 24, 0, Addr(St[0])); return; L__129: printf("%s", "\nPROGRAM CONTAINS "); Write(Faulty, 2); printf("%s", " FAULTS"); goto L__120; } void Readline(unsigned char N) { __label__ L__1; int Del; unsigned char Np; // ABOUT 30% CPU TIME OF COMPILATION IS SPENT IN THIS // ROUTINE AS WRITTEN. A HAND CODED VERSION USING I // ISO CARD NOT READ SYMBOL IS USED IN PRODUCTION VRSN Q = 1; Line++; Length = 0; Del = 0; L__1: if (N != 0 || Nextsymbol() != 10) goto Start; Skipsymbol(); goto L__1; Start: if (!List) goto L__2; Write(Line, 5); if (N) Printsymbol('\''); Spaces(4 * Level - N); L__2: Readsymbol(&I); if (List) Printsymbol(I); if (N) goto L__4; if (I != '%') goto L__3; Del = 128; goto L__2; L__3: if ('A' > I || I > 'Z') Del = 0; if (I == ' ') goto L__2; L__4: Length++; Cc[Length] = I | Del; if (I == '\'') N--; if (I != 10) goto L__2; if (Cc[Length - 1] != 'C' + 128) return; Length--; if (!List) goto L__2; Spaces(5); Printsymbol('C'); Spaces(4 * Level); goto L__2; } void Fault(unsigned char N) { __label__ L__99; int I; int J; int Qp; printf("%s", "\n*"); Write(Line, 4); I = 3; if (!List) I = 3 * Level; Spaces(I); Faulty++; if (N == 100) goto L__9; printf("%s", "Fault "); Write(N, 2); if (N < 100) goto L__2; printf("%s", " DISASTER "); _imp_monitor(0); exit(0); L__2: if (7 == N || N == 16) Printname(Fname); goto L__99; L__9: printf("%s", " SYNTAX "); if (Line != Oldline) goto L__11; Qp = Q; for (Q = Q; Q <= Length - 1; Q++) { Printsymbol(Cc[Q]); if (Cc[Q] == ';') goto L__10; } L__10: Q++; if (I + 20 + Q - Qp > 120) goto L__99; Newline(); Spaces(I + Qmax - Qp + 17); Printsymbol('!'); Newline(); goto L__99; L__11: printf("%s", "\n TEXT MODE FAILURE "); Write(Line - Oldline, 1); printf("%s", " LINES LOST "); Newline(); Q = Qmax; L__99: Newline(); } void Compare(void) { int Ra; int Rp; int Rq; int Rr; int Rs; int Marker; static int Bip_sw; static void *Bip[20 /*1000:1019*/] = { &&Bip_1000, &&Bip_1001, &&Bip_1002, &&Bip_1003, &&Bip_1004, &&Bip_1005, &&Bip_1006, &&Bip_1007, &&Bip_1008, &&Bip_1009, &&Bip_1010, &&Bip_1011, &&Bip_1012, &&Bip_1013, &&Bip_1014, &&Bip_1015, &&Bip_1016, &&Bip_1017, &&Bip_1018, &&Bip_1019, }; Rp = Symbol[P]; Rq = Q; Rr = R; A[R] = 1; P++; Ra = Symbol[P]; Rs = P; // ROUTINE REALLY STARTS HERE L__1: R++; Bip_1000: L__2:; Rs++; if (Rs == Ra) goto L__8; Item = Symbol[Rs]; if (Item >= 1300) goto L__4; if (Item >= 1000) goto L__6; for (J = 1; J <= Clett[Item]; J++) { if (Cc[Q] != Clett[J + Item]) goto L__3; Q++; } goto L__2; L__4:; P = Item; Compare(); if (Hit) goto L__2; L__3: if (Q > Qmax) Qmax = Q; Q = Rq; R = Rr; if (Ra == Rp) goto L__7; Rs = Ra; A[R] = A[R] + 1; Ra = Symbol[Ra]; goto L__1; L__8:; Hit = 1; return; L__7:; Hit = 0; return; L__6:; I = Cc[Q]; goto *Bip[Bip_sw = (Item)-1000]; Bip_1001:; Pname(); if (Hit == 1) goto L__1; goto L__3; Bip_1002:; if ('A' > I || I > 'Z') goto L__3; S = I; J = 1; L__200: Q++; I = Cc[Q]; if ('A' > I || I > 'Z') goto L__201; S = S << 8 | I; J++; goto L__200; L__201: if (I != '_' || J > 4) goto L__3; Q++; goto L__2; Bip_1003:; Const(0); if (!Hit) goto L__3; if (Ctype == 5) goto L__1; if (Ctype == 2) goto L__26; if (!(S >> 12)) goto L__22; A[R] = 1; Toar4(R + 1, S); R += 3; goto L__2; L__22: A[R] = 9; R++; A[R] = S; goto L__1; L__26: A[R] = 2; Toar8(R + 1, Cvalue); R += 5; goto L__2; Bip_1005:; if ('0' > I || I > '9') goto L__3; Const(2); A[R] = S; goto L__1; Bip_1004:; Constlist(); goto L__1; Bip_1006:; if (I == 10) goto L__2; if (I != ';') goto L__3; Q++; goto L__2; Bip_1007: L__30:; if (10 == I || I == ';') goto L__1; Q++; I = Cc[Q]; goto L__30; Bip_1008:; Texttext(); if (!Hit) goto L__3; goto L__1; Bip_1009:; U = R; V = 1; R++; Pname(); if (!Hit) goto L__3; L__90: if (Cc[Q] != ',') goto L__91; Q++; R++; I = Cc[Q]; Pname(); if (!Hit) goto L__92; V++; goto L__90; L__92: R--; Q--; L__91: A[U] = V; goto L__1; Bip_1010:; Marker = R; goto L__1; Bip_1011:; A[Marker] = R - Marker; goto L__2; Bip_1012:; if ((S & 255) == 'R') goto L__124; for (I = 0; I <= 2; I++) if (S == Nem[I]) goto L__120; goto L__3; L__120: A[R] = Opc[I] & 63; goto L__1; L__124: J = S >> 8; for (I = 2; I <= 48; I++) if (J == Nem[I]) goto L__120; goto L__3; Bip_1013:; for (I = 18; I <= 64; I++) if (S == Nem[I]) goto L__130; goto L__3; L__130: A[R] = Opc[I]; goto L__1; Bip_1014:; for (I = 66; I <= 69; I++) if (S == Nem[I]) goto L__130; goto L__3; Bip_1015:; for (I = 71; I <= 83; I++) if (S == Nem[I]) goto L__130; goto L__3; Bip_1016:; for (I = 85; I <= 92; I++) if (S == Nem[I]) goto L__130; goto L__3; Bip_1017:; for (I = 94; I <= 106; I++) if (S == Nem[I]) goto L__130; goto L__3; Bip_1018:; for (I = 108; I <= 116; I++) if (S == Nem[I]) goto L__130; goto L__3; Bip_1019:; for (I = 118; I <= 120; I++) if (S == Nem[I]) goto L__130; goto L__3; } int Hash(int Addr) { return (Nnames & (19 * *Byteinteger(Addr) + 31 * *Byteinteger(Addr + 1))); } void Pname(void) { int Jj; int Kk; int Ll; Hit = 0; I = Cc[Q]; if ('A' > I || I > 'Z') goto L__3; if (Cc[Q + 1] == '\'' && (I == 'B' || I == 'X' || I == 'M')) goto L__3; S = 2; T = 1; goto L__10; L__12: Q++; I = Cc[Q]; if (('A' > I || I > 'Z') && ('0' > I || I > '9')) goto L__101; T++; S++; L__10: Lett[Next + T] = I; goto L__12; L__101: Lett[Next] = T; if (Next + S > Dsize) Fault(108); Jj = Hash(Addr(Lett[Next])); for (Num = Jj; Num <= Jj + Nnames; Num++) { Kk = Num & Nnames; Ll = Word[Kk]; if (!Ll) goto L__2; for (Jj = 1; Jj <= Lett[Ll]; Jj++) if (Lett[Next + Jj] != Lett[Ll + Jj]) goto Fail; goto L__41; Fail:; } Fault(104); L__2: Word[Kk] = Next; Next += S; L__41: A[R] = Kk; Hit = 1; L__3:; } void Const( unsigned char Mode) { // MODE=0 FOR NORMAL MODE=2 FOR EXPONENT ETC __label__ L__99; int Z; double X; Cvalue = 0; I = Cc[Q]; S = 0; if ('0' <= I && I <= '9') goto N; if (I == '.' && Mode == 0 && '0' <= Cc[Q + 1] && Cc[Q + 1] <= '9') goto Dot; if (I == '$' && Mode == 0) goto Pi; if (I == '\'') goto L__101; if (Cc[Q + 1] != '\'') goto L__150; Q += 2; if (I == 'X') goto L__102; if (I == 'M') goto Mult; if (I == 'B') goto L__104; Q -= 2; goto L__150; Pi:; Cvalue = 3.14159265358979323846; Q++; goto L__40; L__101: S = R; A[R] = 5; R++; Texttext(); if (!A[S + 1]) goto L__24; if (A[S + 1] == 1) goto L__27; Ctype = 5; return; L__24: R = S; S = 0; goto L__99; L__27: R = S; S = A[S + 2]; goto L__99; L__102: I = Cc[Q]; Q++; if (I == '\'') goto L__99; if ('0' <= I && I <= '9') goto L__5; if ('A' > I || I > 'F') goto L__150; S = S << 4 | (I - 'A' + 10); goto L__102; L__5: S = S << 4 | (I - '0'); goto L__102; Mult: T = 0; L__28: I = Cc[Q]; Q++; if (I == '\'') goto L__22; L__29: S = S << 8 | I; T++; if (T >= 5) goto L__150; goto L__28; L__22: if (Cc[Q] != '\'') goto L__99; Q++; goto L__29; L__104: T = Q; L__32: I = Cc[Q]; Q++; if ('1' != I && I != '0') goto L__31; S = S << 1 | (I - '0'); if (Q - T >= 33) goto L__150; goto L__32; L__31: if (I == '\'') goto L__99; goto L__150; N: I = I & 15; Cvalue = 10 * Cvalue + I; Q++; I = Cc[Q]; if ('0' <= I && I <= '9') goto N; if (Mode != 0 || I != '.') goto Alpha; Dot: Q++; X = 10; L__45: I = Cc[Q]; if ('0' > I || I > '9') goto Alpha; I = I & 15; Cvalue += I / X; X = 10 * X; Q++; goto L__45; Alpha: // TEST FOR EXPONENT if (Mode != 0 || Cc[Q] != '@') goto Fix; Q++; X = Cvalue; Z = 1; if ('+' != Cc[Q] && Cc[Q] != '-') goto L__39; if (Cc[Q] == '-') Z = -1; Q++; L__39: Const(2); if (!Hit) goto L__150; S = S * Z; if (S == -99) Cvalue = 0; else Cvalue = X * REXP(10, S); Fix: // SEE IF IT IS Integer if (Cvalue > Imax) goto L__40; if (!Fracpt(Cvalue)) goto L__41; L__40: Ctype = 2; Hit = 1; return; L__41: S = Int(Cvalue); L__99: Ctype = 1; Hit = 1; return; L__150: Hit = 0; } void Constlist(void) { __label__ L__99; int Precp; int Nconst; int Rf; int J; int K; int Cpw; int Kk; int Sign; int Sp; int Rq; int Value; int Typep; int Acc; int Rp; int N; int Jj; double C; Value = 0; Nconst = 0; if (Constptr & 1) Psym(0); A[R + 1] = Constptr; Rp = R; R += 2; Acc = 0; N = 24; Typep = Typeflag[A[2]]; Precp = Typep >> 3; Typep = Typep & 7; if (Typep == 5) Acc = A[4]; if (Typep == 2 && Alllong == 1) Precp = 3; Cpw = 4 / Bytes[Precp]; if (Typep == 5) Cpw = 4; L__6: Rq = Q; I = Cc[Q]; Sign = 1; if (I == '-') goto L__7; if (I == '+') goto L__8; goto L__9; L__7: Sign = -1; if (Cpw == 4) goto L__99; L__8: Q++; I = Cc[Q]; L__9: Const(0); Rf = 1; if (!Hit) goto L__98; if (Cc[Q] != '(') goto L__1; J = S; Q++; C = Cvalue; Const(2); if (Hit != 1 || S <= 0 || Cc[Q] != ')') goto L__98; Q++; Cvalue = C; Rf = S; S = J; L__1: if (Typep == 2) goto L__21; if (Typep == 5) goto L__51; if (Cpw == 4 && S > 255) goto L__99; if (Cpw == 2 && abs(S) >> 16 != 0) goto L__99; S = S * Sign; if (Cpw == 2) S = S & 0xFFFF; for (Kk = 1; Kk <= Rf; Kk++) { J = Nconst / Cpw; K = Nconst - Cpw * J; Sp = S << (32 * (Cpw - K - 1) / Cpw); Value = Sp | Value; Nconst++; if ((Cpw - 1) & Nconst) goto L__5; Psym(Value); Value = 0; L__5:; } L__11: if (Cc[Q] != ',') goto L__99; Q++; if (Cc[Q] != 10) goto L__6; Readline(0); Q = 1; goto L__6; L__21: if (Ctype == 1) Cvalue = S; Cvalue = Sign * Cvalue; J = *Integer(Addr(Cvalue)); K = *Integer(Addr(Cvalue) + 4); for (Kk = 1; Kk <= Rf; Kk++) { Nconst++; Psym(J); if (Precp == 3) Psym(K); } goto L__11; L__51: if (Ctype == 5) goto L__52; if (Ctype != 1 || S > 127) goto L__98; A[Rp + 3] = 1; A[Rp + 4] = S; L__52: if (Sign != 1 || Acc < A[Rp + 3]) goto L__98; for (Kk = 1; Kk <= Rf; Kk++) { for (Jj = 0; Jj <= Acc; Jj++) { S = A[Rp + Jj + 3] & 127; Sp = S << N; Value = Sp | Value; N -= 8; if (N >= 0) goto L__55; Psym(Value); N = 24; Value = 0; L__55:; } Nconst++; } R = Rp + 2; goto L__11; L__98: Q = Rq; L__99: R = Rp; A[R] = Nconst; if ((Typep == 5 && N != 24) || (Typep != 5 && ((Cpw - 1) & Nconst) != 0)) Psym(Value); } void Texttext(void) { __label__ L__99; int S; int J; S = R; R++; if (I != '\'') goto L__98; Q++; L__1: I = Cc[Q]; A[R] = I; R++; if (I == '\'') goto L__31; if (I == 10) goto L__32; Q++; if (R - S > 256) Fault(106); goto L__1; L__32: Readline(1); Q = 1; goto L__1; L__31: if (Cc[Q + 1] != '\'') goto L__35; Q += 2; goto L__1; L__35: R -= 2; J = R - S; if (J & 1) goto L__36; R++; A[R] = 0; L__36: A[S] = J; Q++; Hit = 1; goto L__99; L__98: Hit = 0; L__99:; } void Setuplist(void) { int J; int K; for (J = 0; J <= Asl - 16; J += 8) *Shortinteger(Addr(Aslist[J])+14) = J; // SHORT INTEGER(ADDR(ASLIST(J))+14)=J *Integer(Addr(Aslist[0])) = -1; *Integer(Addr(Aslist[4])) = 0xFFFF0000; Asl -= 8; } void Initialise(void) { static unsigned char Ilett[1+320 /*1:320*/] = {0, 11, 'S', 'E', 'L', 'E', 'C', 'T', 'I', 'N', 'P', 'U', 'T', 12, 'S', 'E', 'L', 'E', 'C', 'T', 'O', 'U', 'T', 'P', 'U', 'T', 7, 'N', 'E', 'W', 'L', 'I', 'N', 'E', 5, 'S', 'P', 'A', 'C', 'E', 10, 'S', 'K', 'I', 'P', 'S', 'Y', 'M', 'B', 'O', 'L', 6, 'R', 'U', 'N', 'O', 'U', 'T', 8, 'N', 'E', 'W', 'L', 'I', 'N', 'E', 'S', 6, 'S', 'P', 'A', 'C', 'E', 'S', 10, 'N', 'E', 'X', 'T', 'S', 'Y', 'M', 'B', 'O', 'L', 11, 'P', 'R', 'I', 'N', 'T', 'S', 'Y', 'M', 'B', 'O', 'L', 10, 'R', 'E', 'A', 'D', 'S', 'Y', 'M', 'B', 'O', 'L', 4, 'R', 'E', 'A', 'D', 5, 'W', 'R', 'I', 'T', 'E', 7, 'N', 'E', 'W', 'P', 'A', 'G', 'E', 4, 'A', 'D', 'D', 'R', 6, 'A', 'R', 'C', 'S', 'I', 'N', 3, 'I', 'N', 'T', 5, 'I', 'N', 'T', 'P', 'T', 6, 'F', 'R', 'A', 'C', 'P', 'T', 5, 'P', 'R', 'I', 'N', 'T', 7, 'P', 'R', 'I', 'N', 'T', 'F', 'L', 4, 'R', 'E', 'A', 'L', 7, 'I', 'N', 'T', 'E', 'G', 'E', 'R', 3, 'M', 'O', 'D', 6, 'A', 'R', 'C', 'C', 'O', 'S', 4, 'S', 'Q', 'R', 'T', 3, 'L', 'O', 'G', 3, 'S', 'I', 'N', 3, 'C', 'O', 'S', 3, 'T', 'A', 'N', 3, 'E', 'X', 'P', 9, 'M', 'A', 'P', 'R', 'E', 'C', 'O', 'R', 'D', 11, 'B', 'Y', 'T', 'E', 'I', 'N', 'T', 'E', 'G', 'E', 'R', 12, 'S', 'H', 'O', 'R', 'T', 'I', 'N', 'T', 'E', 'G', 'E', 'R', 6, 'R', 'A', 'D', 'I', 'U', 'S', 6, 'A', 'R', 'C', 'T', 'A', 'N', 6, 'P', 'A', 'R', 'I', 'T', 'Y', 11, 'P', 'R', 'I', 'N', 'T', 'S', 'T', 'R', 'I', 'N', 'G', 2, 'N', 'L', 8, 'L', 'O', 'N', 'G', 'R', 'E', 'A', 'L', 7, 'P', 'R', 'I', 'N', 'T', 'C', 'H', 6, 'R', 'E', 'A', 'D', 'C', 'H', 6, 'S', 'T', 'R', 'I', 'N', 'G'}; static short Iword[43 /*0:42*/] = { 1, 13, 26, 34, 40, 51, 58, 67, 74, 85, 97, 108, 113, 119, 127, 132, 139, 143, 149, 156, 162, 170, 175, 183, 187, 194, 199, 203, 207, 211, 215, 219, 229, 241, 254, 261, 268, 275, 287, 290, 299, 307, 314}; int I; Cabuf = 0; Ppcurr = 0; Qpreal = 0; Oldline = 0; Line = 0; Rlevel = 0; Nmax = 0; Constptr = 0; Level = 0; Ca = 0; Aflag = 0; Fflag = 0; Sbflag = 0; Faulty = 0; Perm = 0; Mcswitch = 0; Alllong = 0; Dcomp = 0; Compiler = 0; Cprmode = 0; Printmap = 0; Next = 1; Nr = 0; Ldptr = 0; Neps = 0; Eplink = 0; Rbase = 0; Strinst = 0; Imax = (-1) >> 1; Plabel = 24999; Sstl = 0; Stmts = 0; Snum = 0; Labset = 3 << 30; Lett[0] = 0; N0 = 41; N = 12; Checksp = 1; Checks = 1; Linenos = 1; Diags1 = 1; Qu = 1; Mone = 1; List = 1; Sflabel = 20999; Unass = 1; Ownlink = 0; Xreflink = 136; I = Com(24); if (I & 2) List = 0; if (I & 4) Linenos = 0; if (I & 16) Unass = 0; if (I & 32) Checks = 0; if (I & 0x8000) Printmap = 1; if (I & 64) Diags1 = 0; for (I = 0; I <= Maxlevels; I++) { Set[I] = 0; Codebase[I] = 0; Freg[I] = 0; Ral[I] = 0; Lwsp[I] = 0; Mdarr[I] = 0; Rnext[I] = 0; Strwsp[I] = 0; Cycle[I] = 0; Jump[I] = 0; Name[I] = 0; Label[I] = 0; Flag[I] = 0; Sbr[I] = 0; Wsp[I] = 0; } for (I = 0; I <= 50; I++) { St[I] = 0; Pagenos[I] = 0; if (I < 16) Register[I] = 0; if (5 <= I && I <= 8) Uvarreg[I] = 0; } Pagenos[1] = 10; for (I = 0; I <= Nnames; I++) { Word[I] = 0; Tags[I] = 0; } Setuplist(); Pclod(0); Pclod(5); A[1] = 28; for (I = 0; I <= 42; I++) { J = Iword[I]; for (K = 1; K <= Ilett[J]; K++) { Cc[K] = Ilett[J + K]; } Cc[K + 1] = ';'; R = 2; Q = 1; Pname(); Css(1); } A[1] = 12; Css(1); } // THE NEXT 4 ROUTINES CAN BE MACROISED USING MVC void Toar4(int Ptr, int Value) { int Ad; Ad = Addr(Value); A[Ptr] = *Shortinteger(Ad); //A(PTR)<-SHORT INTEGER(AD) A[Ptr + 1] = *Shortinteger(Ad+2); //A(PTR+1)<-SHORT INTEGER (AD+2) } void Toar8(int Ptr, double Value) { int Ad; Ad = Addr(Value); A[Ptr] = *Shortinteger(Ad); //A(PTR)<-SHORT INTEGER(AD) A[Ptr + 1] = *Shortinteger(Ad+2); //A(PTR+1)<-SHORT INTEGER(AD+2) A[Ptr + 2] = *Shortinteger(Ad+4); //A(PTR+2)<-SHORT INTEGER(AD+4) A[Ptr + 3] = *Shortinteger(Ad+6); //A(PTR+3)<-SHORT INTEGER(AD+6) } void XFromar4(int Ptr, int *Value) { int Ad; Ad = Addr(Value); *Shortinteger(Ad) = A[Ptr]; //SHORT INTEGER(AD)<- A(PTR) *Shortinteger(Ad+2) = A[Ptr + 1]; //SHORT INTEGER(AD+2)<- A(PTR+1) } void XFromar8(int Ptr, double *Value) { int Ad; Ad = Addr(Value); *Shortinteger(Ad) = A[Ptr]; //SHORT INTEGER(AD)<- A(PTR) *Shortinteger(Ad+2) = A[Ptr + 1]; //SHORT INTEGER(AD+2)<- A(PTR+1) *Shortinteger(Ad+4) = A[Ptr + 2]; //SHORT INTEGER(AD+4)<- A(PTR+2) *Shortinteger(Ad+6) = A[Ptr + 3]; //SHORT INTEGER(AD+6)<- A(PTR+3) } void Printname(int N) { int J; int V; if (N >= 0) goto L__4; N = -N; if (16384 > N || N > 16384 + Nnames) goto L__5; N -= 16384; goto L__4; L__5: Write(N, 1); goto L__3; L__4: Space(); V = Word[N]; for (J = 1; J <= Lett[V]; J++) Printsymbol(Lett[V + J]); L__3:; } void Pclod(int Ptr) { int I; for (I = Ptr + 1; I <= Ptr + Clods[Ptr]; I++) Plant(Clods[I]); } void Paclod(int Ptr, int At, int Value) { int I; int J; int K; J = Clods[Ptr]; At += Ptr; for (I = Ptr + 1; I <= Ptr + J; I++) { K = Clods[I]; if (I == At) K = K | Value; Plant(K); } } void Plant(int Value) { Code[Ppcurr] = Value; Ppcurr++; Ca += 2; if (Ppcurr != 192) return; Lput(1, 384, Cabuf, Addr(Code[0])); Ppcurr = 0; Cabuf = Ca; } void Prr(int Opcode, int R1, int R2) { Plant(Opcode << 8 | R1 << 4 | R2); } void Prx(int Opcode, int R1, int R2, int Base, int Disp) { Plant(Opcode << 8 | R1 << 4 | R2); Plant(Base << 12 | Disp); } void Psi(int Opcode, int J, int Base, int Disp) { Plant(Opcode << 8 | J); Plant(Base << 12 | Disp); } void Pss(int Opcode, int N, int Base, int Disp, int P, int Q) { Plant(Opcode << 8 | (N - 1)); Plant(Base << 12 | Disp); Plant(P << 12 | Q); } void Pconst(int X) { Plant(X >> 16); Plant(X & 0xFFFF); } void Cnop(int I, int J) { J--; L__1: if ((Ca & J) == I) goto L__9; Plant(0x0700); goto L__1; L__9:; } void Psym(int X) { Lput(5, 4, Constptr << 2, Addr(X)); Constptr++; } void Plug(int J, int K) { __label__ L__99; if (J >= Cabuf) goto Inbuf; Lput(1, 2, J, Addr(K) + 2); goto L__99; Inbuf: Code[(J - Cabuf) >> 1] = K; L__99:; } void Prhex(int Value, int Places) { static unsigned char Hex[16 /*0:15*/] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; int I; for (I = (Places << 2) - 4; I >= 0; I -= 4) Printsymbol(Hex[Value >> I & 15]); } void Sizes(void) { auto void Sum(int I); int I; int J; int Free; int Total; Sum(5); return; // system-dependent calculation of free memory... I = Com(2); Free = *Integer(I + 4); Free = Free - Addr(Total) - 10000; for (J = 0; J <= 5; J++) { Sum(J); if (Total > Free) goto L__1; } return; L__1: if (J) goto L__2; printf("%s", "NOT ENOUGH CORE ALLOCATED FOR IMP"); _imp_monitor(0); exit(0); L__2: Sum(J - 1); return; void Sum(int I) { Nnames = 128 * REXP(2, I) - 1; Ccsize = 200 + 40 * I; Nrouts = Nnames / 2; Asl = 24 * Nnames; if (Asl > 32760) Asl = 32760; Arsize = 300 + 50 * I; Dsize = 6 * Nnames; Total = Ccsize + Asl + 2 * (Nrouts + Arsize + Dsize); } } void Css(int P) { __label__ Scalar; auto void Redefineep(int Typep, int Params); auto void Ciocp(int N); auto void Defineep(int Mode, int Name, int Addr); auto void Loaddata(void); auto void Plocaljump(int Mask, int Lab); auto void Filllocaljumps(void); auto void XClearlist(short *Ophead); #define Clearlist(Ophead) XClearlist(&Ophead) auto void Storestring(int Z, int From, int To, int Bml, int Dml); auto void Cend(int Kkk); auto void XCbpair(int *Lb, int *Ub); #define Cbpair(Lb, Ub) XCbpair(&Lb, &Ub) auto void XUndcrf(short *Ophead); #define Undcrf(Ophead) XUndcrf(&Ophead) auto void Ccond(int Iu, int Reg, int Addr); auto void Filljumps(int Level); auto void Setline(void); auto void Cui(unsigned char Code); auto void Set80(int Where, int N); auto void Cvdecln(void); auto void Csexp(int Reg, unsigned char Mode); auto void Cstrexp(int Reg); auto void Checkrf(void); auto void Assign(int P1, int P2); auto int Copyrecordtag(void); auto int Countaps(void); auto int Displacement(int Link); auto void Loadad(int Reg, int Base, int X, int Disp); auto void Skipapp(void); auto void Cquery(int Reg); auto void Crformat(void); auto void Cadcln(unsigned char Mode); auto void Cqn(int P); auto void Clt(void); auto void Mover(int R, int N); auto int Getarrwsp(void); auto int Getdblewrd(void); auto void Crcall(int Clink); auto void Cname(int Z, int Reg); auto void Crname(int Z, int Mode, int Clink, int Bs, int Dp); auto void Caname(int Z, int Bs, int Dp, int Link, int Bsrf, int Dprf); auto void Cename(int Z, int Mode, int Bs, int Dp); auto void XInsertafter(short *Stad, int S1, int S2); #define Insertafter(Stad, S1, S2) XInsertafter(&Stad, S1, S2) auto void XFromlist(int Cell, int *S1, int *S2); #define Fromlist(Cell, S1, S2) XFromlist(Cell, &S1, &S2) auto void XPop(short *Cell, int *S1, int *S2); #define Pop(Cell, S1, S2) XPop(&Cell, &S1, &S2) auto void XPush(short *Cell, int S1, int S2); #define Push(Cell, S1, S2) XPush(&Cell, S1, S2) auto int Find(int Lab, int List); auto void XMlink(int *Cell); #define Mlink(Cell) XMlink(&Cell) auto void Replace2(int Cell, int S2); auto void Replace1(int Cell, int S1); auto void Replaceboth(int Cell, int S1, int S2); auto void XFrom2(int Cell, int *S2); #define From2(Cell, S2) XFrom2(Cell, &S2) auto void XFrom1(int Cell, int *S1); #define From1(Cell, S1) XFrom1(Cell, &S1) auto void Cres(int Mode, int Lab); auto int Newcell(void); auto void Copytag(int Kk); auto void Csname(int Z, int Reg); auto void Replacetag(int Kk); auto int Park(int Reg); auto int Parkf(int Reg, int Prec); auto int Claimablereg(void); auto int Findpp(void); auto int Getstrwsp(void); auto void Setex(void); auto void Gxref(int Name, int Hash); auto void Unpark(int Opcode, int Reg, int Q); auto void Storetag(int Kk, int Slink); auto int Pageno(int N); auto void Testnst(void); auto void Cuci(void); auto void Skipexp(void); auto void Unpack(void); auto int Sortconst(int P, int Long, int Type); auto void XPack(int *Ptype); #define Pack(Ptype) XPack(&Ptype) auto void Crspec(unsigned char M); auto void Dump(int Code, int Reg, int Dis, int X, int Level); auto void Rhead(int Kk); auto void Testass(int Reg); auto void Pj(int Mask, int Stad); auto void Compileformalparameter(void); auto void Ppj(unsigned char N); auto void Plab(int M); auto void Checkcapacity(int Reg, int Dis, int X, int Level); auto int XTsexp(int *Code); #define Tsexp(Code) XTsexp(&Code) static int Sw_sw; static void *Sw[45 /*1:45*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5, &&Sw_6, &&Sw_7, &&Sw_8, &&Sw_9, &&Sw_10, &&Sw_11, &&Sw_12, &&Sw_13, &&Sw_14, &&Sw_15, &&Sw_16, &&Sw_17, &&Sw_18, &&Sw_19, &&Sw_20, &&Sw_21, &&Sw_22, &&Sw_23, &&Sw_24, &&Sw_25, &&Sw_26, &&Sw_27, &&Sw_28, &&Sw_29, &&Sw_30, &&Sw_31, &&Sw_32, &&Sw_33, &&Sw_34, &&Sw_35, &&Sw_36, &&Sw_37, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default, }; int Inc; int Incp; int Bxle; int Acc; short Ophead; int Jj; int Jjj; int Kk; int Kkk; int Q; int Qq; int Extrn; int Base; int Disp; int Value; int Index; int Localbase; int Localaddr; short Localjump; short Locallabel; unsigned char Rout; unsigned char Nam; unsigned char Arr; unsigned char Prec; unsigned char Type; unsigned char Precp; int Ptype; int I; int J; int K; int Oldi; int Inreg; int Ptypep; int Save13; int Chnge13; Localjump = 0; Locallabel = 0; Localbase = 0; Oldi = 0; goto *Sw[Sw_sw = (A[P]) - 1]; Sw_1: Marker2 = P + 1 + A[P + 1]; Setline(); P += 2; if (A[Marker2] == 2) goto L__101; Mask = 15; Cui(0); goto L__1; L__101: Q = P; if (A[P] == 9) Fault(54); Save13 = R13; Chnge13 = 0; if (A[P] == 3) goto L__103; Plabel -= 2; Jjj = Plabel + 1; Kkk = Plabel; P = Marker2 + 2; Ccond(A[P - 1] - 1, Jjj, Kkk); Plocaljump(Mask, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Push(Locallabel, Ca, Jjj); P = Q; Cui(1); L__104: Push(Locallabel, Ca, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; L__102: if (Localbase != 10 && Localbase != 0) Register[Localbase] = 0; Filllocaljumps(); goto L__1; L__103: Plabel--; Jjj = Plabel; Nmdecs[Level] = 1; Kkk = A[P + 2] + ((A[P + 1] - 1) << 14); P = Marker2 + 2; Ccond(2 - A[P - 1], Jjj, Kkk); Plocaljump(Mask, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Push(Locallabel, Ca, Jjj); goto L__102; Sw_2: Setline(); P++; Bxle = 0; Cname(3, 4); Inc = N; N += 12; if (Type != 1 || Prec != 0) Fault(25); Q = P; Skipexp(); Register[4] = 1; Jj = P; if (3900 > Ca - Codebase[Level] && 1 <= Tsexp(Jjj) && Tsexp(Jjj) <= 2) Bxle = 1; P = Jj; Csexp(2, 1); Jjj = P; Kkk = Tsexp(Qq); P = Jjj; if (!Kkk) Dump(1, 2, Inc, 0, Rbase); Csexp(3, 1); if (!Kkk) Prx(0x90, 3, 4, Rbase, Inc + 4); else Prx(0x90, 2, 4, Rbase, Inc); P = Q; Csexp(1, 1); if (!Checksp) goto L__202; Dump(0, 2, Inc, 0, Rbase); Ppj(17); L__202: Plab(-1); Register[4] = 0; Dump(1, 1, 0, 0, 4); Push(Cycle[Level], K, Inc + 4096 * Bxle); goto L__1; Sw_3:; Setline(); Pop(Cycle[Level], J, K); if (J != -1) goto L__302; Fault(1); goto L__1; L__302: Bxle = K >> 12; K = K & 4095; Prx(0x98, 2, 4, Rbase, K); Dump(2, 1, 0, 0, 4); if (Bxle == 1) goto L__301; Plant(0x1A12); Pconst(0x59304000); K = J; Pj(7, K); goto L__1; L__301: I = Find(J, Label[Level]); Prx(0x87, 1, 2, 10, I - Codebase[Level]); goto L__1; Sw_4:; K = A[P + 2] + ((A[P + 1] - 1) << 14); if (Find(K, Label[Level]) == -1) goto L__402; Fault(2); goto L__1; L__402: Plab(K); goto L__1; Sw_5: Q = P + 1; Marker2 = P + 3 + A[P + 2]; Setline(); P = Marker2; Save13 = R13; Chnge13 = 0; if (A[P] == 3) goto L__510; if (A[P] == 9) goto L__520; Plabel -= 2; Jjj = Plabel + 1; Kkk = Plabel; P = Q + 2; Ccond(A[Q] - 1, Jjj, Kkk); Plocaljump(Mask, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Push(Locallabel, Ca, Jjj); P = Marker2; Cui(1); if (A[P] != 1) goto L__104; P++; if (A[P] == 9) goto L__107; Plabel--; Jjj = Plabel; Plocaljump(15, Jjj); Push(Locallabel, Ca, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Mask = 15; Cui(2); Kkk = Jjj; goto L__104; L__107: Pj(15, Sflabel - 1); Cui(2); goto L__104; L__510: Plabel--; Jjj = Plabel; Nmdecs[Level] = 1; Kkk = A[P + 2] + ((A[P + 1] - 1) << 14); P = Q + 2; Ccond(2 - A[Q], Jjj, Kkk); Plocaljump(Mask, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Push(Locallabel, Ca, Jjj); P = Marker2 + 3; if (A[P] != 1) goto L__102; P++; Mask = 15; Cui(0); goto L__102; L__520: Plabel--; Jjj = Plabel; Kkk = Sflabel - 1; P = Q + 2; Ccond(A[Q] - 1, Jjj, Kkk); Plocaljump(Mask, Kkk); if (R13 != Save13 || Chnge13 != 0) R13 = 0; Push(Locallabel, Ca, Jjj); P = Marker2; Cui(1); P++; if (A[P] == 1) Fault(53); goto L__102; Sw_6: L__1:; return; Sw_7:; if (Level < 2) Fault(57); if (Nmdecs[Level]) Fault(40); P++; Clt(); Rout = 0; if (Type == 5 && Acc == 0) Fault(70); if (A[P] == 1) goto Scalar; if (A[P] == 3) goto Vector; Arr = 1; Nam = (2 - A[P + 1]) << 1; Pack(Ptype); P += 2; Setline(); if (Nam) Acc = 4; Cadcln(0); goto L__1; Vector: Arr = 2; Nam = 0; Pack(Ptype); P++; Setline(); Cvdecln(); goto L__1; Scalar: J = 0; Rout = 0; Cqn(P + 1); P += 2; Inc = N; Qq = Acc; if (Type == 5) Acc = 4; Jj = 0; if (Acc != 8 || (N & 7) == 0) goto L__701; Push(Wsp[Level], 0, N); N += 4; L__701: if (Type == 5) Setline(); Pack(Ptype); for (Kk = 1; Kk <= A[P]; Kk++) { K = A[P + Kk]; Testnst(); Storetag(K, N); if (Type != 5) goto L__705; Jj += Qq; if (Unass == 1) Pss(0xD2, 2, Wspr, 0, Gla, 128); Prx(0x50, Wspr, Rbase, 0, N); Psi(0x92, Qq - 1, Rbase, N); if (Kk == A[P]) Qq = Qq + ((Jj + 7) & (-8)) - Jj; Prx(0x41, Wspr, Wspr, 0, Qq); L__705: N += Acc; } N += 3; N = N & (-4); if (Unass == 1 && Type != 5) Set80(Inc, N - Inc); goto L__1; Sw_8:; Cend(Flag[Level]); goto L__1; Sw_9: P++; Marker1 = A[P] + P; L__900: Q = P; Kkk = A[Marker1 + 1]; Extrn = A[P + 1]; if (A[Marker1] == 2) goto L__902; P++; Crspec(0); if (Extrn == 3) goto L__1; N0--; Kk = 'S' * (2 - Extrn); Gxref(Kkk, Kk); Jj = Tags[Kkk]; From1(Jj, Q); Replace1(Jj, Q & (-2)); goto L__1; L__902: Filljumps(Level); Kk = Kkk; Copytag(Kkk); if (Oldi != Level) goto L__939; if (Extrn != 3) { if (!Cprmode) Cprmode = 2; if (Cprmode != 2 || Level != 1) Fault(55); Defineep(Extrn, Kkk, Ca); Pclod(0); } if (A[P + 2] == 1) goto L__908; Rout = 1; P += 3; Clt(); Arr = 0; Nam = (A[P] - 1) << 1; Pack(Kkk); goto L__909; L__908: Kkk = 10000; L__909: if (J == 15 && Ptype == Kkk) goto L__940; Fname = Kk; if ((Ptype & 7) != 7) Fault(7); L__939: P = Q + 1; Crspec(0); P = Q; goto L__900; L__940: J = 0; Replacetag(Kk); Jj = K; Plabel--; if (Compiler != 1 && (Cprmode != 2 || Level != 1)) Pj(15, Plabel); Ral[Level] = Nmax << 16 | Sbflag << 15 | N; Rhead(Kk); if (Extrn != 3) Ppj(40); Flag[Level] = Ptype; P = Marker1 + 1; if (A[P + 1] == 2) goto L__942; L__943: P += 2; Compileformalparameter(); for (Bxle = 1; Bxle <= A[P]; Bxle++) { Mlink(Jj); if (Jj) goto L__945; Fault(8); goto L__946; L__945: Fromlist(Jj, J, Jjj); if (J == Ptype && (Ptype != 5 || Jjj == Acc)) goto L__946; Fault(9); Printname(A[P + Bxle]); L__946: K = A[P + Bxle]; Testnst(); Ophead = 0; Unpack(); if (Rout == 1) goto L__947; if (Ptype == 5) goto L__9040; J = Jjj; if (Type == 3) goto L__948; R = N; if (Arr == 1) goto L__950; if (Prec == 3 && Nam == 0) goto L__949; N = N + 4 - Acc; R = N; L__950: Storetag(K, N); N = R + Acc; goto L__999; L__947: Push(Ophead, N, 1000); J = 13; L__951: Kk = Ophead; R = N; N = Kk; goto L__950; L__9040: Prx(0x41, 1, 0, Rbase, N + 4); Prx(0x50, 1, 0, Rbase, N); Psi(0x92, Jjj - 1, Rbase, N); Storetag(K, N); N += (Acc + 7) & (-4); goto L__999; L__948: Push(Ophead, 0, N); J = 0; goto L__951; L__949: R = N; if (!(N & 7)) goto L__950; Push(Wsp[Level], 0, N); N += 4; R = N; goto L__950; L__999:; } P = P + 1 + Bxle; if (A[P] == 1) goto L__943; L__942: Mlink(Jj); if (Jj) Fault(10); goto L__1202; Sw_10:; goto L__1; Sw_11:; Alllong = A[P + 1] & 1; goto L__1; Sw_12:; Filljumps(Level); Ral[Level] = Sbflag << 15 | N; Ptype = 0; Rhead(-1); Flag[Level] = 0; if (Level == 1 && 1 == Rlevel) goto L__1; if (Level != 2) goto L__1202; if (!Cprmode) Cprmode = 1; Defineep(0, 0, 0); if (Cprmode != 1) Fault(55); L__1202: Plant(0x05A0); Codebase[Level] = Ca; goto L__1; Sw_13:; if (Level != 2) Fault(15); if (Cprmode != 1) Fault(56); Perm = 0; Cend(1); Loaddata(); goto L__1; Sw_14 : { __label__ L__1; R13 = 0; Mone = 1; Copytag(A[P + 1]); if (Oldi == Level && Type == 6) goto L__1401; Fault(4); goto L__1; L__1401: Fromlist(K, Acc, Kkk); Mlink(K); Fromlist(K, Qq, Kk); if ((A[P + 3] & 7) != 1) goto L__1411; if (A[P + 3] == 9) Jj = A[P + 4]; else { Fromar4(P + 4, Jj); P++; } if (A[P + 2] == 2) Jj = -Jj; if (Kkk <= Jj && Jj <= Kk) goto L__1402; L__1411: Fault(5); goto L__1; L__1402: Q = Jj - Kkk; L__1404: if (31 >= Q) goto L__1403; Mlink(K); Q -= 32; Fromlist(K, Qq, Jjj); goto L__1404; L__1403: Jjj = 1 << Q; if (Jjj & Qq) Fault(6); Replace1(K, Qq | Jjj); Q = Ca - Codebase[Level]; if (Prec) goto L__1407; Qq = Acc + 8 + ((Jj - Kkk) << 2); if (Q >> 16) Plug(Qq, Q >> 16); L__1406: Plug(Qq + 2, Q & 0xFFFF); goto L__1; L__1407: Qq = Acc + 6 + ((Jj - Kkk) << 1); if (Q > 0x7FFF) Fault(99); goto L__1406; L__1:; } goto L__1; Sw_15 : { __label__ L__1; int Bp; int Qqq; Q = P; Cnop(0, 4); Pj(15, Plabel - 1); if (Level < 2) Fault(56); L__1528: P = Q + A[Q + 1] + 2; Cbpair(Kkk, Kk); if (abs(Kkk) >= 0x7FFF || 0x7FFF <= abs(Kk)) goto L__1501; if (Kkk <= Kk) goto L__1535; Fault(27); Kk = Kkk; L__1535: for (Qq = 1; Qq <= A[Q + 1]; Qq++) { K = A[Q + Qq + 1]; Testnst(); Prec = 0; if (Sbflag == 1 || Compiler == 1) Prec = 2; Type = 6; Rout = 0; Nam = 0; Arr = 1; Pack(Ptype); Ophead = Newcell(); Jj = Ophead; J = 0; Storetag(K, Ophead); R = Kkk; Insertafter(Ophead, 0, Kk); L__1503: if (Kk - R < 32) goto L__1504; Insertafter(Ophead, 0, 0); R += 32; goto L__1503; L__1504: Replaceboth(Jj, Ca, Kkk); Pconst(Kkk & 0xFFFFFF | Prec << 24); Pconst(Kk); Jjj = Kk - Kkk; if (Prec == 2) Jjj = (Jjj + 1) / 2; for (I = 0; I <= Jjj; I++) Pconst(0); } Q = P; if (A[Q] != 2) goto L__1528; Plab(-1); goto L__1; L__1501: Fault(18); Kk = 0; Kkk = 0; goto L__1535; L__1:; } goto L__1; Sw_16: Qu = ~A[P + 1] & 1; P += 2; goto L__1; Sw_17:; Kk = Claimablereg(); if (!Kk) goto L__1999; Register[Kk] = -Level; Uvarreg[Kk] = Level; Ptype = 8; J = 0; K = A[P + 1]; Testnst(); Storetag(K, Kk); goto L__1; Sw_18:; { __label__ L__1; __label__ L__99; int Wsp1; int Length; int Bp; int Pp; int Sign; int *Var; if (Nmdecs[Level]) Fault(40); P++; Clt(); if (Type == 5 && Acc == 0) Fault(70); Nam = 0; Rout = 0; Arr = A[P] - 1; Pack(Ptype); Pp = P + 1; P += 2; if (Arr) goto Nonscalar; if (A[P] != 2) goto L__1801; A[P + 1] = 4; A[P + 2] = 9; A[P + 3] = 0; L__1801: Sign = A[P + 1]; if (Type == 5) goto L__1820; Jj = Sortconst(P + 2, Prec & 1, Type); if (Type == 2) goto L__1810; Var = &St[N0 - 1]; if ((Prec == 1 && *Var > 255) || (Prec == 2 && abs(*Var) >> 16 != 0)) Fault(44); if ((A[P + 2] & 7) == 2) Fault(44); if (Sign == 2) *Var = -*Var; if (Sign == 3) *Var = ~*Var; L__1803: K = A[Pp]; Testnst(); if (Prec != 3) Jj = Jj + 4 - Bytes[Prec]; Push(Tags[K], Ptype << 16 | Level << 8 | Gla << 4, Jj); Push(Name[Level], 0, K); goto L__99; L__1810: if (Sign == 3) Fault(44); if (Sign != 2) goto L__1803; St[Jj >> 2] = St[Jj >> 2] | 0x80000000; goto L__1803; L__1820:; if (A[P + 2] != 9 || A[P + 3] >= 127) goto L__1822; A[P + 2] = 5; A[P + 4] = A[P + 3]; A[P + 3] = 1; L__1822: if (Sign != 4 || A[P + 2] != 5 || A[P + 3] >= Acc) Fault(44); Qq = Constptr << 2; for (Jj = 0; Jj <= (Acc - 1) & (-4); Jj += 4) { Wsp1 = A[P + Jj + 3] << 8 | A[P + Jj + 4] & 255; Wsp1 = Wsp1 << 8 | A[P + Jj + 5] & 255; Wsp1 = Wsp1 << 8 | A[P + Jj + 6] & 255; Psym(Wsp1); } Prx(0x58, 2, 0, Gla, 8); Loadad(1, 2, Gla, Qq); Prx(0x50, 1, 0, Rbase, N); Psi(0x92, Acc - 1, Rbase, N); K = A[Pp]; Testnst(); J = 0; Storetag(K, N); N += 4; goto L__99; Nonscalar: Cbpair(Kk, Kkk); if (Type == 5) Bp = Acc; else Bp = Bytes[Prec]; Length = Kkk - Kk + 1; if (!A[P + 1]) goto L__3; L__1: if (Kkk < Kk || Length != A[P + 1]) Fault(45); Qq = Constptr << 2; Jj = A[P + 2] << 2; // OUTPUT AN ARRAYHEAD RELATIVE TO Qq St[N0] = Jj - Kk * Bp; St[N0 + 1] = Jj; St[N0 + 2] = Qq; St[N0 + 3] = Ownlink; // NOW OUTPUT DOPE Vector Psym(1 << 16 | Bp); Psym(Kk); Psym(Kkk); // NOW PLANT Code K = A[Pp]; J = 1; Testnst(); Ownlink = N0 << 2; Rbase = Gla; Storetag(K, Ownlink); Rbase = 10 - Rlevel; N0 += 4; goto L__99; L__3: A[P + 2] = Constptr; A[P + 1] = Length; if (Length < 1) goto L__1; for (Jj = 1; Jj <= (Length * Bp + 3) / 4; Jj++) Psym(0); goto L__1; L__99:; } goto L__1; Sw_19:; Copytag(A[P + 3]); if (A[P + 2] == 1) goto L__1910; if (Arr != 0 || Type != 3) goto L__1999; From2(K, K); goto L__1920; L__1910: if (Arr != 1 || Type > 3 || J > 2) goto L__1999; L__1920: if (A[P + 1] == 2) goto L__1930; Kk = Claimablereg(); if (!Kk) goto L__1999; Register[Kk] = A[P + 3] + 1; Prx(0x58, Kk, 0, I, K); Jj = Tags[A[P + 3]]; From1(Jj, Jjj); Jjj = Jjj | Kk << 12; L__1925: Replace1(Jj, Jjj); goto L__1; L__1930: if (Inreg == 0 || Register[Inreg] != A[P + 3] + 1) goto L__1999; Register[Inreg] = 0; Jj = Tags[A[P + 3]]; From1(Jj, Jjj); Jjj = Jjj & 0xFFFF0FFF; goto L__1925; L__1999: Fault(58); goto L__1; Sw_26: Compiler = 1; Unass = 0; goto L__1; Sw_27:; P++; if (A[P + 1] == 1) goto L__2701; Crspec(2); goto L__1; L__2701: Copytag(A[P]); if (Ptype != 4 || A[P + 4] != 2 || 2 != A[P + 3]) goto L__3901; P += 2; K = Displacement(Tags[A[P - 2]]); if (K == -1) goto L__1; Ophead = K; P += 2; Crspec(3); goto L__1; Sw_20: Mcswitch = 1; Perm = 1; goto L__1; Sw_21: Sbflag = 1; goto L__1; Sw_22: P = 2; Cuci(); goto L__1; Sw_23:; if (Level != 2 || Cprmode == 2) Fault(26); P++; Q = P + 1; L__2302: if (A[Q] == 2) goto L__2303; Q += 2; goto L__2302; L__2303: K = A[Q + 2] + ((A[Q + 1] - 1) << 14); Kkk = A[P]; Pconst(0x41100000 | Kkk); if (Kkk > 32 || Kkk == 0 || Kkk == 29 || 12 <= Kkk && Kkk <= 13) Fault(36); Ppj(20); Qq = Ca; Pj(15, K); if (Ca != Qq + 8) Pconst(0x07000700); P += 2; if (A[P - 1] == 1) goto L__2303; if (A[P + 2] == 2) goto L__1; P += 3; Q = P + 1; goto L__2302; Sw_24: if (Cprmode != 2 || Rlevel != 1) Fault(56); Loaddata(); Finalise(); exit(0); Sw_25: Mcswitch = 0; Perm = 0; goto L__1; Sw_28:; J = 0; Ptype = 10006; Storetag(A[P + 1], Snum); Snum++; goto L__1; Sw_29: List = 1; goto L__1; Sw_30: List = 0; goto L__1; Sw_31:; if (A[P + 1] == 9) J = A[P + 2]; else Fromar4(P + 2, J); K = J & 15; if (K != 15) Linenos = K; K = J >> 4 & 15; if (K != 15) Diags1 = K; K = J >> 8 & 15; if (K != 15) Checks = K; if (K != 15) Checksp = K & 14; K = J >> 12 & 15; if (K != 15) Unass = K; K = J >> 28; if (K != 15) Dcomp = K; goto L__1; Sw_32: Pop(Sbr[Level], J, K); if (J != -1) goto L__321; Fault(51); goto L__1; L__321: Pop(Cycle[Level], Jj, Kk); if (0 >= Jj) goto L__322; Fault(52); goto L__321; L__322: if (A[2] != 1) goto L__402; if (J != 1) Fault(47); P += 2; Kk = K; Mone = 0; R13 = 0; Setline(); if (A[P] == 9) Jj = Sflabel - 1; else Jj = Plabel - 1; Pj(15, Jj); Plab(Kk); Cui(2); Plab(-1); goto L__1; Sw_33:; if (Level < 2) Fault(56); Setline(); Crformat(); goto L__1; Sw_34:; { __label__ Scalar; __label__ L__1; auto void Testandset(void); Setline(); P++; Marker1 = P + A[P]; if (Level < 2) Fault(57); if (Nmdecs[Level]) Fault(40); Checkrf(); if (K == -1) goto L__1; Type = 3; Prec = 0; Rout = 0; if (A[P + 1] == 1) goto Scalar; if (A[P + 2] != 2) Fault(41); Nam = 0; Arr = 1; Pack(Ptype); P += 3; L__3401: Qq = P + 1; Pss(0xD2, 4, Wspr, 0, 4, 0); Cadcln(2); for (Q = 1; Q <= A[Qq]; Q++) { K = A[Q + Qq]; Testandset(); Ppj(13); Prx(0x90, 0, 3, Rbase, N); N += 16; } if (A[P] == 2) goto L__1; P++; Checkrf(); goto L__3401; Scalar: Cqn(P + 2); P += 3; J = 0; Pack(Ptype); for (Q = 1; Q <= A[P]; Q++) { K = A[P + Q]; Testandset(); if (Nam == 1) Pss(0xD2, 4, Rbase, N, Gla, 128); else Paclod(18, 2, Rbase << 12 | N); // = ST WSP,? - AH WSP,LENGTH - LA // WSP,7(WSP) - N WSP,=F'-8' N += 4; } goto L__1; void Testandset(void) { Testnst(); Jjj = Newcell(); Storetag(K, Jjj); Replaceboth(Jjj, Tags[A[Marker1]], N); } L__1:; } goto L__1; Sw_35:; P++; Marker1 = P + A[P]; if (A[P + 1] == 1) goto L__3801; Rout = 1; P += 2; Clt(); Arr = 2 - A[P + 1]; Nam = (A[P + 2] - 1) << 1; Pack(Ptype); goto L__3802; L__3801: Ptype = 11000; L__3802: J = 0; for (Kk = 1; Kk <= A[Marker1]; Kk++) { K = A[Marker1 + Kk]; Testnst(); Ophead = 0; Push(Ophead, N, 1000); Storetag(K, Ophead); N += 40; } goto L__1; Sw_36:; P++; Marker1 = P + A[P]; Checkrf(); if (K == -1) goto L__1; P++; Copytag(A[P]); if (A[P + 1] == 1) goto L__3910; if (Type == 3 && Nam == 1) goto L__3902; L__3901: Fault(63); goto L__1; L__3902: From1(K, Q); if (Q) Fault(63); Replace1(K, Tags[A[Marker1]]); goto L__1; L__3910:; P += 2; K = Displacement(Tags[A[P - 2]]); if (K == -1) goto L__3901; goto L__3902; Sw_37: goto L__1; void Cend(int Kkk) { __label__ L__99; int Dptr; int Lnum; int W1; int W2; int Dd[301 /*0:300*/]; Setline(); R13 = 0; Mone = 1; L__1: Fromlist(Sbr[Level], J, K); if (J == -1) goto L__2; Fault(53); A[2] = 32; A[3] = 2; Css(2); goto L__1; L__2: Filljumps(Level); if (N > Nmax) Nmax = N; Pop(Jump[Level], J, K); if (J == -1) goto L__3; if (K >= Sflabel) goto L__2; Fault(11); if (K < 16384) Write(K, 4); else Printname(K - 16384); goto L__2; L__3: Clearlist(Label[Level]); Clearlist(Wsp[Level]); Clearlist(Lwsp[Level]); Clearlist(Mdarr[Level]); Clearlist( Strwsp[Level]); // CLEAR DECLARATIONS -PLANT DIAGNOSTICS IF REQUIRED if (!Diags1) goto L__10; Lnum = Lett[M[Level]]; Dd[0] = 0xC2C2C2C2; Dd[1] = L[Level] << 16 | Rbase << 8 | Lnum; Dptr = 3; if (Lnum) goto L__9; Dd[2] = L[Level - 1]; goto L__10; L__9: W1 = M[Level]; for (W2 = 1; W2 <= Lnum; W2++) { *Byteinteger(Addr(Dd[0]) + 7 + W2) = Lett[W1 + W2]; } Dptr += (Lnum - 1) >> 2; L__10: Pop(Name[Level], J, Jj); if (J == -1) goto L__20; Copytag(Jj); Pop(Tags[Jj], Kk, Kk); if (Ptype == 8) { Register[K] = 0; Uvarreg[K] = 0; } if (Inreg) Register[Inreg] = 0; if (J != 15) goto L__12; Fault(28); Printname(Jj); L__12: Ophead = K; if (Type == 4) goto L__13; if (Rout != 1 && Type != 3 && Type != 6 && Arr != 2) goto L__14; Clearlist(Ophead); goto L__10; L__13: Undcrf(Ophead); goto L__10; L__14: if (Type != 1 && Type != 2 && Type != 5) goto L__10; if (Arr != 0 || Diags1 != 1 || Rout != 0) goto L__10; if (Dptr > 297) goto L__10; Q = Word[Jj]; Lnum = Lett[Q]; if (Lnum > 8) Lnum = 8; Ptype = Nam << 6 | Prec << 3 | Type; Dd[Dptr] = Ptype << 24 | I << 20 | K << 8 | Lnum; for (W1 = 1; W1 <= Lnum; W1++) *Byteinteger(Addr(Dd[Dptr]) + W1 + 3) = Lett[W1 + Q]; Dptr = Dptr + 1 + ((Lnum + 3) >> 2); goto L__10; L__20: if (!Diags1) goto L__21; Dd[Dptr] = -1; Lput(4, (Dptr << 2) + 4, Sstl, Addr(Dd[0])); Sstl = Sstl + (Dptr << 2) + 4; // CHECK CYCLE-REPEATS L__21: if (!Cycle[Level]) goto L__22; From2(Cycle[Level], J); if (!J) goto L__22; Pop(Cycle[Level], I, I); Fault(13); goto L__21; L__22: // GARBAGE COLECT DICTIONARY Next = Rnext[Level]; for (W1 = 0; W1 <= Nnames; W1++) if (Word[W1] > Next) Word[W1] = 0; // PLANT ANY NECESSARY Code Nmax = (Nmax + 7) & (-8); if (Nmax > 4092) Fault(99); if (Kkk >= 10000 || Kkk == 1) Plug(Set[Rlevel], Nmax); if (Kkk == 10000) goto L__23; if (!Kkk) goto L__24; if (Kkk > 10000 && Compiler == 0) { Pconst(0x4100000B); Ppj(21); } if (Kkk == 1) Ppj(6); goto L__30; L__23: P++; A[P] = 5; Cui(0); goto L__30; L__24: Jj = 0xFFF & Ral[Level - 1]; Prx(0x98, 10, 11, Rbase, Jj); if (Diags1 == 1) Pss(0xD2, 4, Gla, 20, Rbase, Jj + 8); L__30: if (Kkk == 2) goto L__99; Newline(); if (Printmap == 1 && List == 1 && Kkk != 0) { printf("%s", " LOCALS EXTEND TO "); Write(Nmax, 2); Newline(); } if (List) goto L__31; Write(Line, 5); Spaces(3 * Level - 3); printf("%s", "END"); L__31: if (Level > 2 || Perm == 1 || Cprmode == 2) goto L__33; if (Kkk == 1) goto L__32; Fault(14); A[1] = 13; goto L__99; L__32: Kkk = 2; L__33: Level--; if (Kkk >= 10000) Rlevel--; Rbase = 10 - Rlevel; Register[9 - Rlevel] = 0; N = Ral[Level]; Sbflag = N >> 15 & 1; if (Kkk >= 10000) Nmax = N >> 16; N = N & 4095; if (Kkk == 2) goto L__2; if (Rlevel == 1 && Cprmode == 2) goto L__99; if (Kkk == 0 || Compiler == 1) goto L__99; From2(Jump[Level], J); Plab(J); L__99:; } void Crspec(unsigned char M) { __label__ L__99; int Pp; int Kk; int Jj; int Jjj; int Q; int Typep; if (M == 3) goto L__12; Pp = P; if (M != 2) goto L__2; Kk = A[P]; P++; Copytag(Kk); if (Oldi == Level && 10006 != Ptype && Ptype >= 10000) goto L__1; Fault(3); goto L__99; L__1: Fromlist(K, Jj, Q); Ophead = K; if (Q == 1000) goto L__12; goto L__10; L__2: if (A[Pp + 1] == 2) goto L__3; Typep = 10000; P = Pp + 3; goto L__4; L__3: Rout = 1; Arr = 0; P = Pp + 2; Clt(); Nam = (A[P] - 1) * 2; Pack(Typep); P += 2; L__4: Kk = A[P]; Copytag(Kk); if (Oldi != Level) goto L__11; if (Ptype == Typep || abs(Ptype - Typep) == 1000) goto L__1; L__10: Fname = Kk; if (Ptype != 7) Fault(7); if (M == 2) goto L__99; L__11: Jj = Nr; Nr++; Ra[Jj] = 4 * N0; N0++; if (Nr > Nrouts) Fault(109); Ophead = Newcell(); J = 15; Ptype = Typep; Storetag(Kk, Ophead); L__12: Jjj = Ophead; Q = 0; if (A[P + 1] == 2) goto L__24; L__13: P += 2; Compileformalparameter(); for (Pp = 1; Pp <= A[P]; Pp++) { Kk = 0; if (Ptype == 5) Kk = Acc; Insertafter(Ophead, Ptype, Kk); Q++; } P = P + Pp + 1; if (A[P] == 1) goto L__13; L__24: Replace2(Jjj, Q); if (M == 3) goto L__99; Replace1(Jjj, Jj); L__99:; } void Compileformalparameter(void) { static int Fpd_sw; static void *Fpd[5 /*1:5*/] = { &&Fpd_1, &&Fpd_2, &&Fpd_3, &&Fpd_4, &&Fpd_default, }; goto *Fpd[Fpd_sw = (A[P]) - 1]; Fpd_1:; Acc = 16; Rout = 1; Nam = 1; Arr = 0; if (A[P + 1] != 1) goto L__1; Prec = 0; Type = 0; P += 3; goto L__98; L__1: P += 2; Clt(); Nam = 2 * (A[P] - 1) + 1; P += 2; Acc = 16; goto L__98; Fpd_2:; P++; Clt(); Cqn(P); Rout = 0; if (Type == 5 && Acc == 0) Fault(70); P++; goto L__98; Fpd_3:; Type = 0; L__31: Nam = 1; Arr = 2 - A[P + 1]; Rout = 0; Acc = 4 + 12 * Arr; Prec = 0; P += 2; goto L__98; Fpd_4: Type = 3; goto L__31; L__98: Pack(Ptype); goto Fpd_skip; Fpd_default: fprintf(stderr, "Switch label 'Fpd(%d):' not set in %s", Fpd_sw + 1, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Fpd_skip:; } void Assign(int P1, int P2) { int Q; int Assop; int Kk; int Reg; int Precp; int Z; int Zp; int Typep; int Jjj; static int Sw_sw; static void *Sw[4 /*1:4*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, }; static int S_sw; static void *S[16 /*0:15*/] = { &&S_0, &&S_1, &&S_2, &&S_3, &&S_4, &&S_5, &&S_6, &&S_7, &&S_8, &&S_default, &&S_10, &&S_11, &&S_12, &&S_default, &&S_14, &&S_default, }; Assop = A[P2]; goto *Sw[Sw_sw = (Assop)-1]; Sw_2: Sw_3: Copytag(A[P1 + 1]); P = P2 + 1; if (Type == 8) goto Regvar; if (Rout == 1) goto Maps; if (Type == 2) goto L__34; if (Type == 5) goto L__50; if (Type == 3) goto L__35; if (Nam == 0 && Type == 1 && Arr == 0) goto L__32; L__33: P = P2 + 1; Kk = 0; if (Arr != 0 || Rout != 0 || 1 < Type) Kk = 4; L__36: if (Kk == 4 && Register[4] != 0) Kk = 14; Csexp(Kk, 1); Reg = Nest; Kk = P; if (!Register[Reg]) Register[Reg] = 1; P = P1 + 1; Cname((Assop - 1) * (Assop - 1), Reg); if (Register[Reg] > 0) Register[Reg] = 0; L__30:; P = Kk; if (A[P] == 1 && 1 == Qu) Cquery(Reg); P++; goto L__1; L__31: printf("%s", " CRUNCH "); _imp_monitor(0); exit(0); L__32: if (Rout == 1 || A[P1 + 2] == 1 || A[P1 + 3] == 1) goto L__33; if (Unass == 1) goto L__33; Precp = Prec; Typep = Ptype; Kk = K; Reg = I; Q = Tsexp(Jjj); Ptype = Typep; Unpack(); if (Q == 0 || A[P] == 1 && 1 == Qu) goto L__33; if (10 <= Q && Q <= 12 && Q - 10 == Precp) goto L__37; if (Q != 1 || Precp != 1) goto L__33; Psi(0x92, Jjj, Reg, Kk); P++; goto L__1; L__37: Pss(0xD2, Bytes[Precp], Reg, Kk, I, K); P++; goto L__1; L__34: Q = 2; if (Prec == 3) Q = 3; if (A[P1 + 2] == 1) { P = P1 + 2; Fflag = 0; Skipapp(); if (Fflag) goto L__55; P = P2 + 1; } Csexp(0, Q); Kk = P; Freg[Nest] = 1; Reg = Nest; P = P1 + 1; Cname(1, Nest); Freg[Reg] = 0; goto L__30; L__35: P = P1 + 1; Q = Copyrecordtag(); P = P2 + 1; if (Type != 2 && Type != 5) Type = 1; if (Type == 5) goto L__50; Kk = 4; if (Type == 1) goto L__36; goto L__34; L__50: Cstrexp(4); Kk = P; Register[4] = 1; P = P1 + 1; Cname(REXP((Assop - 1), 2), 4); Register[4] = 0; Reg = 4; goto L__30; Maps: if (Ptype == 10006) { Type = Tsname[K]; Prec = Type >> 3; Type = Type & 7; } if (Type == 1) goto L__33; if (Type == 5) goto L__50; L__55: P = P2 + 1; Precp = Prec; Csexp(0, 2 + (Prec & 1)); Q = Parkf(Nest, 3); Kk = P; P = P1 + 1; Cname(3, 1); Dump(16, 0, Q, 0, Rbase); Dump(9 + 2 * Prec, 0, 0, 0, 1); Push(Lwsp[Level], 0, Q); goto L__30; Regvar: if (A[P1 + 2] != 2 || 2 != A[P1 + 3]) Fault(59); Kk = K; Csexp(Kk, 1); Register[Kk] = -1; if (A[P] == 1 && 1 == Qu) Cquery(Reg); P++; goto L__1; Sw_4:; P = P1 + 1; Cname(2, 1); P = P2 + 1; Cres(0, 0); P++; goto L__1; Sw_1:; P = P1 + 1; Copytag(A[P]); if (I == -1) goto L__9; Q = 1; if (Type == 3) Q = Copyrecordtag(); if (!Q) goto L__201; if (A[P2 + 1] != 4 || A[P2 + 2] != 1) Fault(81); if (Rout == 1) goto L__101; Nest = 4; goto *S[S_sw = ((Nam & 2) + Arr) << 2 | (Nam & 1) * 2 | (2 - A[P + 1])]; L__9: Fname = A[P]; Fault(16); S_0: S_1: S_3: S_4: S_5:; S_7: S_8: S_10: S_11: S_12:; L__10: Fault(82); P = P2 + 1; Skipexp(); P++; goto L__1; S_2:; Z = 3; Zp = 6; L__12: P = P2 + 3; Cname(Z, 4); if (A[P] != 2) goto L__10; Precp = Prec; Typep = Type; Kk = P + 2; P = P1 + 1; Cname(Zp, 4); L__14:; P = Kk; if (Prec == Precp && Type == Typep) goto L__1; Fault(83); goto L__1; S_6:; S_14:; Z = 12; Zp = 11; goto L__12; L__201:; if (Arr == 1 && Nam == 1 && A[P + 1] == 2) goto *S[S_sw = 6]; Z = 15; Zp = 14; goto L__12; L__101: P = P1 + 1; Cname(13, 1); Precp = Prec; Typep = Type; Jjj = K; if (J != 0 || Nam != 1) goto L__10; Reg = Findpp(); if (!Reg) goto L__31; Dump(0, Reg, Disp, Index, Base); P = P2 + 3; Cname(13, 1); if (Base == Gla && J == 0) goto L__102; Pss(0xD2, 16, Reg, 0, Base, Disp); if (J == 14) goto L__103; L__110: Register[Reg] = 0; Kk = P + 2; From2(Jjj, Z); From2(K, Zp); if (Z != Zp) Fault(83); goto L__14; L__102: Dump(2, 2, Disp, Index, Base); Prx(0x5A, 2, 0, Gla, 28); Pconst(0x180C181D); Prr(0x18, 3, Reg); Prx(0x90, 0, 9, Reg, 0); goto L__110; L__103: Prx(0x50, 9, 0, Reg, 12); goto L__110; L__1:; goto S_skip; S_default: fprintf(stderr, "Switch label 'S(%d):' not set in %s", S_sw, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; S_skip:; } void Cui(unsigned char Code) { int Kk; int Jj; int Qq; static int Sw_sw; static void *Sw[11 /*1:11*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5, &&Sw_6, &&Sw_7, &&Sw_8, &&Sw_9, &&Sw_10, &&Sw_11, }; goto *Sw[Sw_sw = (A[P]) - 1]; Sw_1: P++; Marker1 = P + A[P]; if (A[Marker1] == 1) goto L__3; P++; Cname(0, 0); P++; goto L__1; L__3: Assign(P, Marker1 + 1); goto L__1; Sw_2:; Nmdecs[Level] = 1; Copytag(A[P + 1]); Ptypep = Ptype; Kk = K; P += 2; if (Oldi == Level && Type == 6) goto L__200; Fault(4); Skipexp(); goto L__1; L__200: Csexp(1, 1); Ptype = Ptypep; Unpack(); Fromlist(Kk, Qq, Jj); Qq -= Codebase[Level]; if (!Checksp) goto L__205; L__201: Loadad(2, 10, 0, Qq); Ppj(7); goto L__1; L__205: Jj = 8 + Qq - Jj * Bytes[Prec]; if (0 > Jj || Jj > 4095) goto L__201; if (!Prec) goto L__210; Plant(0x1A11); Kk = 0x48; L__207: Prx(Kk, 1, 1, 10, Jj); Pconst(0x47F1A000); goto L__1; L__210: Pconst(0x89100002); Kk = 0x58; goto L__207; Sw_3:; Nmdecs[Level] = 1; K = A[P + 2] + ((A[P + 1] - 1) << 14); Pj(Mask, K); P += 3; goto L__1; Sw_4:; K = (A[P + 1] + 2) / 2; P++; Ppj(30); for (Kk = 1; Kk <= K; Kk++) { Plant(A[P] << 8 | A[P + 1]); P += 2; } goto L__1; Sw_5:; if (Flag[Level] != 10000 && Perm != 1) Fault(30); P++; L__6: if (Diags1 == 1) Pss(0xD2, 4, Gla, 20, Rbase, 0); // CHECK FOR REGISTER VARS & UPDATE CORE COPY for (Kk = 5; Kk <= 8; Kk++) if (0 != Uvarreg[Kk] && Uvarreg[Kk] < Level) Prx(0x50, Kk, 0, Rbase, Kk << 2); Prx(0x98, 4, 15, Rbase, 16); R13 = 0; Prr(7, 15, Link); goto L__1; Sw_6:; P++; Kk = Flag[Level]; if (Kk <= 10000) Fault(31); if (Kk == 10002) goto L__61; if (Kk == 10032) goto L__62; if (Kk == 10005) goto L__63; Csexp(1, 1); goto L__6; L__61: Csexp(2, 2); goto L__6; L__62: Csexp(2, 3); goto L__6; L__63: Cstrexp(1); goto L__6; Sw_7: Sw_8:; Ppj(6 * (A[P] - 6)); P++; goto L__1; Sw_9: Sflabel--; Push(Sbr[Level], Code, Sflabel); Push(Cycle[Level], 0, 0); goto L__1; Sw_11:; Kk = 2 - A[P + 1]; P += 2; Psi(0x92, Kk, Gla, 1); goto L__1; Sw_10: Ppj(31); P++; L__1:; } void Crformat(void) { int Lengthp; int Qqq; int Rep; int Code; K = A[P + 1]; Testnst(); J = 0; Ptype = 4; Ophead = Newcell(); Jjj = Ophead; Storetag(K, Jjj); P = 3; Q = 0; Inc = 4; Incp = 0; if (A[P] == 2) goto L__101; L__1: P++; Compileformalparameter(); Lengthp = Acc - 1; if (Acc > 8) Lengthp = 3; L__2: if (!(Incp & Lengthp)) goto L__3; Incp++; goto L__2; L__3: for (Rep = 1; Rep <= A[P]; Rep++) { P++; Code = 255; Lengthp = Acc; if (Rout == 1) goto L__11; if (Type == 3) goto L__12; Qqq = Incp; if (Type != 5) goto L__4; Code = 250; Lengthp = Acc - 1; Qqq = Inc; L__4: Insertafter(Ophead, Ptype << 4 | A[P] << 20, Qqq); Psi(0x92, Code, Rbase, N + Inc); Psi(0x92, Lengthp, Rbase, N + Inc + 1); Q++; Inc += 4; Incp += Acc; goto L__15; L__11: Qqq = Newcell(); Replaceboth(Qqq, Incp, 100); if (Ptype != 11000) Fault(41); Acc = 40; Lengthp = Acc; goto L__4; L__12: Qqq = Newcell(); Replaceboth(Qqq, 0, Incp); goto L__4; L__15:; } P++; if (A[P] == 2) goto L__101; P++; goto L__1; L__101: P++; L__102: if (A[P] == 2) goto L__201; P += 2; Clt(); Nam = 2 * (2 - A[P]); if (Nam) Acc = 4; P++; Rout = 0; Arr = 1; Pack(Ptype); L__103:; Psi(0x92, 0, Rbase, N + Inc); Dump(1, Wspr, N + Inc + 8, 0, Rbase); Qq = P; Cadcln(1); Jj = P; P = Qq + 2; Rep = P + A[P - 1]; L__105: Insertafter(Ophead, J | Ptype << 4 | A[P] << 20, Inc); Inc += 16; Q++; P++; if (P == Rep) goto L__106; Pss(0xD2, 16, Rbase, N + Inc, Rbase, N + Inc - 16); goto L__105; L__106: P = Jj + 2; if (A[P - 1] == 1) goto L__103; goto L__102; L__201: Replaceboth(Jjj, N, Q); Prx(0x41, 1, 0, 0, Q); Dump(5, 1, N, 0, Rbase); Dump(0, 1, N, 0, Rbase); Ppj(25); N += Inc; } void Cadcln(unsigned char Mode) { int Q; int Qq; int Kk; int S; int Jj; int Jjj; Q = P; Ptypep = Ptype; L__1: P = A[Q + 1] + Q + 1; Kk = 0; if (Mode == 1) goto L__4; Prx(0x50, Wspr, 0, Gla, 36); if (Unass == 1) Psi(0x92, 1, Gla, 36); L__4: P += 2; Jj = P; Kk++; Skipexp(); Qq = Tsexp(Jjj); P = Jj; if (!Qq) Csexp(4, 1); else Csexp(1, 1); Register[4] = 1; Csexp(2, 1); Register[4] = 0; if (!Qq) Prr(0x18, 1, 4); if (Kk != 1) goto L__41; S = 1; if (Mode != 2) { S = 0; Prx(0x41, 0, 0, 0, Acc); } Prx(0x90, S, 2, Wspr, 4 * S); Psi(0x92, 3 - A[P], Wspr, 1); Mover(Wspr, 16); goto L__42; L__41: S = (Kk & 1) << 2; if (!S) Jjj = 8 * A[P]; else Jjj = 16; Prx(0x90, 1, 2, Wspr, S); Mover(Wspr, Jjj); L__42: if (A[P] == 1) goto L__4; if (Kk <= 2) goto L__5; if (Kk > 6) Fault(37); Paclod(27, 3, Kk); L__5: Qq = Q + 1; J = Kk; Ptype = Ptypep; if (Mode >= 1) goto L__9; for (Jjj = 1; Jjj <= A[Qq]; Jjj++) { K = A[Qq + Jjj]; Testnst(); J = Kk; Storetag(K, N); Ppj(13); Prx(0x90, 0, 3, Rbase, N); N += 16; } Q = P + 2; if (A[Q - 1] == 1) goto L__1; L__9:; } void Cvdecln(void) { int Lb; int Ub; int Adv; int Q; int Qq; int Range; int Jjj; int Kk; int Disp0; int Disp1; Q = P; P = A[Q + 1] + Q + 2; Cbpair(Lb, Ub); Adv = N0; St[N0] = 1 << 16 | Acc; St[N0 + 1] = Lb; St[N0 + 2] = Ub; Range = Ub - Lb + 1; St[N0 + 3] = Range; N0 += 4; if (Lb > Ub) Fault(44); Prx(0x41, 2, 0, Gla, Adv << 2); Prx(0x41, 3, 0, 0, Range); Qq = Q + 1; J = 1; for (Jjj = 1; Jjj <= A[Qq]; Jjj++) { N = (N + 7) & (-8); Disp1 = N + 16; Disp0 = Disp1 - Lb * Acc; if (0 >= Disp0 || Disp0 >= 4095) Fault(44); Kk = Newcell(); Replaceboth(Kk, Disp0, N); Prx(0x41, 0, 0, Rbase, Disp0); Prx(0x41, 1, 0, Rbase, Disp1); K = A[Qq + Jjj]; Testnst(); Storetag(K, Kk); Prx(0x90, 0, 3, Rbase, N); if (Unass == 1) Set80(Disp1, Acc * Range); N = Disp1 + Acc * Range; } P++; if (A[P - 1] == 1) Cvdecln(); N = (N + 3) & (-4); } void Csexp(int Reg, unsigned char Mode) { // MODE=1 FOR %INTEGER, =2REAL, // =3LONG,=0INTEGER %IF PNS __label__ L__99; int C; int D; int Qp; int Nop; int X; int Jj; int Opcode; int Evaluate; int Opnd; short Ophead; unsigned char Real; unsigned char Longreal; unsigned char Realop; int Operator; int Nops; int Lastop; int Bs[1+2 /*1:2*/]; int Pt[1+2 /*1:2*/]; int Dp[1+2 /*1:2*/]; int Op[6 /*0:5*/]; int Opprec[6 /*0:5*/]; auto void Test(int N); auto void Plant(int A, int B, int C); auto int Findr(void); auto void XLoad(int *N, int Reg, int Mode); #define Load(N, Reg, Mode) XLoad(&N, Reg, Mode) auto void Printorders(void); static int N0 = 1024; Qp = 0; Ophead = 0; Opcode = 0; Real = 0; Longreal = 0; Realop = 0; Nops = 0; Lastop = 0; { __label__ L__99; static int S_sw; static void *S[4 /*1:4*/] = { &&S_1, &&S_2, &&S_3, &&S_4, }; static int Sw_sw; static void *Sw[4 /*1:4*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, }; Aflag = 0; Nop = N0; Op[0] = 0; Opprec[0] = 0; goto *S[S_sw = (A[P]) - 1]; S_2:; Op[1] = 11; L__101: Opprec[1] = 2 + Op[1] / 6; Qp = 1; goto L__1; S_3: Op[1] = 23; goto L__101; S_1: S_4: L__1:; Opnd = A[P + 1]; P += 2; Qp++; goto *Sw[Sw_sw = (Opnd)-1]; Sw_1:; Copytag(A[P]); if (Type == 8) goto Regvar; if (Type == 3 && Arr == 0 && Inreg != 0) goto L__19; if (Arr == 2 && A[P + 1] == 1) goto L__171; if (1 <= Type && Type <= 2 && Arr == 0 && Rout == 0 && A[P + 1] == 2 && 2 == A[P + 2]) goto L__17; L__10:; if (Type != 1 && (Rout != 1 || Type != 6 || (Tsname[K] & 7) != 1)) goto L__14; C = P; if (Qp > 1) goto L__11; P++; Skipapp(); if (A[P] != A[P + 1] || A[P + 1] != 2) goto L__11; P = C; C = Reg; if (Reg <= 0) { C = Findr(); Register[C] = 0; } Cname(2, C); Nest = C; goto L__80; L__11: P = C; C = Findpp(); if (!C) goto L__14; Cname(2, C); Nest = C; if (Qp == 1 && A[P] == 2) goto L__80; P++; L__12: St[N0] = 9; St[N0 + 1] = C; N0 += 3; Register[C] = 1; goto L__50; L__14: // OPERAND MUST BE FETCHED AND STORED Cname(2, 2); Nest = 2; if (Type == 5) { Fault(42); Type = 1; } if (Type == 2) Freg[2] = 1; else Register[2] = 1; Nam = 0; Arr = 0; Rout = 0; if (Prec == 3) Longreal = 1; if (Qp == 1 && A[P] == 2) goto L__80; L__16: if (Type == 1) goto L__15; Real = 1; if (Prec == 3) Longreal = 1; if (A[P] == 2) goto L__161; C = Parkf(Nest, Prec); Freg[Nest] = 0; L__13: St[N0] = 10; P++; St[N0 + 1] = Rbase | (Type | Prec << 3 | Nam << 6) << 8; St[N0 + 2] = C; N0 += 3; goto L__50; L__161: St[N0] = 8; St[N0 + 1] = Nest + 512 + (Prec << 11); Freg[Nest] = 1; N0 += 3; P++; goto L__50; L__15: C = Nest; C = Park(Nest); if (Nest != C) Register[Nest] = 0; if (C > 0) goto L__18; C = abs(C); Prec = 0; goto L__13; L__18: P++; goto L__12; L__17: // OPND HAS BASE REGISTER COVER St[N0] = 2; St[N0 + 1] = I | (Type | Prec << 3 | Nam << 6) << 8; St[N0 + 2] = K; P += 4; N0 += 3; if (Type == 2) Real = 1; if (Prec == 3) Longreal = 1; if (Unass != 1 || (Prec != 0 && Prec != 3)) goto L__50; if (Nam == 1) goto L__50; Pss(0xD5, Bytes[Prec], I, K, Gla, 128); Prx(0x47, 8, 0, Coder, 40); goto L__50; L__171: if (A[P + 2] != 4 || A[P + 3] != 2 || A[P + 4] != 9) goto L__10; if (A[P + 5] >= 256 || A[P + 6] != 2 || A[P + 7] != 2 || 2 != A[P + 8]) goto L__10; From1(K, C); C += Bytes[Prec] * A[P + 5]; if (0 >= C || C >= 4096) goto L__10; K = C; P += 6; goto L__17; L__19: if (A[P + 1] != 2 || A[P + 2] != 1) goto L__14; P += 3; From1(K, Fname); I = Inreg; K = Displacement(Fname); if (I == -1) goto L__191; Unpack(); if (Arr == 0 && Rout == 0 && 1 <= Type && Type <= 2 && A[P + 1] == 2 && 2 == A[P + 2]) goto L__17; L__191: P -= 3; goto L__14; Regvar: if (A[P + 1] != 2 || 2 != A[P + 2]) goto L__14; P += 4; St[N0] = 9; St[N0 + 1] = K; N0 += 3; goto L__50; Sw_2:; C = A[P]; St[N0 + 1] = P; St[N0 + 2] = A[P + 1]; if ((C & 7) == 2) goto L__24; if (C == 5) { Fault(42); P = P + (A[P + 1] & 0xFE) + 1; C = 9; } if (C <= 8) goto L__22; St[N0] = 0; L__21: N0 += 3; P += 3; goto L__50; L__22: St[N0] = 1; P++; goto L__21; L__24: Real = 1; P += 2; goto L__22; Sw_3: Sw_4:; D = 0; if (Mode == 1 || Lastop == 12) D = 1; Csexp(0, D); if (Opnd != 4) goto L__32; D = 16 * Type; if (Type == 2 && Prec == 0) D = 48; Prr(D, Nest, Nest); L__32: if (Prec == 3) Longreal = 1; if (Qp == 1 && A[P] == 2) goto L__80; goto L__16; L__50: // DEAL WITH Operator if (A[P - 1] == 2) goto L__60; Operator = A[P]; if (Operator == 12) { Fault(42); Operator = 2; } if (Operator == 13) Operator = 6; if (Operator == 1 || Operator == 8) Realop = 1; if (Operator == 1) Operator = 12; Nops++; Lastop = Operator; C = Precedence[Operator]; L__51: if (C > Opprec[Qp - 1]) goto L__52; Qp--; St[N0] = Op[Qp]; N0 += 3; goto L__51; L__52: Op[Qp] = 10 + Operator; Opprec[Qp] = C; goto L__1; L__60: // - END OF EXPRESSION for (Jj = Qp - 1; Jj >= 0; Jj--) { St[N0] = Op[Jj]; N0 += 3; } if (Mode != 1 && Realop == 1) Real = 1; if (Real == 1) goto L__70; // - CAN EVALUATE AS Integer Printorders(); L__61: if (Mode >= 2) goto L__71; L__72: D = 1; if (0 >= Reg) Reg--; if (Real != 0 || 0 <= Reg || Dp[1] >= 0 || Register[Bs[1]] >= 0) Load(D, Reg, Real); Nest = Bs[1]; if (Real == 1) Freg[Nest] = 0; else if (Register[Nest] > 0) Register[Nest] = 0; Ptype = 1 + 30 * Longreal + Real; N0 = Nop; Unpack(); goto L__99; L__70: // EVALUATE AS Real if (Mode == 1) Fault(24); if (Mode == 3) Longreal = 1; Evaluate = 16 * Longreal; Printorders(); goto L__72; L__71: if (Mode == 3) Longreal = 1; Real = 1; Evaluate = 16 * Longreal; goto L__72; L__80: // SINGLE OPERAND EXPRESSION Bs[1] = Nest; Dp[1] = -1; Pt[1] = Prec << 3 | Type; Aflag = 0; P++; if (Type == 2 && Mode == 1) Fault(24); if (Type == 1) goto L__61; goto L__71; L__99:; } goto L__99; int Findr(void) { int I; if (0 >= Reg) goto L__2; I = Reg; if (!Register[I]) goto L__1; L__2: for (I = 1; I <= Rbase - 1; I++) if (!Register[I]) goto L__1; Fault(241); L__1: Register[I] = 1; return (I); } int Findpr(void) { int I; for (I = 0; I <= 6; I += 2) if (Register[I] == 0 && Register[I + 1] == 0) goto Found; Fault(242); Found: Register[I] = 1; Register[I + 1] = 1; return (I); } int Findfr(void) { int I; for (I = 6; I >= 0; I -= 2) if (!Freg[I]) goto L__1; Fault(242); L__1: Freg[I] = 1; return (I); } void XLoad(int *N, int Reg, int Mode) { __label__ L__99; int I; int X; int *Bsi; int *Dpi; int *Pti; I = *N; if (I) goto Nochoice; I = 1; if (Dp[1] < 0 && Register[Bs[1]] >= 0) goto Chosen; I = 2; if (Dp[2] < 0 && Register[Bs[2]] >= 0) goto Chosen; if (Mode == 0 && (Pt[2] == 255 || (Pt[2] & 24) == 8)) goto Chosen; if (Mode == 1 && ((Pt[2] & 7) == 1 || (Evaluate > 0 && (Pt[2] & 24) == 0))) goto Chosen; I = 1; Chosen: *N = I; Nochoice: Bsi = &Bs[I]; Dpi = &Dp[I]; Pti = &Pt[I]; if (Mode == 0 && *Pti == 255) goto Shortconst; if (Mode == 1 || (*Pti & 64) != 0) Test(I); if (*Dpi < 0) goto Inreg; if (Reg >= 0) goto Nofind; if (!Mode) Reg = Findr(); else Reg = Findfr(); Nofind: X = (Mode << 3 | (*Pti >> 2 & 6)) + 2; Dump(X, Reg, *Dpi, 0, *Bsi); goto L__98; Inreg: if (Mode == 1) goto L__90; if (*Bsi == Reg) goto L__99; if (Register[*Bsi] < 0) goto Locked; if (0 > Reg) goto L__99; Register[*Bsi] = 0; Swop: Prr(0x18, Reg, *Bsi); goto L__98; Locked: if (0 > Reg) Reg = Findr(); goto Swop; L__90: if (!*Bsi) goto L__91; if (*Bsi == Reg || 0 > Reg) goto L__99; L__91:; if (0 > Reg) Reg = Findfr(); Prr(0x38 - Evaluate, Reg, *Bsi); Freg[*Bsi] = 0; goto L__98; Shortconst: if (0 > Reg) Reg = Findr(); Dump(0, Reg, *Dpi, 0, 0); L__98: *Bsi = Reg; *Dpi = -2; L__99:; } void Plant(int Opcode, int R1, int R2) { __label__ L__99; int Bsr2; Bsr2 = Bs[R2]; R1 = Bs[R1]; if (Dp[R2] < 0) goto Rrop; if ((Pt[R2] & 24) == 16 && 0x5A <= Opcode && Opcode <= 0x5B) Opcode -= 16; Prx(Opcode, R1, 0, Bsr2, Dp[R2]); goto L__99; Rrop: Prr(Opcode - 64, R1, Bsr2); if (Real == 1) Freg[Bsr2] = 0; if (Real == 0 && Register[Bsr2] > 0) Register[Bsr2] = 0; L__99:; } void Test(int N) { // INSPECTS OPERAND - MAKES TYPE CONVERSIONS ETC. int X; int *Lbase; int *Ldisp; int *Lptype; unsigned char Lprec; Lptype = &Pt[N]; Ldisp = &Dp[N]; Lbase = &Bs[N]; Lprec = *Lptype >> 3 & 3; if (*Lptype == 255) goto Shortconst; if (!(*Lptype & 64)) goto Start; Rp13 = R13; R13 = *Lbase << 12 | *Ldisp; if (R13 != Rp13) Prx(0x58, Link, 0, *Lbase, *Ldisp); *Lptype = *Lptype & 31; *Lbase = Link; *Ldisp = 0; Start: if (Real) goto Floating; if (Lprec == 0 || (Lprec == 2 && 12 <= Opcode && Opcode <= 13)) goto Finish; Pickup: Load(N, -1, 0); Lprec = 0; goto Finish; Shortconst: Lprec = 0; if (!Real) goto Pickup; if (0 <= *Ldisp && *Ldisp <= 2) goto Ingla; A[-2] = 9; A[-1] = *Ldisp; *Ldisp = Sortconst(-2, Longreal, 2); L__1: *Lbase = Gla; goto Finish; Ingla: *Ldisp = 8 * *Ldisp + 40; goto L__1; Floating: if ((*Lptype & 7) == 1) goto Floatit; if (Lprec == 3 || Evaluate == 0) goto Finish; // MUST STRETCH A 32 BIT Real if (*Ldisp < 0) Freg[*Lbase] = 1; X = Findfr(); Prr(0x2B, X, X); if (*Ldisp < 0) { Prr(0x38, X, *Lbase); Freg[*Lbase] = 0; } else Prx(0x78, X, 0, *Lbase, *Ldisp); *Lbase = X; *Ldisp = -2; goto Finish; Floatit: Load(N, 1, 0); Ppj(43); Register[1] = 0; *Lbase = 0; *Ldisp = -2; Finish: *Lptype = (1 + Real) | Lprec << 3; if (Longreal == 1 && Real == 1) *Lptype = *Lptype | 24; } void XMult(int *Result) { #define Mult(Result) XMult(&Result) __label__ L__99; int I; int K; for (I = 1; I <= 2; I++) { if (Pt[I] == 255 && Dp[I] == 2) goto L__30; if (Dp[I] < 0 && Register[Bs[I]] >= 0) goto L__1; L__5:; } I = 1; K = Findpr(); Load(I, K + 1, 0); goto L__11; L__1: if ((Bs[I] & 1) == 1 && I > 0 && Register[Bs[I] - 1] == 0) goto L__14; if ((Bs[I] & 1) == 0 && Register[Bs[I] + 1] == 0) goto L__12; goto L__5; L__12: K = Bs[I]; Register[K + 1] = 1; Prr(0x18, K + 1, K); goto L__13; L__14: Register[Bs[I] - 1] = 1; L__11: Bs[I] = Bs[I] - 1; L__13: Test(3 - I); Plant(0x5C, I, 3 - I); if (!Checksp) goto L__15; Prx(0x8F, Bs[I], 0, 0, 32); L__15: *Result = 257 + Bs[I] - Checksp; Register[Bs[I] + Checksp] = 0; Aflag = Checks; goto L__99; L__30: K = 3 - I; Load(K, -1, 0); Prr(0x1A, Bs[K], Bs[K]); Aflag = 1; *Result = 256 + Bs[K]; L__99:; } void XDiv(int *Result) { #define Div(Result) XDiv(&Result) int I; int K; if (Dp[1] < 0) goto L__3; L__1: K = Findpr(); L__2: I = 1; Load(I, K, 0); goto L__10; L__3: if ((Bs[1] & 1) == 0 && Register[Bs[1] + 1] == 0) goto L__4; K = Findpr(); goto L__2; L__4: if (Register[Bs[1]] < 0) goto L__1; Register[Bs[1] + 1] = 1; K = Bs[1]; L__10: Prx(0x8E, K, 0, 0, 32); Test(2); Plant(0x5D, 1, 2); if (!Checksp) goto L__20; if (Opcode == 17) goto L__20; Prr(0x12, K, K); Prx(0x47, 7, 0, Coder, 64); L__20: Register[K] = 0; Aflag = 0; *Result = K + 257; } void Printorders(void) { static int S_sw; static void *S[50 /*0:49*/] = { &&S_0, &&S_1, &&S_2, &&S_default, &&S_default, &&S_default, &&S_default, &&S_default, &&S_default, &&S_9, &&S_10, &&S_11, &&S_12, &&S_13, &&S_14, &&S_15, &&S_16, &&S_17, &&S_18, &&S_19, &&S_20, &&S_21, &&S_22, &&S_23, &&S_24, &&S_25, &&S_26, &&S_27, &&S_default, &&S_default, &&S_default, &&S_default, &&S_default, &&S_33, &&S_34, &&S_35, &&S_36, &&S_37, &&S_38, &&S_39, &&S_40, &&S_41, &&S_42, &&S_43, &&S_44, &&S_45, &&S_46, &&S_47, &&S_48, &&S_49, }; int C; int D; int Last; int Kk; Last = N0 - 6; for (Jj = Nop; Jj <= Last; Jj += 3) { __label__ L__99; Opcode = St[Jj]; if (10 >= Opcode || Opcode == 24) goto Skip; if (Opcode == 11 || Opcode == 23) Kk = 1; else Kk = 2; for (Kk = Kk; Kk >= 1; Kk--) { Pop(Ophead, C, Dp[Kk]); Pt[Kk] = C >> 8; Bs[Kk] = C & 15; } Skip: goto *S[S_sw = Opcode + 25 * Real]; S_0:; S_25:; D = 0xFF00; C = St[Jj + 2]; goto L__99; S_1:; C = Sortconst(St[Jj + 1], 0, 1); D = 256 + Gla; goto L__99; S_26:; D = 512 + Gla; if (Longreal == 1) D += 3 << 11; C = Sortconst(St[Jj + 1], Longreal, 2); goto L__99; S_2: S_27:; D = St[Jj + 1]; C = St[Jj + 2]; goto L__99; S_33:; D = St[Jj + 1]; C = -2; goto L__99; S_9: S_34:; D = 256 + St[Jj + 1]; C = -2; goto L__99; S_10: S_35:; C = St[Jj + 2]; D = St[Jj + 1]; if (Real == 1 && (D >> 8 & 24) == 24) Push(Lwsp[Level], 0, C); else Push(Wsp[Level], 0, C); goto L__99; S_11:; if (Pt[1] != 255 || Dp[1] != 1) goto L__109; Aflag = 0; D = 256 + Gla; C = 16; goto L__99; S_36:; L__109: C = 1; D = 0x13 + Real * (32 - Evaluate); Load(C, -1, Real); Aflag = 1; Prr(D, Bs[1], Bs[1]); L__111: D = (Real + 1 + 24 * Longreal) << 8 | Bs[C]; C = -2; goto L__99; S_23:; C = 1; Aflag = 2; Load(C, -1, 0); Prx(0x57, Bs[1], 0, Gla, 16); goto L__111; S_12: S_37:; Aflag = 1; D = 0x5A; L__125: C = 0; L__126: Load(C, -1, Real); Test(3 - C); D += Real * (0x20 - Evaluate); Plant(D, C, 3 - C); goto L__111; S_13: S_38:; Aflag = 1; D = 0x5B; C = 1; if (Real != 0 || Pt[2] != 255 || 1 > Dp[2] || Dp[2] > 2) goto L__126; Aflag = 0; Load(C, -1, 0); if (Dp[2] == 2) Prr(6, Bs[1], 0); Prr(6, Bs[1], 0); goto L__111; S_14: D = 0x57; L__141: Aflag = 2; goto L__125; S_15: D = 0x56; goto L__141; S_16: Mult(D); C = -2; goto L__99; S_17: S_18: Div(D); C = -2; goto L__99; S_19: D = 0x54; goto L__141; S_20: S_21:; D = 0; C = 1; Load(C, -1, 0); if (Pt[2] == 255) D = 1; C = 2; if (!D) Load(C, -1, 0); Prx(0x89 + Opcode - 21, Bs[1], 0, Bs[2], D * Dp[2]); if (!D) Register[Bs[2]] = 0; C = 1; Aflag = 0; goto L__111; S_22: for (C = 1; C <= 2; C++) { Load(C, -1, 0); Dump(1, Bs[C], 28 + 4 * C, 0, Gla); Register[Bs[C]] = 0; } if (Register[0]) goto L__221; C = 2; Aflag = 0; Register[0] = 1; Ppj(15); Bs[2] = 0; goto L__111; L__221: C = Findr(); D = Findr(); Prr(0x18, C, 0); Ppj(15); Prr(0x18, D, 0); Prr(0x18, 0, C); Register[C] = 0; C = 2; Aflag = 0; Bs[2] = D; goto L__111; S_39: S_40: S_42: S_44: S_45: S_46: S_48:; Fault(24); if (Opcode == 23) Opcode = 36; else Opcode = 37; goto *S[S_sw = Opcode]; S_41:; D = 0x5C; C = 0; L__410: Aflag = 0; goto L__126; S_43:; D = 0x5D; C = 1; goto L__410; S_47:; C = 1; Load(C, -1, 1); if (Pt[2] == 255 && Dp[2] == 2) goto L__222; Prr(0x38 - Evaluate, 0, Bs[1]); C = 2; if (Pt[2] != 255 && (Pt[2] & 7) > 1) Fault(39); Load(C, 1, 0); Ppj(36); Register[1] = 0; Prr(0x38 - Evaluate, Bs[1], 0); C = 1; goto L__111; L__222: Prr(0x3C - Evaluate, Bs[1], Bs[1]); C = 1; goto L__111; L__99: if (Jj != Last) Push(Ophead, D, C); S_24: S_49:; } Dp[1] = C; Pt[1] = D >> 8; Bs[1] = D & 15; goto S_skip; S_default: fprintf(stderr, "Switch label 'S(%d):' not set in %s", S_sw, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; S_skip:; } L__99:; } int Sortconst(int P, int Long, int Type) { double Cvalue; int I; int K; if (Type == 2) goto L__50; if ((A[P] & 7) != 1) Fault(24); if (A[P] == 9) I = A[P + 1]; else Fromar4(P + 1, I); L__40: K = N0; St[K] = I; N0++; return (K << 2); L__50: Cvalue = 0; if ((A[P] & 7) != 1) goto L__60; if (A[P] == 9) I = A[P + 1]; else Fromar4(P + 1, I); Cvalue = I; goto L__70; L__60: Fromar8(P + 1, Cvalue); L__70: if (Long) goto L__75; I = *Integer(Addr(Cvalue)); goto L__40; L__75: K = (N0 + 1) & (-2); St[K] = *Integer(Addr(Cvalue)); St[K + 1] = *Integer(Addr(Cvalue) + 4); N0 = K + 2; return (K << 2); } void Cstrexp(int Reg) { // EVALUATES STRING EXPR USING CURRENT // WORKAREA AND 1 SUBROUTINES LEAVES ADDR IN // REG -VE IF STRING MUST BE MOVED TO WK.ARREA __label__ L__99; int Jj; int Qq; int Kk; int Wkarea; int Pp; if (!Strinst) Setex(); Pp = P; Jj = Tsexp(Qq); if (Jj == 20 && Reg >= 0) goto L__71; P = Pp; Reg = abs(Reg); Wkarea = Getstrwsp(); Psi(0x92, 0, Rbase, Wkarea); if (A[P] == 4) goto L__2; L__1: Fault(71); L__4: P = Pp; Skipexp(); goto L__99; L__5: Fault(72); goto L__4; L__2: if (A[P + 1] == 2) goto L__10; if (A[P + 1] != 1) goto L__1; P += 2; Cname(2, 1); if (Type != 5) goto L__1; goto L__20; L__10: P += 2; if (A[P] == 5) goto L__14; if (A[P] != 9 || A[P + 1] >= 127) goto L__1; if (!A[P + 1]) goto L__11; Prx(0x41, 1, 0, 0, A[P + 1]); P += 2; goto L__20; L__11: P += 2; goto L__21; L__14: // STRING CONSTANT PUT IN CODE CF (TEXTTEXT) Kk = (Ca + 6 + A[P + 1] - Codebase[Level]) & (-2); Qq = 0; if (Kk < 4095) goto L__15; Kk += 4; Qq = 1; Prx(0x58, 1, Gla, 0, Pageno(Kk) << 2); L__15: Prx(0x45, 1, 10, Qq, Kk & 4095); P++; for (Kk = 1; Kk <= (A[P] + 2) / 2; Kk++) { Plant(A[P] << 8 | A[P + 1]); P += 2; } L__20: Prx(0x41, 2, Rbase, 0, Wkarea); Ppj(26); L__21: if (A[P] == 2) goto L__90; if (A[P + 1] != 12) goto L__5; P++; goto L__2; L__71: Dump(2, Reg, K, I, 0); goto L__99; L__90: P++; Push(Strwsp[Level], 0, Wkarea); Prx(0x41, Reg, 0, Rbase, Wkarea); L__99: Ptype = 5; Unpack(); } void Cres(int Mode, int Lab) { __label__ L__99; auto void Skipname(void); auto void Fail(int Mask); int P1; int P2; int P3; int W; int Sexprn; // MODE=0 UNCONDITIONAL # 0 CONDITIONAL // ENTER WITH ADDR OF LHS IN R1 AND P ON PLUS'' Sexprn = 0; W = Getdblewrd(); P1 = P; if (A[P] == 4) goto L__1; L__1000: P = P1; Skipexp(); Fault(74); goto L__99; L__1: if (Type != 5) goto L__1000; Prr(0x1B, 2, 2); Prx(0x90, 1, 2, Rbase, W); P2 = -1; P += 2; if (A[P - 1] == 3) goto L__10; if (A[P - 1] != 1) goto L__1000; L__3: P2 = P; Skipname(); if (A[P] == 2) goto L__50; if (A[P + 1] != 12) goto L__1000; if (A[P + 2] != 3) goto L__1000; P += 3; L__10: Cstrexp(-4); Sexprn++; Prx(0x98, 1, 2, Rbase, W); Ppj(27); Fail(7); Prx(0x90, 1, 2, Rbase, W); if (P2 < 0) goto L__15; P3 = P; P = P2; Cname(1, 4); if (Type != 5) Fault(71); P = P3; L__12: if (A[P] != 1 || A[P + 1] != 12 || A[P + 2] != 1) goto L__1000; P += 3; goto L__3; L__15: Psi(0x95, 0, 4, 0); Fail(7); goto L__12; L__50: if (!Sexprn) goto L__1000; Prx(0x98, 1, 2, Rbase, W); Ppj(37); P3 = P; P = P2; Cname(1, 4); if (Type != 5) Fault(71); P = P3 + 1; L__99: Push(Lwsp[Level], 0, W); return; void Skipname(void) { L__1: P++; Skipapp(); P++; if (A[P - 1] == 2) return; P++; goto L__1; } void Fail(int Mask) { if (!Mode) Prx(0x47, Mask, 0, Coder, 152); else Plocaljump(Mask, Lab); } } void Ccond(int Iu, int Nearlab, int Farlab) { // IU=0 FOR IF =1 FOR UNLESS auto void Ccc(void); auto void XCsc(int *Flab); // P ON ALT OF (SC) #define Csc(Flab) XCsc(&Flab) int T; int C; int Failpt; int Base; int Disp; int Jnporfp; int Tp; int Clauses; Clauses = 0; T = A[P + 1 + A[P + 1]]; if (T == 3) T = 0; Tp = T; if (!T) Tp++; if (!(Iu ^ (Tp - 1))) Jnporfp = Farlab; else Jnporfp = Nearlab; Failpt = 0; Ccc(); goto L__99; void Ccomp(int C) { int M; int L; int Q; int R; int T; static unsigned char Fcomp[1+7 /*1:7*/] = {0, 8, 10, 2, 7, 12, 4, 7}; static unsigned char Bcomp[1+7 /*1:7*/] = {0, 8, 12, 4, 7, 10, 2, 7}; static int Sw_sw; static void *Sw[13 /*-10:2*/] = { &&Sw_M10, &&Sw_M9, &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_M5, &&Sw_M4, &&Sw_M3, &&Sw_M2, &&Sw_M1, &&Sw_0, &&Sw_1, &&Sw_2, }; M = A[P]; P++; if (M != 8) goto *Sw[Sw_sw = (C) - -10]; Fault(73); Skipexp(); goto L__1; Sw_M10:; Cstrexp(1); Nest = 1; Dump(2, 2, Disp, 0, Base); goto L__161; Sw_M9: T = P; R = Tsexp(Q); if (R == 10 && A[P] == 2) goto Reg1; if (R == 11 && A[P] == 2) goto Reg2; P = T; Csexp(0, 0); if (Type == 2) goto Reg3; Prr(0x19, Disp, Nest); goto L__20; Reg1: Q = 0x59; goto Rcom; Reg2: Q = 0x49; Rcom: Prx(Q, Disp, 0, I, K); goto L__20; Reg3: Prr(0x18, 1, Disp); goto L__37; Sw_M5:; Csexp(0, 3); Q = 0x69; L__51: Prx(Q, Nest, 0, Base, Disp); goto L__21; Sw_M4:; Q = 0x79; Csexp(0, 2); L__40: if (!Prec) goto L__51; Prr(0x2B, 0, 0); Prx(0x78, 0, 0, Base, Disp); Prr(0x29, 0, Nest); goto L__20; Sw_M3:; Csexp(0, 0); if (!Value) goto L__30; if (Type == 2) goto L__36; R = 2; if (Nest == 2) R = 1; Dump(0, R, Value, 0, 0); L__29: Prr(0x19, R, Nest); goto L__20; L__30:; if (Type == 5) goto L__35; if (Aflag == 1) goto L__32; if (Type == 2) goto L__31; if (Aflag == 2 && 7 <= Fcomp[M] && Fcomp[M] <= 8) goto L__32; L__31: Prr((Type - 1) * (2 - (Prec & 1)) * 16 + 0x12, Nest, Nest); L__32: if (C == -3) goto L__21; goto L__20; L__35: Psi(0x95, 0, Nest, 0); goto L__20; L__36: Dump(0, 1, Value, 0, 0); L__37: Ppj(43); Prr((1 - (Prec & 1)) * 16 + 0x29, 0, Nest); goto L__20; Sw_M2: Q = 0x49; L__24: Csexp(0, 0); if (Type == 2) goto L__25; Prx(Q, Nest, 0, Base, Disp); goto L__21; L__25: R = 2; if (Q == 0x49) R = 6; L__26: Dump(R, 1, Disp, 0, Base); goto L__37; Sw_M1:; T = P; R = Tsexp(Q); L = 1; if (R == 11 && A[P] == 2) goto L__18; if (R == 1 && A[P] == 2) goto L__19; P = T; Csexp(0, 0); if (Type == 2) goto L__14; R = 2; if (Nest == 2) R = 1; Dump(4, R, Disp, 0, Base); goto L__29; L__14: R = 4; goto L__26; L__18: Pss(0xD5, L, Base, Disp, I, K); goto L__20; L__19: Psi(0x95, Q, Base, Disp); goto L__20; Sw_0:; T = P; R = Tsexp(Q); L = 4; if (R != 10 || A[P] != 2) goto Rstore; if (7 <= Fcomp[M] && Fcomp[M] <= 8) goto L__18; Rstore: P = T; Q = 0x59; goto L__24; Sw_1:; Sw_2:; T = P; Ptypep = Ptype; R = Tsexp(Value); Ptype = Ptypep; Unpack(); if (R == 1 && Value == 0 && (A[P] == 2 || C == 2)) goto L__30; if (Type == 5) goto L__160; if (Type == 2) goto L__150; if (R == 0 || 14 <= R && R <= 15 || (A[P] == 1 && C == 1)) goto L__120; if (Unass == 1 || R == 100 || R == 11 || R <= 2) goto L__130; if (R == 50) goto L__131; Q = 0x59; if (R == 12) Q = 0x49; Prx(Q, Nest, 0, I, K); goto L__20; L__130:; R = Nest; if (!Register[R]) Register[R] = 1; P = T; Csexp(0, 1); if (Register[R] > 0) Register[R] = 0; goto L__29; L__131: Prr(0x19, Nest, K); goto L__20; L__120:; Q = Park(Nest); P = T; Csexp(0, 0); if (Type == 2) goto L__122; Unpark(0x59, Nest, Q); goto L__21; L__122: Unpark(0x58, 1, Q); goto L__37; L__150: P = T; Q = Parkf(Nest, Prec); if (!Prec) goto L__155; Csexp(0, 3); Push(Lwsp[Level], 0, Q); Base = Rbase; Disp = Q; Q = 0x69; goto L__51; L__155: Csexp(0, 2); Push(Wsp[Level], 0, Q); Base = Rbase; Disp = Q; Q = 0x79; goto L__40; L__160: // 1ST OPERAND A STRING EXPRESSION PTR IN Nest P = T; Pop(Strwsp[Level], R, T); R = Park(Nest); Cstrexp(1); Nest = 1; Unpark(0x58, 2, R); Push(Strwsp[Level], 0, T); L__161: if (7 > Fcomp[M] || Fcomp[M] > 8) goto L__162; Prx(0x43, 3, 0, 1, 0); Prx(0x44, 3, 0, Gla, Strinst + 6); goto L__20; L__162: Ppj(35); L__20: Mask = Fcomp[M]; goto L__1; L__21: Mask = Bcomp[M]; L__1:; goto Sw_skip; Sw_default: fprintf(stderr, "Switch label 'Sw(%d):' not set in %s", Sw_sw + -10, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Sw_skip:; } void Ccc(void) { int Line; int Flab; Csc(Flab); C = A[P]; P++; Clauses++; if (T == 0 || (Clauses > 1 && C == 2)) goto L__10; if (Failpt) goto L__2; Failpt = 1; Line = 1; goto L__3; L__2: Line = 0; L__3:; Plocaljump(Mask, Jnporfp); if (Flab) { Push(Locallabel, Ca, Flab); if (R13 != Save13 || Chnge13 != 0) R13 = 0; } Ccc(); if (!Line) goto L__10; if (Jnporfp == Nearlab) Mask = Mask ^ 15; L__10:; } void XCsc(int *Flab) { int Line; int Q; int R; int S; int Tp; int Near; Flab = 0; S = A[P + 1 + A[P + 1]]; Line = S; Near = Nearlab; if (T == 0 || (S == 2 && Clauses > 0)) goto Start; Plabel--; Near = Plabel; Start: if (A[P] == 1) goto L__1; P += 2; if (!T) goto Redund; if (T == A[P + 1 + A[P + 1]]) goto Redund2; if (Near != Nearlab) *Flab = Near; Tp = T - 1; if (Near == Nearlab) goto Last; Ccond(Tp, Near, Farlab); goto L__9; Redund: Ccond(Iu, Nearlab, Farlab); goto L__9; Redund2: Ccond(Iu, Nearlab, Farlab); if (Jnporfp == Nearlab) Mask = Mask ^ 15; goto L__9; Last: Ccond(Iu, Near, Farlab); Nearlab = 0; goto L__9; L__1: // CLASSIFY SIMPLE CONDITION AND ACT ACCORDINGLY P += 2; S = P; Skipexp(); if (A[P] == 8) goto L__21; P++; Q = Tsexp(R); if (Type == 3) { P += 2; R = Copyrecordtag(); } if (Type == 5) goto Str; if (Q == 1 && R == 0 && A[P] == 2) goto Zero; P = S; Q = Tsexp(R); if (1 <= Q && Q <= 2) goto Const; if (Q == 20) goto Simple; if (Q == 50) goto Regvar; if (Type == 5) goto Str; if (Unass != 0 || 10 > Q || Q > 15) goto Normal; Simple: Base = I; Disp = K; Ccomp(10 - Q); goto L__8; Regvar: Disp = K; Ccomp(-9); goto L__8; Str: P = S; Cstrexp(1); Nest = 1; Ccomp(1); goto L__8; Const: Value = R; Ccomp(-3); goto L__8; L__21: P = S + 2; if (A[S] != 4 || A[S + 1] != 1) goto L__22; Cname(2, 1); if (A[P] == 2 && Type == 5) goto L__23; L__22: P = S; Skipexp(); L__28: P++; Skipexp(); Fault(73); goto L__8; L__23: P += 2; if (Near != Nearlab) *Flab = Near; if (T != 2) R = Jnporfp; else if (Jnporfp != Farlab && Line == 2 && Clauses > 0) R = Farlab; else R = Near; Cres(1, R); if (A[P] != 2) goto L__28; P++; Mask = 15; goto L__10; Zero: P = S; Q = Tsexp(R); if (Q == 11) goto Simple; if (Type == 5) goto Str; Normal: P = S; Csexp(0, 0); Ccomp(1); L__8: P++; if (A[P - 1] == 2) goto L__10; if (Near != Nearlab) *Flab = Near; if (T == 2) goto Orcond; R = Jnporfp; goto L__7; Orcond: if (Jnporfp != Farlab && Line == 2 && Clauses > 0) R = Farlab; else R = Near; // LAST DOUBLESIDED IN OR CONDITION IS SPECIAL L__7:; Plocaljump(Mask ^ 15, R); Ccomp(2); L__10: if (T == 1 || (T == 0 && Iu == 0)) Mask = Mask ^ 15; L__9:; } L__99:; } void Filllocaljumps(void) { int T; int C; int J; L__1: Pop(Localjump, T, C); if (T == -1) goto L__98; J = Find(C, Locallabel); if (J == -1) Fault(233); J -= Localaddr; Plug(T + 2, J); goto L__1; L__98: Clearlist(Locallabel); } void Plocaljump(int Mask, int Label) { if (!Mask) return; if (Save13 != R13) Chnge13 = 1; if (Label > 21000) goto L__1; Pj(Mask, Label); goto L__99; L__1: if (Localbase) goto L__2; Localbase = 10; Localaddr = Codebase[Level]; if (Sbflag == 1 || 3000 + 800 * Compiler > Ca - Codebase[Level]) goto L__2; Localbase = Findpp(); if (Localbase <= 0) Fault(231); Prr(5, Localbase, 0); Localaddr = Ca; L__2: Push(Localjump, Ca, Label); Prx(0x47, Mask, Localbase, 0, 0); L__99:; } void Csname(int Z, int Reg) { int B[6 /*0:5*/]; static unsigned char Plabel[46 /*0:45*/] = {9, 9, 3, 3, 1, [5 ... 7] = 14, 2, 3, 1, 18, 4, 3, [14 ... 15] = 12, 33, 42, 34, 35, 32, [21 ... 36] = 12, 5, [38 ... 45] = 12}; static unsigned char Mode[46 /*0:45*/] = {[0 ... 1] = 16, [2 ... 4] = 0, [5 ... 7] = 16, 2, [9 ... 10] = 16, 31, 32, 0, 18, 31, [16 ... 18] = 18, 63, 47, [21 ... 22] = 23, 18, [24 ... 30] = 31, 31, [32 ... 33] = 23, [34 ... 35] = 47, 18, 16, 2, 23, [40 ... 41] = 16, 23, [43 ... 45] = 0}; static int Sw_sw; static void *Sw[46 /*0:45*/] = { &&Sw_0, &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5, &&Sw_6, &&Sw_7, &&Sw_8, &&Sw_9, &&Sw_10, &&Sw_11, &&Sw_12, &&Sw_13, &&Sw_14, &&Sw_default, &&Sw_16, &&Sw_17, &&Sw_18, &&Sw_19, &&Sw_20, &&Sw_21, &&Sw_22, &&Sw_23, &&Sw_default, &&Sw_25, &&Sw_26, &&Sw_27, &&Sw_28, &&Sw_29, &&Sw_30, &&Sw_31, &&Sw_32, &&Sw_33, &&Sw_34, &&Sw_35, &&Sw_36, &&Sw_37, &&Sw_38, &&Sw_39, &&Sw_40, &&Sw_41, &&Sw_42, &&Sw_default, &&Sw_default, &&Sw_default, }; int Pl; int Kk; int Pp; int V; int Jj; Kk = K; Jj = Countaps(); Pl = Plabel[Kk]; Pp = P + 1; V = Mode[K]; P++; if (V >> 4) P++; if ((V & 15) == 15) goto L__1010; if (V >> 4 != Jj) goto L__1001; V = V & 15; if (V == 0 && Z != 0) goto L__1002; if (V == 2 && Z != 2) goto L__1003; if (Z == 0 && V != 0) goto L__1005; L__1010: goto *Sw[Sw_sw = Kk]; L__1001: Fault(19); Printname(Fname); L__1000: P = Pp; Skipapp(); P--; goto L__99; L__1002: Fault(23); goto L__1000; L__1003: Fault(29); goto L__1000; L__1004: Fault(22); goto L__1000; L__1005: Fault(17); goto L__1000; L__1: Ppj(Pl); goto L__99; Sw_4: Ciocp(1); goto L__99; Sw_2: V = 10; Prx(0x41, 1, 0, 0, V); L__23: Ciocp(3); goto L__99; L__21: Prx(0x41, 1, 0, 0, V); goto L__1; Sw_3: V = 32; goto L__21; Sw_5: V = 0; L__51: Csexp(2, 1); goto L__21; Sw_6: V = 10; goto L__51; Sw_7: V = 32; goto L__51; Sw_0: Sw_1:; Csexp(1, 1); Ciocp(Kk + 8); goto L__99; Sw_9:; Csexp(1, 1); goto L__23; Sw_8: Ciocp(2); L__81: if (Reg != 1) Prr(0x18, Reg, 1); L__82: Ptype = 10001; Unpack(); goto L__99; Sw_10: Ciocp(1); L__106: if (A[P] != 4 || A[P + 1] != 1) goto L__1004; P += 2; Copytag(A[P]); Unpack(); if (Type != 1 || Arr != 0 || Rout != 0) goto L__104; Cname(1, 1); L__102: if (A[P] != 2) goto L__1004; P++; goto L__99; L__104: Plant(0x1841); Register[4] = 1; Cname(1, 4); Register[4] = 0; if (Type != 1) goto L__1004; goto L__102; Sw_11:; B[0] = 1; B[1] = 1000; L__110: Jj = 10000; if (0 != Z && Z != 13) goto L__1004; goto L__302; Sw_12:; Csexp(1, 1); P++; Jj = P; V = Tsexp(Kk); if (V) goto L__121; V = Park(1); Csexp(2, 1); Unpark(0x58, 1, V); L__120: Ppj(Pl); goto L__99; L__121: P = Jj; Register[1] = 1; Csexp(2, 1); Register[1] = 0; goto L__120; Sw_13:; Prx(0x41, 1, 0, 0, 12); Ciocp(5); goto L__99; Sw_14: if (A[P] != 4 || A[P + 1] != 1) goto L__1004; P += 2; Cname(3, Reg); if (A[P] != 2) goto L__1004; P++; goto L__82; Sw_16:; Sw_17:; Csexp(0, 3); if (Nest) Prr(0x28, 0, Nest); Ppj(Pl); goto L__81; Sw_18: Csexp(6, 3); Pclod(32); if (Reg != 2) Prr(0x28, Reg, 2); Ptype = 10032; Unpack(); goto L__99; Sw_19:; B[0] = 3; B[3] = 1; L__191: B[1] = 32; B[2] = 1; goto L__110; Sw_20:; Qpreal = (N0 << 2) + 4; B[0] = 2; goto L__191; Sw_39: Jj = 11032; goto L__210; Sw_21: Jj = 11002; L__210: Csexp(0, 1); P++; if (Nest) goto L__212; Plant(0x1810); Nest = 1; L__212: Ptype = Jj; Unpack(); goto L__99; Sw_22: Jj = 11001; goto L__210; Sw_23: Csexp(Reg, 3); Prr(0x20, Reg, Reg); goto L__99; Sw_25: Sw_26: Sw_27:; Sw_28: Sw_29: Sw_30:; B[0] = 1; L__301: B[1] = 32; Jj = 10032; if (2 != Z && Z != 13) goto L__1004; L__302: Redefineep(Jj, B[0]); // 302: REDEFINE EP(JJ,B) - looks like original bug. B is an integer array, not an integer! Cname(Z, Reg); P -= 2; goto L__99; Sw_31:; Csexp(Reg, 1); if (Z != 15) Fault(84); Ptype = 3; Unpack(); goto L__99; Sw_32: Jj = 11011; goto L__210; Sw_33: // SW(33): JJ=11021; ->210; ! SHORT INTEGER Jj = 11021; goto L__210; Sw_34: Sw_35:; B[0] = 2; B[2] = 32; goto L__301; Sw_36:; Csexp(Reg, 1); Prx(0x89, Reg, 0, 0, 31); Prx(0x8A, Reg, 0, 0, 30); Prx(0x5B, Reg, 0, Gla, 16); goto L__99; Sw_37: Cstrexp(1); Ciocp(7); goto L__99; Sw_38: Prx(0x41, Reg, 0, 0, 10); goto L__82; Sw_40:; Csexp(1, 1); Ciocp(5); goto L__99; Sw_41:; Ciocp(4); goto L__106; Sw_42: Jj = 11005; goto L__210; L__99:; goto Sw_skip; Sw_default: fprintf(stderr, "Switch label 'Sw(%d):' not set in %s", Sw_sw, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Sw_skip:; } void Ciocp(int N) { Prx(0x41, 0, 0, 0, N); Prx(0x90, 4, 1, 11, 16); Prx(0x98, 12, 14, Gla, 140); Prr(0x05, 15, 14); R13 = 0; } void Caname(int Z, int Bs, int Dp, int Clink, int Bsrf, int Dprf) { static int S_sw; static void *S[4 /*0:3*/] = { &&S_0, &&S_1, &&S_2, &&S_3, }; int Ptypep; int Kk; int Rr; int Pp; int Jj; int Jjj; int Kkk; int Dis; int Q; int Precp; int Checksp; int Basereg; int Arrp; int Basicdisp; Checksp = Checks; if (!Type) Checksp = 1; Pp = P; Basereg = Link; if (Inreg) { if (Type) Checksp = 0; Basereg = Inreg; } Jj = J; Ptypep = Ptype; Arrp = Arr; Q = Countaps(); if (Jj) goto L__1; From1(Clink, Jj); Replace1(Clink, Jj | Q); Jj = Q; L__1: if (Jj == Q && Q != 0) goto L__4; Fault(19); Printname(Fname); P++; Skipapp(); goto L__99; L__4:; if (Arrp == 2) Fromlist(K, Basicdisp, Dp); if (Checksp != 0 || Jj != 1 || Z == 3) goto L__12; if (2 < Type) goto L__12; Precp = Prec; Kkk = 0; P = Pp + 2; Jjj = Tsexp(Kkk); if (3 <= Jjj && Jjj <= 99) Dis = 0; else Dis = Kkk * Bytes[Precp]; if (Dis > 4095 || (Arrp == 2 && Dis + Basicdisp > 4095)) goto L__12; if (Jjj == 50 && Precp == 1) goto Regvar; if (Jjj == 101) goto Rdisp; if (1 <= Jjj && Jjj <= 2) goto Const; if (Jjj != 100) goto L__12; Dump(2 + 2 * Prec, 1, K, 0, I); P++; goto L__9; Regvar: Jjj = K; P++; goto L__8; Rdisp: if (Precp == 1) goto Regvar; Prr(0x18, 1, K); P++; goto L__9; L__12: P = Pp + 2; Dis = 0; if (Jj != 1) goto L__21; Csexp(1, 1); P++; if (Checksp == 1) goto L__10; L__9: Jjj = 1; L__8: if (Basereg != Link) goto L__5; if (Arrp == 2) goto Vector; Rp13 = R13; R13 = Bs << 12 | Dp; if (R13 != Rp13) Prx(0x58, Link, 0, Bs, Dp); goto L__5; Vector: Dis += Basicdisp; Basereg = Bs; L__5: Ptype = Ptypep; Unpack(); if (!Jjj) goto L__6; if (Type == 5) goto Str; if (Type != 3) goto *S[S_sw = Prec]; L__3: Prx(0x4C, 1, 0, Bsrf, Dprf); goto L__6; Str: Prx(0x58, 2, 0, Bs, Dp + 8); Bsrf = 2; Dprf = 2; goto L__3; S_3:; S_0:; Pconst(0x89100002 | Prec); goto L__6; S_2:; Plant(0x1A11); S_1: L__6: Disp = Dis; Index = Jjj; Base = Basereg; goto L__99; Const: Jjj = 0; P++; goto L__8; L__10:; Dump(0, 3, Dp, 0, Bs); Ppj(22 + Jj); Jjj = 1; L__11: Ptype = Ptypep; Unpack(); goto L__6; L__21:; if (Jj != 2 || Checksp != 0) goto L__31; Csexp(2, 1); Jjj = 2; P++; Kk = P; Q = Tsexp(Pp); P = Kk; if (Q) goto L__22; Jjj = Park(2); L__22: Csexp(1, 1); P++; Prx(0x4C, 1, 0, Bs, Dp + 14); Unpark(0x5A, 1, Jjj); goto L__9; L__31:; Rr = Getarrwsp(); for (Pp = 0; Pp <= Jj - 1; Pp++) { Csexp(0, 1); P++; Dump(1, Nest, Rr + (Pp << 2), 0, Rbase); } Dump(0, 1, Rr + (Pp << 2), 0, Rbase); Dump(0, 2, Dp, 0, Bs); Ppj(24); Jjj = 1; Push(Mdarr[Level], 0, Rr); goto L__11; L__99: J = Jj; } void Cename(int Z, int Mode, int Bs, int Dp) { // MODE=0 POINTER TO RECORD IN CORE AT BS & Dp // MODE=1 POINTER TO RECORD IN REGISTER BS DP RUBBISH // MODE=2 RECORD REG CLAIMED int Q; int Qqq; int Bsrf; int Dprf; if (A[P] == 1) goto L__2; if (Z >= 14) goto L__1; Fault(64); P -= 2; Ptype = 1; Unpack(); goto L__99; L__1: Base = Bs; Disp = Dp; if (Mode) Disp = -1; Index = 0; goto L__99; L__2: P++; Q = Displacement(Fname); Unpack(); if (Q == -1) goto L__98; if (Type == 3) goto L__50; if (Arr == 1) goto L__20; if (Type == 5) goto L__30; if (Mode) goto L__11; Rp13 = R13; R13 = Bs << 12 | Dp; if (R13 != Rp13) Prx(0x58, Link, 0, Bs, Dp); Base = Link; L__7: Index = 0; Disp = Q; if (Rout == 1) From1(Q, Disp); goto L__99; L__11: Base = Bs; goto L__7; L__20:; Fromlist(Fname, Bsrf, Qqq); Bsrf = Bsrf >> 4 & 15; From1(Qqq, Dprf); if (Z < 10 || A[P + 1] == 1) goto L__21; K = Dprf + Q; I = Bsrf; if (!Mode) Dump(2, 1, Dp, 0, Bs); goto L__99; L__21: if (Mode != 0 || Bs >= 4) goto L__22; Dump(2, 1, Dp, 0, Bs); Mode = 1; Bs = 1; L__22: if (Mode == 1) Qqq = Park(1); Caname(3, Bsrf, Dprf + Q, K, 0, 0); R13 = 0; if (!Mode) Prx(0x5A, Index, Bs, 0, Dp); if (Mode == 1) Unpark(0x5A, Index, Qqq); if (Mode == 2) Prr(0x1A, Index, Bs); I = Bsrf; K = Dprf + Q; goto L__99; L__30: Fromlist(Fname, Bsrf, Qqq); From1(Qqq, Dprf); Bsrf = Bsrf >> 4 & 15; if (Mode != 0 && Bs != 1) Prr(0x18, 1, Bs); if (!Mode) Prx(0x58, 1, Bs, 0, Dp); Prx(0x5A, 1, Bsrf, 0, Dprf + Q); Base = 1; Index = 0; Disp = 0; I = Bsrf; K = Dprf + Q; goto L__99; L__50:; if (!Mode) Dump(2, 1, Dp, 0, Bs); if (Mode) Prr(0x18, 1, Bs); From2(Q, Qqq); Crname(Z, 1, K, 1, Qqq); goto L__99; L__98: P++; Skipapp(); P -= 2; L__99:; } void Crname(int Z, int Mode, int Clink, int Bs, int Dp) { // DEALS WITH RECORD NAME CALLING CENAME TO COMPILE // SUBFIELDS MODE=0 POINTER TO RECORD IN CORE AT BS & // Dp MODE=1 POINTER TO RECORD IN REGISTER BS DP // RUBBISH CLINK POINTS TO CELL CONTAING NAME DETAILS int Kk; int Jj; int Q; int Qq; From2(Clink, Q); From1(Q, Fname); if (!Arr) goto L__50; I = Bs; K = Dp; if (11 <= Z && Z <= 12 && A[P + 1] == 2) goto L__99; Fromlist(Fname, Kk, Jj); Kk = Kk >> 4 & 15; From1(Jj, Jj); if (Mode == 2) Prr(0x1A, Index, Bs); if (Mode != 0 || Bs >= 4) goto L__3; Dump(2, 1, Dp, 0, Bs); Mode = 1; Bs = 1; L__3:; Qq = Bs; if (Mode == 1) Qq = Park(Bs); Caname(Z, Qq, Dp, Clink, Kk, Jj + 2); From1(Q, Fname); if (Mode == 1) Register[Qq] = 0; Prr(0x1A, 1, Link); Cename(Z, 1, 1, 0); goto L__99; L__50: P++; if (A[P] == 2) goto L__51; Fault(19); Skipapp(); L__51: P++; if (Inreg == 0 || Z == 14) Cename(Z, 0, Bs, Dp); else Cename(Z, 2, Inreg, 0); L__99:; } void Cname(int Z, int Reg) { int Jj; int Jjj; int Kk; int Rr; int Ptypep; int Levelp; int Dispp; // Z=0-RTCALL,Z=1STORE(=), Z=2 FETCH,Z=3 FETCH ADDR,Z=4%C // STORE N<-), Z=6 STORE PTR, Z=12 FETCH ARRAYHEAD, Z=11 STORE %C // ARRAY Head static int S_sw; static void *S[6 /*10:15*/] = { &&S_default, &&S_11, &&S_12, &&S_13, &&S_14, &&S_15, }; static int Funny_sw; static void *Funny[6 /*10:15*/] = { &&Funny_default, &&Funny_11, &&Funny_12, &&Funny_13, &&Funny_14, &&Funny_15, }; static int Sw_sw; static void *Sw[9 /*0:8*/] = { &&Sw_0, &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5, &&Sw_6, &&Sw_7, &&Sw_8, }; static int Mod_sw; static void *Mod[32 /*0:31*/] = { &&Mod_0, &&Mod_1, &&Mod_2, &&Mod_3, &&Mod_4, &&Mod_5, &&Mod_6, &&Mod_7, &&Mod_8, &&Mod_9, &&Mod_10, &&Mod_11, &&Mod_12, &&Mod_13, &&Mod_14, &&Mod_15, &&Mod_16, &&Mod_17, &&Mod_18, &&Mod_19, &&Mod_20, &&Mod_21, &&Mod_22, &&Mod_23, &&Mod_24, &&Mod_25, &&Mod_26, &&Mod_27, &&Mod_28, &&Mod_29, &&Mod_30, &&Mod_31, }; Fname = A[P]; Copytag(Fname); if (I != -1) goto L__3; Fault(16); I = Level; J = 0; K = Fname; Ptype = 7; Storetag(K, N); K = N; N += 4; Unpack(); L__3: Jj = J; if (Jj == 15) Jj = 0; Levelp = I; Dispp = K; if (Type == 7) goto L__502; if (Z == 0 && (Rout != 1 || 0 != Type && Type != 6)) goto L__500; if (Z >= 10) goto *Funny[Funny_sw = (Z)-10]; if (Rout == 1) goto L__501; goto *Sw[Sw_sw = Type]; L__500: if (Type == 3) goto *Sw[Sw_sw = 3]; if (Type != 7) Fault(17); goto L__502; Sw_6: if (Z != 3 || Arr != 1) goto L__661; K = K << 2; Arr = 0; I = 10; goto L__600; Sw_4:; L__661: Fault(20); Sw_7: L__502: P++; Ptype = 1; Unpack(); if (A[P] == 2) goto L__6; goto L__102; Funny_11: if (Type == 3) goto L__1011; if (Arr != 1 || Nam != 1 || K >> 12 != 0) Fault(17); Prx(0x90, 0, 3, I, K); goto L__91; L__1011: Pclod(44); goto *Sw[Sw_sw = 3]; S_11: Mover(Wspr, -16); Pss(0xD2, 16, 1, 0, Wspr, 0); goto L__91; Funny_12: if (Type == 3) goto *Sw[Sw_sw = 3]; if (Arr == 2) goto L__1202; if (Arr != 1) Fault(17); L__1201: Prx(0x98, 0, 3, I, K & 4095); goto L__91; L__1202: From2(K, K); goto L__1201; S_12: if (Type == 3 && Arr == 1) goto L__1201; Prr(0x18, 0, 1); Prx(0x5A, 0, 0, I, K); Prx(0x5A, 1, 0, I, K + 4); Prx(0x98, 2, 3, I, K + 8); goto L__91; Funny_13:; if (Type == 3) goto *Sw[Sw_sw = 3]; if (Ptype == 10006) goto L__1302; if (Rout == 1 && (Nam & 1) == 1) goto L__1301; Base = Gla; From1(K, Disp); Index = 0; Disp = Ra[Disp]; if (J == 14) Disp += 4; L__1300: if (Rout != 1) goto L__500; goto L__91; L__1301: Base = I; From1(K, Disp); Index = 0; goto L__91; L__1302: Csname(Z, Reg); goto L__6; S_13: From2(K, K); goto L__1300; Funny_15:; if (Ptype == 10006) goto L__1501; Funny_14:; Rr = 0; if (Arr == 0 && Inreg != 0 && A[P + 1] == 2 && 2 == A[P + 2]) Rr = Inreg; if (Type == 3) goto *Sw[Sw_sw = 3]; goto L__661; S_14: if (Type != 3 || Nam != 1) Fault(20); if (Reg != Rr && Rr != 0) Prr(0x18, Rr, Reg); if (Disp < 0) Disp = 0; if (R13 == (Base << 12 | Disp)) R13 = 0; L__1401: Dump(Z - 13, Reg, Disp, Index, Base); P++; goto L__9005; S_15: if (Type != 3) goto L__661; if (Disp >= 0) goto L__1401; Dump(0, Reg, 0, Index, Base); P++; goto L__9005; L__1501: Csname(Z, Reg); if (A[P] != 2 || A[P + 1] != 2) Fault(22); P += 2; goto L__9005; Sw_3:; From2(K, Jjj); Crname(Z, 0, Tags[A[P]], I, Jjj); if (Z >= 10) goto *S[S_sw = (Z)-10]; if (Type == 5) goto L__5020; if (Z) goto L__601; if (Rout != 1 || Nam != 1) goto L__500; Levelp = Park(Base); Rr = Disp; Ptypep = Ptype; From2(K, Jj); From2(Jj, K); goto L__22; Sw_5:; Base = I; Index = 0; Disp = K; Jjj = 2; if (Arr != 1) goto L__5000; Caname(Z, I, K, Tags[Fname], 0, 0); L__4998: Nam = Nam >> 1; Jjj = 0; if (Z != 3) goto L__5000; Dump(0, Reg, Disp, Index, Base); if (Checks) Prx(0x58, 2, 0, Levelp, Dispp + 8); Paclod(10, 6, Reg << 4); goto L__9; // L 2,LMAX. BCTR 2,0. SLL 2,24. OR REG,2 L__5000: if (2 <= Z && Z <= 3) goto L__605; if (Reg != 4) Prr(0x18, 4, Reg); Dump(Jjj, 1, Disp, Index, Base); if (!Arr) goto L__5001; if (Z == 4 || Checks != 0) Prx(0x58, 2, 0, Levelp, Dispp + 8); I = 2; K = 3; L__5001: Storestring(Z, 4, 1, I, K); goto L__9; L__5020:; if (Arr == 1) goto L__5025; if (2 <= Z && Z <= 3) goto L__9; if (Reg != 4) Prr(0x18, 4, Reg); goto L__5001; L__5025:; Levelp = I; Dispp = K; goto L__4998; Sw_8:; if ((1 > Z || Z > 2) && Z != 4) Fault(29); if (K == Reg) goto L__9; if (Z == 2) Prr(0x18, Reg, K); else Prr(0x18, K, Reg); goto L__9; Sw_0: if (Z != 3 && Z <= 10) { Fault(12); Type = 1; Ptype++; } Sw_2:; Sw_1: if (!Arr) goto L__600; Caname(Z, I, K, Tags[Fname], 0, 0); if (!Type) Type = 1; Nam = Nam >> 1; goto L__601; L__501: if (Z == 0 || Ptype != 10000) goto L__503; Fault(23); Printname(A[P]); goto L__503; L__503: Ptypep = Ptype; if (Ptype != 10006) goto L__20; Csname(Z, Reg); if (Rout == 1 && Nam >= 1 && Z != 0) goto L__202; goto L__6; L__20: Kk = K; Fromlist(Kk, Rr, K); L__22: if (K != 1000) goto L__21; Fault(21); goto L__502; L__21: Crcall(Kk); Ptype = Ptypep; Unpack(); if ((Nam & 1) == 1) goto L__37; if (Jj == 14) goto L__36; Dump(2, 1, Ra[Rr], 0, Gla); Prx(0x45, Link, 0, Gla, 116); L__371: Mone = 1; R13 = 0; P++; if (Ptype == 10000 || Ptype == 11000) goto L__1; if (Nam > 1) goto L__201; if (Z != 2) Fault(29); if (Type == 2) goto L__43; L__44: if (Reg != 1) Prr(0x18, Reg, 1); goto L__1; L__43: if (Reg != 2) Prr(0x28, Reg, 2); goto L__1; L__36:; Paclod(55, 4, Ra[Rr] + 4); goto L__371; L__37:; if (Levelp < Rbase) Register[Levelp] = 0; Paclod(61, 4, Levelp << 12 | Rr); // STM 4,14,?--LM 12,15 ? -- LM 5,9,20(15) -- BALR 15,14 goto L__371; L__201: // - REAL MAPS AND INTEGER MAPS Nest = 1; L__202:; if (Type == 5) goto L__205; if (Z == 3) goto L__203; Jjj = Z; if (Z == 4) Jjj = 1; Jjj += (Type << 3) + (Prec << 1) - 8; Dump(Jjj, Reg, 0, 0, Nest); if (Z == 1 && Checks == 1) Checkcapacity(Reg, 0, 0, Nest); if (Z == 2 && Unass == 1) Testass(Reg); goto L__1; L__203: if (Reg != Nest) Prr(0x18, Reg, Nest); goto L__1; L__205: // STRING MAPS if (Nest != 1) Prr(0x18, 1, Nest); if (2 <= Z && Z <= 3) goto L__206; Storestring(Z, Reg, 1, 0, 255); goto L__1; L__206: Pclod(69); goto L__44; L__600: Base = I; Index = 0; Disp = K; L__601: if (Z == 6) goto L__602; goto *Mod[Mod_sw = Nam << 4 | Prec << 2 | Z & 3]; L__602: if (!Nam) Fault(17); if (R13 == (Base << 12 | Disp)) R13 = 0; Jjj = 1; goto L__605; Mod_1:; Mod_0:; Mod_5:; Mod_4:; Mod_9:; Mod_8:; Mod_12:; Mod_13:; Mod_2:; Mod_14:; Jjj = Z; if (Z == 4) Jjj = 1; Jjj += (Type << 3) + (Prec << 1) - 8; L__605: Dump(Jjj, Reg, Disp, Index, Base); if (Z == 1 && Checks == 1) Checkcapacity(Reg, Disp, Index, Base); if (Z == 2 && Unass == 1) Testass(Reg); goto L__9; Mod_31:; Mod_19:; Mod_23:; Mod_27:; Jjj = 2; goto L__605; Mod_15:; Mod_3:; Mod_7:; Mod_11:; Jjj = 0; goto L__605; Mod_6:; Mod_10:; Jjj = (Prec << 1) + 2; goto L__605; Mod_16:; Mod_20:; Mod_24:; Mod_17:; Mod_21:; Mod_25:; Mod_28:; Mod_29:; Mod_18:; Mod_22:; Mod_26:; Mod_30:; Rp13 = R13; R13 = Base << 12 | Disp; if (R13 != Rp13 || Index != 0) Prx(0x58, Link, Index, Base, Disp); Jjj = Z; if (Z == 4) Jjj = 1; Jjj += (Type << 3) + (Prec << 1) - 8; Dump(Jjj, Reg, 0, 0, Link); if (Z == 1 && Checks == 1) Checkcapacity(Reg, 0, 0, Link); if (Z == 2 && Unass == 1) Testass(Reg); L__9: if (Arr) goto L__1; L__91: P++; if (A[P] == 2) goto L__6; Fault(19); L__102: Skipapp(); goto L__1; L__6: P++; L__1: P++; if (A[P - 1] == 2) goto L__9005; Fault(69); goto L__91; L__9005:; goto Funny_skip; Funny_default: fprintf(stderr, "Switch label 'Funny(%d):' not set in %s", Funny_sw + 10, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Funny_skip:; goto S_skip; S_default: fprintf(stderr, "Switch label 'S(%d):' not set in %s", S_sw + 10, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; S_skip:; } void Crcall(int Clink) { static int Fpd_sw; static void *Fpd[4 /*0:3*/] = { &&Fpd_0, &&Fpd_1, &&Fpd_2, &&Fpd_3, }; int Kk; int Ii; int Iii; int Q; int Qq; int Qqq; int Pp; int Rf; auto void Moveback(void); int Moved; int Tomove; int Typep; short List; List = 0; Fflag = 0; Kk = Countaps(); P++; if (K == Kk) goto L__2; Fault(19); Printname(Fname); Skipapp(); P--; goto L__99; L__2: if (!K) goto L__99; Q = 0; Qq = 64; Rf = 1 - Fflag; Moved = 0; if (Kk == 1) Rf = 1; L__7: Mlink(Clink); From1(Clink, Ptype); P++; Unpack(); Ii = Type; Iii = Prec; Qqq = P; Pp = (Nam << 1 | Arr) & 3; if ((Pp != 0 || Rout != 0) && (A[P] != 4 || A[P + 1] != 1)) goto L__10; if (Rout == 1) goto L__12; goto *Fpd[Fpd_sw = Pp]; L__10: P = Qqq; Skipexp(); L__11: Fault(22); goto L__53; // ROUTINE TYPE PARAMETERS L__12: Ii = Ptype; P += 2; Cname(13, 0); if (1000 != abs(Ptype - Ii) && abs(Ptype - Ii) != 0) goto L__10; if (A[P] == 1) goto L__10; P++; if (J == 14) goto L__13; if (Nam & 1) goto L__15; Dump(2, 2, Disp, Index, Base); Prx(0x5A, 2, 0, Gla, 28); Pconst(0x180C181D); Push(List, Qq + 12, 0); goto L__69; L__13: Prx(0x98, 0, 2, Base, Disp); Prr(0x18, 3, 9); goto L__69; L__15: Prx(0x98, 0, 3, Base, Disp); goto L__69; Fpd_0: if (Prec == 3) goto L__41; if (Type == 5) goto L__45; if (Unass != 0 || Type != 1) goto L__39; Pp = P; Typep = Prec; Ii = Tsexp(Iii); if (Ii == 10 && Typep == 0) goto L__42; if (Ii == 1 && Typep == 1) goto L__43; P = Pp; Type = 1; L__39: Csexp(0, Type); Moveback(); Dump(8 * Type - 7, Nest, Qq - Moved, 0, Wspr); if (Checks == 1) Checkcapacity(Nest, Qq - Moved, 0, Wspr); Tomove = 4; goto L__50; L__42: Moveback(); Pss(0xD2, 4, Wspr, Qq - Moved, I, K); Tomove = 4; goto L__50; L__43: Moveback(); Psi(0x92, Iii, Wspr, Qq - Moved + 3); Tomove = 4; goto L__50; L__41: Ii = 0; if (Qq & 7) Ii = 4; Csexp(0, 3); Dump(15, Nest, Qq - Moved + Ii, 0, Wspr); Tomove = 8 + Ii; goto L__50; L__45: Cstrexp(4); From2(Clink, Iii); Prx(0x41, 1, 0, Wspr, Qq - Moved + 4); Storestring(1, 4, 1, 0, Iii - 1); Tomove = (Iii + 7) & (-4); goto L__50; Fpd_2:; P += 2; if (Type == 3) Cname(15, 1); else Cname(3, 1); if (A[P] == 1) goto L__10; P++; if ((Ii != Type || Iii != Prec) && Ii != 0) goto L__11; Moveback(); Dump(1, 1, Qq - Moved, 0, Wspr); Tomove = 4; if (Ii) goto L__50; if (2 < Type) Fault(12); Psi(0x92, Prec << 3 | Type, Wspr, Qq - Moved); goto L__50; Fpd_1: Fpd_3:; P += 2; Cname(12, 0); if (A[P] == 1) goto L__10; P++; From2(Clink, Pp); if (!Pp) Replace2(Clink, J); if (Arr <= 0 || (J != 0 && Pp != 0 && J != Pp)) Fault(22); if (Ii != 0 && (Type != Ii || Iii != Prec)) Fault(22); L__69: Moveback(); Prx(0x90, 0, 3, Wspr, Qq - Moved); Tomove = 16; L__50: Qq += Tomove; if (Rf == 1 || Q == Kk - 1) goto L__53; Ii = ((Qq + 7) & (-8)) - Moved; Mover(Wspr, Ii); Moved += Ii; L__53: Q++; if (Q != Kk) goto L__7; if (Rf != 1) Mover(Wspr, -Moved); L__55: Pop(List, Q, Qq); if (Q == -1) goto L__99; Prx(0x50, Wspr, 0, Wspr, Q); goto L__55; void Moveback(void) { if (Qq >= Moved) goto L__1; Mover(Wspr, Qq - Moved); Moved = Qq; L__1:; } L__99:; } // Z=1 FOR= ,4 FOR <- AND MAX LENGTH IN BYTE DEFINED BY BML&Dml void Storestring(int Z, int From, int To, int Bml, int Dml) { // REGISTER 2 IS ASSUMED TO BE USABLE. if (To != 1 || From != 4) Fault(239); if (Z == 4) goto L__10; if (!Checks) goto L__2; if (Bml > 0) goto L__1; Psi(0x95, Dml, From, 0); goto L__3; L__1:; Pss(0xD5, 1, From, 0, Bml, Dml); L__3:; Prx(0x47, 2, 0, Coder, 88); L__2: Prx(0x43, 2, 0, From, 0); Prx(0x44, 2, 0, Gla, Strinst); goto L__99; L__10: Prx(0x43, 2, 0, Bml, Dml); Ppj(39); L__99:; } void Testnst(void) { Fname = K; if (Find(Fname, Name[Level]) != -1) Fault(7); } void Cuci(void) { auto void Dxb(void); auto void Dlb(void); auto void Db(void); auto void Cucs(void); int Z; int Kk; int X; int Opcode; int Reg; static int Sw_sw; static void *Sw[4 /*1:4*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, }; static int S_sw; static void *S[8 /*1:8*/] = { &&S_1, &&S_2, &&S_3, &&S_4, &&S_5, &&S_6, &&S_7, &&S_8, }; P = 2; goto *Sw[Sw_sw = (A[P]) - 1]; Sw_1:; Nest = A[3]; P = 5; Z = A[4] - 1; if (!Z) Z = 3; Cname(Z, Nest); goto L__99; Sw_2: Ppj(A[P + 1]); goto L__99; Sw_4:; if (A[P + 1] != 9) goto L__401; Plant(A[P + 2]); P += 3; goto L__99; L__401: if (A[P + 1] != 1) Fault(32); Plant(A[P + 3]); P += 4; goto L__99; Sw_3: Opcode = A[P + 2]; P += 3; goto *S[S_sw = (A[P - 2]) - 1]; S_1: if (!Opcode) goto L__87; Prr(Opcode, A[P], A[P + 1]); P += 2; goto L__99; S_2: Reg = A[P]; P++; Dxb(); L__11: Prx(Opcode, Reg, X, I, K); goto L__99; S_3: Reg = A[P]; X = A[P + 1]; P += 2; Db(); goto L__11; S_4: Db(); Z = 0; if (A[P] == 2) goto L__41; Z = A[P + 2]; if (A[P + 1] != 9 || Z >= 256) Fault(32); P += 2; L__41: Psi(Opcode, Z, I, K); P++; goto L__99; S_5: Reg = A[P]; P++; Db(); X = 0; goto L__11; S_6: Dlb(); Kk = K; Z = X; Reg = I; Db(); if (!Z) Z = 1; L__61: Pss(Opcode, Z, Reg, Kk, I, K); goto L__99; S_7: Dlb(); Kk = K; Z = X; Reg = I; Dlb(); if (!Z) Z = 1; if (!X) X = 1; Z = (Z - 1) << 4 | X; goto L__61; S_8: Reg = A[P]; P++; if (Opcode == 0x80) goto L__85; if (Opcode == 10) goto L__83; Prr(Opcode, Reg, 0); goto L__99; L__83: Plant(0xA00 | Reg); goto L__99; L__85: Psi(Opcode, Reg, 0, 0); goto L__99; L__87: Cnop(A[P], A[P + 1]); goto L__99; void Db(void) { if (A[P] == 1) goto L__2; K = A[P + 1]; I = 0; P += 3; if (A[P - 1] == 2) goto L__99; I = A[P]; P++; goto L__99; L__2: Cucs(); L__99:; } void Dxb(void) { static int Sw_sw; static void *Sw[3 /*1:3*/] = { &&Sw_1, &&Sw_2, &&Sw_3, }; if (A[P] == 2) goto L__2; Cucs(); X = 0; P++; if (A[P - 1] == 2) goto L__99; X = A[P]; P++; goto L__99; L__2: K = A[P + 1]; P += 2; I = 0; X = 0; goto *Sw[Sw_sw = (A[P]) - 1]; Sw_1: X = A[P + 1]; P++; Sw_2: I = A[P + 1]; P++; Sw_3: P++; L__99:; } void Dlb(void) { if (A[P] == 2) goto L__2; K = A[P + 1]; X = A[P + 2]; I = A[P + 3]; P += 4; goto L__99; L__2: Cucs(); X = A[P]; P++; L__99:; } void Cucs(void) { static int Utype_sw; static void *Utype[9 /*0:8*/] = { &&Utype_0, &&Utype_1, &&Utype_2, &&Utype_3, &&Utype_4, &&Utype_5, &&Utype_6, &&Utype_7, &&Utype_8, }; P++; if (A[P] == 2) goto L__10; Fname = A[P + 1]; Copytag(Fname); P += 3; if (I != -1) goto L__1; Fault(16); J = 0; I = Level; Ptype = 7; Unpack(); Storetag(Fname, N); K = N; N += 4; L__1: if (Rout == 1) Fault(33); goto *Utype[Utype_sw = Type]; Utype_3: From2(K, K); goto L__9; Utype_4: From1(K, K); goto L__9; Utype_8: Fault(33); goto L__9; Utype_6: From1(K, K); K -= Codebase[Oldi]; if (K > 4095) Fault(99); I = 10; Utype_0: Utype_1: Utype_2: Utype_5: Utype_7:; if (Arr != 2) goto L__9; From2(K, K); L__9: if (A[P - 1] == 2) goto L__99; K += A[P]; P++; goto L__99; L__10: K = A[P + 2] + ((A[P + 1] - 1) << 14); J = Find(K, Label[Level]); if (J == -1) goto L__25; K = J - Codebase[Level]; I = 10; if (K > 4095) Fault(99); P += 3; goto L__99; L__25: Push(Jump[Level], Ca | Labset, K); K = 0; I = 0; P += 3; L__99:; } L__99:; } void Testass(int Reg) { int J; if (1 > Type || Type > 2) return; if (Type == 1) goto L__5; J = 0x79; if (Prec == 3) J = 0x69; L__3: Prx(J, Reg, 0, Gla, 128); Prx(0x47, 8, 0, Coder, 40); goto L__99; L__5: if (Prec) goto L__99; J = 0x59; goto L__3; L__99:; } void Gxref(int Name, int Hash) { int I; int J; int K; int N; int Np; I = N0; N0 += 7; J = Word[Name]; St[I + 1] = 0; St[I + 2] = 0; St[I + 3] = 0; N = Lett[J]; Np = N; if (Np > 8) Np = 8; K = Addr(St[I + 5]); if (!Hash) goto L__1; St[I + 5] = Hash << 16 | '#' << 8; K += 2; N += 2; if (Np > 6) Np = 6; L__1: for (Np = 1; Np <= Np; Np++) *Byteinteger(K + Np) = Lett[J + Np]; if (N > 8) N = 8; St[I + 4] = 0x80000000; St[I] = Xreflink; Xreflink = I << 2; *Byteinteger(Addr(St[I + 5])) = N; if (N == 8) N0++; } void XUndcrf(short *Ophead) { int I; int J; short Op; // UNSCRAMBLES RECORD FORMAT TAGS LIST & SIDECHAIN Pop(*Ophead, I, J); L__1: Pop(*Ophead, I, J); if (I == -1) goto L__9; Op = J; Ptype = I >> 4 & 0xFFFF; Unpack(); if (Rout == 1 || Type == 3) Clearlist(Op); goto L__1; L__9:; } void Clt(void) { // P ON PHRASE TYPE AT ENTRY - TO NEXT PHRASE AT EXIT Type = Typeflag[A[P]]; Prec = Type >> 3; Type = Type & 7; if (Type == 2 && Alllong != 0) Prec = 3; Acc = Bytes[Prec]; P++; if (Type != 5) goto L__99; if (A[P] != 2) goto L__2; Acc = 0; P++; goto L__99; L__1: P++; Fault(70); goto L__99; L__2: P++; Acc = A[P] + 1; if (2 > Acc || Acc > 256) goto L__1; P++; L__99:; } void Cqn(int P) { unsigned char I; I = A[P]; Nam = 0; Arr = 0; if (I == 1) Nam = 2; if (I <= 2) Arr = 1; if (I <= 3) Nam = Nam | 1; if (Arr == 1) Acc = 16; if (I == 3) Acc = 4; } void Skipexp(void) { static int Sw_sw; static void *Sw[4 /*1:4*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, }; int J; static int Rt = 10000; L__3: P++; goto *Sw[Sw_sw = (A[P]) - 1]; Sw_1: P += 2; J = Addr(Aslist[Tags[A[P - 1]]]); if (*Shortinteger(J) < Rt) goto L__5; // ->5 %IF SHORT INTEGER(J)<RT; FFLAG=1 Fflag = 1; L__5: Skipapp(); P++; if (A[P - 1] == 2) goto L__1; P++; goto L__5; Sw_2:; P++; J = A[P]; if (J == 9) { P += 2; goto L__1; } if (J == 1) { P += 3; goto L__1; } if (J == 2) { P += 5; goto L__1; } P = P + (A[P + 1] & 0xFE) + 3; goto L__1; Sw_3: Sw_4: P++; Skipexp(); L__1: P++; if (A[P - 1] == 1) goto L__3; } void Skipapp(void) { L__5: P++; if (A[P - 1] == 2) goto L__1; Skipexp(); goto L__5; L__1:; } void Cquery(int Reg) { Psi(0x95, 0, Gla, 1); Pj(8, Plabel - 1); if (Type == 2) goto L__1; if (Type == 5) goto L__5; if (Reg != 1) Prr(0x18, 1, Reg); Pconst(0x4120000B); Ppj(4); goto L__9; L__1: Pconst(0x41100020); Ppj(3); if (!Qpreal) { Qpreal = (N0 << 2) + 4; St[N0] = Xreflink; Xreflink = Qpreal - 4; St[N0 + 4] = 8; St[N0 + 5] = 'I#PR'; St[N0 + 6] = 'INTF'; N0 += 7; } Paclod( 82, 1, Reg << 4); // STD REG,64(11).LA 0,12.ST 0,68(11) %ABD SS ENTRYPRINTF Paclod(55, 4, Qpreal); goto L__9; L__5: Pconst(0x4110000A); Ppj(3); Prr(0x18, 1, Reg); Ppj(5); L__9: Plab(-1); } void Loadad(int Reg, int Base, int X, int Disp) { int I; Prx(0x41, Reg, X, Base, Disp & 4095); I = Pageno(Disp); if (4095 < Disp) Prx(0x5A, Reg, 0, Gla, 4 * I); } int XTsexp(int *Code) { static int Sw_sw; static void *Sw[4 /*1:4*/] = { &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, }; Type = 1; if (1 != A[P] && A[P] != 4) goto L__9; goto *Sw[Sw_sw = (A[P + 1]) - 1]; Sw_1: *Code = A[P + 2]; Copytag(*Code); if (Ptype == 10006) { Type = Tsname[K]; Prec = Type >> 3; Type = Type & 7; } if (Type == 8) goto L__40; if (Type == 3 && Arr == 0 && Inreg != 0) goto L__30; if (Arr == 2 && Type == 1) goto L__50; if (A[P + 3] != 2 || 2 != A[P + 4]) goto L__9; if (Rout != 0 || Arr != 0) goto L__9; if (Type == 5) goto L__20; if (Nam) goto L__9; if (Type == 2) goto L__14; if (Type != 1) goto L__9; if (A[P + 5] == 2) goto L__11; if (A[P + 6] != 2 || 2 != A[P + 7]) goto L__9; if (A[P + 8] != 9 || A[P + 10] != 2) goto L__9; *Code = A[P + 9]; P += 11; return (100); L__11: P += 6; return (10 + Prec); L__14: if (A[P + 5] != 2) goto L__9; P += 6; return (14 + (Prec & 1)); L__20: if (A[P + 5] != 2) goto L__9; P += 6; return (20); L__30: if (A[P + 3] != 2 || A[P + 4] != 1) goto L__9; P += 5; From1(K, Fname); I = Inreg; K = Displacement(Fname); Unpack(); if (I == -1 || Arr != 0 || Rout != 0) goto L__9; if (1 > Type || Type > 2 || A[P + 1] != 2 || 2 != A[P + 2]) goto L__9; if (A[P + 3] != 2) goto L__9; P -= 2; if (Type == 1) goto L__11; goto L__14; L__40: if (A[P + 5] == 2) goto L__41; if (A[P + 6] != 2 || 2 != A[P + 7]) goto L__9; if (A[P + 8] != 9 || A[P + 10] != 2) goto L__9; *Code = A[P + 9]; P += 11; return (101); L__41: P += 6; return (50); L__50: if (A[P + 3] != 1 || A[P + 4] != 4 || A[P + 5] != 2) goto L__9; if (A[P + 6] != 9 || A[P + 7] >= 256 || A[P + 8] != 2) goto L__9; if (A[P + 9] != 2 || A[P + 10] != 2 || A[P + 11] != 2) goto L__9; From1(K, K); K += A[P + 7] * Bytes[Prec]; if (0 > K || K >= 4096) goto L__9; P += 12; return (10 + Prec); Sw_2: Type = A[P + 2] & 7; if (A[P + 2] != 9) goto L__9; if (A[P + 4] == 1) goto L__21; *Code = A[P + 3]; P += 5; if (256 > *Code) return (1); return (2); L__21: if (A[P + 5] == 12) Type = 5; Sw_3: Sw_4: L__9: return (0); } void Mover(int R, int N) { if (!N) goto L__99; if (0 > N) goto L__2; Dump(0, R, N, 0, R); goto L__99; L__2: N = -N; if (N != 4 && N != 8) goto L__3; Prx(0x5A, R, 0, Gla, 76 + N); goto L__99; L__3: Pconst(0x41000000 | N); Prr(0x1B, R, 0); L__99:; } int Findpp(void) { int I; for (I = 9 - Rlevel; I >= 4; I--) if (!Register[I]) goto L__1; return (0); L__1: Register[I] = 1; return (I); } void Unpark(int Opcode, int Reg, int Q) { if (0 > Q) goto L__1; Prr(Opcode - 0x40, Reg, Q); Register[Q] = 0; goto L__9; L__1: Q = abs(Q); Prx(Opcode, Reg, 0, Rbase, Q); Push(Wsp[Level], 0, Q); L__9:; } int Park(int Reg) { int I; int J; int P; P = Claimablereg(); if (!P) goto L__1; Register[P] = 1; if (P == Reg) goto L__2; Prr(0x18, P, Reg); L__2: return (P); L__1: Pop(Wsp[Level], I, J); if (J != -1) goto L__3; J = N; N += 4; L__3: Dump(1, Reg, J, 0, Rbase); return (-J); } int Claimablereg(void) { int I; if (Rbase <= 4) goto L__1; for (I = 5; I <= Rbase; I++) if (!Register[I]) return (I); L__1: return (0); } int Parkf(int Reg, int Prec) { int I; int J; if (Prec) goto L__10; Pop(Wsp[Level], I, J); if (J != -1) goto L__3; J = N; N += 4; L__3: Dump(9 + 2 * Prec, Reg, J, 0, Rbase); return (J); L__10: J = Getdblewrd(); goto L__3; } int Getarrwsp(void) { // PRODUCES 6 CONTIGUOUS WORDS UNDER BASE // REGISTER COVER FOR ARRAY ACCESS int I; int J; Pop(Mdarr[Level], I, J); if (J > 0) goto L__1; J = N; N += 24; L__1: return (J); } void Rhead(int Kk) { int Flag; int W1; int W2; Flag = Kk; if (!Rlevel) Flag = 10000; if (!Rlevel) goto L__5; if (List) goto L__5; Newline(); Write(Line, 5); Spaces(3 * Level); if (Kk < 0) printf("%s", "BEGIN"); else { printf("%s", "RT/FN/MAP "); Printname(Kk); } Write(Ca, 6); L__5: Level++; if (Flag < 0) goto L__6; Rlevel++; Rbase = 10 - Rlevel; R13 = 0; if (Rbase == 4 || Register[Rbase] != 0) Fault(35); Register[Rbase] = 1; L__6: if (Level == 10) Fault(34); if (Level > Maxlevels) Fault(105); Nmdecs[Level] = 0; if (Flag >= 0) goto L__10; Prx(0x90, 10, 11, Rbase, N); N += 12; W1 = Rbase; W2 = N - 4; goto L__20; L__10: if (Kk < 0) goto L__25; Fromlist(Jj, J, K); St[Ra[J] >> 2] = Ca; Prx(0x50, Link, 0, Wspr, 60); W1 = Wspr; W2 = 0; L__20: if (!Diags1) goto L__21; Pss(0xD2, 4, W1, W2, Gla, 20); Loadad(0, 0, 0, Line); Pconst(0x4000D014); L__21: Mone = 1; Setline(); L__25: if (Flag >= 0) Prr(0x18, Rbase, Wspr); if (Kk < 0) W1 = 0; else W1 = Word[Kk]; L[Level] = Line; M[Level] = W1; Rnext[Level] = Next; if (Flag < 0) return; Set[Rlevel] = Ca + 2; Prx(0x41, Wspr, Wspr, 0, 0); if (Checks) Pclod(75); N = 64; Nmax = N; } void Set80(int Where, int N) { if (N <= 2) return; int K; Psi(0x92, 0x80, Rbase, Where); N--; K = Where; L__1: if (N <= 256) goto L__2; Pss(0xD2, 256, Rbase, K + 1, Rbase, K); K += 256; N -= 256; goto L__1; L__2: Pss(0xD2, N, Rbase, K + 1, Rbase, K); } void XCbpair(int *Lb, int *Ub) { int Kk; int Kkk; int Jj; int Bp; P++; Kk = 0; for (Jj = 1; Jj <= 2; Jj++) { Kkk = Kk; if (A[P] == 2) Kk = -1; else Kk = 1; if ((A[P + 1] & 7) == 2) goto Real; if ((A[P + 1] & 7) == 5) goto String; if (A[P + 1] == 9) Bp = A[P + 2]; else { Fromar4(P + 2, Bp); P++; } Kk = Kk * Bp; P += 3; goto Again; Real: Fault(24); P += 6; Kk = 0; goto Again; String: Fault(42); P = (P * A[P + 2] & 0xFE) + 2; Kk = 0; Again:; } *Lb = Kkk; *Ub = Kk; } void Loaddata(void) { int Ldlink; int Jj; int Kk; int Ptr; int Jjj; short Head; Ldptr = 8 + 8 * Neps; int Buffer[Ldptr + 1]; Buffer[0] = 7; Buffer[2] = 88; Buffer[3] = 0; Buffer[4] = 0; Buffer[5] = 0; Buffer[6] = 64; Ptr = 8; Ldlink = 0; L__1: Pop(Eplink, Jj, Kk); if (Jj < 0) goto L__10; Head = Kk; Buffer[Ptr] = Ldlink; Ldlink = Ptr << 2; Buffer[Ptr + 1] = 0; Buffer[Ptr + 2] = 0; Buffer[Ptr + 3] = Jj; Buffer[Ptr + 4] = 0x80000000; Pop(Head, Buffer[Ptr + 5], Kk); if (Kk > 3) Pop(Head, Buffer[Ptr + 6], Jjj); Ptr += 7; if (Kk > 7) { Pop(Head, Buffer[Ptr], Jjj); Ptr++; } goto L__1; L__10: Buffer[1] = Ldlink; Lput(3, Ptr << 2, 0, Addr(Buffer[0])); Ldptr = Ptr; } void Defineep(int Mode, int Name, int Adr) { short Head; int Jj; int Kk; int Length; int Id1; int Id2; int Id3; static int Sw_sw; static void *Sw[3 /*0:2*/] = { &&Sw_0, &&Sw_1, &&Sw_2, }; Kk = Word[Name]; Head = 0; goto *Sw[Sw_sw = Mode]; Sw_0: // DEFINE S#GO Length = 4; Id1 = 'S#G'; Id2 = 'O '; goto L__10; Sw_1: // SYSTEM EP Length = Lett[Kk] + 2; Id1 = 'S#A'; for (Jj = 1; Jj <= 6; Jj++) *Byteinteger(Addr(Id1) + Jj + 2) = Lett[Kk + Jj]; goto L__10; Sw_2: // ENTRY TO EXTERNAL ROUTINE Length = Lett[Kk]; for (Jj = 1; Jj <= 8; Jj++) *Byteinteger(Addr(Id1) + Jj) = Lett[Kk + Jj]; L__10: if (Length > 8) Length = 8; *Byteinteger(Addr(Id1)) = Length; if (Length > 7) Push(Head, Id3, 0); if (Length > 3) Push(Head, Id2, 0); Push(Head, Id1, Length); Push(Eplink, Adr, Head); Neps++; } void Redefineep(int Typep, int Params) { int Jj; int Kk; short Ophead; Jj = N0; P -= 2; Gxref(A[P], 'I'); K = Newcell(); Ophead = K; if (!Params) goto L__1; for (Kk = 1; Kk <= Params; Kk++) Insertafter(Ophead, Params, 0); L__1: I = 9; J = 14; Oldi = 0; Ptype = Typep; Replacetag(A[P]); Replaceboth(K, Nr, Params); Ra[Nr] = Jj << 2; Nr++; } int Getdblewrd(void) { // PRODUCES A DOUBLE WORD OF TEMPORARY SPACE // COVERED BY CURRENT BASE REGISTER (RBASE) int I; int J; Pop(Lwsp[Level], I, J); if (I != -1) goto L__3; if (!(N & 7)) goto L__2; Push(Wsp[Level], 0, N); N += 4; L__2: J = N; N += 8; L__3: return (J); } int Getstrwsp(void) { int I; int J; Pop(Strwsp[Level], I, J); if (J != -1) goto L__2; J = N; N += 256; L__2: return (J); } void Setex(void) { if (Strinst) return; St[N0] = 0xD2001000; St[N0 + 1] = 0x4000D500; St[N0 + 2] = 0x20001000; Strinst = N0 << 2; N0 += 3; } void Setline(void) { int K; static int Value; if (Linenos != 1) return; K = Line & 255; if (!K) Mone = 1; if (K != Value || Mone != 0) Psi(0x92, K, Gla, 23); Value = K; if (!Mone) goto L__9; Psi(0x92, Line >> 8, Gla, 22); L__9: Mone = 0; } void Checkcapacity(int Reg, int Dis, int X, int Level) { int Mask; if (Type != 1 || 1 > Prec || Prec > 2) return; if (Prec == 1) goto L__3; Mask = 7; Prx(0x49, Reg, Level, X, Dis); L__1: Prx(0x47, Mask, 12, 0, 88); goto L__99; L__3: Prx(0x55, Reg, 0, Gla, 24); Mask = 2; goto L__1; L__99:; } // MACROISING THE FROMS,REPLACES & MLINK SAVES TIME & SPACE; // MACROISING THE OTHERS SAVES TIME BUT INCREASES SIZE void XFromlist(int Cell, int *S1, int *S2) { int J; J = Addr(Aslist[Cell]); *S1 = *Integer(J); *S2 = *Shortinteger(J+4); // S2= SHORT INTEGER(J+4) } int Newcell(void) { int P; P = Asl; if (!P) Fault(107); Asl = *Shortinteger(Addr(Aslist[P+6])); // ASL= SHORT INTEGER(ADDR(ASLIST(P+6)));! NEXT FREE CELL *Shortinteger(Addr(Aslist[P+6])) = 0; // SHORT INTEGER(ADDR(ASLIST(P+6)))=0; ! LINK OF NEWCELL TO 0 return (P); } void XPush(short *Cell, int S1, int S2) { int P; int Q; P = Newcell(); Q = Addr(Aslist[P]); *Integer(Q) = S1; *Shortinteger(Q+4) = S2; // SHORT INTEGER(Q+4)=S2 *Shortinteger(Q+6) = *Cell; // SHORT INTEGER(Q+6)=CELL *Cell = P; } void XPop(short *Cell, int *S1, int *S2) { int P; int Q; Q = Addr(Aslist[*Cell]); *S1 = *Integer(Q); *S2 = *Shortinteger(Q+4); // S2=SHORT INTEGER(Q+4) if (!*Cell) goto L__1; P = *Cell; *Cell = *Shortinteger(Q+6); // P=CELL; CELL=SHORT INTEGER(Q+6);! CELL ONTO NEXT CELL *Shortinteger(Q+6) = Asl; // SHORT INTEGER(Q+6)=ASL; ASL=P;! OLD CELL ONTO FREE LIST Asl = P; L__1:; } void Replace1(int Cell, int S1) { *Integer(Addr(Aslist[Cell])) = S1; } void Replace2(int Cell, int S2) { *Shortinteger(Addr(Aslist[Cell+4])) = S2; } // SHORT INTEGER(ADDR(ASLIST(CELL+4)))=S2 void XMlink(int *Cell) { *Cell = *Shortinteger(Addr(Aslist[*Cell+6])); } // CELL=SHORT INTEGER(ADDR(ASLIST(CELL+6))) void XInsertafter(short *Cell, int S1, int S2) { if (!*Cell) goto L__1; Push(*Shortinteger(Addr(Aslist[*Cell+6])), S1, S2); // PUSH(SHORT INTEGER(ADDR(ASLIST(CELL+6))),S1,S2) *Cell = *Shortinteger(Addr(Aslist[*Cell+6])); // CELL=SHORT INTEGER(ADDR(ASLIST(CELL+6))) return; L__1: Push(*Cell, S1, S2); } int Find(int Lab, int List) { L__3: if (!List) goto L__1; if (*Shortinteger(Addr(Aslist[List+4])) == Lab) goto L__4; // ->4 %IF SHORT INTEGER(ADDR(ASLIST(LIST+4)))=LAB Mlink(List); goto L__3; L__4: return (*Integer(Addr(Aslist[List]))); L__1: return (-1); } void XFrom1(int Cell, int *S1) { *S1 = *Integer(Addr(Aslist[Cell])); } void XFrom2(int Cell, int *S2) { *S2 = *Shortinteger(Addr(Aslist[Cell+4])); } // S2=SHORT INTEGER(ADDR(ASLIST(CELL+4))) void Replaceboth(int Cell, int S1, int S2) { int I; I = Addr(Aslist[Cell]); *Integer(I) = S1; *Shortinteger(I+4) = S2; // SHORT INTEGER(I+4)=S2 } void XClearlist(short *Ophead) { int I; int J; L__1: Pop(*Ophead, I, J); if (I != -1) goto L__1; } void Storetag(int Kk, int Slink) { Push(Tags[Kk], Ptype << 16 | Level << 8 | Rbase << 4 | J, Slink); if (Level > 1) Push(Name[Level], 0, Kk); } int Countaps(void) { int Pp; int Q; Q = 0; Pp = P; P++; L__1: if (A[P] == 2) goto L__2; P++; Q++; Skipexp(); goto L__1; L__2: P = Pp; return (Q); } int Displacement(int Link) { int Rr; int Ii; if (!Link) goto L__2; From2(Link, Link); L__1: Mlink(Link); Fromlist(Link, Rr, Ii); if (Ii == -1) goto L__2; J = Rr & 15; Ptype = Rr >> 4 & 0xFFFF; Rr = Rr >> 20; K = Link; Inreg = 0; if (Rr == A[P]) goto L__99; goto L__1; L__2: Fault(65); Printname(A[P]); Ptype = 1; L__99: return (Ii); } int Copyrecordtag(void) { int Q; int Fname; L__1: From1(K, Fname); P++; Skipapp(); if (A[P] == 2) return (0); P++; Q = Displacement(Fname); if (Q == -1) Ptype = 7; Unpack(); if (Type == 3) { K = Q; goto L__1; } if (Q == -1) return (-1); return (1); } void Copytag(int Kk) { int Q; Fromlist(Tags[Kk], Q, K); if (Q == -1) goto Notset; Ptype = Q >> 16; Inreg = Q >> 12 & 15; Oldi = Q >> 8 & 15; I = Q >> 4 & 15; J = Q & 15; L__1: Unpack(); return; Notset: Ptype = 7; I = -1; J = I; Oldi = J; goto L__1; } void Replacetag(int Kk) { int P; int Q; P = Tags[Kk]; Q = Ptype << 16 | Inreg << 12 | Oldi << 8 | I << 4 | J; Replaceboth(P, Q, K); } void Unpack(void) { int Q; Rout = Ptype / 10000; Q = Ptype - 10000 * Rout; Nam = Q / 1000; Q -= 1000 * Nam; Arr = Q / 100; Q -= 100 * Arr; Prec = Q / 10; Type = Q - 10 * Prec; } void XPack(int *Ptype) { int Q; Q = 10000 * Rout + 1000 * Nam + 100 * Arr; *Ptype = Q + 10 * Prec + Type; } void Ppj(unsigned char N) { R13 = 0; Pconst(0x45F0C000 | N << 2); } int Pageno(int N) { int I; int J; J = N >> 12; I = Pagenos[J]; if (I) return (I); St[N0] = J << 12; Pagenos[J] = N0; N0++; return (N0 - 1); } void Filljumps(int Level) { int J; int K; int Q; int Kk; Ophead = 0; L__1: Pop(Jump[Level], J, K); if (J == -1) goto L__3; Q = Find(K, Label[Level]); if (Q != -1) goto L__2; Push(Ophead, J, K); goto L__1; L__2: Kk = 0; Q -= Codebase[Level]; K = Q >> 12; if (J & Labset) goto L__22; if (Sbflag == 1) goto L__23; Plug(J, 0x58E0); Plug(J + 2, Gla << 12 | 4 * Pageno(Q)); J += 4; if (K) Kk = 14; L__21: Plug(J + 2, Kk << 12 | Q & 0xFFF); goto L__1; L__22: J = J & 0xFFFFFF; Kk = 10; L__23: if (Q > 4095) Fault(99); goto L__21; L__3: Jump[Level] = Ophead; } void Pj(int Mask, int Lab) { int I; int J; int Q; J = Find(Lab, Label[Level]); if (J == -1) goto L__200; I = J - Codebase[Level]; if (I >= 4096) goto L__50; Prx(0x47, Mask, 0, 10, I); goto L__999; L__50: Q = 4 * Pageno(I); Pconst(0x58E0D000 | Q); Prx(0x47, Mask, 14, 10, I & 4095); goto L__999; L__200: Push(Jump[Level], Ca, Lab); if (Sbflag != 1) Pconst(0); Prx(0x47, Mask, 10, 0, 0); L__999:; } void Plab(int M) { Mone = 1; if (M >= 0) goto L__1; Plabel--; K = Plabel; M = K; L__1: Push(Label[Level], Ca, M); R13 = 0; } void Checkrf(void) { Copytag(A[Marker1]); if (Type != 4) goto L__1; Jj = K; Fromlist(Jj, Q, Fname); Dump(0, 4, Q, 0, I); goto L__9; L__1: K = -1; Fault(62); L__9:; } void Dump(int Code, int Reg, int Dis, int X, int Level) { // CODE=8*(TYPE-1)+2*PREC+Z int J; static unsigned char Opcode[17 /*0:16*/] = { 0x41, 0x50, 0x58, 0x42, 0x43, 0x40, 0x48, 0x59, 0x49, 0x70, 0x78, [11 ... 14] = 0, 0x60, 0x68}; J = Opcode[Code]; if (!J) Fault(248); if (Code == 4) goto L__4; if (Code != 0 || 0 != Dis) goto L__1; if (Level != 0 || 0 != X) goto L__3; Prr(0x1F, Reg, Reg); goto L__99; L__3: if (Level != 0 && X != 0) goto L__1; if (Reg != X + Level) Prr(0x18, Reg, X + Level); goto L__99; L__4: if (X != Reg && Reg != Level) Prr(0x1F, Reg, Reg); L__1: Prx(J, Reg, X, Level, Dis); // AND WITH 255 FOR BYTE IF SLR NOT POSSIBLE AS ADDR IN R if (Code == 4 && (X == Reg || Reg == Level)) Prx(0x54, Reg, 0, Gla, 24); L__99:; } goto Sw_skip; Sw_default: fprintf(stderr, "Switch label 'Sw(%d):' not set in %s", Sw_sw + 1, __PRETTY_FUNCTION__); exit(1) /* or %signal ... */; Sw_skip:; } exit(0); return (1); } #ifdef NEVER #endif