CPUPFM
          IDENT  CPUPFM,FWA 
          ABS 
          SST 
          ENTRY  CPF
          ENTRY  DMP= 
          ENTRY  LIB= 
          ENTRY  MFL= 
          ENTRY  SSJ= 
          ENTRY  UTL= 
          SYSCOM B1 
          TITLE  CPUPFM - COPY INDIRECT ACCESS FILES. 
*COMMENT  CPUPFM - COPY INDIRECT ACCESS FILES.
          COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 CPF      SPACE  4,10 
***       CPUPFM - COPY INDIRECT ACCESS FILES.
* 
*         R. C. SCHMITTER.   84/03/28.
          SPACE  4,10 
***       *CPUPFM* IS CALLED BY *PFM* TO PERFORM THE COPY OF AN 
*         INDIRECT ACCESS FILE FOR *GET*, *OLD*, *SAVE*, *REPLACE*
*         AND *APPEND* OPERATIONS IF THE FILE LENGTH IS GREATER 
*         THAN THE THREHOLD DEFINED IN *COMSPFM*.  THE ONLY ENTRY 
*         IS BY *DMP=* CALL TO *CPF*.  *CPUPFM* CANNOT BE CALLED
*         AT THE COMMAND LEVEL. 
          SPACE  4,10 
***       COMMAND FORMAT. 
* 
*         *SPCW* FORMAT FROM *PFM*. 
* 
*T        18/ *CPF*,6/ 30B,18/ 0,18/ COMMAND CODE 
* 
*         *CPUPFM* REPLY TO *PFM*.
* 
*T        24/ 0,3/ 1,1/E ,8/ EC,24/ 0 
* 
*                E  = ERROR IDLE FLAG.  IF SET, ERROR IDLE STATUS IS
*                     TO BE SET FOR THE MASTER DEVICE BY *PFM*. 
* 
*                     THIS FLAG IS SET WHEN THE FILE TRANSFER IS
*                     INCOMPLETE FOR *APPEND*, *REPLACE*, AND *SAVE*
*                     COMMANDS.  THIS CONDITION CAN OCCUR WITH
*                     *TRACK LIMIT*, *PFM ABORTED*, AND *MASS STORAGE 
*                     ERROR* ERROR CODES .
* 
*                     THIS FLAG IS SET WITH *FILE LENGTH ERROR* ERROR 
*                     CODE WHEN THERE IS A LOGICAL ERROR IN THE LENGTH
*                     OF THE FILE.
* 
*                EC = *PFM* ERROR CODE. 
*                     DTE(17) - DATA TRANSFER ERROR.
*                     TKL(31) - TRACK LIMIT.
*                     FLE(32) - FILE LENGTH ERROR.
*                     ABT(36) - PFM ABORTED.
*                     MSE(37) - MASS STORAGE ERROR. 
*                     RTR(127) - RETRY REQUEST. 
* 
* 
*         THE *DMPN* BLOCK IN NFL IS SET BY *PFM* WITH THE FOLLOWING
*         FORMAT. 
* 
*T        42/ LFN,18/ FLAGS 
*T,       12/ ,24/ APFL, 24/ LF 
*T,       36/ ,24/ RANDOM ADDRESS 
*T,       60/ SRB (WORD 0)
*T,       60/ SRB (WORD 1)
*T,       60/ SRB (WORD 2)
*T,       60/ SRB (WORD 3)
* 
*         LFN  = LOCAL FILE NAME. 
*         FLAGS = 17/ ,1/ FGIA
*                FGIA = INDIRECT ALLOCATION INTERLOCK HELD. 
*         LF   = TOTAL LENGTH OF FILE TO BE TRANSFERRED (BOTH PERMANENT 
*                AND LOCAL FOR *APPEND*). 
*         APFL = LENGTH OF THE LOCAL FILE FOR *APPEND*. 
*              = 0, IF NOT *APPEND*.
*         SRB  = SPECIAL REQUEST BLOCK FOR THE ORIGINAL FILE FOR
*                *APPEND*.
* 
*         IF *APFL* = *LF*, THEN THE *APPEND* IS AT THE END OF
*         THE INDIRECT CHAIN. 
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMCMAC 
*CALL     COMCCMD 
*CALL     COMSMLS 
*CALL     COMSPFM 
*CALL     COMSPFU 
*CALL     COMSPRD 
*CALL     COMSRPV 
*CALL     COMSSSD 
*CALL     COMSSSJ 
          SPACE  4,10 
