GENPFD
          IDENT  GENPFD,ORIG
          ABS 
          SST 
          ENTRY  GENPFD 
          ENTRY  RFL= 
          SYSCOM B1 
          TITLE  GENPFD - PERMANENT FILE ARCHIVE SELECTION UTILITY. 
*COMMENT  GENPFD - PERMANENT FILE ARCHIVE SELECTION UTILITY.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 GENPFD   SPACE  4,10 
***       GENPFD - PERMANENT FILE ARCHIVE SELECTION UTILITY.
* 
*         R. E. DUNBAR.      87/02/01.
          SPACE  4,10 
***       *GENPFD* IS A UTILITY TO GENERATE A *PFDUMP* DIRECTIVE FILE.
* 
          SPACE  4,20 
***       COMMAND FORMAT. 
* 
* 
*         GENPFD(P1,P2,...,PN)
*                OR 
*         GENPFD(P1,P2,...,PN)/DIR1,DIR2,...,DIRN.
* 
* 
*         *PN* MAY BE ONE OF THE FOLLOWING -
* 
*         PARAMETER          DESCRIPTION
*         ---------          -----------
* 
*         I=IFILE            LOCAL FILE NAME OF THE INPUT DIRECTIVE 
*                            FILE.  THE DEFAULT NAME IS *INPUT*.
* 
*         L=OFILE            LOCAL FILE NAME OF THE OUTPUT LISTING
*                            FILE.  THE DEFAULT NAME IS *OUTPUT*. 
* 
*         PO=POPT            PROCESSING OPTION. 
* 
*                            PO=R.  SELECT FILES TO BE RELEASED.
*                            PO=D.  SELECT FILES TO BE DESTAGED.
* 
*         U=UNITS            DESTAGE LIMIT/THRESHOLD UNIT OF MEASURE. 
* 
*                            U=FT.  MEASURED IN FEET OF TAPE. 
*                            U=MB.  MEASURED IN MEGABYTES.
*                            THE DEFAULT IS *U=FT*. 
* 
*         S=PFILE            LOCAL FILE NAME OF THE SUMMARY FILE. 
*                            THE DEFAULT NAME IS *SUMMARY*. 
* 
*         UD=DFILE           LOCAL FILE NAME OF THE PERMANENT FILE
*                            UTILITY DIRECTIVE FILE.  THE DEFAULT 
*                            NAME IS *UDIR*.
* 
*         Z                  INDICATES DIRECTIVES ARE TO BE TAKEN FROM
*                            COMMAND LINE.  DEFAULT IS FROM *INPUT*.
* 
*                            GENPFD(...Z...)/DIR/DIR/DIR
*                                      / IS ANY CHARACTER NOT IN *DIR*. 
          SPACE  4,20 
***       *DIRN*  MAY BE ONE OF THE FOLLOWING - 
* 
* 
*         *DIRN*             DESCRIPTION
*         ------             -----------
* 
* 
*         D,DENSITY.         THE DENSITY THAT WILL BE USED FOR THE
*                            ARCHIVE DUMP TAPE.  THE DEFAULT IS *GE*. 
*                            THE FOLLOWING DENSITIES ARE RECOGNIZED.
* 
*          7 TRACK (MT)         9 TRACK (NT)         CARTRIDGE (CT/AT)
*         D=LO   200 CPI      D=HD     800 CPI      D=CE     38000 CPI
*         D=HI   556 CPI      D=PE    1600 CPI      D=AE     38000 CPI
*         D=HY   800 CPI      D=GE    6250 CPI      D=38000  38000 CPI
*         D=200  200 CPI      D=1600  1600 CPI
*         D=556  556 CPI      D=6250  6250 CPI
* 
*         DL,LIMIT.          TOTAL LENGTH OF ARCHIVE DUMP, IN FEET OF 
*                            TAPE IF *U=FT*, OR IN MEGABYTES IF *U=MB*. 
*                            FOR TAPE, *DL* IS USED IN CONJUNCTION WITH 
*                            *D* IN CALCULATING WHETHER A FILE WILL 
*                            FIT ON THE DUMP SET.  THE DEFAULT FOR
*                            *MT* OR *NT* TAPE IS 2200 FEET, ALLOWING 
*                            A SIGNIFICANT NUMBER OF RECOVERED ERRORS 
*                            ON A 2400 FOOT REEL.  THE DEFAULT LENGTH 
*                            FOR *CT* OR *AT* TAPE IS 500 FEET; A 
*                            CARTRIDGE CONTAINS 530 FEET OF TAPE.  THE
*                            DEFAULT SIZE FOR OPTICAL DISK IS 102MB.
* 
*         DT,THRESHOLD.      MINIMUM LENGTH OF ARCHIVE DUMP, IN FEET OF 
*                            TAPE IF *U=FT*, OR IN MEGABYTES IF *U=MB*. 
*                            IF SELECTED FILES WOULD FILL LESS THAN THE 
*                            SPECIFIED MINIMUM SPACE, NO PERMANENT FILE 
*                            UTILITY DIRECTIVE FILE WILL BE WRITTEN.
*                            THE DEFAULT IS NINETY PERCENT OF THE VALUE 
*                            OF *DL*. 
* 
*         F,FORMAT.          FORMAT IN WHICH THE ARCHIVE TAPE IS TO BE
*                            RECORDED.  ACCEPTABLE VALUES ARE *I* AND 
*                            *LI*.  THE DEFAULT IS *I* FORMAT.
* 
*         PG,PR1,PR2,PR3.    PRIORITY GROUPS, BASED ON THE MNEMONIC FOR 
*                            PREFERRED RESIDENCE.  CODES D, L, M, N AND 
*                            T ARE GROUPED IN 1 TO 5 GROUPS IN ORDER OF 
*                            THEIR PRIORITY FOR ARCHIVING.
* 
*         RL,DN,TRACKS.      DEFINES THE NUMBER OF AVAILABLE TRACKS 
*         RL,DT,TRACKS.      GOAL FOR THE SPECIFIED DEVICE NUMBER OR
*                            FOR EACH DEVICE OF THE SPECIFIED DEVICE
*                            TYPE.  A *TRACKS* VALUE SPECIFIED FOR A
*                            DEVICE NUMBER TAKES PRECEDENCE OVER ONE
*                            SPECIFIED FOR A DEVICE TYPE WHEN BOTH
*                            ARE APPLICABLE.
* 
*         SF,UI,F1,F2,..FN.  SELECT FILES FOR USER INDEX *UI*, FILE 
*         SF,UI.             NAMES *F1* THROUGH *FN*.  IF *F1*...*FN* 
*                            ARE OMITTED, SELECT ALL FILES FOR USER 
*                            INDEX *UI*.
* 
*         SV,V1,V2,..VN.     SELECT FILES WHOSE CATALOG ENTRIES SHOW
*                            ALTERNATE VSN-S WHICH MATCH TO ANY OF THE
*                            *V1* THROUGH *VN* VALUES.
* 
*         XF,UI,F1,F2,..FN.  EXCLUDE FILES FOR USER INDEX *UI*, FILE
*         XF,UI.             NAMES *F1* THROUGH *FN*.  IF *F1*...*FN
*                            ARE OMITTED, EXCLUDE ALL FILES FOR USER
*                            INDEX *UI*.
          TITLE  DAYFILE MESSAGES.
          SPACE  4,20 
***       DAYFILE MESSAGES. 
* 
*         * DIRECTIVE ARGUMENT ERROR.* - *GENPFD* DETECTED AN ERROR IN
*                AN INPUT DIRECTIVE.  THIS COULD BE A BAD SEPARATOR,
*                AN INCORRECT VALUE, TOO MANY VALUES, ETC.
* 
*         * DN = NN,  FILE TRACK COUNT = XXXXXXXXX.* - FOR DEVICE NN, 
*                SPECIFIED VIA *RL* DIRECTIVE, FILES REPRESENTING THE 
*                EQUIVALENT OF X..X TRACKS WERE SELECTED. 
* 
*         * DT = TTT, FILE TRACK COUNT = XXXXXXXXX.* - FOR DEVICE TYPE
*                TTT, SPECIFIED VIA *RL* DIRECTIVE, FILES REPRESENTING
*                THE EQUIVALENT OF X..X TRACKS WERE SELECTED. 
* 
*         * DUMP THRESHOLD NOT REACHED.* - TOO FEW FILES QUALIFIED FOR
*                SELECTION. 
* 
*         * FEET OF DUMP TAPE REQUIRED = XXXXXXXXX.* - FILES SPECIFIED
*                BY THE UTILITY DIRECTIVES GENERATED BY *GENPFD* WILL 
*                FILL X..X FEET OF TAPE AT THE SELECTED DENSITY.
* 
*         * FILES SELECTED FOR PPPPPPP = XXXXXXXXX.* - *GENPFD* WROTE 
*                UTILITY DIRECTIVES FOR X..X FILES TO THE *UD* FILE.
*                P..P IS EITHER *DESTAGE* OR *RELEASE*, DEPENDING ON
*                THE *PO=* OPTION SPECIFIED ON THE *GENPFD* COMMAND.
* 
*         * FIRST SELECTION FILE COUNT = XXXXXXXXX.* - X..X FILES WERE
*                QUALIFIED BY SELECTED USER INDEX/FILE NAME, SELECTED 
*                ARCHIVE VSN, OR PREFERRED RESIDENCE AND RELEASE DEVICE 
*                RESIDENCE TO BE PRIORITIZED FOR FINAL SELECTION. 
* 
*         * GENPFD ABORTED.* - *GENPFD* HAS DETECTED AN ERROR OR
*                THE USER HAS INITIATED AN ABORT. 
* 
*         * GENPFD ARGUMENT ERROR.* - AN INCORRECT ARGUMENT WAS 
*                DETECTED ON THE *GENPFD* COMMAND.
* 
*         * GENPFD COMPLETE.* - NORMAL COMPLETION.
* 
*         * INCORRECT ARGUMENT VALUE.* - A VALUE ENTRY ON A DIRECTIVE 
*                IS NOT VALID FOR THAT DIRECTIVE.  THIS COULD BE A NAME 
*                LONGER THAN SEVEN CHARACTERS, AN ALPHABETIC STRING 
*                WHEN A NUMBER IS EXPECTED, ETC.
* 
*         * MAXIMUM TOTAL FEET OF TAPE = XXXXXXXXX.* - FILES QUALIFYING 
*                FOR FINAL SELECTION WOULD OCCUPY X..X FEET OF TAPE AT
*                THE SELECTED DENSITY IF THEY WERE ALL SELECTED.
* 
*         * MAXIMUM TOTAL MEGABYTES    = XXXXXXXXX.* - FILES QUALIFYING 
*                FOR FINAL SELECTION WOULD OCCUPY X..X MEGABYTES IF 
*                THEY WERE ALL SELECTED.
* 
*         * MEGABYTES REQUIRED FOR DUMP= XXXXXXXXX.* - FILES SPECIFIED
*                BY THE UTILITY DIRECTIVES GENERATED BY *GENPFD* WILL 
*                FILL X..X MEGABYTES. 
* 
*         * NO FILES SELECTED FOR PPPPPPP.* - EITHER NO FILES MET THE 
*                SELECTION CRITERIA OR NONE OF THE SELECTED FILES CAN 
*                BE DUMPED WITHOUT EXCEEDING THE *DL* MAXIMUM.
*                P..P IS EITHER *DESTAGE* OR *RELEASE*, DEPENDING ON
*                THE *PO=* OPTION SPECIFIED ON THE *GENPFD* COMMAND.
* 
*         * SELECTION FILE DEVICE NUMBER ERROR.* - PROGRAM ERROR - A
*                DEVICE NUMBER NOT IN THE CATALOG DEVICE TABLE
*                WAS FOUND IN A RECORD DURING FINAL SELECTION.
* 
*         * SUFFICIENT TRACKS ALREADY AVAILABLE.* - THE *TRACKS* GOAL 
*                SPECIFIED ON THE *RL* DIRECTIVE IS ALREADY AVAILABLE 
*                ON THE DESIGNATED DEVICE(S). 
* 
*         * SUMMARY FILE IS EMPTY OR MISPOSITIONED.* - END OF 
*                FILE OR END OF RECORD WAS DETECTED ON THE FIRST READ 
*                OF THE SUMMARY FILE. 
* 
*         * SUMMARY FILE PREFIX TABLE ERROR.* - NO PREFIX TABLE 
*                RECORD WAS FOUND ON THE SUMMARY FILE.
* 
*         * TOO MANY DEVICE SELECTION (RL) ENTRIES.* - THE SIZE OF THE
*                *TSDV* TABLE WAS EXCEEDED.  THERE ARE TOO MANY *RL*
*                DIRECTIVES.
* 
*         * TOO MANY FILE/VSN SELECTION (SF SV XF) ENTRIES.* - THE SIZE 
*                OF THE *TSFV* TABLE WAS EXCEEDED.  THERE ARE TOO MANY
*                *SF*, *SV*, AND/OR *XF* DIRECTIVE ENTRIES. 
* 
*         * TOO MANY PRIORITY GROUP (PG) ENTRIES.* - THE SIZE OF THE
*                *TPRG* TABLE WAS EXCEEDED.  THERE ARE TOO MANY ENTRIES 
*                ON THE *PG* DIRECTIVE. 
* 
*         * *WARNING* - FILE(S) LARGER THAN *DL* LIMIT.* - *GENPFD* 
*                ENCOUNTERED AND SKIPPED ONE OR MORE FILES LARGER THAN
*                THE LIMIT SPECIFIED ON THE *DL* DIRECTIVE. 
          TITLE  COMMON DECKS.
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMCCMD 
*CALL     COMCMAC 
*CALL     COMSPFM 
*CALL     COMSRPV 
          TITLE  ASSEMBLY CONSTANTS.
          SPACE  4,10 
****      ASSEMBLY CONSTANTS. 
  
  
*         SUMMARY FILE RECORD SIZES.
  
 SFPTL    EQU    16B         SUMMARY FILE PREFIX TABLE LENGTH 
 SFSHL    EQU    13B         SUMMARY FILE SYSTEM RECORD HEADER LENGTH 
 SFSIL    EQU    0           SUMMARY FILE SYSTEM RECORD ITEM LENGTH 
 SFDHL    EQU    2           SUMMARY FILE DEVICE RECORD HEADER LENGTH 
 SFDIL    EQU    2           SUMMARY FILE DEVICE RECORD ITEM LENGTH 
 SFFHL    EQU    0           SUMMARY FILE CATALOG ENTRY HEADER LENGTH 
 SFFIL    EQU    21B         SUMMARY FILE CATALOG ENTRY ITEM LENGTH 
  
 DLMB     EQU    102         MEGABYTES DEFAULT FOR *DL* DIRECTIVE.
 DLDF     EQU    2200        DEFAULT FOR *DL* DIRECTIVE (*MT*/*NT*) 
 DLDFC    EQU    500         DEFAULT FOR *DL* DIRECTIVE (*CT*/*AT*) 
 DTDF     EQU    90          *DT* DEFAULT PERCENT OF *DL* VALUE 
 ITEML    EQU    3           LENGTH OF PRIORITY SORT ITEM RECORD
 MFETL    EQU    6           FET SIZE FOR MERGE/SORT FILES
 PBYT     EQU    480         NUMBER OF 8-BIT BYTES PER PRU
 MPRU     EQU    2083        NUMBER OF SECTORS PER MEGABYTE 
 RPTR     EQU    MFETL       RECORD POINTER FOR MERGE/SORT FILES
 EOF      EQU    RPTR+ITEML  END OF FILE FLAG FOR MERGE/SORT FILES
 TCDVE    EQU    2           TABLE OF CATALOG DEVICES ENTRY SIZE
 TCDVN    EQU    120B        TABLE OF CATALOG DEVICES ENTRIES 
 TSDVE    EQU    2           TABLE OF SELECTED DEVICES ENTRY SIZE 
 TSDVN    EQU    120B        TABLE OF SELECTED DEVICES ENTRIES
 TSFVE    EQU    1           TABLE OF SELECTED FILES/VSN-S ENTRY SIZE 
 TSFVN    EQU    1000        TABLE OF SELECTED FILES/VSN-S ENTRIES
  
*         BUFFER SIZE DEFINITIONS.
  
 IBUFL    EQU    201B        INPUT BUFFER LENGTH
 OBUFL    EQU    201B        OUTPUT BUFFER LENGTH 
 SBUFL    EQU    1001B       SUMMARY FILE BUFFER LENGTH 
 SMBFL    EQU    1001B       SELECTION/MERGE SORT BUFFER LENGTH 
 UBUFL    EQU    201B        UTILITY DIRECTIVES BUFFER LENGTH 
 WSAL     EQU    1000B       WORKING STORAGE BUFFER LENGTH
          TITLE  MACRO DEFINITIONS. 
          SPACE  4,10 
*         MACRO DEFINITIONS USED FOR MERGESORT. 
 COPITEM  SPACE  4,15 
**        COPITEM - COPY ITEM FROM ONE FILE TO ANOTHER. 
* 
*         COPITEM  FILEX,FILEY
* 
*         ENTRY  *FILEX* = FET ADDRESS OF FILE TO READ FROM.
*                *FILEY* = FET ADDRESS OF FILE TO WRITE TO. 
* 
*         EXIT   ITEM COPIED. 
*                *ERUN* SET IF ITEM COPIED WAS END OF A RUN.
* 
*         USES   X - 2, 5.
* 
*         CALLS  CIT. 
  
  
          PURGMAC  COPITEM
  
 COPITEM  MACRO  FILEX,FILEY
          MACREF COPITEM
          R=     X2,FILEX 
          R=     X5,FILEY 
          RJ     CIT
 COPITEM  ENDM
 COPYRUN  SPACE  4,15 
