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