.TITLE TPC .SBTTL TPC -- Main loop .IDENT /HCS000/ .ENABLE MCL ; ; Tape copy from lun 1 to lun 2, imagemode with big buffers. ; ; Written by E.C.M. Beumer, March 1987 ; HCS Industrial Automation B.V. ; Apeldoorn (Holland) ; ; Allocate 2 buffers of size big enough to handle bru tapes ; and bounce data through it, using multiple I/O's ; Ignore errors. ; TPC:: QIOW$S #IO.WLB,#3,#3,,,,<#START,#STARTL,#40> MOV #5,R0 ; Start with 5 reads CLR R1 ; Start with no writes CLR R2 ; Start with no EOF's DIR$ #READ1 ; Read first buffers DIR$ #READ2 DIR$ #READ3 DIR$ #READ4 DIR$ #READ5 STSE$S #10. ; Wait until 2 eofs encountered STSE$S #11. ; Wait until writes finished QIOW$S #IO.WLB,#3,#3,,,,<#END,#ENDL,#40> QIOW$S #IO.RWD,#2,#2 ; Rewind output QIOW$S #IO.RWD,#1,#1 ; Rewind input QIOW$S #IO.WLB,#3,#3,,,,<#READY,#READYL,#40> EXIT$S .PAGE .SBTTL TPC -- Read handling RAST1: CLR R5 ; Set offset JMP COPY1 ; Jump to common code RAST2: MOV #2,R5 ; Set offset JMP COPY1 ; Jump to common code RAST3: MOV #4,R5 ; Set offset JMP COPY1 ; Jump to common code RAST4: MOV #6,R5 ; Set offset JMP COPY1 ; Jump to common code RAST5: MOV #10,R5 ; Set offset COPY1: DEC R0 ; Decrement read count CMP R2,#2 ; After EOT not interested BEQ 20$ MOV IOIN(R5),R3 ; Get iosb address CMPB (R3),#IE.ABO ; Read killed BEQ 20$ CMPB (R3),#IE.EOF ; 1 endfile seen BEQ 10$ CMPB (R3),#IE.EOV ; End of volume (2 eof on tape) seen BEQ 10$ CMPB (R3),#IE.EOT ; End of tape seen BEQ 10$ MOV WRITE(R5),R4 ; Point to DPB MOV 2(R3),Q.IOPL+2(R4) ; # chars received CLR R2 ; Indicate data found INC R1 ; Increment write count CLEF$S #11. ; Indicate writes not ready DIR$ WRITE(R5) ; Queue next write BR 20$ ; 10$: INC R1 ; Increment write count CLEF$S #11. ; Indicate writes not ready DIR$ WREOF(R5) ; Write EOF INC R2 ; Count eofs consecutive CMP R2,#2 ; Ready? BLT 20$ ; No SETF$S #10. ; Indicate ready TST R0 ; Any read's left? BEQ 20$ ; No QIO$S #IO.KILL,#1 ; Kill outstanding read's 20$: TST (SP)+ ; Clean up stack ASTX$S ; And exit from ast .PAGE .SBTTL TPC -- Write handling WAST1: CLR R5 ; Set offset JMP COPY2 ; Jump to common code WAST2: MOV #2,R5 ; Set offset JMP COPY2 ; Jump to common code WAST3: MOV #4,R5 ; Set offset JMP COPY2 ; Jump to common code WAST4: MOV #6,R5 ; Set offset JMP COPY2 ; Jump to common code WAST5: MOV #10,R5 ; Set offset COPY2: DEC R1 ; Decrement write count CMP R2,#2 ; 2 EOF's seen BEQ 10$ ; Yes, ready INC R0 ; Increment read count DIR$ READ(R5) ; Que read again BR 20$ 10$: TST R1 ; All writes finished? BNE 20$ ; No SETF$S #11. ; Indicate ready 20$: TST (SP)+ ; Clean up stack ASTX$S ; And exit from ast .PAGE .SBTTL TPC -- Data area .NLIST BEX ; READ: .WORD READ1,READ2,READ3,READ4,READ5 READ1: QIO$ IO.RLB,1,,,IOIN1,RAST1, READ2: QIO$ IO.RLB,1,,,IOIN2,RAST2, READ3: QIO$ IO.RLB,1,,,IOIN3,RAST3, READ4: QIO$ IO.RLB,1,,,IOIN4,RAST4, READ5: QIO$ IO.RLB,1,,,IOIN5,RAST5, ; IOIN: .WORD IOIN1,IOIN2,IOIN3,IOIN4,IOIN5 IOIN1: .BLKW 2 IOIN2: .BLKW 2 IOIN3: .BLKW 2 IOIN4: .BLKW 2 IOIN5: .BLKW 2 ; WRITE: .WORD WRITE1,WRITE2,WRITE3,WRITE4,WRITE5 WRITE1: QIO$ IO.WLB,2,,,IOOUT1,WAST1, ; WRITE WHAT WE READ WRITE2: QIO$ IO.WLB,2,,,IOOUT2,WAST2, WRITE3: QIO$ IO.WLB,2,,,IOOUT3,WAST3, WRITE4: QIO$ IO.WLB,2,,,IOOUT4,WAST4, WRITE5: QIO$ IO.WLB,2,,,IOOUT5,WAST5, ; WREOF: .WORD WREOF1,WREOF2,WREOF3,WREOF4,WREOF5 WREOF1: QIO$ IO.EOF,2,,,IOOUT1,WAST1 ; WRITE EOF WREOF2: QIO$ IO.EOF,2,,,IOOUT2,WAST2 WREOF3: QIO$ IO.EOF,2,,,IOOUT3,WAST3 WREOF4: QIO$ IO.EOF,2,,,IOOUT4,WAST4 WREOF5: QIO$ IO.EOF,2,,,IOOUT5,WAST5 ; IOOUT: .WORD IOOUT1,IOOUT2,IOOUT3,IOOUT4,IOOUT5 IOOUT1: .BLKW 2 IOOUT2: .BLKW 2 IOOUT3: .BLKW 2 IOOUT4: .BLKW 2 IOOUT5: .BLKW 2 ; BUFFR: .WORD BUFFR1,BUFFR2,BUFFR3,BUFFR4,BUFFR5 BUFFR1: .BLKB 4200. BUFFR2: .BLKB 4200. BUFFR3: .BLKB 4200. BUFFR4: .BLKB 4200. BUFFR5: .BLKB 4200. ; START: .ASCII /TPC -- Start of tape/ STARTL= .-START .EVEN END: .ASCII /TPC -- End of tape/ ENDL= .-END .EVEN READY: .ASCII /TPC -- Ready/ READYL= .-READY .EVEN .END TPC