**        COPYRUN - COPY RUN OF ENTRIES BETWEEN FILES.
* 
*         COPYRUN  FILEX,FILEY
* 
*         ENTRY  *FILEX* = FET ADDRESS OF FILE TO READ FROM.
*                *FILEY* = FET ADDRESS OF FILE TO WRITE TO. 
* 
*         EXIT   RUN COPIED FROM *FILEX* TO *FILEY*.
* 
*         USES   X - 2, 5.
* 
*         CALLS  CRN. 
  
  
          PURGMAC  COPYRUN
  
 COPYRUN  MACRO  FILEX,FILEY
          MACREF COPYRUN
          R=     X2,FILEX 
          R=     X5,FILEY 
          RJ     CRN
 COPYRUN  ENDM
 GETITEM  SPACE  4,15 
**        GETITEM - GET AN ITEM FROM A FILE.
* 
*         GETITEM  FET,ITEM 
* 
*         ENTRY  *FET* = FET ADDRESS OF FILE. 
*                *ITEM* = ITEM DESTINATION ADDRESS. 
* 
*         EXIT   VALUE MOVED. 
*                EOF FLAG SET IF NEXT READ FAILS. 
* 
*         USES   X - 0, 5.
* 
*         CALLS  GIT. 
  
  
          PURGMAC  GETITEM
  
 GETITEM  MACRO  FET,ITEM 
          MACREF GETITEM
          R=     X0,FET 
          R=     X5,ITEM
          RJ     GIT
 GETITEM  ENDM
 PUTITEM  SPACE  4,15 
**        PUTITEM - WRITE ITEM TO FILE. 
* 
*         PUTITEM  FET,ITEM 
* 
*         ENTRY  *FET* = FET ADDRESS OF FILE. 
*                *ITEM* = ADDRESS OF ITEM TO WRITE. 
* 
*         EXIT   ITEM WRITTEN TO FILE.
* 
*         USES   X - 2, 5.
* 
*         CALLS  PIT. 
  
  
          PURGMAC  PUTITEM
  
 PUTITEM  MACRO  FET,ITEM 
          MACREF PUTITEM
          R=     X2,FET 
          R=     X5,ITEM
          RJ     PIT
 PUTITEM  ENDM
 RESET    SPACE  4,15 
**        RESET - REWIND FILE AND PREPARE FOR READING.
* 
*         RESET  FILE 
* 
*         ENTRY  *FILE* = FET ADDRESS OF FILE TO REWIND AND READ. 
* 
*         EXIT   FILE REWOUND AND PARTIALLY READ. 
*                EOF FLAG SET IF FILE IS EMPTY. 
* 
*         USES   X - 2. 
* 
*         CALLS  RST. 
  
  
          PURGMAC  RESET
  
 RESET    MACRO  FET
          MACREF RESET
          R=     X2,FET 
          RJ     RST
 RESET    ENDM
 REWRYTE  SPACE  4,15 
**        REWRYTE - REWIND FILE AND PREPARE FOR WRITING.
* 
*         REWRYTE  FILE 
* 
*         ENTRY  *FILE* = FET ADDRESS OF FILE TO REWIND AND WRITE.
* 
*         EXIT   FILE REWOUND, EOF FLAG SET ON. 
* 
*         USES   X - 2. 
* 
*         CALLS  RWR. 
  
  
          PURGMAC  REWRYTE
  
 REWRYTE  MACRO  FILE 
          MACREF REWRYTE
          R=     X2,FILE
          RJ     RWR
 REWRYTE  ENDM
          TITLE  TABLES.
 ORIG     SPACE  4,10 
          ORG    110B 
 ORIG     EQU    *           PROGRAM ORIGIN 
 ITEM     SPACE  4,30 
**        ITEM - INTERNAL PRIORITY SORT RECORD. 
* 
*         *ITEM* IS USED BY *GENPFD* TO BUILD THE PRIORITY SORT 
*         RECORD AND TO PROCESS IT AFTER THE SORT IS COMPLETED. 
* 
*T        6/ PG, 36/ PDTM, 18/ SIZE 
*T,       42/ FILE NAME, 18/ USER INDEX 
*T,       6/ DN, 24/ TSC, 30/ LEN 
* 
*         PG     PRIORITY GROUP 0-7, 10-17. 
*                  0 OR 10B FOR FILES MATCHING *SF* OR *SV* ENTRIES.
*                  0 - 7 FOR FILES MATCHING *RL* DEVICE ENTRIES.
*                  10B-17B FOR FILES NOT MATCHING *RL* DEVICE ENTRIES.
*         PDTM   PACKED DATE AND TIME - LAST ACCESS IF *PO=R*,
*                  LAST DATA MODIFICATION IF *PO=D*.
*         SIZE   COMPLEMENT OF FILE SIZE IN SECTORS.  FILE SIZES
*                  OVER 17 BITS ARE REPRESENTED WITH BIT 17 CLEAR AND 
*                  THE COMPLEMENT OF THE HIGH 17 BITS OF THE FILE SIZE. 
*         DN     DEVICE NUMBER ON WHICH FILE RESIDES. 
*         TSC    TOTAL SECTOR COUNT ADJUSTED FOR FULL TRACKS. 
*         LEN    TAPE REQUIRED IN 32NDS OF AN INCH (INCHES*32). 
  
  
 ITEM     BSSZ   ITEML
 ITKY     EQU    ITEM        PG / PDTM / SIZE  (SORT KEY) 
 ITFN     EQU    ITEM+1      FILE NAME / USER INDEX 
 ITDN     EQU    ITEM+2      DN / TSC / LEN 
 ITSC     EQU    ITDN        ALTERNATE FOR *ITDN* 
 TDIR     SPACE  4,10 
**        TDIR - TABLE OF DIRECTIVES. 
* 
*         *TDIR* CONTAINS THE LEGAL DIRECTIVES AND THE ADDRESS
*         OF THE ROUTINE THAT PROCESSES THAT DIRECTIVE. 
* 
*T        42/ DNAME, 18/ PADDR
* 
*         DNAME  DIRECTIVE NAME.
*         PADDR  ADDRESS OF PROCESSING ROUTINE FOR *DNAME*. 
  
  
 TDIR     BSS    0
          VFD    42/0LD,18/PTD     TAPE DENSITY 
          VFD    42/0LDL,18/PDL    DESTAGE LIMIT - FEET/MEGABYTES 
          VFD    42/0LDT,18/PDT    DESTAGE THRESHOLD - FEET/MEGABYTES 
          VFD    42/0LF,18/PTF     TAPE FORMAT
          VFD    42/0LPG,18/PPG    PRIORITY GROUPS
          VFD    42/0LRL,18/PRL    RELEASE LIMIT
          VFD    42/0LSF,18/PSF    SPECIFIC FILE/USER INDEX SELECTIONS
          VFD    42/0LSV,18/PSV    SPECIFIC VSN SELECTIONS
 TDIRX    VFD    42/0LXF,18/PSF    SPECIFIC FILE/USER INDEX EXCLUSIONS
          CON    0
 TDEN     SPACE  4,15 
**        TDEN - TABLE OF TAPE DENSITIES AND GAP SIZES. 
* 
*         *TDEN* CONTAINS THE TAPE DENSITY SYMBOLS *GENPFD* RECOGNIZES, 
*         A FLAG THAT INDICATES IF THIS IS A CARTRIDGE TAPE DENSITY,
*         THE INTER-RECORD GAP SIZE FOR THAT DENSITY IN 1/32NDS OF AN 
*         INCH (INCHES*32), AND THE NUMBER OF 8-BIT BYTES CONTAINED IN
*         ONE INCH OF MAGNETIC TAPE RECORDED AT THAT DENSITY. 
* 
*T        30/ DEN, 1/ CTF, 11/ GAP, 18/ BYTES 
* 
*         DEN    THE DISPLAY CODE SYMBOL FOR THE DENSITY. 
*         CTF    NONZERO IF CARTRIDGE TAPE DENSITY. 
*         GAP    THE INTER-RECORD GAP SIZE IN INCHES*32.
*         BYTES  THE NUMBER OF 8-BIT BYTES PER INCH OF TAPE.  FOR 
*                  7-TRACK TAPE, THIS IS 3/4 OF THE RATED DENSITY.
  
  
 TDEN     BSS    0           TABLE OF TAPE DENSITIES AND GAP SIZES
          VFD    30/2LLO,1/0,11/24,18/200*3/4 
          VFD    30/2LHI,1/0,11/24,18/556*3/4 
          VFD    30/2LHY,1/0,11/24,18/800*3/4 
          VFD    30/2LHD,1/0,11/20,18/800 
          VFD    30/2LPE,1/0,11/20,18/1600
          VFD    30/2LGE,1/0,11/10,18/6250
          VFD    30/2LCE,1/1,11/3,18/37871
          VFD    30/2LAE,1/1,11/3,18/37871
          VFD    30/3L200,1/0,11/24,18/200*3/4
          VFD    30/3L556,1/0,11/24,18/556*3/4
          VFD    30/4L1600,1/0,11/20,18/1600
          VFD    30/4L6250,1/0,11/10,18/6250
          VFD    30/5L38000,1/1,11/3,18/37871 
          CON    0
 TFMT     SPACE  4,15 
**        TFMT - TABLE OF TAPE FORMATS AND BLOCK SIZES. 
* 
*         *TFMT* CONTAINS THE TAPE FORMAT SYMBOLS *GENPFD* RECOGNIZES,
*         AND THE NUMBER OF DISK PRU-S (MINUS ONE) CONTAINED IN ONE 
*         TAPE BLOCK RECORDED IN THAT FORMAT. 
* 
*T        12/ FORMAT, 36/ 0, 12/ (PBLK-1) 
* 
*         FORMAT THE DISPLAY CODE SYMBOL FOR THE FORMAT.
*         PBLK   THE NUMBER OF DISK PRU-S PER TAPE BLOCK. 
  
  
 TFMT     BSS    0           TABLE OF TAPE FORMATS AND BLOCK SIZES
          VFD    12/1LI,36/0,12/10B-1 
          VFD    12/2LLI,36/0,12/100B-1 
          CON    0
 TPRG     SPACE  4,15 
**        TPRG - TABLE OF PREFERRED RESIDENCE GROUPS. 
* 
*         *TPRG* CONTAINS THE PREFERRED RESIDENCE PRIORITY GROUPINGS
*         AS DETERMINED BY THE *PG* DIRECTIVES OR BY DEFAULT.  EACH 
*         WORD IN THE TABLE REPRESENTS ONE PRIORITY GROUP, EARLIER
*         ENTRIES BEING HIGHER PRIORITY.
* 
*T TPRGP  60/ N 
* 
*T,TPRG   6/PR, 6/PR, 6/PR, 6/PR, 6/PR, 6/PR, 6/PR, 6/PR, 6/PR, 6/PR
*T,TPRG+N 60/ 0 
* 
*         N      NUMBER OF PRIORITY GROUPS. 
*         PR     PREFERRED RESIDENCE CODES IN THIS PRIORITY GROUP.
  
  
 TPRGP    CON    3           NUMBER OF PRIORITY GROUPS (DEFAULT = 3)
 TPRG     DATA   0LT         PREFERRED RESIDENCE *T*
          DATA   0LMN        PREFERRED RESIDENCES *M* AND *N* 
          DATA   0LD         PREFERRED RESIDENCE *D*
          BSSZ   2
 TPRGL    EQU    *-TPRG      MAXIMUM NUMBER OF ENTRIES
 TCDV     SPACE  4,10 
**        TCDV - TABLE OF CATALOG DEVICES.
* 
*         *TCDV* IS USED TO STORE THE INFORMATION FROM THE *DEVSTAT*
*         RECORDS OF THE SUMMARY FILE.
* 
*T TCDVP  60/ N 
* 
*T TCDV   12/ DT, 12/ TKSZ, 12/ TKAV, 12/ TKS, 3/ 0, 3/ U, 6/ DN
*T,TCDV+1 6/ 0, 24/ TASC, 14/ 0, 8/ SM, 8/ DM 
* 
*         N      NUMBER OF WORDS USED IN *TCDV* TABLE.
*         DT     DEVICE TYPE MNEMONIC.
*         TKSZ   TRACK SIZE OF THIS DEVICE IN SECTORS.
*         TKAV   NUMBER OF TRACKS LEFT AVAILABLE. 
*         TKS    TOTAL NUMBER OF TRACKS ON DEVICE.
*         U      NUMBER OF UNITS(SPINDLES) - 1. 
*         DN     DEVICE NUMBER. 
*         TASC   TOTAL AVAILABLE SECTOR COUNT.
*         NCT    NUMBER OF CATALOG TRACKS ON DEVICE.
*         SM     SECONDARY DEVICE MASK. 
*         DM     DEVICE MASK. 
  
 TCDVP    CON    0           NUMBER OF WORDS IN TABLE 
 TCDV     BSSZ   TCDVN*TCDVE+TCDVE
          CON    -0 
 TSDV     SPACE  4,10 
**        TSDV - TABLE OF SELECTED DEVICE TYPES AND NUMBERS.
* 
*         *TSDV* CONTAINS ENTRIES FOR DEVICE TYPES OR NUMBERS 
*         SELECTED BY MEANS OF *RL* DIRECTIVES. 
* 
*T        12/ DT, 12/ TKSZ, 24/ GOAL, 3/ 0, 3/ U, 6/ DN 
*T,       30/ 0, 30/ SFSC 
* 
*         DT     DEVICE TYPE MNEMONIC, IF SUPPLIED ON *RL* DIRECTIVE. 
*         TKSZ   TRACK SIZE FOR DEVICE/ DEVICE TYPE.
*         GOAL   SECTORS NEEDED TO MEET RELEASE GOAL. 
*         U      NUMBER OF UNITS(SPINDLES) - 1, IF SUPPLIED ON *RL*.
*         DN     DEVICE NUMBER, IF SUPPLIED ON *RL* DIRECTIVE.
*         SFSC   SELECTED FILE SECTOR COUNT.
* 
*         EITHER *DT* AND *U* APPEAR OR *DN* APPEARS, DEPENDING ON THE
*         FORMAT OF THE *RL* DIRECTIVE WHICH PROVIDED THE INFORMATION.
  
  
 TSDV     BSSZ   TSDVN*TSDVE+TSDVE
          CON    -0 
 TSFV     SPACE  4,10 
**        TSFV - TABLE OF SPECIFIC FILE AND VSN SELECTIONS. 
* 
*         *TSFV* CONTAINS SELECTED VSN ENTRIES SUPPLIED VIA *SV*
*         DIRECTIVES,  SELECTED FILE/USER INDEX ENTRIES SUPPLIED
*         VIA *SF* DIRECTIVES, AND EXCLUDED FILE/USER INDEX ENTRIES 
*         SUPPLIED VIA *XF* DIRECTIVES. 
* 
*T TSFVP  60/ N 
* 
*T TSFV   12/ VSNL2, 12/ VSNR4, 36/0
*   OR
*T TSFV   42/ FN, 18/ UI
* 
*         N      NUMBER OF WORDS IN THE *TSFV* TABLE. 
*         VSNL2  THE LEFTMOST TWO CHARACTERS OF THE PRIMARY VSN.
*         VSNR4  12-BIT VALUE REPRESENTING THE RIGHTMOST 4 DIGITS 
*                  OF THE PRIMARY VSN OF A DUMP FILE SET. 
*         FN     THE FILE NAME OF A FILE TO BE SELECTED OR EXCLUDED.
*                  *FN* IS ALWAYS ACCOMPANIED BY *UI*.
*         UI     USER INDEX TO BE SELECTED OR EXCLUDED.  A NEGATIVE 
*                  *UI* INDICATES AN EXCLUSION.  IF *FN* ACCOMPANIES
*                  *UI*, ONLY THAT FILE IS TO BE SELECTED OR EXCLUDED.
*                  *UI* APPEARS ALONE, ALL FILES FOR *UI* ARE TO BE 
*                  SELECTED OR EXCLUDED.
  
  
 TSFVP    CON    0           NUMBER OF WORDS IN THE TABLE 
 TSFV     BSS    TSFVN*TSFVE+TSFVE
          TITLE  GLOBAL CONSTANTS AND VARIABLES 
          SPACE  4,10 
*         GLOBAL CONSTANTS AND VARIABLES. 
  
 ADOT     DATA   1L.         TERMINATING PERIOD FOR VARIOUS MESSAGES
 BLNK     CON    10H
 CSET     CON    0           CHARACTER SET CHANGED FLAG 
 CTSF     CON    0           CARTRIDGE TAPE FLAG
 DENS     CON    6250        DENSITY OF TAPE TO BE USED FOR DUMP
 DIRV     BSS    1           CURRENT DIRECTIVE
 CFBT     CON    0           FILES LARGER THAN THRESHOLD
 DLFV     CON    0           DESTAGE LIMIT - FEET/MEGABYTES 
 DTFV     CON    0           DESTAGE THRESHOLD - FEET/MEGABYTES 
 ERUN     CON    0           END OF RUN INDICATOR FOR SORTING 
 FCNT     CON    0           NUMBER OF FILES SELECTED 
 GAPS     CON    10          INTER-RECORD GAP SIZE IN INCHES*32 
 IDTP     CON    1           INPUT DEVICE TYPE
 INCH     CON    0           INCHES*32 OR BYTES*MILLION FOR SELECTIONS
 JORG     BSS    1           JOB ORIGIN 
 LDFH     CON    10H  GENPFD-   DAYFILE HEADER FOR DIRECTIVE LINE 
 LINE     BSSZ   9           DIRECTIVE INPUT, MESSAGE OUTPUT BUFFER 
  
 LOFL     CON    3           LIST OF FILES LENGTH 
          CON    0LOUTPUT+O  LIST OF FILES ENTRY FOR *OUTPUT* 
          CON    0           LIST OF FILES TERMINATOR 
 LOFP     VFD    30/LOFL,30/1  LIST OF FILES POINTER WORD 
  
 NRUN     CON    0           NUMBER OF RUNS INDICATOR FOR SORTING 
 ODTP     CON    1           OUTPUT DEVICE TYPE 
 PBLK     CON    10B-1       DISK PRU-S PER TAPE BLOCK (MINUS 1)
 PNFM     CON    0           UTILITY *PN=* OR *FM=* DIRECTIVE 
 POPT     DATA   0LR         PROCESSING OPTION - DEFAULT IS *R* 
 UNITS    DATA   2LFT        DEFAULT DESTAGE UNITS = FEET 
 PRCD     DATA   6L.LDMNT    PREFERRED RESIDENCE CODES IN SEQUENCE
 ZINF     CON    0           *Z* PARAMETER FLAG 
          TITLE  ERROR MESSAGES.
