SPL,L,M,O,T,C 
!     REV C 11 13 /74 
       NAME OPLG(8) 
!      OPEN SYSTEM RELOCATABLE UTILITY LIBRARY AND LOAD-N-GO AREA 
!      ROUTINES 
! 
!      OPEN SYSTEM LIBRARY(RTE) 
! 
!      OPNLB CONVENTIONS WITH READL:
!      DCB(1)=0 TO PREVENT BLOWING UP THE FILE MANAGER. TRAPPED IN ILOSE
!      DCB(2)=TRACK 
!      DCB(3)= LU 
!      DCB(4)=OFFSET WITHIN BUFFER
!      DCB(5)= SECTOR 
!      DCB(6)=COUNTER OF # PROGS.DECREMENTED IN READL WHENEVER
!               AN END RECORD IS FOUND
!      DCB(7)=#SECTORS/TRACK
!      DCB(8)=PACKED DISC ADDRESS(LU/TRAK/SECTOR) 
! 
OPNLB: SUBROUTINE GLOBAL
       LET STUP BE SUBROUTINE 
       LET DSCLB BE CONSTANT(1761K)    !CORE-RESIDENT SYSTEM LIBRARY
       LET DSCLN BE CONSTANT(1762K)    !COUNTER#RES.LIBR. EPS 
       LET DSCUT BE CONSTANT(1763K)    !DISC ADR.RELOC.UTIL.PROGS.
       LET DSUNN BE CONSTANT(1764K)    !#UTILITY PROGS
       LET NENTS BE CONSTANT(16)       !#ENTRY POINTS PER BLOCK 
       LET LENTH BE CONSTANT( 64)      !#WORDS READ PER BLOCK.
       LET RDSK BE SUBROUTINE          !LOCAL ROUTINE,INCREMENT DISC ADD
       LET IWP,SMBL,STYP,SVLU,SATR BE PSEUDO,EXTERNAL 
       LET CFXUP,OCTAQ,STPRG,EXEC,PRENT BE SUBROUTINE,EXTERNAL
       LET GETRM BE SUBROUTINE,EXTERNAL 
       LET MAT2,CCON,ISTR BE FUNCTION,EXTERNAL
       LET ERR,LINKF  BE INTEGER,EXTERNAL 
       LET UNDF1,DCB4,LISTO,FILEX,XLNKS,SLNKS BE INTEGER,EXTERNAL 
       LET BINY BE INTEGER,EXTERNAL 
! 
       LET BPA1 BE CONSTANT(1742K) !FWA RT DISC RESIDENT BP LINKS AREA
       LET FSYMB BE INTEGER 
       INITIALIZE FSYMB TO -1!FIRST SYMBOL FLAG 
! 
       CALL STUP    !SET UP AND PRINT FILE NAME(LIBRY)
! 
!      CHECK FOR MATCHES IN UNDEFS STRING TO CORE RESIDENT LIBRARY ROUTI
! 
       TRAK_([SEC_$DSCLB]->7) AND 377K !TRACK ADR.RES.LIB.ENTRY POINTS. 
       SEC_SEC AND 177K 
       LU_2                            !LIBRARY IS ALWAYS ON SYSTEM DISC
       NSPTK_$1757K                    !#SECTORS/TRACK ON LU2 
       CNTR_$DSCLN                     !COUNTER #RES.LIB.ENTRY POINTS.
       NBLK_(((((CNTR-<2)+ 77K))->6)AND 177K)!COUNT MAX#BLOCKS TO SEARCH
! 
!      READ SECTOR OF RESIDENT LIBRARY ENTRY POINT NAMES. 
! 
OPLB1: IF[NBLK_NBLK-1]<0 THEN GOTO OPL20
       CALL RDSK                  !READ NEXT BLOCK OF RES.LIB.ENTRY 
       CNTR_[T3_CNTR]-NENTS 
!      SET COUNTER TO MINIMUM OF # ENTRY PTS THIS BLOCK AND 
!      # ENTRY POINTS REMAINING.
       IF T3 > NENTS THEN T3_NENTS
       T_DCB13      !SET BLOCK POINTER
OPLB2: T_T+4        !ADVANCE POINTER
       LNKAD_$([TP3_[TP2_T+2]+1])!GET SYMBOL VALUE/LINK ADDRESS 
       REPFL,TYPE_$TP2 AND 7!GET SYMBOL TYPE.SET REPLACEMENT INSTR.FLAG 
       IF [T3_T3-1] < 0 THEN GOTO OPLB1! CHECK FOR END OF BLOCK 
       IFNOT[ FSYMB_FSYMB+1]\ FIRST SYMBOL ENCOUNTERED
            THEN [ IF LNKAD=2001K THEN \ MUST CERTAINLY BE RTE-II 
                 LINKF_ LINKF OR 4000K] 
       IF TYPE = 1 THEN\ "VALUE" IS DISC-RESIDENT ADDRESS. IGNORE.
           GOTO OPLB2 