*         MACROS. 
  
  
 DELPFC   MACRO  LFN,SRB
          MACREF DELPFC 
          =4     LFN,,,,SRB,,,,,,,,27B
 DELPFC   ENDM
          SPACE  4,10 
****      ASSEMBLY CONSTANTS. 
  
  
 BUFL     EQU    10030B      BUFFER LENGTH FOR SINGLE BUFFER COPY 
 EIDF     EQU    400B        ERROR IDLE FLAG
****
          TITLE  FETS AND STORAGE LOCATIONS.
          ORG    120B 
          SPACE  4,10 
 FWA      BSS    0
  
*         FETS. 
  
  
 I        BSS    0           INPUT FILE 
 INPUT    FILEB  BUF,BUFL,FET=10D,EPR 
  
 O        BSS    0           OUTPUT FILE
 OUTPUT   FILEB  BUF,BUFL,FET=16D,EPR,UPR 
          SPACE  4,10 
*         STORAGE LOCATIONS.
  
  
 APFL     CON    0           APPEND ORIGINAL FILE LENGTH
 ERRF     CON    0           ERROR FLAG 
 FTCF     CON    0           FILE TRANSFER COMPLETE FLAG
 LENG     CON    0           FILE LENGTH
 LFAL     CON    0           LOCAL FILE ACCESS LEVEL
 LFNM     CON    0           LOCAL FILE NAME
 PFMC     CON    0           *PFM* COMMAND CODE 
          SPACE  4,10 
*         SPECIAL *PFM* COMMUNICATION FILE NAMES. 
  
  
 APFN     VFD    42/7L"APF",18/3  APPEND FILE NAME
 ILKN     VFD    42/7L"ILK",18/3  INTERLOCK FILE NAME 
 PFNM     VFD    42/7L"PFN",18/3  PERMANENT FILE NAME 
          SPACE  4,10 
*         *SSJ=* SPECIAL ENTRY POINT PARAMETER BLOCK. 
  
  
 SSJ=     VFD    12/0,24/-0,12/PFCS,12/IRSI 
          BSSZ   SSJL-1 
  
 LIB=     EQU    0           ALLOW WRITE ON EXECUTE-ONLY FILE 
  
 UTL=     EQU    0           ALLOW ACCESS TO SUSPECT DEVICE 
          TITLE  MAIN PROGRAM.
*         MAIN PROGRAM. 
  
  
 CPF      SB1    1           ENTRY
          RJ     PRS         PRESET 
          SA1    APFL 
          SA5    LENG        GET FILE LENGTH
          ZR     X1,CPF2     IF NOT *APPEND*
          IX5    X5-X1       SET ORIGINAL FILE LENGTH 
          ZR     X5,CPF1     IF *APPEND* AT END OF CHAIN
  
*         PROCESS COPY OF ORIGINAL FILE (*APPEND* ONLY).
  
          SA1    APFN        SET INPUT FILE NAME
          BX6    X1 
          SA6    I
          RJ     SBC         COPY PERMANENT FILE
          NZ     X1,CPF4     IF ERROR DETECTED
          SA1    I+FTFT      RESET BUFFER POINTERS
          SX6    X1 
          SA6    A1+B1
          SA6    A6+B1
          SA1    O+FTFT 
          SX6    X1 
          SA6    A1+B1
          SA6    A6+B1
          SA1    LFNM        SET LOCAL FILE NAME
          BX6    X1 
          SA6    I
 CPF1     SA5    APFL        GET FILE LENGTH
  
*         PROCESS FILE COPY (ALL FUNCTIONS).
  
 CPF2     RJ     SBC         COPY FILE
          NZ     X1,CPF4     IF ERROR DETECTED
          SX6    B1          SET FILE TRANSFER COMPLETE 
          SA6    FTCF 
          SA1    O+FTFT      CLEAR USER PROCESSING IN OUTPUT FET
          MX0    59 
          LX0    45 
          BX6    X0*X1
          SA6    A1 
          SA1    LFNM        REWIND LOCAL FILE
          BX6    X1 
          SA6    O
          REWIND O,R
          RJ     COS         CHECK OUTPUT FET STATUS
          NZ     X1,CPF4     IF ERROR DETECTED
          RJ     DOF         DELETE ORIGINAL FILE 
          SA1    ERRF 
          NZ     X1,CPF4     IF ERROR DETECTED
  
