1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-02-12 10:57:12 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/unsmon/ptrser.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

253 lines
7.5 KiB
Plaintext
Raw 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 PTRSER - PAPER TAPE READER SERVICE ROUTINE FOR PDP-10 - V055
SUBTTL /GBH/TNM/RCC/DAL 21-JUNE-88
SEARCH F,S,DEVPRM
$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,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
XP VPTRSR,055 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP
PTRSER::ENTRY PTRSER
;PARAMETER ASSIGNMENTS
;PTR CONTROL REGISTER
PTRDON==10 ;DONE FLAG
PTRBSY==20 ;BUSY FLAG
PTRBIN==40 ;BINARY READ MODE
POW==400 ;POWER ON
;SPECIAL IO STATUS WORD ASSIGNMENTS
IODISC==400000
PTRPOW==100000
;SPECIAL ASCII CHARACTERS
RUBOUT==177
SUBTTL AUTOCONFIGURE
;DRIVER CHARARCTERISTICS
; PTR = PTRCNF
; PTR = PAPER TAPE PUNCH
; 7 = MAXIMUM DEVICES IN SYSTEM
; 0 = KONTROLLER TYPE
; 0 = MAXIMUM DRIVES PER KONTROLLER
; 0 = HIGHEST DRIVE NUMBER
; MDSEC0 = SECTION FOR KDB/UDB
; MDSEC0 = SECTION FOR DDB
DRVCHR (PTR,PTR,7,0,0,0,MDSEC0,MDSEC0,<DR.GCC!DR.NET>)
.ORG DEVLEN
PTRCSO:! BLOCK 1 ;ADDRESS OF INTERRUPT CODE
PTRIOB:! ;START OF I/O INSTRUCTIONS
PTRXST:! BLOCK 1 ;CONI TO SAVE STATUS
PTRPWR:! BLOCK 1 ;CONSO TO TEST POWER ON/OFF
PTRCNO:! BLOCK 1 ;CONO
PTRDTI:! BLOCK 1 ;DATAI
PTRIOE:! ;END OF I/O INSTRUCTIONS
PTRLEN:! ;LENGTH OF PTR DDB
.ORG
$LOW
PTRDDB: DDBBEG (PTR,PTRLEN)
SETWRD (DEVCHR,<5*HUNGST,,PTRSIZ##>) ;DEVCHR
SETWRD (DEVSER,<MCSEC0+PTRDSP>) ;DEVSER
SETWRD (DEVMOD,<DVIN!DVPTR,,14403>) ;DEVMOD
SETWRD (DEVTYP,<<.TYPTR*.TYEST>!DEPLEN,,0>) ;DEVTYP
SETWRD (DEVCPU,<PTRCHN##>) ;DEVCPU
SETWRD (PTRXST,<CONI 000,DEVSTS(F)>) ;SAVE STATUS
SETWRD (PTRPWR,<CONSO 000,POW>) ;TEST FOR POWER ON/OFF
SETWRD (PTRCNO,<CONO 000,(U)>) ;CONO
SETWRD (PTRDTI,<DATAI 000,U>) ;DATAI
DDBEND
$HIGH
;CONSO SKIP CHAIN CODE (AUTCON WILL FILL IN THE BLANKS)
PTRICD: PHASE 0
CONSO 000,0 ;(00) SKIP IF INTERRUPT FOR THIS LPT
JRST .-1 ;(01) GO TO NEXT SKIP CHAIN ELEMENT
JSR PIERR## ;(02) SAVE ACS AND SETUP PDL
SKIPA F,.+1 ;(03) SET UP DDB ADDRESS
EXP 0 ;(04) DDB ADDRESS
XJRST .+1 ;(05) CALL INTERRUPT HANDLER
EXP 0 ;(06) INTERRUPT HANDLER ADDRESS
DEPHASE
PTRICL==.-PTRICD ;LENGTH OF CONSO SKIP CHAIN CODE
EQUATE (LOCAL,0,<PTRCKT,PTRKDB,PTRKLN,PTRUDB,PTRULN>)
EQUATE (LOCAL,0,<PTRULB,PTRULP>)
PRXDSP: DRVDSP (PTR,PTRCHN##,PTRDDB,PTRLEN,URDDIA##)
;DEFAULT MONGEN'ED DEVICE TABLE
DEFMDT: MDKL10 (7,104,0,0,<MD.KON>) ;DEVICE CODE 104
EXP 0
PTRCFG: XMOVEI T1,PTRMDT## ;MONGEN'ED DEVICE TABLE
XMOVEI T2,DEFMDT ;DEFAULT TABLE
MOVNI T3,1 ;NO MASSBUS UNIT OR DRIVE INFORMATION
MOVEI T4,MD.KON ;MATCH ON KONTROLLER DEFINITION
PUSHJ P,AUTMDT## ;SCAN THE TABLES
JRST CPOPJ1## ;NO MATCHES
PUSH P,T1 ;SAVE MDT DATA
MOVEI T1,PTRIOB ;WORD CONTAINING AN I/O INSTRUCTION
PUSHJ P,AUTFND## ;SEE IF THERE'S ALREADY A DDB
JRST PTRCF1 ;JUST MAKE SURE THE NUMBERS ARE OK
PUSHJ P,AUTADN## ;ALLOCATE A DEVICE NUMBER
HRLI T1,'PTR' ;INCLUDE GENERIC DEVICE NAME
SETZ T2, ;LOCAL DEVICE
PUSHJ P,AUTDDB## ;CREATE A DDB
JRST [POP P,T1 ;NO CORE
PJRST AUTDDN##] ;DEALLOCATE DEVICE NUMBER
PTRCF1: MOVSI T1,-<PTRIOE-PTRIOB> ;-LENGTH
XMOVEI T2,PTRIOB(F) ;STARTING ADDRESS
HRRZ T3,.CPDVC## ;DEVICE CODE
PUSHJ P,AUTDVC## ;FILL IN DEVICE CODES
SKIPE PTRCSO(F) ;BEEN HERE BEFORE?
JRST PTRCF3 ;THEN DON'T MESS WITH THE SKIP CHAIN
MOVE T1,F ;DATA BLOCK ADDRESS
XMOVEI T2,PTRINT ;INTERRUPT SERVICE
PUSHJ P,AUTICD## ;GENERATE INTERRUPT ROUTINES
SKIPA T2,F ;NO CORE
JRST PTRCF2 ;ONWARD
MOVEI T1,PTRLEN ;GET DDB LENGTH
PUSHJ P,AUTKIL## ;DELETE THE DDB
PUSHJ P,AUTDDN## ;DEALLOCATE DEVICE NUMBER
JRST TPOPJ## ;PHASE STACK AND RETURN
PTRCF2: MOVEM T1,PTRCSO(F) ;SAVE ADDRESS
MOVEI T2,PTRCHN## ;PI CHANNEL
PUSHJ P,AUTCSO## ;LINK INTO CONSO SKIP CHAIN
PTRCF3: POP P,T1 ;GET MDT DATA BACK
POPJ P, ;ALL DONE
;PTR SERVICE DISPATCH TABLE
JRST CPOPJ1## ;IF YOU'RE ASKING, IT'S ONLINE
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
PTRIN: TLNN S,IOBEG ;INPUT. VIRGIN DEVICE?
JRST PTRIN1 ;NO
TLO S,IOFST ;IOFST:=1. NEXT ITEM WILL BE FIRST ITEM OF A BUFFER
TLZ S,PTRPOW+IODISC
PUSHJ P,SETBYT## ;TAC0-5:=TAC12-13:=0,TAC6-11:=BYTE SIZE
MOVEM T1,DEVPTR(F) ;DEVPTR:=C(T1)
XCT PTRPWR(F) ;IS POWER ON?
JRST [PUSHJ P,HNGSTP## ;NO - INFORM USER
JRST PTRIN]
;ALWAYS GO ON EVEN IF POW NOT ON IN CASE
;NULL FILE IS TO BE READ (A FEATURE)
;NOTE: POW=1 SIGNALS PTR READY FOR INPUT
;WHEREAS LATER POW=0 SIGNALS END-OF-TAPE & EOF.
TLO S,PTRPOW ;YES. PTRPOW:=1
PTRIN1: MOVEI U,PTRBSY
TLZN S,IOBEG ;VIRGIN?
MOVEI U,PTRDON ;NO
TLNN S,PTRPOW
MOVEI U,0
ADDI U,PTRCHN## ;INCLUDE PI CHANNEL
LDB T2,PIOMOD##
CAIE T2,IB ;IMAGE BINARY?
CAIN T2,B ;OR BINARY?
IORI U,PTRBIN
HRLI U,PTRDON
CONO PI,PI.OFF ;BETTER NOT INTERRUPT (IODISC=1)
TRO S,IOACT ;TELL PI-LEVEL THE PTR IS GOING
MOVEM S,DEVIOS(F)
XCT PTRCNO(F) ;START IT
HLRM U,@PTRCSO(F)
CONO PI,PI.ON ;TURN ON PI'S
PJRST SETHNG## ;SET HUNG TIME AND RETURN
PTRINT: XCT PTRXST(F) ;STORE CONI STATUS
SKIPL DEVIOS(F) ;DISCONNECT REQUEST? (IODISC=1?)
PUSHJ P,IOSET## ;J=C(DEVCTR)
;S:=C(PTRIOS)
XCT PTRDTI(F) ;READ DATA ITEM INTO AC U
XCT PTRPWR(F) ;PTR POWER ON?
JRST PTREND ;NO
TLON S,PTRPOW ;PTRPOW=1? PTRPOW:=1
JRST PTREX1 ;NO
TLZE S,IODISC ;DISCONNECT REQUEST?
JRST PTREXT ;YES
PTRIN0: TRNE S,B ;MODE=BINARY?
JRST PTRI0 ;YES
ANDI U,177 ;MASK OUT PARITY BIT
CAIN U,RUBOUT ;LAST CHAR A RUBOUT?
JRST DPOPJ## ;YES, STORE STATUS(IOS) AND DISMISS INIT
;DO NOT RESET HUNG TIME OUT
JUMPE U,DPOPJ## ;NULL CHAR - DO NOT RESET HUNG TIME OUT
PTRI0: PUSHJ P,STODAT## ;NO STORE DATA WORD.
JFCL ;CHECKSUM ERROR
JRST PTRI1 ;BLOCK FULL OR BLOCK COMPLETE
JRST PTREX1 ;DATA STORED CORRECTLY.
PTRI1: PUSHJ P,ADVBFF## ;ADVANCE BUFFER
TRZA S,IOACT
PTRI2: TLOA S,IOFST ;IOFST:=1. NEXT ITEM IS FIRST ITEM OF A BUFFER.
TLO S,IODISC+IOFST ;NEXT BUFFER IS FULL. IODISC:=1
PUSHJ P,SETIOD## ;IOWS:=1
JRST PTREX1
;COME HERE WHEN THE READER IS SHUT OFF
PTREND: TLZ S,PTRPOW ;PTRPOW:=0
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
JRST PTRI2
;DISCONNECT PTR
PTREXT: TRNN S,IOACT ;DEVICE GOING (NEW INPUT DONE)?
JRST PTREX0 ;NO, SHUT DOWN
XCT PTRDTI(F) ;YES, KEEP ON GOING
JRST PTRIN0
PTREX0: PUSHJ P,SETIOD## ;JOB IN AN IO WAIT FOR PTR?
;YES, WAKE UP JOB
PUSHJ P,PTRREL ;CLEAR PTR AND CONSO FLAG
TRZ S,IOACT ;IOACT:=0
PTREX1: MOVEM J,DEVCTR(F) ;DEVCTR:=C(J)
JRST STOIOS## ;STORE S,RESET HUNG DEVICE
;TIMEOUT COUNT AND DISMISS.
PTRINI: MOVEI T1,PTRDDB ;ADDRESS OF PROTOTYPE
CAIN T1,(F) ;IF FIRST CALL,
JRST CPOPJ1## ;HOLD OUT FOR A REAL DEVICE
AOS (P) ;DO THE CONO EACH TIME
PTRREL: MOVEI U,0 ;CLEAR PTR CONTROL
XCT PTRCNO(F)
HLLZS @PTRCSO(F) ;CLEAR CONSO FLAG
POPJ P,
END