mirror of
https://github.com/PDP-10/its.git
synced 2026-05-25 06:40:45 +00:00
197 lines
3.0 KiB
Plaintext
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
|