OPLB5: STRG_UNDF1 
! 
!      BEGIN SEARCH::  COMPARE EACH SYMBOL IN THE UNDEFINEDS STRING 
!      WITH THE SYMBOL POINTED TO BY "T".  IF A MATCH OCCURS, 
!      THEN DEFINE THE SYMBOL AND RESOLVE THE FIXUPS.  IF NO
!      MATCH IS FOUND, THEN DEFINE THE SYMBOL ANYWAY ONLY IF
!      ITS TYPE IS 4 (REPLACEMENT INSTRUCTION CODE). IN THIS EVENT, 
!      THE SYMBOL MUST BE "FAKED" TO APPEAR TO BE A STRING, SO
!      THAT THE SYMBOL TABLE-MANIPULATION ROUTINES MAY BE USED. 
! 
OPLB6: STRX_STRG    !SAVE NAME POINTER
       NAM_IWP(STRG)?[ GOTO OPNL7] ! GET UNDEFS NAME STRING PTR 
       REF1_IWP(STRG)              ! GET UNDEFS 1ST REFERENCE 
       FIX_IWP(STRG)               ! GET UNDEFS FIXUP LIST PTR
       IFNOT NAM THEN GOTO OPLB6   ! SKIP ENTRIES ALREADY DEFINED 
       IFNOT [MFLAG_MAT2($T,NAM,5)] \ NO MATCH. TRY NEXT UNDEF. 
             THEN GOTO OPLB6
! 
! 
!      MATCH FOUND. 
! 
!        OBTAIN TYPE CODE, AND PROCESS ACCORDING TO TYPE: 
! 
!      TYPE        PROCESSED AS:
!       0          NORMAL ENTRY POINT.  FOR RTE-I, TABLE ENTRY WORD 4 
!                  CONTAINS THE LINK; $(WORD 4) CONTAINS THE SYMBOL 
!                 VALUE.  FOR RTE-II, WORD 4 CONTAINS THE SYMBOL
!                 VALUE(THE RESIDENT BASE PAGE LINKS AREA MUST BE 
!                 SEARCHED FOR A LINK [ONE MAY NOT EXIST]). 
! 
!                    EXAMPLES: EXEC, $LIBR,$LIBX
! 
! 
!       1         DISC-RESIDENT (IN UTILITY LIBRARY). "VALUE" IS DISC 
!                 ADDRESS IN LIBRARY OF MODULE. SXL IGNORES THIS
!                 DIRECTORY.
! 
!       4         REPLACEMENT-TYPE ENTRY POINTS. ALL REFERENCES 
!                 TO THE SYMBOL ARE REPLACED BY THE INSTRUCTION 
!                 CODE FOUND IN THE "VALUE".  EXAMPLES: EAU 
!                 AND FLOATING-POINT INSTRUCTIONS.
! 
OL10:  IF TYPE = 4 THEN [VALUE_$(TP3); TYPS_70K; GO TO CFX] 
       TYPS_ 30K; REPFL_-1
       IF (LINKF AND 4000K) \CHECK WHETHER VALUE IS SYMBOL OF LINK
                         THEN [VALUE_LNKAD;LNKAD_0;\RTE-II
\                       SCAN RESIDENT BASE PAGE LINKS AREA FOR MATCH
\                       IF NO LINK FOUND, USE THE ONES IN THE   
\                       FIXUP LIST. 
                              FOR LOOPV_10 TO ($BPA1-1) DO\ 
                              [ IF $LOOPV=VALUE THEN\ 
                                 GOTO CFX]],\ 
                          ELSE VALUE_$LNKAD   ! RTE-I 
! 
!     RESOLVE FIXUP LIST
! 
CFX:   IF FIX THEN CALL CFXUP(FIX,VALUE,LNKAD,BINY,REPFL) 
!      ENTER SYMBOL IN SYMBOL TABLE 
       CALL GETRM(0,ENTAD) !GET SYMBOL TABLE SPACE
       STYP(ENTAD)_TYPS 
       SVLU(ENTAD)_VALUE
       SATR(ENTAD)_FILEX
!      GET ROOM FOR SYMBOL
       P_T          !SET UP BUFFER POINTER
       IF ($(T+1) AND 77400K) > 20000K \SYMBOL > 2 CHARS. 
           THEN [CALL GETRM(3,NAMAD); SMBL(ENTAD+2)_NAMAD],\
           ELSE NAMAD_ENTAD+2 
!      ENTAD = SYMBOL TABLE POINTER VIRTUAL ADDRESS 
!      NAMAD = SYMBOL NAME VIRTUAL ADDRESS
!      MOVE SYMBOL NAME TO VIRTUAL MEMORY 
! 
SN2:   IF([J_[WORD_$P] AND 77400K]) <= 20000K\SYMBOL ENDED W/ PREVIOUS
          THEN[SMBL(NAMAD-1)_SMBL(NAMAD-1) OR 200K; GOTO SN3]! WORD 
       IF(WORD AND 177K) <= 40K \ SYMBOL ENDS WITH HIGH-WORD
          THEN WORD_J OR 200K 
       SMBL(NAMAD)_WORD !STORE CHARACTERS IN VIRTUAL MEMORY 
       IF (WORD AND 200K) THEN GOTO SN3 
       P_P+1
       NAMAD_NAMAD+1
       GOTO SN2 
