.
. 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