*         RETURN ALL *PFM* FILES. 
  
 CPF3     RECALL I
          RECALL O
          SA1    PFNM        RETURN PERMANENT FILE
          BX6    X1 
          SA6    O
          RETURN O,R
          SA1    ILKN        RETURN INTERLOCK FILE
          BX6    X1 
          SA6    O
          RETURN O,R
          SA1    APFL 
          ZR     X1,CPF4     IF NOT *APPEND*
          SA5    LENG 
          IX5    X5-X1
          ZR     X5,CPF4     IF *APPEND* TO END OF CHAIN
          SA1    APFN        RETURN APPEND FILE 
          BX6    X1 
          SA6    O
          RETURN O,R
  
*         SET REPLY TO *PFM*. 
  
 CPF4     SA1    ERRF        GET ERROR FLAG 
          SX6    B1 
          LX6    33 
          ZR     X1,CPF6     IF NO ERROR DETECTED 
          SA2    FTCF        CHECK FILE TRANSFER COMPLETE FLAG
          SA3    PFMC        CHECK COMMAND CODE 
          NZ     X2,CPF5     IF FILE TRANSFER COMPLETE
          SX2    X3-CCGT
          ZR     X2,CPF5     IF *GET* COMMAND 
          SX2    X3-CCOD
          ZR     X2,CPF5     IF *OLD* COMMAND 
          SX1    X1+EIDF     SET ERROR IDLE FLAG
 CPF5     LX1    24          ADD ERROR FLAG TO REPLY
          BX6    X1+X6
 CPF6     SA6    SPPR        SET *SPCW* 
          ENDRUN
          TITLE  SUBROUTINES. 
 COS      SPACE  4,20 
**        COS - CHECK OUTPUT FET STATUS,
* 
*         ENTRY  (O) = OUTPUT FET.
*                (PFMC) = *PFM* FUNCTION. 
* 
*         EXIT   (X1) = 0 IF NO ERROR STATUS IN FET.
*                     .NE. 0 IF ERROR SET IN FET. 
*                (ERRF) = ERROR FLAG SET IF ERROR SET IN FET. 
*                         SET TO *RETRY REQUEST* FOR WRITE ERROR
*                         ON *GET* AND *OLD* REQUESTS AND TO
*                         *MASS STORAGE ERROR* FOR WRITE ERROR
*                         ON OTHER REQUESTS.
*                         SET TO *TRACK LIMIT* FOR FULL DISK ERROR. 
*                         SET TO *PFM ABORTED* FOR ANY OTHER ERROR. 
* 
*         USES   X - 0, 1, 2, 6, 7. 
*                A - 1, 2, 6, 7.
  
  
 COS      SUBR               ENTRY/EXIT 
          SA2    O           OUTPUT FET 
          BX1    X1-X1
          LX2    59-0 
          PL     X2,COSX     IF FET BUSY
          LX2    59-13-59+0 
          NG     X2,COS1     IF FATAL ERROR 
          LX2    59-11-59+13
          NG     X2,COS2     IF PARITY ERROR
          LX2    59-10-59+11
          PL     X2,COSX     IF NO ERROR
  
*         PROCESS TRACK LIMIT ERROR.
  
          SX6    /ERRMSG/TKL *EQXXX,DNYY, TRACK LIMIT.* 
          EQ     COS3        SET ERROR FLAG 
  
*         PROCESS FATAL ERROR.
  
 COS1     SX6    /ERRMSG/ABT *PFM ABORTED.* 
          EQ     COS3        SET ERROR FLAG 
  
*         PROCESS PARITY ERROR. 
  
 COS2     SA1    PFMC        CHECK *PFM* FUNCTION 
          SX6    /ERRMSG/RTR RETRY REQUEST
          SX2    X1-CCGT
          ZR     X2,COS3     IF *GET* 
          SX2    X1-CCOD
          ZR     X2,COS3     IF *OLD* 
          SX6    /ERRMSG/MSE *EQXXX,DNYY, MASS STORAGE ERROR.*
  
