ASMB,R,L,C
      HED (FMGR) CO..: COPY COMMAND 
*     NAME:    CO.. 
*     SOURCE:  92070-18015
*     RELOC:   92070-16015
*     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 CO..,7 92070-1X015 REV.2014 800409
* 
      ENT CO..
* 
      EXT IF.ER, CK.NM, CLR.C, DR.CT, CR.LU 
      EXT F.SET, FM.ER, MSC.
      EXT I.BUF, O.BUF, N.OPL, G0.. 
      EXT CREAT, PURGE, COPYF 
      EXT .ENTR, .MVW, IFBRK
      SUP 
      SKP 
* 
*     DESCRIPTION 
* 
*     THIS IS THE COPY COMMAND OF THE RTE-L FMGR
*     SEE ERS FOR DETAILS.
* 
*     PROCESSES:
* 
*     CO,SLU,DLU,OPT,FIRST,LAST,MSC 
* 
*     WHERE:
* 
*     SLU IS A NAMR OR CRN OF THE SOURCE CARTRIDGE
* 
*     DLU IS THE DESTINATION CARTRIDGE
* 
*     OPT IS THE OPTIONS
* 
*     FIRST IS THE FIRST FILE TO BE TRANSFERRED (OPTIONAL)
* 
*     LAST IS THE LAST FILE TO BE TRANSFERRED (OPTIONAL)
* 
*     MSC IS THE MASTER SECURITY CODE (OPTIONAL)
* 
*     POSSIBLE ERRORS:
* 
*     -14    DIRECTORY FULL 
*     -33    CARTRIDGE OUT OF ROOM
*      21    ILLEGAL LU 
*      22    COPY TERMINATED
*      51    BAD MASTER SECURITY CODE 
*      56    BAD PARAMETER
* 
*     COPY OPTIONS: 
* 
*      C     CLEAR DESTINATION CARTRIDGE BEFORE COPY
*            (REQUIRES MSC) 
*      D     DUMP FILE EVEN IF EXISTING 
*      E     ELIMINATE EXTENTS
*      P     PURGE SOURCE FILE AFTER COPY 
*            (MAY REQUIRE MSC)
*      V     VERIFY COPY
      SKP 
* 
*     ENTRY 
* 
N     NOP 
LIST  NOP 
ER    NOP 
* 
CO..  NOP           ENTRY POINT 
      JSB .ENTR 
      DEF N 
* 
*     PROCESS REQUEST 
* 
      CLA           ZERO OUT SOME VARIABLES 
      STA CLRSW 
      STA DMPSW 
      STA ELISW 
      STA PURSW 
      STA VERSW 
      STA MORE
* 
*     PARSE FIRST PARAMETER (SOURCE)
* 
      LDA LIST,I    GET TYPE OF FIRST PARAMETER 
      ISZ LIST
      CPA .3        IF ASCII, 
      JMP ASCII      THEN GO SET MASK 
* 
      JSB F.SET     SET UP DEFAULT MASK 
      DEF *+2 
      DEF DFALT 
* 
      LDA LIST,I    GET SOURCE CRN
      JMP CO..1      AND CONTINUE 
* 
ASCII JSB F.SET     SET UP MASK 
      DEF *+2 
      DEF LIST,I
* 
      LDA N.OPL+1   GET CRN FROM SUBPARAMETER BUFFER
* 
CO..1 STA SLU       SAVE SOURCE CARTRIDGE ID
      JSB CR.LU     TEST FOR LEGAL ID 
      DEF *+2 
      DEF SLU 
* 
      SZA,RSS       IF NOT LEGAL ID,
      JMP ER21       THEN TAKE ERROR RETURN 
* 
      CMA,INA       NEGATE
      STA SLU        AND SAVE 
      SKP 
* 
*     PARSE SECOND PARAMETER (DESTINATION)
* 
      LDB LIST      GET LIST ADDRESS
      ADB .3        BUMP TO DESTINATION ID
      LDA B,I       GET TYPE
      CPA .3        IF ASCII
      JMP ER56       THEN TAKE ERROR EXIT 
* 
      INB           BUMP TO ID
      LDA B,I        GET IT 
      STA DLU         SAVE IT 
