1
0
mirror of https://github.com/PDP-10/its.git synced 2026-05-25 06:40:45 +00:00
Files
PDP-10.its/src/clib/c10tap.cmid
2018-10-23 19:37:16 +02:00

197 lines
3.0 KiB
Plaintext

;
; C10TAP - MAG TAPE INTERFACE
;
; This file is ITS dependent.
;
TITLE C10TAPE
.INSRT NC
.INSRT NM
TAPIN==17 ; TAPE CHANNEL
TPIBSZ==200 ; SIZE OF TAPE INPUT BUFFER
TPBFSZ==2000 ; SIZE OF TAPE OUTPUT BUFFER
CENTRY RWND8 ; REWIND TAPE, LEAVE OPEN FOR READ
.CLOSE TAPIN,
.OPEN TAPIN,[033726,,(SIXBIT/MT0/)]
CROAK UNABLE TO OPEN TAPE FOR READING
MOVE 0,[TAPIN,,[1]]
.MTAPE 0,
JFCL
SETZM CURBLOCK
RETURN
CENTRY OPEN8 ; OPEN TAPE FOR 8-BIT READ
MOVE A,TAPECH
CAILE A,0
GO OP$RTN
CALL RWND8
SETZM TPICNT
SETZM TPIEOF
SETOM CURBLOCK
MOVEI 0,1
MOVEM 0,TAPECH
OP$RTN: RETURN
CENTRY OPNW8 ; OPEN TAPE FOR 8-BIT WRITE
CALL RWND8
.OPEN TAPIN,[033707,,(SIXBIT/MT0/)]
CROAK UNABLE TO OPEN TAPE FOR WRITING
MOVEI A,2*TPBFSZ
MOVEM A,TPICNT
MOVE A,[442000,,TPIBUF]
MOVEM A,TPIBFP
SETOM TAPECH
RETURN
CENTRY GET16 ; READ 16-BITS
SOSGE TPICNT
CL TPREAD
ILDB A,TPIBFP
ILDB B,TPIBFP
LSH B,10
IOR A,B
MOVE B,A
ADD B,CHECKSUM
ANDI B,0177777
MOVEM B,CHECKSUM
RETURN
CENTRY PUT16,[W] ; WRITE 16 BITS
MOVE C,W
SOSGE TPICNT ; ANY ROOM ?
CL WRTAPE ; NO, FLUSH BUFFER
MOVE B,C
ADD B,CHECKSUM
ANDI B,0177777
MOVEM B,CHECKSUM
MOVE B,C
LSH B,-10
ANDI B,0377
LSH C,10
ANDI C,177400
IOR B,C
MOVE C,B
IDPB C,TPIBFP
RETURN
CENTRY SEEK8,[ACC] ; RANDOM ACCESS
SETZM CHARINBUF ; CLEAR GET8 BUFFER
MOVE A,ACC
MOVE B,A
SUB A,CURBLOCK
CAIE A,0
GO L1
; HERE IF DESIRED BLOCK IS IN BUFFER
MOVEI A,2*TPIBSZ
MOVEM A,TPICNT
MOVE A,[441000,,TPIBUF]
MOVEM A,TPIBFP
SE$RET: RETURN
L1: SUBI A,1 ; NUMBER OF BLOCKS TO SKIP
SETZM TPICNT
CAIN A,0
GO SE$RET ; WANT NEXT BLOCK, NOTHING TO SKIP
; HERE IF NECESSARY TO SKIP SOME BLOCKS
HRLZ C,A
HRLZI A,TAPIN
HRRI A,C
HRRI C,6
.MTAPE A,
JFCL
SUBI B,1
MOVEM B,CURBLOCK
RETURN
CENTRY CLOS8 ; CLOSE TAPE
SKIPGE TAPECH
CL FLUSH8 ; FLUSH BUFFER
CALL RWND8
.CLOSE TAPIN,
SETZM TAPECH
RETURN
CENTRY EOF8 ; TEST FOR END-OF-FILE
MOVE A,TPIEOF
RETURN
; *** BUFFERED I/O ROUTINES ***
; TPICNT - NUMBER OF 16-BIT INTEGERS IN BUFFER
; TPIBFP - ABPTR TO NEXT 16-BIT INTEGER IN BUFFER
; TPIBUF - THE BUFFER
; TPIEOF - -1 IF END-OF-FILE
TPR1: SOSL TPICNT
RTN
TPREAD: MOVEI A,2*TPIBSZ
MOVEM A,TPICNT
MOVE A,[441000,,TPIBUF]
MOVEM A,TPIBFP
MOVEI A,TPIBUF
HRLI A,-TPIBSZ
AOS CURBLOCK
.IOT TAPIN,A
JUMPGE A,TPR1
HLRES A
ADDI A,TPIBSZ
JUMPE A,TPR2 ; END OF FILE
LSH A,1
MOVEM A,TPICNT
GO TPR1
TPR2: SETOM TPIEOF
SETZM TPIBUF
RTN
FLUSH8: MOVEI A,2*TPBFSZ ; FLUSH (MAYBE UNFILLED) BUFFER
SUB A,TPICNT
ADDI A,1
LSH A,-1
MOVN A,A
HRLZ A,A
SKIPA
WRTAPE: HRLZI A,-TPBFSZ ; THIS IS SKIPPED FROM FLUSH8
HRRI A,TPIBUF
.IOT TAPIN,A ; WRITE BUFFER
MOVEI A,2*TPBFSZ-1
MOVEM A,TPICNT
MOVE A,[442000,,TPIBUF]
MOVEM A,TPIBFP
RTN
; *** BUFFERED I/O VARIABLES ***
.UDATA
TAPECH: BLOCK 1 ; 0 - CLOSED
; 1 - OPEN FOR READ
; -1 - OPEN FOR WRITE
TPICNT: BLOCK 1 ; TAPE I/O VARIABLES
TPIBFP: BLOCK 1
TPIEOF: BLOCK 1
TPIBUF: BLOCK TPBFSZ
MDATA CURBLOCK
BLOCK 1
MDATA CHECKSUM
BLOCK 1
MDATA CHARINBUF
BLOCK 1
END