.TITLE TCPY .IDENT /GCE001/ ;TAPE COPY FROM LUN 1 TO LUN 2, IMAGEMODE WITH ;BIG BUFFERS. ALLOCATE 1 BUFFER OF HUGE SIZE AND ;BOUNCE DATA THROUGH IT. IGNORE ERRORS. BUFFR: .BLKW 17000. ;SUITABLY GIANT BUFFER ; (HOPE NOBODY USES MORE THAN 32 KBYTES ;NO TAPE POSITIONING FIRST...USE TPP TO DO THAT. .MCALL EXIT$S,QIOW$S .GLOBL TCPY ETERR: .ASCII <15><12>/** ENDTAPE ERROR, IGNORED**/<15><12> ETERRL=.-ETERR .EVEN RWERR: .ASCII <15><12>/** READ ERROR SEEN **/<15><12> RWERRL=.-RWERR .EVEN ERR: .ASCII <15><12><7><7>/*** ERROR ***/ .ASCII / TAPE WRITE PROTECTED. TCPY ABORTED./<15><12> ERRE=.-ERR .EVEN IOIN: .WORD 0,0 IOOUT: .WORD 0,0 ;I/O STAT BLKS EOFFLG: .WORD 0 ;COUNTER OF EOF CHARS TCPY: QIOW$S #IO.RLB,#1,#1,,#IOIN,,<#BUFFR,#34000.>;READ A RECORD bcc 3990$ jmp lose 3990$: ; BCS LOSE ;LOSE IF NO DRIVER ;IOIN = BYTES SEEN ;CHECK FOR EOF, AND IF SEEN, COUNT IT AND WRITE TO OUTPUT TAPE. ;OTHERWISE WRITE DATA OUT. ON 2ND EOF, EXIT. .MACRO ETST ERR CMPB IOIN,#ERR BEQ DOEOF .ENDM ETST IE.EOF ;1 ENDFILE SEEN ; special version... ignore eot errors and consider only EOF ; ETST IE.EOV ;END OF VOLUME (2 EOF ON TAPE) SEEN ; ETST IE.EOT ;END OF TAPE SEEN CMPB IOIN,#IS.SUC BEQ 20$ cmpb ioin,#ie.eov beq 200$ ;report eov errors separately cmpb ioin,#ie.eot beq 200$ ; SAW SOME SORT OF ERROR. TELL USER. QIOW$S #IO.WVB,#5,#3,,,,<#RWERR,#RWERRL,#40> br 20$ 200$: qiow$s #io.wvb,#5,#3,,,,<#eterr,eterrl,#40> ; separate message for eot type errors 20$: CMPB IOIN,#IE.PRI BNE 1$ EXIT$S 1$: CLR EOFFLG ;SAY GOT DATA MOV IOIN+2,R0 ;GET BYTES READ IN QIOW$S #IO.WLB,#2,#2,,#IOOUT,,<#BUFFR,R0> ;WRITE WHAT WE READ CMPB IOOUT,#IE.WLK BEQ ERROUT BR TCPY DOEOF: QIOW$S #IO.EOF,#2,#2,,#IOOUT INC EOFFLG ;COUNT EOFS CONSECUTIVE CMP EOFFLG,#2 bge 6733$ jmp tcpy 6733$: ; BLT TCPY BR LOSE ERROUT: QIOW$S #IO.WVB,#5,#3,,,,<#ERR,#ERRE,#40> LOSE: EXIT$S .END TCPY