!*                                                                  rs6p104
!* 21/12/92 - Changes to correctly number include file lines(pds)
!*                                                             rs6p102.i
!* 30/08/89 - changes incorporated (ex Sun3 version) to get source
!*            directly from buffer using Consource since read symbol
!*            is not supported (gm)
!*                                                             m88p102
!* 29/08/89 - original from pds (m88p102s on emas)
!*
!!{GT:}%include "hostcodes.inc"

CONSTINTEGER YES=1,NO=0
            
!
! THESE CODE ARE ARBITARY BUT THE TOP DECIMAL DIGIT GIVES THE NO OF BYTES
! IN THE UNIT OF ADDRESSABILITY. BYTE ADDRESSED HOSTS BEING 1N ( also 0N) AND
! 16 BIT WORD ADDRESSED HOSTS BEING 2N ETC
CONSTINTEGER PENTIUM=4;                 ! PENTIUM chip Unix stack and completely swopped
constinteger MIPS=05;                   ! Imp on MIPS (all variants)
CONSTINTEGER RS6=06;                    ! imp on IBM rs6000
CONSTINTEGER M88K=07;                   ! Imp on all forms of 88k
                                        ! also serves for Sparc sinc there is a common b-e
CONSTINTEGER VAX=08;                    ! Imp on Vax using F & G formats
CONSTINTEGER UNISYS=09;                 ! Imp on UnisSys. Unix stack unswopped Vax reals
CONSTINTEGER EMAS=10;                   ! emas on 2900 (unsigned shorts)
CONSTINTEGER IBM=11;                    ! emas on 24 bit ibm hardware
CONSTINTEGER IBMXA=12;                  ! emas of XA 31 bit hardware
CONSTINTEGER WWC=13;                    ! WWc (Natsemi chip) completely swopped
CONSTINTEGER AMDAHL=14;                 ! Emas on Amdahls guess at Xa Minor differences fron IBM)
CONSTINTEGER PERQ3=15;                  ! ICL packaged 68k chip Unix stack but not swopped
CONSTINTEGER GOULD=16;                  ! Gould unswopped forward stack. Needs 4&8 byte alined
CONSTINTEGER VNS=17;                    ! Unix on 2900 unsigned shorts params as
                                        ! 2900. Long int available but not in Ecode
CONSTINTEGER EAMD=18;                   ! Amdahl via the Emachine
CONSTINTEGER DRS=19;                    ! Intel chip Unix stack and mostly swopped
CONSTINTEGER PERQ=20;                   ! Pos perq now obselete. Fully swopped forward stack
CONSTINTEGER PNX=21;                    ! ICL's perq2 Unix stack byte swopped (unsigned shorts)
CONSTINTEGER ACCENT=22;                 ! Perq 1 under accent. obsolete now
                                        ! ACCENT DIFFERS FROM PERQ ONLY IN
                                        ! ASSEMBLES SEQUENCES&SYNTAX
                                        ! AND GENERATOR
constinteger ORN=23
CONSTINTEGER UNSIGNEDSHORTS=1<<emas!1<<pnx!1<<vns
CONSTINTEGER LINTAVAIL=1<<IBM!1<<IBMXA!1<<amdahl!1<<EMAS!1<<GOULD!1<<MIPS
CONSTINTEGER LLREALAVAIL=1<<IBM!1<<IBMXA!1<<amdahl!1<<EMAS!1<<MIPS
CONSTINTEGER EMACHINE=1<<DRS!1<<PENTIUM!1<<WWC!1<<Vax!1<<GOULD!1<<PERQ3!1<<VNS!1<<EAMD!1<<ORN!1<<UniSys!1<<m88k!1<<rs6!1<<MIPS
CONSTINTEGER IBMFPFORMAT=1<<ibm!1<<ibmxa!1<<amdahl!1<<emas!1<<gould!1<<vns!1<<EAMD
constinteger VAXFPFORMAT=1<<Vax!1<<UniSys
constinteger IEEEFPFORMAT=1<<WWC!1<<PERQ3!1<<DRS!1<<PENTIUM!1<<PERQ!1<<accent!1<<m88k!1<<rs6!1<<MIPS
CONSTINTEGER BYTESWOPPED=1<<PERQ!1<<ACCENT!1<<WWC!1<<Vax!1<<PNX!1<<ORN
CONSTINTEGER HALFSWOPPED=1<<PERQ!1<<ACCENT!1<<WWC!1<<Vax!1<<DRS!1<<PENTIUM!1<<ORN
CONSTINTEGER WORDSWOPPED=1<<PERQ!1<<ACCENT!1<<WWC!1<<Vax!1<<DRS!1<<PENTIUM!1<<ORN
CONSTINTEGER RISKMC=1<<M88K!1<<rs6!1<<MIPS
!
! end of file hostcodes
!

{GT:}CONSTINTEGER HOST={mips}PENTIUM
{GT:}CONSTINTEGER TARGET={mips}PENTIUM
! PRODUCED BY newps FROM imptocps on locust
CONSTBYTEINTEGERARRAY CLETT(0: 436)=   1,
  40,   1,  41,   1,  42,   1,  44,   2, 201, 198,   6, 213, 206, 204,
 197, 211, 211,   5, 215, 200, 201, 204, 197,   5, 213, 206, 212, 201,
 204,   3, 198, 207, 210,   1,  61,   5, 193, 204, 201, 193, 211,   7,
 201, 206, 212, 197, 199, 197, 210,   4, 210, 197, 193, 204,   4, 204,
 207, 206, 199,   4, 194, 217, 212, 197,   6, 211, 212, 210, 201, 206,
 199,   4, 200, 193, 204, 198,   5, 211, 200, 207, 210, 212,   6, 210,
 197, 195, 207, 210, 196,   7, 210, 207, 213, 212, 201, 206, 197,   2,
 198, 206,   3, 205, 193, 208,   8, 198, 213, 206, 195, 212, 201, 207,
 206,   4, 206, 193, 205, 197,   9, 193, 210, 210, 193, 217, 206, 193,
 205, 197,   9, 207, 198, 208, 210, 207, 199, 210, 193, 205,   6, 207,
 198, 198, 201, 204, 197,   6, 207, 198, 204, 201, 211, 212,   6, 198,
 207, 210, 205, 193, 212,   3, 206, 207, 212,   3, 193, 206, 196,   2,
 207, 210,   1,  58,   4, 211, 208, 197, 195,   5, 193, 210, 210, 193,
 217,   3, 207, 215, 206,   8, 197, 216, 212, 197, 210, 206, 193, 204,
   9, 197, 216, 212, 210, 201, 206, 211, 201, 195,   8, 195, 207, 206,
 211, 212, 193, 206, 212,   5, 195, 207, 206, 211, 212,   5, 197, 214,
 197, 206, 212,   5, 211, 212, 193, 210, 212,   9, 212, 200, 197, 206,
 211, 212, 193, 210, 212,   4, 212, 200, 197, 206,   9, 197, 204, 211,
 197, 211, 212, 193, 210, 212,   4, 197, 204, 211, 197,   1,  95,   6,
 211, 217, 211, 212, 197, 205,   7, 196, 217, 206, 193, 205, 201, 195,
   4,  80,  85,  84,  95,   5,  67,  78,  79,  80,  95,   1,  43,   1,
  45,   1,  64,   2,  45,  62,   6, 210, 197, 212, 213, 210, 206,   6,
 210, 197, 211, 213, 204, 212,   7, 205, 207, 206, 201, 212, 207, 210,
   4, 211, 212, 207, 208,   6, 211, 201, 199, 206, 193, 204,   4, 197,
 216, 201, 212,   8, 195, 207, 206, 212, 201, 206, 213, 197,   6, 198,
 201, 206, 201, 211, 200,   5, 195, 217, 195, 204, 197,   6, 210, 197,
 208, 197, 193, 212,   3, 197, 206, 196,   7, 201, 206, 195, 204, 213,
 196, 197,   5, 194, 197, 199, 201, 206,   2, 207, 206,   6, 211, 215,
 201, 212, 195, 200,   4, 204, 201, 211, 212,  14, 212, 210, 213, 211,
 212, 197, 196, 208, 210, 207, 199, 210, 193, 205,   6, 205, 193, 201,
 206, 197, 208,   7, 195, 207, 206, 212, 210, 207, 204,   4,  40,  42,
  41,  58;

CONSTINTEGERARRAY SYMBOL(1300: 2096)=  1311,
  1305,  1001,  1358,  1783,  1307,  1003,  1311,     0,  1337,     2,
  1321,  1315,  1001,  1014,  1317,  1003,  1321,     0,  1321,     2,
  1328,  1328,  1010,  1028,  1311,  1011,  1351,  1337,  1335,  1010,
  1028,  1311,  1011,  1351,  1337,     4,  1344,  1344,  1010,  1028,
  1300,  1011,  1344,  1351,  1349,  1026,  1300,   999,  1351,  1000,
  1358,  1356,  1026,  1311,   999,  1358,  1000,  1366,  1364,     0,
  1337,  1366,     2,  1366,  1000,  1373,  1371,     6,  1337,   999,
  1373,  1000,  1378,  1376,     8,  1378,    11,  1402,  1385,    18,
  1010,  1530,  1552,  1011,  1391,    24,  1010,  1530,  1552,  1011,
  1402,    30,  1010,  1001,    34,  1337,     6,  1337,     6,  1337,
  1011,  1408,  1406,    36,  1013,  1408,  1000,  1415,  1413,     6,
  1001,   999,  1415,  1000,  1420,  1418,    42,  1420,  1000,  1428,
  1423,    42,  1425,    50,  1428,    55,    50,  1453,  1431,    42,
  1433,    50,  1436,    55,  1420,  1439,    60,  1415,  1442,    65,
  1689,  1445,    72,  1415,  1448,    77,  1415,  1453,    83,     0,
  1845,     2,  1460,  1456,    90,  1460,  1031,  1428,  1460,  1467,
  1463,    98,  1465,   101,  1467,   105,  1483,  1473,  1428,  1488,
  1001,  1408,  1479,  1453,  1483,  1001,  1408,  1495,  1483,   114,
  1001,  1408,  1488,  1486,   114,  1488,  1000,  1495,  1491,   119,
  1493,   114,  1495,  1000,  1505,  1503,     0,  1010,  1467,  1011,
  1505,     2,  1505,  1000,  1514,  1512,  1030,  1010,  1467,  1011,
   999,  1514,  1000,  1525,  1518,   129,  1016,  1520,   139,  1523,
   146,  1018,  1525,  1016,  1530,  1528,   153,  1530,  1000,  1546,
  1536,  1337,  1032,  1337,  1546,  1541,     0,  1530,  1552,     2,
  1544,   160,  1530,  1546,  1337,  1552,  1550,  1037,  1337,  1552,
  1000,  1563,  1557,   164,  1530,  1563,  1561,   168,  1530,  1570,
  1563,  1000,  1570,  1568,   164,  1530,   999,  1570,  1000,  1577,
  1575,   168,  1530,   999,  1577,  1000,  1585,  1581,  1033,  1337,
  1583,   171,  1585,  1000,  1592,  1589,   173,  1010,  1592,  1015,
  1010,  1596,  1595,   173,  1596,  1605,  1603,     6,  1337,   171,
  1337,  1596,  1605,  1000,  1614,  1610,  1488,  1001,  1408,  1614,
   178,  1525,  1614,  1620,  1620,  1001,  1408,  1791,  1620,  1626,
  1624,     6,  1614,  1626,  1000,  1645,  1637,  1488,  1592,  1010,
  1001,  1402,  1799,  1011,  1645,  1006,  1645,   178,  1525,  1592,
  1001,  1402,  1791,  1667,  1656,  1654,     6,  1010,  1001,  1402,
  1799,  1011,  1645,  1656,  1000,  1667,  1659,   184,  1661,   188,
  1663,   197,  1665,   207,  1667,   216,  1678,  1676,    34,  1012,
  1028,  1300,  1344,  1689,  1678,  1678,  1000,  1689,  1687,     6,
  1012,  1028,  1300,  1344,  1689,   999,  1689,  1000,  1696,  1694,
     0,  1328,     2,  1696,  1000,  1703,  1701,     6,  1321,   999,
  1703,  1000,  1708,  1706,   222,  1708,  1000,  1714,  1712,     6,
  1337,  1714,  1000,  1727,  1725,     6,  1001,  1408,     0,  1337,
   171,  1337,     2,   999,  1727,  1000,  1734,  1732,    24,  1530,
  1552,  1734,  1000,  1747,  1737,  1019,  1739,  1006,  1744,  1373,
  1530,  1552,  1006,  1747,  1378,  1006,  1760,  1751,   228,  1034,
  1754,   234,  1034,  1760,   244,  1010,  1939,  1011,  1766,  1766,
  1764,   164,  1939,  1766,  1000,  1783,  1770,   249,  1034,  1778,
   259,  1373,  1010,  1530,  1552,  1011,  1747,  1781,   259,  1939,
  1783,  1000,  1791,  1789,   264,  1001,  1358,  1783,  1791,  1000,
  1799,  1799,     0,  1337,   171,  1337,  1596,     2,  1807,  1805,
    34,  1028,  1300,  1344,  1807,  1000,  1816,  1810,   266,  1812,
   188,  1814,   273,  1816,  1000,  1827,  1825,  1001,    34,  1337,
     6,  1337,     6,  1337,  1827,  1000,  1834,  1832,     6,  1852,
   999,  1834,  1000,  1845,  1838,   173,  1001,  1845,  1001,     0,
  1852,  1827,  1870,     2,  1852,  1848,  1001,  1852,  1852,  1827,
  1870,  1862,  1856,  1428,  1862,  1862,     0,  1852,  1827,  1870,
     2,  1870,  1867,  1488,  1001,  1408,  1870,   178,  1614,  1878,
  1876,   168,  1852,  1827,   999,  1878,  1000,  1901,  1885,     4,
  1910,  1001,  1901,  1006,  1889,   281,  1002,  1006,  1893,  1022,
  1917,  1006,  1899,   286,  1009,     6,  1009,  1006,  1901,  1043,
  1910,  1905,   292,  1005,  1908,   294,  1005,  1910,  1000,  1917,
  1913,   296,  1915,    34,  1917,  1000,  1939,  1920,  1023,  1923,
  1024,  1321,  1926,  1025,  1321,  1929,  1039,  1321,  1934,  1040,
  1321,     6,  1321,  1939,  1041,  1321,     6,  1321,  1972,  1948,
  1010,  1001,  1358,  1783,  1011,  1577,  1760,  1952,   298,  1001,
  1358,  1954,   301,  1958,   308,  1033,  1337,  1961,   315,  1760,
  1963,   323,  1968,   328,  1703,  1321,  1708,  1970,   335,  1972,
   340,  2097,  1979,  1027,  1010,  1939,  1011,  1734,  1981,  1007,
  1989,  1373,  1010,  1530,  1552,  1011,  1747,  1006,  1994,   349,
  1035,  1766,  1006,  1999,   356,  1029,  1816,  1006,  2004,   362,
  1036,  1727,  1006,  2009,  1378,   356,  1029,  1006,  2016,  1031,
  1010,  1428,  1011,  1605,  1006,  2020,   369,  1514,  1006,  2025,
    83,   153,  1834,  1006,  2035,  1010,  1807,  1453,  1011,  1585,
  1001,  1402,  1495,  1006,  2039,  1656,  1428,  1626,  2043,   373,
  1003,  1038,  2048,   381,  1015,  1010,  1006,  2057,   387,  1021,
  1703,  1321,  1696,   228,  1034,  1006,  2068,   390,  1001,  1408,
     0,  1337,   171,  1337,     2,  1714,  1006,  2072,   397,  1006,
  1017,  2078,   259,  1035,  1004,  1034,  1006,  2081,     4,  1878,
  2084,   402,  1006,  2088,   417,  1001,  1006,  2092,   424,  1003,
  1006,  2095,  1001,   432,  2097,  1006;
