!
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 : 127) =   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;
CONSTINTEGER  MAXLEVELS=31,COMMALT=2,DECALT=8,ENDALT=9,SNPT=X'1006'
CONSTINTEGER  MAXIBITS=32;              ! BITS IN LARGEST INTEGER
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  I)
CONSTBYTEINTEGERARRAY  TRTAB(0:255)=0(48),1(10),
                                        0(7),2(26),0(6),2(26),0(*);
INCLUDE  "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  FAULT(INTEGER  A,B,C)
EXTERNALINTEGERFN  PASSONE
IF  HOST=PERQ THEN  START 
      EXTERNALROUTINESPEC  MOVE BEE
FINISH 
ROUTINESPEC  NEW SOURCE(INTEGER  NEW FIL AD)
ROUTINESPEC  OLD SOURCE
ROUTINESPEC  READ LINE(INTEGER  MODE,CHAR)
INTEGERFNSPEC  COMPARE(INTEGER  P)
ROUTINESPEC  PNAME(INTEGER  MODE)
ROUTINESPEC  CONST(INTEGER  MODE)
ROUTINESPEC  TEXTTEXT(INTEGER  EBCDIC)
EXTERNALROUTINESPEC  MOVE BYTES(INTEGER  LENGTH,FBASE,FOFF,TOBASE,TOOFF)
CONSTINTEGERARRAY  PRECONSTS(0:3)=10,0,{NL}X'413243F6',X'A8885A31'{PI};
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
BYTEINTEGERARRAYFORMAT  SRCEF(0:1024*1024)

RECORD (EMASFHDRF)NAME  HDR
LONGREAL  IMAX
STRING (9)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=7*NNAMES
      ARSIZE=1024*WORKA_WKFILEK-(WORKA_CCSIZE+256);!256 BYTE MARGIN LEFT AT MAP TIME
      IMAX=(-1)>>1
INTEGERARRAY  SFS(0:MAXLEVELS)

BYTEINTEGERARRAYFORMAT  LETTF(0:DSIZE+20)
BYTEINTEGERARRAYNAME  LETT
BYTEINTEGERARRAY   TLINE(-60:161)
CONSTBYTEINTEGERARRAY  ILETT(0: 526)= 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',255;
         LETT==ARRAY(ADDR(A(ARSIZE-DSIZE-20)),LETTF)
         ARSIZE=ARSIZE-DSIZE-300
         LETT(0)=0
         LEVEL=0

         WORKA_LETT==LETT
!         WORKA_LETT==ARRAY(ADDR(LETT(0)),A)
         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>>15&1)!(I>>7&1);   ! USE MAP OR PROFILE BIT PRO TEM
         PARM_DYNAMIC=I>>20&1
         PARM_LET=I>>13&1
         PARM_DCOMP=I>>14&1;            ! PARM CODE OR D
         PARM_DBUG=I>>18&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
         PARM_TTOPUT=COMREG(40)
         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); SPACES(14)
         PRINTSTRING("ERCC. Portable Imp80")
         PRINTSTRING(" Compiler Release")
         WRITE(WORKA_RELEASE,1)
         PRINTSTRING(" Version ".WORKA_LADATE)
         NEWLINES(3)
         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)
         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)
      REPEAT 