* 
      JSB CR.LU     TEST FOR LEGAL ID 
      DEF *+2 
      DEF DLU 
* 
      SZA,RSS       IF NOT LEGAL ID,
      JMP ER21       THEN TAKE ERROR EXIT 
* 
      CMA,INA       NEGATE
      STA DLU        AND SAVE 
      CPA SLU       IF SAME AS SOURCE LU, 
      JMP ER21       THEN TAKE ERROR EXIT 
      SKP 
* 
*     PARSE THIRD PARAMETER (OPTIONS) 
* 
      LDB LIST      GET LIST ADDRESS
      ADB .7         BUMP TO OPTIONS
      LDA B,I       GET TYPE
      SZA,RSS       IF NOT SUPPLIED,
      JMP CONT       THEN CONTINUE
* 
      INB           BUMP TO INFO
      CLE,ELB        CONVERT INTO BYTE COUNTER
      LDA N6        GET LOOP COUNTER
      STA COUNT      SAVE 
* 
PARSE CLE,ERB       GET ADDRESS AND SET E TO BYTE 
      LDA B,I       GET 2 CHARACTERS
      ELB,SLB       IF LOW BYTE,
      ALF,ALF        THEN SHIFT TO HIGH BYTE
      AND NB400     ISOLATE HIGH BYTE 
      ADA .32        PUT SPACE INTO LOW BYTE
* 
      CPA .SP       IF SPACE, 
      JMP PARS1      THEN IGNORE
* 
      CPA .C        IF OPTION C,
      JMP SET.C      THEN SET CLEAR SWITCH
* 
      CPA .D        IF OPTION D,
      JMP SET.D      THEN SET DUMP SWITCH 
* 
      CPA .E        IF OPTION E,
      JMP SET.E      THEN SET ELIMINATE SWITCH
* 
      CPA .P        IF OPTION P,
      JMP SET.P      THEN SET PURGE SWITCH
* 
      CPA .V        IF OPTION V,
      JMP SET.V      THEN SET VERIFY SWITCH 
* 
      JMP ER56      ELSE TAKE ERROR EXIT
* 
SET.C ISZ CLRSW     SET CLEAR SWITCH
      JMP PARS1      AND CONTINUE 
* 
SET.D ISZ DMPSW     SET DUMP SWITCH 
      JMP PARS1      AND CONTINUE 
* 
SET.E ISZ ELISW     SET ELIMINATE SWITCH
      JMP PARS1      AND CONTINUE 
* 
SET.P ISZ PURSW     SET PURGE SWITCH
      JMP PARS1      AND CONTINUE 
* 
SET.V ISZ VERSW     SET VERIFY SWITCH 
* 
PARS1 INB           INCREMENT BYTE COUNT
      ISZ COUNT     IF NOT DONE,
      JMP PARSE      THEN CONTINUE PARSE
      SKP 
* 
*     PARSE FOURTH PARAMETER (FIRST FILE) 
* 
CONT  LDB LIST      GET LIST ADDRESS
      ADB .11        BUMP TO FOURTH PARAMETER 
* 
      LDA B,I       GET THE TYPE
      CPA .1        IF NUMERIC, 
      JMP ER56       THEN INDICATE BAD PARAMETER
* 
      INB           BUMP TO 2 CHARS 
      LDA B,I        GET THEM 
      STA FIRST       AND SAVE THEM 
* 
      INB           BUMP TO NEXT 4 CHARS
      DLD B,I        GET THEM 
      DST FIRST+1     AND SAVE THEM 
* 
*     PARSE FIFTH PARAMETER (LAST FILE) 
* 
      LDB LIST      GET LIST ADDRESS
      ADB .15        BUMP TO FIFTH PARAMETER
* 
      LDA B,I       GET THE TYPE
      CPA .1        IF NUMERIC, 
      JMP ER56       THEN INDICATE BAD PARAMETER
* 
      INB           BUMP TO 2 CHARS 
      LDA B,I        GET THEM 
      STA LAST        AND SAVE THEM 
* 
      INB           BUMP TO NEXT 2 CHARS
      DLD B,I        GET THEM 
      DST LAST+1      AND SAVE THEM 
      SKP 
* 
*     PARSE SIXTH PARAMETER (MSC) 
* 
      LDB LIST      GET LIST ADDRESS
      ADB .19        BUMP TO SIXTH PARAMETER