*         SET ERROR FLAG AND CLEAR ERROR CODE FROM FET. 
  
 COS3     SA6    ERRF        SET ERROR FLAG 
          SA2    O           CLEAR ERROR CODE FROM FET
          MX0    56 
          LX0    10 
          BX7    X0*X2
          SA7    A2 
          BX1    X6 
          EQ     COSX        RETURN WITH (X1) .NE. 0
 ERR      SPACE  4,10 
**        ERR - *REPRIEVE* ERROR PROCESSOR. 
* 
* 
*         EXIT   (ERRF) = ERROR FLAG. 
*                TO *CPF3* TO RETURN *PFM* COMMUNICATION FILES. 
  
  
 ERR      BSS    0           ENTRY
          SX6    /ERRMSG/ABT *PFM ABORTED.* 
          SA6    ERRF        SET ERROR FLAG 
          EQ     CPF3        RETURN COMMUNICATION FILES 
  
  
 ERRA     RPVBLK ERR         REPRIEVE PARAMETER BLOCK 
 DOF      SPACE  4,10 
**        DOF - DELETE ORIGINAL FILE. 
* 
*         EXIT   *PFM* CALLED TO DELETE PFC ENTRY FOR ORIGINAL
*                FILE ON *APPEND* OPERATION.
*                (ERRF) = ERROR RETURNED FROM *PFM*.
* 
*         USES   X - 0, 1, 2, 6, 7. 
*                A - 1, 2, 6, 7.
* 
*         MACROS DELPFC.
  
  
 DOF      SUBR               ENTRY/EXIT 
          SA1    APFL 
          ZR     X1,DOFX     IF NOT *APPEND*
          SA2    LENG 
          IX6    X1-X2
          ZR     X6,DOFX     IF *APPEND* AT END OF CHAIN
          DELPFC O,SPPR+4 
          SA1    O           CHECK FOR ERROR
          MX0    -8 
          LX0    10 
          BX6    -X0*X1 
          ZR     X6,DOFX     IF NO ERROR
          BX7    X0*X1       CLEAR ERROR CODE FROM FET
          SA7    A1 
          LX6    0-10 
          SA6    ERRF        SAVE ERROR CODE
          EQ     DOFX        RETURN 
 SBC      SPACE  4,30 
**        SBC - SINGLE BUFFER COPY. 
* 
*         ENTRY  (X5) = LENGTH OF FILE. 
* 
*         EXIT   (X1) = 0 IF FILE COPY COMPLETE.
*                     .NE. 0 IF FILE COPY INCOMPLETE. 
*                (ERRF) = ERROR FLAG. 
* 
*         ERROR  WHEN READ PARITY ERROR DETECTED -
*                IF CORRECT SECTOR WAS READ, SET *DATA TRANSFER ERROR*
*                AND CONTINUE TRANSFER. 
*                IF INCORRECT SECTOR WAS READ, SET *FILE LENGTH 
*                ERROR* AND PAD OUTPUT FILE WITH EOF-S. 
* 
*         USES   X - ALL. 
*                A - 0, 1, 2, 3, 4, 6.
* 
*         CALLS  COS. 
* 
*         MACROS READCW, RECALL, WRITECW, WRITEW. 
* 
*         PROGRAMMER-S NOTE - WHEN CHECKING FOR FET COMPLETE AND
*         DATA IN THE BUFFER, THE FET STATUS MUST BE PICKED UP
*         BEFORE THE BUFFER POINTER.
* 
*         THIS ROUTINE IS ADAPTED FROM *SBC* IN *COPYB*.
  
  
 SBC      SUBR               ENTRY/EXIT 
          RECALL O
          WRITECW O,*        PRESET CONTROL WORD WRITE
          SA2    I+FTOT 
          SA0    X2+         INITIALIZE INPUT PSEUDO OUT POINTER
          BX0    X0-X0       INDICATE NO BLOCKS AVAILABLE OR COMPLETE 
          EQ     SBC9        INITIATE CONTROL WORD READ 
  
