.TITLE MCP .IDENT /01/ ; ; COPYRIGHT (C) 1979 ; DIGITAL EQUIPMENT CORPORATION ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; AUTHOR: P. VAN OOSTRUM, MAY 1979. ; .ENABLE LC .SBTTL MACROS AND LOCAL DEFINITIONS .MCALL GCMLB$,GCML$ .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .MCALL FSRSZ$,FINIT$ .MCALL QIOW$,DIR$ .MCALL FDBDF$,FDAT$A,FDRC$A,FDOP$A,FDBF$A .MCALL NMBLK$ .MCALL OFNB$R,OFNB$W,GET$,PUT$,CLOSE$ ; .MCALL ALUN$,QIOW$,DIR$,EXIT$S ; .MACRO PRINT A,B,C MOV A,TIWLB+Q.IOPL MOV B,TIWLB+Q.IOPL+2 .IF NB C MOV C,TIWLB+Q.IOPL+4 .IFF MOV #40,TIWLB+Q.IOPL+4 .ENDC DIR$ #TIWLB .ENDM ; .MACRO DISPL A,B .PSECT TEXT $$1=. .ASCII \A\ $$2=.-$$1 .PSECT PRINT #$$1,#$$2,B .ENDM ; .MACRO MESSH A .PSECT TEXT $$1=. .PSECT MESS A: .WORD $$1 .ENDM .MACRO MESS A .PSECT TEXT $$1=. .IF NB ^"A" .ASCII "A" .IFF .ASCII " " .ENDC $$2=.-$$1 .PSECT MESS .WORD $$2 .ENDM .MACRO MESSE .PSECT MESS .WORD 0 .PSECT .ENDM .MACRO PRINTM M,?A,?B MOV #M,R0 MOV (R0)+,R1 A: MOV (R0)+,R2 BEQ B PRINT R1,R2 ADD R2,R1 ;UPDATE ADDRESS BR A B: .ENDM ; TILEN=72. ALU: ALUN$ 1,TI,0 TIWLB: QIOW$ IO.WLB,5,1,,TISB TIRLB: QIOW$ IO.RLB,5,1,,TISB,, TISB: .BLKW 2 TIBUF: .BLKB TILEN+2 .EVEN ; CLEN=82. CBUF: .BLKB CLEN FSRSZ$ 2 CSI$ CSIBLK: .BLKB C.SIZE GCLBLK: GCMLB$ 2,MCP,CBUF,1 DSPT=CSIBLK+C.DSDS CMD=GCLBLK+G.CMLD+2 CMDL=GCLBLK+G.CMLD ; .PSECT BUF BUFLEN=8192. .BLKB 2 ;MUST BE BEFORE RECBUF!! RECBUF: .BLKB BUFLEN+2 .EVEN .PSECT ; SWTAB: CSI$SW TM,TMMK,,,,TMSV,EXACT CSI$SW DENS,DENSMK,,,,DENSSV,EXACT CSI$SW RW,RWMK,NMASK,CLEAR,NEG ;REWIND CSI$ND ; EOFMK=2000 TMMK=4000 DENSMK=10000 RWMK=20000 ; DEFSW=RWMK ;DEFAULT SWITCH SETTING (/RW) ; INLUN=4 OUTLUN=3 FILTP=8. FILIN=8. FILOUT=16. EOT=1 ; TMSV: CSI$SV DECIMAL,SKIPF,2 CSI$ND DENSSV: CSI$SV DECIMAL,DENS,2 CSI$ND SKIPF: 0 DENS: 0 DENSTB: 800.,0 8.,0 556.,0 5.,0 1600.,4000 16.,4000 200.,2 2.,2 ;THIS MUST BE THE LAST ONE ; FDBIN: FDBDF$ FDRC$A ,RECBUF,BUFLEN FDOP$A INLUN,DSPT,FNB,FO.RD FDBF$A ; FDBOUT: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A ,RECBUF,BUFLEN FDOP$A OUTLUN,DSPT,FNB,FO.WRT FDBF$A ; FNB: NMBLK$ ,TMP,,SY ; MCPTYP: 0 MASK: 0 NMASK: 0 INFLAG: 0 RECLEN: 0 INDEV: 0 OUTDEV: 0 ERRCOD: 0 INOPEN: 0 OPOPEN: 0 INATT: 0 OUTATT: 0 OUTLEN: 0 EOFFLG: 0 DV: .BYTE 'M,0 ;FOR ALL MX: DEVICES (MT: MM:) INMT: 0 ;FLAG FOR INPUT DEVICE OUTMT: 0 ;FLAG FOR OUTPUT DEVICE ; .PAGE .SBTTL INITIALIZATION AND COMMAND LINE INPUT MCP:: FINIT$ DIR$ #ALU ;ASSIGN LUN FOR COMMAND INPUT ; REMCP: CLR MCPTYP CLR NMASK CLR DENS MOV #1,SKIPF ;SUPPLY DEFAULT FOR /TM MOV #DEFSW,MASK ;PRESET DEFAULT SWITCHES GCML$ #GCLBLK ;GET COMMAND LINE BCS CMDERX ;ERROR TST CMDL BEQ REMCP ;EMPTY LINE CMPB @CMD,#'? BEQ 10$ CSI$1 #CSIBLK,CMD,CMDL ;PARSE BCS CMDERR ;ERROR IN COMMAND CSI$2 #CSIBLK,INPUT,#SWTAB ;GET INPUT FILE BCS CMDER1 ;ERROR CALL OPENIN ;OPEN INPUT FILE BCS CMDER1 ;ERROR IN OPEN BIS CSIBLK+C.MKW1,MASK CSI$2 #CSIBLK,OUTPUT,#SWTAB ;GET OUTPUT FILE BCS CMDER2 ;ERROR CALL OPENOU ;OPEN OUTPUT FILE BCS CMDER2 BIS CSIBLK+C.MKW1,MASK ;GET SWITCHES BR SETUP 10$: JMP HELP ; .ENABL LSB CMDERX: CMPB GCLBLK+G.ERR,#GE.EOF ;END-OF-FILE ON COMMAND BNE CMDERR ;NO, ERROR EXIT$S CMDERR: DISPL BR 99$ CMDERS: DISPL BR 99$ CMDER1: DISPL BR 99$ CMDER2: DISPL ; 99$: PRINT CMD,CMDL JMP CLOFIL ;CLOSE OPENED FILES .DSABL LSB ; ; SET UP COPY PARAMETERS ; SETUP: BIC NMASK,MASK BIT #TMMK!DENSMK,MASK ;CHECK FOR /TM, /DENS BEQ 15$ ;JUMP IF NOT GIVEN CMP MCPTYP,#FILIN+FILOUT ;IS IT A FILE COPY? BEQ CMDERS ;YES, ILLEGAL SWITCH BIT #DENSMK,MASK ;/DENS SPECIFIED? BEQ 15$ ;NO MOV #DENSTB,R0 5$: CMP (R0),DENS ;SEARCH IN TABLE BEQ 10$ ;FOUND CMP (R0)+,(R0)+ ;IS IT THE LAST ONE? BNE 5$ ;NO, CONTINUE BR CMDERR ;YES, ILLEGAL VALUE 10$: MOV 2(R0),DENS ;GET MT: PARAMETER 15$: CLR EOFFLG JMP MCPLP ;TRANSFER ; .PAGE .SBTTL COPY LOOP .ENABLE LSB MCPLP: CALL GET ;READ A RECORD BCC 5$ JMP 90$ ;ERROR ON INPUT 5$: CMP INFLAG,#EOT ;END-OF-FILE? BNE 7$ JMP ENDFIL ;YES ; 7$: MOV RECLEN,OUTLEN ;SET DEFAULT OUTPUT CALL PUT ;WRITE THE RECORD BCS 80$ ;ERROR ON OUTPUT BR MCPLP ;NEXT RECORD ; ERREOF: 80$: ;ERROR ON OUTPUT ; DISPL BR 99$ ; 90$: ;ERROR ON INPUT ; DISPL ; 99$: PRINT CMD,CMDL MOV #ERNO,R0 CLR R2 MOVB ERRCOD,R1 CALL $CBDSG SUB #ERMSG,R0 ;LENGTH OF MESSAGE PRINT #ERMSG,R0 ; ; HERE FOR END-OF-FILE ; CLOFIL: ENDFIL: CALL CLOSOU CALL CLOSIN ;CLOSE FILES JMP REMCP .DSABL LSB ; ERMSG: .ASCII /ERROR CODE NO. / ERNO: .ASCII / / ERMSGL=.-ERMSG .EVEN .PAGE .SBTTL FILE OPEN AND CLOSE ; ; OPEN INPUT FILE ; OPENIN: MOV #FDBIN,R0 MOV #FDBIN+F.FNB,R1 MOV #DSPT,R2 MOV #FNB,R3 CALL .PARSE ;SET UP FILE NAME BLOCK BCS 20$ ;ERROR MOV N.DVNM(R1),INDEV ; MOV INDEV,R4 CALL CHKMT ;CHECK FOR SPECIAL DEVICE MOV R4,INMT ;SET FLAG BEQ 20$ ;YES, DON'T OPEN ADD #FILIN,MCPTYP ;INDICATE FILE INPUT OFNB$R #FDBIN ;OPEN INPUT FILE BCS 20$ ;ERROR INC INOPEN ;SET FLAG 20$: RETURN ; ; OPEN OUTPUT FILE ; OPENOU: MOV #FDBOUT,R0 MOV #FDBOUT+F.FNB,R1 MOV #DSPT,R2 MOV #FNB,R3 CALL .PARSE ;SET UP FILE NAME BLOCK BCS 20$ ;ERROR MOV N.DVNM(R1),OUTDEV ; MOV OUTDEV,R4 CALL CHKMT ;CHECK FOR SPECIAL DEVICE MOV R4,OUTMT ;SET FLAG BEQ 20$ ;YES, DON'T OPEN ADD #FILOUT,MCPTYP ;INDICATE FILE OUTPUT MOVB #R.VAR,FDBOUT+F.RTYP CLR FDBOUT+F.RSIZ MOVB #FD.CR,FDBOUT+F.RATT ;SET UP DEFAULT TYPE OFNB$W #FDBOUT ;OPEN OUTPUT FILE BCS 20$ ;ERROR INC OPOPEN ;SET FLAG 20$: RETURN ; ; CLOSE INPUT FILE ; .ENABL LSB CLOSIN: TST INOPEN ;IS FILE OPENED? BNE 5$ ;YES TST INMT ;MT: INPUT? BEQ 50$ ;YES, CHECK ATTACH BR 20$ ;NO, RETURN 5$: CLR INOPEN TST INMT ;MT:? BNE 10$ ;NO, FILE ; 50$: TST INATT ;WAS IT ATTACHED? BEQ 20$ ;NO, RETURN BIT #RWMK,MASK ; /RW? BEQ 52$ ;NO MOV #IO.RWD,R0 CALL INQIO ;REWIND 52$: MOV #IO.DET,R0 CALL INQIO ;DETACH CLR INATT BR 20$ ; 10$: CLOSE$ #FDBIN 20$: RETURN ; ; CLOSE OUTPUT FILE ; CLOSOU: TST OPOPEN ;IS FILE OPENED BEQ 40$ ;NO CLR OPOPEN TST OUTMT ;MT:? BEQ 55$ ;YES ; CLOSE$ #FDBOUT ;CLOSE FILE 30$: RETURN ; 40$: TST OUTMT BNE 20$ ;FILE OUTPUT 60$: TST OUTATT ;MT: ATTACHED BEQ 30$ ;NO BIT #RWMK,MASK ; /RW BEQ 62$ MOV #IO.RWD,R0 CALL OUQIO ;REWIND 62$: MOV #IO.DET,R0 CALL OUQIO ;DETACH CLR OUTATT BR 30$ ;RETURN 55$: BIT #EOFMK,NMASK ;/-EOF GIVEN? ** NOT IMPLEMENTED ** BR 60$ ;YES, DON'T WRITE TAPEMARK MOV #IO.EOF,R0 CALL OUQIO ;WRITE 2 TAPEMARKS BCS 80$ ;IF ERROR, STOP CALL OUQIO BCS 80$ MOV #IO.SPF,R0 ;SPACE BACKWARDS MOV #-1,QIOMT+Q.IOPL ;************ CALL OUQIO BCC 60$ ;O.K FINISHED 80$: TST (SP)+ ;DELETE RETURN ADDRESS JMP ERREOF .DSABL LSB ; .PAGE .SBTTL MT: QIO HANDLING ; OPEN FOR MT; MTOPN: MOV #IO.ATT,R0 CALL MTQIO ;ATTACH MT: BCS 9$ ;ERROR ON ATTACH BIT #RWMK,MASK ;REWIND? BEQ 5$ ;NO MOV #IO.RWD,R0 CALL MTQIO ;REWIND MT: BCS 9$ ;ERROR ON REWIND 5$: BIT #DENSMK,MASK ;/DENS SPECIFIED? BEQ 9$ ;NO MOV DENS,QIOMT+Q.IOPL ;SELECT DENSITY MOV #IO.STC,R0 CALL MTQIO 9$: RETURN MTWLB: MOV OUTLEN,QIOMT+Q.IOPL+2 OUQIO: MOV #OUTLUN,QIOMT+Q.IOLU MOV #RECBUF,QIOMT+Q.IOPL BR MTQIO INQIO: MOV #INLUN,QIOMT+Q.IOLU MOV #RECBUF,QIOMT+Q.IOPL ; MTQIO: MOV R0,QIOMT+Q.IOFN DIR$ #QIOMT BCS 20$ ;ERROR TSTB MTSB BMI 20$ ;ERROR CLC RETURN 20$: SEC ;RETURN ERROR CODE RETURN ; QIOMT: QIOW$ 0,0,1,,MTSB,, ; MTSB: .BLKW 2 ; SUBROUTINE CHKMT ; CHECK DEVICE NAME FOR SPECIAL NON FILES-11 DEVICE ; (E.G. MM: OR MT:), SPECIFIED IN DV ; IF THE SECOND BYTE OF DV IS 0, ONLY THE FIRST BYTE IS CHECKED ; SO ALL DEVICES MX: CAN BE TREATED AS SPECIAL ; CHKMT: TSTB DV+1 ;TEST IF GENERIC DEVICE BNE 10$ ;NO, NORMAL TEST BIC #^C377,R4 ;YES, DON'T CHECK SECOND BYTE 10$: CMP R4,DV ;IS IT SPECIAL DEVICE BNE 15$ ;NO, LEAVE WITH R4 .NE. 0 CLR R4 ;YES, LEAVE WITH R4=0 15$: RETURN .PAGE .SBTTL READ AND WRITE FILE ; ; READ A RECORD ; GET: CLR INFLAG CLR RECLEN ;RECORD LENGTH TST INMT ;MT: INPUT? BNE 20$ ;NO, FILE READ ; ; MT: INPUT ; TST INOPEN ;MT: OPENED BNE 5$ ;YES ; INC INATT MOV #INLUN,QIOMT+Q.IOLU CALL MTOPN ;OPEN MT: BCS 90$ ;ERROR INC INOPEN ;SET OPEN FLAG MOV #RECBUF,QIOMT+Q.IOPL MOV #BUFLEN,QIOMT+Q.IOPL+2 ; 5$: CMP EOFFLG,#2 ;DOUBLE TAPEMARK READ BLT 6$ ;NO DEC SKIPF ;COUNT IT BGT 6$ ;NOT YET FINISHED MOV #EOT,INFLAG ;INDICATE END OF TAPE BR 40$ 6$: MOV #IO.RLB,R0 CALL INQIO ;READ BCC 10$ ;O.K. CMPB #IE.EOF,MTSB ;EOF RECEIVED? BNE 90$ ;NO, ERROR INC EOFFLG ;YES, TAPEMARK BR 40$ ; 10$: CLR EOFFLG ;INDICATE NO TAPEMARK MOV MTSB+2,RECLEN ;RECORD LENGTH BR 40$ ; ; FILE READ ; 20$: CLR EOFFLG GET$ #FDBIN ;GET RECORD BCC 35$ ;O.K. CMPB FDBIN+F.ERR,#IE.EOF ;END-OF-FILE? BNE 80$ ;NO, ERROR MOV #EOT,INFLAG ;INDICATE END OF TAPE BR 40$ 35$: MOV FDBIN+F.NRBD,RECLEN ;UPDATE RECORD LENGTH BNE 40$ INC EOFFLG ;INDICATE TAPEMARK IF EMPTY RECORD ; 40$: CLC RETURN ; 80$: MOVB FDBIN+F.ERR,ERRCOD BR 95$ ; 90$: MOVB $DSW,ERRCOD BMI 95$ MOVB MTSB,ERRCOD ; 95$: SEC RETURN .PAGE ; ; WRITE A RECORD ; PUT: TST OUTMT ;MT: OUTPUT? BNE 20$ ;NO FILE ; ; MT: OUTPUT ; TST OPOPEN ;OPENED? BNE 5$ ;YES INC OUTATT MOV #OUTLUN,QIOMT+Q.IOLU CALL MTOPN ;OPEN MT: BCS 90$ ;ERROR INC OPOPEN ;SET OPEN FLAG ; 5$: MOV #IO.WLB,R0 TST EOFFLG ;TAPE MARK? BEQ 12$ ;NO MOV #IO.EOF,R0 CALL OUQIO ;WRITE TAPE MARK BR 40$ 12$: CALL MTWLB BCS 90$ ;ERROR RETURN ; ; FILE WRITE ; 20$: PUT$ #FDBOUT,,OUTLEN BCS 80$ ;ERROR 40$: RETURN ; 80$: MOVB FDBOUT+F.ERR,ERRCOD BR 95$ ; 90$: MOVB $DSW,ERRCOD BMI 95$ ;DSW ERROR MOVB MTSB,ERRCOD ; 95$: SEC RETURN ; HELP: PRINTM HELPM JMP REMCP MESSH HELPM MESS ^"Magtape Copy Program." MESS ^"Command format:" MESS ^"MCP>MM1:=MM0:/switches to copy MM0 to MM1" MESS ^"or ? to print this help message" MESS ^"switches: /DENS:m (m=800 or 1600) set density" MESS ^" default = current setting." MESS ^" /TM:n stop copying at the nth double tapemark" MESS ^" (k consecutive tapemarks count as k-1 double)" MESS ^" default = stop at first double tapemark." MESS ^" /-RW do not rewind the tapes" MESS ^" default = rewind before and after copying." MESS ^"If you have only one tape unit, you may use an intermediate file, e.g." MESS ^"MCP TEMP=MT0:" MESS ^"MCP MT0:=TEMP (default extension .TMP)" MESS ^"NOTE: An ANSI magtape contains a double tapemark for each" MESS ^" empty file." MESSE ; .END MCP