ASMB,R,L,C
      HED (FMP) COPYF: COPY A FILE TO ANOTHER (VERBATIM)
*     NAME:    COPYF
*     SOURCE:  92071-18318
*     RELOC:   92071-16318
*     PGMR:    E.D.B. 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM COPYF,7 92071-1X318 REV.2041 800619 
* 
      ENT COPYF 
* 
      EXT OPEN, CLOSE, READF, WRITF, RWNDF
      EXT RWND$, RFLG$
      EXT .ENTR, LIMEM, MIN0, .CMW
      SUP 
      SKP 
* 
*     DESCRIPTION 
* 
*     THIS ROUTINE WILL COPY THE CONTENTS OF A FILE INTO
*     ANOTHER FILE. IF IOPT IS NON-ZERO, WRITES TO THE
*     DESTINATION FILE ARE VERIFIED BY A READ AFTER WRITE.
* 
*     CALLING SEQUENCE: 
* 
*     CALL COPYF(IDCB,IERR,INAME,ISEC,ICR,
*                JDCB,JNAME,JSEC,JCR,IOPT)
* 
*     WHERE:
* 
*     IDCB   IS THE DATA CONTROL BLOCK (144-WORD ARRAY) TO BE USED
*            FOR ACCESSING THE INPUT FILE 
* 
*     IERR   WILL BE THE ERROR RETURN CODE
* 
*     INAME  IS THE 6-CHARACTER FILE NAME (3-WORD ARRAY) OF THE 
*            INPUT FILE 
* 
*     ISEC   IS THE EXPECTED SECURITY CODE OF THE INPUT FILE
* 
*     ICR    IS THE INPUT FILE CARTRIDGE IDENTIFIER 
* 
*     JDCB   IS THE DATA CONTROL BLOCK (144-WORD ARRAY) TO BE USED
*            FOR ACCESSING THE OUTPUT FILE
* 
*     JNAME  IS THE 6-CHARACTER FILE NAME (3-WORD ARRAY) OF THE 
*            OUTPUT FILE
* 
*     JSEC   IS THE EXPECTED SECURITY CODE OF THE OUTPUT FILE 
* 
*     JCR    IS THE OUTPUT FILE CARTRIDGE IDENTIFIER
* 
*     IOPT   IS THE COPY OPTION WORD: 
*             BIT    MEANING
*             ---    -------
*              0     =0 DONT VERIFY COPY OPERATION
*                    =1 VERIFY COPY OPERATION 
*              1     =0 USE BUFFERS IN DCBS 
*                    =1 USE MEMORY BEHIND PROGRAM (LIMEM) 
*             15     =0 DON'T TRUNCATION DESTINATION FILE 
*                    =1 TRUNCATION DESTINATION FILE 
* 
*     POSSIBLE ERRORS:
* 
*     -49  COPYF VERIFY FAILED
* 
      SKP 
* 
*     ENTRY 
* 
IDCB  NOP 
IERR  NOP 
INAME NOP 
ISEC  NOP 
ICR   NOP 
JDCB  NOP 
JNAME NOP 
JSEC  NOP 
JCR   NOP 
IOPT  NOP 
* 
COPYF NOP           ENTRY POINT 
      JSB .ENTR 
      DEF IDCB
      SKP 
* 
*     PROCESS REQUEST 
* 
      LDA IOPT,I    GET OPTION WORD 
      RAR,SLA       IF CAN USE MEMORY BEHIND PROGRAM, 
      RSS            THEN CONTINUE
      JMP NOME1      ELSE USE INTERNAL BUFFERS
* 
      JSB LIMEM     GET MEMORY BEHIND PROGRAM 
      DEF *+4 
      DEF .1
      DEF IBUF
      DEF BLKS
