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 ! ! 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] 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$