1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-03 18:06:05 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

206 lines
6.1 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Title PRSSER - Paper Tape Reader Service Routine for KS10s - V004
Subttl Timothe Litt 17-FEB-87
;From PTRSER V 043
SEARCH F,S
$RELOC
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1973,1974,1975,1976,1977,1978,1979,1980,1982,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
XP VPTRSR,004
;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
ENTRY PTRSER
PTRSER::
; CSR and DDB bit definitions
PRS==PTRDTI##+0 ;Word in DDB with IO address of CSR
ERR==100000 ;Error (No tape, offline, no power)
BSY==004000 ;Busy (Set by GO, cleared by DONE)
DONE==00200 ;Done (Set when char is avail, clr by ref to DB)
INTENB==100 ;Enable interrupt on error or done
GO==000001 ;Read a frame
PRB==PTRDTI##+1 ;Word in DDB with IO address of data buffer
PTRIVA==PTRDTI##+2 ;Word in DDB with interrupt vector
PTRIVI==PTRDTI##+3 ;Word in DDB with interrupt instruction
PTRCNT==PTRBLK##+0 ;Word in DDB which counts frames of a binary wd
PTRWRD==PTRBLK##+1 ;Word in DDB which holds binary word during assy
; SPECIAL IO STATUS WORD ASSIGNMENTS
PTRBIM==200000 ;PTR is in BINARY mode
; SPECIAL ASCII CHARACTERS
RUBOUT==177
Subttl UUOCON Interface -- Dispatch table
;PTR SERVICE DISPATCH TABLE
JRST PTRONL ;See if on-line
JRST ECOD2## ;SPECIAL ERROR STATUS
JRST REGSIZ## ;BUFFER LEN CAN BE GOTTEN FROM DDB
JRST PTRINI ;INITILIZE
JRST PTRREL ;HUNG DEVICE TIME-OUT ERROR.
PTRDSP::JRST PTRREL ;RELEASE
JRST ILLOUT## ;CLOSE CALLED ONLY ON ILLEGAL OUTPUT
JRST ILLOUT## ;OUTPUT
JRST PTRIN ;INPUT
Subttl UUOCON Interface -- Initialize, RELEASe
PTRINI: MOVE T1,PRS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;See if alive
JRST CPOPJ1## ;No, hopeless case
HLRZ T1,PRS(F) ;Get UNIBUS adapter number
HRRZ T2,PTRIVA(F) ;Get interrupt vector address
PUSHJ P,AUTVIA## ;Compute address of interrupt instruction
MOVE T2,PTRIVI(F) ;Get vector instruction
MOVEM T2,(T1) ;Save for interrupts
PUSHJ P,PTRREL ;Do the RELEAS code
JRST CPOPJ1## ;And return to SYSINI
PTRREL: MOVE T1,PRS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;Make sure this device is alive
POPJ P, ;It's not, don't die
MOVEI T1,INTENB ;Get interrupt enable bit
BCIO T1,@PRS(F) ;Clear it to stop the device
POPJ P, ;Done
Subttl UUOCON Interface -- IN
PTRIN: TLNN S,IOBEG ;INPUT. VIRGIN DEVICE?
JRST PTRIN1 ;NO
TLO S,IOFST ;NEXT ITEM WILL BE FIRST ITEM OF A BUFFER
PUSHJ P,SETBYT## ;T1 0-5:=T1 12-13:=0,T1 6-11:=BYTE SIZE
MOVEM T1,DEVPTR(F) ;DEVPTR:=C(T1)
MOVE T1,PRS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;Be sure device exists
JRST PTRINA ;It does not, bitch
MOVEI T1,ERR ;Get the error (out of tape) bit
TION T1,@PRS(F) ;Error?
JRST PTRIN1 ;No, ok to begin
PTRINA: PUSHJ P,HNGSTP## ;Error - INFORM USER
JRST PTRIN ;Try again when/if restarted
PTRIN1: TLZ S,IOBEG ;Device is starting
MOVEI U,INTENB+GO ;Start tape moving - read first frame of buffer
LDB T2,PIOMOD##
CAIE T2,IB ;IMAGE BINARY?
CAIN T2,B ;OR BINARY?
TLOA S,PTRBIM ;Yes, run in binary mode
TLZA S,PTRBIM ;No, run in normal mode
PUSHJ P,BIMRST ;Reset binary mode pointers
CONO PI,PI.OFF ;BETTER NOT INTERRUPT
TRO S,IOACT ;TELL PI-LEVEL THE PTR IS GOING
MOVEM S,DEVIOS(F)
BSIO U,@PRS(F) ;Start the reader
CONO PI,PI.ON ;TURN ON PI'S
PJRST SETHNG## ;SET HUNG TIME AND RETURN
BIMRST: MOVEI T2,6 ;Frames/word
MOVEM T2,PTRCNT(F) ;Save as frames to go
SETZM PTRWRD(F) ;Start with a clear word
POPJ P, ;All set
PTRONL: MOVE T1,PRS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;Alive?
POPJ P, ;No, off-line
MOVEI T2,ERR ;Yes, error?
TION T2,(T1) ;...
AOS (P) ;No error, on-line
POPJ P, ;Error
Subttl Reader Interrupt Service
PTRINT::
RDIO T1,@PRS(F) ;Read status register
MOVEM T1,DEVSTS(F) ;Save for watchers
PUSHJ P,IOSET## ;Get S and J
TRNE T1,ERR ;Error (no tape)?
JRST PTREND ;Yes, stop
RDIO U,@PRB(F) ;Get this frame
TLNN S,PTRBIM ;Binary mode?
JRST PTRIN0 ;No, all set
TRNE U,200 ;Binary frame?
JRST PRINTA ;Yes, process it
PRINTB: MOVEI T1,GO ;No, just read the next
BSIO T1,@PRS(F) ;Start the reader
JRST DPOPJ## ;Store S and return
PRINTA: MOVE T2,PTRWRD(F) ;Get word so far
LSH T2,6 ;Shift over 6 bits
ANDCMI U,77 ;Only 6 bits/frame
IORB T2,U ;Add in the new frame
SOSG PTRCNT(F) ;Done with word?
JRST PRINTC ;Yes, Reset counter and provide word
MOVEM T2,PTRWRD(F) ;No, store result so far
JRST PRINTB ;And get next frame
PRINTC: PUSHJ P,BIMRST ;Word done, reset count
PTRIN0: TRNE S,B ;MODE=BINARY?
JRST PTRI0 ;YES
ANDI U,177 ;MASK OUT PARITY BIT
CAIN U,RUBOUT ;LAST CHAR A RUBOUT?
JRST PRINTB ;Yes, Store S, start read of next frame,
;and dismiss
JUMPE U,PRINTB ;Null frame, trash it
PTRI0: PUSHJ P,STODAT## ;NO STORE DATA WORD.
JFCL ;CHECKSUM ERROR
JRST PTRI1 ;BLOCK FULL OR BLOCK COMPLETE
JRST PTRRST ;DATA STORED CORRECTLY.
PTRI1: PUSHJ P,ADVBFF## ;ADVANCE BUFFER
JRST PTRNBF ;No new buffer, stop
PTRI2: TLO S,IOFST ;IOFST:=1. NEXT ITEM IS FIRST ITEM OF A BUFFER.
PUSHJ P,SETIOD## ;Restart Job
PUSHJ P,STOIOS## ;Ensure hung count is reset
MOVEM J,DEVCTR(F) ;Save J
JRST PRINTB ;Yes, do so
PTRNBF: TRZ S,IOACT ;Clear IOACT
PUSHJ P,PTRREL ;Shut down
JRST STOIOS## ;Store S, and exit
;COME HERE WHEN THE READER IS SHUT OFF
PTREND: TRZN S,IOACT ;SHUTTING DOWN PTR?
JRST PTREI1 ;YES, JUST GO AWAY
LDB T1,PIOMOD##
TLO S,IOEND+IOBEG
CAIE T1,B ;CHECKSUM BINARY BLOCK MODE?
JRST PTREI ;NO.
TLNN S,IOFST ;IOFST=1?
TRO S,IOIMPM ;NO. BINARY BLOCK INCOMPLETE.
JRST PTREI1
PTREI: PUSHJ P,STOSQD## ;FINISH THIS BUFFER, STORE WORD COUNT
JFCL
PUSHJ P,ADVBFF## ;ADVANCE BUFFER
JFCL
PTREI1: PUSHJ P,PTRREL ;CLEAR PTR AND CONSO FLAG
PUSHJ P,RTEVMI## ;RETURN ANY EVM WE MAY OWN
TLO S,IOFST ;Set for new buffer
PUSHJ P,SETIOD## ;Restart job
MOVEM J,DEVCTR(F) ;
PJRST STOIOS##
PTRRST: MOVEM J,DEVCTR(F) ;DEVCTR:=C(J)
PUSHJ P,STOIOS## ;STORE S,RESET HUNG DEVICE
JRST PRINTB ;TIMEOUT COUNT AND DISMISS.
END