END 
!
         COMREG(24)=16;                ! RETURN CODE
         LINE=0; LLENGTH=0; Q=1
         R=1;  LEVEL=1
         CYCLE 
            IF  Q>=LLENGTH THEN  QMAX=1 AND  READ LINE(0,0)
            STARSTART=R
            R=R+3
            A(R)=LINE>>8
            A(R+1)=LINE&255
            R=R+2
            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+5)=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+5)=ENDALT AND  C 
                     1<=A(STARSTART+6)<=2 START ;! ENDOF PROG OR FILE
                     IF  IHEAD=0 THEN  EXIT 
                     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 
         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 
         WORKA_LETT==ARRAY(ADDR(A(R)),A)
         R=R+NEXT+1
         IF  LEVEL>1 THEN  FAULT(15,LEVEL-1,0)
         R=(R+7)&(-8)
         NEWLINE
         IF  PARM_FAULTY=0 THEN  START 
            WRITE(LINE, 5)
            PRINT STRING(" LINES ANALYSED   SIZE=")
            WRITE(R, 5)
            IF  (HOST=EMAS OR  HOST=IBM OR  HOST=IBMXA) AND  C 
               LINE>90 AND  PARM_LIST#0 THEN  NEWPAGE ELSE  NEWLINE
         FINISH  ELSE  START 
            PRINTSTRING("CODE GENERATION NOT ATTEMPTED
")
            COMREG(24)=8
            COMREG(47)=PARM_FAULTY
            STOP 
         FINISH 
         RESULT =R
ROUTINE  NEWSOURCE(INTEGER  NEWFILEADDR)
!***********************************************************************
!*    SETS UP COMPILER TO USE AN INCLUDED SOURCE FILES                 *
!***********************************************************************
      PUSH(IHEAD,FILEADDR,FILEPTR,LINE)
      FILEADDR=NEWFILEADDR
      HDR==RECORD(FILEADDR)
      SOURCE==ARRAY(FILEADDR,SRCEF)
      FILEPTR=HDR_STARTRA
      FILEEND=HDR_ENDRA
      IDEPTH=IDEPTH+1
      IF  PARM_MAP#0 THEN  LINE=10000
END 
ROUTINE  OLDSOURCE
!***********************************************************************
!*    UNDOES THE ABOVE
!***********************************************************************
INTEGER  ALT LINE
      IF  IHEAD#0 THEN  START 
         POP(IHEAD,FILEADDR,FILEPTR,ALTLINE)
         HDR==RECORD(FILEADDR)
         FILEEND=HDR_ENDRA
         IF  PARM_MAP#0 THEN  LINE=ALT LINE
         SOURCE==ARRAY(FILEADDR,SRCEF)
         IDEPTH=IDEPTH-1
      FINISH  ELSE  FAULT(110,0,0)
END 
ROUTINE  READ LINE(INTEGER  MODE,CHAR)
ROUTINESPEC  GET LINE
INTEGER  DEL, LL, LP, PREV, LASTC
      LL=0;  LP=0; Q=1
      LLENGTH=0;  DEL=0; LASTC=-1;   ! NO CONTINUATIONS AS YET
NEXT:
      LP=LP+1
      IF  LP>LL THEN  GET LINE AND  LP=1
      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 
         IF  I='%' THEN  DEL=128 AND  ->NEXT
         I=ONE CASE(I)
         IF  'A'<=I<='Z' THEN  I=I!DEL ELSE  START 
            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
      IF  LLENGTH-1=LASTC THEN  LLENGTH=LASTC AND  ->NEXT
      I=CC(LLENGTH-1)
      IF  I='C'+128 THEN  LLENGTH=LLENGTH-2 AND  LASTC=LLENGTH AND  ->NEXT
      IF  MODE=0 AND  I=',' THEN  LLENGTH=LLENGTH-1 AND  LASTC=LLENGTH AND  ->NEXT
      FAULT(101,0,0) IF  LLENGTH>WORKA_CCSIZE
                                        ! ON PERQ IMP SEEMS DEAD
                                        ! THEREFORE MOVE THE BEE
      IF  HOST=PERQ AND  LINE&15=0 THEN  MOVE BEE
      RETURN 
ROUTINE  GET LINE
SYSTEMROUTINESPEC  IOCP(INTEGER  A,B)
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 
            READ SYMBOL(K)
            TLINE(LL+1)=ITOI(K)
            LL=LL+1
         REPEAT 
      FINISH  ELSE  START 
        IF  FILEPTR>=FILE END START 
            OLD SOURCE;                 ! RESET SOURCE FILES
            GETLINE
            RETURN 
         FINISH 
         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 
      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)
