*COMDECK /SETLOF/ 
*#
*0        ADD LFN TO LIST OF FILES IF LFN/FIT-ADR NOT ALREADY THERE.
*         GET LIST ADDRESS FROM (PASSLOC-ED) CTL$RM ENTRY POINT 
*         LOF$RM (IF>0) OR FROM SYSTEM MACRO GETLOF (IF (LOF$RM)<0).
*         THEN SEARCH LIST AND ADD LFN/FIT-ADR IF NOT ALREADY THERE 
*         EITHER AT END OF LIST OR IN EMPTY ENTRY (UPPER 12 BITS=7777B).
*         IF LIST IS FULL, GET A NEW LARGER BLOCK FROM CMM
*         (IF CMM UNAVAILABLE, ISSUE ERROR 50B), COPY OLD BLOCK TO
*         NEW BLOCK, CALL CMM TO RELEASE OLD BLOCK AND CALL 
*         SETLOF TO STORE THE NEW LIST ADDRESS. 
*0        X5 = 42/LFN,18/ADDR 
*#
          SA3       =XLOF$RM
          SX6       X3             (X3)=ADR OF LIST 
          SA2       X6+B1 
          NZ        X2,GOTADR      IF A FILE EXISTS, LOF MUST BE SET
          LX6       30
          SA6       LOFADR
          SETLOF    A6,RECALL      FIRST TIME 
 GOTADR   BSS       0 
          SA2       X3+ 
          BX0       X2             SAVE HEADER WORD 
          SA1       X3             INITIALIZE X1 FOR SEARCH LOOP
          SB4       B0             ADR OF EMPTY ENTRY 
          SB5       X0-1
          MX2       42
  
 LOFLOOP  BSS       0 
          SA1       A1+B1          LOAD NEXT LIST ENTRY 
          ZR        X1,LOFEOL      JUMP IF END OF LIST
          BX6       X1-X5          COMPARE
          ZR        X6,ENDLOF      DONT ADD LFN IF ALREADY THERE
          PL        X1,CHKEOL      ENTRY CONTAINS VALID LFN 
          NE        B4,B0,CHKEOL   EMPTY ENTRY-SAVE IF NO OTHER EMPTY 1S
          SB4       A1+            SAVE ADR OF EMPTY ENTRY
 CHKEOL   BSS       0 
          SB5       B5-B1 
          GE        B5,B0,LOFLOOP  JUMP IF NOT END OF LIST
  
 LOFEOL   BSS       0 
          SB2       B4
          NE        B4,B0,JUSTSTO  IF EMPTY ENTRY,USE IT
          SB2       A1             AVAILABLE IF ZERO
          ZR        X1,LOFSTORE 
          SB2       X0             OLD LENGTH 
          SB3       A2             SAVE ADR OF ORIGINAL BLOCK 
          SX2       B2+B2          NEW BLOCK LENGTH=2*OLD BLK LEN 
          MX3       0 
          SX2       X2+2
          SB4       =YCMM.ALF 
          SX6       346B
          NG        B4,CALLERR     IF CMM NOT AVAILABLE 
          RJU       =YCMM.ALF      GET NEW BLOCK
          SA3       B3             FWA OF ORIGINAL BLOCK
          MX7       1              SET UP NEW BLK HDR WORD
          SX2       B2+B2 
          BX7       X2+X7 
          SA7       X1
          BX6       X1
          SA6       =XLOF$RM
          LX6       30
          SA6       LOFADR
          SETLOF    A6,RECALL      POST NEW LIST ADDRESS
 COPYLP   BSS       0              COPY OLD LIST ENTRIES TO NEW LIST
          SA3       A3+B1 
          BX7       X3
          SA7       A7+B1 
          SB2       B2-B1 
          GT        B2,B0,COPYLP
          SB2       A7+1           SAVE ADDRESS OF EMPTY
          PL        X0,LOFSTORE    IF NOT CMM BLOCK 
          SX1       B3+ 
          RJU       =XCMM.FRF      RELEASE OLD BLOCK
 LOFSTORE BSS       0 
          SX6       0 
          SA6       B2+1           ZERO NEXT ENTRY
 JUSTSTO  BSS       0 
          BX7       X5
          SA7       B2+ 
 ENDLOF   BSS       0 
* END /SETLOF/
