SPL,L,O,M,C 
!     NAME:   PK..
!     SOURCE: 92064-18158 
!     RELOC:  92064-16055 
!     PGMR:   G.A.A.
!     MOD:    G.L.M.
! 
!  ***************************************************************
!  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  ALL RIGHTS     *
!  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
!  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
!  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
!  ***************************************************************
! 
! 
      NAME PK..(7) " 92064-16055  REV.1805  771018" 
! 
!  MODIFIED 750416 TO NOT MOVE EXTENTS IF THEY ALREADY RESIDE AT
!  THE DESTINATION AND ALSO TO CORRECTLY HANDLE FILES TO 32K SECTORS
!     PK..  IS THE PACKING ROUTINE FOR THE
!           RTE FMGR PROGRAM. 
! 
!     IT PACKS RTE FILES AS FOLLOWS:
! 
! 
!     1.  EACH FILE IS MOVED DOWN (IF NECESSARY). 
!         AFTER EACH FILE IS MOVED ITS DIRECTORY
!         ENTRY IS UPDATED. 
!     (THUS NO MORE THAN ONE FILE IS
!         LOST BY A CRASH.) 
! 
!     2.  AFTER ALL FILES ARE MOVED  A NEW DIRECTORY
!         IS CREATED PACKING OUT ALL THE PURGED 
!         ENTRIES AND THIS IS WRITTEN ON THE DISC DIRECTLY AFTER
!         REQUESTING A LOCK VIA D.RFP 
! 
!     THIS ROUTINE IS ENTERED BY THE COMMAND: 
! 
!     PK,CR 
! 
!         WHERE CR IS OPTIONAL AND RESTRICTS
!         THE PACK TO DISC CR.
! 
!     DECLARE EXTERNALS 
! 
      LET D.RIO,DR.RD,LOCK.,MSS.,\
                     EXEC,READF, \
          WRITF,RWNDF,MVW,LIMEM  \
                           BE SUBROUTINE,EXTERNAL 
! 
      LET IER.,JER.,CLD.R BE SUBROUTINE,EXTERNAL,DIRECT 
! 
! 
      LET D.SDR,PK.DR,DS.LU,IDCB1,IDCB2,\ 
     .E.R,.P1,.P2,.P3,.P4,.P5 BE INTEGER,EXTERNAL 
! 
!     DECLARE INTERNAL SUBROUTINES
! 
      LET       SETAD,BADTR\
                        BE SUBROUTINE 
! 
!     DECLARE ARRAYS
! 
      LET BTL(6)        BE INTEGER
! 
!     DECLARE CONSTANTS 
! 
      LET READI     BE CONSTANT(    1)
      LET WRIT      BE CONSTANT(    2)
      LET XEQT      BE CONSTANT(1717K)
      LET KEYWD     BE CONSTANT(1657K)
      LET A         BE CONSTANT(   3 )
      LET B         BE CONSTANT(   1 )
! 
! 
PK..: SUBROUTINE(N,LIS,ER) GLOBAL  !ENTRY POINT 
      PACK_$(@LIS+1)               !GET THE PACK
      LUPT_@D.SDR 
      PAKAD_@PK.DR                 !SET DIRECTORY ADD.
      CALL LIMEM(1,FWAM,WRDS)      !SEE IF ANY MEMORY AVAIL.
      WRDS_WRDS AND 77600K         !FULL SECTOR BOUNDS
PK1:  D.RIO(READI)
! 
AGAIN:DIS_[IF PACK THEN PACK,ELSE -$LUPT] 
      IFNOT DIS THEN [CALL LIMEM(-1);\ !END OF DISC DIRECTORY 
                        RETURN]        !RETURN MEMORY AND EXIT
      CALL JER.     !CHECK FOR BREAK
      LOCK.(DIS,3)?[MSS.(DIS);GO TO NXDIS]
! 
      DR.RD(READI,DIS,0)?[ER_54;RETURN] 
! 
      FILCO_0 
      SETAD 
      LU_$$@DS.LU 
! 
!     SET UP DCBS FOR PACKING 
! 
                DCB5_[NXSEC_[NXTR_[DCB2_[\
                      DCB_@IDCB1]+2]+1]+1]+1
      DCB21_[DCB20_[DCB19_[OBUF_[DCB9_[DCB8_[DCB7_[DCB6_ \
                      DCB5+1]+1]+1]+1]+7]+3]+1]+1 
      TBUF_DCB+32 
      IDCB1_0 
      MVW(@IDCB1,@IDCB1+1,31) 
      $DCB_LU 
      $DCB2_1 
      $DCB6_128     !SET RECORD SIZE
      $DCB7_100200K    !SECURITY FLAG 
      $DCB8_$PKD6 AND 377K            !SET #SECT TRK
      $DCB9_$XEQT   !AND OPEN FLAG
      FOR T_DCB TO DCB9 DO[T1_T+16;$T1_$T]