CONSTINTEGER SS= 1972
conststring(11)array qcodes(0:233)="HALT"{=0},
                              "IADD"{=1},"ISUB"{=2},"IMULT"{=3},"IDIV"{=4},
                              "INEG"{=5},"IABS"{=6},"IREM"{=7},"IAND"{=8},
                              "IOR"{=9},"INOT"{=10},"IXOR"{=11},"ISHLL"{=12},
                              "ISHRL"{=13},"ISHLA"{=14},"ISHRA"{=15},"IGT"{=16},
                              "ILT"{=17},"IEQ"{=18},"INE"{=19},"IGE"{=20},
                              "ILE"{=21},"BNOT"{=22},"ITWB"{=36},"SFA"{=41},
                              "RETURN"{=42},"ASF"{=43},"IPUSH"{=44},"IPOP"{=45},
                              "EXCH"{=46},"DUPL"{=47},"DISCARD"{=48},"INDEX1"{=51},
                              "INDEX2"{=52},"INDEX4"{=53},"INDEX8"{=54},"INDEX"{=55},
                              "MVB"{=56},"CHK"{=57},"TMASK"{=58},"MVW"{=59},
                              "EZERO"{=60},"CPBGT"{=62},"CPBLT"{=63},"CPBEQ"{=64},
                              "CPBNE"{=65},"CPBGE"{=66},"CPBLE"{=67},"EMAKED"{68},
                              "ESPLITD"{69},"UMULT"{77},"UREM"{78},"UDIV"{79},
                              "UADD"{=80},"USUB"{=81},"UGT"{=82},"ULT"{=83},
                              "UEQ"{=84},"UNE"{=85},"UGE"{=86},"ULE"{=87},
                              "UCVTII"{=100},"IADDST"{=101},"ISUBST"{=102},"IMULTST"{=103},
                              "IDIVST"{=104},"INEGST"{=105},"UREMST"{106},"UDIVST"{107},
                              "IANDST"{=108},"IORST"{=109},"INOTST"{=110},"IXORST"{=111},
                              "IREMST"{=112},"RADD"{=113},"RSUB"{=114},"RMULT"{=115},
                              "RDIV"{=116},"RNEG"{=117},"RABS"{=118},"TNCRU"{130},
                              "CVTSBI"{=131},"CVTUI"{=132},"CVTUR"{=133},"CVTIU"{=134},
                              "CVTRU"{=135},"CVTII"{=136},"CVTIR"{=137},"CVTRR"{=138},
                              "TNCRI"{=139},"RNDRI"{=140},"EFLOOR"{=141},"TNCRR"{=142},
                              "RNDRR"{=143},"RGT"{=144},"RLT"{=145},"REQ"{=146},
                              "RNE"{=147},"RGE"{=148},"RLE"{=149},"RTWB"{=162},
                              "UCHECK"{=177},"ESTORE"{=184},"EDUPSTORE"{=185},"PUSHVAL"{=186},
                              "PUSHADDR"{=187},"EVAL"{=188},"EVALADDR"{=189},"EADDRESS"{=190},
                              "EINTRES"{=191},"EREALRES"{=192},"ESIZE"{=193},"EPOWER"{=194},
                              "EPOWERI"{=195},"ARGPROC"{=196},"PUSHBYTES"{=197},"EAUXST"{=198},
                              "EAUXADD"{=199},"EAUXRES"{=200},"EOLDLNB"{=201},"EFILL"{=202},
                              "ECDUP"{=203},"EMCHIP"{=205},"CXADD"{=257},"CXSUB"{=258},
                              "CXMULT"{=259},"CXDIV"{=260},"CXNEG"{=261},"CXASGN"{=262},
                              "CXEQ"{=263},"CXNE"{=264},"ECMPLX1"{=286},"ECMPLX2"{=287},
                              "ECONJG"{=279},"EANINT"{=266},"EM1EXP"{=267},"EISIGN"{=268},
                              "ESIGN"{=269},"EIMOD"{=270},"ERMOD"{=271},"EIDIM"{=272},
                              "ERDIM"{=273},"EIMIN"{=274},"ERMIN"{=275},"EIMAX"{=276},
                              "ERMAX"{=277},"EDMULT"{=278},"ECHAR"{=280},"EICHAR"{=281},
                              "EINDEXCHAR"{=282},"ECONCAT"{=283},"EASGNCHAR"{=284},"ECOMPCHAR"{=285},
                              "EISHFT"{=288},"EIBITS"{=289},"EIBSET"{=290},"EIBTEST"{=291},
                              "EIBCLR"{=292},"EISHFTC"{=293},"PROCARG"{=294},"IPROCARG"{=295},
                              "CHARARG"{=296},"IPROCCALL"{=297},"ARGPROCCALL"{=298},"CALLTPLATE"{=299},
                              "NOTEIORES"{=300},"STKIORES"{=301},"EFCVT"{=302},"EFCVTASGN"{=303},
                              "EARGLEN"{=304},"EFDVACC"{=305},"EFNOTEVR"{=306},"EFSETVR"{=307},
                              "EINCR"{=308},"EDECR"{=309},"ELOADB"{=310},"ESTOREB"{=311},
                              "EINCRB"{=312},"EDECRB"{=313},"EDINIT"{=314},"ELSHIFT"{=315},
                              "ERSHIFT"{=316},"EADJL"{=317},"EADJR"{=318},"EVERIFY"{=319},
                              "STRGT"{=511},"STRLT"{=512},"STREQ"{=513},"STRNE"{=514},
                              "STRGE"{=515},"STRLE"{=516},"PTREQ"{=520},"PTRNE"{=521},
                              "SETI"{=530},"SETU"{=531},"SETD"{=532},"SETLE"{=533},
                              "SETEQ"{=534},"SETNE"{=535},"SETIN"{=536},"SETSING"{=537},
                              "SETRANGE"{=538},"SETEMPTY"{=539},"CAPMOVE"{=547},"INDEXP"{=548},
                              "EOFOP"{=559},"EOLOP"{=560},"LAZYOP"{=574},"ISQR"{=601},
                              "IODD"{=602},"ISUCC"{=603},"IPRED"{=604},"UODD"{=605},
                              "USUCC"{=606},"UPRED"{=607},"RSQR"{=611},"CHKLT"{=620},
                              "CHKGT"{=621},"CHKNE"{=629},"CHKRNG"{=622},"CHKSETGT"{=623},
                              "CHKSETRNG"{=624},"UCHKLT"{=625},"UCHKGT"{=626},"UCHKNE"{=627},
                              "UCHKRNG"{=628},"CHKNEW2"{=630},"CHKUNDEF"{=631},"SETUNDEF"{=632},
                              "TRAP"{=633},"ICLPSH"{=642},"ICLPROT"{=643},""{=0},
                              "ESTKLIT"{=255};
constshortintegerarray opc(0:233)=0,
                              1,2,3,4,
                              5,6,7,8,
                              9,10,11,12,
                              13,14,15,16,
                              17,18,19,20,
                              21,22,36,41,
                              42,43,44,45,
                              46,47,48,51,
                              52,53,54,55,
                              56,57,58,59,
                              60,62,63,64,
                              65,66,67,68,
                              69,77,78,79,
                              80,81,82,83,
                              84,85,86,87,
                              100,101,102,103,
                              104,105,106,107,
                              108,109,110,111,
                              112,113,114,115,
                              116,117,118,130,
                              131,132,133,134,
                              135,136,137,138,
                              139,140,141,142,
                              143,144,145,146,
                              147,148,149,162,
                              177,184,185,186,
                              187,188,189,190,
                              191,192,193,194,
                              195,196,197,198,
                              199,200,201,202,
                              203,205,257,258,
                              259,260,261,262,
                              263,264,286,287,
                              279,266,267,268,
                              269,270,271,272,
                              273,274,275,276,
                              277,278,280,281,
                              282,283,284,285,
                              288,289,290,291,
                              292,293,294,295,
                              296,297,298,299,
                              300,301,302,303,
                              304,305,306,307,
                              308,309,310,311,
                              312,313,314,315,
                              316,317,318,319,
                              511,512,513,514,
                              515,516,520,521,
                              530,531,532,533,
                              534,535,536,537,
                              538,539,547,548,
                              559,560,574,601,
                              602,603,604,605,
                              606,607,611,620,
                              621,629,622,623,
                              624,625,626,627,
                              628,630,631,632,
                              633,642,643,0,
                              255;
!
CONSTINTEGER FIRST UCUB=224
CONSTINTEGER FIRST UCSB=first ucub+0
CONSTINTEGER FIRST UCW=first ucsb+1
CONSTINTEGER FIRST UCUBUB=first ucw+1
CONSTINTEGER FIRST UCUBW=0
CONSTINTEGER FIRST UCJUMP=0
CONSTINTEGER LASTUC=0
CONSTINTEGER LRLPT=X'62'
CONSTINTEGER NO OF SNS=67
                                        ! THE SPECIAL NAMES ARE HERE  TO ALLOW
                                        ! DIFFERENCES OF PRECISION BETWEEN COMPILERS
                                        ! ESPECIAL THE MAPS HALF&SHORT
CONSTINTEGERARRAY TSNAME (0:NO OF SNS)=X'1000'(8),
               X'1041',X'1000'(5),X'1051',X'1000'+LRLPT,
               X'1051'(2),X'1000'+LRLPT,
               X'1000'(2),X'52',X'51',LRLPT,X'1000'+LRLPT(7),
               X'1000',X'31',X'51',X'1000'+LRLPT(2),X'31',X'1000',
                X'4051',LRLPT,X'1000'(2),X'35',X'1000',X'1035',
                X'31',X'35',X'1035',X'33',0,X'1051',X'51',X'4062',X'51',
                X'61',X'72',X'61',X'72',X'51',LRLPT,X'1051',X'51',
               X'1000',LRLPT,X'1061'(2),X'41',X'1051';
