        .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,<BUFFR1,4200.>
READ2:  QIO$    IO.RLB,1,,,IOIN2,RAST2,<BUFFR2,4200.>
READ3:  QIO$    IO.RLB,1,,,IOIN3,RAST3,<BUFFR3,4200.>
READ4:  QIO$    IO.RLB,1,,,IOIN4,RAST4,<BUFFR4,4200.>
READ5:  QIO$    IO.RLB,1,,,IOIN5,RAST5,<BUFFR5,4200.>
;
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,<BUFFR1> ; WRITE WHAT WE READ
WRITE2: QIO$    IO.WLB,2,,,IOOUT2,WAST2,<BUFFR2>
WRITE3: QIO$    IO.WLB,2,,,IOOUT3,WAST3,<BUFFR3>
WRITE4: QIO$    IO.WLB,2,,,IOOUT4,WAST4,<BUFFR4>
WRITE5: QIO$    IO.WLB,2,,,IOOUT5,WAST5,<BUFFR5>
;
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