! 
!     THE DISC IS LOCKED AND WE MAY START 
!     PACKING - WE MUST HAVE A BUFFER 
!     AND ITS SIZE.  IF LIMEM GOT MORE
!     THAN 256 WORDS USE THAT MEMORY; 
!     ELSE USE IDCB1+32 (256 WDS) 
! 
! 
! 
!     WRDS AND FWAM WERE SET UP BY CALL TO LIMEM UPON ENTRY 
! 
! 
      IF WRDS>256 THEN [BUFAD_FWAM;LN_WRDS;\
               GOTO PK5]               !USE LARGER BUFFER FOR SPEED 
! 
! 
PK3:  DO[LN_256;BUFAD_TBUF] 
PK5:  SECSZ_LN-<10  !SET SECTOR COUNT.
! 
!     BUFFER AND LENGTH ARE SET NOW 
!     START TO PACK 
! 
! 
       DO[$NXTR_$PKD4; FOR\ 
                    T_@BTL TO @BTL+5 DO[\ 
                     PKD9_PKD9+1; $T_$PKD9]]
      $NXSEC,BLK_0
NXBLK:DR.RD(READI,DIS,BLK)?[GO TO CLEAN]
! 
      FILCO_0 
! 
NXFIL:SETAD?[GO TO WRBLK] 
! 
! 
      IFNOT $PKD THEN GOTO CLEAN  !END
! 
      IF $PKD<0 THEN GOTO NXFIL   !PURGED 
      IFNOT $PKD3  THEN GOTO NXFIL !TYPE0 
! 
!     IF THE FILE CONTAINS A BAD TRACK
!     PURGE IT AND CONTINUE 
! 
      BADTR($PKD4,[$DCB20_$PKD5 AND 377K],$PKD6)?[WRFL,$PKD_ -1;\ 
                    GO TO WRBLK]
! 
! 
!     COMPUTE NEW LOCATION
! 
NEWLO:BADTR($NXTR,$NXSEC,$PKD6)?[\
            $NXTR_$BT+1;$NXSEC_0;GO TO NEWLO] 
! 
!     IF NEW LOCATION SAME AS OLD THEN
!     GO TO NEXT FILE 
! 
      IF $NXTR=$PKD4 THEN [IF $NXSEC=$DCB20 THEN\ 
                     GO TO PK11]
! 
!     FAKE OPEN THE FILES 
! 
      WRFL,CO,$DCB5,$DCB21_$PKD6    !# OF SECTORS 
      $DCB19_$PKD4  !START TRACK
      RWNDF(IDCB1,.E.R ) !SET REST OF DCB 
      IER.
      RWNDF($OBUF,.E.R ) !FOR IN AND OUT
      IER.
PK10: XFER_[IF CO>SECSZ THEN LN,ELSE CO-<6] 
      READF($OBUF,.E.R ,$BUFAD,XFER)
      IER.
      WRITF(IDCB1,.E.R ,$BUFAD,XFER)
      IER.
      IF [CO_CO-(XFER-<10)] THEN GOTO PK10
      DO[$PKD4_$NXTR;$PKD5_$NXSEC+($PKD5 AND 177400K)]
PK11: DO[$NXTR_NTR;$NXSEC_NSEC]!UPDATE FOR NEXT FILE
! 
! PONTERS ARE UPDATED 
! 
!     FILE IS MOVED - UPDATE DIRECTORY
!     THEN GO DO NEXT FILE. 
! 
WRBLK:IF WRFL THEN[DR.RD(WRIT,DIS,BLK);WRFL_0]
      IF FILCO=128 THEN[BLK_BLK+1;GOTO NXBLK],ELSE\ 
           GO TO NXFIL
! 
! 
! 
      ASSEMBLE " SKP" 
! 
! 
! 
! 
! 
CLEAN:   TCNT,FCNT,FBLK,TBLK_0           !INITIALIZE POINTERS 
      FBF_@PK.DR                       !SET ADDRESS OF DIR BUFFER 
      TBF_@IDCB1                       !SET ADDRESS OF OUT BUF