!         SPACES(8)
         CYCLE  K=-7,1,0
            TLINE(K)=' '
         REPEAT 
      IF  MODE#0 THEN  TLINE(-7)=M'"'
         TLINE(-8)=LL+8
         IF  HOST=PERQ OR  HOST=ACCENT THEN  START 
            PRINT SYMBOL(TLINE(K)) FOR  K=-7,1,LL
         FINISH  ELSE  IOCP(15,ADDR(TLINE(-8)))
      FINISH 
      IF  PARM_FREE=0 AND  LL>73 THEN  TLINE(73)=10 AND  LL=73
END 
END 
INTEGERFN  COMPARE(INTEGER  P)
INTEGER  I, J, ITEM, RA, RL, RP, RQ, RR, RS, MARKER, SSL, ALT, PP
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
      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=CC(Q);                          ! 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  CC(Q)=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=CC(Q);                          ! 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
      CONST(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=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS  '0'<=I<='9'
      S=0
      WHILE  '0'<=I<='9' CYCLE 
         S=10*S+I&15
         Q=Q+1; I=CC(Q)
      REPEAT 
      A(R)<-S>>8; A(R+1)=S&255
      R=R+2; ->SUCC
BIP(1006):                              ! PHRASE S=SEPARATOR
      I=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      ->SUCC IF  I=NL
      ->FAIL UNLESS  I=';'
      Q=Q+1; ->SUCC
BIP(1007):
                                        ! PHRASE COMMENT TEXT
      I=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      IF  I='!' THEN  Q=Q+1 AND  ->COMFOUND
      ->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
COMFOUND:
      J=CC(Q)
      CYCLE 
         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=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      ->FAIL UNLESS  '0'<=I<='9'
      S=0
      WHILE  '0'<=I<='9' CYCLE 
         S=10*S+I&15
         Q=Q+1; I=CC(Q)
      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 READLINE?
      I=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      WHILE  I=NL  CYCLE 
         READLINE(0,0)
         RQ=1
         I=CC(Q)
      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
      LEVEL=LEVEL+1
      SFS(LEVEL)=0
      ->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=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      J=0
      NEM="123456789"
      WHILE  'A'<=I<='Z' OR  '0'<=I<='9' CYCLE 
         J=J+1
         CHARNO(NEM,J)=I
         Q=Q+1; I=CC(Q)
      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=PERQ OR  TARGET=ACCENT) 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=CC(Q);                          ! 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=CC(Q)
      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=CC(Q);                          ! 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=CC(Q);                          ! 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=CC(Q);                          ! 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=CC(Q);                          ! 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=CC(Q);                          ! 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
      IF  I='=' THEN  START 
         IF  CC(Q+1)=I THEN  J=9 AND  ->JOIN1
         J=1; ->JOIN
      FINISH 
      IF  I='#' THEN  START 
         IF  CC(Q+1)=I THEN  J=10 AND  ->JOIN1
         J=4; ->JOIN
      FINISH 
      IF  I='¬' AND  CC(Q+1)='=' THEN  START 
         Q=Q+1
         IF  CC(Q+1)='=' THEN  J=10 AND  ->JOIN1
         J=4; ->JOIN
      FINISH 
      IF  I='>' THEN  START 
         IF  CC(Q+1)='=' THEN  J=2 AND  ->JOIN1
         J=3; ->JOIN
      FINISH 
      IF  I='<' THEN  START 
         IF  CC(Q+1)='>' THEN  J=4 AND  ->JOIN1
         IF  CC(Q+1)='=' THEN  J=5 AND  ->JOIN1
         J=6; ->JOIN
      FINISH 
      IF  I='-' AND  CC(Q+1)='>' THEN  J=8 AND  ->JOIN1
      ->FAIL