! %END OF FILE M88Kponeas ie M88K TARGET DEPENDENT TABLES
!
! Changes for poneb02s
!   1) Improvements to UP and DOWN to flag internal blks or procs
!
!
CONST BYTE INTEGER ARRAY I TO E TAB(0 : 127) =       C
X'40',X'40',X'40',X'40',X'40',X'40',X'40',X'40',
X'40',X'40',X'15',X'40',X'0C',X'40',X'40',X'40',
X'40',X'40',X'40',X'40',X'40',X'40',X'40',X'40',
X'40',X'40',X'40',X'40',X'40',X'40',X'40',X'40',
X'40',X'4F',X'7F',X'7B',X'5B',X'6C',X'50',X'7D',
X'4D',X'5D',X'5C',X'4E',X'6B',X'60',X'4B',X'61',
X'F0',X'F1',X'F2',X'F3',X'F4',X'F5',X'F6',X'F7',
X'F8',X'F9',X'7A',X'5E',X'4C',X'7E',X'6E',X'6F',
X'7C',X'C1',X'C2',X'C3',X'C4',X'C5',X'C6',X'C7',
X'C8',X'C9',X'D1',X'D2',X'D3',X'D4',X'D5',X'D6',
X'D7',X'D8',X'D9',X'E2',X'E3',X'E4',X'E5',X'E6',
X'E7',X'E8',X'E9',X'4A',X'5F',X'5A',X'6A',X'6D',
X'7C',X'81',X'82',X'83',X'84',X'85',X'86',X'87',
X'88',X'89',X'91',X'92',X'93',X'94',X'95',X'96',
X'97',X'98',X'99',X'A2',X'A3',X'A4',X'A5',X'A6',
X'A7',X'A8',X'A9',X'C0',X'40',X'D0',X'40',X'40'
CONSTBYTEINTEGERARRAY ONE CASE(0 : 255) =   C
       0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
      16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
      48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
      96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,
       0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
      16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
      48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
      96,65+128,66+128,67+128,68+128,69+128,70+128,71+128,72+128,73+128,74+128,75+128,76+128,77+128,78+128,79+128,
      80+128,81+128,82+128,83+128,84+128,85+128,86+128,87+128,88+128,89+128,90+128,123,124,125,126,127;
CONSTINTEGER MAXLEVELS=31,COMMALT=2,DECALT=8,ENDALT=9,SNPT=X'1006'
CONSTINTEGER MAXIBITS=32;               ! BITS IN LARGEST INTEGER
CONSTBYTEINTEGERARRAY TRTAB(0:255)=0(48),1(10),
                                        0(7),2(26),0(6),2(26),0(*);
!
! RECORDFORMAT FOR ALL THE OPTION AND FLAG VARAIBLES
!
! amended to remove non-alined longreal prior to bootstrapping to gould
!
RECORDFORMAT PARMF(INTEGER BITS1,BITS2,TTOPUT,
      BYTEINTEGER LET,DYNAMIC,LINE,TRACE,ARR,DBUG,CHK,DIAG,OPT,FREE,
      LIST,CPRMODE,COMPILER,Z,Y,PROF,INHCODE,DCOMP,FAULTY,X,STACK,MAP,QUOTES,S2,
      INTEGER LPOPUT,SP0)
RECORDFORMAT LEVELF(INTEGER RBASE, DIAGINF, RAL, FLAG, L, M, NMDECS, ONWORD, ONINF,
         LABEL, JROUND, UNATT FORMATS, PSIZE, ENTRYAD, DISPLAY, AUXSBASE,
         NAMES, SNMAX,SN,RESSIZE,CLEVEL,SET, MAXPP, EXITLAB, CONTLAB, S3,
       INTEGERARRAY AVL WSP(0:4))

IF 1<<host&unsignedshorts=0 START
RECORDFORMAT RD((INTEGER S1 OR SHORT PTYPE,BYTE XB,FLAG),
      ((INTEGER D OR REAL R),
      INTEGER XTRA OR SHORT H0,H1,H2,H3 OR BYTE B0,B1,B2,B3,B4,B5,B6,B7))
RECORDFORMAT TAGF((SHORTINTEGER PTYPE,UIOJ,SNDISP,ACC,SLINK,KFORM OR C
      INTEGER S1,S2,S3),INTEGER LINK)
RECORDFORMAT TRIPF(BYTE OPERN,OPTYPE,CNT,DPTH,
      SHORTINTEGER FLAGS,PUSE,FLINK,BLINK,INTEGER X1,
      RECORD(RD) OPND1,OPND2)
RECORDFORMAT LISTF((SHORTINTEGER PTYPE,(SHORT UIOJ OR BYTE XB,FLAG),
      SHORT SNDISP,ACC,SLINK,KFORM OR  INTEGER S1,S2,S3),INTEGER LINK)
FINISH ELSE START
RECORDFORMAT RD((INTEGER S1 OR HALF PTYPE,BYTE XB,FLAG),
      ((INTEGER D OR REAL R),
      INTEGER XTRA OR HALF H0,H1,H2,H3 OR BYTE B0,B1,B2,B3,B4,B5,B6,B7))
RECORDFORMAT TAGF((HALFINTEGER PTYPE,UIOJ,SNDISP,ACC,SLINK,KFORM OR C
      INTEGER S1,S2,S3),INTEGER LINK)
RECORDFORMAT TRIPF(BYTE OPERN,OPTYPE,CNT,DPTH,
      HALFINTEGER FLAGS,PUSE,FLINK,BLINK,INTEGER X1,
      RECORD(RD) OPND1,OPND2)
RECORDFORMAT LISTF((HALFINTEGER PTYPE,(HALF UIOJ OR BYTE XB,FLAG),
      HALF SNDISP,ACC,SLINK,KFORM OR  INTEGER S1,S2,S3),INTEGER LINK)
FINISH
RECORDFORMAT WORKAF(INTEGER NNAMES,CCSIZE,DSIZE,ASL MAX,ASL CUR BTM,CONST PTR,
      CONST BTM,LASTTRIP,WKFILEAD,WKFILEK,FILE ADDR,RELEASE,AASL0,CONST LIMIT,
      RTCOUNT,ARTOP,AMAINEP,DICTBASE,OPTCNT,INCLHEAD,S2,S3,S4,
      INTEGERNAME LINE,N,S5,STRING(9)LADATE,
      BYTEINTEGERARRAYNAME CC,A,LETT,
      INTEGERARRAYNAME WORD,TAGS,CTABLE,
      RECORD(LEVELF)ARRAYNAME LEVELINF,
      INTEGERARRAY PLABS,PLINK(0:31),
      RECORD(LISTF)ARRAYNAME ASLIST)
!
! TRIPF_FLAGS SIGNIFY AS FOLLOWS
CONSTINTEGER LEAVE STACKED=2****0;      ! SET LEAVE RESULT IN ESTACK
CONSTINTEGER LOADOP1=2****1;            ! OPERAND 1 NEEDS LOADING
CONSTINTEGER LOADOP2=2****2;            ! OPERAND 2 NEEDS LOADING
CONSTINTEGER NOTINREG=2****3;           ! PREVENT REG OPTIMISNG
                                        ! OF TEMPS OVER LOOPS&JUMPS
CONSTINTEGER USE ESTACK=2****4;         ! KEEP DUPLICATE IN ESTACK
CONSTINTEGER USE MSTACK=2****5;         ! PUT DUPLICAT ON MSTACK
CONSTINTEGER CONSTANTOP=2****6;         ! ONE OPERAND IS CONSTANT(FOR FOLDING)
CONSTINTEGER COMMUTABLE=2****7;         ! OPERATION IS COMMUTABLE
CONSTINTEGER BSTRUCT=2****12;           ! Proc contains inner blks or RTs
CONSTINTEGER USED LATE=2****13;         ! I-RESULT USED AFTER LAB OR A LONG WAY AHEAD
CONSTINTEGER ASS LEVEL=2****14;         ! ASSEMBLER LEVEL OPERATION
CONSTINTEGER DONT OPT=2****15;          ! DONT DUPLICATE THIS RESULT
                                        ! USED FOR BYTE PTR & OTHER SODS!
!
RECORDFORMAT EMASFHDRF(INTEGER ENDRA,STARTRA,FBYTESIZE,W3,W4,W5,W6,W7)
                                        ! FORMAT FOR ARRAY HEADS
! %END %OF  %FILE "ERCC07.TRIMP_TFORM1S"
EXTRINSICRECORD(PARMF)PARM
EXTRINSICRECORD(WORKAF)WORKA
EXTERNALROUTINESPEC POP(INTEGERNAME A,B,C,D)
EXTERNALROUTINESPEC PUSH(INTEGERNAME A,INTEGER B,C,D)
externalroutinespec insert at end(integername a,integer b,c,d)
EXTERNALROUTINESPEC FAULT(INTEGER A,B,C)
!*
externalintegerfnspec malloc(integer bytes)
externalintegerfnspec fileread alias "read" (integer fid, bad, blen)
externalroutinespec free(integer bytes)
!*
if Target=MIPS start
   conststring(3) assprefix=" #"
finish else if Target=M88k start
   conststring(3) assprefix=" ;"
finish else start
   conststring(3) assprefix=""
finish
EXTERNALINTEGERFN PASSONE
ROUTINESPEC NEW SOURCE(INTEGER NEW FIL AD)
integerfnspec OLD SOURCE
ROUTINESPEC READ LINE(INTEGER MODE,CHAR)
INTEGERFNSPEC COMPARE(INTEGER P)
ROUTINESPEC PNAME(INTEGER MODE)
ROUTINESPEC EVALCONST(INTEGER MODE)
ROUTINESPEC TEXTTEXT(INTEGER EBCDIC)
EXTERNALROUTINESPEC MOVE BYTES(INTEGER LENGTH,FBASE,FOFF,TOBASE,TOOFF)
if 1<<host&IBMFPFORMAT#0 start
      CONSTINTEGERARRAY PRECONSTS(0:3)=10,0,{NL}X'413243F6',X'A8885A31'{PI};
finish else if host=Vax Start
      constintegerarray preconsts(0:3)=10,0,X'21fb4029',x'2d185444'
finish else if 1<<host&wordswopped#0 start
      constintegerarray preconsts(0:3)=10,0,x'54442d18',x'400921fb';
finish else start;             ! IEEE unswopped
       constintegerarray preconsts(0:3)=10,0,x'400921fb',x'54442d18'
finish
INTEGER I,J,K,LLENGTH,LEVEL,QMAX,Q,R,S,SNUM,NNAMES,DSIZE,NEXT,JJ,CPTR,
      STARSTART,ARSIZE,HIT,CTYPE,LASTAT,LASTNAME,LASTEND,STRLINK,IHEAD,
      IDEPTH,FILEADDR,FILEPTR,FILEEND
OWNBYTEINTEGERARRAYFORMAT SRCEF(0:1024*1024)

RECORD(EMASFHDRF)NAME HDR
LONGREAL IMAX
integer curlinead
STRING(15)NEM
INTEGERNAME LINE
BYTEINTEGERARRAYNAME CC,SOURCE,A
INTEGERARRAYNAME WORD,TAGS
      LINE==WORKA_LINE
      CC==WORKA_CC
      A==WORKA_A
      TAGS==WORKA_TAGS
      WORD==WORKA_WORD
      NNAMES=WORKA_NNAMES
      DSIZE=8*NNAMES
      ARSIZE=1024*WORKA_WKFILEK-(WORKA_CCSIZE+256);!256 BYTE MARGIN LEFT AT MAP TIME
      IMAX=(-1)>>1
INTEGERARRAY Downptr,SFS(0:MAXLEVELS)

BYTEINTEGERARRAYFORMAT LETTF(0:DSIZE+20)
BYTEINTEGERARRAYNAME LETT
BYTEINTEGERARRAY  TLINE(0:2047)
CONSTBYTEINTEGERARRAY ILETT(0: 532)= 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', 10,'R','E','A','D','S','T','R','I','N','G',  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', 11,'C','L',
    'O','S','E','S','T','R','E','A','M', 11,'B','Y','T','E','I','N',
    'T','E','G','E','R',  8,'E','V','E','N','T','I','N','F',
    6,'R','A','D','I','U','S',  6,'A','R','C','T','A','N',
      6,'L','E','N','G','T','H', 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',  8,'R','E','A','D','I','T','E','M',  8,'N',
    'E','X','T','I','T','E','M',  6,'C','H','A','R','N','O',  8,'T',
    'O','S','T','R','I','N','G',  9,'S','U','B','S','T','R','I',
    'N','G',  6,'R','E','C','O','R','D',  5,'A','R','R','A','Y',  6,
    'S','I','Z','E','O','F',4,'I','M','O','D',2,'P',
    'I',9,'E','V','E','N','T','L','I','N','E',11,'L','O','N','G',
    'I','N','T','E','G','E','R',12,'L','O','N','G','L','O','N','G',
    'R','E','A','L',9,'L','E','N','G','T','H','E','N','I',
     9,'L','E','N','G','T','H','E','N','R',
     8,'S','H','O','R','T','E','N','I',
     8,'S','H','O','R','T','E','N','R',
      6,'N','E','X','T','C','H',
      11,'H','A','L','F','I','N','T','E','G','E','R',
      8,'P','P','R','O','F','I','L','E',
      5,'F','L','O','A','T',
      4,'L','I','N','T',
      6,'L','I','N','T','P','T',
      12,'S','H','O','R','T','I','N','T','E','G','E','R',
      5,'T','R','U','N','C',255;