*         CHECK FOR INPUT BLOCK AVAILABLE.
  
 SBC1     SA2    I           CHECK INPUT FILE STATUS
          SA3    I+FTIN      CHECK INPUT IN = PSEUDO OUT POINTER
          BX0    X0-X0       INDICATE NO BLOCKS AVAILABLE OR COMPLETE 
          SX1    A0 
          IX1    X3-X1
          LX2    59-0 
          NZ     X1,SBC2     IF INPUT BLOCK AVAILABLE 
          PL     X2,SBC4     IF BUFFER BUSY 
          LX2    59-9-59+0
          NG     X2,SBC11    IF EOI 
          LX2    59-13-59+9 
          PL     X2,SBC1.1   IF NO FATAL ERROR
          SX1    /ERRMSG/ABT *PFM ABORTED.* 
          BX6    X1 
          SA6    ERRF        SET ERROR FLAG 
          EQ     SBCX        RETURN WITH (X1) .NE. 0
  
 SBC1.1   LX2    59-11-59+13
          PL     X2,SBC4     IF NO READ PARITY ERROR STATUS IN FET
          SX7    /ERRMSG/DTE *DATA TRANSFER ERROR*
          SA7    ERRF 
          SA1    I+6         CHECK DETAILED ERROR CODE
          LX1    59-11
          PL     X1,SBC1.2   IF CORRECT SECTOR READ 
          SX6    B1          SET LENGTH ERROR DUE TO HARDWARE FAILURE 
          SA6    SBCC 
          EQ     SBC11       PAD FILE WITH EOF-S
  
 SBC1.2   MX6    1           CLEAR PARITY ERROR BIT IN FET
          BX6    X2-X6
          LX6    59-59-59+11
          SA6    A2 
          EQ     SBC4        CONTINUE TRANSFER
  
*         PROCESS INPUT BLOCK.
  
 SBC2     SX0    B1          INDICATE INPUT BLOCK TRANSFERRED 
          SA3    SBCB        INCREMENT BLOCK COUNT
          SX4    B1          INDICATE DATA TRANSFERRED
          IX6    X3+X4
          SA4    A0          CRACK CONTROL WORD HEADER
          MX7    -24
          SA6    A3 
          BX7    -X7*X4      BYTE COUNT 
          SX2    4           CALCULATE WORD COUNT 
          IX7    X7+X2
          SX2    X2+B1
          IX7    X7/X2
          SA2    I+FTLM 
          SX3    X7+2        ADVANCE OVER BLOCK AND CONTROL WORDS 
          SX1    A0 
          SX2    X2+
          IX2    X2-X1
          IX6    X3-X2
          NG     X6,SBC3     IF NO WRAP AROUND
          SA2    I+FTFT      FIRST
          BX3    X6 
          SX1    X2 
 SBC3     IX6    X1+X3
          SA1    A0          GET CONTROL WORD HEADER
          PL     X1,SBC3.1   IF NO READ ERROR OCCURRED ON THIS BLOCK
          SX7    /ERRMSG/DTE *DATA TRANSFER ERROR*
          SA7    ERRF 
  
*         TRANSFER BLOCK TO OUTPUT. 
  
 SBC3.1   ZR     X5,SBC13    IF SUPPLIED PRU COUNT NOT ALREADY WRITTEN
          SX1    B1          DECREMENT PRU COUNT
          IX5    X5-X1
          SA6    O+FTIN      ADVANCE OUTPUT IN POINTER
          SA0    X6          ADVANCE INPUT PSEUDO OUT POINTER 
  
*         CHECK FOR REINITIATE CONTROL WORD WRITE.
  
 SBC4     SA1    O
          LX1    59-0 
          PL     X1,SBC6     IF BUFFER BUSY 
          RJ     COS         CHECK OUTPUT FILE STATUS 
          NZ     X1,SBCX     IF ERROR OCCURRED
          SA1    O+FTIN 
          SA2    A1+B1
          SX3    BUFL/3 
          IX1    X1-X2       (IN-OUT) 
          IX2    X1-X3       (IN-OUT) - 1/3(BUFFER SIZE)
          ZR     X1,SBC6     IF BUFFER EMPTY
          PL     X1,SBC5     IF IN .GT. OUT 
          LX3    1
          IX2    X3+X1       2/3(BUFFER SIZE) - (OUT-IN)
 SBC5     NG     X2,SBC6     IF BUFFER THRESHOLD NOT REACHED
          WRITECW O          REINITIATE CONTROL WORD WRITE
  
*         CHECK FOR OUTPUT BLOCK WRITTEN. 
  
 SBC6     SA1    O+FTOT      CHECK OUTPUT OUT = INPUT OUT 
          SA2    I+FTOT 
          IX3    X1-X2
          ZR     X3,SBC7     IF BLOCK NOT WRITTEN 
          BX6    X1 
          SX0    X0+1        INDICATE OUTPUT BLOCK COMPLETE 
          SA6    A2+         UPDATE INPUT OUT = OUTPUT OUT
  