* 
      LDA B,I       GET THE TYPE
      SZA,RSS        IF NOT PRESENT,
      JMP BDMSC       THEN BAD MASTER SECURITY CODE 
* 
      STB MSECU     SAVE P.RAM ADDRESS FOR MSC
* 
      JSB MSC.      TEST PASSED MASTER SECURITY CODE
      DEF *+2 
      DEF MSECU,I 
* 
      SZA,RSS       IF BAD SECURITY CODE, 
      JMP ER51       THEN TAKE ERROR EXIT 
* 
BDMSC STA MSECU     SAVE STATUS 
      SKP 
* 
*     CLEAR DESTINATION IF REQUESTED
* 
      LDA CLRSW     GET CLEAR SWITCH
      SZA,RSS       IF NOT REQUESTED, 
      JMP COPY6      THEN CONTINUE
* 
      LDA MSECU     GET MSC STATUS
      SZA,RSS       IF NOT CORRECT MSC, 
      JMP ER51       THEN TAKE ERROR EXIT 
* 
      JSB CLR.C     CLEAR DESTINATION 
      DEF *+2 
      DEF DLU 
* 
      CPA .60       IF CLEAR NOT PERMITTED, 
      JMP EXIT       THEN TAKE GOOD EXIT
* 
      SZA           IF ANY OTHER ERROR, 
      JMP EREX       THEN TAKE ERROR EXIT 
      SKP 
* 
*     START TRANSFER LOOP 
* 
COPY6 JSB DR.CT     READ IN PSEUDO DIRECTORY
      DEF *+8 
      DEF SLU 
      DEF NAME
      DEF DIRMX 
      DEF DIRLN 
      DEF MORE
      DEF FIRST 
      DEF LAST
* 
      LDA DIRLN     GET DIRECTORY LENGTH
      SZA,RSS       IF EMPTY, 
      JMP GTMOR      THEN GET MORE
* 
      CLA           SET COUNTER TO ZERO 
      STA CUR        AND SAVE 
* 
COPY1 LDA CUR       CALCULATE DIRECTORY OFFSET
      ALF,ARS        MULTIPLY BY 8
      ADA ANAME       ADD TO BASE ADDRESS 
* 
      LDB AFNAM     GET ADDRESS OF LOCAL COPY 
      JSB .MVW      MOVE 8 WORDS
      DEF .8
      NOP           (FOR COMPATIBILITY) 
* 
      JSB CK.NM     CHECK IF FILE IS BOOTEX 
      DEF *+3 
      DEF FNAME 
      DEF "BOOT 
* 
      SEZ,RSS       IF FILE WAS "BOOTEX", 
      JMP IGNOR      THEN IGNORE IT 
* 
      LDA FTYPE     GET FILE TYPE 
      SZA,RSS       IF NON-DISC FILE, 
      JMP IGNOR      THEN IGNORE IT 
* 
      JSB FM.ER     PRINT OUT FILE NAME 
      DEF *+4 
      DEF .1
      DEF FNAME 
      DEF .3
* 
      JSB IFBRK     TEST FOR BREAK
      DEF *+1 
      SSA,RSS       IF NO BREAK,
      JMP COPY2      THEN CONTINUE
* 
      LDA .22       INDICATE COPY TERMINATED
      JMP ABEND 
* 
COPY2 LDA ELISW     GET ELIMINATE-SWITCH
      SZA           IF SET, 
      JMP ELIM       THEN CALCULATE NEW SIZE
* 
      LDA FSIZE     GET FILE SIZE (IN BLOCKS) 
      JMP CO..3 
* 
ELIM  LDA FEXTS     GET NUMBER OF EXTENTS 
      INA            ADD ONE
      MPY FSIZE      MULTIPLY BY FILE SIZE (IN BLOCKS)
* 
CO..3 STA SZ        SAVE FILE SIZE FOR CREAT
      LDA FRECL     GET FILE RECORD LENGTH
      STA SZ+1      SAVE FOR CREAT
      SKP 