JOIN1:Q=Q+1
JOIN: Q=Q+1
      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=CC(Q);                          ! OBTAIN CURRENT CHARACTER
      IF  I='=' THEN  START 
         IF  CC(Q+1)='=' THEN  A(R)=1 AND  Q=Q+2 AND  ->UPR
         A(R)=2; Q=Q+1; ->UPR
      FINISH 
      IF  I='<' AND  CC(Q+1)='-' THEN  A(R)=3 AND  Q=Q+2 AND  ->UPR
      IF  I='-' AND  CC(Q+1)='>' THEN  A(R)=4 AND  Q=Q+2 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=CC(Q)
      ->FAIL UNLESS  I=NL OR  I=';'
      Q=Q+1 IF  I=';'
      ->FAIL UNLESS  CTYPE=5 AND  A(S)<=31
      IF  HOST=EMAS THEN  START 
BEGIN 
SYSTEMROUTINESPEC  CONSOURCE(STRING (31)FILENAME,INTEGERNAME  FILEADDR)
      CONSOURCE(STRING(ADDR(A(S))),J)
      NEWSOURCE(J)
END 
      ->SUCC
      FINISH 
      IF  HOST=PNX THEN  START 
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)
      CONSOURCE(FNAME,J)
      NEWSOURCE(J)