*         ERROR MESSAGES. 
          SPACE  4,10 
 ERDA     DATA   C* DIRECTIVE ARGUMENT ERROR.*
 ERDT     DATA   C* DEVICE TYPE/NUMBER NOT FOUND.*
 ERIA     DATA   C* INCORRECT ARGUMENT VALUE.*
 ERSF     DATA   C* SELECTION FILE DEVICE NUMBER ERROR.*
 ERST     DATA   C* SUFFICIENT TRACKS ALREADY AVAILABLE.* 
 ERSE     DATA   C* SUMMARY FILE IS EMPTY OR MISPOSITIONED.*
 ERSP     DATA   C* SUMMARY FILE PREFIX TABLE ERROR.* 
          TITLE  MAIN LOOP. 
 GENPFD   SPACE  4,15 
**        MAIN LOOP.
* 
*         *GENPFD* READS DIRECTIVES FROM THE INPUT FILE AND CREATES 
*         A SELECTION FILE OF *PFDUMP* UTILITY DIRECTIVES THAT SATISY 
*         THE SPECIFIED CONDITIONS. 
* 
*         CALLS  BDT, BSF, BUD, CTL, POP, PRS, RCS, SRT, USB. 
* 
*         MACROS MESSAGE, READ, READC, WRITEC, WRITEW.
  
  
 GENPFD   BSS    0           ENTRY
          RJ     PRS         PRESET 
          RJ     BDT         BUILD DEVICE TABLE 
  
*         GET NEXT DIRECTIVE. 
  
 GEN1     SA1    ZINF 
          SA2    INPUT
          NZ     X1,GEN2     IF *Z* OPTION SELECTED 
          ZR     X2,GEN6     IF NO INPUT FILE (I=0) 
          SA1    IDTP 
          SA2    ODTP 
          NZ     X1,GEN2     IF NOT TERMINAL INPUT
          NZ     X2,GEN2     IF NOT TERMINAL OUTPUT 
          WRITEC O,GENA      * ENTER DIRECTIVE.*
          READ   I,R
 GEN2     READC  I,LINE,8 
          NZ     X1,GEN6     IF EOR FOUND 
          SA1    ODTP 
          ZR     X1,GEN3     IF A TERMINAL OUTPUT FILE
          WRITEW O,BLNK,1    ISSUE SPACES TO MOVE LINE TO THE RIGHT 
          WRITEC O,LINE,8    COPY DIRECTIVE TO LISTING FILE 
 GEN3     MESSAGE  LDFH,3,R  PLACE DIRECTIVE IN DAYFILE 
  
*         PROCESS INPUT LINE. 
  
          SB2    LINE        UNPACK LINE
          RJ     USB
          SX6    X6+B1       APPEND TERMINATOR TO INPUT LINE
          SA6    A6 
          SX6    1R.
          SA6    B7+B1
          RJ     POP         PICK OUT DIRECTIVE VERB
          ZR     B6,GEN11    IF NO ARGUMENTS
          NG     B6,GEN11    IF NO TERMINATOR FOUND 
          NG     B5,GEN11    IF ARGUMENT ERROR
  
*         SEARCH TABLE FOR DIRECTIVE. 
  
          MX0    42 
          SA4    TDIR        START OF DIRECTIVE TABLE 
 GEN4     BX1    X0*X4
          ZR     X1,GEN11    IF UNIDENTIFIABLE DIRECTIVE
          BX1    X1-X6
          ZR     X1,GEN5     IF DIRECTIVE FOUND 
          SA4    A4+B1
          EQ     GEN4        CHECK NEXT DIRECTIVE 
  
 GEN5     SA6    DIRV        SAVE DIRECTIVE 
          SB3    X4+
          RJ     POP         GET THE FIRST ARGUMENT 
          NZ     B5,GEN11    IF ERROR OR ARGUMENT TOO LONG
          SA0    B6+         SAVE THE STRING BUFFER ADDRESS 
          JP     B3          ENTER DIRECTIVE PROCESSOR
  
*         DIRECTIVES COMPLETE - CREATE THE SELECTION FILE.
  
 GEN6     RJ     CTL         CONVERT *DL* AND *DT* LENGTHS
          RJ     BSF         BUILD SELECTION FILE 
          SA1    FCNT 
          ZR     X1,GEN8     IF NO FILES SELECTED 
          RJ     IIS         ISSUE INITIAL STATISTICS 
          SA1    DTFV 
          ZR     X1,GEN7     IF NO THRESHOLD SPECIFIED
          SA2    INCH 
          IX6    X1-X2
          SX5    GENC        * DUMP THRESHOLD NOT REACHED.* 
          PL     X6,GEN9     IF NOT ENOUGH FILES SELECTED 
 GEN7     RJ     SRT         SORT SELECTION FILE
          RJ     BUD         BUILD UTILITY DIRECTIVE FILE 
          SA1    FCNT 
          ZR     X1,GEN8     IF NO FILES SELECTED 
          RJ     IFS         ISSUE FINAL STATISTICS 
          EQ     GEN10       TERMINATE PROCESSING 
  
 GEN8     SA1    POPT 
          SX5    GEND        * NO FILES SELECTED FOR DESTAGE.*
          ZR     X1,GEN9     IF *PO=D*
          SX5    GENE        * NO FILES SELECTED FOR RELEASE.*
 GEN9     MESSAGE  X5,3 
          WRITEC O,X5 
 GEN10    WRITER O,R
          UNLOAD CF          UNLOAD THE SELECTION FILE
          MESSAGE  GENB,3    * GENPFD COMPLETE.*
          RJ     RCS         RESET CHARACTER SET IF CHANGED 
          ENDRUN
  
*         PROCESS DIRECTIVE ERRORS. 
  
 GEN11    SX5    ERDA        * DIRECTIVE ARGUMENT ERROR * 
          EQ     GEN13       ISSUE ERROR MESSAGE
  
 GEN12    SX5    ERIA        * INCORRECT ARGUMENT VALUE * 
          EQ     GEN13       ISSUE ERROR MESSAGE
  
*         DIRECTIVE ERROR MESSAGE ABORT/CONTINUE ENTRY. 
*         (X5) = ADDRESS OF ERROR MESSAGE TO BE DISPLAYED.
  
 GEN13    SA1    IDTP        CHECK FOR TERMINAL INPUT 
          NZ     X1,ABT      IF NOT A TERMINAL THEN ABORT 
          MESSAGE  X5,3 
          WRITEC O,X5 
          EQ     GEN1        PROMPT FOR NEXT DIRECTIVE
  
  
 GENA     DATA   C* ENTER DIRECTIVE.* 
 GENB     DATA   C* GENPFD COMPLETE.* 
 GENC     DATA   C* DUMP THRESHOLD NOT REACHED.*
 GEND     DATA   C* NO FILES SELECTED FOR DESTAGE.* 
 GENE     DATA   C* NO FILES SELECTED FOR RELEASE.* 
          TITLE  PRIMARY SUBROUTINES. 
 ABT      SPACE  4,10 
**        ABT - ABORT PROCESSING. 
* 
*         ENTRY  (X5) = ADDRESS OF ERROR MESSAGE. 
* 
*         EXIT   ALL FILES RETURNED.
*                ERROR MESSAGES ISSUED. 
*                *GENPFD* ABORTED.
* 
*         MACROS ABORT, MESSAGE, UNLOAD, WRITEC, WRITER.
  
  
 ABT      BSS    0           ENTRY
          MESSAGE  X5,3      ISSUE ERROR MESSAGE
          WRITEC O,X5 
          UNLOAD  CF         UNLOAD FILES 
          UNLOAD  BF
          UNLOAD  AF
          WRITER OUTPUT,R 
          RJ     RCS         RESET CHARACTER SET IF CHANGED 
          MESSAGE  ABTA,3,R  * GENPFD ABORTED.* 
          SYSTEM ABT,R       ABORT
  
  
 ABTA     DATA   C* GENPFD ABORTED.*
 BDT      SPACE  4,20 
**        BDT - BUILD DEVICE TABLE. 
* 
*         READ SUMMARY FILE DEVICE RECORDS, STORE FAMILY OR PACK
*         NAME AND BUILD CATALOG DEVICE TABLE.
* 
*         EXIT   *FM=* OR *PN=* INFORMATION STORED. 
*                CATALOG DEVICE TABLE COMPLETED.
*                SUMMARY FILE POSITIONED AFTER *DEVSTAT* RECORDS. 
* 
*         USES   X - 1, 2, 6. 
*                A - 1, 2, 6. 
*                B - 3. 
* 
*         CALLS  GSR, ZTB.
  
  
 BDT      SUBR               ENTRY/EXIT 
 BDT1     SA1    BDTA        CALLING SEQUENCE ADDRESS 
          RJ     GSR         GET SUMMARY FILE *DEVSTAT* RECORD
          SA1    BDTE 
          NZ     X1,BDTX     IF END OF *DEVSTAT* RECORDS
          SA1    PNFM 
          NZ     X1,BDT3     IF PACK/FAMILY NAME ALREADY STORED 
          SA1    BDTD        CHECK DEVICE NUMBER OF FIRST RECORD
          MX6    -6 
          BX1    -X6*X1 
          SX2    3RFM=       PRESET FOR FAMILY NAME 
          NZ     X1,BDT2     IF DEVICE NUMBER NON-ZERO
          SX2    3RPN=       SET FOR PACK NAME
 BDT2     SA1    BDTC+1      GET PACK/FAMILY NAME FROM *DEVSTAT* HEADER 
          MX6    42 
          BX6    X6*X1
          BX1    X2+X6       ADD UTILITY DIRECTIVE ID *FM=* OR *PN=*
          LX1    42 
          RJ     ZTB         BLANK FILL 
          SA6    PNFM 
 BDT3     SA1    BDTD        TRACK SIZE AND COUNTS
          MX2    12 
          LX1    12 
          BX6    X2*X1       EXTRACT TRACK SIZE 
          BX2    X1-X6       EXTRACT TRACKS AVAILABLE 
          LX6    12 
          AX2    36 
          IX1    X2*X6       NUMBER OF SECTORS INITIALLY AVAILABLE
          SA2    A1+B1       RUNNING TOTAL OF AVAILABLE SECTORS 
          MX6    -24
          LX1    30 
          BX2    -X6*X2 
          BX6    X1+X2       SET RUNNING TOTAL TO INITIAL AVAILABILITY
          SA1    TCDVP       ADVANCE CATALOG DEVICE TABLE POINTER 
          SA6    A2 
          SX6    X1+TCDVE 
          SA6    A1 
          SX2    X1+TCDV     POINT TO NEXT AVAILABLE ENTRY
          SB3    TCDVE-1     SET COUNTER FOR MOVE 
 BDT4     SA1    BDTD+B3     MOVE RECORD TO CATALOG DEVICE TABLE
          BX6    X1 
          SA6    X2+B3
          SB3    B3-B1
          PL     B3,BDT4     IF MORE WORDS TO MOVE
          BX6    X6-X6       CLEAR THE FOLLOWING WORD IN THE TABLE
          SA6    A6+SFDIL 
          EQ     BDT1        GET NEXT ITEM
  
  
 BDTA     CON    BDTB        POINTER TO RECORD ID WORD
          CON    SUMMARY     POINTER TO FET 
          CON    BDTC        POINTER TO BUFFER
          CON    BDTE        POINTER TO STATUS WORD 
 BDTB     DATA   0LDEVSTAT
 BDTC     BSS    SFDHL+1     *DEVSTAT* HEADER BUFFER
 BDTD     BSS    SFDIL       *DEVSTAT* ITEM BUFFER
 BDTE     BSS    1           STATUS WORD
 BSF      SPACE  4,20 
**        BSF - BUILD SELECTION FILE. 
* 
*         *BSF* CREATES THE INITIAL SELECTION FILE BY MATCHING THE
*         CATALOG ENTRIES TO THE SPECIFIED PARAMETERS.  SPECIFICALLY
*         SELECTED FILES, THOSE RESIDING ON SPECIFICALLY DESIGNATED 
*         ARCHIVE VOLUMES, THOSE RESIDING ON SELECTED DEVICE NUMBERS
*         AND THOSE RESIDING ON SELECTED DEVICE TYPES ARE WRITTEN TO
*         THE SELECTED CANDIDATES FILE, WITH SORT KEYS SET FOR SORTING
*         BY PRIORITY GROUP, THEN BY AGE WITHIN THE ABOVE GROUPINGS.
* 
*         ENTRY  SUMMARY FILE POSITIONED AFTER *DEVSTAT* RECORDS. 
* 
*         EXIT   SELECTED FILE SORT RECORDS WRITTEN TO SELECTION FILE.
* 
*         USES   X - ALL. 
*                A - 1, 2, 3, 4, 5, 6, 7. 
*                B - 2, 3.
* 
*         CALLS  GSR. 
* 
*         MACROS MESSAGE, REWIND, WRITE, WRITEC, WRITER, WRITEW.
  
  
 BSF24    WRITER CF,R        TERMINATE SELECTION FILE 
          REWIND CF,R 
  
 BSF      SUBR               ENTRY/EXIT 
          UNLOAD CF,R 
          WRITE  CF,*        PRESET WRITE FOR SELECTION FILE
          SA1    TPRGP       SET PRIORITY GROUP TABLE TERMINATOR
          BX6    X6-X6
          SB2    X1 
          SA6    TPRG+B2
 BSF1     SA1    BSFA 
          RJ     GSR         GET SUMMARY FILE RECORD
          SA1    BSFE 
          NZ     X1,BSF24    IF END OF CATALOG ENTRIES
          SA1    BSFD+FCFN   FILE NAME / USER INDEX 
          MX0    -3 
          BX6    X1 
          SA6    ITFN 
          BX0    -X0*X1      LOWER OCTAL DIGIT OF USER INDEX
          SB3    X0+B1
  
*         CHECK IF FILE MATCHES A SPECIFIC FILENAME/UI/VSN SELECTION. 
*         (B3) = DEVICE MASK SHIFT COUNT. 
  
          SA2    TSFVP
          SA3    BSFD+FCTV   VSN FROM SUMMARY FILE
          SB2    X2-1 
          LX3    59-23
          MX0    42 
 BSF2     NG     B2,BSF7     IF NO MATCH OF SPECIFIC FILE/UI OR VSN 
          SA2    TSFV+B2
          SB2    B2-B1
          SX4    X2 
          NZ     X4,BSF3     IF NOT A VSN SPECIFICATION 
          MX6    24 
          BX2    X2-X3
          BX6    X6*X2
          EQ     BSF6        COMPLETE MATCH 
  
 BSF3     PL     X4,BSF4     IF NOT AN EXCLUSION
          BX2    -X0-X2      INVERT USER INDEX FOR EXCLUSIONS 
 BSF4     BX6    X0*X2
          ZR     X6,BSF5     IF FILE NAME NOT SUPPLIED
          MX6    42 
 BSF5     BX6    X0-X6
          BX6    -X6*X1 
          BX6    X2-X6
 BSF6     NZ     X6,BSF2     IF NOT THE SAME FILE / USER INDEX / VSN
          NG     X4,BSF1     IF MATCH WAS TO AN EXCLUSION 
          SA6    BSFD+FCFN   MARK FILE SELECTED 
          EQ     BSF10       FIND DEVICE NUMBER 
  
*         FILE DID NOT MATCH SPECIFIC FILE OR VSN SELECTIONS. 
*         CHECK FOR A MATCH TO A PREFERRED RESIDENCE PRIORITY GROUP.
*         (B3) = DEVICE MASK SHIFT COUNT. 
  
 BSF7     SA1    BSFD+FCRS   PREFERRED RESIDENCE FOR FILE 
          MX0    3
          BX0    X0*X1
          SA1    PRCD        PREFERRED RESIDENCE MNEMONICS
          LX0    4           COMPUTE SHIFT COUNT
          SB2    X0 
          LX0    1
          SB2    X0+B2
          LX1    B2          POSITION PREFERRED RESIDENCE MNEMONIC
          SB2    B0 
          MX0    6
          BX1    X0*X1       PREFERRED RESIDENCE MNEMONIC 
 BSF8     SA2    TPRG+B2
          ZR     X2,BSF1     IF NO MORE GROUPS TO CHECK 
          SB2    B2+1 
 BSF9     BX6    X0*X2
          LX2    6
          ZR     X6,BSF8     IF NO MATCH IN THIS GROUP
          BX6    X1-X6
          NZ     X6,BSF9     IF NOT THIS PREFERRED RESIDENCE
          SX6    B2          PRIORITY GROUP = TABLE ORDINAL + 1 
          LX6    59-5 
  
*         FILE MATCHED SPECIFIC SELECTION OR PREFERRED RESIDENCE GROUP. 
*         FIND THE DEVICE NUMBER IN THE CATALOG DEVICE TABLE. 
*         (X6) = PRIORITY GROUP, BITS 59-54.
*         (B3) = DEVICE MASK SHIFT COUNT. 
  
 BSF10    SA1    BSFD+FCEO   DEVICE NUMBER / ACCESS DATE
          SA3    POPT 
          BX2    X1          SET UP TO USE ACCESS DATE
          NZ     X3,BSF11    IF DESTAGE WAS NOT SPECIFIED 
          SA2    BSFD+FCMD   DATA MODIFICATION DATE 
 BSF11    MX0    -36         DATE FOR SORT KEY
          BX0    -X0*X2 
          LX0    18 
          BX6    X0+X6       PRIORITY GROUP / DATE
          MX0    -6 
          LX1    5-41 
          BX1    -X0*X1      DEVICE NUMBER
          NZ     X1,BSF12    IF DEVICE NUMBER IS KNOWN
          MX0    1
          LX0    B3          SET UP FOR DEVICE MASK SEARCH
 BSF12    SA2    TCDVP       LENGTH OF CATALOG DEVICE TABLE 
          SB3    X2 
 BSF13    ZR     B3,BSF1     IF DEVICE NOT FOUND IGNORE THIS FILE 
          SB3    B3-TCDVE    LOOK AT NEXT ENTRY 
          ZR     X1,BSF14    IF LOOKING FOR MASTER DEVICE 
          SA2    TCDV+B3
          BX3    -X0*X2 
          BX3    X1-X3
          NZ     X3,BSF13    IF NOT THE RIGHT DEVICE
          EQ     BSF15       GET FILE LENGTH
  
 BSF14    SA3    TCDV+1+B3
          BX3    X0*X3
          ZR     X3,BSF13    IF NOT THE MASTER DEVICE 
          SA2    TCDV+B3     GET DEVICE NUMBER OF MASTER DEVICE 
          MX0    -6 
          BX1    -X0*X2 
  