* 
      LDB BLKS      GET NUMBER OF WORDS 
      ASR 7          CONVERT TO BLOCKS
      LDA IOPT,I    GET OPTION WORD 
      SLA           IF VERIFY,
      BRS            THEN DIVIDE IN 2 
      STB BLKS      SAVE
      ADB N2        COMPARE WITH 2 BLOCKS 
      SSB           IF NOT AT LEAST 2 BLOCKS, 
      JMP NOMEM      THEN USE INTERNAL BUFFERS
* 
      LDA BLKS      GET BUFFER SIZE IN BLOCKS 
      ASL 7          CONVERT TO WORDS 
      ADA IBUF        ADD TO IBUF 
      STA JBUF         AND SAVE 
      JMP OPNIT     CONTINUE
* 
NOMEM JSB LIMEM     RETURN UNUSED MEMORY
      DEF *+2 
      DEF N1
* 
NOME1 LDA IDCB      USE PACKING BUFFER
      ADA .16        FROM INPUT FILE
      STA IBUF      SAVE BUFFER ADDRESS 
* 
      LDA JDCB      USE PACKING BUFFER
      ADA .16        FROM OUTPUT FILE 
      STA JBUF      SAVE BUFFER ADDRESS 
* 
      CLA,INA       USE ONE BLOCK 
      STA BLKS       BUFFER SIZE
      SKP 
* 
*     OPEN SOURCE AND DESTINATION FILES 
* 
OPNIT JSB OPEN      OPEN SOURCE FILE
      DEF *+7 
      DEF IDCB,I
      DEF IERR,I
      DEF INAME,I 
      DEF .5        USE TYPE 1 ACCESS 
      DEF ISEC,I
      DEF ICR,I 
* 
      SSA           IF ERROR, 
      JMP EREX       THEN EXIT
* 
      JSB OPEN      OPEN DESTINATION FILE 
      DEF *+7 
      DEF JDCB,I
      DEF IERR,I
      DEF JNAME,I 
      DEF .4        USE TYPE 1 ACCESS 
      DEF JSEC,I
      DEF JCR,I 
* 
      SSA           IF ERROR, 
      JMP EREX       THEN TAKE ERROR
* 
      CLA            SET FILES TO MAIN EXTENT 
      STA IEXT
      STA JEXT
* 
      LDA IDCB      GET SOURCE FILE SIZE (CHEAT FOR SPEED)
      ADA .5
      LDA A,I 
      ARS           CONVERT TO BLOCKS 
      STA ISIZE     SAVE FOR LATER USE
      STA SIZE1      AND FOR TRANSFER 
* 
      LDA JDCB      GET DESTINATION FILE SIZE 
      ADA .5
      LDA A,I 
      ARS           CONVERT TO BLOCKS 
      STA JSIZE     SAVE FOR LATER USE
      STA SIZE2      AND FOR TRANSFER 
* 
      LDA N2        SET MAXIMUM VERIFY FAIL COUNT 
      STA FCNT
      SKP 
* 
*     COPY AN EXTENT FROM SOURCE TO DESTINATION 
* 
READ  JSB MIN0      FIND LARGEST COMPATIBLE BUFFER SIZE 
      DEF *+4 
      DEF BLKS
      DEF SIZE1 
      DEF SIZE2 
* 
      CMA,INA 
      STA NSIZE     SAVE FOR POSSIBLE BACK UP 
      LDB SIZE1     SUBTRACT FROM SIZE1 
      ADB A 
      STB SIZE1      AND SAVE 
      LDB SIZE2     SUBTRACT FROM SIZE2 
      ADB A 
      STB SIZE2      AND SAVE 
* 
      CMA,INA       RE-NEGATE TRANSFER LENGTH 
      ASL 7          CONVERT TO WORDS 
      STA IL          AND SAVE FOR TRANSFER 
* 
RREAD JSB READF     READ A BUFFER IN TYPE 1 MODE
      DEF *+6 
      DEF IDCB,I
      DEF IERR,I
      DEF IBUF,I
      DEF IL
      DEF LEN 
* 
      SSA           IF ANY ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