* 
*     CREATE DESTINATION FILE 
* 
CRIT  JSB CREAT     TRY CREATING DESTINATION FILE 
      DEF *+8 
      DEF O.BUF 
      DEF IERR
      DEF FNAME 
      DEF SZ
      DEF FTYPE 
      DEF FSEC      USE WILDCARD SECURITY CODE
      DEF DLU 
* 
      CPA N2        IF DUPLICATE FILE ERROR,
      JMP DMPIT      THEN TEST FOR DUMP-MODE
* 
      CPA N33       IF NOT ENOUGH ROOM, 
      JMP ABEND      THEN ABEND 
* 
      CPA N14       IF DIRECTORY FULL,
      JMP ABEND      THEN ABEND 
* 
COPY7 JSB IF.ER     IF ANY OTHER ERROR, 
      DEF *+3        THEN PRINT MESSAGE 
      DEF IERR
      DEF IGNOR       AND IGNORE
      JMP CPYIT     OTHERWISE GO COPY FILE
* 
*     PURGE DESTINATION FILE (IF DUMP MODE) 
* 
DMPIT LDB DMPSW     GET DUMP SWITCH 
      SZB,RSS       IF NOT DUMP-MODE, 
      JMP COPY7      THEN PRINT MESSAGE 
* 
      JSB PURGE     TRY TO PURGE OLD DESTINATION FILE 
      DEF *+6 
      DEF O.BUF 
      DEF IERR
      DEF FNAME 
      DEF FSEC      PURGE ONLY IF WILDCARD MATCHES
      DEF DLU 
* 
      JSB IF.ER     IF ERROR, 
      DEF *+3        THEN PRINT MESSAGE 
      DEF IERR
      DEF IGNOR       AND IGNORE
      JMP CRIT       ELSE GO CREATE IT
      SKP 
* 
*     COPY A FILE 
* 
CPYIT JSB COPYF     USE COPYF ROUTINE 
      DEF *+11
      DEF I.BUF 
      DEF IERR
      DEF FNAME 
      DEF FSEC      USE WILDCARD SECURITY CODE
      DEF SLU 
      DEF O.BUF 
      DEF FNAME 
      DEF FSEC      USE WILDCARD SECURITY CODE
      DEF DLU 
      DEF VERSW 
* 
      SZA,RSS       IF NO ERROR,
      JMP PRGIT      THEN CONTINUE
* 
*     PURGE DESTINATION FILE (IF NOT FULLY COPIED)
* 
      JSB PURGE     TRY TO PURGE DESTINATION FILE 
      DEF *+6 
      DEF O.BUF 
      DEF SZ        USE FOR DUMMY ERROR CODE
      DEF FNAME 
      DEF FSEC      USE WILDCARD SECURITY CODE
      DEF DLU 
* 
      LDA IERR      GET ERROR CODE AGAIN
      CPA N33       IF NOT ENOUGH ROOM, 
      JMP ABEND      THEN TERMINATE ABNORMALLY
* 
      CPA N14       IF DIRECTORY FULL,
      JMP ABEND      THEN TERMINATE ABNORMALLY
* 
      CPA N49       IF VERIFY FAILED, 
      JMP ABEND      THEN TERMINATE ABNORMALLY
* 
      JSB IF.ER     IF ANY OTHER ERROR, 
      DEF *+3        THEN PRINT MESSAGE 
      DEF IERR
      DEF IGNOR     AND IGNORE IT 
      SKP 
* 
*     PURGE SOURCE FILE (IF REQUESTED)
* 
PRGIT LDA PURSW     GET PURGE SWITCH
      SZA,RSS       IF NOT REQUESTED, 
      JMP IGNOR      THEN IGNORE PURGE REQUEST
* 
      LDA MSECU     GET MSC STATUS FLAG 
      LDB N.OPL     GET PASSED SECURITY CODE
      SZA,RSS       IF NOT CORRECT MSC, 
      STB FSEC       THEN OVERRIDE SAVED SECURITY CODE
* 
      JSB PURGE     TRY TO PURGE SOURCE FILE
      DEF *+6 
      DEF I.BUF 
      DEF IERR
      DEF FNAME 
      DEF FSEC      USE WILDCARD OR PASSED SECURITY CODE
      DEF SLU 
* 
      JSB IF.ER     IF ERROR, 
      DEF *+3        THEN PRINT MESSAGE 
      DEF IERR
      DEF IGNOR       AND IGNORE PURGE REQUEST
      SKP 
