!* MODIFIED  28/02/78  21.00
!*
!*
!*NE %EXTRINSICINTEGER ICL9CEILT
!*NE %EXTRINSICINTEGER ICL9CEELT
!*
!*
SYSTEMINTEGERMAPSPEC  COMREG(INTEGER  I)
SYSTEMROUTINESPEC  OUTFILE(STRING (15) S,INTEGER  L,MAXB,USE,  C 
    INTEGERNAME  CONAD,FLAG)
SYSTEMROUTINESPEC  CONNECT(STRING  (31) S,  C 
         INTEGER  ACCESS, MAXBYTES, USE, RECORDNAME  R,  C 
         INTEGERNAME  FLAG)
!*NE %SYSTEMROUTINESPEC CHANGEUSE(%STRING(31) S,%INTEGER NEW USE, %C
!*NE                %INTEGERNAME FLAG)
!*NE %SYSTEMROUTINESPEC REMOVE AREA(%STRING(8) S)
 SYSTEMROUTINESPEC  PHEX(INTEGER  I)
SYSTEMROUTINESPEC  SSMESS(INTEGER  N)
SYSTEMROUTINESPEC  SSERR(INTEGER  N)
!*
RECORDFORMAT  RF(INTEGER  CONAD, FILESIZE, INTEGERARRAY  D(0 : 7))
!*
!*
!%RECORDFORMAT LF FMT(%STRING (31) NAME,  %C
!         %INTEGER AFILE, AGLA, LOADLEVEL)
!*
!%OWNRECORDARRAY LF(1 : 8)(LF FMT)
!*
OWNINTEGERARRAY  COMPE(4:6)
OWNINTEGER  CTYPE
OWNINTEGER  LFCOUNT = 0
CONSTINTEGER  LFMAX = 8
!*
RECORDFORMAT  EFMT(STRING  (31) NAME, INTEGER  P1, P2, LINK)
 !* CODE ENTRIES  P1 = DR0 FOR ENTRY DESCRIPTOR