*         CHECK FOR REINITIATE CONTROL WORD READ. 
  
 SBC7     SA4    I           CHECK INPUT FILE STATUS
          LX4    59-0 
          PL     X4,SBC10    IF BUFFER BUSY 
          SA1    I+FTIN 
          LX4    59-11-59+0 
          NG     X4,SBC10    IF PARITY ERROR STATUS IN FET
          LX4    59-3-59+11 
          NG     X4,SBC10    IF EOF/EOI ENCOUNTERED 
          LX4    59-13-59+3 
          NG     X4,SBC10    IF FATAL ERROR STATUS IN FET 
          SX3    BUFL/3      CHECK BUFFER THRESHOLD 
          SA2    A1+B1
          IX1    X1-X2       (IN-OUT) 
          IX2    X3+X1       1/3(BUFFER SIZE) + (IN-OUT)
          ZR     X1,SBC9     IF BUFFER EMPTY
          NG     X1,SBC8     IF OUT .GT. IN 
          LX3    1
          IX2    X1-X3       (IN-OUT) - 2/3(BUFFER SIZE)
 SBC8     PL     X2,SBC10    IF BUFFER THRESHOLD NOT REACHED
 SBC9     READCW I,0         INITIATE CONTROL WORD READ TO EOI
  
*         CHECK FOR RECALL. 
  
 SBC10    NZ     X0,SBC1     IF INPUT AND/OR OUTPUT BLOCKS TRANSFERRED
          RECALL             WAIT FOR DATA TRANSFER 
          EQ     SBC1        CHECK FOR INPUT BLOCKS 
  
*         PROCESS EOI.
  
 SBC11    ZR     X5,SBC14    IF NO FILE LENGTH ERROR
  
*         PROCESS INPUT FILE TOO SHORT. 
  
 SBC12    WRITEW O,SBCA,B1+B1  PAD FILE WITH EOF
          SX1    B1 
          IX5    X5-X1
          NZ     X5,SBC12    IF FILE NOT YET CORRECT LENGTH 
  
*         PROCESS INPUT FILE TOO LONG.
  
 SBC13    SX5    -1 
  
*         FLUSH OUTPUT BUFFER.
  
 SBC14    RECALL O
          RJ     COS         CHECK OUTPUT FILE STATUS 
          NZ     X1,SBCX     IF ERROR OCCURRED
          SA1    O+FTIN      CHECK IN = OUT 
          SA2    A1+B1
          IX1    X1-X2
          ZR     X1,SBC15    IF OUTPUT BUFFER EMPTY 
          WRITECW  O,R       FLUSH OUTPUT BUFFER
          RJ     COS         CHECK OUTPUT FILE STATUS 
          NZ     X1,SBCX     IF ERROR OCCURRED
  
*         PROCESS FILE LENGTH ERROR.
  
 SBC15    ZR     X5,SBCX     IF NO FILE LENGTH ERROR
          SA2    SBCC 
          SX6    /ERRMSG/FLE *FILE LENGTH ERROR*
          NZ     X2,SBC16    IF ERROR DUE TO HARDWARE FAILURE 
          SX6    X6+EIDF     SET ERROR IDLE FLAG
 SBC16    SA6    ERRF        SET ERROR FLAG 
          BX1    X6 
          EQ     SBCX        RETURN WITH (X1) = 0 
  
  
 SBCA     VFD    60/0        CONTROL WORD EOF 
          VFD    12/17B,48/0
  
 SBCB     CON    0           BLOCK COUNT
 SBCC     CON    0           LENGTH ERROR DUE TO HARDWARE FAILURE 
          SPACE  4,10 
*         COMMON DECKS. 
  
  
*CALL     COMCCIO 
*CALL     COMCCPM 
*CALL     COMCPFM 
*CALL     COMCSYS 
*CALL     COMCWTW 
          TITLE  BUFFERS. 
*         BUFFERS.
  
          USE    LITERALS 
  
 BUF      EQU    *           BUFFER FOR SINGLE BUFFER COPY
 BUFLWA   EQU    BUF+BUFL+4  END OF BUFFERS 
 PRS      TITLE  PRESET.