*         CATALOG DEVICE ENTRY HAS BEEN FOUND.  ADD FILE SIZE TO KEY. 
*         (X1) = DEVICE NUMBER. 
*         (X2) = FIRST WORD OF CATALOG DEVICE ENTRY.
*         (X6) = PRIORITY GROUP / DATE. 
*         (B3) = OFFSET INTO CATALOG DEVICE ENTRY TABLE.
  
 BSF15    SA3    BSFD+FCLF   FILE SIZE
          MX0    24 
          BX3    X0*X3
          LX3    24 
          MX0    -17
          BX0    X0*X3
          ZR     X0,BSF16    IF FILE SIZE IS LESS THAN 2**17
  
*         FILE SIZE EXCEEDS 2**17 SECTORS, SO USE HIGH 17 BITS FOR KEY. 
*         BIT 2**17 IS SET, FORCING THESE SIZE KEYS TO BE HIGHER. 
  
          AX3    7
          MX0    1           SET HIGH ORDER BIT 
          LX0    18 
          BX3    X0+X3
 BSF16    MX0    18          INVERT FILE SIZE FOR SORT KEY
          LX0    18 
          IX3    X0-X3
          BX6    X3+X6       PRIORITY GROUP / DATE / SIZE KEY 
          SA6    ITKY 
          LX1    -6 
          BX6    X1          DEVICE NUMBER
          SA6    ITDN 
          SA3    BSFD+FCLF   FILE SIZE
          MX1    24 
          BX3    X1*X3
          LX3    24 
          SX1    B1 
          IX3    X3+X1       INCREMENT FOR SYSTEM SECTOR
  
*         CHECK IF FILE RESIDENCE DEVICE IS A SELECTED RELEASE DEVICE.
*         (X2) = FIRST WORD OF CATALOG DEVICE ENTRY.
*         (X3) = FILE SIZE IN SECTORS, ADJUSTED FOR SYSTEM SECTOR.
*         (B3) = OFFSET INTO CATALOG DEVICE ENTRY TABLE.
  
          MX0    -6          DEVICE NUMBER MASK 
          SA4    TSDV        FIRST SELECTED DEVICE TABLE ENTRY
          ZR     X4,BSF18    IF NO SELECTED DEVICE ENTRIES
 BSF17    BX4    X2-X4
          BX6    -X0*X4 
          ZR     X6,BSF20    IF MATCH ON DEVICE ENTRY 
          SA4    A4+TSDVE    NEXT TABLE ENTRY 
          NZ     X4,BSF17    IF NOT FINISHED WITH THIS PASS 
          PL     X0,BSF18    IF FINISHED BOTH PASSES WITH NO MATCH
          MX1    21          FORM MASK FOR DEVICE TYPE / SPINDLES 
          LX1    9
          BX0    X0-X1
          SA4    TSDV        FIRST ENTRY AGAIN
          EQ     BSF17       CHECK FOR MATCH ON DEVICE TYPE 
  
 BSF18    SA1    POPT 
          ZR     X1,BSF19    IF *OP=D*
          SA1    BSFD+FCFN
          NZ     X1,BSF1     IF FILE WAS NOT SELECTED 
 BSF19    SA1    ITKY        DEGRADE PRIORITY GROUP 
          SX6    10B
          LX6    54 
          BX6    X1+X6
          SA6    A1+
  
*         FILE HAS SURVIVED TESTS AND PRIORITY HAS BEEN DETERMINED. 
*         CALCULATE FILE SIZE IN TRACKS, FOR RELEASE GOAL CHECKING. 
*         (X3) = FILE SIZE IN SECTORS, ADJUSTED FOR SYSTEM SECTOR.
*         (B3) = OFFSET INTO CATALOG DEVICE ENTRY TABLE.
  
 BSF20    BX4    X3          FILE SIZE IN SECTORS 
          SX0    B1+
          IX4    X4+X0       ADD EOI SECTOR FOR TRACK CALCULATION 
          SA1    BSFD+FCRI   CHECK IF THERE ARE PERMITS 
          MX2    24 
          BX1    X1*X2
          ZR     X1,BSF21    IF NO RANDOM INDEX 
          IX3    X3+X0       ALLOW ONE SECTOR FOR PERMITS ON ARCHIVE
 BSF21    SA2    BSFD+FCBS   CHECK TYPE OF FILE 
          MX0    -12
          BX2    -X0*X2 
          SX2    X2-4000B 
          NZ     X2,BSF22    IF INDIRECT FILE 
          SA2    TCDV+B3     CATALOG DEVICE TRACK SIZE
          MX0    -12
          LX2    24 
          BX2    -X0*X2 
          BX1    X2 
          BX0    X4 
          IX6    X4/X2       DIVIDE SECTORS BY TRACK SIZE 
          IX4    X1*X6       MULTIPLY RESULT BY TRACK SIZE
          BX2    X0-X4
          ZR     X2,BSF22    IF EVEN TRACKS 
          IX4    X1+X4       INCREMENT TO EVEN TRACKS 
  
*         CALCULATE AMOUNT OF SPACE THAT THIS FILE WILL TAKE.  INTEGER
*         ARITHMETIC ERROR IS MINIMIZED BY USING 1/32 INCH INCREMENTS 
*         FOR CALCULATING SPACE OCCUPIED ON TAPE. 
*         (X3) = FILE SIZE IN SECTORS.
*         (X4) = FILE SIZE IN SECTORS FOR COMPLETE TRACKS.
  
 BSF22    SA1    UNITS       FEET OR MEGABYTES
          BX2    X3          DISK SECTORS 
          LX1    12 
          SX1    X1-2RMB
          ZR     X1,BSF23.1  IF MEASURING MEGABYTES 
          SA1    PBLK 
          SX0    X1+B1
          IX1    X1+X3
          IX2    X1/X0       NUMBER OF TAPE BLOCKS
          SA1    GAPS        INTER-RECORD GAP SIZE IN INCHES*32 
          IX6    X1*X2
          SX1    PBYT*32
          IX3    X1*X3       NUMBER OF BYTES*32 IN FILE 
          SX1    16/2*15*32  PFC BYTES*32 
          IX3    X1+X3
          SA1    DENS        NUMBER OF BYTES/INCH 
          IX2    X3/X1       NUMBER OF INCHES*32 FOR DATA 
          IX2    X2+X6       TOTAL INCHES*32 FOR THE FILE 
 BSF23.1  SA1    INCH        INCREMENT TOTAL
          IX6    X1+X2
          SA6    A1 
          SA1    ITDN        STORE DEV.NO. / SECTORS / ARCHIVE UNITS
          LX4    30          SECTORS
          BX4    X2+X4       SECTORS / ARCHIVE UNITS
          BX6    X1+X4       DEVICE NUMBER / SECTORS / ARCHIVE UNITS
          SA6    A1 
          WRITEW CF,ITEM,ITEML  WRITE OUT THE COMPLETED ENTRY 
          SA1    FCNT 
          SX6    X1+B1
          SA6    A1 
          EQ     BSF1        GET NEXT SUMMARY FILE RECORD 
  
  
 BSFA     CON    BSFB        POINTER TO RECORD ID WORD
          CON    SUMMARY     POINTER TO FET 
          CON    BSFC        POINTER TO BUFFER
          CON    BSFE        POINTER TO STATUS WORD 
 BSFB     DATA   0LCATE 
 BSFC     BSS    SFFHL+1     FILE HEADER BUFFER 
 BSFD     BSS    SFFIL       FILE ITEM BUFFER 
 BSFE     BSS    1           STATUS WORD
 BUD      SPACE  4,20 
**        BUD - BUILD UTILITY DIRECTIVES. 
* 
*         PROCESS SORT SELECTIONS AGAINST TAPE AND DEVICE LIMITS
*         AND BUILD UP THE UTILITY DIRECTIVES FILE. 
* 
*         EXIT   UTILITY DIRECTIVES WRITTEN TO FILE *UDIR*
*                IF AT LEAST ONE FILE IS SELECTED.
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6. 
*                A - 1, 2, 3, 4, 5, 6.
*                B - 3. 
* 
*         CALLS  CDD, COD.
* 
*         MACROS READ, READW, WRITE, WRITEC, WRITER.
  
  
 BUD11    SA1    FCNT 
          ZR     X1,BUDX     IF NO UTILITY DIRECTIVES WRITTEN 
          WRITER UD,R        TERMINATE UTILITY DIRECTIVE FILE 
  
 BUD      SUBR               ENTRY/EXIT 
          WRITE  UD,*        PRESET WRITE FUNCTION
          READ   CF,R 
          SX6    B0+
          SA6    INCH 
          SA6    FCNT 
 BUD1     READW  CF,ITEM,ITEML
          NZ     X1,BUD11    IF END OF SELECTION FILE 
          SA1    DLFV        LENGTH LIMIT IN INCHES*32 OR MEGABYTES 
          ZR     X1,BUD2     IF THERE IS NO LENGTH LIMIT
          SA2    ITSC 
          MX0    -30
          BX6    -X0*X2      FILE LENGTH IN INCHES*32 OR SECTORS
          SA2    INCH        TOTAL LENGTH ALREADY ACCEPTED
          IX3    X6-X1
          NG     X3,BUD1.2   IF FILE .LE. LIMIT 
          SA1    UNITS
          SA3    FCNT 
          LX1    12 
          SX1    X1-2RMB
          ZR     X1,BUD1.1   IF MEGABYTES 
          ZR     X3,BUD2     IF NO FILES SELECTED YET 
 BUD1.1   SA1    CFBT        INCREMENT COUNT OF FILES .GT. LIMIT
          SX6    A1+B1
          SA6    A1 
          EQ     BUD1        CONTINUE PROCESSING
  
 BUD1.2   IX2    X2+X6
          IX1    X1-X2
          NG     X1,BUD1     IF LIMIT WOULD BE EXCEEDED 
 BUD2     SA3    TSDV 
          ZR     X3,BUD6     IF NO SELECTED DEVICES 
  
*         FIND CATALOG DEVICE ENTRY FOR MATCHING DEVICE.
*         (X3) = THE FIRST SELECTED DEVICE TABLE ENTRY. 
  
          SA2    ITDN 
          MX0    -6          DEVICE NUMBER MASK 
          LX2    6
          SA1    TCDV        GET FIRST CATALOG DEVICE 
 BUD3     BX6    X1-X2
          BX6    -X0*X6 
          ZR     X6,BUD4     IF MATCHING DEVICE ENTRY FOUND 
          SA1    A1+TCDVE 
          NZ     X1,BUD3     IF MORE DEVICES TO SEARCH
          SX5    ERSF        * SELECTION FILE DEVICE NUMBER ERROR.* 
          EQ     ABT         ABORT
  
*         THE CATALOG DEVICE ENTRY FOR THE FILE HAS BEEN LOCATED. 
*         SEARCH FOR MATCHING SELECTED DEVICE ENTRY.
*         (X0) = MASK FOR DEVICE NUMBER.
*         (X1) = THE CURRENT CATALOG DEVICE ENTRY.
*         (X3) = THE CURRENT SELECTED DEVICE TABLE ENTRY. 
  
 BUD4     BX2    X1-X3
          BX2    -X0*X2 
          ZR     X2,BUD7     IF MATCHING ENTRY FOUND
          SA3    A3+TSDVE    GET NEXT SELECTED DEVICE ENTRY 
          NZ     X3,BUD4     IF MORE ENTRIES TO CHECK 
 BUD5     PL     X0,BUD6     IF BOTH KINDS OF ENTRIES CHECKED 
          MX2    21          SET UP MASK FOR DEVICE TYPE / SPINDLES 
          LX2    9
          BX0    X0-X2       EXCLUDE DEVICE NUMBER FROM MASK
          SA3    TSDV 
          NZ     X3,BUD4     IF SELECTED DEVICE ENTRIES TO PROCESS
 BUD6     SA2    POPT 
          ZR     X2,BUD9     IF *PO=D*
          SA2    ITKY        CHECK PRIORITY FIELD OF KEY
          MX6    3
          LX2    3
          BX2    X6*X2
          ZR     X2,BUD9     IF FILE SELECTED VIA *SF* OR *SV*
          EQ     BUD1        BYPASS THIS FILE 
  
*         FILE MATCHES ONE OF THE SELECTED DEVICE ENTRIES.
*         UPDATE COUNT OF SECTORS SELECTED IN THE MATCHING ENTRY. 
*         (X0) = MASK FOR DEVICE TYPE OR DEVICE NUMBER. 
*         (X1) = THE CURRENT CATALOG DEVICE ENTRY.
*         (X3) = FIRST WORD OF SELECTED DEVICE ENTRY. 
  
 BUD7     SA4    A1+B1       GET SECTORS AVAILABLE ON DEVICE
          MX2    24          BUILD MASK FOR SECTOR COUNTS 
          LX2    -6 
          LX3    18 
          BX3    X2*X3       SECTORS GOAL FROM SELECTED DEVICE ENTRY
          BX6    X2*X4       SECTORS AVAILABLE ON DEVICE
          SA5    ITSC 
          IX3    X6-X3
          PL     X3,BUD5     IF NO MORE SECTORS NEEDED FOR THIS DEVICE
          SA3    A3+B1
          BX5    X2*X5       SECTOR COUNT FOR FILE
          LX5    30          UPDATE SECTORS SELECTED
          IX6    X3+X5
          SA6    A3 
  
*         ACCUMULATE SPACE REQUIRED FOR FILE AND SECTORS
*         AVAILABLE FOR THE DEVICE UPON WHICH IT RESIDES. 
*         (X1) = THE CURRENT CATALOG DEVICE ENTRY.
  
 BUD9     SA4    A1+B1       SECTORS AVAILABLE ON DEVICE ENTRY
          SA1    ITSC        SECTORS AND INCHES*32 FOR THIS FILE
          MX2    24          MASK FOR SECTOR COUNT
          LX2    -6 
          BX6    X2*X1       FILE LENGTH IN SECTORS 
          IX6    X4+X6       UPDATE SECTORS AVAILABLE ON DEVICE 
          SA6    A4 
          MX6    -30
          BX6    -X6*X1      FILE LENGTH IN INCHES*32 OR SECTORS
          SA1    INCH        UPDATE ACCUMULATED ARCHIVE SIZE
          IX6    X1+X6
          SA6    A1 
  