!*               P2 = DR1
!* DATA ENTRIES  P1 = ADDRESS
!*               P2 = LENGTH
!* UNSAT. REF.   P1 = ADDRESS OF REF. DESCRIPTOR
!* DYNAM. REF.   P1 = ADDRESS OF REF. DESCRIPTOR
!* DATA REF.     P1 = ADDRESS OF REFERENCE WORD
!*               P2 = EXPECTED LENGTH
!*
CONSTINTEGER  ERECSIZE = 44
OWNINTEGER  EFREE
OWNINTEGER  LISTBASE
!
!%RECORDFORMAT LOADRECFMT(%INTEGER GLABASE, %INTEGERARRAY SAVE(3 : 7))
!*
!%OWNRECORDARRAY LOADREC(0 : 4)(LOADRECFMT)
!*
OWNINTEGER  LOADLEVEL = 0
CONSTINTEGER  MAXLOADLEVEL = 4
OWNINTEGER  UNASSPATTERN=X'81'
!*
OWNINTEGER  GLABASE
OWNINTEGER  BASELDATA
OWNINTEGER  BASEEPHEAD
!*
CONSTINTEGER  NUMEPS=225
!*
CONSTSTRING (15)ARRAY  VALIDEPS(1:225)= C 
'ICL9CEDATE',
'ICL9CETIME',
'S#CPUTIME',
'ICL9CECPUTIME',
'S#STOP',
'GAMMAFN',
'LOGGAMMA',
'CPUTIM',
'HDATE',
'CTIME',
'S#SIGNAL',
'S#FIO1',
'S#FAUX',
'S#IOCP',
'S#NDIAG',
'S#INTPT',
'S#INT',
'S#FRACPT',
'S#PRINT',
'S#PRINTFL',
'S#READ',
'ONCOND',
'CPUTIME',
'ERFN',
'ERFNC',
'S#IEXP',
'HYPTAN',
'S#ISIN',
'S#ICOS',
'S#ISQRT',
'COT',
'S#IRADIUS',
'S#ITAN',
'S#IARCCOS',
'S#IARCSIN',
'S#IARCTAN',
'S#AARCTAN',
'HYPSIN',
'HYPCOS',
'EXPTEN',
'S#ILOG',
'LOGTEN',
'LRANDOM',
'S#ININTEGER',
'S#INREAL',
'S#OUTINTEGER',
'S#OUTREAL',
'S#OUTTERMINATOR',
'S#WRITETEXT',
'S#ABS',
'S#IABS',
'S#SIGN',
'S#MAXREAL',
'S#MINREAL',
'S#MAXINT',
'S#EPSILON',
'S#AFAULT',
'S#ALREAD',
'S#ANXTSY',
'S#ARDSYM',
'S#APRSYM',
'S#ALGPTH',
'S#PRSTNG',
'S#ASELIN',
'S#ASELOU',
'S#ALGNWL',
'S#ALGSPC',
'S#ALGNLS',
'S#ALGSPS',
'S#LENGTH',
'S#INSYMBOL',
'S#OUTSYMBOL',
'S#AICODE',
'S#OUTSTRING',
'S#READ1900',
'S#PRINT1900',
'S#OUTPUT',
'S#READBOOLEAN',
'S#WRITEBOOLEAN',
'S#COPYTEXT',
'S#ALRDCH',
'S#ALNXCH',
'S#ALSKCH',
'S#ALPRCH',
'S#ALGMON',
'ICL9CEXIT',
'S#WRITE',
'TIME',
'DATE',
'CLOSESTREAM',
'S#CLOSESTREAM',
'SETMARGINS',
'READSTRING',
'FROMSTRING',
'SETRETURNCODE',
'BITS',
'PARITY',
'SHIFTC',
'   ',
'   ',
'ISOCARD',
'RFDISO',
'IFDISO',
'SOLVELNEQ',
'DIVMATRIX',
'UNIT',
'INVERT',
'DET',
'NULL',
'ADDMATRIX',
'SUBMATRIX',
'COPYMATRIX',
'MULTMATRIX',
'MULTTRMATRIX',
'TRANSMATRIX',
'RANDOM',
'ICL9CEDIAG',
'ICL9CELABELS',
'ICL9CEFTRACE',
'OPENSQ',
'CLOSESQ',
'READSQ',
'WRITESQ',
'OPENDA',
'CLOSEDA',
'READDA',
'WRITEDA',
'READLSQ',
'LENGTHSQ',
'S#GETSQ',
'S#PUTSQ',
'S#OPENSQ',
'S#CLOSESQ',
'S#OPENDA',
'S#CLOSEDA',
'S#GETDA',
'S#PUTDA',
'S#RWNDSQ',
'M#1LGAMMA',
'M#2LGAMMA',
'M#4LGAMMA',
'M#1GAMMA',
'M#2GAMMA',
'M#4GAMMA',
'M#1SQRT',
'M#2SQRT',
'M#4SQRT',
'M#1ASIN',
'M#2ASIN',
'M#4ASIN',
'M#1ACOS',
'M#2ACOS',
'M#4ACOS',
'M#1SIN',
'M#2SIN',
'M#4SIN',
'M#1COS',
'M#2COS',
'M#4COS',
'M#1TAN',
'M#2TAN',
'M#4TAN',
'M#1COT',
'M#2COT',
'M#4COT',
'M#1ATAN',
'M#2ATAN',
'M#4ATAN',
'M#1ATAN2',
'M#2ATAN2',
'M#4ATAN2',
'M#1EXP',
'M#2EXP',
'M#4EXP',
'M#1SINH',
'M#2SINH',
'M#4SINH',
'M#1COSH',
'M#2COSH',
'M#4COSH',
'M#1TANH',
'M#2TANH',
'M#4TANH',
'M#1LOG10',
'M#2LOG10',
'M#4LOG10',
'M#1LOG',
'M#2LOG',
'M#4LOG',
'M#1EXP10',
'M#2EXP10',
'M#4EXP10',
'M#1ERF',
'M#2ERF',
'M#4ERF',
'M#1CERF',
'M#2CERF',
'M#4CERF',
'M#1ABSC',
'M#2ABSC',
'M#4ABSC',
'M#1CCOS',
'M#2CCOS',
'M#4CCOS',
'M#1CSIN',
'M#2CSIN',
'M#4CSIN',
'M#1CSQRT',
'M#2CSQRT',
'M#4CSQRT',
'M#1CLOG',
'M#2CLOG',
'M#4CLOG',
'M#1CEXP',
'M#2CEXP',
'M#4CEXP',
'M#1C1XPR1',
'M#2C2XPR2',
'M#4C4XPR4',
'M#AL11XP1',
'M#AL22XP2',
'M#AL44XP4',
'ICL9CEIDATE',
'ICL9CEITIME',
'***END***'
!*
!*
SYSTEMINTEGERFN  INITLOAD
INTEGER  I, J
         OUTFILE('SS#WRK',X'80000',X'80000',0,EFREE,J)
         OUTFILE('SS#GLA',X'40000',0,0,GLABASE,I)
         IF  I#0 OR  J # 0 THEN  SSERR(225)
         COMREG(38) = GLABASE;          ! ADDRESS OF SS#GLA
         COMREG(44) = GLABASE+16;       ! CURRENT FREE GLA
     I=ADDR(BASELDATA)&X'FFFC0000'
         COMREG(35)=I ;! GLA BASE
