.TITLE READTP -- READ LARGE BLOCKED TAPES .IDENT -000300- ; ; ABSTRACT: READTP ; THIS PROGRAM READS A TAPE ONTO A DISK FILE OR WRITES A DISK ; FILE TO TAPE WHICH HAS A LARGE BLOCK SIZE. ; ; OPERATING PROCEDURES: ; MCR>RUN READTAPE$ ; RTP>DEV:OUTFILE=DEV:INFILE ; RTP>^Z ; MCR> ; ; SWITCHES: ; ; /CO FILE IS TO BE CONTIGUOUS ; /RW I/O IS TO BE DONE WITH READ/WRITE MODE. ; THIS WILL NORMALLY BE SLOWER, BUT ; IF THE RECORD SIZE IS GREATER THAN 2048. ; THEN THIS WILL BE ABLE TO WRITE THE TAPE ; BY "SPANNING" RECORDS OVER BLOCKS. ; NOTE -- THIS SWITCH WILL MAKE THE FILE ; UNREADABLE TO ANYTHING BUT THIS ; PROGRAM, AND THE /RW SWITCH ; MUST BE SPECIFIED TO THIS PROGRAM ; TO READ A TAPE CREATED WITH THE ; /RW SWITCH. BEWARE!!!!!!!!!!!!! ; ; FILES: ; OUTFILE THE OUTPUT FILENAME (DEFAULTS TO SY0:.LST) ; INFILE THE INPUT FILENAME (DEFAULTS TO SY0:.LST) ; ; ERRORS: ; COMMAND STRING ERRORS ARE SELF-EXPLANATORY. IF AN ERROR ; OCCURRS ON THE FILES PROCESSED, THE ERROR CODE WILL BE ; PRINTED. ALL ERRORS ARE REPORTED TO TI: ONLY. ; ; LIMITATIONS: ; AS NOTED IN THE NOTE ABOVE UNDER "OPERATING PROCEDURES" ; ; WRITTEN: ; BRUCE C. WRIGHT ; CLINICAL EPIDEMIOLOGY LABORATORY ; DUKE UNIVERSITY MEDICAL CENTER ; DURHAM, N. C. 27710 ; 23-APR-77 ; ; MODIFIED: 08-MAY-78, -0.1.0-, BRUCE C. WRIGHT ; IMPROVED ERROR MESSAGES ; MODIFIED: 25-MAY-78, -0.2.0-, BRUCE C. WRIGHT ; PUT IN SUPPORT FOR READ/WRITE MODE ; MODIFIED: 27-MAY-78, -0.3.0-, BRUCE C. WRIGHT ; DON'T ALLOCATE 32767. BLOCKS FOR MAG TAPE FILES ; .SBTTL MACRO CALLS .MCALL EXIT$S,QIOW$ .MCALL OPNS$R,OPEN$W,CLOSE$,FINIT$ .MCALL GET$,PUT$,READ$,WRITE$,WAIT$ .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$ND .MCALL FDAT$R,FDRC$R,FDOP$R,FDBF$R,FDBK$R .MCALL FSRSZ$,FDBDF$,NMBLK$,BDOFF$ .MACRO ERROR STRING,LEN,SEV MOV STRING,R0 MOV LEN,R1 .IF IDN , CLR R2 .ENDC BR CMDQIO .ENDM .SBTTL PARAMETER SYMBOL DEFINITIONS BUFLEN = 2048. NUMBUF = 6. ;NUMBER OF MULTIPLE BUFFERS BDOFF$ DEF$L .SBTTL READ A COMMAND LINE .PSECT CODE,RO,I START: FINIT$ MOV SP,SPSAVE BEGIN: MOV SPSAVE,SP GCML$ #CMLBLK ;GET COMMAND LINE BCC GETOK ;SKIP IF GOTTEN OK. MOV #1,R2 ;ASSUME WE WILL LEAVE. CMPB CMLBLK+G.ERR,#GE.IOR BEQ CMDERR ;I/O ERROR CMPB CMLBLK+G.ERR,#GE.OPR BEQ CMDOPE ;OPEN ERROR CMPB CMLBLK+G.ERR,#GE.BIF BEQ CMDSYN ;SYNTAX ERROR CMPB CMLBLK+G.ERR,#GE.MDE BEQ CMDMAX ;MAX @ FILE DEPTH CMPB CMLBLK+G.ERR,#GE.EOF BNE CMDUNK ;EOF ON COMMAND FILE EXIT$S CMDERR: ERROR #M.ERR,#L.ERR,FATAL CMDOPE: ERROR #M.OPE,#L.OPE,CONT CMDSYN: ERROR #M.SYN,#L.SYN,CONT CMDMAX: ERROR #M.MAX,#L.MAX,CONT CMDPS1: ERROR #M.PS1,#L.PS1,CONT CMDPS2: ERROR #M.PS2,#L.PS2,CONT CMDUNK: ERROR #M.UNK,#L.UNK,FATAL CMDQIO: MOV R0,$QIOW+Q.IOPL+0 MOV R1,$QIOW+Q.IOPL+2 MOV #$QIOW,-(SP) CALL .DIRDL CLOSE$ #FDBIN CLOSE$ #FDBOUT TST R2 ;LEAVE YET? BEQ BEGIN ;NO EXIT$S .SBTTL PARSE THE COMMAND LINE GETOK: TST CMLBLK+G.CMLD BEQ BEGIN ;LOOP IF NULL INPUT LINE. CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCS CMDPS1 ;PRINT ERROR MESSAGE IF SYNTAX ERROR CSI$2 #CSIBLK,INPUT,#CSITAB BCS CMDPS2 ;PRINT ERROR MESSAGE IF TOO MANY SWITCHES FDAT$R #FDBIN,#R.VAR BIT #SW.RWM,SWORD ;READ/WRITE MODE? BEQ 10$ ;NO FDRC$R R0,#FD.RWM ;R/W MODE FDBK$R R0,#BUFFER,#1000,,#2 BR 15$ 10$: FDRC$R R0,#FD.PLC,#BUFFER,#BUFLEN FDBF$R R0,#2,#BUFLEN,#NUMBUF,#FD.RAH ; 15$: FDOP$R R0,#2,,#INDFN OPNS$R #FDBIN,,#CSIBLK+C.DSDS,,,,CMDOPN CSI$2 #CSIBLK,OUTPUT BCC 20$ JMP CMDPS2 20$: MOV FDBIN+F.RSIZ,R1 ;GET THE RECORD SIZE. BNE 25$ ;SKIP IF INITIALISED. MOV #1000,R1 ;OTHERWISE INITIALISE TO 512.. 25$: MOVB FDBIN+F.RATT,R2 ;GET RECORD ATTRIBUTES. BIC #FD.BLK,R2 ;FORCE RECORDS TO CROSS BLOCKS. CLR R4 ;DEFAULT EXPANSION - VOLUME DEFAULT BITB #FD.SQD!FD.REC,FDBIN+F.RCTL ;SEQUENTIAL? BEQ 30$ ;NO MOV #100.,R3 ;GET INITIAL ALLOC. MOV #-100.,R4 ;GET EXPANSION INCREMENT. BR 40$ ;AND SKIP CODE. 30$: MOV FDBIN+F.EFBK+2,R3 ;GET EOF BLOCK BMI 35$ ;BIG! TST FDBIN+F.EFBK ;> 65536? BEQ 40$ ;NO. 35$: MOV #32767.,R3 ;REALLY BIG! MOV #-200.,R4 ;GET EXTENSION SIZE IN BLOCKS 40$: BIT #SW.CON,SWORD ;CONTIGUOUS? BNE 50$ ;YES NEG R3 ;MAKE IT NEGATIVE (NONCONTIG.) 50$: FDAT$R #FDBOUT,FDBIN+F.RTYP,R2,R1,R3,R4 BIT #SW.RWM,SWORD ;READ/WRITE MODE? BEQ 60$ ;NO FDRC$R R0,#FD.RWM ;YES FDBK$R R0,#BUFFER,#4000,,#3 BR 65$ 60$: FDRC$R R0,,#BUFFER,#BUFLEN ; FDBF$R R0,#3,#BUFLEN,#NUMBUF,#FD.WBH ; 65$: FDOP$R R0,#3,,#OUTDFN OPEN$W #FDBOUT,,#CSIBLK+C.DSDS,,,,CMDOPN .SBTTL COPY THE FILE BIT #SW.RWM,SWORD ; BEQ LOOPG ;G/P MODE MOV #1000,R2 ;BUFFER LEN LOOPR: CLR R1 ;CLEAR BLOCK COUNT. READ$ #FDBIN,#BUFFER BCS 10$ WAIT$ R0 BCS 10$ ADD R2,R1 ;INC BUF LEN READ$ R0,#BUFFER+1000 BCS 10$ WAIT$ R0 BCS 10$ ADD R2,R1 READ$ R0,#BUFFER+2000 BCS 10$ WAIT$ R0 BCS 10$ ADD R2,R1 READ$ R0,#BUFFER+3000 BCS 10$ WAIT$ R0 BCS 10$ WRITE$ #FDBOUT BCS EOFMOD WAIT$ R0 BCC LOOPR BR EOFMOD 10$: TST R1 ;ANYTHING TO TRANSFER? BEQ EOFMOD ;NO CMPB F.ERR(R0),#IE.EOF ;EOF? BEQ 20$ ;YES TST @#$DSW ;DSW ERROR? BGT 11$ ;NO MOV @#$DSW,F.ERR(R0) ;MOVE IN ERROR CODE 11$: MOV R1,-(SP) ;SAVE R1 MOV #M.IOR,R1 ; MOV #L.IOR,R2 CALL .PRFCS ;PRINT ERROR MESSAGE MOV (SP)+,R1 ;RECOVER R1 20$: WRITE$ #FDBOUT,,R1 ;TRANSFER IT BCS EOFMOD WAIT$ R0 BCS EOFMOD CLOSE$ #FDBIN MOV #FDBOUT,R0 CALL .TRNCL JMP BEGIN LOOPG: GET$ #FDBIN BCS EOFMOD PUT$ #FDBOUT,FDBIN+F.NRBD+2,FDBIN+F.NRBD BCC LOOPG BR EOFMOD .SBTTL PRINT ERROR MESSAGES EOFMOD: ; ; THE ERROR HANDLING ROUTINE. ; IF AN END-OF-FILE IS DETECTED, THE PROGRAM JUST EXITS. ; CMPB F.ERR(R0),#IE.EOF BNE CMDOPN CLOSE$ #FDBIN MOV #FDBOUT,R0 CALL .TRNCL JMP BEGIN CMDOPN: MOV #M.IOR,R1 ;GET I/O ERROR MSG MOV #L.IOR,R2 ;AND LENGTH TST @#$DSW ;DSW ERROR? BGT 10$ ;NO MOV @#$DSW,F.ERR(R0) ;MOVE IN ERROR CODE 10$: CALL .PRFCS ; CLOSE$ #FDBIN ; MOV #FDBOUT,R0 CALL .TRNCL JMP BEGIN ;AND RESTART .SBTTL ERROR MESSAGE STRINGS .PSECT PDATA,RO,D .NLIST BIN M.ERR: .ASCII "RTP -- I/O ERROR ON @ FILE" L.ERR = .-M.ERR .EVEN M.OPE: .ASCII "RTP -- OPEN ERROR ON @ FILE" L.OPE = .-M.OPE .EVEN M.SYN: .ASCII "RTP -- SYNTAX ERROR FOR @ FILE" L.SYN = .-M.SYN .EVEN M.MAX: .ASCII "RTP -- MAX @ FILE DEPTH EXCEEDED" L.MAX = .-M.MAX .EVEN M.UNK: .ASCII "RTP -- UNKNOWN COMMAND ERROR" L.UNK = .-M.UNK .EVEN M.PS1: .ASCII "RTP -- SYNTAX ERROR" L.PS1 = .-M.PS1 .EVEN M.PS2: .ASCII "RTP -- ILLEGAL SWITCH" L.PS2 = .-M.PS2 .EVEN M.IOR: .ASCII /RTP/ L.IOR = .-M.IOR .EVEN .SBTTL DATA AREA .PSECT IDATA,RW,D CSITAB: CSI$SW RW,SW.RWM,SWORD,SET,NEG CSI$SW CO,SW.CON,SWORD,SET,NEG CSI$ND SWORD: .WORD 0 SW.RWM = 000001 ;READ/WRITE MODE SW.CON = 000002 ;CONTIGUOUS FILE CMLBLK: GCMLB$ 1,RTP,USRBUF,1 USRBUF: .BLKB 82. .EVEN CSI$ .EVEN CSIBLK: .BLKB C.SIZE FSRSZ$ 3,S.BFHD+512.+<2*NUMBUF*> .PSECT IDATA,RW,D FDBIN: FDBDF$ INDFN: NMBLK$ ,LST,,SY,0 FDBOUT: FDBDF$ OUTDFN: NMBLK$ ,LST,,SY,0 .EVEN SPSAVE: .WORD 0 BUFFER: .BLKB BUFLEN .EVEN $QIOW: QIOW$ IO.WVB,4,4,,,,<0,0,40> .END START