END 
      ->SUCC
      FINISH 
      ->FAIL
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=CC(Q)
      CYCLE 
         Q=Q+1
         EXIT  IF  I=NL OR  I=';'
         I=CC(Q)
      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=CC(Q)
      RETURN  UNLESS  TRTAB(FS)=2 AND  M'"'#CC(Q+1)#M''''
                                        ! 1ST CHAR MUST BE LETTER
      T=1
      LETT(NEXT+1)=FS!32; JJ=71*FS
      CYCLE 
         Q=Q+1
         I=CC(Q)
         EXIT  IF  TRTAB(I)=0
         JJ=JJ+HASH(T)*I IF  T<=7
         T=T+1
         LETT(NEXT+T)=I!32
      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  CONST(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
IF  1<<HOST&LLREALAVAIL#0 START 
      LONGLONGREAL  X,CVALUE,DUMMY
      CONSTLONGLONGREAL  TEN=10
FINISH  ELSE  START 
      LONGREAL  X,CVALUE,DUMMY
      CONSTLONGREAL  TEN=10
FINISH 
IF  1<<HOST&LINTAVAIL#0 START 
      LONGINTEGER  RADIXV
FINISH  ELSE  START 
      INTEGER  RADIXV
FINISH 
      ON  EVENT  1,2 START 
         HIT=0
         RETURN 
      FINISH 
      CPREC=5;  RR=R;  R=R+1
      DOTSEEN=0;  HIT=0
      CVALUE=0;  DUMMY=0; X=0;  FS=CC(Q)
      S=0;  ->N IF  M'0'<=FS<=M'9'
      ->DOT IF  FS='.' AND  MODE=0 AND  '0'<=CC(Q+1)<='9'
                                        ! 1 DIDT MIN
      CTYPE=1;  EBCDIC=0
      ->QUOTE IF  FS=M''''
      ->STR2 IF  FS=34
      ->NOTQUOTE UNLESS  CC(Q+1)=M'''';  Q=Q+2
      ->HEX IF  FS='X'
      ->MULT IF  FS='M'
      ->BIN IF  FS=M'B'
      ->RHEX IF  FS='R' AND  MODE=0
      ->OCT IF  FS='K'
      IF  FS='C' THEN  EBCDIC=1 AND  ->MULT
      IF  1<<HOST&LLREALAVAIL#0 AND  1<<HOST&LINTAVAIL#0 AND  C 
         FS='D' AND  MODE=0 THEN  START 
         CPREC=7
         IF  M'0'<=CC(Q)<=M'9' THEN  ->N
         IF  CC(Q)='.' THEN  ->DOT
      FINISH 
      Q=Q-2;  RETURN 
QUOTE:                                  ! SINGLE CH BETWEEN QUOTES
      S=CC(Q+1); Q=Q+2
      IF  S=NL THEN  READLINE(1,'''') AND  Q=1
      IF  CC(Q)=M'''' THEN  START 
         Q=Q+1
         IF  S#M'''' THEN  ->IEND
         IF  CC(Q)=M'''' THEN  Q=Q+1 AND  ->IEND
      FINISH 
      RETURN ;                          ! NOT VALID
NOTQUOTE:                               ! CHECK FOR E"...."
      RETURN  UNLESS  FS='E' AND  CC(Q+1)=M'"'
      EBCDIC=1; Q=Q+1
STR2:                                   ! DOUBLE QUOTED STRING
      A(RR)=X'35';  TEXTTEXT(EBCDIC)
      CTYPE=5;  RETURN 
HEX:  T=0;                              ! HEX CONSTANTS
      CYCLE 
         I=CC(Q);  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  C 
         (T<9 OR  (1<<TARGET&LINTAVAIL#0 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)
         S=S!(SS<<Z)
         SS=SS>>(32-Z)
         CPREC=6
      FINISH 
IEND:
      IF  CPREC=6 THEN  MOVEBYTES(4,ADDR(SS),0,ADDR(A(0)),R) AND  R=R+4
      IF  CPREC=5 AND  0<=S<=X'7FFF' START 
         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
      RETURN 
RHEX:                                   ! REAL HEX CONSTANTS
      T=0
      CYCLE 
         I=CC(Q);  Q=Q+1
         IF  T&7=0 AND  T#0 START 
            MOVEBYTES(4,ADDR(S),0,ADDR(A(0)),R);  R=R+4;  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  (1<<TARGET&LLREALAVAIL#0 AND  T=32)
      IF  T=32 THEN  CPREC=7 ELSE  CPREC=4+T//8
      A(RR)=CPREC<<4!2
      HIT=1;  RETURN 
OCT:                                    ! OCTAL CONSTANTS
      T=0
      CYCLE 
         I=CC(Q);  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  CC(Q)#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
      CYCLE 
         I=CC(Q);  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
      T=0; RADIXV=0
      RS=RSHIFT(S)
      Q=Q+1
      CYCLE 
         I=CC(Q)
         EXIT  UNLESS  '0'<=I<='9' OR  'A'<=I<='Z'
         IF  I<='9' THEN  I=I-'0' ELSE  I=I-('A'-10)
         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=CC(Q)
      UNTIL  I<M'0' OR  I>M'9' CYCLE 
         CVALUE=TEN*CVALUE+(I&15)
         Q=Q+1;  I=CC(Q);               ! 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;  X=TEN;  I=CC(Q)
      DOTSEEN=1;                        ! CONSTANT HAS DECIMAL POINT
      WHILE  M'0'<=I<=M'9' CYCLE 
         CVALUE=CVALUE+(I&15)/X
         X=TEN*X;  Q=Q+1;  I=CC(Q)
      REPEAT 
ALPHA:                                  ! TEST FOR EXPONENT
      IF  MODE=0 AND  CC(Q)='@' THEN  START 
         Q=Q+1;  X=CVALUE
         Z=1;  I=CC(Q)
         IF  I='-' THEN  Z=-1
         IF  I='+' OR  I='-' THEN  Q=Q+1
         CONST(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 
            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 
                                        ! SEE IF IT IS INTEGER
      IF  FS='D' THEN  START 
         I=CC(Q)
         IF  I='''' THEN  Q=Q+1 ELSE  RETURN 
         DOTSEEN=1;                     ! ENSURE NOT TAKEN AS INTEGER
      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 
         MOVEBYTES(8,ADDR(CVALUE),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=CC(Q)
         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  CC(Q)#QU THEN  EXIT 
            FINISH 
            IF  I=10 THEN  READLINE(1,QU) 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