* 
      JSB WRITF     WRITE A BUFFER IN TYPE 1 MODE 
      DEF *+5 
      DEF JDCB,I
      DEF IERR,I
      DEF IBUF,I
      DEF LEN 
* 
      SSA           IF ANY ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
* 
      LDA IOPT,I    GET VERIFY OPTION 
      SLA,RSS       IF NO VERIFY, 
      JMP CONT       THEN CONTINUE
      SKP 
* 
*     ATTEMPT TO VERIFY WRITE OPERATION 
* 
      LDB IDCB      GET INPUT DCB ADDRESS 
      ADB .14       BUMP TO RECORD NUMBER 
      LDA B,I       GET IT
      ADA NSIZE     SUBTRACT BUFFER SIZE
      STA B,I        AND SAVE AGAIN 
* 
      JSB READF     READ A BUFFER IN TYPE 1 MODE
      DEF *+6 
      DEF IDCB,I
      DEF IERR,I
      DEF IBUF,I
      DEF IL
      DEF LEN 
* 
      LDB JDCB      GET OUTPUT DCB ADDRESS
      ADB .14       BUMP TO RECORD NUMBER 
      LDA B,I       GET IT
      ADA NSIZE     SUBTRACT BUFFER SIZE
      STA B,I        AND SAVE AGAIN 
* 
      JSB READF     READ A BUFFER IN TYPE 1 MODE
      DEF *+6 
      DEF JDCB,I
      DEF IERR,I
      DEF JBUF,I
      DEF IL
      DEF LEN 
* 
      SSA           IF ANY ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
* 
      LDA IBUF      FETCH INPUT BUFFER ADDRESS
      LDB JBUF      FETCH OUTPUT BUFFER ADDRESS 
      JSB .CMW      COMPARE BUFFERS FOR EQUALITY
      DEF IL
      NOP           (FOR MICROCODE COMPATIBILITY) 
      JMP CONT      IF EQUAL, THEN CONTINUE 
* 
      NOP           IF NOT EQUAL, 
      ISZ FCNT       THEN IF NOT TOO MANY FAILS,
      RSS             THEN CONTINUE 
      JMP ER49        ELSE TAKE ERROR EXIT
* 
      LDB IDCB      GET INPUT BUFFER ADDRESS
      ADB .14       BUMP TO RECORD NUMBER 
      LDA B,I       GET IT
      ADA NSIZE     SUBTRACT BUFFER SIZE
      STA B,I        AND SAVE 
* 
      LDB JDCB      GET OUTPUT BUFFER ADDRESS 
      ADB .14       BUMP TO RECORD NUMBER 
      LDA B,I       GET IT
      ADA NSIZE     SUBTRACT BUFFER SIZE
      STA B,I        AND SAVE 
* 
      JMP RREAD     AND ATTEMPT TO REREAD 
      SKP 
* 
*     TEST FOR END OF EXTENT AND END OF FILE
* 
CONT  LDA SIZE1     GET REMAINING BLOCKS IN SOURCE FILE 
      SZA           IF EXTENT EXHAUSTED,
      JMP CONT1 
* 
      ISZ IEXT      INCREMENT EXTENT NUMBER 
      JSB RWNDX     TRY NEXT EXTENT 
      DEF *+6 
      DEF IDCB,I
      DEF IERR,I
      NOP 
      DEF IEXT
      DEF .1        FOR READ ONLY 
* 
      CPA N5        IF EXTENT NOT FOUND,
      JMP CLSIT      THEN FINISH UP 
* 
      SSA           IF ANY OTHER ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
* 
      LDA ISIZE     RESET FILE SIZE COUNTER 
      STA SIZE1 
* 
CONT1 LDA SIZE2     GET REMAINING BLOCKS IN DESTINATION FILE
      SZA           IF EXTENT NOT EXHAUSTED,
      JMP READ       THEN DO ANOTHER CHUNK