**        PRESET. 
* 
*         ENTRY  PARAMETER BLOCK FROM *PFM* AT *SPPR*.
* 
*         EXIT   INPUT AND OUTPUT FILE NAMES SET. 
*                RANDOM BITS SET IN OUTPUT FET. 
*                (APFL) = APPEND FILE LENGTH. 
*                (LENG) = TOTAL FILE LENGTH TO COPY.
*                (SPPR) PRESET WITH ERROR REPLAY FOR *PFM*. 
*                (LFNM) = LOCAL FILE NAME.
* 
*         USES   X - ALL. 
*                A - 1, 2, 6, 7.
* 
*         MACROS ABORT, MESSAGE, REPRIEVE.
  
  
 PRS      SUBR               ENTRY/EXIT 
          SA1    ACTR 
          ZR     X1,PRS1     IF NOT COMMAND CALL
          MESSAGE  (=C*INCORRECT COMMAND.*),,R
          ABORT 
  
 PRS1     REPRIEVE  ERRA,SET,277B  SET EXTENDED REPRIEVE
          SA1    SPPR        GET COMMAND CODE 
          MX0    -18
          BX6    -X0*X1 
          SA6    PFMC        SAVE COMMAND CODE
          SA1    A1+B1       GET LOCAL FILE NAME
          BX5    -X0*X1      SAVE INTERLOCK FLAG
          BX1    X0*X1
          SX6    3
          BX6    X1+X6
          BX1    X6 
          SA6    LFNM 
  
*         SET FILE NAMES IN FETS. 
  
          SA2    PFNM        GET PERMANENT FILE NAME
          SA4    PFMC        CHECK COMMAND CODE 
          SX3    X4-CCGT
          ZR     X3,PRS2     IF *GET* 
          SX3    X4-CCOD
          ZR     X3,PRS2     IF *OLD* 
          BX1    X2          SWITCH FILE NAMES
          BX2    X6 
 PRS2     BX6    X2          SET FILE NAMES 
          BX7    X1 
          SA6    I
          SA7    O
          SA1    SPPR+2      GET FILE LENGTHS 
          MX0    -24
          BX6    -X0*X1 
          AX1    24 
          BX7    -X0*X1 
          SA6    LENG 
          SA7    APFL 
          SA1    PRSA        PRESET ERROR REPLY 
          BX6    X1 
          SA6    SPPR 
          SA4    PFMC        CHECK COMMAND CODE 
          SX2    X4-CCGT
          ZR     X2,PRSX     IF *GET* 
          SX2    X4-CCOD
          ZR     X2,PRSX     IF *OLD* 
          SX1    EIDF        SET ERROR IDLE FLAG IN ERROR REPLY 
          LX1    24 
          BX6    X1+X6
          SA6    A6 
  
*         SET RANDOM REWRITE BITS.
  
          R=     X6,FGIA
          BX5    X6*X5
          NZ     X5,PRSX     IF SEQUENTIAL WRITE (AT END OF CHAIN)
          SX6    B1          SET RANDOM ACCESS BIT
          LX6    47-0 
          SA1    O+1
          BX6    X6+X1
          SA6    A1 
          SX6    B1          SET RANDOM REWRITE REQUEST 
          LX6    29-0 
          SA1    O+6
          BX6    X1+X6
          SA2    SPPR+3      GET RANDOM ADDRESS 
          BX6    X2+X6
          SA6    A1 
          EQ     PRSX        RETURN 
  
  
 PRSA     VFD    24/0,3/1,1/0,8//ERRMSG/ABT,24/0  ERROR REPLY 
          SPACE  4,10 
          ERRNG  MFL=-*      OVERFLOW PAST END OF BUFFERS 
          SPACE  4,10 
          IDENT 
  
  
 .1       SET    BUFLWA+77B  CALCULATE FIELD LENGTH 
  
*         SET IGNORE RESOURCE LIMITS FOR PROGRAM EXECUTION. 
*         FORCE *OVERRIDE REQUIRED* BIT TO BE SET.
*         PREVENT *DMP=* ON COMMAND CALL. 
*         DO NOT RELEASE EXTRA FIELD LENGTH ON LOAD.
  
 DMP=     EQU    .1/100B+320000B
 MFL=     EQU    .1/100B*100B 
          SPACE  4
          END 
