%constinteger malmon=0
%EXTERNAL %ROUTINE %SPEC Phex {*~np1 %alias "s_phex"}(%INTEGER n)
%EXTERNAL %INTEGER %FN %SPEC MALLOC(%INTEGER bytesize)
%INCLUDE "hostcodes.inc"
%CONSTINTEGER HOST=M88K
!%INCLUDE "tform2s"
!
! 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 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 "TFORM2S"
%OWNINTEGERNAME ASL
%OWNRECORD(LISTF)%ARRAYNAME ASLIST
%EXTRINSICRECORD(WORKAF)WORKA
%EXTRINSICRECORD(PARMF)PARM
%EXTERNALROUTINE MOVE BYTES(%INTEGER LENGTH,FBASE,FOFF,TOBASE,TOOFF)
!************************************************************************
!*    A MOVE BYTES ROUTINE THAT WILL WORK ON WORD&BYTE ADDRESS M-CS    *
!***********************************************************************
%INTEGER I
AGN:
      %RETURN %IF LENGTH<=0
      %IF HOST=EMAS %START;             ! EMAS BYTE ADDRESSES
         I=X'18000000'+LENGTH
         *LDA_TOBASE; *INCA_TOOFF; *LDTB_I
         *LSS_FBASE; *IAD_FOFF; *LUH_I
         *MV_%L=%DR
      %FINISH %else %IF HOST=PERQ %START;             ! WORD ADDRESS+BYTE OFFSET
         FBASE=FBASE+FOFF>>1
         FOFF=FOFF&1
         TOBASE=TOBASE+TOOFF>>1
         TOOFF=TOOFF&1
         %IF (TOBASE+LENGTH>>1)>>16#TOBASE>>16 %OR %C
               (FBASE+LENGTH>>1)>>16#FBASE>>16 %START
                                        ! TLATE FAILS IF SEG BNDRY CROSSED
            MOVEBYTES(1,FBASE,FOFF,TOBASE,TOOFF)
            TOOFF=TOOFF+1
            FOFF=FOFF+1
            LENGTH=LENGTH-1
            ->AGN
         %FINISH
         *LDLDB_6;                      ! TO BASE
         *LDL8;                         ! TOOFF (BTM BITS)
         *LDLDB_2;                      ! FBASE
         *LDL4;                         ! FOFF
         *LDL0;                         ! LENGTH
         *STLATE_X'63'
         *MVBW
      %FINISH %else %IF HOST=ACCENT %START;             ! WORD ADDRESS+BYTE OFFSET
         FBASE=FBASE+FOFF>>1
         FOFF=FOFF&1
         TOBASE=TOBASE+TOOFF>>1
         TOOFF=TOOFF&1
         *LDLDB_6;                      ! TO BASE
         *LDL8;                         ! TOOFF (BTM BITS)
         *LDLDB_2;                      ! FBASE
         *LDL4;                         ! FOFF
         *LDL0;                         ! LENGTH
         *MVBW
      %FINISH %else %IF HOST=PNX %start
         FBASE=2*FBASE+FOFF
         TOBASE=2*TOBASE+TOOFF
         **FBASE
         **TOBASE
         **LENGTH
         *MVB
      %FINISH %else %IF 1<<host&emachine#0 %START 
         FBASE=FBASE+FOFF
         TOBASE=TOBASE+TOOFF
         **FBASE
         **TOBASE
         **LENGTH
         *MVB
      %FINISH %else %IF HOST=IBM %OR HOST=IBMXA %OR HOST=AMDAHL %START
         *L_0,TOBASE; *A_0,TOOFF
         *L_2,FBASE; *A_2,FOFF
         *L_1,LENGTH; *LR_3,1
         *MVCL_0,2
      %else
         FBASE=FBASE+FOFF
         TOBASE=TOBASE+TOOFF
         BYTEINTEGER(TOBASE+I)=BYTEINTEGER(FBASE+I) %FOR I=0,1,LENGTH-1
      %FINISH
%END
%EXTERNALSTRING(255)%FN PRINTNAME(%INTEGER N)
%CONSTSTRING(1)%ARRAY HEX(0:15)="0","1","2","3","4","5","6","7","8","9",
                                        "A","B","C","D","E","F";
%INTEGER V,K,TOP
%STRING(255) S
      S="?"
      TOP=N>>16
      N=N&X'FFFF'
      %IF 0<=N<=WORKA_NNAMES %START
         V=WORKA_WORD(N)
         K=WORKA_LETT(V)
         %IF K#0 %THEN S=STRING(ADDR(WORKA_LETT(V)))
      %FINISH
      %IF S="?" %START;                 ! UNPRINTABLE
         S=S.HEX(N>>K&15) %FOR K=28,-4,0
      %FINISH %ELSE %START
         %IF TOP>0 %THEN S=PRINTNAME(TOP)."_".S
      %FINISH
      %RESULT=S
%END