!*
byteintegerarrayformat inbuffm(0:4095)
ownbyteintegerarrayname inbuf
owninteger inptr=4095
owninteger dataad
!*
         LETT==ARRAY(ADDR(A(ARSIZE-DSIZE-20)),LETTF)
         ARSIZE=ARSIZE-DSIZE-300
!*
         dataad = malloc(4096)
         inbuf == array(dataad, inbuffm)
!*
         LETT(0)=0
         LEVEL=0

         WORKA_LETT==LETT
         CYCLE I=0,1,MAXLEVELS
            SFS(I)=0
         REPEAT
         CYCLE I=0,1,NNAMES
             WORD(I)=0; TAGS(I)=0;
         REPEAT
         FILEADDR=WORKA_FILEADDR
         IDEPTH=0; IHEAD=0
         IF FILEADDR#0 THEN START
            HDR==RECORD(FILEADDR)
            SOURCE==ARRAY(FILEADDR,SRCEF)
            FILEPTR=HDR_STARTRA
            FILEEND=HDR_ENDRA
         FINISH
         PARM_OPT=1; PARM_ARR=1
         PARM_LINE=1; PARM_TRACE=1;  PARM_DIAG=1
         PARM_CHK=1
         I=PARM_BITS1
         IF I&4=4 THEN PARM_DIAG=0
         IF I&X'800000'#0 THEN PARM_LINE=0
         IF I&16=16 THEN PARM_CHK=0
         PARM_MAP={I>>17&}1;              ! MAP CONTROLS FUNNY LISTING OF INCLUDES
         PARM_LIST=(I>>1&1)!!1
!         PARM_FREE=I>>19&1
         IF I&32=32  THEN PARM_ARR=0
         PARM_PROF=I>>7&1;              ! PROFILE BIT
         parm_prof=0 if parm_map#0;  ! Cant profile funny listint
         PARM_DYNAMIC=I>>20&1
         PARM_LET=I>>13&1
         PARM_DCOMP=I>>14&1;            ! PARM CODE OR D
         PARM_DBUG=I>>18&1
         PARM_QUOTES=I&1
         IF I&64=64 THEN PARM_TRACE=0 AND PARM_DIAG=0
         PARM_X=I>>28&1;                ! DONT REFORMAT REALS FOR SIMULATOR
         PARM_Y=I>>27&1
         PARM_Z=I>>26&1;             ! USE PARMZ BIT FOR DUMPING WKFILE
         PARM_STACK=I>>3&1
         IF I&(1<<16)#0 THEN START
            PARM_ARR=0; PARM_OPT=0
            PARM_LINE=0; PARM_CHK=0; PARM_DIAG=0
         FINISH
         PARM_TRACE=PARM_TRACE!PARM_OPT;   ! ALLOW NOTRACE ONLY WITH OPT
         NEWLINES(3)
