.
.         COPY COMMAND ACTIVITY
.
.
.         (C)  Copyright 1972-1978  John Walker
.
.         This software is in the public domain
.
          AXR$
          DEFUNCT$
          FANG
          PURE      CODE
.
COPY*     LX        X5,CDBPC,X8         LOAD LINK TO FIRST PARAMETER
          LA        A1,PBVAL,X5         LOAD FDT POINTER FOR INPUT FILE
          LMJ       A2,IOGET            BUILD AN I/O FCT
          LX,U      X10,,A0             SAVE INPUT FCT ADDRESS IN X10
          LX        X5,PBLINK,X5        LINK TO SECOND PARAMETER (OUTPUT FILE)
          LA        A1,PBVAL,X5         GET OUTPUT FDT POINTER
          LMJ       A2,IOGET            BUILD AN FCT FOR IT
          LX,U      X9,,A0              SAVE OUTPUT FCT ADDRESS IN X9
          LA,U      A3,0377777          GET TENATIVE BLOCK COUNT
          LX        X5,PBLINK,X5        LINK TO FINAL PARAMETER (COUNT)
          TZ        X5                  NULL PARAMETER ?
          LA        A3,PBVAL,X5         NO.  LOAD THE PARAMETER
          SA        A3,IOCOUNT,X10      STORE THE COUNT INTO THE INPUT FCT
OPTOOG    LA        A14,CDOPTS,X8       LOAD COMMAND OPTIONS
          TOP       A14,(OPTION('G'))   IS 'G' OPTION SET ?
          J         NOGOP               NO.  SKIP 'G' SETUP
          LA        A0,IOMASS,X10       LOAD MASS STORAGE ATTRIBUTE OF INPUT
          TNE       A0,IOMASS,X9        ARE INPUT AND OUTPUT DIFFERENT ?
          J         NOOD                NO.  IGNORE 'G' OPTION
          LA,U      A0,'G'              LOAD 'G' OUTPUT MODE
          SA        A0,IOOPT,X9         PUT IN OUTPUT FCT
          TNZ       IOMASS,X10          IS INPUT FROM TAPE ?
          SA        A0,IOOPT,X10        YES.  SET 'G' FORMAT INPUT TAPE
          LA,U      A0,1792             GET INPUT BLOCK SIZE
          TNZ       IOMASS,X10          UNLESS INPUT IS TAPE
          LA,U      A0,1794             IN WHICH CASE THEY'RE BIGGER
          SA        A0,IOBLEN,X10       SET READ BLOCK LENGTH
          LA,U      A0,0377777          LOAD MANY BLOCKS EXPECTED IN
          SA        A0,IOCOUNT,X10      SET INPUT FCT
          TZ        IOMASS,X9           IS OUTPUT FILE TAPE ?
          J         OPTELS              NO. DON'T NEED PREFIX BLOCK
.
.         Build the label block for @COPY,G format output tapes.
.
          BGET      IBDATA+28           ALLOCATE AN OUTPUT BUFFER
          la        a2,iofdt,x10        load input FDT
          dl        a3,fdqual,a2        load qualifier of input file
          ds        a3,cghqual,a0       store in file label
          dl        a3,fdfn,a2          load file name
          ds        a3,cghfn,a0         copy to file label
          sa        a0,a3               save label block from DATE$
          date$     .                   get time and date in useless format
          ds        a0,cghtd,a3         ...useless except for compatibility ??
          la        a0,fdeqt,a2         load equipment type of file
          sa        a0,cgheqt,a3        place in file label
          la        a0,fdhitrk,a2       load highest track referenced
          sa        a0,cghitrk,a3       place in label
          la        a0,('BLKSEQ')       load new format sentinel
          sa        a0,cghblks,a3       set in label block
          snonz     a0                  get spaces in A0
          la        a4,fdin+6,a2        load absolute F-cycle for file
          and,u     a4,07777            isolate from bottom third
          la,u      a4                  clear lower register
opghde    di,u      a4,10               extract next digit
          ssl       a0,6                move over accumulator
          aa,u      a5,'0'              convert to Fieldata
          ssc       a5,6                move to upper sixth
          aa        a0,a5               add into final number
          dsl       a4,36               move down for next divide
          jnz       a5,opghde           continue if more to edit
opgckr    and,u     a0,077              extract low character
          te,u      a1,' '              right justified yet ?
          j         opgrjd              yes.  all done
          ssc       a0,6                no.  shift over one character
          j         opgckr              keep on testing
.
opgrjd    sa        a0,cghafcyc,a3      set absolute cycle in label block
          la        a0,a3               restore address of label block
          la,u      a1,('>FANG<')       load fang was here sentinel
          lr,u      r1,(ibdata+28)-cghfang   get number of words to fill
          la,u      a3,cghfang,a3       get first word address
          lxi,u     a3,1                load increment to fill file
          bt        a3,,*a1             fill label with fangs
          LA        A1,('COPYG ')       LOAD FORMAT SENTINEL
          TZ        IOWAD,X10           CHECK INPUT FILE FORMAT
          LA        A1,('COPYGD')       SENTINEL FOR WAD COPY,G
          sa        a1,cghsentl,a0      set file type sentinel in block
          LNA,U     A1                  GET SENTINEL FOR FIRST BLOCK
          SA        A1,IBMSAD,A0        SET 'DON'T TREAD ON ME' FLAG
          SZ        IBSTAT,A0           SET READ STATUS NORMAL
          SX        X10,IBIOP,A0        SET I/O PACKET BACKPOINTER
          SZ        IBLAST,A0           HOPE THIS ISN'T LAST !
          LA,U      A1,IBQ,A0           LOAD ADDRESS OF DATA HEADER
          PUT       IOBB,X10            PUT ON READER BOUNDED BUFFER
          J         OPTELS              GO AND PROCESS THE COPY