* 
      ISZ JEXT      INCREMENT EXTENT NUMBER 
      JSB RWNDX     TRY NEXT EXTENT 
      DEF *+6 
      DEF JDCB,I
      DEF IERR,I
      NOP 
      DEF JEXT
      DEF ZERO
* 
      SSA           IF ANY ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
* 
      LDA JSIZE     RESET FILE SIZE COUNTER 
      STA SIZE2 
      JMP READ       AND DO ANOTHER CHUNK 
      SKP 
* 
*     CLOSE SOURCE AND DESTINATION FILES
* 
CLSIT JSB CLOSE     CLOSE SOURCE FILE 
      DEF *+3 
      DEF IDCB,I
      DEF IERR,I
* 
      CLA           PREPARE FOR TRUNCATION
      LDB IOPT,I    GET OPTION WORD 
      SSB,RSS       IF TRUNCATION NOT DESIRED,
      STA SIZE2      THEN CLEAR TRUNCATION PARAMETER
* 
      JSB CLOSE     CLOSE DESTINATION FILE
      DEF *+4 
      DEF JDCB,I
      DEF IERR,I
      DEF SIZE2     TRUNCATION PARAMETER
* 
      JMP EREX      AND RETURN
* 
*     EXIT
* 
ER49  LDA N49       VERIFY ERROR
* 
EREX  STA IERR,I    SAVE ERROR
      JSB LIMEM     RETURN BUFFER SPACE 
      DEF *+2 
      DEF N1
* 
      LDA IERR,I     GET ERROR CODE AGAIN 
      JMP COPYF,I    AND RETURN 
      SKP 
* 
*     REWIND TO A SPECIFIC EXTENT 
* 
XDCB  NOP 
XERR  NOP 
      NOP 
XEXT  NOP 
XRFLG NOP 
* 
RWNDX NOP 
      JSB .ENTR     GET PARAMETERS
      DEF XDCB
* 
      JSB RWNDF     REWIND SOURCE FILE
      DEF *+3 
      DEF XDCB,I
      DEF XERR,I
* 
      SSA           IF ERROR, 
      JMP XEREX      THEN TAKE ERROR EXIT 
* 
      LDA XEXT,I    GET PASSED EXTENT NUMBER
      LDB XRFLG,I   GET PASSED READ FLAG
      STB RFLG$      AND SAVE 
      LDB XDCB      GET THE DCB ADDRESS 
      JSB RWND$     MOVE TO CORRECT EXTENT
      NOP           IGNORE ERROR RETURN 
* 
      STA XERR,I    SAVE ERROR CODE 
XEREX JMP RWNDX,I    AND RETURN 
      SKP 
* 
*     STORAGE AREA
* 
ZERO  NOP 
* 
.1    DEC 1 
.4    DEC 4 
.5    DEC 5 
.14   DEC 14
.16   DEC 16
* 
N1    DEC -1
N2    DEC -2
N5    DEC -5
N49   DEC -49       VERIFY FAILED 
* 
IL    NOP           REQUESTED TRANSFER LENGTH 
LEN   NOP           ACTUAL TRANSFER LENGTH
* 
IBUF  NOP           INPUT FILE BUFFER ADDRESS 
JBUF  NOP           OUTPUT FILE BUFFER ADDRESS
BLKS  NOP           NUMBER OF AVAILABLE BLOCKS
SIZE1 NOP           REMAINING BLOCKS IN SOURCE EXTENT 
SIZE2 NOP           REMAINING BLOCKS IN DESTINATION EXTENT
* 
IEXT  NOP           SOURCE FILE NUMBER OF EXTENTS 
JEXT  NOP           DESTINATION FILE NUMBER OF EXTENTS
ISIZE NOP           SOURCE FILE EXTENT SIZE 
JSIZE NOP           DESTINATION FILE EXTENT SIZE
* 
FCNT  NOP           VERIFY FAIL COUNT 
NSIZE NOP           NEGATIVE BUFFER SIZE
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                                    