! 
TOP:  DR.RD(READI,DIS,FBLK)?[GO TO EED]!READ DIRECTORY BLOCK
                                       !GO TO END IF LAST+1 
! 
      IF FBLK THEN GO TO PCK           !IF NOT FIRST--CONTINUE
! 
! 
      FILCO_0                          !CLEAR FILE COUNT FOR SETAD
      SETAD                            !THIS IS THE DIR ID
      $PKD9_$NXTR                      !SET NEXT TRACK
      $PKD5_$NXSEC                     !SET NEXT SECTOR 
      GO TO MOK                        !MOVE THIS ENTRY 
! 
! 
! 
! 
PCK:  IFNOT [T_$(FBF+FCNT)]THEN\       !GET OUT IF
                        GO TO EED,\    !END OF DIRECTORY
          ELSE[IF T<0 THEN GO TO NEX ] !IF PURGED-TRY NEXT ONE
! 
MOK:  MVW(FBF+FCNT,TBF+TCNT,16)        !MOVE DIR ENTRY TO SAVE BUF
! 
      IF [TCNT_TCNT+16]=128 THEN\      !BUMP OUT COUNT-IF FULL
            [TCNT_0;\                  !RESET OUT COUNT 
             DR.RD(-2,DIS,TBLK);\      !WRITE THE BLOCK 
             TBLK_TBLK+1]              !BUMP THE BLOCK CONUT
! 
  
NEX : IF [FCNT_FCNT+16]=128 THEN\        !BUMP IN COUNT-IF EMPTY
        [FCNT_0;FBLK_FBLK+1;GO TO TOP],\ !RESET IN COUNT
                       ELSE GOTO PCK
                                       !BUMP BLOCK COUNT
                                       !GO READ NEXT BLOCK
! 
EED:  $(TBF+TCNT)_0                    !CLEAR "CURRENT" FW OF BUF 
      T_(128-TCNT)-1                   !CALCULATE # WORDS TO MOVE 
                                       !TO CLEAR REST OF BUFFER 
! 
      MVW(TBF+TCNT,TBF+TCNT+1,T)       !CLEAR REST OF BUFFER
! 
! 
WIPE: CALL DR.RD(-2,DIS,TBLK)          !WRITE IT OUT
      TBLK_TBLK+1                      !BUMP BLOCK COUNT
! 
! 
   IFNOT FBLK < TBLK THEN [IFNOT TCNT\ !CLEAR REST OF DIRECTORY 
                     THEN GO TO WIPE,\ !CONT AT WIPE IF 
                        ELSE[\         !ELSE CLEAR FULL BUFFER
                        TCNT_0;GO TO EED]]
! 
! 
! 
! 
! 
! 
! 
! 
PK26: LOCK.(DIS,5)         !UNLOCK DISC 
NXDIS: IDCB2_0                         !CLEAR FW SO CLOSE WON'T 
                                       !GET SCREWED UP
       IFNOT PACK THEN [LUPT_LUPT+4;GOTO AGAIN] 
      CALL LIMEM(-1)
      RETURN
      END 
! 
!     SETAD SETS THE ADDRESSES FOR THE NEXT FILES ENTRY 
!     IN PK.DR - IF NONE THEN AN FRETURN IS MADE. 
! 
SETAD:SUBROUTINE FEXIT
! 
      IF FILCO=128 THEN FRETURN 
      PKD9_[PKD8_[PKD6_[PKD5_[PKD4_[PKD3_[PKD_\ 
                          PAKAD+FILCO]+3]+1]+1]+1]\ 
                            +2]+1 
      FILCO_FILCO+16
      RETURN
      END 
! 
!     BADTR RETURNS FALSE IF THE CURRENT FILE 
!     AREA CONTAINS A BAD TRACK.
! 
BADTR:SUBROUTINE(TRAK,SECT,NOSEC)FEXIT
      NTR_((SECT+NOSEC)->1)/($DCB8->1)+TRAK  !COMPUTE (ROTATE TO AVOID
      NSEC_$B+$B    !NEXT TRACK & SECTOR (32K SECTORS SIGN PROB.) 
!     CHECK EACH TRACK AGAINST THE BAD LIST.
      FOR T_TRAK TO[IF NSEC THEN 0,ELSE -1]\
                              + NTR DO[\
           FOR BT_@BTL TO @BTL+5 DO[  \ 
         IF $BT THEN[IF  T=$BT THEN FRETURN]]]
      RETURN
      END 
      END 
      END$
! 
                                                                                                                                                                                      