!*E;           BASELDATA=X'800000'+INTEGER(X'800018')
!*NE          BASELDATA=X'800000'+INTEGER(X'80000C')
          BASEEPHEAD=INTEGER(BASELDATA+4)
         RESULT =0
END ;                                   ! INITLOAD
!*
ROUTINE  MOVE(INTEGER  LENGTH, FROM, TO)
INTEGER  I
      RETURNIF  LENGTH <= 0
      I = X'18000000'!LENGTH
      *LSS_FROM
      *LUH_I
      *LDTB_I
      *LDA_TO
      *MV_L =DR 
END ;                                   !OF MOVE
!*
ROUTINE  FILL(INTEGER  LENGTH, FROM,FILLER)
INTEGER  I
      RETURNIF  LENGTH <= 0
      I = X'18000000'!LENGTH
      *LDTB_I
      *LDA_FROM
      *LB_FILLER
      *MVL_L =DR 
END 
!*
!*
ROUTINE  EPOP(INTEGERNAME  LIST, AD)
!%RECORDNAME E(EFMT)
          AD = LISTBASE
         LISTBASE=LISTBASE+ERECSIZE
END ;                                   ! EPOP
!*
ROUTINE  EPUSH(INTEGERNAME  LIST, INTEGER  AD)
RECORDNAME  E(EFMT)
E==RECORD(AD)
         E_LINK = LIST
         LIST = AD
END ;                                   ! EPUSH
!*
!*

CONSTSTRING  (21) SSBASEDIR = "SUBSYS.SYSTEM_BASEDIR"
RECORDFORMAT  LNF(BYTEINTEGER  TYPE, STRING  (6) NAME,  C 
   INTEGER  REST, POINT, DR1)
                                        !LONG NAME FORMAT
RECORDFORMAT  SNF(BYTEINTEGER  TYPE, STRING  (10) NAME,  C 
   INTEGER  POINT, DR1)
                                        !SHORT NAME FORMAT
RECORDFORMAT  DHF(INTEGER  DATAEND, DATASTART, SIZE, FILETYPE,  C 
   DATE, TIME, PSTART, SPARE)
                                        !DIRECTORY HEADER FORMAT
RECORDFORMAT  XRF(INTEGER  CONAD, FILETYPE, DATASTART, DATAEND)