* 
*     DO ANOTHER FILE 
* 
IGNOR LDA CUR       GET CURRENT NUMBER
      INA            INCREMENT
      STA CUR         AND SAVE
      CPA DIRLN     IF FINISHED,
      JMP GTMOR      THEN LOOK FOR MORE 
      JMP COPY1      ELSE DO ANOTHER
* 
*     TEST FOR MORE FILES 
* 
GTMOR LDA MORE      GET MORE FLAG 
      SZA           IF MORE,
      JMP COPY6      THEN GO READ IN ANOTHER HANDFUL
* 
*     FINISHED WITH FILES WITHOUT ANY ERRORS, 
*     SET 1P TO 0 AND RETURN
* 
      CLA           SET 1P PARAMETER TO ZERO
      STA G0..+41 
      JMP EXIT      AND RETURN
      SKP 
* 
*     ABNORMAL TERMINATION OF COPY (BY BR, INTERNAL ERROR, VERIFY 
*     OR DESTINATION FULL), ERROR CODE IS IN A-REG, 
*     SET 10G TO CURRENT FILE AND EXIT
* 
ABEND LDB FNAME     SET 10G PARAMETER TO CURRENT NAME 
      STB G0..+41 
* 
      LDB FNAME+1 
      STB G0..+42 
* 
      LDB FNAME+2 
      STB G0..+43 
      JMP EREX
      SKP 
* 
*     EXIT
* 
EXIT  CLA           NO ERROR
      JMP EREX
* 
ER21  LDA .21       ILLEGAL LU
      JMP EREX
* 
ER51  LDA .51       BAD MASTER SECURITY CODE
      JMP EREX
* 
ER56  LDA .56       BAD PARAMETER 
* 
EREX  STA ER,I      SAVE ERROR
      JMP CO..,I     AND RETURN 
      SKP 
* 
*     STORAGE AREA
* 
.1    DEC 1 
.3    DEC 3 
.7    DEC 7 
.8    DEC 8 
.11   DEC 11
.15   DEC 15
.19   DEC 19
.21   DEC 21
.22   DEC 22
.32   DEC 32
.51   DEC 51
.56   DEC 56
.60   DEC 60
* 
N2    DEC -2
N49   DEC -49 
N6    DEC -6
N14   DEC -14 
N33   DEC -33 
* 
NB400 OCT -400
* 
.C    ASC 1,C 
.D    ASC 1,D 
.E    ASC 1,E 
.P    ASC 1,P 
.V    ASC 1,V 
.SP   ASC 1,
* 
"BOOT ASC 3,BOOTEX
DFALT ASC 3,------
* 
DIRMX DEC 42        MAX NUMBER OF ENTRIES (LESS 8) IN NAME ARRAY
* 
ANAME DEF NAME
AFNAM DEF FNAME 
* 
FNAME NOP           - 
      NOP           ! LOCAL COPY
      NOP           !  OF CURRENT 
FTYPE NOP           !   FILE
FEXTS NOP           !    ENTRY
FSIZE NOP           ! 
FRECL NOP           ! 
FSEC  NOP           - 
* 
COUNT NOP           COUNTER 
CUR   NOP           COUNTER 
MORE  NOP           FLAG FOR MORE FILES IN DIRECTORY
* 
CLRSW NOP           CLEAR-SWITCH
DMPSW NOP           DUMP-SWITCH 
ELISW NOP           ELIMINATE-SWITCH
PURSW NOP           PURGE-SWITCH
VERSW NOP           VERIFY-SWITCH 
MSECU NOP           MSC STATUS FLAG 
* 
SLU   NOP           SOURCE LU 
DLU   NOP           DESTINATION LU
* 
DIRLN NOP           CURRENT LENGTH OF DIRECTORY 
IERR  NOP           ERROR RETURN CODE 
SZ    NOP           SIZE ARRAY FOR CREATE (AND DUMMY ERROR) 
      NOP 
* 
FIRST BSS 3         FIRST FILE TO BE TRANSFERRED
LAST  BSS 3         LAST FILE TO BE TRANSFERRED 
* 
NAME  BSS 400       DIRECTORY OF SELECTED FILES 
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                    