%STRINGFN MESSAGE(%INTEGER N)
!***********************************************************************
!*       OUTPUTS AN ERROR MESSAGE STORED IN A COMPRESSED FORMAT        *
!*       1  %REPEAT is not required                                    *
!*       2  Label & has already been set in this block                 *
!*       3  Jump into %CYCLE at Label & from line #                    *
!*       4  & is not a Switch name at current textual level            *
!*       5  Switch name & in expression or assignment                  *
!*       6  Switch label &(#) set a second time                        *
!*       7  Name & has already been declared                           *
!*       8  Routine or fn & has more parameters than specified         *
!*       9  Parameter # of & differs in type from specification        *
!*      10  Routine or fn & has fewer parameters than specified        *
!*      11  Label & referenced at line # has not been set              *
!*      12  %CYCLE at line # has two control clauses                   *
!*      13  %REPEAT for %CYCLE at line # is missing                    *
!*      14  %END is not required                                       *
!*      15  # %ENDs are missing                                        *
!*      16  Name & has not been declared                               *
!*      17  Name & does not require parameters or subscripts           *
!*      18  # too few parameters provided for &                        *
!*      19  # too many parameters provided for &                       *
!*      20  # too few subscripts provided for array &                  *
!*      21  # too many subscripts provided for array &                 *
!*      22  Actual parameter # of & conflicts with specification       *
!*      23  Routine name & in an expression                            *
!*      24  Integer operator has Real operands                         *
!*      25  Real expression in integer context                         *
!*      26  # is not a valid %EVENT number                             *
!*      27  & is not a routine name                                    *
!*      28  Routine or fn & has specification but no body              *
!*      29  %FUNCTION name & not in expression                         *
!*      30  %RETURN outwith routine body                               *
!*      31  %RESULT outwith fn or map body                             *
!*      34  Too many textual levels                                    *
!*      37  Array & has too many dimensions                            *
!*      38  Array & has upper bound # less than lower bound            *
!*      39  Size of Array & is more than X'FFFFFF' bytes               *
!*      40  Declaration is not at head of block                        *
!*      41  Constant cannot be evaluated at compile time               *
!*      42  # is an invalid repetition factor                          *
!*      43  %CONSTANT name & not in expression                         *
!*      44  Invalid constant initialising & after # items              *
!*      45  Array initialising items expected ## items given #         *
!*      46  Invalid %EXTERNAL %EXTRINSIC or variable %SPEC             *
!*      47  %ELSE already given at line #                              *
!*      48  %ELSE invalid after %ON %EVENT                             *
!*      49  Attempt to initialise %EXTRINSIC or %FORMAT &              *
!*      50  Subscript of # is outwith the bounds of &                  *
!*      51  %FINISH is not required                                    *
!*      52  %REPEAT instead of %FINISH for %START at line #            *
!*      53  %FINISH for %START at line # is missing                    *
!*      54  %EXIT outwith %CYCLE %REPEAT body                          *
!*      55  %CONTINUE outwith %CYCLE %REPEAT body                      *
!*      56  %EXTERNALROUTINE & at wrong textual level                  *
!*      57  Executable statement found at textual level zero           *
!*      58  Program among external routines                            *
!*      59  %FINISH instead of %REPEAT for %CYCLE at line #            *
!*      61  Name & has already been used in this %FORMAT               *
!*      62  & is not a %RECORD or %RECORD %FORMAT name                 *
!*      63  %RECORD length is greater than # bytes                     *
!*      64  Name & requires a subname in this context                  *
!*      65  Subname & is not in the %RECORD %FORMAT                    *
!*      66  Expression assigned to record &                            *
!*      67  Records && and & have different formats                    *
!*      69  Subname && is attached to & which is not of type %RECORD   *
!*      70  String declaration has invalid max length of #             *
!*      71  & is not a String variable                                 *
!*      72  Arithmetic operator in a String expression                 *
!*      73  Arithmetic constant in a String expression                 *
!*      74  Resolution is not the correct format                       *
!*      75  String expression contains a sub expression                *
!*      76  String variable & in arithmetic expression                 *
!*      77  String constant in arithmetic expression                   *
!*      78  String operator '.' in arithmetic expression               *
!*      80  Pointer variable & compared with expression                *
!*      81  Pointer variable & equivalenced to expression              *
!*      82  & is not a pointer name                                    *
!*      83  && and & are not equivalent in type                        *
!*      86  Global pointer && equivalenced to local &                  *
!*      87  %FORMAT name & used in expression                          *
!*      90  Untyped name & used in expression                          *
!*      91  %FOR control variable & not integer                        *
!*      92  %FOR clause has zero step                                  *
!*      93  %FOR clause has noninteger number of traverses             *
!*      95  Name & not valid in assembler                              *
!*      96  Operand # not valid in assembler                           *
!*      97  Assembler construction not valid                           *
!*      98  Addressability                                             *
!*      99  Facility not supported by target hardware                  *
!*     101  Source line has too many continuations                     *
!*     102  Workfile of # Kbytes is too small                          *
!*     103  Dictionary completely full                                 *
!*     104  Dictionary completely full                                 *
!*     105  Too many textual levels                                    *
!*     106  String constant too long                                   *
!*     107  Compiler tables are completely full                        *
!*     108  Condition too complicated                                  *
!*     109  Compiler inconsistent                                      *
!*     110  Input ended                                                *
!*     201  Long integers are inefficient as subscripts                *
!*     202  Name & not used                                            *
!*     203  Label & not used                                           *
!*     204  Global %FOR control variable &                             *
!*     205  Name & not addressable                                     *
!*     206  Semicolon in comment text                                  *
!*     207  %CONSTANT variable & not initialised                       *
!*     208  Unsupported precision used - nearest available substituted *
!*     209  Target machine is word addressed                           *
!*     210  Redundant %ALIAS provided                                  *
!*     211  Prefix %SYSTEM not supported. Use %ALIAS                   *
!*     212  Unproductive logical operation noted                       *
!*     255  Contact Advisory Service                                   *
!***********************************************************************
%CONSTBYTEINTEGERARRAY OUTTT(0:63)='?','A','B','C','D','E','F','G',
                                        'H','I','J','K','L','M','N',
                                        'O','P','Q','R','S','T','U',
                                        'V','W','X','Y','Z','&','-',
                                        '/','''','(',')',
                                        'a','b','c','d','e','f','g',
                                        'h','i','j','k','l','m','n',
                                        'o','p','q','r','s','t','u',
                                        'v','w','x','y','z','.','%',
                                        '#','?'(2)
%CONSTINTEGER WORDMAX= 802,DEFAULT= 798
%CONSTshortINTEGERARRAY WORD(0:WORDMAX)=0,%C
              1, 32769, 32771, 32772, 32773,     2, 32775, 32776,
          32777, 32778, 32780, 32781, 32782, 32783, 32784,     3,
          32785, 32786, 32787, 32789, 32775, 32776, 32790, 32791,
          32792,     4, 32776, 32771, 32772, 32793, 32794, 32796,
          32789, 32797, 32799, 32801,     5, 32794, 32796, 32776,
          32782, 32802, 32804, 32805,     6, 32794, 32807, 32808,
          32781, 32793, 32809, 32811,     7, 32812, 32776, 32777,
          32778, 32780, 32813,     8, 32815, 32804, 32817, 32776,
          32777, 32818, 32819, 32821, 32822,     9, 32824, 32792,
          32826, 32776, 32827, 32782, 32829, 32790, 32830,    10,
          32815, 32804, 32817, 32776, 32777, 32833, 32819, 32821,
          32822,    11, 32775, 32776, 32834, 32789, 32791, 32792,
          32777, 32772, 32780, 32781,    12, 32787, 32789, 32791,
          32792, 32777, 32836, 32837, 32839,    13, 32769, 32841,
          32787, 32789, 32791, 32792, 32771, 32842,    14, 32844,
          32771, 32772, 32773,    15, 32792, 32845, 32846, 32842,
             16, 32812, 32776, 32777, 32772, 32780, 32813,    17,
          32812, 32776, 32847, 32772, 32848, 32819, 32804, 32850,
             18, 32792, 32852, 32853, 32819, 32854, 32841, 32776,
             19, 32792, 32852, 32856, 32819, 32854, 32841, 32776,
             20, 32792, 32852, 32853, 32850, 32854, 32841, 32857,
          32776,    21, 32792, 32852, 32856, 32850, 32854, 32841,
          32857, 32776,    22, 32858, 32860, 32792, 32826, 32776,
          32862, 32864, 32830,    23, 32815, 32796, 32776, 32782,
          32865, 32802,    24, 32866, 32868, 32777, 32870, 32871,
             25, 32870, 32802, 32782, 32873, 32875,    26, 32792,
          32771, 32772, 32793, 32877, 32878, 32880,    27, 32776,
          32771, 32772, 32793, 32882, 32796,    28, 32815, 32804,
          32817, 32776, 32777, 32830, 32884, 32885, 32886,    29,
          32887, 32796, 32776, 32772, 32782, 32802,    30, 32889,
          32891, 32882, 32886,    31, 32893, 32891, 32817, 32804,
          32895, 32886,    34, 32896, 32856, 32799, 32897,    37,
          32899, 32776, 32777, 32852, 32856, 32900,    38, 32899,
          32776, 32777, 32902, 32903, 32792, 32904, 32821, 32905,
          32903,    39, 32906, 32826, 32899, 32776, 32771, 32818,
          32821, 32907, 32909,    40, 32910, 32771, 32772, 32789,
          32913, 32826, 32784,    41, 32914, 32916, 32918, 32919,
          32789, 32921, 32811,    42, 32792, 32771, 32865, 32923,
          32925, 32927,    43, 32929, 32796, 32776, 32772, 32782,
          32802,    44, 32931, 32933, 32935, 32776, 32938, 32792,
          32939,    45, 32899, 32935, 32939, 32940, 32942, 32939,
          32943, 32792,    46, 32931, 32944, 32946, 32804, 32948,
          32950,    47, 32951, 32778, 32943, 32789, 32791, 32792,
             48, 32951, 32923, 32938, 32952, 32878,    49, 32953,
          32955, 32956, 32946, 32804, 32958, 32776,    50, 32960,
          32826, 32792, 32771, 32891, 32962, 32963, 32826, 32776,
             51, 32965, 32771, 32772, 32773,    52, 32769, 32967,
          32826, 32965, 32841, 32969, 32789, 32791, 32792,    53,
          32965, 32841, 32969, 32789, 32791, 32792, 32771, 32842,
             54, 32971, 32891, 32787, 32769, 32886,    55, 32972,
          32891, 32787, 32769, 32886,    56, 32974, 32776, 32789,
          32978, 32799, 32801,    57, 32979, 32981, 32983, 32789,
          32799, 32801, 32984,    58, 32985, 32987, 32988, 32990,
             59, 32965, 32967, 32826, 32769, 32841, 32787, 32789,
          32791, 32792,    61, 32812, 32776, 32777, 32778, 32780,
          32992, 32782, 32783, 32958,    62, 32776, 32771, 32772,
          32793, 32993, 32804, 32993, 32958, 32796,    63, 32993,
          32995, 32771, 32997, 32821, 32792, 32909,    64, 32812,
          32776, 32999, 32793, 33001, 32782, 32783, 32875,    65,
          33003, 32776, 32771, 32772, 32782, 32962, 32993, 32958,
             66, 33005, 33007, 32955, 33009, 32776,    67, 33011,
          33013, 33014, 32776, 33015, 33016, 33018,    69, 33003,
          33013, 32771, 33020, 32955, 32776, 33022, 32771, 32772,
          32826, 32829, 32993,    70, 33023, 33025, 32777, 32923,
          33028, 32995, 32826, 32792,    71, 32776, 32771, 32772,
          32793, 33023, 32948,    72, 33029, 32868, 32782, 32793,
          33023, 32802,    73, 33029, 32933, 32782, 32793, 33023,
          32802,    74, 33031, 32771, 32772, 32962, 33033, 33035,
             75, 33023, 32802, 33037, 32793, 33039, 32802,    76,
          33023, 32948, 32776, 32782, 33040, 32802,    77, 33023,
          32933, 32782, 33040, 32802,    78, 33023, 32868, 33042,
          32782, 33040, 32802,    80, 33043, 32948, 32776, 33045,
          32864, 32802,    81, 33043, 32948, 32776, 33047, 32955,
          32802,    82, 32776, 32771, 32772, 32793, 33050, 32796,
             83, 33013, 33014, 32776, 32846, 32772, 33052, 32782,
          32829,    86, 33054, 33050, 33013, 33047, 32955, 33056,
          32776,    87, 32958, 32796, 32776, 32992, 32782, 32802,
             90, 33057, 32796, 32776, 32992, 32782, 32802,    91,
          33059, 32837, 32948, 32776, 32772, 32873,    92, 33059,
          33060, 32777, 32984, 33062,    93, 33059, 33060, 32777,
          33063, 32880, 32826, 33065,    90, 33057, 32796, 32776,
          32992, 33067, 32948,    95, 32812, 32776, 32772, 32877,
          32782, 33068,    96, 33070, 32792, 32772, 32877, 32782,
          33068,    97, 33072, 33074, 32772, 32877,    98, 33077,
             99, 33080, 32772, 33082, 33084, 33085, 33087,   101,
          33089, 32791, 32777, 32852, 32856, 33091,   102, 33094,
          32826, 32792, 33096, 32771, 32852, 33098,   103, 33099,
          33101, 33103,   104, 33099, 33101, 33103,   105, 32896,
          32856, 32799, 32897,   106, 33023, 32933, 32852, 33104,
            107, 33105, 33107, 32846, 33101, 33103,   108, 33109,
          32852, 33111,   109, 33105, 33114,   110, 33117, 33118,
            201, 33119, 33120, 32846, 33122, 33067, 32850,   202,
          32812, 32776, 32772, 32992,   203, 32775, 32776, 32772,
          32992,   204, 33054, 33059, 32837, 32948, 32776,   205,
          32812, 32776, 32772, 33125,   206, 33128, 32782, 33130,
          33132,   207, 32929, 32948, 32776, 32772, 33133,   208,
          33136, 33139, 32992, 33141, 33142, 33144, 33146,   209,
          33149, 33151, 32771, 33153, 33154,   210, 33156, 33158,
          32854,   211, 33160, 33162, 32772, 33164, 33166, 33158,
            212, 33167, 33170, 33172, 33174,   255, 33175, 33177,
          33179,     0
%CONSTINTEGERARRAY LETT(0: 412)=0,%C
        X'7890A80B',X'02A00000',X'53980000',X'5D7E8000',
        X'652E3AD3',X'652C8000',X'190C52D8',X'36000000',
        X'510E6000',X'436652C3',X'49C80000',X'452CB700',
        X'672E8000',X'53700000',X'69453980',X'4565F1D6',
        X'15ADB800',X'53769780',X'781B2199',X'0A000000',
        X'43A00000',X'4D95F680',X'594DD280',X'7A000000',
        X'42000000',X'27BD3A47',X'50000000',X'5D0DB280',
        X'47AE594B',X'5DA00000',X'692F1A6B',X'43600000',
        X'592ED2D8',X'4BC6194B',X'679D37DC',X'5F900000',
        X'439E74CF',X'5D6CB768',X'590C52D8',X'36FFB000',
        X'672C77DD',X'48000000',X'694DB280',X'1D0DB280',
        X'492C7643',X'652C8000',X'257EBA53',X'5D280000',
        X'4D700000',X'5B7E5280',X'610E50DB',X'4BA4B966',
        X'69443700',X'6784B1D3',X'4D4CB200',X'210E50DB',
        X'4BA4B900',X'5F300000',X'494CD34B',X'65980000',
        X'69CE1280',X'6784B1D3',X'4D4C70E9',X'537DC000',
        X'4D2EF2E4',X'652CD2E5',X'4B7472C8',X'69BDE000',
        X'477DDA65',X'5F600000',X'47643AE7',X'4B980000',
        X'4D7E4000',X'5B4E79D3',X'5D380000',X'7829C200',
        X'7829C266',X'4394A000',X'497CB980',X'652E3AD3',
        X'65280000',X'67AC59C7',X'654E1A66',X'697DE000',
        X'4D2EE000',X'6195FB53',X'492C8000',X'5B0DDC80',
        X'439650F2',X'031E9AC3',X'58000000',X'610E50DB',
        X'4BA4B900',X'477DD359',X'531E9980',X'6F4E9400',
        X'43700000',X'137692CF',X'4B900000',X'5F84B943',
        X'697E4000',X'252C3600',X'5F84B943',X'5D266000',
        X'537692CF',X'4B900000',X'477DDA4B',X'71A00000',
        X'6D0D94C8',X'782AC29D',X'28000000',X'5DADB14B',
        X'64000000',X'657EBA53',X'5D280000',X'45AE8000',
        X'5D780000',X'457C9C80',X'7832A707',X'2849E700',
        X'7890AA2B',X'24700000',X'5FAE9BD3',X'69400000',
        X'7890A9AB',X'18A00000',X'5B0E0000',X'297DE000',
        X'592ED2D9',X'66000000',X'039650F2',X'494DB2DD',
        X'674DF766',X'6B8612E4',X'457EB748',X'592E7980',
        X'597EF2E4',X'274F5280',X'30F0C30D',X'0C30CF00',
        X'45CE92E6',X'092C7643',X'650E94DF',X'5C000000',
        X'512C3200',X'077DD9E9',X'43768000',X'470DD75F',
        X'68000000',X'45280000',X'4BB4366B',X'43A4B200',
        X'477DB853',X'59280000',X'5376D0D9',X'53200000',
        X'652E12E9',X'53A537DC',X'4D0C7A5F',X'64000000',
        X'7819E727',X'2809CA00',X'1376D0D9',X'53200000',
        X'477DD9E9',X'43768000',X'53753A53',X'436539D3',
        X'5D380000',X'433692E4',X'53A4B6E6',X'4BC612C7',
        X'692C8000',X'7BE80000',X'4F4ED2DC',X'782B0A0B',
        X'24702600',X'782B0A25',X'12726486',X'6D0E54C3',
        X'4564A000',X'789A0286',X'7829898A',X'7879C000',
        X'03A692DB',X'61A00000',X'69780000',X'53753A53',
        X'436539CA',X'7831E91B',X'02A00000',X'27AC59C7',
        X'654E1A00',X'6944A000',X'457EB749',X'66000000',
        X'78312713',X'26400000',X'53767A4B',X'43200000',
        X'789A80A5',X'28000000',X'782B04A8',X'7819E729',
        X'1272A280',X'782B0A0B',X'24702625',X'1EAA849D',
        X'0A000000',X'6F95F74E',X'0BC4B1EB',X'690C564A',
        X'67A43A4B',X'5B2DDA00',X'4D7EB748',X'752E5780',
        X'2195F3E5',X'43680000',X'436DF74E',X'4BC692E5',
        X'5D0D8000',X'657EBA53',X'5D2E6000',X'6B9CB200',
        X'7890A19F',X'24200000',X'592DD3E9',X'50000000',
        X'4F94B0E9',X'4B900000',X'652E3AD3',X'652E6000',
        X'67AC5743',X'5B280000',X'27AC5743',X'5B280000',
        X'0BC6194B',X'679D37DC',X'439E74CF',X'5D2C8000',
        X'652C77E5',X'48000000',X'252C77E5',X'49980000',
        X'36D80000',X'43748000',X'510ED280',X'494CD34B',
        X'652DDA00',X'4D7E56C3',X'69980000',X'43A690C7',
        X'512C8000',X'6F4531D0',X'27A654DD',X'4E000000',
        X'492C7643',X'650E94DF',X'5C000000',X'5B0F0000',
        X'03953A51',X'5B2E94C6',X'252E77D9',X'6BA537DC',
        X'477E594B',X'47A00000',X'4D7E56C3',X'68000000',
        X'477DDA43',X'53766000',X'67AC4000',X'43953A51',
        X'5B2E94C6',X'3DDBC000',X'217D3769',X'4B900000',
        X'477DB843',X'652C8000',X'4B8EB4ED',X'4364B747',
        X'4B200000',X'617D3769',X'4B900000',X'4B8EB4ED',
        X'4364B768',X'0F65F143',X'58000000',X'597C70D8',
        X'2B769CE1',X'4B200000',X'7831E900',X'47643AE7',
        X'4A000000',X'67A4B800',X'5D7DD4DD',X'692CF2E4',
        X'69943B4B',X'659CB980',X'43980000',X'439E72DB',
        X'4564B900',X'1F84B943',X'5D200000',X'039E72DB',
        X'4564B900',X'477DD9E9',X'65AC7A53',X'5F700000',
        X'0324994B',X'679C3153',X'594E9C80',X'0D0C74D9',
        X'53A72000',X'67AE185F',X'65A4B200',X'45C80000',
        X'690E53CB',X'68000000',X'510E526F',X'4394A000',
        X'277EB947',X'4A000000',X'477DDA53',X'5DAC3A53',
        X'5F766000',X'2F7E55CD',X'5364A000',X'17173A4B',
        X'66000000',X'676C3658',X'094C7A53',X'5F743972',
        X'477DB859',X'4BA4B672',X'4DAD9600',X'597DD380',
        X'077DB853',X'592E4000',X'690C564B',X'66000000',
        X'077DD253',X'694DF700',X'477DB859',X'531C3A4B',
        X'48000000',X'537477DD',X'674E7A4B',X'5DA00000',
        X'13761AE8',X'4B7492C8',X'197DD380',X'537692CF',
        X'4B966000',X'5374B34D',X'531D32DD',X'68000000',
        X'4324994B',X'679C3159',X'4A000000',X'272DB4C7',
        X'5F65F700',X'477DB6CB',X'5DA00000',X'692F1A00',
        X'53753A53',X'436539CB',X'48000000',X'2B767AE1',
        X'617E5A4B',X'48000000',X'6194B1D3',X'674DF700',
        X'38000000',X'5D2C394B',X'67A00000',X'43B434D9',
        X'43159280',X'67AC59E9',X'53A6BA4B',X'48000000',
        X'290E53CB',X'68000000',X'5B0C7453',X'5D280000',
        X'6F7E5200',X'4324994B',X'679CB200',X'252C9ADD',
        X'490DDA00',X'78098483',X'26000000',X'2194B353',
        X'70000000',X'789B29A9',X'0A680000',X'67AE185F',
        X'65A4B276',X'2B9CA000',X'2B76195F',X'49AC7A53',
        X'6D280000',X'597CF4C7',X'43600000',X'5F84B943',
        X'694DF700',X'5D7E92C8',X'077DDA43',X'47A00000',
        X'0326D4E7',X'5F972000',X'272E5B53',X'47280000'
        
%INTEGER I,J,K,M,Q,S
%STRING(70)OMESS
      OMESS=" "
      %CYCLE I=1,1,WORDMAX-1
         ->FOUND %IF N=WORD(I)
      %REPEAT
      I=DEFAULT
FOUND:
      J=1
      %CYCLE
         K=WORD(I+J)
         %IF K&X'8000'=0 %THEN %EXIT
         K=K&X'7FFF'
         OMESS=OMESS." " %UNLESS J=1
         %UNTIL M&1=0 %CYCLE
            M=LETT(K); S=25
            %UNTIL S<0 %CYCLE
               Q=M>>S&63; 
               %IF Q\=0 %THEN OMESS=OMESS.TOSTRING(OUTTT(Q))
               S=S-6
            %REPEAT
            K=K+1
         %REPEAT
         J=J+1
      %REPEAT
      %RESULT=OMESS
%END
%EXTERNALSTRING(16)%FN SWRITE(%INTEGER VALUE, PLACES)
%STRING (16) S
%STRING(1)SIGN
%INTEGER D0, D1, D2
      PLACES=PLACES&15
      SIGN=" "
      S=""
      %IF VALUE<0 %THEN SIGN="-" %AND VALUE=-VALUE
      D0=VALUE
      %CYCLE
         D1=D0//10
         D2=D0-10*D1
         S=TOSTRING(D2+'0').S
         D0=D1
      %REPEAT %UNTIL D0=0
      S=SIGN.S
      S=" ".S %WHILE LENGTH(S)<=PLACES
      %RESULT=S
%END
%EXTERNALROUTINE FAULT(%INTEGER N, DATA, IDENT)
!***********************************************************************
!*    SETS UP AN ERROR MESSAGE AND SHOVES IT OUT ONTO THE LISTING      *
!*    AN ALSO OPTIONALLY TO THE TERMINAL                               *
!***********************************************************************
%INTEGER I, J, S, T, Q, QMAX, LENGTH
%STRING(255)MESS1,MESS2,WK1,WK2
!*DELSTART
      %MONITOR %IF (PARM_FAULTY=0 %or n>100) %AND (PARM_Z#0 %OR PARM_DCOMP#0)
!*DELEND
      MESS1=""; MESS2=""
      %if parm_faulty < 255 %then PARM_FAULTY=PARM_FAULTY+1
      %IF N=100 %THEN %START;           ! SYNTAX FAULTS ARE SPECIAL
         MESS1="
*    Failed to analyse line ".SWRITE(WORKA_LINE,2)."
     "
         J=0;  S=0;  T=0;  Q=DATA;  QMAX=IDENT>>16
         LENGTH=IDENT&X'FFFF'
         %UNTIL (J=';' %AND Q>QMAX) %OR Q=LENGTH %CYCLE
            I=J;  J=WORKA_CC(Q);        ! DATA HAS START OF LINE POSN
            %IF J>128 %AND I<128 %THEN MESS2=MESS2." %" %AND T=T+2
            %IF I>128 %AND J<128 %THEN MESS2=MESS2." " %AND T=T+1
            %IF Q=QMAX %THEN %START
               S=T+1
               %IF S>=11 %THEN MESS2=MESS2."?" %AND T=T+1
            %FINISH
            MESS2=MESS2.TOSTRING(J&127)
            T=T+1
            Q=Q+1
            %EXIT %IF T>=250
         %REPEAT
         %IF Q=QMAX %THEN S=T
      %FINISH %ELSE %START
         MESS1="
*".SWRITE(WORKA_LINE, 4)."   "
         PARM_OPT=1
         PARM_INHCODE=1 %IF PARM_LET=0;    ! STOP GENERATING CODE
         MESS1=MESS1."FAULT".SWRITE(N,2)
         MESS2=MESSAGE(N)
         %IF MESS2->WK1.("##").WK2 %THEN %C
            MESS2=WK1.SWRITE(IDENT,1).WK2
         %IF MESS2->WK1.("#").WK2 %THEN %C
            MESS2=WK1.SWRITE(DATA,1).WK2
         %IF MESS2->WK1.("&&").WK2 %THEN %C
            MESS2=WK1.PRINTNAME(DATA).WK2
         %IF MESS2->WK1.("&").WK2 %THEN %C
               MESS2=WK1.PRINTNAME(IDENT).WK2
         %IF N>100 %THEN MESS2=MESS2." Disaster"
      %FINISH
         SELECT OUTPUT(PARM_TTOPUT) %unless PARM_TTOPUT=-1
         PRINTSTRING(MESS1)
         PRINTSTRING(MESS2) %IF MESS2#""
         %IF N=100 %AND S<115 %THEN %START
            NEWLINE; SPACES(S+4); PRINTSYMBOL('!')
         %FINISH
         NEWLINE
         SELECT OUTPUT(parm_lpoput) %unless PARM_TTOPUT=-1
      %IF N=109 %THEN %MONITOR
!      %IF N=109 %THEN PARM_DCOMP=1 %AND CODEOUT
      %IF N>100 %THEN %STOP
%END
%EXTERNALROUTINE WARN(%INTEGER N,V)
%string (255) mess
      %return %if worka_line>=20000     { In an included file }
      %if n=10 %start
        mess="
? Warning: Inspect the C produced for input line ".SWRITE(WORKA_LINE,2)."
"
         select output( PARM_TTOPUT) %unless PARM_TTOPUT=-1
         printstring(mess)
         select output(parm_lpoput) %unless PARM_TTOPUT=-1
      %finish
      %if n=11 %start
         mess="
? Warning: Structure member name the same as defined name line ".SWRITE(WORKA_LINE,2)."
"
         select output( PARM_TTOPUT) %unless PARM_TTOPUT=-1
         printstring(mess)
         select output(parm_lpoput) %unless PARM_TTOPUT=-1
      %finish
     %if n=12 %start
         mess="
? Warning: Possible Missed comment at line ".SWRITE(WORKA_LINE,2)."
"
         select output( PARM_TTOPUT) %unless PARM_TTOPUT=-1
         printstring(mess)
         select output(parm_lpoput) %unless PARM_TTOPUT=-1
      %finish
      %if n=13 %start
        mess="
? Warning: No dope vector found for array access at line ".SWRITE(WORKA_LINE,2)."
           Lower bound(s) of zero perforce assumed
"
         select output( PARM_TTOPUT) %unless PARM_TTOPUT=-1
         printstring(mess)
         select output(parm_lpoput) %unless PARM_TTOPUT=-1
      %finish
%END
%EXTERNALROUTINE PRHEX(%INTEGER VALUE, PLACES)
%CONSTBYTEINTEGERARRAY HEX(0:15)='0','1','2','3','4',
               '5','6','7','8','9','A','B','C','D','E','F'
%INTEGER I
      %CYCLE I=PLACES<<2-4, -4, 0
         PRINT SYMBOL(HEX(VALUE>>I&15))
      %REPEAT
%END
%EXTERNALROUTINE PRINT THIS TRIP(%RECORD(TRIPF)%ARRAYNAME TRIPS,
      %INTEGER I)
!***********************************************************************
!*    OUTPUTS A TRIPLE IN READABLE FORM                                *
!***********************************************************************
%CONST%STRING(5)%ARRAY OPERATION(0:192)= %C
         "  ?  ","RT HD","RDSPY","RDARE","RDPTR",
         "RTBAD","RTXIT","XSTOP","  ?  ","  ?  ",
         "  \  ","  -U "," FLT "," ABS ","SHRNK",
         "STRCH"," JAM "," ??? ","NO OP","PRELD",
         "  ?  ","SSPTR","RSPTR","ASPTR","DARRY",
         "SLINE","STPCK","FRPRE","FPOST","FRPR2",
         "PRECL","RCALL","RCRFR","RCRMR","  ?  ",
         "GETAD"," INT ","INTPT","TOSTR","MNITR",
         "PPROF","RTFP ","ONEV1","ONEV2","DVSTT",
         "DVEND","FREND","DMASS","  ?  "(2),
         "UCNOP","UCB1 ","UCB2 ","UCB3 "," UCW ",
         "UCBW ","UCWW ","UCLW ","UCB2W","UCNAM",
         "  ?  "(68),
         "  +  ","  -  ","  !! ","  !  ","  *  ",
         "  // ","  /  ","  &  ","  >> ","  << ",
         " REXP"," COMP","DCOMP"," VMY "," COMB",
         "  =  ","  <- "," IEXP"," ADJ ","AINDX",
         "IFTCH","LASS ","FORCK","PRECC","CNCAT",
         "IOCPC","PASS1","PASS2","PASS3",
         "PASS4","PASS5","PASS6",
         "BJUMP","FJUMP","REMLB","TLAB ","DCLSW",
         "SETSW","-> SW"," S=1 "," S=2 "," S<- ",
         "AHASS","PTRAS","MAPRS","FNRES","SCOMP",
         "SDCMP","PRES1","PRES2","RESLN","RESFN",
         "SIGEV","RECAS","AAINC","AHADJ","CTGEN",
         "GETPR","SINDX","ZCOMP","CLSFT","CASFT",
         "DVBPR","RSTRE","MULTX";
%RECORD(TRIPF)%NAME CURR
%ROUTINESPEC OPOUT(%RECORD(RD)%NAME OPND)
      NEWLINE
      CURR==TRIPS(I)
      WRITE(I,2)
      SPACE
      PRINTSTRING(OPERATION(CURR_OPERN))
      SPACE
      PRHEX(CURR_OPTYPE,2)
      WRITE(CURR_CNT,2)
      WRITE(CURR_DPTH,2)
      SPACES(1)
      PRHEX(CURR_FLAGS,4)
      WRITE(CURR_PUSE,3)
      SPACE
      PRHEX(CURR_X1,8)
      SPACE
      OPOUT(CURR_OPND1)
      OPOUT(CURR_OPND2) %IF CURR_OPERN>=128
      %RETURN
%ROUTINE OPOUT(%RECORD(RD)%NAME OPND)
%STRING(17)T
%STRING(8)S
%INTEGER I,J
%SWITCH SW(0:11)
      PRHEX(OPND_PTYPE,4)
      J=OPND _FLAG
      ->SW(J) %UNLESS J>11
      PRINTSTRING("?")
      PRHEX(OPND_S1&X'FFFF',4)
      SPACE
      PRHEX(OPND_D,8)
      SPACE
      PRHEX(OPND_XTRA,8)
      %RETURN
SW(0):SW(1):                            ! CONSTANT
      %if j=0 %then printstring("s") %else PRINTSTRING(" ")
      %IF OPND_PTYPE&7=5 %START;        ! STRING CONSTS
         I=WORKA_A(OPND_D)
            I=17 %IF I>17
         LENGTH(T)=I
         %CYCLE I=1,1,I
            J=WORKA_A(OPND_D+I)
            J='_' %IF J<=31
            CHARNO(T,I)=J
            %REPEAT
         T<-T."                    "
         PRINTSTRING(T)
      %FINISH %ELSE %START
         PRHEX(OPND_D,8)
         SPACES(4)
         %IF OPND_PTYPE>>4>5 %THEN PRHEX(OPND_XTRA,8) %ELSE SPACES(8)
      %FINISH
      SPACES(2)
      %RETURN
SW(2):                                  ! NAME
      PRINTSTRING(" NAME ")
NAM:  S<-PRINTNAME(OPND_D)."                "
      PRINTSTRING(S)
      %IF OPND_XTRA#0 %THEN PRHEX(OPND_XTRA,8) %ELSE SPACES(8)
      SPACE
      %RETURN
sw(3):
    printstring(" AR ptr "); write(opnd_d,2); spaces(10)
     %return
SW(4):                                  ! VIA STORED POINTER @TRIPLE
      PRINTSTRING("OFFSET-PTR")
      ->COM
SW(5):                                  ! 32 BIT ADDRESS
      PRINTSTRING(" PNTR ")
      ->NAM
SW(7):                                  ! IN A STACK FRAME
      PRINTSTRING(" TEMP ")
      PRHEX(OPND_D,8)
      SPACE
      PRHEX(OPND_XTRA,8)
      %RETURN
SW(6):                                  ! INDIRECT
      PRINTSTRING(" IND-OFFST")
COM:  WRITE(OPND_D,2)
      SPACE
      PRHEX(OPND_XTRA,8)
      SPACE
      %RETURN
SW(8):                                  ! A TRIPLE
      PRINTSTRING(" TRIPLE ")
      WRITE(OPND_D,2)
      SPACES(12)
      %RETURN
SW(9):                                  ! REGISTER ITEM
      PRINTSTRING(" ITEM IN REGSTR ")
      SPACES(4)
      %RETURN
SW(10):                                 ! B-D FORFM
      PRINTSTRING("BASE&DIS ")
      PRHEX(OPND_XB,2)
      SPACE
      PRHEX(OPND_D,8)
      %RETURN
SW(11):                                 ! VIA LA ON B&D
      PRINTSTRING("ADDR(B&D)")
      PRHEX(OPND_XB,2)
      SPACE
      PRHEX(OPND_D,8)
%END
%END
%EXTERNALROUTINE PRINT TRIPS(%RECORD(TRIPF)%ARRAYNAME TRIPS)
%INTEGER I
!      %RETURN %IF PARM_Y=0 %AND PARM_Z=0;! TRIPLES ON CODE+PARMY OR Z
      PRINTSTRING("
TRIPLES FOR LINE"); WRITE(WORKA_LINE,3)
      PRINTSTRING("
 NO OPRN  PT  C  D FLGS PUSE   X1         OPERAND 1                  OPERAND 2")
      I=TRIPS(0)_FLINK
      %WHILE I>0 %CYCLE
         PRINT THIS TRIP(TRIPS,I)
         I=TRIPS(I)_FLINK
      %REPEAT
%END
%EXTERNALROUTINE INITASL(%RECORD(LISTF)%ARRAYNAME SPACE,%INTEGERNAME PTR)
!***********************************************************************
!*    INITIALISES THE ASL AND REMEMBERS IT LOCATION
!***********************************************************************
%INTEGER I
      ASLIST==SPACE
      ASL==PTR
      WORKA_ASL CUR BTM=ASL-240
      WORKA_CONST LIMIT=4*WORKA_ASL CUR BTM-8
      %CYCLE I=WORKA_ASL CUR BTM,1,ASL-1
         aslist(i+1)=0
          ASLIST(I+1)_LINK=I
      %REPEAT
      ASLIST(WORKA_ASL CUR BTM)_LINK=0
      ASLIST(0)_S1=-1
      ASLIST(0)_S2=-1
      ASLIST(0)_S3=-1
      ASLIST(0)_LINK=0
%END
%EXTERNALROUTINE PRINT LIST(%INTEGER HEAD)
!***********************************************************************
!*    A DEBUGGING ONLY ROUTINE. 
!***********************************************************************
%RECORD(LISTF)%NAME LCELL
%INTEGER I,J,K
      PRINTSTRING("
PRINT OF LIST ")
      WRITE(HEAD,2)
      NEWLINE
      %WHILE HEAD#0 %CYCLE
         LCELL==ASLIST(HEAD)
         WRITE(HEAD,3)
         SPACES(3)
         PRHEX(LCELL_S1,8)
         SPACES(3)
         PRHEX(LCELL_S2,8)
         SPACES(3)
         PRHEX(LCELL_S3,8)
         SPACES(3)
         PRHEX(LCELL_LINK,8)
         NEWLINE
         HEAD=LCELL_LINK&X'FFFF';       ! EXTRA LINK IN TAGS LIST!!
      %REPEAT
%END
%EXTERNALROUTINE CHECK ASL
!***********************************************************************
!*    CHECK ASL AND PRINT NO OF FREE CELLS. DEBUGGING SERVICE ONLY     *
!***********************************************************************
%INTEGER N,Q
      Q=ASL; N=0
      %WHILE Q#0 %CYCLE
         N=N+1
         Q=ASLIST(Q)_LINK
      %REPEAT
      NEWLINE
      PRINTSTRING("FREE CELLS AFTER LINE ")
      WRITE(WORKA_LINE,3)
      PRINTSYMBOL('=')
      WRITE(N,3)
%END
%EXTERNALINTEGERFN MORE SPACE
!***********************************************************************
!*    FORMATS UP SOME MORE OF THE ASL                                  *
!***********************************************************************
%INTEGER I,N,CL,AMOUNT
      N=WORKA_ASL CUR BTM-1
      AMOUNT=(WORKA_NNAMES+1)>>3;             ! EIGHTTH OF NNAMES
      I=WORKA_ASL CUR BTM-((WORKA_CONST PTR+8)>>2);! GAP BETWEEN CONSTS &ASL
      %IF I>>1<AMOUNT %THEN AMOUNT=I>>1;! TAKE ONLY HALF THE REMAINDER
      %IF AMOUNT<20 %THEN AMOUNT=0
      WORKA_ASL CUR BTM=WORKA_ASL CUR BTM-AMOUNT
      %IF WORKA_ASL CUR BTM<=1 %THEN WORKA_ASL CUR BTM=1
      CL=4*WORKA_ASL CUR BTM-8
      %IF WORKA_ASL CUR BTM>=N %OR WORKA_CONST PTR>CL %THEN %START
         FAULT(102, WORKA_WKFILEK,0)
      %FINISH %ELSE WORKA_CONST LIMIT=CL;     ! NEW VALUE WITH BIGGER ASL
      %CYCLE I=WORKA_ASL CUR BTM,1,N-1
         ASLIST(I+1)_LINK=I
      %REPEAT
      ASLIST(WORKA_ASL CUR BTM)_LINK=0
      ASL=N; %RESULT=N
%END
!%EXTERNALINTEGERFN NEW CELL
!***********************************************************************
!*       PROVIDE A NEW LIST PROCESSING CELL. CRAPOUT IF NONE AVAILABLE *
!***********************************************************************
!%INTEGER I
!         %IF ASL=0 %THEN ASL=MORE SPACE
!         I=ASL
!         ASL=ASLIST(ASL)_LINK
!         ASLIST(I)_LINK=0
!         %RESULT =I
!%END
%EXTERNALROUTINE PUSH(%INTEGERNAME CELL, %INTEGER S1, S2, S3)
!***********************************************************************
!*       PUSH A CELL CONTAINING THE 3 STREAMS OF INFORMATION GIVEN     *
!*       ONTO THE TOP OF THE LIST POINTED AT BY CELL.                  *
!***********************************************************************
%RECORD(LISTF)%NAME LCELL
%INTEGER I
      I=ASL
      %IF I=0 %THEN I=MORE SPACE
      LCELL==ASLIST(I)
      ASL=LCELL_LINK
      LCELL_LINK=CELL
      CELL=I
      LCELL_S1=S1
      LCELL_S2=S2
      LCELL_S3=S3
%END
%EXTERNALROUTINE POP(%INTEGERNAME CELL, S1, S2, S3)
!***********************************************************************
!*       COPY THE INFORMATION FROM THE TOP CELL OF LIST 'CELL' INTO    *
!*         S1,S2&S3 AND THEN POP THE LIST UP 1 CELL. EMPTYLIST GIVE -1S*
!***********************************************************************
%INTEGER I
%RECORD(LISTF)%NAME LCELL
      I=CELL
      LCELL==ASLIST(I)
      S1=LCELL_S1
      S2=LCELL_S2
      S3=LCELL_S3
      %IF I# 0 %THEN %START
         CELL=LCELL_LINK
         LCELL_LINK=ASL
         ASL=I
      %FINISH
%END
%EXTERNALROUTINE BINSERT(%INTEGERNAME TOP,BOT,%INTEGER S1,S2,S3)
!***********************************************************************
!*       INSERT A CELL AT THE BOTTOM OF A LIST                         *
!*       UPDATING TOP AND BOTTOM POINTERS APPROPIATELY                 *
!***********************************************************************
%INTEGER I,J
%RECORD(LISTF)%NAME LCELL
         I=ASL
         %IF I=0 %THEN I=MORE SPACE
         LCELL==ASLIST(I)
         ASL=LCELL_LINK
         LCELL_S1=S1; LCELL_S2=S2
         LCELL_S3=S3; LCELL_LINK=0
         J=BOT
         %IF J=0 %THEN BOT=I %AND TOP=BOT %ELSE %START
            ASLIST(J)_LINK=I
            BOT=I
         %FINISH
%END
%EXTERNALROUTINE INSERT AFTER(%INTEGERNAME PLACE,%INTEGER S1,S2,S3)
!***********************************************************************
!*    ADDS A CELL INT THE MIDDLE OF A LIST AFTER "CELL" WHICH          *
!*    IS UPDATED                                                       *
!***********************************************************************
%INTEGER I
%RECORD(LISTF)%NAME OLDCELL,CELL
      FAULT(109,0,0) %IF PLACE<=0
      I=ASL
      %IF I=0 %THEN I=MORE SPACE
      CELL==ASLIST(I)
      ASL=CELL_LINK
      OLDCELL==ASLIST(PLACE)
      CELL_S1=S1; CELL_S2=S2
      CELL_S3=S3
      CELL_LINK=OLDCELL_LINK
      OLDCELL_LINK=I
      PLACE=I
%END
%EXTERNALROUTINE INSERT AT END(%INTEGERNAME CELL, %INTEGER S1, S2, S3)
!***********************************************************************
!*       ADD A CELL TO THE BOTTOM OF THE LIST HEADED BY 'CELL'         *
!***********************************************************************
%INTEGER I,J,N
%RECORD(LISTF)%NAME LCELL
         I=CELL; J=I
         %WHILE I#0 %CYCLE
            J=I
            I=ASLIST(J)_LINK
         %REPEAT
         N=ASL
         %IF N=0 %THEN N=MORE SPACE
         LCELL==ASLIST(N)
         ASL=LCELL_LINK
         %IF J=0 %THEN CELL=N %ELSE ASLIST(J)_LINK=N
         LCELL_S1=S1
         LCELL_S2=S2
         LCELL_S3=S3
         LCELL_LINK=0
%END
%EXTERNALINTEGERFN FIND(%INTEGER LAB, LIST)
!***********************************************************************
!*       THIS FUNCTION SEARCHES LIST 'LIST' FOR LAB IN STREAM2 AND     *
!*       RETURNS THE CORRESPONDING CELL NO.IT USED FOR MORE THAN       *
!*       SCANNING LABEL LISTS.                                         *
!***********************************************************************
         %WHILE LIST#0 %CYCLE
            %RESULT=LIST %IF LAB=ASLIST(LIST)_S2
            LIST=ASLIST(LIST)_LINK
         %REPEAT
         %RESULT=-1
%END
%EXTERNALROUTINE CLEAR LIST(%INTEGERNAME OPHEAD)
!***********************************************************************
!*       THROW AWAY A COMPLETE LIST (MAY BE NULL!)                     *
!***********************************************************************
%INTEGER I, J
          I=OPHEAD; J=I
         %WHILE I#0 %CYCLE
            J=I
            I=ASLIST(J)_LINK
         %REPEAT
         %IF J#0 %START
            ASLIST(J)_LINK=ASL
            ASL=OPHEAD; OPHEAD=0
         %FINISH
%END
!%EXTERNALROUTINE CONCAT(%INTEGERNAME LIST1, LIST2)
!!***********************************************************************
!!*        ADDS LIST2 TO BOTTOM OF LIST1                                *
!!***********************************************************************
!%INTEGER I,J
!         I=LIST1
!         J=I
!         %WHILE I#0 %THEN J=I %AND I=ASLIST(J)_LINK
!         %IF J=0 %THEN LIST1=LIST2 %ELSE ASLIST(J)_LINK=LIST2
!         LIST2=0
!%END;                                   ! AN ERROR PUTS CELL TWICE ONTO
                                        ! FREE LIST - CATASTROPHIC!
%ROUTINE PutError(%STRING (255) s)
!***********************************************************************
!*    Compilation ends in disarray. Message and stop tidily            *
!***********************************************************************
%INTEGER bad
      printstring("** PUT error **"); newline
      bad=addr(s)+1
      %monitor; %STOP
%END {PutError}



%externalroutine free space(%integer ad)
!***********************************************************************
!*    This is EPCs interface to FREE                                   *
!*    Enables monitoring or checking to take place                     *
!************************************************************************
         printstring(" FREE "); write(ad,1)
         newline
%end; ! Free space
!*
%EXTERNAL %INTEGER %FN Get Space(%INTEGER size{bytes})
!************************************************************************
!*     This is EPC's interface to MALLOC                               *
!*    Enables monitoring or checking to take place                     *
!************************************************************************
%INTEGER flag
      size=(size+7)&(-8)         { keep everything d-w aligned }
      %IF malmon#0 %START
         printstring(" MALLOC "); write(size,1)
         flag=MALLOC(size)
         printstring(" flag = "); phex(flag)
         newline
         %IF flag+size>maxdata %THEN maxdata=flag+size
      %FINISH %ELSE flag=MALLOC(size)
      %IF flag=0 %THEN PutError(" MALLOC out of space ")
      %RESULT=flag
%END
%externalroutine changesex
%end
%externalroutine pownarrayhead
%end
%externalroutine emonon
%end
%externalroutine prdata
%end
%externalroutine generate
%end
%externalroutine pinitown
%end
%externalroutine esetoptions
%end
%externalroutine psetfiles
%end
%externalroutine epilogue
%end
%externalroutine impabort
%end
%externalroutine mcodeon
%end
%externalroutine reformatc
%end
%externalroutine pfaulty
%end
%externalroutine prologue
%end
%externalroutine filldtabrefs
%end
%externalroutine cxref
%end
%externalroutine esetgisoptions
%end
%externalroutine pdata
%end
%externalroutine pgenerateobject
%end
%externalroutine pmonon
%end
%END %OF %FILE