STRINGFN  FINDSYSTEMENTRY(STRING  (31) ENTRY)
!***********************************************************************
!*                                                                     *
!* This function is used to find the name of the object file which     *
!* contains a given entry. It only searches the Edinburgh Subsystem    *
!* standard base directory, which is assumed to have the name          *
!* SUBSYS.SYSTEM_BASEDIR                                               *
!* If the entry is not found or the directory cannot be connected      *
!* then the result is null.                                            *
!*                                                                     *
!***********************************************************************
STRING  (31) RES
RECORDNAME  DH(DHF);                    !MAPS ONTO DIRECTORY HEADER
RECORD  RR(XRF)
INTEGER  LENE, INITP, HASHCONST, HASHBASE, P, PSTART, DAD,  C 
       FLAG

   INTEGERFN  HASH(STRING  (31) NAME, INTEGER  HASHCONST)
   INTEGER  RES, A, B, C, D, E, F, G, H, I, J, K
                                        !A-K ALL NEEDED
      STRING(ADDR(A)) = NAME."<>12ABXY89*"
      RES = A!!B>>4!!C
      RESULT  = (RES-RES//HASHCONST*HASHCONST)
   END ;                                !OF HASH
   RES = "";                            !FAILURE BY DEFAULT
   CONNECT(SSBASEDIR,0,0,0,RR,FLAG)
IF  FLAG#0 THEN  SSMESS(FLAG)
   IF  FLAG # 0 THEN  -> ERR
   DAD = RR_CONAD;                      !ADDRESS OF DIRECTORY
   DH == RECORD(DAD);                   !MAP DH ONTO DIRECTORY HEADER
   PSTART = DAD+DH_PSTART
   HASHCONST = INTEGER(DAD+DH_DATASTART)
                                        !NO OF ENTRIES IN HASHED TABLE
   HASHBASE = DAD+DH_DATASTART+4
   LENE = LENGTH(ENTRY)
   INITP = HASH(ENTRY,HASHCONST);       !START SEARCHING HERE
   P = INITP;                           !START SEARCHING HERE
   IF  LENE <= 10 START ;               !DEAL WITH SHORT ENTRY NAMES

      BEGIN ;                           !NEED INNER BLOCK FOR
                                        ! DECLARATIONS
      RECORDARRAYFORMAT  HAF(0 : HASHCONST-1)(SNF)
      RECORDARRAYNAME  H(SNF)
         H == ARRAY(HASHBASE,HAF);      !MAP H ONTO HASHED TABLE
         CYCLE 
            IF  H(P)_NAME = ENTRY AND  H(P)_TYPE = 0 START 
               RES = STRING(PSTART+H(P)_POINT)
                                        !FILENAME - DIRECTORY OR OBJECT
               EXIT ;                   !SUCCESS
            FINISH 
            IF  H(P)_NAME = "" THEN  EXIT 
                                        !ENTRY NOT FOUND
            P = P+1
            IF  P = HASHCONST THEN  P = 0
                                        !OVER THE TOP
            IF  P = INITP THEN  EXIT 
                                        !GONE RIGHT ROUND
         REPEAT 
      END 
   FINISH  ELSE  START 
                                        !NOW DEAL WITH LONG NAMES

      BEGIN 
      RECORDARRAYFORMAT  HAF(0 : HASHCONST)(LNF)
      RECORDARRAYNAME  H(LNF)
      STRING  (26) REST;                !REST OF LONG NAME
         H == ARRAY(HASHBASE,HAF)
         REST = FROMSTRING(ENTRY,7,LENE)
         LENGTH(ENTRY) = 6;             !TRUNCATE IT
         CYCLE 
            IF  H(P)_NAME = ENTRY AND  H(P)_TYPE = X'80' C 
               AND  STRING(H(P)_REST+PSTART) = REST START 
               RES = STRING(PSTART+H(P)_POINT)
               EXIT 
            FINISH 
            IF  H(P)_NAME = "" THEN  EXIT 
                                        !NOT FOUND
            P = P+1
            IF  P = HASHCONST THEN  P = 0
                                        !OVER THE TOP
            IF  P = INITP THEN  EXIT 
                                        !GONE RIGHT ROUND
         REPEAT 
      END 
   FINISH 
ERR:

   RESULT  = RES
END ;                                   !OF FINDSYSTEMENTRY
! %EXTERNALROUTINE TESTFINDCS(%STRING(31) ENTRY)
! PRINTSTRING("
! ".FINDSYSTEMENTRY(ENTRY)."
! ")
!%END
ROUTINESPEC  LOAD FILE(STRING (31) FILE,INTEGERNAME  FLAG)
EXTERNALINTEGERFN  LOAD COMPILER(INTEGER  TYPE, STRING (31) CENTRY C 
,INTEGERNAME  ENTRY) 
INTEGER  COM44,FLAG,CGLABASE,OLDGLABASE
OWNINTEGER  GCUR=0
! SAVE CURRENT GLA POINTER
COM44=COMREG(44)
OLDGLABASE=GLABASE
IF  GCUR=0 START 
OUTFILE("T#CGLA",X'40000',0,0,GCUR,FLAG)
IF  FLAG#0 START 
PRINTSTRING("
CANNOT CREATE T#CGLA, FLAG = ")
WRITE(FLAG,1)
NEWLINE
RESULT =206
FINISH 
GLABASE=GCUR&X'FFFC0000'
INTEGER(GLABASE+8)=X'40000'
FINISH 
GLABASE=GCUR&X'FFFC0000'
COMREG(44)=GCUR
CTYPE=TYPE
LOADFILE(FINDSYSTEMENTRY(CENTRY),FLAG)
IF  FLAG#0 START 
PRINTSTRING("
LOAD COMPILER FAILS, FLAG = ")
WRITE(FLAG,1)
RESULT =FLAG
FINISH 
GCUR=COMREG(44)
GLABASE=OLDGLABASE
COMREG(44)=COM44
ENTRY=COMPE(CTYPE)
CTYPE=0
RESULT =0
END 
!*NE %ROUTINE WHERE IS(%STRING (32) S, %INTEGERNAME DR0, DR1,%C
!*NE %INTEGER ADDRTAB)
!*NE %STRING (32) T
!*NE %INTEGER FIRSTCH, I, LINK
!*NE %INTEGERARRAYFORMAT LTFM(1:100000)
!*NE %INTEGERARRAYNAME ICL9
!*NE ICL9==ARRAY(ADDRTAB,LTFM)
!*NE    DR0 = -1
!*NE    FIRSTCH = BYTEINTEGER(ADDR(S)+1)
!*NE !! SEARCH EXTERNAL LINKAGE TABLE FOR NAME
!*NE !!
!*NE NEXTTABLE:
!*NE 
!*NE    %RETURN %IF ICL9(1)=-1   ;! ABANDON IF NO ELT
!*NE    %IF FIRSTCH = '$' %THEN LINK = 1 %ELSE LINK = FIRSTCH-63
!*NE    LINK = ICL9(LINK);              ! INDEX BY FIRST LETTER
!*NE    %WHILE LINK>0 %CYCLE
!*NE       T = STRING(ADDR(ICL9(LINK+1)))
!*NE       %IF S = T %THEN %START
!*NE          I = LINK+1+(LENGTH(S)+4)>>2
!*NE          DR0 = ICL9(I)
!*NE          DR1 = ICL9(I+1)
!*NE          %RETURN
!*NE       %FINISH
!*NE       %RETURN %IF T > S
!*NE       %EXIT %UNLESS ICL9(LINK)>0
!*NE       LINK = ICL9(LINK)+LINK
!*NE    %REPEAT
!*NE %END
INTEGERFN  FINDEP(STRING  (31) S,  C 
         INTEGER  HEAD,TYPE, INTEGERNAME  DR0,DR1)
!* TYPE = 0  PROC   1  DATA
STRING (32) REST
RECORDNAME  E(EFMT)
RECORDFORMAT  LDATA1FMT(INTEGERC 
LINK,LOC,STRING (31) IDEN)
RECORDNAME  L(LDATA1FMT)
 INTEGER  I,J
         WHILE  HEAD # 0 CYCLE 
            E == RECORD(HEAD)
            IF  E_NAME = S THENSTART 
            DR0=E_P1
            DR1=E_P2
            RESULT =0
         FINISH 
            HEAD = E_LINK
         REPEAT 
!*
!* NOW SEARCH BASE FILE
!*
        IF  S="EXIT" THEN  S="ICL9CEXIT"
         IF  S#'S#GO' AND  TYPE=0 THENSTART 
   CYCLE  J=1,1,NUMEPS
!*E; %IF S->("ICL9CEZ").S %THEN S="S#".S
    IF  VALIDEPS(J)=S OR  CTYPE>0  START 
            I=BASEEPHEAD
            WHILE  I#0 CYCLE 
!*E;                L==RECORD(X'800000'+I)
!*NE               L==RECORD(BASELDATA+I)
               IF  L_IDEN=S THENSTART 
                  DR0=X'B1000000'
                  DR1=(L_LOC&X'FFFFFF')+COMREG(35)
                  RESULT =0
               FINISH 
               I=L_LINK
            REPEAT 
              FINISH 
        REPEAT 
         FINISH 
!*NE           %IF S->('S#').S %THEN S='ICL9CEZ'.S
!*NE           WHERE IS(S,DR0,DR1,ADDR(ICL9CEILT))
!*NE           %IF DR0=-1 %THENSTART
!*NE             I=ADDR(ICL9CEELT)
!*NE             *LDTB_X'18000010'
!*NE             *LDA_I
!*NE             *VAL_(%LNB+1)
!*NE             *JCC_3,<NOGO>
!*NE             WHERE IS(S,DR0,DR1,I)
!*NE          %FINISH
!*NE           %IF DR0#-1 %THEN %RESULT=0 
!*NE  NOGO: 
   RESULT =1
 END ;                                   ! FINDEP
!*
OWNINTEGER  ISTACKBASE;! FOR INITIALISED STACK AREA
OWNINTEGER  ISTACKSIZE
OWNINTEGER  ISTACKPATTERN
OWNINTEGER  MAINEPAD
!*
ROUTINESPEC  PLIST(INTEGER  HEAD)
!*
ROUTINE  LOAD FILE (STRING  (31) S ,INTEGERNAME  FLAG)
!*
RECORDFORMAT  LD13F(INTEGER  LINK,A,DISP,LEN,REP,ADDR)
RECORDFORMAT  DREFF(INTEGER  LINK,REFARRAY,L,STRING (31) IDEN)
RECORDNAME  DREF(DREFF)
INTEGERARRAYFORMAT  REFLOCAF(1:10000)
INTEGERARRAYNAME  REFLOC
RECORDNAME  LD13(LD13F)
INTEGER  START,REFARRAY,REFCOUNT,LINK
RECORDFORMAT  R1FMT(INTEGER  LINK, REFLOC, STRING  (31) NAME)
RECORDFORMAT  R2FMT(INTEGER  LINK,DISP,L,A,STRING (31) NAME)
RECORDFORMAT  R3FMT(INTEGER  LINK,N)
RECORDNAME  R1(R1FMT)
RECORDNAME  R2(R2FMT)
RECORDNAME  R3(R3FMT)
!*
RECORD  R(RF)
!*
RECORDNAME  E(EFMT)
!*
INTEGER  COM3, COM4, COM5, COM6, COM7
INTEGER  I, J, K, L, M, AFILE, AGLA, LBASE, UNSHDISP,AREADESC
INTEGER  B
INTEGER  GCUR,GEND
STRING (31) NAME
INTEGER  DR0,DR1
INTEGERARRAY  BASE(1 : 7)
!*
!      I = 0
!      %WHILE I < LFCOUNT %CYCLE;        ! THROUGH LIST OF LOADED FILES
!         I = I+1
!         %IF S = LF(I)_NAME %THEN FLAG = -1 %ANDRETURN
!                                        !ALREADY LOADED
!      %REPEAT
!*
IF  COMREG(27)&X'10010' #0 THEN  UNASSPATTERN=0 ELSE  UNASSPATTERN=X'81'
      ISTACKPATTERN=COMREG(14)+X'10';! USE PART OF SS#WORK
      CONNECT(S,0,0,0,R,FLAG)
      IF  FLAG # 0 THENSTART 
         PRINTSTRING('
UNABLE TO CONNECT '.S.'  FLAG =')
         WRITE(FLAG,1)
         NEWLINE
         RETURN 
      FINISH 
!*
      AFILE = R_CONAD
!*
AREADESC=INTEGER(AFILE+28)+AFILE
J=AREADESC+4
UNSHDISP=INTEGER(J+12)
AGLA=AFILE+UNSHDISP
LBASE=AFILE+INTEGER(AFILE+24)
IF  INTEGER(LBASE)#14 THEN  SSMESS(226) AND  RETURN 
I=INTEGER(J+16)+INTEGER(J+52)+INTEGER(J+64) ;! GLALENGTH
      GEND = GLABASE+INTEGER(GLABASE+8);   ! SS#GLA END
      GCUR = COMREG(44);                   !CURRENT FREE GLA POINTER
      IF  GCUR+I>GEND THENSTART 
SIZE ERR:
         PRINTSTRING('
STATIC DATA AREA TOO LARGE
')
         FLAG = 2
         RETURN 
      FINISH 
!*
      MOVE(I,AGLA,GCUR)
      AGLA = GCUR
      GCUR=(GCUR+I+7)&X'FFFFFFF8'
      COMREG(44) = GCUR
!*
     INTEGER(GLABASE)=GCUR-GLABASE
        AREADESC=INTEGER(AFILE+28)+AFILE 
      J = AREADESC+4
      BASE(1) = AFILE+INTEGER(J);       !CODE
      BASE(2) = AGLA+INTEGER(J+12)-UNSHDISP; !GLA
      BASE(3) = AGLA+INTEGER(J+24)-UNSHDISP; !PLT
      BASE(4) = AFILE+INTEGER(J+36);    !SHARED SYMBOL TABLES
      BASE(5) = AGLA+INTEGER(J+48)-UNSHDISP; !UNSH SYMBOL TABLES
       BASE(6) = AGLA+INTEGER(J+60)-UNSHDISP;! COMMON
       BASE(7)=ISTACKPATTERN
      ISTACKSIZE=INTEGER(J+76)
      IF  ISTACKSIZE#0 THENSTART 
         MOVE(ISTACKSIZE,AFILE+INTEGER(J+72),ISTACKPATTERN)
      FINISH 
      LISTBASE=ISTACKPATTERN+ISTACKSIZE+16
!      MOVE(20,ADDR(COMREG(3)),ADDR(COM3))
      COM3=0
      COM4=0
      COM5=0
      COM6=0
      COM7=0
!*
!* PROCESS CODE ENTRIES
!*
      I = INTEGER(LBASE+4)
      WHILE  I # 0 CYCLE 
         R1 == RECORD(AFILE+I)
         EPOP(EFREE,J)
         IF  J = 0 THEN  -> TOO MANY
         E == RECORD(J)
         E_P1 = X'B1000000';            !DR0
         E_P2 = R1_REFLOC&X'FFFFFF'+BASE((R1_REFLOC>>24)&X'F');       !DR1
         IF  R1_REFLOC>>31#0 THEN  MAINEPAD=E_P2
         E_NAME = R1_NAME
IF  CTYPE#0 THEN  COMPE(CTYPE)=E_P2
         EPUSH(COM3,J)
         I = R1_LINK
      REPEAT 
!*
!*PROCESS DATA ENTRIES
!*
      I = INTEGER(LBASE+16)
      WHILE  I # 0 CYCLE 
         R2 == RECORD(AFILE+I)
         EPOP(EFREE,J)
         IF  J = 0 THEN  -> TOO MANY
         E == RECORD(J)
         E_P1 = R2_DISP+BASE(R2_A);     !ADDRESS
         E_P2 = R2_L;                   !LENGTH
         E_NAME = R2_NAME
         EPUSH(COM4,J)
         I = R2_LINK
      REPEAT 
!*
!* PROCESS PROCEDURE REFS
!*
      M = 0
      I = INTEGER(LBASE+28)
PROCREF: WHILE  I # 0 CYCLE 
      R1 == RECORD(AFILE+I);            !  REF. DESC.
      K = (R1_REFLOC&X'FFFFFF')+BASE(R1_REFLOC>>24)
      IF  FINDEP(R1_NAME,COM3,0,DR0,DR1) # 0 THENSTART ;             !NOT DEFINED
         EPOP(EFREE,J)
         IF  J = 0 THEN  -> TOO MANY
         E == RECORD(J)
         E_P1 = K
         E_NAME = R1_NAME
         EPUSH(COM5,J)
      FINISHELSESTART ;                 ! LOCATED
         E == RECORD(J)
         INTEGER(K) = DR0
         INTEGER(K+4) = DR1
      FINISH 
      I = R1_LINK
   REPEAT 
!*
   IF  M = 0 THENSTART ;                ! PROCESS DYNAMIC PROCEDURE REFS
      I = INTEGER(LBASE+32)
      M = 1
      -> PROC REF;                      ! HANDLE AS STATIC MEANTIME
   FINISH 
!*
!* PROCESS DATA REFERENCES
!*
   I = INTEGER(LBASE+36)
   WHILE  I # 0 CYCLE 
      DREF == RECORD(AFILE+I)
REFARRAY=DREF_REFARRAY&X'7FFFFFFF'
REFCOUNT=INTEGER(AFILE+REFARRAY)
REFLOC==ARRAY(AFILE+REFARRAY+4,REFLOCAF)
CYCLE  REFCOUNT=1,1,REFCOUNT
K=REFLOC(REFCOUNT)&X'FFFFFF'+BASE(REFLOC(REFCOUNT)>>24)
IF  DREF_IDEN='SS#AUXST' THEN  START 
   INTEGER(K)=COMREG(37)
   ->NEXTDATAREF
FINISH 
      IF  DREF_IDEN='SZAUXST' OR  DREF_IDEN='ICL9CEAUXST' THENSTART 
            INTEGER(K)=COMREG(41);! ADDRESS OF SS#AUXST DESC.
            ->NEXTDATAREF
      FINISH 
      IF  FINDEP(DREF_IDEN,COM4,1,DR0,DR1) # 0 THENSTART ;             !NOT DEFINED
         EPOP(EFREE,J)
         IF  J = 0 THEN  -> TOO MANY
         E == RECORD(J)
         E_P1 = K
         E_P2 = DREF_L
         E_NAME = DREF_IDEN
         EPUSH(COM7,J)
      FINISHELSESTART ;                 !LOCATED
         E == RECORD(J)
         INTEGER(K) = INTEGER(K)+DR0
      FINISH 
NEXTDATAREF:  REPEAT 
I = DREF_LINK
   REPEAT 
!*
!******  ALLOCATE UNITIALISED COMMON AREAS
!*
      WHILE  COM7#0 CYCLE 
         J=0;! FOR LIST OF REFS TO THIS AREA
         K=0;! FOR REMAINING REFS
         E==RECORD(COM7)
         NAME=E_NAME
         L=E_P2;! SIZE OF AREA
         J=COM7
         COM7=E_LINK
         E_LINK=0
         WHILE  COM7#0 CYCLE 
            E==RECORD(COM7)
            I=COM7
            COM7=E_LINK
            IF  NAME=E_NAME THENSTART 
               IF  E_P2>L THEN  L=E_P2;! REQUIRE MAX OF ALL REFS
               E_LINK=J
               J=I
            FINISHELSESTART 
               E_LINK=K
               K=I
            FINISH 
         REPEAT 
         IF  GCUR+L>GEND THEN  ->SIZE ERR
         M=GCUR
         GCUR=(GCUR+L+7)&X'FFFFFFF8'
         COMREG(44)=GCUR
         FILL(L,M,UNASSPATTERN)
         WHILE  J#0 CYCLE 
            E==RECORD(J)
            I=J
            INTEGER(E_P1)=INTEGER(E_P1)+M
            J=E_LINK
         REPEAT 
         E_P1=M
         E_P2=L
         E_LINK=COM4
         COM4=I;! ADD TO INITIALISED LIST
         COM7=K;! BALANCE OF REFS
      REPEAT 
!      %IF COMREG(27)&X'8000'#0 %AND COM4#0 %THENSTART;! PARM(MAP)
!         PRINTSTRING('
!COMMON AREAS      ADDRESS      LENGTH
!')
!         I=COM4
!         %WHILE I#0 %CYCLE
!            NEWLINE
!            E==RECORD(I)
!            PRINTSTRING(E_NAME)
!            SPACES(16-LENGTH(E_NAME))
!            PHEX(E_P1)
!            SPACES(4)
!            PHEX(E_P2)
!            I=E_LINK
!         %REPEAT
!         NEWLINES(2)
!      %FINISH
!*
!*   PROCESS INITIALISTION DATA
!*
I=INTEGER(LBASE+52)
WHILE  I#0 CYCLE 
LD13==RECORD(AFILE+LINK)
START=BASE(LD13_A)+LD13_DISP
IF  LD13_LEN=1 START 
FILL(LD13_REP,START,LD13_ADDR)
FINISHELSESTART 
CYCLE  I=1,1,LD13_REP
MOVE(LD13_LEN,LD13_ADDR,START)
START=START+LD13_LEN
REPEAT 
FINISH 
LINK=LD13_LINK
REPEAT 
!*
!*PROCESS RELOCATION BLOCKS
!*
   I = INTEGER(LBASE+56)
WHILE  I#0 CYCLE 
   R3 == RECORD(AFILE+I)
   J = R3_N
   K = AFILE+I+8
   CYCLE  L = 1,1,J
B=INTEGER(K+4)>>24
IF  B=7 THEN  B=ISTACKBASE ELSE  B=BASE(B)
M=BASE(INTEGER(K)>>24)+(INTEGER(K)&X'FFFFFF')
INTEGER(M)=INTEGER(M)+B+(INTEGER(K+4)&X'FFFFFF')
K=K+8
   REPEAT 
   I = R3_LINK
REPEAT 
MOVE(20,ADDR(COM3),ADDR(COMREG(3)))
RETURN 
TOO MANY: SSMESS(227)
         PRINTSTRING('
PROC ENTRIES:
')
         PLIST(COM3)
         PRINTSTRING('
DATA ENTRIES:
')
         PLIST(COM4)
         PRINTSTRING('
PROC REFS:
')
         PLIST(COM5)
         PRINTSTRING('
DATA REFS:
')
         PLIST(COM7)
NEWLINE
FLAG=3
RETURN 
END ;                                   ! LOAD FILE
!*
!*
ROUTINE  PLIST(INTEGER  I)
RECORDNAME  E(EFMT)
WHILE  I#0 CYCLE 
   E==RECORD(I)
   PRINTSTRING(E_NAME)
   NEWLINE
   I=E_LINK
REPEAT 
END 
!*
SYSTEMROUTINE  SJRUN(STRING (63) S)
INTEGER  I,J,F
IF  COMREG(24)#0 THENSTART 
SSMESS(222)
RETURN 
FINISH 
ISTACKSIZE=0
*PUT_X'5F98';! STSF (TOS)
*PUT_X'6398';! LSS  (TOS)
**=I
ISTACKBASE=(I+7)&X'FFFFFFF8'
I=INITLOAD
MAINEPAD=0
LOADFILE('SS#TMPOB',F)
IF  F#0 THENSTART 
RETURN 
FINISH 
I=COMREG(5)
IF  I#0 THENSTART 
F=1
PRINTSTRING('
UNSATISFIED REFERENCES:
')
PLIST(I)
FINISH 
I=COMREG(7)
IF  I#0 THENSTART 
PRINTSTRING('
UNSATISFIED DATA REFERENCES:
')
PLIST(I)
F=1
FINISH 
IF  F=0 THENSTART 
IF  ISTACKSIZE#0 THENSTART 
   I=(ISTACKSIZE+16)>>2
   **I
   *PUT_X'499C';! ST   B
   *PUT_X'6F9C';! ASF  B
   MOVE(ISTACKSIZE,ISTACKPATTERN,ISTACKBASE)
FINISH 
IF  MAINEPAD#0 THENSTART 
   I=X'B1000000'
   J=MAINEPAD
   ->ENTER
FINISH 
IF  FINDEP('S#GO',COMREG(3),0,I,J)=0 THENSTART 
ENTER:
!*NE    CHANGE USE('SS#TMPOB',1,F)
IF  COMREG(36)&4=0 THEN  C 
COMREG(36)=COMREG(36)+4
!*NE     %IF F#0 %THEN %MONITOR
!*NE    REMOVE AREA('SS#WRK')
**I
*PUT_X'4998';! ST (TOS)
**J
*PUT_X'4998';! ST (TOS)
*PUT_X'7998';! LD_(TOS)
*PUT_X'5D98';! STLN (TOS)
*PUT_X'6E04';! ASF 4
*PUT_X'6C05';! RALN 5
*PUT_X'1FDC';! CALL @(DR)
RETURN 
FINISHELSESTART 
PRINTSTRING('
***NO MAIN PROGRAM
')
FINISH 
FINISH 
END ;! RUN
ENDOFFILE