*         WRITE *FM=*/*PN=* DIRECTIVE IF NOT ALREADY WRITTEN. 
  
          SA1    PNFM 
          ZR     X1,BUD10    IF *FM=*/*PN=* ALREADY WRITTEN 
          BX6    X1 
          SA6    BUDA+1 
          WRITEC UD,BUDA+1,R WRITE THE *FM=*/*PN=* DIRECTIVE
          SX6    B0+
          SA6    PNFM 
  
*         BUILD UTILITY DIRECTIVES FOR THE SELECTED FILE. 
  
 BUD10    SA1    ITFN 
          MX0    42 
          BX5    X0*X1       SAVE FILE NAME 
          BX1    -X0*X1 
          RJ     COD         CONVERT USER INDEX TO DISPLAY
          MX0    -24
          SA2    =4R,UI=     BUILD *UI* DIRECTIVE 
          BX4    X0*X4
          BX6    X2+X4
          LX6    42 
          SA6    BUDA 
          SA2    =3RPF=      BUILD *PF* DIRECTIVE 
          BX1    X2+X5
          LX1    42 
          RJ     ZTB
          SA6    BUDA+1 
          WRITEC UD,BUDA,R   WRITE THE DIRECTIVE SET
          SA1    FCNT        INCREMENT FILES SELECTED 
          SX6    X1+B1
          SA6    A1 
          EQ     BUD1        PROCESS NEXT FILE
  
  
 BUDA     DATA   C*UI=UUUUUU,PF=FFFFFFF.* 
 CTL      SPACE  4,20 
**        CTL - CONVERT *DT* AND *DL* LENGTHS.
* 
*         CONVERT *DL* AND *DT* DIRECTIVE VALUES TO WORKING VALUES, IN
*         1/32 INCH INCREMENTS (INCHES*32) FOR *U=FT*, OR IN PRU-S FOR
*         *U=MB*.  FOR *DT*, THE DEFAULT VALUE IS A PERCENTAGE OF *DL*. 
* 
*         EXIT   PARAMETERS CONVERTED TO WORKING VALUES.
* 
*         USES   X - 1, 2, 3, 4, 6. 
*                A - 1, 2, 3, 4, 6. 
  
  
 CTL      SUBR               ENTRY/EXIT 
          SA4    UNITS       FEET OR MEGABYTES
          LX4    12 
          SX4    X4-2RMB
          SX6    12*32       CONVERSION FOR FEET TO INCHES*32 
          NZ     X4,CTL1     IF *U=FT*
          SX6    MPRU        SECTORS PER MEGABYTE CONVERSION FACTOR 
 CTL1     SA1    POPT 
          SA2    DLFV 
          SA3    DTFV 
          NZ     X2,CTL1.1   IF *DL* DIRECTIVE WAS SPECIFIED
          NG     X2,CTL2     IF *DL=0* WAS SPECIFIED
          NZ     X1,CTL2     IF NOT *OP=D*
          SX2    DLMB        DEFAULT LIMIT FOR MEGABYTES
          ZR     X4,CTL1.1   IF *U=MB*
          SA4    CTSF 
          SX2    DLDF        DEFAULT LIMIT FEET (*MT*/*NT* TAPE)
          ZR     X4,CTL1.1   IF NOT CARTRIDGE TAPE
          SX2    DLDFC       DEFAULT LIMIT FEET (*CT*/*AT* TAPE)
 CTL1.1   IX2    X2*X6
 CTL2     NZ     X3,CTL3     IF *DT* DIRECTIVE WAS SPECIFIED
          NG     X3,CTL4     IF *DT=0* WAS SPECIFIED
          NZ     X1,CTL4     IF NOT *OP=D*
          BX3    X2          CALCULATE *DT* AS A PERCENTAGE OF *DL* 
          NG     X3,CTL4     IF *DL=0* WAS SPECIFIED
          SX1    100
          IX6    X3/X1
          SX3    DTDF        DEFAULT THRESHOLD PERCENTAGE 
 CTL3     IX3    X3*X6
 CTL4     BX6    X2 
          SA6    A2          STORE CONVERTED *DL* 
          BX6    X3 
          SA6    A3          STORE CONVERTED *DT* 
          EQ     CTLX        RETURN 
 IIS      SPACE  4,15 
**        IIS - ISSUE INITIAL STATISTICS. 
* 
*         ISSUE STATISTICAL MESSAGES FOR INITIAL SELECTION. 
* 
*         EXIT   INITIAL STATISTICS ISSUED TO OUTPUT AND DAYFILE. 
* 
*         USES   X - 0, 1, 2, 3, 6. 
*                A - 1, 2, 3, 6.
*                B - 3. 
* 
*         CALLS  CDD. 
* 
*         MACROS MESSAGE, WRITEC. 
  
  
 IIS      SUBR               ENTRY/EXIT 
          SA1    FCNT 
          RJ     CDD         CONVERT FILE COUNT TO DISPLAY
          MX0    6
          BX6    -X0*X6 
          SA1    ADOT 
          BX6    X1+X6
          SB3    60 
          SB3    B3-B2
          LX6    B3 
          SA6    IISA+3 
          MESSAGE  IISA,3    * FIRST SELECTION FILE COUNT = XXXXXXXXX.* 
          WRITEC O,IISA 
          SA2    INCH 
          SA3    UNITS       FEET OR MEGABYTES
          LX3    12 
          SX3    X3-2RMB
          NZ     X3,IIS1     IF FEET
          SX6    IISC        * MAXIMUM TOTAL MEGABYTES = X..X.* 
          SA6    IISD 
          SX3    PBYT        NUMBER OF 8-BIT BYTES PER PRU
          IX2    X2*X3       MAXIMUM TOTAL BYTES
          SX3    500         ROUND TO KILOBYTES 
          IX2    X2+X3
          LX3    1
          IX1    X2/X3       KILOBYTES
          RJ     CFD         CONVERT TO F10.3 DISPLAY MEGABYTES 
          SB3    B2+60
          EQ     IIS2        CONTINUE PROCESSING MESSAGE
  
 IIS1     SX3    12*32       CONVERSION FROM INCHES*32 TO FEET
          SX6    IISB        * MAXIMUM TOTAL FEET OF TAPE = X..X.*
          IX1    X2/X3
          SA6    IISD 
          RJ     CDD         CONVERT MAXIMUM TOTAL TO DISPLAY 
 IIS2     SA1    ADOT 
          MX0    6
          BX2    X0*X6
          BX6    -X0*X6 
          BX6    X1+X6
          SB3    60 
          SB3    B3-B2
          NZ     B3,IIS3     IF NOT TEN CHARACTERS
          LX6    6
 IIS3     LX6    B3 
          SA3    IISD 
          SA6    X3+3 
          SA1    A6-B1       STORE UPPER DIGIT OF AMOUNT
          LX1    54 
          BX1    -X0*X1 
          BX6    X1+X2
          LX6    6
          SA6    A1 
          MESSAGE  X3,3      * MAXIMUM TOTAL MEGABYTES/FEET OF TAPE...* 
          WRITEC O,X3 
          EQ     IISX        RETURN 
  
  
 IISA     DATA   C* FIRST SELECTION FILE COUNT = XXXXXXXXX.*
 IISB     DATA   C* MAXIMUM TOTAL FEET OF TAPE = XXXXXXXXX.*
 IISC     DATA   C* MAXIMUM TOTAL MEGABYTES    =XXXXXX.XXX.*
 IISD     BSS    1           POINTER TO MESSAGE TO BE ISSUED
 IFS      SPACE  4,15 
**        IFS - ISSUE FINAL STATISTICS. 
* 
*         ISSUE FINAL STATISTICAL MESSAGES. 
* 
*         EXIT   FINAL STATISTICS ISSUED TO OUTPUT AND DAYFILE. 
* 
*         USES   X - 0, 1, 2, 3, 5, 6.
*                A - 1, 2, 3, 5, 6. 
*                B - 3. 
* 
*         CALLS  CDD, COD.
* 
*         MACROS MESSAGE, WRITEC. 
  
  
 IFS      SUBR               ENTRY/EXIT 
          SA1    CFBT 
          ZR     X1,IFS0     IF NO FILES LARGER THAN THRESHOLD
          MESSAGE IFSF,3
          MESSAGE IFSE,3
          MESSAGE IFSF,3
          WRITEC O,IFSF 
          WRITEC O,IFSE 
          WRITEC O,IFSF 
 IFS0     SA1    FCNT 
          RJ     CDD         CONVERT FILE COUNT TO DISPLAY
          MX0    6
          BX6    -X0*X6 
          SA1    ADOT 
          BX6    X1+X6
          SB3    60 
          SB3    B3-B2
          LX6    B3 
          SA6    IFSA+3 
          SA1    POPT 
          SA5    =10HDESTAGE =
          ZR     X1,IFS1     IF *PO=D*
          SA5    =10HRELEASE =
 IFS1     BX6    X5 
          SA6    IFSA+2 
          MESSAGE  IFSA,3    * FILES SELECTED FOR PPPPPPP = XXXXXXXXX.* 
          WRITEC O,IFSA 
          MX0    -6          SET MASK FOR DEVICE NUMBER SEARCH
 IFS2     SA5    TSDV 
          ZR     X5,IFS8     IF NO SELECTED DEVICE
 IFS3     BX1    -X0*X5 
          ZR     X1,IFS7     IF THIS ENTRY NOT APPLICABLE 
          PL     X0,IFS4     IF PROCESSING DEVICE TYPE ENTRIES
          SX1    X1+100B
          RJ     COD         CONVERT TO DISPLAY 
          SA3    =8L,  DN =  SET DEVICE NUMBER INTO MESSAGE 
          MX2    -12
          BX2    -X2*X6 
          BX6    X2+X3
          LX6    12 
          SA6    IFSC 
          EQ     IFS6        ADD TRACK COUNT TO MESSAGE 
  
 IFS4     SA3    =6L DT =    SET DEVICE TYPE AND SPINDLES INTO MESSAGE
          MX2    12 
          BX6    X2*X1
          LX6    24 
          BX1    -X2*X1 
          SX2    2R,
          ZR     X1,IFS5     IF SINGLE SPINDLE DEVICE 
          SX2    X1+2R1,
 IFS5     BX2    X2+X6
          BX6    X2+X3
          SA6    IFSC 
 IFS6     SA2    A5+B1       SECTORS SELECTED 
          MX6    12 
          BX5    -X6*X5 
          AX5    36          TRACK SIZE 
          IX1    X2/X5       NUMBER OF TRACKS 
          RJ     COD         CONVERT TRACKS TO DISPLAY
          MX1    6
          BX6    -X1*X6 
          SA1    ADOT 
          BX6    X1+X6
          SB3    60 
          SB3    B3-B2
          LX6    B3 
          SA6    IFSC+3 
*         MESSAGE  IFSC,3    * DT = TTT, FILE TRACK COUNT = XXXXXXXXX.* 
          MESSAGE  IFSC,3    * DN = NN,  FILE TRACK COUNT = XXXXXXXXX.* 
          WRITEC O,IFSC 
 IFS7     SA5    A5+TSDVE 
          NZ     X5,IFS3     IF MORE SELECTED DEVICES 
          PL     X0,IFS8     IF CHECKING DEVICE TYPE
          MX2    21          SET MASK FOR DEVICE TYPE/SPINDLES
          LX2    9
          BX0    X0-X2
          EQ     IFS2        SEARCH FOR DEVICE TYPES
  
 IFS8     SA2    INCH 
          SA3    UNITS       FEET OR MEGABYTES
          LX3    12 
          SX3    X3-2RMB
          NZ     X3,IFS9     IF FEET
          SX6    IFSD        * MEGABYTES REQUIRED FOR DUMP= X..X* 
          SA6    IFSG 
          SX3    PBYT        NUMBER OF 8-BIT BYTES PER PRU
          IX2    X2*X3       BYTES
          SX3    500         ROUND TO KILOBYTES FOR CONVERSION
          IX2    X2+X3
          LX3    1
          IX1    X2/X3       KILOBYTES
          RJ     CFD         CONVERT TO F10.3 DISPLAY MEGABYTES 
          SB2    B3+60
          EQ     IFS10       CONTINUE PROCESSING MESSAGE
  
 IFS9     SX3    12*32       CONVERSION FROM INCHES*32 TO FEET
          SX6    IFSB        * FEET OF DUMP TAPE REQUIRED = X..X* 
          IX1    X2/X3
          SA6    IFSG 
          RJ     CDD         CONVERT AMOUNT REQUIRED TO DISPLAY 
 IFS10    SA1    ADOT 
          MX0    6
          BX2    X0*X6
          BX6    -X0*X6 
          BX6    X1+X6
          SB3    60 
          SB3    B3-B2
          NZ     B3,IFS11    IF NOT TEN CHARACTERS
          LX6    6
 IFS11    LX6    B3 
          SA3    IFSG 
          SA6    X3+3 
          SA1    A6-B1
          LX1    54 
          BX1    -X0*X1 
          BX6    X1+X2
          LX6    6
          SA6    A1 
          MESSAGE  X3,3      * MEGABYTES/FEET OF DUMP TAPE REQUIRED..*
          WRITEC O,X3 
          EQ     IFSX        RETURN 
  
  
 IFSA     DATA   C* FILES SELECTED FOR PPPPPPP = XXXXXXXXX.*
 IFSB     DATA   C* FEET OF DUMP TAPE REQUIRED = XXXXXXXXX.*
 IFSC     DATA   C* DT = XXX, FILE TRACK COUNT = XXXXXXXXX.*
 IFSD     DATA   C* MEGABYTES REQUIRED FOR DUMP=XXXXXX.XXX.*
 IFSE     DATA   C+ *WARNING* - FILES LARGER THAN *DL* LIMIT SKIPPED.+
 IFSF     DATA   C+ *WARNING*+
 IFSG     BSS    1           POINTER TO MESSAGE TO BE ISSUED
 RCS      SPACE  4,15 
**        RCS - RESTORE CHARACTER SET.
* 
*         RESTORES ORIGINAL CHARACTER SET IF IT WAS CHANGED.
* 
*         ENTRY  (CSET) .NE. 0 IF CHARACTER SET WAS CHANGED.
* 
*         EXIT   CHARACTER SET IS THE SAME AS UPON ENTERING *GENPFD*. 
* 
*         USES   X - 1. 
*                A - 1. 
* 
*         MACROS CSET.
  
  
 RCS      SUBR               ENTRY/EXIT 
          SA1    CSET 
          ZR     X1,RCSX     IF CHARACTER SET WAS NOT CHANGED 
          CSET   RESTORE     RESTORE ORIGINAL CHARACTER SET 
          EQ     RCSX        RETURN 
 SRT      SPACE  4,20 
**        SRT - MERGE SORT OF *ITEML* SIZE ENTRIES. 
* 
*         *SRT* SORTS THE *ITEML* SIZE ENTRIES ON THE SELECTION FILE
*         ON THE FIRST WORD OF EACH ENTRY, USED AS AN UNSIGNED, 60-BIT
*         NUMERIC SORT KEY.  THE ALGORITHM USED IS TAKEN
*         FROM N. WIRTH, *ALGORITHMS + DATA STRUCTURES = PROGRAMS*, 
*         PRENTICE-HALL, PP. 97-98. 
* 
*         ENTRY  THE SELECTION FILE CONTAINS AT LEAST ONE ENTRY.
* 
*         EXIT   SORTED ENTRIES ON SELECTION FILE.
* 
*         USES   X - 1, 2, 6. 
*                A - 1, 6.
* 
*         CALLS  DTR, MRG.
* 
*         MACROS RESET, REWIND, REWRYTE, UNLOAD, WRITER.
  
  
 SRT      SUBR               ENTRY/EXIT 
          UNLOAD AF          UNLOAD WORK FILES
          UNLOAD BF 
  
*         REPEAT DISTRIBUTE/MERGE PASSES. 
  
 SRT1     REWRYTE  AF 
          REWRYTE  BF 
          RESET  CF 
          RJ     DTR         DISTRIBUTE RUNS FROM C ONTO A AND B
          WRITER AF,R 
          WRITER BF,R 
          RESET  AF 
          RESET  BF 
          REWRYTE  CF 
          SX6    B0+         INITIALIZE COUNT OF RUNS FOR THIS PASS 
          SA6    NRUN 
          RJ     MRG         MERGE RUNS FROM A AND B ONTO C 
          WRITER CF,R 
          SA1    NRUN 
          SX2    B1 
          IX1    X1-X2
          NZ     X1,SRT1     IF NOT A SINGLE RUN YET
          UNLOAD AF 
          UNLOAD BF 
          REWIND CF,R 
          EQ     SRTX        RETURN 
          TITLE  DIRECTIVE PROCESSORS.
 PDL      SPACE  4,20 
**        PDL - PROCESS *DL* DIRECTIVE. 
* 
*         EXTRACT AND STORE DESTAGE MAXIMUM SIZE IN FEET OR MEGABYTES.
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   DESTAGE MAXIMUM SIZE STORED. 
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN12* IF ERROR DETECTED.
* 
*         USES   X - 5, 6.
*                A - 6. 
*                B - 7. 
* 
*         CALLS  DXB. 
  
  
 PDL      BSS    0           ENTRY
          BX5    X6 
          SB7    B1          INDICATE DECIMAL CONVERSION
          RJ     DXB
          NZ     X4,GEN12    IF ARGUMENT ERROR
          NZ     X6,PDL1     IF ARGUMENT IS NOT ZERO
          MX6    -0          MARK *DL=0* ENTRY
 PDL1     SA6    DLFV        SAVE THE DESTAGE LIMIT 
          EQ     GEN1        RETURN 
 PDT      SPACE  4,20 
**        PDT - PROCESS *DT* DIRECTIVE. 
* 
*         EXTRACT AND STORE DESTAGE MINIMUM SIZE IN FEET OR MEGABYTES.
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   DESTAGE MINIMUM SIZE STORED. 
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN12* IF ERROR DETECTED.
* 
*         USES   X - 5, 6.
*                A - 6. 
*                B - 7. 
* 
*         CALLS  DXB. 
  
  
 PDT      BSS    0           ENTRY
          BX5    X6 
          SB7    B1          INDICATE DECIMAL CONVERSION
          RJ     DXB
          NZ     X4,GEN12    IF ARGUMENT ERROR
          NZ     X6,PDT1     IF ARGUMENT IS NOT ZERO
          MX6    -0          MARK *DT=0* ENTRY
 PDT1     SA6    DTFV        SAVE DESTAGE MINIMUM 
          EQ     GEN1        RETURN 
 PPG      SPACE  4,20 
**        PPG - PROCESS *PG* DIRECTIVE. 
* 
*         PROCESS PREFERRED RESIDENCE GROUPINGS.
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   PREFERRED RESIDENCE GROUPINGS STORED.
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN11*, *GEN12* OR *GEN13* IF ERROR DETECTED.
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6. 
*                A - 1, 2, 6. 
* 
*         CALLS  POP. 
  
  
 PPG      BSS    0           ENTRY
          SX1    B0+         CLEAR TABLE POINTER
 PPG1     SA6    TPRG+X1     SAVE PARAMETER VALUE IN TABLE
          BX5    X6 
          MX0    6
          SX6    X1+1 
          SA6    TPRGP       SAVE PRIORITY GROUP TABLE POINTER
 PPG2     ZR     X5,PPG4     IF NO MORE CODES TO CHECK
          BX1    X0*X5
          BX5    X5-X1
          LX5    6
          SA2    PRCD        VALID PREFERRED RESIDENCE CODES
 PPG3     LX2    6
          BX3    X0*X2
          BX4    X1-X3
          ZR     X4,PPG2     IF CODES MATCH 
          NZ     X3,PPG3     IF MORE CODES TO CHECK 
          EQ     GEN12       REPORT ERROR 
  
 PPG4     ZR     B6,GEN1     IF NO MORE ARGUMENTS 
          NG     B6,GEN11    IF NO TERMINATOR FOUND 
          RJ     POP         GET THE NEXT ARGUMENT
          NZ     B5,GEN11    IF ERROR OR ARGUMENT TOO LONG
          SA1    TPRGP
          SX2    X1-TPRGL 
          NG     X2,PPG1     IF ROOM REMAINS IN PRIORITY GROUP TABLE
          SX5    PPGA        * TOO MANY PRIORITY GROUP (PG) ENTRIES.* 
          EQ     GEN13       ISSUE ERROR MESSAGE
  
  
 PPGA     DATA   C* TOO MANY PRIORITY GROUP (PG) ENTRIES.*
 PRL      SPACE  4,20 
**        PRL - PROCESS *RL* DIRECTIVE. 
* 
*         PROCESS RELEASE LIMITS FOR DEVICES OR DEVICE TYPES. 
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   RELEASE LIMITS DEFINED.
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN11*, *GEN12* OR *GEN13* IF ERROR DETECTED.
* 
*         USES   X - 0, 1, 2, 5, 6, 7.
*                A - 0, 1, 5, 6.
*                B - 6, 7.
* 
*         CALLS  CAP, DXB, POP. 
* 
*         MACROS MESSAGE, WRITEC. 
  
  
 PRL      BSS    0           ENTRY
          BX1    X6 
          LX1    6
          SX1    X1-1R0 
          BX5    X6 
          NG     X1,PRL1     IF A DEVICE TYPE 
          SB7    B0          INDICATE OCTAL CONVERSION
          RJ     DXB         CONVERT DEVICE NUMBER
          NZ     X4,GEN12    IF ERROR 
          MX0    6           SET UP MASK FOR DEVICE NUMBER
          LX0    6
          EQ     PRL3        CHECK ACTIVE DEVICES 
  
*         VALIDATE DEVICE TYPE. 
  
 PRL1     SA2    PRLA 
          RJ     CAP         CHECK FOR ALLOWABLE PATTERN
          NZ     X1,GEN12    IF NOT ALLOWABLE PATTERN 
          MX0    12 
          BX5    -X0*X6      NUMBER OF SPINDLES 
          BX6    X0*X6       DEVICE MNEMONIC
          MX1    -3          MASK FOR SPINDLE COUNT 
          ZR     X5,PRL2     IF NUMBER OF SPINDLES NOT SPECIFIED
          LX5    18 
          SX5    X5-1R1 
          BX7    X1*X5
          NG     X5,GEN12    IF NUMBER OF SPINDLES INCORRECT
          NZ     X7,GEN12    IF TOO MANY SPINDLES SPECIFIED 
 PRL2     LX5    6
          BX6    X5+X6       MERGE SPINDLES WITH DEVICE TYPE
          LX1    6
          BX0    -X1+X0      DEVICE TYPE / SPINDLES MASK
  
*         FIND MATCHING CATALOG DEVICE ENTRY. 
*         (X0) = MASK FOR DEVICE NUMBER OR DEVICE TYPE/SPINDLES.
*         (X6) = DEVICE NUMBER OR DEVICE TYPE/SPINDLES SPECIFIED. 
  
 PRL3     SA1    TCDV        GET FIRST ACTIVE DEVICE TABLE ENTRY
          BX7    X7-X7       CLEAR FOR TRACK DATA 
          MX2    36          SET UP MASK
 PRL4     BX5    X0*X1
          BX5    X5-X6
          NZ     X5,PRL5     IF DEVICE TYPE/NUMBER DOES NOT MATCH 
          LX1    12          POSITION TRACK SIZE
          BX5    X2*X1
          LX5    -12
          IX1    X5-X7
          ZR     X7,PRL4.1   IF FIRST MATCHING ENTRY
          PL     X1,PRL5     IF PREVIOUS ENTRY HAD LESS AVAILABLE 
 PRL4.1   BX7    X5 
          SA7    PRLB        SAVE TRACK SIZE, AVAILABLE AND TOTAL 
 PRL5     SA1    A1+TCDVE    GET NEXT CATALOG DEVICE ENTRY
          NZ     X1,PRL4     IF NOT END OF TABLE
          NZ     X7,PRL5.1   IF A MATCH WAS FOUND 
          SX5    ERDT        * DEVICE TYPE/NUMBER NOT FOUND.* 
          MESSAGE  X5,3 
          WRITEC O,X5 
          EQ     GEN1        RETURN 
  
*         ADD VALIDATED ENTRY TO SELECTED DEVICE TABLE. 
*         (X0) = MASK FOR DEVICE NUMBER OR DEVICE TYPE/SPINDLES.
*         (X6) = DEVICE NUMBER OR DEVICE TYPE/SPINDLES SPECIFIED. 
  
 PRL5.1   SA1    TSDV        GET FIRST SELECTED DEVICE TABLE ENTRY
          ZR     X1,PRL7     IF TABLE IS EMPTY
 PRL6     BX5    X0*X1
          BX1    X5-X6
          ZR     X1,PRL7     IF MATCHING ENTRY FOUND IN TABLE 
          SA1    A1+TSDVE 
          NZ     X1,PRL6     IF ANOTHER ENTRY TO CHECK
          PL     X1,PRL7     IF ROOM IN TABLE TO ADD NEW ENTRY
          SX5    PRLC        * TOO MANY DEVICE SELECTION (RL) ENTRIES.* 
          EQ     GEN13       ISSUE ERROR MESSAGE
  
 PRL7     SA6    A1          ADD ENTRY TO TABLE 
          SA0    A1          SAVE ADDRESS OF ENTRY
  
*         PROCESS REQUIRED TRACKS ARGUMENT IF PRESENT.
*         (A0) = ADDRESS OF SELECTED DEVICE ENTRY.
  
          NG     B6,PRL8     IF NO SEPARATOR/TERMINATOR 
          ZR     B6,PRL8     IF NO MORE ARGUMENTS 
          RJ     POP         PICK OUT NEXT ARGUMENT 
          NZ     B5,GEN11    IF ERROR OR ARGUMENT TOO LONG
          NZ     B6,GEN11    IF TOO MANY ARGUMENTS
          BX5    X6 
          SB7    B0          INDICATE OCTAL CONVERSION
          RJ     DXB         CONVERT REQUIRED TRACKS
          NZ     X4,GEN12    IF ERROR 
          SA5    PRLB        CHECK TOTAL TRACKS 
          MX0    -12
          AX5    12 
          BX1    -X0*X5      TOTAL TRACKS 
          IX1    X1-X6
          PL     X1,PRL8     IF LESS REQUIRED THAN TOTAL
          IX6    X1+X6       SET REQUIRED EQUAL TO TOTAL
 PRL8     AX5    12 
          BX1    -X0*X5      AVAILABLE TRACKS 
          IX1    X6-X1
          PL     X1,PRL11    IF SUFFICIENT TRACKS NOT ALREADY AVAILABLE 
          SX5    ERST        * SUFFICIENT TRACKS ALREADY AVAILABLE.*
          MESSAGE  X5,3 
          WRITEC O,X5 
          SA1    TSDVE+A0    MOVE ALL FOLLOWING ENTRIES BACK ONE
 PRL9     BX6    X1 
          SA1    A1+B1
          NZ     X6,PRL10    IF NOT AN EMPTY ENTRY
          SX6    B0+
          SX1    B0+
 PRL10    SA6    A0 
          BX7    X1 
          SA1    A1+B1
          SA7    A6+B1
          SA0    A7+B1
          NZ     X6,PRL9     IF ALL ENTRIES NOT MOVED 
          EQ     GEN1        RETURN 
  
*         CONSTRUCT SELECTED DEVICE TABLE ENTRY.
*         (A0) = ADDRESS OF ENTRY.
*         (X5) = TRACK SIZE (BITS 23-12). 
*         (X6) = TRACKS GOAL. 
  
 PRL11    SA1    A0 
          AX5    12          TRACK SIZE 
          MX0    24 
          IX6    X5*X6       TOTAL SECTORS REQUIRED 
          LX0    12 
          BX1    X0*X1       DEVICE TYPE/NUMBER 
          LX5    36          TRACK SIZE 
          LX6    12          REQUIRED SECTORS 
          BX6    X5+X6       TRACK SIZE AND REQUIRED SECTORS
          BX6    X1+X6       ADD DEVICE TYPE/NUMBER 
          SA6    A0 
          EQ     GEN1        RETURN 
  
  
 PRLA     VFD    9/113B,51/0 PATTERN FOR DEVICE TYPE CHECK
 PRLB     BSS    1           TEMPORARY STORAGE
 PRLC     DATA   C* TOO MANY DEVICE SELECTION (RL) ENTRIES.*
 PSF      SPACE  4,15 
**        PSF - PROCESS *SF* AND *XF* DIRECTIVES. 
* 
*         PROCESS SPECIFIC FILE/USER INDEX SELECTIONS AND EXCLUSIONS. 
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   SPECIFIED FILE SELECTIONS STORED.
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN11* OR *GEN12* IF ERROR DETECTED. 
* 
*         USES   X - 0, 2, 5, 6.
*                A - 0, 2, 5, 6.
*                B - 7. 
* 
*         CALLS  DXB, PFV, POP. 
  
  
 PSF      BSS    0           ENTRY
          ZR     X6,GEN11    IF NO USER INDEX SPECIFIED 
          BX5    X6 
          SB7    B0          INDICATE OCTAL CONVERSION
          RJ     DXB
          NZ     X4,GEN12    IF ERROR 
          ZR     X6,GEN12    IF USER INDEX IS ZERO
          MX0    -17
          BX5    X0*X6
          NZ     X5,GEN12    IF USER INDEX EXCEEDS 377777B
          SA5    TDIRX
          SA2    DIRV 
          MX0    -18
          BX5    X0*X5
          BX5    X2-X5
          NZ     X5,PSF1     IF NOT EXCLUSION DIRECTIVE 
          BX6    -X0-X6      INVERT USER INDEX FOR EXCLUSIONS 
 PSF1     SA5    PSFA        ADD USER INDEX TO PATTERN
          BX5    X0*X5
          BX6    X5+X6
          SA6    A5 
          BX6    X6-X6       CLEAR FILE NAME
          NG     B6,PSF2     IF NO TERMINATOR 
          ZR     B6,PSF2     IF NO MORE ARGUMENTS 
          RJ     POP         GET FIRST FILE NAME
          NZ     B5,GEN11    IF ERROR EXTRACTING ARGUMENT 
 PSF2     SA0    PSFA 
          RJ     PFV         PROCESS POSSIBLE LIST OF FILE NAMES
          EQ     GEN1        RETURN 
  
  
 PSFA     VFD    21/4444444B,21/0,18/0  PATTERN / USER INDEX
 PSFB     CON    77777777777777000000B  MASK FOR FILE NAMES IN *PFV*
 PSFC     DATA   C* ENTER FILE NAME(S).*  PROMPT
 PSV      SPACE  4,15 
**        PSV - PROCESS *SV* DIRECTIVE. 
* 
*         PROCESS ALTERNATE STORAGE VSN SPECIFICATIONS. 
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
*                (B6) = NEXT STRING BUFFER ADDRESS. 
*                     = 0, IF TERMINATOR ENCOUNTERED. 
* 
*         EXIT   ALTERNATE STORAGE VSN ENTRIES PROCESSED. 
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN12* FROM *PFV* IF ERROR DETECTED. 
* 
*         USES   A - 0. 
* 
*         CALLS  PFV. 
  
  
 PSV      BSS    0           ENTRY
          SA0    PSVA 
          RJ     PFV         PROCESS POSSIBLE LIST OF VSN-S 
          EQ     GEN1        RETURN 
  
  
 PSVA     VFD    18/443333B,42/0        PATTERN 
 PSVB     CON    77777777777700000000B  MASK FOR VSN-S IN *PFV* 
 PSVC     DATA   C* ENTER VSN(S).*      PROMPT
 PTD      SPACE  4,20 
**        PTD - PROCESS *D* DIRECTIVE.
* 
*         EXTRACT AND STORE THE DESTAGE TAPE DENSITY. 
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
* 
*         EXIT   (DENS) = NUMBER OF BYTES/INCH FOR SELECTED DENSITY.
*                (GAPS) = SIZE OF INTERRECORD GAP IN INCHES*32. 
*                (CTSF) = NONZERO IF CARTRIDGE TAPE DENSITY.
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN12* IF ERROR DETECTED.
* 
*         USES   X - 0, 1, 5, 6.
*                A - 1, 6.
  
  
 PTD      BSS    0           ENTRY
          MX0    30 
          SA1    TDEN-1 
 PTD1     SA1    A1+1 
          ZR     X1,GEN12    IF NOT A VALID TAPE DENSITY
          BX5    X1-X6
          BX5    X0*X5
          NZ     X5,PTD1     IF NO MATCH
          MX0    -18
          BX6    -X0*X1      SAVE THE DENSITY 
          SA6    DENS 
          MX0    -11
          AX1    18          SAVE THE GAP SIZE
          BX6    -X0*X1 
          MX0    -1 
          SA6    GAPS 
          AX1    11          SAVE THE CARTRIDGE TAPE FLAG 
          BX6    -X0*X1 
          SA6    CTSF 
          EQ     GEN1        RETURN 
 PTF      SPACE  4,20 
**        PTF - PROCESS *F* DIRECTIVE.
* 
*         EXTRACT AND STORE THE DESTAGE TAPE FORMAT.
* 
*         ENTRY  (X6) = FIRST ARGUMENT. 
* 
*         EXIT   (PBLK) = NUMBER OF DISK PRU-S PER TAPE BLOCK (MINUS 1).
*                TO *GEN1* IF NO ERRORS.
*                TO *GEN12* IF ERROR DETECTED.
* 
*         USES   X - 0, 1, 5, 6.
*                A - 1, 6.
  
  
 PTF      BSS    0           ENTRY
          MX0    12 
          SA1    TFMT-1 
 PTF1     SA1    A1+1 
          ZR     X1,GEN12    IF NOT A VALID TAPE FORMAT 
          BX5    X1-X6
          BX5    X0*X5
          NZ     X5,PTF1     IF NO MATCH
          MX0    -12
          BX6    -X0*X1      SAVE THE PRU-S PER TAPE BLOCK
          SA6    PBLK 
          EQ     GEN1        RETURN 
          TITLE  SECONDARY SUBROUTINES. 
 CAP      SPACE  4,30 
**        CAP - CHECK FOR ALLOWABLE PATTERNS. 
* 
*         CHECK PARAMETERS FOR ALLOWABLE CHARACTER PATTERNS.
* 
*         ENTRY  (X5) = PARAMETER, LEFT JUSTIFIED ZERO FILLED.
*                (X2) = PATTERN, LEFT JUSTIFIED ZERO FILLED.  PATTERN 
*                       CONSISTS OF ONE OCTAL DIGIT FOR EACH CHARACTER
*                       POSITION OF THE PARAMETER.  EACH OCTAL DIGIT
*                       INDICATES THE CHARACTERS THAT ARE VALID FOR 
*                       THAT CHARACTER POSITION, AS FOLLOWS.
* 
*                       0 - ANY CHARACTER.
*                       1 - CHARACTERS A THROUGH Z. 
*                       2 - DIGITS 0 THROUGH 4. 
*                       3 - DIGITS 0 THROUGH 9. 
*                       4 - CHARACTERS A THROUGH Z, DIGITS 0 THROUGH 9. 
*                       5 - NO CHARACTER IS VALID.
* 
*         EXIT   (X1) = 0 IF PARAMETER MATCHES PATTERN. 
*                (X1) .NE. 0 IF PARAMETER DOES NOT MATCH PATTERN. 
* 
*         USES   X - 1, 2, 4, 5.
*                A - 1. 
*                B - 3, 4.
  
  
 CAP      SUBR               ENTRY/EXIT 
 CAP1     LX5    6
          SX1    X5 
          ZR     X1,CAPX     IF ALL CHARACTERS CHECKED
          BX5    X5-X1
          SB4    X1 
          LX2    3
          SX1    X2          INDEX TO PATTERNS
          ZR     X1,CAP1     IF NO RESTRICTION ON THIS CHARACTER
          BX2    X2-X1
          LX1    2           PATTERN INDEX * 4
          SB3    X1 
          LX1    1           PATTERN INDEX * 8
          SB3    B3+X1       PATTERN INDEX * 12 
          SA1    CAPA 
          MX4    -6 
          LX1    X1,B3
          BX4    -X4*X1 
          SB3    X4 
          GT     B4,B3,CAPX  IF CHARACTER OUT OF RANGE
          MX4    -6 
          LX1    -6 
          BX4    -X4*X1 
          SB3    X4 
          GE     B4,B3,CAP1  IF CHARACTER WITHIN RANGE
          EQ     CAPX        RETURN WITH ERROR INDICATION 
  
  
 CAPA     VFD    12/2LAZ,12/2L04,12/2L09,12/2LA9,12/2L10
 GSH      SPACE  4,20 
**        GSH - GET SUMMARY RECORD HEADER.
* 
*         GSH IDENTIFIES A RECORD AND MOVES THE HEADER INFORMATION
*         TO THE WORKING STORAGE AREA.  GSH IS CALLED ONLY BY GSR, AND
*         SHOULD BE CONSIDERED AS A PART OF THAT ROUTINE. 
* 
*         ENTRY  (X6) = FIRST WORD OF RECORD HEADER.
* 
*         EXIT   (X1) .EQ. 0 IF HEADER READ OK. 
*                (X1) .NE. 0 IF EOR/EOF/EOI ON READ.
*                (GSRB) = HEADER SIZE - 1.
*                (GSRC) = ITEM SIZE.
*                (GSRE) = FIRST WORD OF RECORD HEADER.  THE REST OF THE 
*                         HEADER FOLLOWS IN THE NEXT (GSRB) WORDS.
* 
*         USES   X - 0, 1, 2, 6, 7. 
*                A - 1, 6, 7. 
* 
*         MACROS READO, READW.
  
  
 GSH      SUBR               ENTRY/EXIT 
          READO  X5 
          NZ     X1,GSHX     IF EOR/EOF/EOI ON SUMMARY FILE 
          SA6    GSRE 
          MX0    42 
          SA1    TCER-1 
          BX6    X0*X6
 GSH1     SA1    A1+B1
          BX2    X0*X1
          ZR     X2,GSH2     IF AT END OF TABLE 
          BX2    X2-X6
          NZ     X2,GSH1     IF NO MATCH ON THIS TYPE 
 GSH2     MX0    -9 
          BX6    -X0*X1      SAVE ITEM SIZE 
          SA6    GSRC 
          LX1    -9 
          BX6    -X0*X1      SAVE HEADER SIZE 
          SA6    GSRB 
          BX1    X6 
          ZR     X1,GSHX     IF NO HEADER INFO TO READ
          SA1    GSRE        DECREMENT WORD COUNT FOR HEADER
          IX7    X1-X6
          SA7    A1 
          READW  X5,GSRE+1,X6  READ HEADER INFORMATION
          EQ     GSHX        RETURN 
 GSR      SPACE  4,40 
**        GSR - GET SUMMARY RECORD. 
* 
*         GSR LOCATES A SPECIFIED TYPE OF RECORD AND RETURNS IT TO
*         THE CALLER IN THE SPECIFIED LOCATION. 
* 
*         ENTRY  (A1) = ADDRESS OF FIRST WORD OF PARAMETER LIST.
*                (X1) = FIRST WORD OF PARAMETER LIST. 
* 
*                PARAMETER LIST IS AS FOLLOWS:  
* 
*                WORD 1 -    FWA OF REQUESTED RECORD TYPE.
*                            REQUESTED RECORD TYPES CAN BE: 
* 
*                            INIT    - OPEN/INITIALIZE FILE - RETURNS 
*                                      THE PREFIX TABLE.
*                            SYSTEM  - RETURNS THE SYSTEM ID BLOCK. 
*                            DEVSTAT - RETURNS A DEVICE STATUS ENTRY. 
*                            CATE    - RETURNS A CATALOG ENTRY. 
* 
*                WORD 2 -    FWA OF FET.
*                WORD 3 -    FWA OF BUFFER TO RECEIVE DATA. 
*                WORD 4 -    ADDRESS OF STATUS RETURN WORD. 
* 
*         EXIT   (STATUS WORD) = 0, A RECORD OF THE DESIRED TYPE WAS
*                                   RETURNED. 
*                           .GT. 0, AN EXCEPTION OF SOME TYPE OCCURRED
*                                   ON THE *READW* CALL.  USUALLY THIS
*                                   WILL BE *EOR*, *EOF* OR *EOI*.
*                           .LT. 0, THE NEXT AVAILABLE RECORD IS NOT
*                                   THE REQUESTED TYPE, AFTER PREVIOUS
*                                   TRANSFER OF THAT RECORD TYPE. 
* 
*                (BUFFER) = A RECORD OF THE REQUESTED TYPE, PROVIDED
*                               THAT THE STATUS IS ZERO.
* 
*                THE REQUESTED RECORD IS RETURNED TO SPECIFIED BUFFER.
*                THE RECORD RETURNED (EXCEPT WHEN THE REQUEST ISSUED IS 
*                *INIT*) CONSISTS OF ONE RECORD TYPE WORD CONTAINING
*                THE RECORD IDENTIFIER AND THE COUNT OF REMAINING WORDS 
*                IN THE CURRENT BLOCK, A COPY OF THE HEADER PORTION OF
*                THE RECORD, AND THE CURRENT ITEM OF THE RECORD.
*                THE LENGTHS OF THE HEADER AND ITEM PORTIONS OF THE 
*                RETURNED RECORD DEPEND UPON THE PARTICULAR TYPE OF 
*                RECORD BEING RETURNED. 
*                THE DATA RETURNED IN RESPONSE TO THE *INIT* REQUEST
*                CONSISTS OF THE PREFIX TABLE FOR THE FILE. 
* 
*                TO *ABT* WITH MESSAGE IF SUMMARY FILE ERROR. 
* 
*         USES   X - 0, 1, 2, 3, 4, 5, 6. 
*                A - 1, 2, 3, 4, 6. 
*                B - 2. 
* 
*         CALLS  GSH. 
* 
*         MACROS READ, READO, READW.
  
  
 GSR      SUBR               ENTRY/EXIT 
          SX6    A1          SAVE THE CALLING SEQUENCE POINTER
          SA6    GSRA 
          SA5    A1+B1       GET FET ADDRESS
          SA3    GSRE        CHECK CURRENT RECORD TYPE
          NZ     X3,GSR2     IF ALREADY INITIALIZED 
  
*         PROCESS INITIAL REQUEST.
  
          READ   X5,R 
          READO  X5          READ FIRST WORD OF FILE
          NZ     X1,GSR9     IF EOR/EOF/EOI ON SUMMARY FILE 
          SA6    GSRE        SAVE RECORD TYPE INDICATOR 
          SA1    GSRA        RESTORE ENTRY REGISTERS
          SA1    X1 
          SA2    X1          GET REQUESTED RECORD TYPE
          SA3    GSRD        CHECK AGAINST PREFIX HEADER
          BX6    X3-X6
          NZ     X6,GSR10    IF NOT A CORRECT PREFIX RECORD 
          SA3    =4LINIT
          BX6    X2-X3
          SA4    A1+2        GET BUFFER ADDRESS 
          ZR     X6,GSR1     IF *INIT* REQUEST
          SX4    WSA         USE SCRATCH BUFFER IF NOT *INIT* REQUEST 
 GSR1     SA3    GSRE 
          BX6    X3 
          LX3    12 
          AX3    -12         NUMBER OF WORDS TO READ
          SA6    X4          SAVE PREFIX HEADER IN BUFFER 
          SX4    X4+B1
          READW  X5,X4,X3    READ THE PREFIX TABLE INTO BUFFER
          SA2    GSRA 
          SA3    X2+3        GET STATUS WORD ADDRESS
          BX6    X1 
          SA6    X3          SAVE STATUS
          SA1    X2 
          SA2    X1 
          SA3    =4LINIT
          BX6    X2-X3
          ZR     X6,GSRX     IF REQUEST WAS *INIT*
  
*         SEARCH FOR REQUESTED RECORD TYPE. 
  
 GSR2     SA2    X1          GET REQUESTED RECORD TYPE
          SA3    GSRE 
          MX0    42 
          BX6    X2-X3
          BX6    X0*X6
          ZR     X6,GSR5     IF REQUEST IS FOR CURRENT RECORD TYPE
  
*         REQUEST IS NOT FOR CURRENT RECORD TYPE - FIND NEXT RECORD.
  
          BX6    -X0*X3 
          NZ     X6,GSR3     IF CURRENT BLOCK NOT EXHAUSTED 
          RJ     GSH         GET CATALOG RECORD HEADER
          NZ     X1,GSR7     IF EOR/EOF/EOI ON SUMMARY FILE 
          SA1    GSRA 
          SA1    X1 
          EQ     GSR2        CHECK IF REQUESTED RECORD TYPE 
  
 GSR3     SX2    WSAL 
          IX1    X6-X2
          BX6    X0*X3
          PL     X1,GSR4     IF REMAINING WORDS EXCEED SCRATCH BUFFER 
          BX2    -X0*X3      SET REMAINING WORD COUNT 
          BX1    X1-X1
 GSR4     BX6    X1+X6
          SA6    A3          UPDATE RECORD HEADER WORD COUNT
          READW  X5,WSA,X2
          NZ     X1,GSR7     IF EOR/EOF/EOI ON SUMMARY FILE 
          SA2    GSRA 
          SA1    X1 
          EQ     GSR2        REPEAT UNTIL REQUESTED RECORD TYPE FOUND 
  
*         REQUEST IS FOR CURRENT RECORD TYPE. 
  
 GSR5     BX6    -X0*X3 
          ZR     X6,GSR8     IF CURRENT BLOCK IS EXHAUSTED
          SA4    A1+2        GET BUFFER ADDRESS 
          SA2    GSRB        HEADER SIZE
          SB2    X2 
          SA2    GSRC        GET ITEM SIZE
          IX6    X3-X2       DECREMENT WORDS REMAINING
          SA6    A3+
 GSR6     SA6    X4          STORE WORD OF HEADER 
          SA3    A3+B1
          SX4    X4+B1       INCREMENT BUFFER ADDRESS 
          SB2    B2-B1
          BX6    X3 
          PL     B2,GSR6     IF MORE WORDS TO TRANSFER
          READW  X5,X4,X2    READ NEXT ITEM INTO BUFFER AFTER HEADER
 GSR7     SA2    GSRA 
          SA3    X2+3        GET STATUS WORD ADDRESS
          MX6    1
          BX6    -X6*X1 
          SA6    X3+         SAVE STATUS
          EQ     GSRX        RETURN 
  
 GSR8     RJ     GSH         GET CATALOG RECORD HEADER
          NZ     X1,GSR7     IF EOR/EOF/EOI ON SUMMARY FILE 
          SA1    GSRA 
          SA1    X1 
          SA2    X1 
          SA3    GSRE 
          MX0    42 
          BX6    X2-X3
          BX6    X0*X6
          ZR     X6,GSR5     IF STILL SAME RECORD TYPE
          SA2    A1+3 
          MX6    1           STORE END OF CURRENT RECORD TYPE STATUS
          SA6    X2 
          EQ     GSRX        RETURN 
  
 GSR9     SX5    ERSE        * SUMMARY FILE IS EMPTY.*
          EQ     ABT         ABORT
  
 GSR10    SX5    ERSP        * SUMMARY FILE PREFIX TABLE ERROR.*
          EQ     ABT         ABORT
  
  
 GSRA     BSS    1           PARAMETER LIST ADDRESS 
 GSRB     BSS    1           LENGTH OF RECORD HEADER PORTION
 GSRC     BSS    1           LENGTH OF RECORD ITEM PORTION
 GSRD     VFD    12/7700B,12/SFPTL,36/0  PREFIX TABLE HEADER
 GSRE     CON    0           RECORD IDENTIFIER WORD 
          BSS    SFSHL       ALLOW FOR LONGEST RECORD HEADER
  
**        TABLE OF SUMMARY FILE RECORD TYPES. 
* 
*         *TCER* CONTAINS THE NAMES AND HEADER AND ITEM SIZES 
*         ASSOCIATED WITH KNOWN SUMMARY FILE RECORD TYPES.
*         UNKNOWN RECORD TYPES CAN EXIST ON THE SUMMARY FILE. 
*         THEY WILL BE CONSIDERED TO HAVE A HEADER LENGTH OF ZERO AND 
*         AN ITEM SIZE OF ONE WORD FOR BYPASSING PURPOSES.
* 
*T        42/ RID, 9/ HL, 9/ IL 
* 
*         RID    RECORD IDENTIFIER. 
*         HL     NUMBER OF WORDS IN HEADER. 
*         IL     NUMBER OF WORDS IN EACH ITEM.
  
  
 TCER     BSS    0
          VFD    42/0LSYSTEM,9/SFSHL,9/SFSIL
          VFD    42/0LDEVSTAT,9/SFDHL,9/SFDIL 
          VFD    42/0LCATE,9/SFFHL,9/SFFIL
          VFD    42/0,9/0,9/1 
 PFV      SPACE  4,15 
**        PFV - PROCESS FILE NAMES AND VSN-S. 
* 
*         ENTRY  (X6) = FIRST FILE NAME OR VSN TO ADD TO TABLE. 
*                (A0) = ADDRESS OF PARAMETER LIST.
* 
*         EXIT   FILE NAME OR VSN ENTRIES ADDED TO *TSFV* TABLE.
* 
*         ERROR  TO *GEN13* WITH ERROR MESSAGE AND POSSIBLE ABORT.
* 
*         USES   X - 0, 1, 2, 5, 6, 7.
*                A - 1, 2, 5, 6, 7. 
*                B - 2. 
* 
*         CALLS  CAP, DXB, POP, USB.
* 
*         MACROS READ, READC, WRITEC, WRITEW. 
  
  
 PFV      SUBR               ENTRY/EXIT 
          SA5    TSFVP       SAVE CURRENT TABLE SIZE
          BX0    X5 
          BX7    X5 
          SA7    PFVC 
 PFV1     SA2    A0+B1       GET MASK 
          BX5    -X2*X6 
          NZ     X5,PFV9     IF ARGUMENT IS TOO LONG
          SX5    X0-TSFVN 
          ZR     X5,PFV8     IF TOO MANY FILES/VSN-S
          SA5    A0          GET USER INDEX/VSN FLAG WORD 
          BX2    X2*X5       EXTRACT VERIFICATION PATTERN 
          BX5    X5-X2       ISOLATE USER INDEX/VSN FLAG
          BX6    X5+X6       MERGE UI/VSN FLAG WITH FILE NAME/VSN 
          SA6    TSFV+X0
          SX0    X0+1 
          BX5    X6-X5       ISOLATE FILE NAME/VSN
          RJ     CAP         CHECK FOR ALLOWABLE PATTERN
          NZ     X1,PFV9     IF INCORRECT ARGUMENT
          SX1    X6 
          NZ     X1,PFV2     IF NOT A VSN SPECIFICATION 
          LX6    12 
          MX1    24 
          BX5    X1*X6       EXTRACT THE DIGITS FROM THE VSN
          BX6    X0 
          SA6    PFVB 
          SB7    B1+         INDICATE DECIMAL CONVERSION
          RJ     DXB
          NZ     X4,PFV9     IF ERROR IN CONVERSION 
          SA1    PFVB        RESTORE TABLE POINTER
          BX0    X6 
          AX0    12 
          NZ     X0,PFV9     IF NUMERIC VALUE EXCEEDS 4095
          BX0    X1 
          SA1    TSFV-1+X0
          MX5    24          REPLACE DISPLAY DIGITS WITH BINARY 
          LX5    -12
          BX1    -X5*X1 
          LX6    36 
          BX6    X1+X6
          SA6    A1+
 PFV2     ZR     B6,PFV3     IF TERMINATOR ENCOUNTERED
          PL     B6,PFV4     IF MORE ARGUMENTS
 PFV3     BX6    X6-X6
          SA6    TSFV+X0
          BX6    X0          UPDATE TABLE SIZE
          SA6    TSFVP
          EQ     PFVX        RETURN 
  
*         GET NEXT FILE NAME OR VSN.
  
 PFV4     RJ     POP
          NG     B5,PFV9     IF ERROR 
          NZ     X6,PFV1     IF ANOTHER FILE NAME/VSN 
          ZR     B6,PFV3     IF TERMINATOR ENCOUNTERED
          PL     B6,PFV4     IF MORE ON THIS LINE 
          SA1    ZINF 
          NZ     X1,PFV3     IF CALLED WITH *Z* OPTION
          SA1    IDTP 
          NZ     X1,PFV6     IF NOT TERMINAL INPUT
          SX2    A0+2        ADDRESS OF PROMPT MESSAGE
          WRITEC O,X2 
          READ   I,R
 PFV6     READC  I,LINE,8 
          NZ     X1,PFV3     IF END-OF-RECORD FOUND 
          SA1    ODTP 
          ZR     X1,PFV7     IF OUTPUT FILE IS A TERMINAL FILE
          WRITEW O,BLNK,1    MOVE LINE OVER 
          WRITEC O,LINE,8    COPY LINE OF FILE NAMES TO LISTING 
 PFV7     SB2    LINE 
          RJ     USB
          SX6    B7+B1
          SA6    A6 
          SX6    1R.
          SA6    B7+B1
          EQ     PFV4        GET NEXT FILE NAME/VSN 
  
*         TOO MANY ENTRIES. 
  
 PFV8     SX5    PFVA        * TOO MANY FILE/VSN SELECTION ENTRIES.*
          EQ     PFV10       RESTORE *TSFV* TABLE AND ABORT 
  
*         ERROR WHILE CRACKING FILE LIST. 
  
 PFV9     SX5    ERDA        * DIRECTIVE ARGUMENT ERROR.* 
 PFV10    SA1    PFVC        RESTORE *TSFV* TABLE 
          BX6    X1 
          SA6    TSFVP
          SX6    B0+
          SA6    TSFV+X1
          EQ     GEN13       DISPLAY ERROR AND ABORT
  
  
 PFVA     DATA   C* TOO MANY FILE/VSN SELECTION (SF SV XF) ENTRIES.*
 PFVB     BSS    1           TEMPORARY STORAGE
 PFVC     BSS    1           SIZE OF *TSFV* TABLE AT ENTRY
          TITLE  SORTMERGE PROCESSING SUBROUTINES.
 CIT      SPACE  4,15 
**        CIT - COPY ONE ITEM FROM ONE FILE TO ANOTHER. 
* 
*         ENTRY  (X2) = ADDRESS OF FET TO READ FROM.
*                (X5) = ADDRESS OF FET TO WRITE TO. 
* 
*         EXIT   ITEM COPIED. 
*                *ERUN* SET IF ITEM COPIED WAS END OF A RUN.
* 
*         USES   X - 1, 2, 3, 5, 6, 7.
*                A - 1, 2, 3, 5, 6, 7.
* 
*         MACROS  GETITEM, PUTITEM. 
  
  
 CIT2     NG     X1,CIT1     IF NEXT ITEM .LT. COPIED ITEM
  
 CIT      SUBR               ENTRY/EXIT 
          SX6    X2          SAVE X FET ADDRESS 
          SX7    X5          SAVE Y FET ADDRESS 
          SA6    CITA 
          SA7    CITB 
          GETITEM  X2,CITC
          SA5    CITB 
          PUTITEM  X5,CITC
          SA2    CITA 
          SA1    X2+EOF      CHECK STATUS OF THIS FILE
          NZ     X1,CIT1     IF EOF(X)
          SA1    X2+RPTR
          SA3    CITC 
          SX6    B0+         CLEAR END OF RUN FLAG
          SA6    ERUN 
          BX6    X1-X3
          IX1    X1-X3
          PL     X6,CIT2     IF SAME SIGN (NO OVERFLOW POSSIBLE)
          PL     X3,CITX     IF NEXT ITEM .GT. COPIED ITEM
 CIT1     SX6    B1+         SET END OF RUN FLAG
          SA6    ERUN 
          EQ     CITX        RETURN 
  
  
 CITA     BSS    1           INPUT FET ADDRESS
 CITB     BSS    1           OUTPUT FET ADDRESS 
 CITC     BSS    ITEML       BLOCK FOR HOLDING COPIED ENTRY 
 CRN      SPACE  4,15 
**        CRN - COPY RUN OF ENTRIES BETWEEN FILES.
* 
*         ENTRY  (X2) = FET READ FROM.
*                (X5) = FET WRITTEN TO. 
* 
*         EXIT   RUN COPIED FROM X2 FILE TO X5 FILE.
* 
*         USES   X - 1, 2, 5, 6, 7. 
*                A - 1, 2, 5, 6, 7. 
* 
*         MACROS  COPITEM.
  
  
 CRN      SUBR               ENTRY/EXIT 
          SX6    X2          SAVE INPUT FET ADDRESS 
          SX7    X5          SAVE OUTPUT FET ADDRESS
          SA6    CRNA 
          SA7    CRNB 
  
*         REPEAT COPYING ITEMS UNTIL END-OF-RUN.
  
 CRN1     SA2    CRNA 
          SA5    CRNB 
          COPITEM  X2,X5
          SA1    ERUN 
          ZR     X1,CRN1     IF NOT END OF RUN BEING COPIED 
          EQ     CRNX        RETURN 
  
  
 CRNA     BSS    1           INPUT FET ADDRESS
 CRNB     BSS    1           OUTPUT FET ADDRESS 
 DTR      SPACE  4,15 
**        DTR - DISTRIBUTE RUNS FROM C ONTO A AND B.
* 
*         ENTRY  ALL ENTRIES ARE ON THE *CF* FILE.
*                ALL THREE FILES ARE READY TO GO. 
* 
*         EXIT   RUNS ARE DISTRIBUTED EVENLY BETWEEN *AF* AND *BF*. 
* 
*         USES   X - 1, 3.
*                A - 1, 3.
* 
*         MACROS  COPYRUN.
  
  
 DTR      SUBR               ENTRY/EXIT 
  
*         REPEAT COPY RUNS UNTIL EOF(C).
  
 DTR1     COPYRUN  CF,AF
          SA1    CF+EOF 
          NZ     X1,DTR2     IF EOF(C)
          COPYRUN  CF,BF
          SA1    CF+EOF 
 DTR2     ZR     X1,DTR1     IF NOT EOF(C)
          EQ     DTRX        RETURN 
 GIT      SPACE  4,20 
**        GIT - GET AN ITEM FROM A FILE.
* 
*         *GIT* PERFORMS A PASCAL-LIKE READ FROM A FILE INTO
*         A SPECIFIED LOCATION.  THIS INVOLVES MOVING THE 
*         CURRENT FILE POINTER VALUE INTO THE LOCATION AND
*         READING THE NEXT ENTRY FROM THE FILE INTO THE POINTER.
* 
*         ENTRY  (X0) = FET ADDRESS.
*                (X5) = ITEM DESTINATION ADDRESS. 
*                FILE POINTER HAS DESIRED ENTRY, OR BAD VALUE 
*                IF THE FILE IS AT EOF. 
* 
*         EXIT   VALUE MOVED. 
*                EOF FLAG SET IF NEXT READ FAILS. 
* 
*         USES   X - 6. 
*                A - 6. 
* 
*         MACROS  MOVE, READW.
  
  
 GIT      SUBR               ENTRY/EXIT 
          MOVE   ITEML,X0+RPTR,X5 
          READW  X0,X0+RPTR,ITEML 
          SX6    X1+         SET EOF FLAG APPROPRIATELY 
          SA6    X2+EOF 
          EQ     GITX        RETURN 
 MRG      SPACE  4,20 
**        MRG - MERGE PHASE OF MERGESORT. 
* 
*         *MRG* IS THE LOGICAL COMPLEMENT OF ROUTINE *DTR*.  *MRG*
*         MERGES ALL THE RUNS DISTRIBUTED ONTO *AF* AND *BF* AND
*         WRITES THEM ON *CF*.
* 
*         ENTRY  *AF* AND *BF* HAVE ITEM RUNS.
* 
*         EXIT   *AF* AND *BF* ARE EMPTY. 
*                *CF* CONTAINS ALL RUNS.
*                NUMBER OF RUNS IS APPROXIMATELY CUT IN HALF. 
* 
*         USES   X - 1, 2, 3, 6.
*                A - 1, 2, 3, 6.
* 
*         CALLS  MRN. 
* 
*         MACROS COPYRUN. 
  
  
 MRG      SUBR               ENTRY/EXIT 
  
*         WHILE NOT EOF(A) AND EOF(B) DO MERGE RUN. 
  
 MRG1     SA2    AF+EOF 
          SA3    BF+EOF 
          CX2    X2 
          CX3    X3 
          IX2    X2+X3       EOF(A) OR EOF(B) 
          NZ     X2,MRG2     IF EITHER AT EOF THEN STOP 
          RJ     MRN         MERGE ONE RUN ONTO C 
          SA1    NRUN 
          SX6    1
          IX6    X1+X6       INCREMENT COUNT OF RUNS
          SA6    A1 
          EQ     MRG1        LOOP FOR NEXT RUN TO MERGE 
  
*         COPY REST OF A ONTO C.
  
 MRG2     SA2    AF+EOF 
          NZ     X2,MRG3     IF EOF(A) THEN STOP
          COPYRUN  AF,CF
          SA1    NRUN 
          SX6    1
          IX6    X1+X6       INCREMENT COUNT OF RUNS
          SA6    A1 
          EQ     MRG2        LOOP FOR NEXT RUN TO COPY
  
*         COPY REST OF B ONTO C.
  
 MRG3     SA3    BF+EOF 
          NZ     X3,MRGX     IF EOF(B) THEN RETURN
          COPYRUN  BF,CF
          SA1    NRUN        INCREMENT COUNT OF RUNS
          SX6    1
          IX6    X1+X6
          SA6    A1 
          EQ     MRG3        LOOP FOR NEXT RUN TO COPY
 MRN      SPACE  4,15 
**        MRN - MERGE ONE RUN FROM A AND B ONTO C.
* 
*         ENTRY  AT LEAST ONE RUN IS ON *AF* AND ON *BF*. 
* 
*         EXIT   ONE FEWER RUN ON *AF* AND *BF*.
*                ONE MORE RUN ON *CF*.
* 
*         USES   X - 1, 3, 4. 
*                A - 1, 3, 4. 
* 
*         MACROS  COPITEM, COPYRUN. 
  
  
 MRN      SUBR               ENTRY/EXIT 
  
*         REPEAT COPYING ITEMS UNTIL END-OF-RUN.
  
 MRN1     SA3    AF+RPTR
          SA4    BF+RPTR
          BX1    X3-X4
          IX3    X4-X3
          PL     X1,MRN3     IF SAME SIGN (NO OVERFLOW POSSIBLE)
          NG     X4,MRN4     IF A.KEY  .LT.  B.KEY
  
*         A.KEY .GT. B.KEY. 
  
 MRN2     COPITEM  BF,CF
          SA1    ERUN 
          ZR     X1,MRN1     IF NOT END OF RUN ON B 
          COPYRUN  AF,CF
          EQ     MRNX        RETURN 
  
 MRN3     NG     X3,MRN2     IF A.KEY  .GT.  B.KEY
  
*         A.KEY .LE. B.KEY. 
  
 MRN4     COPITEM  AF,CF
          SA1    ERUN 
          ZR     X1,MRN1     IF NOT END OF RUN ON A 
          COPYRUN  BF,CF
          EQ     MRNX        RETURN 
 PIT      SPACE  4,10 
**        PIT - WRITE AN ITEM TO A FILE.
* 
*         ENTRY  (X2) = FET ADDRESS.
*                (X5) = ADDRESS OF ITEM TO WRITE. 
* 
*         MACROS  WRITEW. 
  
  
 PIT      SUBR               ENTRY/EXIT 
          WRITEW  X2,X5,ITEML 
          EQ     PITX        RETURN 
 RST      SPACE  4,15 
**        RST - REWIND FILE AND PREPARE FOR READING.
* 
*         *RST* REWINDS THE SPECIFIED FILE AND READS THE FIRST
*         ENTRY INTO THE FILE-S POINTER.
* 
*         ENTRY  (X2) = FET ADDRESS.
* 
*         EXIT   FILE REWOUND AND PARTIALLY READ
*                EOF FLAG SET IF FILE IS EMPTY. 
* 
*         USES   X - 6. 
*                A - 6. 
* 
*         MACROS READ, READW, REWIND. 
  
  
 RST      SUBR               ENTRY/EXIT 
          REWIND X2,R 
          READ   X2,R 
          READW  X2,X2+RPTR,ITEML 
          SX6    X1+         NON-ZERO IF READW HIT EOR/EOF/EOI
          SA6    X2+EOF 
          EQ     RSTX        RETURN 
 RWR      SPACE  4,10 
**        RWR - REWIND FILE AND PREPARE FOR WRITING.
* 
*         ENTRY  (X2) = FET ADDRESS.
* 
*         EXIT   FILE REWOUND, EOF FLAG SET ON. 
* 
*         USES   X - 6. 
*                A - 6. 
* 
*         MACROS  REWIND, WRITE.
  
  
 RWR      SUBR               ENTRY/EXIT 
          REWIND X2,R 
          WRITE  X2,* 
          SX6    77B         FLAG FILE ALWAYS EOF 
          SA6    X2+EOF 
          EQ     RWRX        RETURN 
          TITLE  COMMON DECKS.
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMCCDD 
*CALL     COMCCFD 
*CALL     COMCCIO 
*CALL     COMCCOD 
*CALL     COMCCPM 
*CALL     COMCDXB 
*CALL     COMCLFM 
*CALL     COMCMVE 
*CALL     COMCPOP 
*CALL     COMCRDC 
*CALL     COMCRDO 
*CALL     COMCRDW 
*CALL     COMCSNM 
*CALL     COMCSYS 
*CALL     COMCUSB 
*CALL     COMCWTC 
*CALL     COMCWTO 
*CALL     COMCWTS 
*CALL     COMCWTW 
*CALL     COMCZTB 
          TITLE  FILE ENVIRONMENT TABLES. 
 FETS     SPACE  4,10 
*         FETS. 
  
  
 I        BSS    0           INPUT
 INPUT    FILEB  IBUF,IBUFL,(FET=8) 
  
 O        BSS    0           OUTPUT 
 OUTPUT   FILEB  OBUF,OBUFL,(FET=8) 
  
 UD       BSS    0           UTILITY DIRECTIVE FILE 
 UDIR     FILEB  UBUF,UBUFL,(FET=8) 
  
 SUMMARY  BSS    0           SUMMARY FILE 
 SUMMARY  FILEB  SBUF,SBUFL 
  
 AF       BSS    0           MERGE SORT SCRATCH FILE ONE
 ZZZZZG1  FILEB  AFBUF,SMBFL,FET=MFETL
 APTR     BSSZ   ITEML
 AEOF     BSSZ   1
  
 BF       BSS    0           MERGE SORT SCRATCH FILE TWO
 ZZZZZG2  FILEB  BFBUF,SMBFL,FET=MFETL
 BPTR     BSSZ   ITEML
 BEOF     BSSZ   1
  
 CF       BSS    0           MERGE SORT FILE
 ZZZZZG3  FILEB  CFBUF,SMBFL,FET=MFETL
 CPTR     BSSZ   ITEML
 CEOF     BSSZ   1
          TITLE  PRS - PRESET ROUTINES. 
          USE    PRESET 
 PRS      SPACE  4,20 
**        PRS - PRESET PROGRAM. 
* 
*         *PRS* CRACKS THE COMMAND, SETS UP FETS FOR I/O, DETERMINES
*         IF INPUT IS FROM A TERMINAL AND SETS FLAGS AND POINTERS.
* 
*         USES   X - 0, 1, 2, 4, 6. 
*                A - 0, 1, 2, 4, 6. 
*                B - 1, 2, 3, 4, 5, 6.
* 
*         CALLS  ARG, STF, ZAP. 
* 
*         MACROS CSET, GETJO, MESSAGE, READ, SETLOF.
  
  
 PRS      SUBR               ENTRY/EXIT 
          SB1    1
  
*         CRACK PARAMETERS FROM COMMAND.
  
          SA1    ACTR        GET NUMBER OF ARGUMENTS
          SB4    X1+
          SA4    ARGR        GET FIRST ARGUMENT 
          SB5    TCAT        COMMAND ARGUMENT TABLE ADDRESS 
          RJ     ARG         PROCESS ARGUMENTS
          NZ     X1,PRS9     IF ERROR 
  
*         CHECK FOR FILE NAME CONFLICTS.
  
          SB2    B0+         BEGINNING ORDINAL FOR LFN CHECK
          SB4    B2+TLFNL    TERMINATION ORDINAL FOR LFN CHECK
          MX0    42 
 PRS1     SA1    TLFN+B2     NEXT ENTRY FROM ARGUMENT TABLE 
          LX1    -30
          SA1    X1          LFN FROM FET 
          BX1    X0*X1
          SB3    B2+B1       BEGIN CHECKING WITH FOLLOWING ENTRY
          EQ     B3,B4,PRS3  IF ALL LFNS HAVE BEEN CHECKED
 PRS2     SA2    TLFN+B3     NEXT ENTRY FROM ARGUMENT TABLE 
          LX2    -30
          SA2    X2          LFN FROM FET 
          BX2    X1-X2
          BX2    X0*X2
          ZR     X2,PRS9     IF FILE NAME CONFLICT
          SB3    B3+B1
          LT     B3,B4,PRS2  IF MORE LFNS TO CHECK
          SB2    B2+B1
          EQ     PRS1        PROCESS NEXT FILE IN LIST
  
*         PROCESS *Z* PARAMETER IF SPECIFIED. 
  
 PRS3     SA1    ZINF        COMMAND LINE INPUT FLAG SET BY *ARG* 
          ZR     X1,PRS4     IF *Z* ARGUMENT NOT GIVEN
          SX2    I           SET FET ADDRESS FOR *ZAP*
          RJ     ZAP         *Z* ARGUMENT PROCESSOR 
  
*         DETERMINE JOB ORIGIN TYPE.
  
 PRS4     GETJO  JORG 
          SA1    JORG 
          SX2    X1-SYOT
          ZR     X2,PRS7     IF SYSTEM ORIGIN 
          SX1    X1-IAOT
          NZ     X1,PRS5     IF THIS JOB IS NOT INTERACTIVE 
          CSET   NORMAL 
          MX6    1           INDICATE CHARACTER SET CHANGED 
          SA6    CSET 
  
*         CHECK FOR TERMINAL FILES. 
  
 PRS5     SA1    ZINF 
          NZ     X1,PRS6     IF INPUT IS FROM COMMAND LINE
          SX2    I
          RJ     STF         CHECK FOR INPUT FILE DISPOSITION 
          SA6    IDTP 
          ZR     X6,PRS6     IF INPUT IS A TERMINAL FILE
          READ   I           READ FIRST PART OF DISK INPUT FILE 
 PRS6     WRITE  O,*         PRESET WRITE FUNCTION
          SX2    O           CHECK OUTPUT FILE EQUIPMENT TYPE 
          RJ     STF
          SA6    ODTP 
          MX0    42 
          NZ     X6,PRS7     IF OUTPUT NOT ASSIGNED TO TERMINAL 
          SETLOF LOFP        SET LIST-OF-FILES ADDRESS
          EQ     PRS8        CONVERT PROCESSING OPTION
  
 PRS7     GETPP  OBUF,PRSB,PRSC  GET PRINT PARAMETERS 
          WRITEC O,PRSC      SET PRINT DENSITY
          WRITEC O,PRSD      ISSUE PAGE EJECT 
 PRS8     SA1    POPT        VALIDATE AND CONVERT PROCESSING OPTION 
          LX1    6
          SX6    X1-1RD 
          SX1    X1-1RR 
          SA6    POPT 
          ZR     X6,PRSX     IF *PO=D*
          ZR     X1,PRSX     IF *PO=R*
 PRS9     SX5    PRSA        * GENPFD ARGUMENT ERROR.*
          EQ     ABT         ABORT
  
  
 PRSA     DATA   C* GENPFD ARGUMENT ERROR.* 
 PRSB     BSS    1
 PRSC     BSS    1           PRINT DENSITY FORMAT EFFECTOR
 PRSD     DATA   0L1         PAGE EJECT FORMAT EFFECTOR 
          SPACE  4,10 
*         COMMAND ARGUMENT TABLE. 
  
 TCAT     BSS    0                 COMMAND ARGUMENT TABLE 
 TLFN     BSS    0                 FILE NAME ARGUMENT LIST
 I        ARG    I,I               INPUT DIRECTIVE FILE NAME
 L        ARG    O,O               LIST OUTPUT FILE NMAE
 U        ARG    UNITS,UNITS       UNITS PARAMETER
 S        ARG    SUMMARY,SUMMARY   SUMMARY FILE NAME
 UD       ARG    UDIR,UDIR         UTILITY DIRECTIVE FILE NAME
 TLFNL    EQU    *-TCAT            LENGTH OF FILE NAME ARGUMENT LIST
  
 Z        ARG    -BLNK,ZINF        *Z* INPUT FLAG 
 PO       ARG    POPT,POPT         PROCESSING OPTION
          CON    0                 ARGUMENT LIST TERMINATOR 
          SPACE  4,10 
*         PRESET COMMON DECKS.
  
  
*CALL     COMCARG 
*CALL     COMCSTF 
*CALL     COMCZAP 
          SPACE  4,10 
*         BUFFERS.
  
          USE    BUFFERS
  
          LIST   G
 BEGIN    BSSN   PRS
 AFBUF    BSSN   SMBFL       MERGESORT SCRATCH ONE BUFFER 
 BFBUF    BSSN   SMBFL       MERGESORT SCRATCH TWO BUFFER 
 CFBUF    BSSN   SMBFL       SELECTION/MERGE SORT BUFFER
 IBUF     BSSN   IBUFL       INPUT BUFFER 
 OBUF     BSSN   OBUFL       OUTPUT BUFFER
 SBUF     BSSN   SBUFL       SUMMARY FILE BUFFER
 UBUF     BSSN   UBUFL       UTILITY DIRECTIVES BUFFER
 WSA      BSSN   WSAL        WORKING STORAGE BUFFER 
 PAD      BSSN   20B         UNUSED END OF FL BUFFER AREA 
  
 RFL=     BSSN   0           SET INITIAL FIELD LENGTH 
 END      BSSN
          LIST   *
          SPACE  4,10 
*         OVERFLOW CHECK. 
  
  
          USE    PRESET 
          ERRPL  *-IBUF      PRESET OVERFLOWS INTO INPUT BUFFER 
          SPACE  4
          END    GENPFD 