!        %if target=MIPS %or Target=M88K %then printstring(assprefix)
         SPACES(4)
         PRINTSTRING("/* EPC Imp to C Translation ")
         PRINTSTRING("Release")
         WRITE(WORKA_RELEASE,1)
         PRINTSTRING(" Version ".WORKA_LADATE." */")
         NEWLINES(3)
         printstring("#include ""imptoc.h""
")
!        %if target=MIPS %or Target=M88k %then printstring(assprefix)
!         WRITE(NNAMES,5); WRITE(WORKA_ASL MAX,5)
!         NEWLINE
!
! NOW DECLARE THE SPECIAL NAMES WHICH ARE IN ARRAY ILETT.
!
BEGIN
RECORD(TAGF) SNTAG
      CPTR=0; SNUM=0; STRLINK=0
      K=0
      IF HOST//10<=1 THEN NEXT=1 ELSE NEXT=2;    !START AT 2 FOR WORD ADDRESSES HOSTS
      I=ILETT(0)
      WHILE I<255 CYCLE
         CYCLE J=I,-1,1
            CC(J)=ILETT(K+J)!32
         REPEAT
         CC(I+1)=';'
         R=2; Q=1; PNAME(1)
         SNTAG=0; SNTAG_UIOJ<-X'8000';   ! SET USED BIT
         JJ=TSNAME(SNUM)
         IF JJ&X'C000'#X'4000' START;   ! NOT A CONST VARAIBLE
            SNTAG_PTYPE=SNPT
            SNTAG_ACC=JJ;               ! TRUE PTYPE HERE
            SNTAG_SLINK=SNUM
         FINISHELSESTART
            SNTAG_PTYPE=JJ
            SNTAG_S2=PRECONSTS(CPTR)
            SNTAG_S3=PRECONSTS(CPTR+1)
            CPTR=CPTR+2
         FINISH
         PUSH(TAGS(LASTNAME),SNTAG_S1,SNTAG_S2,SNTAG_S3)
         SNUM=SNUM+1
         K=K+I+1; I=ILETT(K)
         exit if snum>no of sns
      REPEAT
!
! The idea of the above exit is to allow further special names to be added
! without preventing the rebuilds of compilers that do not support the extra facilities
! Until no of sns is increased in the steering consts the new names are ignored
!
END
!
         LINE=0; LLENGTH=0; Q=1
         R=1;  LEVEL=1
         CYCLE
         curlinead=file addr+fileptr
            IF Q>=LLENGTH THEN QMAX=1 AND READ LINE(0,0)
            if llength=-1 then exit        { no more input}
            STARSTART=R
            R=R+3
            A(R)=LINE>>8
            A(R+1)=LINE&255
            R=R+2
            movebytes(4,addr(curlinead),0,addr(a(0)),r)
            r=r+4
            IF COMPARE(SS)=0 THEN START
               FAULT(100,Q,QMAX<<16!LLENGTH)
               R=STARSTART
               Q=Q+1 WHILE CC(Q)#';' AND Q<LLENGTH
               Q=Q+1
            FINISH ELSE START
               FAULT(102, WORKA_WKFILEK, 0) IF R>ARSIZE
!               %IF A(STARSTART+9)=COMMALT %THEN R=STARSTART %ELSE %START
                  I=R-STARSTART
                  A(STARSTART)=I>>16
                  A(STARSTART+1)=I>>8&255
                  A(STARSTART+2)=I&255
!*DELSTART
                  IF PARM_Z#0 THEN START
                     NEWLINE;  WRITE(LINE, 5)
                     WRITE(STARSTART,5);  NEWLINE; J=0
                     CYCLE I=STARSTART, 1, R-1
                        WRITE(A(I), 5)
                     J=J+1
                     IF J>=20 THEN NEWLINE AND J=0
                     REPEAT
                     NEWLINE
                  FINISH
!*DELEND
                  IF A(STARSTART+9)=ENDALT AND C
                     1<=A(STARSTART+10)<=2 START; ! ENDOF PROG OR FILE
                     IF IHEAD=0 THEN EXIT
                     llength=OLD SOURCE
                     R=STARSTART;       ! IGNORE ENDOFFILE LIKE IMP77
                     LLENGTH=1
                     CONTINUE
                  FINISH
                  IF LEVEL=0 THEN START
                     FAULT(14, 0, 0)
                     R=STARSTART;       ! IGNORE IT
                     LEVEL=1
                  FINISH
!               %FINISH
            FINISH
         REPEAT
         WHILE SFS(1)#0 CYCLE
            POP(SFS(1),I,J,K)
            IF I=1 THEN FAULT(53,K,0);    ! FINISH MISSING
            IF I=2 THEN FAULT(13,K,0);    ! %REPEAT MISSING
         REPEAT
         A(I)=0 FOR I=R,1,R+7; R=R+8
         R=(R+7)&(-8)
         WORKA_DICTBASE=R
!         %CYCLE I=0,1,NEXT
!            A(R+I)=LETT(I)
!         %REPEAT
         move bytes(next+1,addr(lett(0)),0,addr(a(0)),r)
         WORKA_LETT==ARRAY(ADDR(A(R)),SRCEF)
         R=R+NEXT+1
         IF LEVEL>1 THEN FAULT(15,LEVEL-1,0)
         R=(R+7)&(-8)
         NEWLINE
         IF PARM_FAULTY=0 THEN START
            free(dataad)
         FINISH ELSE START
            PRINTSTRING("C GENERATION NOT ATTEMPTED
")
         FINISH
         RESULT=R
ROUTINE NEWSOURCE(INTEGER NEWFILEADDR)
!***********************************************************************
!*    SETS UP COMPILER TO USE AN INCLUDED SOURCE FILES                 *
!***********************************************************************
externalinteger filesseen=0
      PUSH(IHEAD,FILEADDR,FILEPTR,LINE)
      FILEADDR=NEWFILEADDR
      HDR==RECORD(FILEADDR)
      SOURCE==ARRAY(FILEADDR,SRCEF)
      FILEPTR=HDR_STARTRA
      FILEEND=HDR_ENDRA
      IDEPTH=IDEPTH+1
      filesseen=filesseen+1
      IF PARM_MAP#0 THEN LINE=18000+2000*filesseen
END
integerfn OLDSOURCE
!***********************************************************************
!*    UNDOES THE ABOVE
!***********************************************************************
INTEGER ALT LINE
      IF IHEAD#0 THEN START
         POP(IHEAD,FILEADDR,FILEPTR,ALTLINE)
          if Fileaddr#0 start;         ! if it was mapped remap
            HDR==RECORD(FILEADDR)
            FILEEND=HDR_ENDRA
            SOURCE==ARRAY(FILEADDR,SRCEF)
         finish
         IF PARM_MAP#0 THEN LINE=ALT LINE
         IDEPTH=IDEPTH-1
         result=1
      FINISH ELSE result=0
END
ROUTINE READ LINE(INTEGER MODE,CHAR)
integerfnSPEC GET LINE
INTEGER DEL, LL, LP, PREV, LASTC, PPREV, LASTNS, i,j
      LL=0;  LP=0; PREV=0; Q=1
      LLENGTH=0;  DEL=0; LASTC=-1;   ! NO CONTINUATIONS AS YET
NEXT:
      LP=LP+1
      IF LP>LL THEN lp=GET LINE
     if lp=0 then llength=-1 and return
      I=TLINE(LP)
      IF MODE=0 THEN START
         WHILE I='{' CYCLE
            CYCLE
               PREV=I
               LP=LP+1
               I=TLINE(LP)
            REPEAT UNTIL PREV='}' OR I=NL
         REPEAT
         while I='/' and tline(lp+1)='*' cycle
            cycle
              pprev=prev; prev=i; lp=lp+1
              i=tline(lp);
            repeat until i=nl or (prev='/' and pprev='*')
         repeat
         IF I='%'   THEN DEL=128 AND ->NEXT
!         %if parm_quotes#0 %then i=onecase(i+128) %else I=ONE CASE(I)
         IF 'A'<=I<='Z' THEN start
            I=I!DEL
         finish else if 'a'<=i<='z' then start
             if del#0 then i=(i-32)!DEL
         else
            DEL=0
!            ->NEXT %IF I=' '
         FINISH
         LLENGTH=LLENGTH+1
         CC(LLENGTH)=I
         IF I='''' OR I=34 THEN MODE=1 AND CHAR=I
      FINISH ELSE START
         LLENGTH=LLENGTH+1
         CC(LLENGTH)=I
         IF I=CHAR THEN MODE=0
      FINISH
      ->NEXT UNLESS I=NL
      j=LLENGTH
      LASTNS=CC(LLENGTH-1)
      while  LASTNS=' ' cycle             { Dont allow trailing spaces to trip us up}
         j=j-1
         LASTNS=CC(j-1)
      repeat
      IF LLENGTH-1=LASTC THEN LLENGTH=LASTC AND ->NEXT
      IF LASTNS='C'+128 THEN start
         CC(j-1)=' '                 { obnliterate %c with space }
         LLENGTH=LLENGTH-1
         LASTC=LLENGTH
         ->NEXT
      finish
      IF MODE=0 AND LASTNS='¬' THEN cc(LLENGTH)=13 and LASTC=LLENGTH AND ->NEXT
      IF MODE=0 AND LASTNS=',' THEN LLENGTH=LLENGTH-1 AND LASTC=LLENGTH AND ->NEXT
      FAULT(101,0,0) IF LLENGTH>WORKA_CCSIZE
      RETURN
integerfn GET LINE
externalintegerspec SrcId
CONSTBYTEINTEGERARRAY ITOI(0:255)=C
                  32(10),10,32(14),25,26,32(5),
                  32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
                  48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
                  64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
                  80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
                  96,97,98,99,100,101,102,103,104,105,106,107,108,109,
                  110,111,112,113,114,115,116,117,118,119,
                  120,121,122,123,124,125,126,32,
                  26(5),10,26(10),
                  26(16),
                  26(14),92,38,
                  26(11),35,26(4),
                  26(16),
                  26(9),35,26(5),94,
                  26(32);
INTEGER K
      LL=0
      IF FILE ADDR=0 THEN START;        ! SOURCE NOT A 'CLEAN' FILE
         UNTIL K=NL CYCLE
            { Since there is no support for read symbol, use }
            { Unix block read which is faster anyway.        }
            { READ SYMBOL(K)                                 }
            inptr = inptr + 1
            if inptr = 4096 thenstart
               k = fileread(SrcId, addr(inbuf(0)), 4096)
               inptr = 0
            finish
            k = inbuf(inptr)
            TLINE(LL+1)=ITOI(K)
            LL=LL+1
         REPEAT
         curlinead=0
      FINISH ELSE START
        IF FILEPTR>=FILE END START
            if OLD SOURCE=0 then result=0;                    ! RESET SOURCE FILES
            result=GETLINE
         FINISH
!         curlinead=file addr+fileptr
         UNTIL K=NL OR K=0 CYCLE
            K=SOURCE(FILEPTR);          ! NEXT CHAR FROM SORCE FILE
            FILE PTR=FILE PTR+1
            TLINE(LL+1)=ITOI(K)
            LL=LL+1
         REPEAT
      FINISH
      while ll>1 and TLINE(ll-1)=' ' cycle     { deal with trailing spaces }
         TLINE(LL-1)=TLINE(LL)
         LL=LL-1
      repeat
      LINE=LINE+1;                      ! COUNT ALL LINES
      IF PARM_LIST#0 THEN START
         IF MODE=0 AND LLENGTH>0 THEN C
            PRINTSTRING("     C") ELSE WRITE(LINE, 5)
      IF MODE#0 THEN PRINTSTRING("""       ") ELSE SPACES(8)
         IF HOST=ACCENT or ll>255 THEN START
            PRINT SYMBOL(TLINE(K)) FOR K=1,1,LL
          ELSE
            tline(0)=ll
            printstring(string(ADDR(TLINE(0))))
         finish
      FINISH
!      %IF PARM_FREE=0 %AND LL>73 %THEN TLINE(73)=10 %AND LL=73
      result=1             { line got OK}
END
END
integerfn next nonspace
integer i
      i=cc(q)
      q=q+1 and i=cc(q) while i=' '
      result=i
end
INTEGERFN COMPARE(INTEGER P)
INTEGER I, J, ITEM, RA, RL, RP, RQ, RR, RS, MARKER, SSL, ALT, PP, nbochar
OWNINTEGER SAVECOMP;                    ! FOR CHECKING DSIDED CONDS
SWITCH BIP(999:1043)
      RP=SYMBOL(P)
      RL=LEVEL
      P=P+1
      PP=P;                          ! ROUTINE REALLY STARTS HERE
COMM:
      RQ=Q;                             ! RESET VALUES OF LINE&AR PTRS
      RR=R
      SSL=STRLINK;                      ! SAVE STRING LINK
      ALT=1;                            ! FIRST ALTERNATIVE TO BE TRIED
      RA=SYMBOL(P);                     ! RA TO NEXT PHRASE ALTERNATIVE
      RS=P
UPR:     R=R+1
SUCC:                                   ! SUCCESS ON TO NEXT ITEM
      RS=RS+1;                          ! RS=NEXT ALTERNATIVE MEANS THAT
                                        ! THIS ALT HAS BEEN COMPLETED SO
                                        ! EXIT WITH HIT=1
      IF RS=RA THEN ->FINI
      ITEM=SYMBOL(RS);                  ! NEXT BRICK IN THE CURRENT ALT
!printstring("testing item&sym"); write(item,4); space; printsymbol(nextnonspace&127); 
!      write(q,5);
!      write(nextnonspace,4); newline
      IF ITEM<999 THEN ->LIT
      IF ITEM<1300  THEN ->BIP(ITEM)
                                        ! BRICK IS A PHRASE TYPE
      IF COMPARE(ITEM)=0 THEN ->FAIL
      ->SUCC
LIT:                                    ! BRICK IS LITERAL
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS I=CLETT(ITEM+1)
      Q=Q+1
      K=CLETT(ITEM)+ITEM
      ITEM=ITEM+2
      WHILE ITEM<=K CYCLE
         ->FAIL UNLESS next nonspace=CLETT(ITEM)
         Q=Q+1
         ITEM=ITEM+1
      REPEAT;                           ! CHECK IT WITH LITERAL DICT ENTRY
      ->SUCC;                           ! MATCHED SUCCESSFULLY
FAIL:                                   ! FAILURE - NOTE POSITION REACHD
      IF RA=RP THEN ->TFAIL;            ! TOTAL FAILURE NO ALT TO TRY
      QMAX=Q IF Q>QMAX
      Q=RQ;                             ! RESET LINE AND A.R. POINTERS
      R=RR+1;                           ! AVOID GOING VIA UPR:
      STRLINK=SSL
      ALT=ALT+1;                        ! MOVE TO NEXT ALT OF PHRASE
      RS=RA
      RA=SYMBOL(RA)
      ->SUCC
TFAIL:
      LEVEL=RL
      RESULT=0
BIP(999):                               ! REPEATED PHRASE
      A(RR)=ALT; P=PP
      ->COMM
BIP(1000):FINI:                         ! NULL ALWAYS LAST & OK
      A(RR)=ALT
      RESULT=1
BIP(1001):                              ! PHRASE NAME
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS TRTAB(I)=2
      PNAME(ITEM-1004)
      ->SUCC IF HIT=1;  ->FAIL
BIP(1002):                              ! PHRASE INTEGER CONSTANT
BIP(1003):                              ! PHRASE CONST
      EVALCONST(ITEM-1003)
      ->FAIL IF HIT=0
      ->SUCC
BIP(1004):                              ! PHRASE DUMMYSTART
      A(R)=1;                           ! THERE IS AN '%ELSESTART'
      R=R+1
      ->SUCC
BIP(1005):                              ! PHRASE N
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS '0'<=I<='9'
      S=0
      WHILE '0'<=I<='9' CYCLE
         S=10*S+I&15
         Q=Q+1; I=next nonspace
      REPEAT
      A(R)<-S>>8; A(R+1)=S&255
      R=R+2; ->SUCC
BIP(1006):                              ! PHRASE S=SEPARATOR
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      a(r)=I; r=r+1
      ->SUCC IF I=NL
      ->FAIL UNLESS I=';'
      Q=Q+1; ->SUCC
BIP(1007):
                                        ! PHRASE COMMENT TEXT
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      IF I='#' THEN start
         a(r)=1; r=r+1
         Q=Q+1; ->COMFOUND
      finish
      IF I='!' THEN start
         a(r)=2; r=r+1
         Q=Q+1; ->COMFOUND
      finish
      ->FAIL UNLESS I='C'+128 AND CC(Q+1)=C
         'O'+128 AND CC(Q+2)=CC(Q+3)='M'+128 AND CC(Q+4)='E'+128
         ->FAIL UNLESS CC(Q+5)='N'+128 AND CC(Q+6)='T'+128
      Q=Q+7
      a(r)=3; r=r+1
COMFOUND:
      J=CC(Q)
      CYCLE
         a(r)=j; r=r+1
         EXIT IF J=NL
         Q=Q+1; J=CC(Q)
      REPEAT
      ->SUCC
BIP(1008):                              ! PHRASE BIGHOLE
                                        ! NOT CURRENTLY USED IN TRIMP
!      A(I)=0 %FOR I=R,1,R+3
!      R=R+4
      ->SUCC
BIP(1009):                              ! PHRASE N255
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS '0'<=I<='9'
      S=0
      WHILE '0'<=I<='9' CYCLE
         S=10*S+I&15
         Q=Q+1; I=next nonspace
      REPEAT
      ->FAIL UNLESS 0<=S<=255
      A(R)=S; ->UPR
BIP(1010):                              ! PHRASE HOLE
      MARKER=R;  R=R+2;  ->SUCC
BIP(1011):                              ! PHRASE MARK
      I=R-MARKER
      A(MARKER+1)<-I
      A(MARKER)<-I>>8
      ->SUCC
BIP(1012):                              ! PHRASE read line?
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      WHILE I=NL CYCLE
         if llength=-1 then fault(110,0,0)
         read line(0,0)
         RQ=1
         I=next nonspace
      REPEAT
      FAULT(102, WORKA_WKFILEK,0) IF R>ARSIZE
      ->SUCC
BIP(1013):                              ! PHRASE CHECKIMPS
      TEXTTEXT(0)
      ->FAIL IF HIT=0
      ->SUCC
BIP(1014):                              ! PHRASE DUMMY APP
      A(R)=2; A(R+1)=2
      R=R+2; ->SUCC
BIP(1015):                              ! PHRASE DOWN=NEW TEXT LEVEL
      if level>1 then a(downptr(level))=1;     ! flag down in enclosing blk
      LEVEL=LEVEL+1
      SFS(LEVEL)=0
      Downptr(level)=r
      ->SUCC
BIP(1016):                              ! PHRASE UP 1 TEXTUAL LEVEL
      WHILE SFS(LEVEL)#0 CYCLE
         POP(SFS(LEVEL),I,J,K)
         IF I=1 THEN FAULT(53,K,0);    ! FINISH MISSING
         IF I=2 THEN FAULT(13,K,0);    ! %REPEAT MISSING
      REPEAT
      LEVEL=LEVEL-1
      ->SUCC
BIP(1017):                              ! PHRASE LISTON
      PARM_LIST=1;  ->SUCC
BIP(1018):                              ! PHRASE LISTOFF
      PARM_LIST=0;  ->SUCC
BIP(1019):                              ! PHRASE COLON FOR LABEL
      ->FAIL UNLESS CC(Q-1)=':'
      ->SUCC
BIP(1020):                              ! PHRASE NOTE CONST
      ->SUCC
BIP(1021):                              ! TRACE FOR ON CONDITIONS
      PARM_TRACE=1; ->SUCC
BIP(1022):                              ! SET MNEMONIC
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      J=0
      NEM="123456789abcdef"
      WHILE 'A'<=I<='Z' OR '0'<=I<='9' CYCLE
         J=J+1
         if j>=15 then ->fail
         CHARNO(NEM,J)=I
         Q=Q+1; I=next nonspace
      REPEAT
      ->FAIL UNLESS J>0
      LENGTH(NEM)=J
      IF I='_' THEN Q=Q+1
      ->SUCC
BIP(1023):                              ! UCNOP MNEMONIC SANS OPERANDS
      ->FAIL IF (TARGET=PNX OR  TARGET=ACCENT or c
         target=drs or target=wwc or target=perq3) AND CC(Q-1)='_'
                                        ! EFFICIENCY FROG FOR ASSBLERS
                                        ! WITH NO PARAMETER OPCODES
      CYCLE I=0,1,FIRSTUCUB-1
         ->PFND IF NEM=QCODES(I)
      REPEAT
      ->FAIL
PFND:
      J=OPC(I)
      A(R)<-J>>8; A(R+1)<-J
      R=R+2; ->SUCC;                    ! ALLOW MORE THAN 255 OPCODES
BIP(1024):                              ! UCUB MNEMONIC WITH UNSIGNED BYTE OPERAND
      CYCLE I=FIRST UCUB,1,FIRST UCSB-1
         ->PFND IF NEM=QCODES(I)
      REPEAT
      ->FAIL
BIP(1025):                             ! UCUB SIGNED BYTE OPERANDS
      CYCLE I=FIRST UCSB,1,FIRST UCW-1
         ->PFND IF NEM=QCODES(I)
      REPEAT; ->FAIL
BIP(1026):                              ! P(OP)=+,-,&,****,**,*,!!,!,
                                        ! //,/,>>,<<,.,¬¬,¬
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS 32<I<127 AND C
         X'80000000'>>((I-32)&31)&X'4237000A'#0
      Q=Q+1
      IF I='+' THEN A(R)=1 AND ->UPR
      IF I='-' THEN A(R)=2 AND ->UPR
      IF I='&' THEN A(R)=3 AND ->UPR
      J=next nonspace
      IF I='*' THEN START
         IF J#I THEN A(R)=6 AND ->UPR
         IF CC(Q+1)=I=CC(Q+2) THEN A(R)=4 AND Q=Q+3 AND ->UPR
         A(R)=5; Q=Q+1; ->UPR
      FINISH
      IF I='/' THEN START
         IF J#I THEN A(R)=10 AND ->UPR
         A(R)=9; Q=Q+1; ->UPR
      FINISH
      IF I='!' THEN START
         IF J#I THEN A(R)=8 AND ->UPR
         A(R)=7; Q=Q+1; ->UPR
      FINISH
      IF I='.' THEN A(R)=13 AND ->UPR
      IF I=J='<' THEN A(R)=12 AND Q=Q+1 AND ->UPR
      IF I=J='>' THEN A(R)=11 AND Q=Q+1 AND ->UPR
      IF I='¬' THEN START
         IF J#I THEN A(R)=15 AND ->UPR
         Q=Q+1; A(R)=14; ->UPR
      FINISH
      ->FAIL
BIP(1027):                              ! PHRASE CHECK UI
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->SUCC IF TRTAB(I)=2 OR I='-'
      ->SUCC IF X'80000000'>>(I&31)&X'14043000'#0
      ->FAIL
BIP(1028):                              ! P(+')=+,-,¬,0
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      IF I='¬' OR I=X'7E' THEN A(R)=3 AND Q=Q+1 AND ->UPR
      IF I='-' THEN A(R)=2 AND Q=Q+1 AND ->UPR
      IF I='+' THEN A(R)=1 AND Q=Q+1 AND ->UPR
      A(R)=4; ->UPR
BIP(1029):                              ! PHRASE NOTE CYCLE
      A(R)=0; A(R+1)=0
      A(R+2)=0; A(R+3)=0
      PUSH(SFS(LEVEL),2,R,LINE)
      R=R+4
      ->SUCC
BIP(1030):                              ! P(,')=',',0
!
! THIS IS VERY AWKWARD AS IT MEANS IT IS VERY TO HARD TO FIND
! THE END OF A PARAMETER LIST WITHOUT CHURNING. BY MAKING THIS A BIP
! WE CAN PEEP AHEAD FOR ')' AND FAIL HERE.
!
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      IF I=')' THEN ->FAIL
      IF I=',' THEN Q=Q+1
      ->SUCC
BIP(1031):                              ! PHRASE CHECKTYPE IE ENSURE
                                        ! FIRST LETTER IS(B,H,I,L,R,S) &
                                        ! 3RD LETTER IS (A,L,N,O,R,T)
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS I>128 AND X'80000000'>>(I&31)&X'20C83000'#0C
         AND X'80000000'>>(CC(Q+2)&31)&X'500B2800'#0
      ->SUCC
BIP(1032):                              ! PHRASE COMP1
BIP(1037):                              ! PHRASE COMP2(IS 2ND HALF OF DSIDED)
      I=next nonspace;                  ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS 32<I<=92 AND C
         X'80000000'>>(I&31)&X'1004000E'#0
                                        ! '='=1,'>='=2,'>'=3
                                        ! '#' OR '¬=' OR '<>'=4
                                        ! '<='=5,'<'=6
                                        ! 7UNUSED,'->'=8,'=='=9
                                        ! '##' OR '¬==' =10
      q=q+1; nbochar=next nonspace
      IF I='=' THEN START
         IF nbochar=I THEN J=9 AND ->JOIN1
         J=1; ->JOIN
      FINISH
      IF I='#' THEN START
         IF nbochar=I THEN J=10 AND ->JOIN1
         J=4; ->JOIN
      FINISH
      IF I='¬' AND nbochar='=' THEN START
         Q=Q+1
         IF next nonspace='=' THEN J=10 AND ->JOIN1
         J=4; ->JOIN
      FINISH
      IF I='>' THEN START
         IF nbochar='=' THEN J=2 AND ->JOIN1
         J=3; ->JOIN
      FINISH
      IF I='<' THEN START
         IF nbochar='>' THEN J=4 AND ->JOIN1
         IF nbochar='=' THEN J=5 AND ->JOIN1
         J=6; ->JOIN
      FINISH
      IF I='-' AND nbochar='>' THEN J=8 AND ->JOIN1
      ->FAIL
JOIN1:Q=Q+1
JOIN:
      A(R)=J
      IF ITEM=1032 THEN SAVECOMP=J AND ->UPR
                                        ! SAVE J TO CHECK DSIDED
      IF SAVECOMP>6 OR J>6 THEN Q=Q-1 AND ->FAIL;    ! ILLEGAL DSIDED
      ->UPR;                            ! NB OWNS WONT WORK IF
                                        ! COND EXPRS ALLOWED AS THE
                                        ! CAN BE NESTED!
BIP(1033):                              ! P(ASSOP)- ==,=,<-,->
      I=next nonspace
      q=q+1; nbochar=next nonspace
      if i='=' then start
         if nbochar='=' then A(R)=1 AND Q=Q+1 AND ->UPR
         A(R)=2; ->UPR
      FINISH
      IF I='<' AND nbochar='-' THEN A(R)=3 AND Q=Q+1 AND ->UPR
      IF I='-' AND nbochar='>' THEN A(R)=4 AND Q=Q+1 AND ->UPR
      ->FAIL
BIP(1034):                              ! NOTE START
      A(R)=0; A(R+1)=0
      A(R+2)=0; A(R+3)=0;               ! HOLE FOR FORWARD PTR
      PUSH(SFS(LEVEL),1,R,LINE)
      R=R+4
      ->SUCC
BIP(1035):                              ! NOTE FINISH
      IF SFS(LEVEL)=0 THEN FAULT(51,0,0) AND ->SUCC
      POP(SFS(LEVEL),I,J,K)
      IF I=2 THEN FAULT(59,K,0)
      MOVEBYTES(4,ADDR(STARSTART),0,ADDR(A(0)),J)
      ->SUCC
BIP(1036):                              ! NOTE REPEAT
      IF SFS(LEVEL)=0 THEN FAULT(1,0,0) AND ->SUCC
      POP(SFS(LEVEL),I,J,K)
      IF I=1 THEN FAULT(52,K,0);       ! START INSTEAD OF CYCLE
      MOVEBYTES(4,ADDR(STARSTART),0,ADDR(A(0)),J)
      ->SUCC
BIP(1038):                              ! INCLUDE "FILE"
      ->FAIL IF IDEPTH>10
      I=next nonspace
      ->FAIL UNLESS I=NL OR I=';'
      Q=Q+1 IF I=';'
      ->FAIL UNLESS CTYPE=5 AND (Host#emas or A(S)<=31)
BEGIN
STRING(255) FNAME
SYSTEMROUTINESPEC CONSOURCE(STRING(255)FILENAME,INTEGERNAME FILEADDR)
      LENGTH(FNAME)=A(S)
      CHARNO(FNAME,I)=A(S+I) FOR I=1,1,A(S)
      if host=Vax Start
         unless fname->(".") then fname=fname.".INC"
      finish
      CONSOURCE(FNAME,J)
      NEWSOURCE(J)
END
      ->succ
BIP(1039):                              ! UCW = USERCODE WORD OFFSET INSTRS
      CYCLE I=FIRST UCW,1,FIRST UCUBUB-1
         ->PFND IF NEM=QCODES(I)
      REPEAT
      ->FAIL
BIP(1040):                              ! UCUBUB TWO UNSIGNED BYTE OPERANDS
      CYCLE I=FIRST UCUBUB,1,FIRST UCUBW-1
         ->PFND IF NEM=QCODES(I)
      REPEAT; ->FAIL
BIP(1041):                              ! UCUCUBW - BYTE&WORD OPERANDS
      CYCLE I=FIRST UCUBW,1,FIRST UCJUMP-1
         ->PFND IF NEM=QCODES(I)
      REPEAT; ->FAIL
BIP(1042):                              ! UCJUMP = JUMP MNEMONICS
      CYCLE I=FIRST UCJUMP,1,LASTUC
         ->PFND IF NEM=QCODES(I)
      REPEAT; ->FAIL
BIP(1043):                              ! UCWRONG ERRORS AND OTHER M-CS
      I=next nonspace
      CYCLE
         Q=Q+1
         EXIT IF I=NL OR I=';'
         I=next nonspace
      REPEAT
      ->SUCC
END;                                    !OF ROUTINE 'COMPARE'
ROUTINE PNAME(INTEGER MODE)
!***********************************************************************
!*       MODE=0 FOR OLD NAME(ALREADY IN DICT), MODE=1 FOR NEW NAME     *
!***********************************************************************
CONSTINTEGERARRAY HASH(0:7)=71,47,97,79,29,37,53,59;
INTEGER JJ, KK, LL, FQ, FS, T, S, I
      HIT=0;  FQ=Q;  FS=next nonspace
      q=q+1
      RETURN UNLESS TRTAB(FS)=2 AND M'"'#next nonspace#M''''
                                        ! 1ST CHAR MUST BE LETTER
      if PARM_QUOTES=0 then FS=FS!32
      T=1
      LETT(NEXT+1)=FS; JJ=71*FS
      q=q-1
      CYCLE
         Q=Q+1
         I=next nonspace
         EXIT IF TRTAB(I)=0
         if PARM_QUOTES=0 then I=I!32
         JJ=JJ+HASH(T)*I IF T<=7
         T=T+1
         LETT(NEXT+T)=I
      REPEAT
      LETT(NEXT)=T;                     ! INSERT LENGTH
      S=T+1
      FAULT(103,0,0) IF NEXT+S>DSIZE;  !DICTIONARY OVERFLOW
      JJ=(JJ+113*T)&NNAMES
      CYCLE KK=JJ, 1, NNAMES
         LL=WORD(KK)
         ->HOLE IF LL=0;                ! NAME NOT KNOWN
         ->FND IF STRING(ADDR(LETT(NEXT)))=STRING(ADDR(LETT(LL)))
      REPEAT
      CYCLE KK=0,1,JJ
         LL=WORD(KK)
         ->HOLE IF LL=0;                ! NAME NOT KNOWN
         ->FND IF STRING(ADDR(LETT(NEXT)))=STRING(ADDR(LETT(LL)))
      REPEAT
      FAULT(104, 0, 0);                 ! TOO MANY NAMES
HOLE: IF MODE=0 THEN Q=FQ AND RETURN
      WORD(KK)=NEXT
      IF HOST//10<=1 THEN NEXT=NEXT+S ELSE NEXT=(NEXT+S+1)&(-2)
FND:  LASTAT=FQ;  HIT=1;  LASTNAME=KK
      A(R+1)<-LASTNAME
      A(R)=LASTNAME>>8; R=R+2
      LASTEND=Q
END

ROUTINE EVALCONST(INTEGER MODE)
!***********************************************************************
!*       SYNTAX CHECK AND EVALUATE ALL THE FORMS OF IMP CONSTANT       *
!*       MODE=0 FOR INTEGER CONSTANTS #0 FOR ANY SORT OF CONSTANT      *
!***********************************************************************
CONSTBYTEINTEGERARRAY RSHIFT(0:32)=0,0,1,0,2,0(3),3,0(7),4,0(15),5;
INTEGER Z, DOTSEEN, EBCDIC, FS, CPREC, RR, S, SS, T, RS, J, nbochar, QQ
integer hexformat
integerarray rhexpat(0:3)
constinteger powerl=75
IF 1<<HOST&LLREALAVAIL#0 START
   if 1<<host&ibmfpformat#0 Start
constinteger powerll=-78
! from ibm assembler which claims to evaluate exactly and round to 128 bits
CONSTLONGLONGREALARRAY    POWERS (-78:75)=                  C
       {Ten to the -78}           R'001DA48CE468E7C772026520247D3556' ,
       {Ten to the -77}           R'011286D80EC190DC73617F3416CE4156' ,
       {Ten to the -76}           R'01B94470938FA89B73CEF808E40E8D5B' ,
       {Ten to the -75}           R'0273CAC65C39C96174615B058E891859' ,
       {Ten to the -74}           R'03485EBBF9A41DDC75DCD8E37915AF38' ,
       {Ten to the -73}           R'042D3B357C0692AA760A078E2BAD8D83' ,
       {Ten to the -72}           R'051C45016D841BAA774644B8DB4C7872' ,
       {Ten to the -71}           R'0611AB20E472914A786BEAF3890FCB47' ,
       {Ten to the -70}           R'06B0AF48EC79ACE878372D835A9DF0C7' ,
       {Ten to the -69}           R'076E6D8D93CC0C1179227C7218A2B67C' ,
       {Ten to the -68}           R'084504787C5F878A7AB58DC74F65B20E' ,
       {Ten to the -67}           R'092B22CB4DBBB4B67BB1789C919F8F49' ,
       {Ten to the -66}           R'0A1AF5BF109550F27C2EEB61DB03B98D' ,
       {Ten to the -65}           R'0B10D9976A5D52977D5D531D28E253F8' ,
       {Ten to the -64}           R'0BA87FEA27A539E97DA53F2398D747B3' ,
       {Ten to the -63}           R'0C694FF258C744327E0747763F868CD0' ,
       {Ten to the -62}           R'0D41D1F7777C8A9F7F448CA9E7B41802' ,
       {Ten to the -61}           R'0E29233AAAADD6A3008AD7EA30D08F01' ,
       {Ten to the -60}           R'0F19B604AAACA6260136C6F25E825961' ,
       {Ten to the -59}           R'101011C2EAABE7D702E23C577B1177DD' ,
       {Ten to the -58}           R'10A0B19D2AB70E6E02D65B6ACEAEAE9D' ,
       {Ten to the -57}           R'11646F023AB269050345F922C12D2D22' ,
       {Ten to the -56}           R'123EC56164AF81A3044BBBB5B8BC3C35' ,
       {Ten to the -55}           R'13273B5CDEEDB106050F55519375A5A1' ,
       {Ten to the -54}           R'1418851A0B548EA306C99552FC298785' ,
       {Ten to the -53}           R'14F53304714D926506DFD53DD99F4B30' ,
       {Ten to the -52}           R'15993FE2C6D07B7F07ABE546A8038EFE' ,
       {Ten to the -51}           R'165FC7EDBC424D2F08CB6F4C2902395F' ,
       {Ten to the -50}           R'173BDCF495A9703D09DF258F99A163DB' ,
       {Ten to the -49}           R'18256A18DD89E6260AAB7779C004DE69' ,
       {Ten to the -48}           R'1917624F8A762FD80B2B2AAC18030B02' ,
       {Ten to the -47}           R'19E9D71B689DDE710BAFAAB8F01E6E11' ,
       {Ten to the -46}           R'1A9226712162AB070C0DCAB3961304CA' ,
       {Ten to the -45}           R'1B5B5806B4DDAAE40D689EB03DCBE2FF' ,
       {Ten to the -44}           R'1C391704310A8ACE0EC1632E269F6DDF' ,
       {Ten to the -43}           R'1D23AE629EA696C10F38DDFCD823A4AB' ,
       {Ten to the -42}           R'1E164CFDA3281E3810C38ABE071646EB' ,
       {Ten to the -41}           R'1EDF01E85F912E3710A36B6C46DEC52F' ,
       {Ten to the -40}           R'1F8B61313BBABCE211C62323AC4B3B3E' ,
       {Ten to the -39}           R'20571CBEC554B60D12BBD5F64BAF0507' ,
       {Ten to the -38}           R'213671F73B54F1C8139565B9EF4D6324' ,
       {Ten to the -37}           R'2222073A8515171D145D5F9435905DF7' ,
       {Ten to the -36}           R'23154484932D2E72155A5BBCA17A3ABA' ,
       {Ten to the -35}           R'23D4AD2DBFC3D0771587955E4EC64B45' ,
       {Ten to the -34}           R'2484EC3C97DA624A16B4BD5AF13BEF0B' ,
       {Ten to the -33}           R'255313A5DEE87D6E17B0F658D6C57567' ,
       {Ten to the -32}           R'2633EC47AB514E65182E99F7863B6960' ,
       {Ten to the -31}           R'272073ACCB12D0FF193D203AB3E521DC' ,
       {Ten to the -30}           R'2814484BFEEBC29F1A863424B06F352A' ,
       {Ten to the -29}           R'28CAD2F7F5359A3B1A3E096EE45813A0' ,
       {Ten to the -28}           R'297EC3DAF94180651B06C5E54EB70C44' ,
       {Ten to the -27}           R'2A4F3A68DBC8F03F1C243BAF513267AB' ,
       {Ten to the -26}           R'2B318481895D96271D76A54D92BF80CB' ,
       {Ten to the -25}           R'2C1EF2D0F5DA7DD81EAA27507BB7B07F' ,
       {Ten to the -24}           R'2D1357C299A88EA71F6A58924D52CE4F' ,
       {Ten to the -23}           R'2DC16D9A0095928A1F2775B7053C0F18' ,
       {Ten to the -22}           R'2E78E480405D7B962058A9926345896F' ,
       {Ten to the -21}           R'2F4B8ED0283A6D3D21F769FB7E0B75E5' ,
       {Ten to the -20}           R'302F39421924844622BAA23D2EC729AF' ,
       {Ten to the -19}           R'311D83C94FB6D2AC2334A5663D3C7A0E' ,
       {Ten to the -18}           R'3212725DD1D243AB24A0E75FE645CC48' ,
       {Ten to the -17}           R'32B877AA3236A4B4244909BEFEB9FAD5' ,
       {Ten to the -16}           R'33734ACA5F6226F025ADA6175F343CC5' ,
       {Ten to the -15}           R'34480EBE7B9D5856266C87CE9B80A5FB' ,
       {Ten to the -14}           R'352D09370D4257362703D4E1213067BD' ,
       {Ten to the -13}           R'361C25C26849768128C2650CB4BE40D6' ,
       {Ten to the -12}           R'37119799812DEA1129197F27F0F6E886' ,
       {Ten to the -11}           R'37AFEBFF0BCB24AA29FEF78F69A5153A' ,
       {Ten to the -10}           R'386DF37F675EF6EA2ADF5AB9A2072D44' ,
       {Ten to the  -9}           R'3944B82FA09B5A522BCB98B405447C4B' ,
       {Ten to the  -8}           R'3A2AF31DC46118732CBF3F70834ACDAF' ,
       {Ten to the  -7}           R'3B1AD7F29ABCAF482D5787A6520EC08D' ,
       {Ten to the  -6}           R'3C10C6F7A0B5ED8D2E36B4C7F3493858' ,
       {Ten to the  -5}           R'3CA7C5AC471B47842E230FCF80DC3372' ,
       {Ten to the  -4}           R'3D68DB8BAC710CB22F95E9E1B089A027' ,
       {Ten to the  -3}           R'3E4189374BC6A7EF309DB22D0E560419' ,
       {Ten to the  -2}           R'3F28F5C28F5C28F531C28F5C28F5C28F' ,
       {Ten to the  -1}           R'4019999999999999329999999999999A' ,
       {Ten to the   0}           R'41100000000000003300000000000000' ,
       {Ten to the   1}           R'41A00000000000003300000000000000' ,
       {Ten to the   2}           R'42640000000000003400000000000000' ,
       {Ten to the   3}           R'433E8000000000003500000000000000' ,
       {Ten to the   4}           R'44271000000000003600000000000000' ,
       {Ten to the   5}           R'45186A00000000003700000000000000' ,
       {Ten to the   6}           R'45F42400000000003700000000000000' ,
       {Ten to the   7}           R'46989680000000003800000000000000' ,
       {Ten to the   8}           R'475F5E10000000003900000000000000' ,
       {Ten to the   9}           R'483B9ACA000000003A00000000000000' ,
       {Ten to the  10}           R'492540BE400000003B00000000000000' ,
       {Ten to the  11}           R'4A174876E80000003C00000000000000' ,
       {Ten to the  12}           R'4AE8D4A5100000003C00000000000000' ,
       {Ten to the  13}           R'4B9184E72A0000003D00000000000000' ,
       {Ten to the  14}           R'4C5AF3107A4000003E00000000000000' ,
       {Ten to the  15}           R'4D38D7EA4C6800003F00000000000000' ,
       {Ten to the  16}           R'4E2386F26FC100004000000000000000' ,
       {Ten to the  17}           R'4F16345785D8A0004100000000000000' ,
       {Ten to the  18}           R'4FDE0B6B3A7640004100000000000000' ,
       {Ten to the  19}           R'508AC7230489E8004200000000000000' ,
       {Ten to the  20}           R'5156BC75E2D631004300000000000000' ,
       {Ten to the  21}           R'523635C9ADC5DEA04400000000000000' ,
       {Ten to the  22}           R'5321E19E0C9BAB244500000000000000' ,
       {Ten to the  23}           R'54152D02C7E14AF64680000000000000' ,
       {Ten to the  24}           R'54D3C21BCECCEDA14600000000000000' ,
       {Ten to the  25}           R'558459516140148447A0000000000000' ,
       {Ten to the  26}           R'5652B7D2DCC80CD248E4000000000000' ,
       {Ten to the  27}           R'5733B2E3C9FD080349CE800000000000' ,
       {Ten to the  28}           R'58204FCE5E3E25024A61100000000000' ,
       {Ten to the  29}           R'591431E0FAE6D7214B7CAA0000000000' ,
       {Ten to the  30}           R'59C9F2C9CD04674E4BDEA40000000000' ,
       {Ten to the  31}           R'5A7E37BE2022C0914C4B268000000000' ,
       {Ten to the  32}           R'5B4EE2D6D415B85A4DCEF81000000000' ,
       {Ten to the  33}           R'5C314DC6448D93384EC15B0A00000000' ,
       {Ten to the  34}           R'5D1ED09BEAD87C034F78D8E640000000' ,
       {Ten to the  35}           R'5E13426172C74D82502B878FE8000000' ,
       {Ten to the  36}           R'5EC097CE7BC9071550B34B9F10000000' ,
       {Ten to the  37}           R'5F785EE10D5DA46D51900F436A000000' ,
       {Ten to the  38}           R'604B3B4CA85A86C4527A098A22400000' ,
       {Ten to the  39}           R'612F050FE938943A53CC45F655680000' ,
       {Ten to the  40}           R'621D6329F1C35CA454BFABB9F5610000' ,
       {Ten to the  41}           R'63125DFA371A19E655F7CB54395CA000' ,
       {Ten to the  42}           R'63B7ABC62705030555ADF14A3D9E4000' ,
       {Ten to the  43}           R'6472CB5BD86321E3568CB6CE6682E800' ,
       {Ten to the  44}           R'6547BF19673DF52E5737F2410011D100' ,
       {Ten to the  45}           R'662CD76FE086B93C58E2F768A00B22A0' ,
       {Ten to the  46}           R'671C06A5EC5433C6590DDAA16406F5A4' ,
       {Ten to the  47}           R'68118427B3B4A05B5AC8A8A4DE845987' ,
       {Ten to the  48}           R'68AF298D050E43955AD69670B12B7F41' ,
       {Ten to the  49}           R'696D79F82328EA3D5BA61E066EBB2F89' ,
       {Ten to the  50}           R'6A446C3B15F992665C87D2C40534FDB5' ,
       {Ten to the  51}           R'6B2AC3A4EDBBFB805D14E3BA83411E91' ,
       {Ten to the  52}           R'6C1ABA4714957D305E0D0E549208B31B' ,
       {Ten to the  53}           R'6D10B46C6CDD6E3E5F0828F4DB456FF1' ,
       {Ten to the  54}           R'6DA70C3C40A64E6C5F51999090B65F68' ,
       {Ten to the  55}           R'6E6867A5A867F10360B2FFFA5A71FBA1' ,
       {Ten to the  56}           R'6F4140C78940F6A2614FDFFC78873D45' ,
       {Ten to the  57}           R'7028C87CB5C89A256271EBFDCB54864B' ,
       {Ten to the  58}           R'71197D4DF19D60576367337E9F14D3EF' ,
       {Ten to the  59}           R'71FEE50B7025C36A630802F236D04754' ,
       {Ten to the  60}           R'729F4F2726179A22644501D762422C94' ,
       {Ten to the  61}           R'7363917877CEC055656B21269D695BDD' ,
       {Ten to the  62}           R'743E3AEB4AE138356662F4B82261D96A' ,
       {Ten to the  63}           R'7526E4D30ECCC321675DD8F3157D27E2' ,
       {Ten to the  64}           R'76184F03E93FF9F468DAA797ED6E38ED' ,
       {Ten to the  65}           R'76F316271C7FC390688A8BEF464E3946' ,
       {Ten to the  66}           R'7797EDD871CFDA3A695697758BF0E3CC' ,
       {Ten to the  67}           R'785EF4A74721E8646A761EA977768E5F' ,
       {Ten to the  68}           R'793B58E88C75313E6BC9D329EAAA18FC' ,
       {Ten to the  69}           R'7A25179157C93EC76C3E23FA32AA4F9D' ,
       {Ten to the  70}           R'7B172EBAD6DDC73C6D86D67C5FAA71C2' ,
       {Ten to the  71}           R'7BE7D34C64A9C85D6D4460DBBCA87197' ,
       {Ten to the  72}           R'7C90E40FBEEA1D3A6E4ABC8955E946FE' ,
       {Ten to the  73}           R'7D5A8E89D75252446F6EB5D5D5B1CC5F' ,
       {Ten to the  74}           R'7E3899162693736A70C531A5A58F1FBB' ,
       {Ten to the  75}           R'7F235FADD81C282271BB3F07877973D5';
   else
constinteger powerll=0
constlonglongrealarray powers(0:75)=1, 10, 1@2, 1@3, 1@4, 1@5, 1@6, 1@7,
                               1@8, 1@9, 1@10, 1@11, 1@12, 1@13, 1@14, 1@15,
                               1@16, 1@17, 1@18, 1@19, 1@20, 1@21, 1@22, 1@23,
                               1@24, 1@25, 1@26, 1@27, 1@28, 1@29, 1@30, 1@31,
                               1@32, 1@33, 1@34, 1@35, 1@36, 1@37, 1@38, 1@39,
                               1@40, 1@41, 1@42, 1@43, 1@44, 1@45, 1@46, 1@47,
                               1@48, 1@49, 1@50, 1@51, 1@52, 1@53, 1@54, 1@55,
                               1@56, 1@57, 1@58, 1@59, 1@60, 1@61, 1@62, 1@63,
                               1@64, 1@65, 1@66, 1@67, 1@68, 1@69, 1@70, 1@71,
                               1@72, 1@73, 1@74, 1@75;
      finish
      LONGLONGREAL X,dvalue,CVALUE,DUMMY
      CONSTLONGLONGREAL TEN=10
FINISH ELSE START
      LONGREAL X,dvalue,CVALUE,DUMMY
constinteger powerll=0
constlongrealarray powers(0:75)=1, 10, 1@2, 1@3, 1@4, 1@5, 1@6, 1@7,
                               1@8, 1@9, 1@10, 1@11, 1@12, 1@13, 1@14, 1@15,
                               1@16, 1@17, 1@18, 1@19, 1@20, 1@21, 1@22, 1@23,
                               1@24, 1@25, 1@26, 1@27, 1@28, 1@29, 1@30, 1@31,
                               1@32, 1@33, 1@34, 1@35, 1@36, 1@37, 1@38, 1@39,
                               1@40, 1@41, 1@42, 1@43, 1@44, 1@45, 1@46, 1@47,
                               1@48, 1@49, 1@50, 1@51, 1@52, 1@53, 1@54, 1@55,
                               1@56, 1@57, 1@58, 1@59, 1@60, 1@61, 1@62, 1@63,
                               1@64, 1@65, 1@66, 1@67, 1@68, 1@69, 1@70, 1@71,
                               1@72, 1@73, 1@74, 1@75;
      CONSTLONGREAL TEN=10
FINISH
longreal cvaluep
IF 1<<HOST&LINTAVAIL#0 START
      LONGINTEGER RADIXV
FINISH ELSE START
      INTEGER RADIXV
FINISH
      ON EVENT 1,2 START
         HIT=0; hexformat=0
         RETURN
      FINISH
      CPREC=5;  RR=R;  R=R+1
      DOTSEEN=0;  HIT=0; hexformat=0
      CVALUE=0;  DUMMY=0; X=0;  FS=next nonspace
      qq=q; q=q+1; nbochar=next nonspace; q=qq
      S=0;  ->N IF M'0'<=FS<=M'9'
      ->DOT IF FS='.' AND MODE=0 AND '0'<=nbo char<='9'
                                        ! 1 DIDT MIN
      CTYPE=1;  EBCDIC=0
      ->QUOTE IF FS=M''''
      ->STR2 IF FS=34
      ->NOTQUOTE UNLESS nbo char=M'''';  Q=Q+2
      ->HEX IF FS='X' or FS='x'
      ->MULT IF FS='M' or FS='m'
      ->BIN IF FS=M'B' or FS='b'
      ->RHEX IF (FS='R' or FS='H' or FS='r' or FS='h') AND MODE=0
      ->OCT IF FS='K' or FS='k'
      IF FS='C' or FS='c' THEN EBCDIC=1 AND ->MULT
      IF (FS='D' or FS='d') AND MODE=0 THEN START
         CPREC=7
         IF M'0'<=next nonspace<=M'9' THEN ->N
         IF next nonspace='.' THEN ->DOT
      FINISH
      Q=Q-2;  RETURN
QUOTE:                                  ! SINGLE CH BETWEEN QUOTES
      hexformat=8; cprec=3
      q=q+1; s=cc(q); q=q+1
      if s=nl start
         READ LINE(1,'''')
         fault(110,0,0) if llength=-1
        Q=1
      finish
      IF next nonspace=M'''' THEN START
         Q=Q+1
         IF S#M'''' THEN ->IEND
         IF next nonspace=M'''' THEN Q=Q+1 AND ->IEND
      FINISH
      RETURN;                           ! NOT VALID
NOTQUOTE:                               ! CHECK FOR E"...."
      RETURN UNLESS FS='E' AND nbochar=M'"'
      EBCDIC=1; Q=Q+1
STR2:                                   ! DOUBLE QUOTED STRING
      A(RR)=X'35';  TEXTTEXT(EBCDIC)
      CTYPE=5;  RETURN
HEX:  T=0;                              ! HEX CONSTANTS
      hexformat=8
      CYCLE
         I=next nonspace;  Q=Q+1
         EXIT IF I=M''''
         T=T+1
         RETURN UNLESS  C
         ('0'<=I<='9' OR 'A'<=I<='F' OR 'a'<=I<='f') AND t<17
         IF T=9 THEN SS=S AND S=0
         S=S<<4+I&15+9*I>>6
      REPEAT
      IF T>8 START
         Z=4*(T-8)
         unless Z=32 then S=S!(SS<<Z) and SS=SS>>(32-Z);   ! shifts modulo 31 on gould!
         CPREC=6
      FINISH
IEND:
      IF CPREC=6 THEN Start
         if 1<<host&wordswopped#0 Start
            move bytes(4,addr(ss),0,addr(a(0)),R+4)
            move bytes(4,addr(s),0,addr(a(0)),R)
         else
            MOVEBYTES(4,ADDR(SS),0,ADDR(A(0)),R)
            move bytes(4,addr(s),0,addr(a(0)),r+4)
         finish
         r=r+8
      finish else IF cprec=3 or cprec=4 or (CPREC=5 AND 0<=S<=X'7FFF') START
         if cprec=5 then CPREC=4;
         A(R)<-S>>8; A(R+1)=S&255; R=R+2
      FINISH ELSE START
         MOVEBYTES(4,ADDR(S),0,ADDR(A(0)),R)
         R=R+4
      FINISH
      HIT=1 UNLESS MODE#0 AND CPREC=6
      A(RR)=CPREC<<4!CTYPE! hexformat
      RETURN
RHEX:                                   ! REAL HEX CONSTANTS
      T=0
      CYCLE
         I=next nonspace;  Q=Q+1
         IF T&7=0 AND T#0 START
            rhexpat(t//8-1)=s;  S=0
         FINISH
         EXIT IF I=M'''';  T=T+1
         RETURN UNLESS '0'<=I<='9' OR 'A'<=I<='F' OR 'a'<=I<='f'
         S=S<<4+I&15+9*I>>6
      REPEAT
      RETURN UNLESS T=8 OR T=16 OR T=32
      IF T=32 THEN CPREC=7 ELSE CPREC=4+T//8
      A(RR)=CPREC<<4!2
      if host#target and ibmfpformat>>host&1#ibmfpformat>>target&1 c
          and FS='R'then A(RR)=A(RR)!8;           ! Flag const not to converted
      t=t//8-1
      for i=0,1,t cycle
         if 1<<host&wordswopped#0 Then j=4*(t-i) else j=4*i
         move bytes(4,addr(rhexpat(0)),j,addr(a(0)),r)
         r=r+4
      repeat
      HIT=1;  RETURN
OCT:                                    ! OCTAL CONSTANTS
      hexformat=8
      T=0
      CYCLE
         I=next nonspace;  Q=Q+1;  T=T+1
         EXIT IF I=M''''
         RETURN UNLESS '0'<=I<='7' AND T<12
         S=S<<3!(I&7)
      REPEAT
      ->IEND
MULT: T=0;                              ! MULTIPLE CONSTANTS
      CYCLE
         I=cc(q);  Q=Q+1;  T=T+1
         IF I=M'''' THEN START
            IF next nonspace#M'''' THEN EXIT ELSE Q=Q+1
         FINISH
         RETURN IF T>=5
         IF EBCDIC#0 THEN I=ITOETAB(I)
         S=S<<8!I
      REPEAT
      ->IEND
BIN:  T=0;                              ! BINARY CONST
      hexformat=8
      CYCLE
         I=next nonspace;  Q=Q+1;  T=T+1
         EXIT IF I=M''''
         RETURN UNLESS '0'<=I<='1' AND T<33
         S=S<<1!I&1
      REPEAT
      ->IEND
RADIX:                                  ! BASE_VALUE CONSTANTS
      hexformat=8
      T=0; RADIXV=0
      RS=RSHIFT(S)
      Q=Q+1
      CYCLE
         I=next nonspace
         EXIT UNLESS '0'<=I<='9' OR 'A'<=I<='Z' OR 'a'<=I<='z'
         IF I<='9' THEN I=I-'0' ELSE I=I&15+9
         EXIT IF I>=S;                  ! MUST BE LESS THAN BASE
         Q=Q+1
         IF RS#0 THEN RADIXV=RADIXV<<RS+I AND T=T+RS C
            ELSE RADIXV=RADIXV*S+I AND T=T+1
      REPEAT
      RETURN IF T=0 OR (1<<TARGET&LINTAVAIL=0 AND RS>0 AND T>MAXIBITS);     ! NO VALID DIGITS
      IF 1<<HOST&LINTAVAIL#0 THEN SS<-RADIXV>>32 ELSE SS=0
      S<-RADIXV
      CTYPE=1
      IF SS#0 THEN CPREC=6
      ->IEND
N:                                      ! CONSTANT STARTS WITH DIGIT
      I=next nonspace
      UNTIL I<M'0' OR I>M'9' CYCLE
         CVALUE=TEN*CVALUE+(I&15)
         Q=Q+1;  I=next nonspace;               ! ONTO NEXT CHAR
      REPEAT
      IF I='_' AND 2<=CVALUE<33 THEN S=INT(CVALUE) AND ->RADIX
      ->ALPHA UNLESS MODE=0 AND I='.'
DOT:  Q=Q+1;   I=next nonspace
      DOTSEEN=1;                        ! CONSTANT HAS DECIMAL POINT

      dvalue=0; s=0
      WHILE M'0'<=I<=M'9' CYCLE
         dvalue=ten*dvalue+(i&15)
         s=s+1
        Q=Q+1;  I=next nonspace
      REPEAT
      cvalue=cvalue+(dvalue/powers(s))
ALPHA:                                  ! TEST FOR EXPONENT
      IF MODE=0 AND next nonspace='@' THEN START
         Q=Q+1;  X=CVALUE
         Z=1;  I=next nonspace
         IF I='-' THEN Z=-1
         IF I='+' OR I='-' THEN Q=Q+1
         EVALCONST(2)
         IF HIT=0 THEN RETURN
         HIT=0
         DOTSEEN=1;                     ! @ IMPLIES REAL IN IMP80
         R=RR+1
         IF A(R)>>4#4 THEN RETURN;      ! EXPONENT  MUST BE HALFINTEGER
         S=(A(R+1)<<8!A(R+2))*Z
         IF S=-99 THEN CVALUE=0 ELSE START
            if powerll<=s<=powerl then cvalue=cvalue*powers(s) else c
              if imod(s)<=powerl then cvalue=cvalue/powers(-s) else Start
               if 1<<Target&LLREALAVAIL#0 then cprec=7
               WHILE S>0 CYCLE
                  S=S-1
                  CVALUE=CVALUE*TEN
               REPEAT
               WHILE S<0 AND CVALUE#0 CYCLE
                  S=S+1
                 CVALUE=CVALUE/TEN
               REPEAT
            finish
         FINISH
      FINISH
                                        ! SEE IF IT IS INTEGER
      IF FS='D' THEN START
         I=next nonspace
         IF I='''' THEN Q=Q+1 ELSE RETURN
         DOTSEEN=1;                     ! ENSURE NOT TAKEN AS INTEGER
      FINISH
      if 1<<Host&LINTAVAIL#0 and 1<<Target&LINTAVAIL#0 andc
         dotseen=0 and cvalue>imax start
         radixv=lint(cvalue)
         ss<-radixv>>32; s<-radixv
         cprec=6; ->iend
      finish
      IF DOTSEEN=1 OR CVALUE>IMAX THEN CTYPE=2 C
         ELSE CTYPE=1 AND S=INT(CVALUE)
      IF CTYPE=1 THEN ->IEND
      IF CPREC=5 THEN CPREC=6;          ! ONLY 64 BIT REAL CONSTS
      IF CPREC=6 THEN START
         cvaluep=cvalue;                 ! may perform a round
         MOVEBYTES(8,ADDR(CVALUEp),0,ADDR(A(0)),R);  R=R+8
      FINISH ELSE START;                ! PREC = 7 CONTSTANTS
         MOVEBYTES(16,ADDR(CVALUE),0,ADDR(A(0)),R)
         R=R+16
      FINISH
      A(RR)=CPREC<<4+CTYPE
      HIT=1
END
ROUTINE TEXTTEXT(INTEGER EBCDIC)
!***********************************************************************
!*    PROCESSES TEXT BETWEEN DOUBLE QUOTES AND STORES IN ISO OR EBCDIC *
!***********************************************************************
INTEGER J, II
CONSTINTEGER QU='"'
         I=next nonspace
         S=R;  R=R+1; HIT=0
         RETURN UNLESS I=QU;            ! FAIL UNLESS  INITIAL QUOTE
         Q=Q+1
         CYCLE
            I=cc(q)
            IF EBCDIC#0 THEN II=ITOETAB(I) ELSE II=I
            A(R)=II;  R=R+1
            IF I=QU THEN START
               Q=Q+1
               IF next nonspace#QU THEN EXIT
            FINISH
            IF I=10 THEN start
               READ LINE(1,QU)
              fault(110,0,0) if llength=-1
            finish ELSE Q=Q+1
            FAULT(106,0,0) IF R-S>256
         REPEAT
         R=R-1;  J=R-S-1
         A(S)=J;   HIT=1
END
END;                               ! OF ROUTINE PASS ONE
ENDOFFILE