!      IF SYMBOL IS A MATCH TO AN UNDEFINED, PURGE
!      THE NAME STRING AND DELETE IT FROM 
!      THE UNDEFINEDS LIST
SN3:   IF (LISTO AND 1) \ LIST ENTRY PTS OPTION 
           THEN CALL PRENT(ENTAD,VALUE,BINY,REF1) 
       IFNOT MFLAG THEN GOTO OPLB2
       CALL STPRG($STRX)  !PURGE NAME STRING & DELETE FROM UNDEFS LIST
       IFNOT LNKAD THEN GOTO OPLB2!NO LINK FOUND
       IFNOT SLNKS THEN XLNKS_ISTR(SLNKS),ELSE IWP(XLNKS)_-1
       IWP(XLNKS)_LNKAD 
       IWP(XLNKS)_VALUE 
       GOTO OPLB2 
! 
!      NO MATCH TO $T EXISTS IN UNDEFINEDS STRING.
!      IF SYMBOL IS TYPE 4, DEFINE IT ANYWAY. 
! 
OPNL7: IF (TYPE OR (LINKF AND 2000K))# 4 THEN GOTO OPLB2
! 
!     <NOTE> BIT 10 OF LINKF IS SET AFTER THE FIRST SYSTEM LIBRARY
!            SCAN TO PREVENT TYPE 4 ENTS FROM BEING ENTERED MORE
!            THAN ONCE. 
! 
       MFLAG,FIX,REF1_0 
! 
       GOTO OL10
! 
!      FINISHED WITH CORE-RESIDENT LIBRARY ROUTINES.
!      SET UP DISC POINTERS ETC. TO READ RELOCTABLE UTILITY LIBRARY 
!      PROGRAMS.
OPL20: $(DCB4+1),TRAK_(([SEC_$DSCUT])->7)AND 377K !TRACK
       $(DCB4+4),SEC_SEC AND 177K      !SECTOR
       $(DCB4),$(DCB4+3),ERR_0
       $(DCB4+2),LU_2                  !SYSTEM LIB.ALWAYS ON LU2
       $(DCB4+5)_-($DSUNN)             !NEG.#PROGS COUNTER
       $(DCB4+6)_NSPTK                 !#SECTORS/TRACK(64-WORD) 
       CALL RDSK
       LINKF_LINKF OR 2000K !SET FIRST-LIBR. PASS FLAG
       RETURN 
       END
! 
!      READ DISC ROUTINE
! 
RDSK:  SUBROUTINE 
       DCB17_[DCB13_DCB4+12]+4!POINTER TO 128-WORD PACKING BUFFER 
       CALL EXEC(1,LU,$DCB17,LENTH,TRAK,SEC)
       IFNOT[SEC_SEC+1] <NSPTK THEN\BUMP SECTOR,IF OVF THEN 
       [TRAK_TRAK+1; SEC_0]                !BUMP TRACK&ZERO SECTOR
       RETURN 
       END
! 
!      OPEN LOAD-N-GO AREA
! 
!      DATA CONTROL BLOCK CONVENTIONS WITH READG: 
!      SAME AS OPNLB
!      WHEN OGDCB(8)= $(LGOC) THEN  READG       TAKES THE 
!      EOF EXIT 
! 
       LET LGOTK BE CONSTANT(1765K)    !LGO STG. LU,TRACK 
       LET LGOC BE CONSTANT(1766K)     !CURRENT LGO LU,TRACK,SECTOR 
OPNLG: SUBROUTINE GLOBAL
       CALL STUP                       !SETUP AND PRINT FILE NAME 
! 
       SEC,$(DCB4),$(DCB4+3),$(DCB4+4)_0!SECTOR,OFFSET&FAKED-DCB FLAG 
       LU,$(DCB4+2)_[IF $LGOTK<0 THEN 3,ELSE 2]!GET LOGICAL UNIT
       TRAK,$(DCB4+1)_($LGOTK AND 77600K)->7!TRACK
       $(DCB4+6),NSPTK_$(1755K+LU)     !#SECTORS/TRACK
       $(DCB4+7)_0
       ERR_[IF $LGOTK THEN 0,ELSE -6] 
       CALL RDSK                       !GET 1ST SECTOR
       RETURN 
       END
       LET BLNK,MSTBL,EXEC BE SUBROUTINE,EXTERNAL 
       LET FILEX,ASTAK,LISTO,LSTLU,DCB BE INTEGER,EXTERNAL
       LET STAK BE PSEUDO,EXTERNAL
       LET BUF BE INTEGER(4)
       INITIALIZE BUF TO 4("  ")
STUP:  SUBROUTINE 
       FILEX_STAK(ASTAK)               !GET FILE NAME S.T. POINTER
       CALL BLNK(DCB,3) 
       CALL MSTBL(FILEX,DCB,T)
       CALL MSTBL(FILEX,BUF(2),T) 
       IF LISTO AND 4 THEN CALL EXEC(2,LSTLU,BUF,4) 
       RETURN 
       END
       END
END$
                                                                                                    