.
NOGOP     TOP,U     A14,OPTION('M')     IS THE 'M' OPTION ON ?
          J         NOMOP               NO.  CHECK OTHER OPTIONS
          LA        A3,IOCOUNT,X10      LOAD CURRENT I/O COUNT
          TNZ       X5                  WAS COUNT IMPLIED BY MISSING PARAMETER ?
          LA,U      A3,1                YES.  IMPLIED COUNT FOR 'M' COPY IS 1
          SA        A3,IOCOUNT,X10      REPLACE COUNT IN INPUT FCT
          LA,U      A0,'M'              LOAD BY FILES OPTION CODE
          SA        A0,IOOPT,X10        SET INPUT TO COUNT FILES
          SA        A0,IOOPT,X9         SET OUTPUT TO COPY EOF MARKS
          J         OPTELS              PROCESS THE COPY
NOMOP     .
          TEP,U     A14,OPTION('Q')     TAPE SIMULATION MODE ?
          J         OPTELS              YES.  TREAT FILE AS A TAPE
.
.         NO OPTIONS SET:
.
.         TAPE => TAPE                  STOP AT EOF, DON'T COPY EOF MARK
.         TAPE => FILE                  DO A COPY,G
.         FILE => TAPE                  DO A COPY,G
.         FILE => FILE                  DUPLICATE FILE.  'D' OPTION OUTPUT
.
NOOD      LA,U      A14                 CLEAR ALL OPTIONS
          SZ        CDOPTS,X8           ALSO IN COMMAND WORD
          LA        A0,IOMASS,X10       LOAD MASS STORAGE FLAG
          TNE       A0,IOMASS,X9        DIFFERENT FROM THAT OF INPUT ?
          J         NOSAME              NO.  THEY'RE THE SAME MEDIA
          LA        A0,CDOPTS,X8        LOAD OPTION BITS
          OR        A0,(OPTION('G'))    TURN ON THE 'G' OPTION
          SA        A1,CDOPTS,X8        RESTORE OPTIONS IN PACKET
          J         OPTOOG              LOOK AGAIN
NOSAME    TNZ       IOMASS,X9           TAPE COPY ?
          J         OPTELS              YES.  NO OPTIONS REQUIRED
          LA,U      A0,1792             LOAD TRACK LENGTH BLOCKS FOR COPY
          SA        A0,IOBLEN,X10       MAKE IT GO FASTER !
          SZ        IODRAD,X10          START COPY AT ADDRESS ZERO
          LA,U      A0,0377777          LOAD MANY TRACK COUNT
          SA        A0,IOCOUNT,X10      PUT COUNT IN FCT
          LA        A0,CDOPTS,X8        LOAD COMMAND OPTIONS
          OR,U      A0,OPTION('R')      SET THE 'R' OPTION
          SA        A1,CDOPTS,X8        SO ADDRESS ISN'T CHANGED
          LA,U      A0,'D'              LOAD DUPLICATE ADDRESS MODE
          SA        A0,IOOPT,X9         SET OPTION ON OUTPUT
          J         OPTELS              PERFORM COPY
.
OPTELS    LMJ       A2,INPUT            START READER
          TNZ       IOMASS,X10          IS INPUT MASS STORAGE ?
          TOP       A14,(OPTION('G'))   IS 'G' OPTION SET ?
          J         GOSEW               NO.  SKIP FIRST TAPE BLOCK IGNORE
          GET       IOBB,X10            LOAD FIRST TAPE BLOCK
          TZ        IBSTAT,A1           NORMAL COMPLETION ?
          J         GOBUM               NO.  'G' OPTION BUMMER
          LA        A0,IBLEN,A1         LOAD LENGTH READ
          TE,U      A0,28               SHOULD BE 28 WORDS LONG
          J         GOBUM               IF NOT.  IT'S NOT COPY,G
          LA        A0,IBDATA,A1        LOAD SENTINEL READ
          TNE       A0,('COPYGD')       DOES SENTINEL INDICATE W.A.D. ?
          SNONZ      IOWAD,X10           YES.  SET INPUT FILE W.A.D. FORMAT
          TE        A0,('COPYG ')       COPY,G ?
          TNE       A0,('COPYGD')       OR COPY,G OF WAD FILE ?
          J         GOREL               YES.  THIS IS A VALID SENTINEL
          J         GOBUM               NO.  ERROR OUT THIS OPERATION
GOREL     BRELP     A1                  RELEASE THE BLOCK BUFFER
GOSEW     .
          LMJ       A2,OUTPUT           START WRITER
GOXEL     P         IOBB+QL,X9          WAIT FOR WRITER TO COMPLETE
          BRELP     X9                  RELEASE OUTPUT FCT
          BRELP     X10                 RELEASE INPUT FCT
          COMPLETE  .                   DONE WITH THIS COMMAND
.
.         'G' OPTION SENTINEL CHECK FAILED
.
GOBUM     BRELP     A1                  RELEASE THE BAD BLOCK BUFFER
          R$DIT     .                   ENTER EDITING MODE
          E$MSG     INVLBL              EDIT INVALID LABEL SENTINEL MESSAGE
          LA        A0,IOFDT,X10        LOAD FDT POINTER
          LMJ       X11,FIST            EDIT FILE AND STATEMENT NUMBER
          ZAP       .                   MARK FAILURE OF COMMAND
          SZ        IOCOUNT,X10         BRING READER TO A HALT
          LMJ       A2,SINK             DISPOSE OF INPUT BLOCKS
          J         GOXEL               WAIT FOR SINK TO STOP
.
          PURE      DATA
INVLBL    'INVALID LABEL FOR TAPE TO FILE COPY READ FROM !'
          END