1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-04 10:24:35 +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

340 lines
9.7 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 PTPSER - PAPER TAPE PUNCH SERVICE ROUTINE - V445
SUBTTL /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 VPTPSR,445 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP
PTPSER::ENTRY PTPSER
;PARAMETER ASSIGNMENTS
;PTP CONTROL REGISTER
PTPDON==10 ;DONE
PTPNTP==100 ;OUT OF TAPE
PTPFDN==200 ;FORMAT CONTROL
;SPECIAL IO STATUS WORD ASSIGNMENTS
IODISC==400000
PTPFED==200000
PTPEOL==20000
PTPBIN==4000 ;CHECKSUM BINARY
PTPIB==2000 ;IMAGE BINARY
;SPECIAL ASCII CHARACTERS (DEFINED WITH THE CORRECT PARITY)
HORTAB==11
FORMFD==14
VERTAB==213
RUBOUT==377
SUBTTL AUTOCONFIGURE
;DRIVER CHARARCTERISTICS
; PTP = PTPCNF
; PTP = PAPER TAPE PUNCH
; 7 = MAXIMUM DEVICES IN SYSTEM
; 0 = KONTROLLER TYPE
; 0 = MAXIMUM DRIVES PER KONTROLLER
; 0 = HIGHEST DRIVE NUMBER ON KONTROLLER
; MDSEC0 = SECTION FOR KDB/UDB
; MDSEC0 = SECTION FOR DDB
DRVCHR (PTP,PTP,7,0,0,0,MDSEC0,MDSEC0,<DR.GCC!DR.NET>)
.ORG DEVLEN
PTPCSO:! BLOCK 1 ;ADDRESS OF INTERRUPT CODE
PTPCNT:! BLOCK 1 ;BYTE COUNT
PTPCHA:! BLOCK 1 ;TEMPORARY LOCATION TO STORE CHARACTER
PTPIOB:! ;START OF I/O INSTRUCTIONS
PTPCNI:! BLOCK 1 ;CONI
PTPCNO:! BLOCK 1 ;CONO
PTPDTO:! BLOCK 1 ;DATAO
PTPIOE:! ;END OF I/O INSTRUCTIONS
PTPLEN:! ;LENGTH OF PTP DDB
.ORG
$LOW
PTPDDB: DDBBEG (PTP,PTPLEN)
SETWRD (DEVCHR,<4*HUNGST,,PTPSIZ##>) ;DEVCHR
SETWRD (DEVSER,<MCSEC0+PTPDSP>) ;DEVSER
SETWRD (DEVMOD,<DVOUT!DVPTP,,14403>) ;DEVMOD
SETWRD (DEVTYP,<<.TYPTP*.TYEST>!.SPPTP!DEPLEN,,0>) ;DEVTYP
SETWRD (DEVCPU,<PTPCHN##>) ;DEVCPU
SETWRD (PTPCNI,<CONI 000,T1>) ;CONI
SETWRD (PTPCNO,<CONO 000,(U)>) ;CONO
SETWRD (PTPDTO,<DATAO 000,T1>) ;DATAO
DDBEND
$HIGH
;CONSO SKIP CHAIN CODE (AUTCON WILL FILL IN THE BLANKS)
PTPICD: 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
PTPICL==.-PTPICD ;LENGTH OF CONSO SKIP CHAIN CODE
EQUATE (LOCAL,0,<PTPCKT,PTPKDB,PTPKLN,PTPUDB,PTPULN>)
EQUATE (LOCAL,0,<PTPULB,PTPULP>)
PPXDSP: DRVDSP (PTP,PTPCHN##,PTPDDB,PTPLEN,URDDIA##)
;DEFAULT MONGEN'ED DEVICE TABLE
DEFMDT: MDKL10 (7,100,0,0,<MD.KON>) ;DEVICE CODE 100
EXP 0
PTPCFG: XMOVEI T1,PTPMDT## ;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,PTPIOB ;WORD CONTAINING AN I/O INSTRUCTION
PUSHJ P,AUTFND## ;SEE IF THERE'S ALREADY A DDB
JRST PTPCF1 ;JUST MAKE SURE THE NUMBERS ARE OK
PUSHJ P,AUTADN## ;ALLOCATE A DEVICE NUMBER
HRLI T1,'PTP' ;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
PTPCF1: MOVSI T1,-<PTPIOE-PTPIOB> ;-LENGTH
XMOVEI T2,PTPIOB(F) ;STARTING ADDRESS
HRRZ T3,.CPDVC## ;DEVICE CODE
PUSHJ P,AUTDVC## ;FILL IN DEVICE CODES
SKIPE PTPCSO(F) ;BEEN HERE BEFORE?
JRST PTPCF3 ;THEN DON'T MESS WITH THE SKIP CHAIN
MOVE T1,F ;DATA BLOCK ADDRESS
XMOVEI T2,PTPINT ;INTERRUPT SERVICE
PUSHJ P,AUTICD## ;GENERATE INTERRUPT ROUTINES
SKIPA T2,F ;NO CORE
JRST PTPCF2 ;ONWARD
MOVEI T1,PTPLEN ;DDB ADDRESS
PUSHJ P,AUTKIL## ;DELETE THE DDB
PUSHJ P,AUTDDN## ;DEALLOCATE DEVICE NUMBER
JRST TPOPJ## ;PHASE STACK AND RETURN
PTPCF2: MOVEM T1,PTPCSO(F) ;SAVE ADDRESS
MOVEI T2,PTPCHN## ;PI CHANNEL
PUSHJ P,AUTCSO## ;LINK INTO CONSO SKIP CHAIN
PTPCF3: POP P,T1 ;RESTORE MDT DATA
POPJ P, ;ALL DONE
;PTP 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 PTPINI ;INITILIZE
JRST PTPREL ;HUNG DEVICE TIME-OUT ERROR.
PTPDSP: JRST PTPREL ;RELEASE
JRST PTPCLS ;CLOSE
JRST PTPOUT ;OUTPUT
JRST ILLINP## ;INPUT
PTPINI: MOVEI T1,PTPDDB ;ADDRESS OF PROTOTYPE
CAIN T1,(F) ;IF FIRST CALL,
JRST CPOPJ1## ;HOLD OUT FOR A REAL DEVICE
AOS (P) ;DO THE CONO EACH TIME
PTPREL: PUSH P,U ;SAVE U
SETZ U, ;NO BITS
XCT PTPCNO(F) ;TURN PUNCH OFF
HLLZS @PTPCSO(F) ;CLEAR CONSO FLAG BITS
JRST UPOPJ## ;RESTORE U AND RETURN
PTPCLS: PUSHJ P,OUT## ;OUTPUT REMAINING BUFFERS
PUSHJ P,WAIT1## ;WAIT FOR IOACT=0.
MOVE S,DEVIOS(F) ;C(S):=C(PTPIOS)
TLO S,IODISC+PTPFED+IOW ;IODISC:=IOW:=PTPFED:=1
PUSHJ P,SETACT## ;SET ACTIVE FLAG,STORE S,AND
;RESET HUNG DEVICE TIMEOUT COUNT
MOVEI T1,200
MOVEM T1,PTPCNT(F) ;PTPCNT:=200
MOVEI U,PTPDON ;SET CONSO FLAG
HRRM U,@PTPCSO(F)
ADDI U,PTPCHN## ;INCLUDE PI CHANNEL
XCT PTPCNO(F) ;SET DONE FLAG
JRST WAIT1## ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED
PTPOUT: XCT PTPCNI(F) ;READ STATUS
TRNN T1,PTPNTP ;OUT OF TAPE?
JRST PTPIN0 ;NO, ENTER SERVICE
MOVEM T1,DEVSTS(F) ;SAVE STATUS
PUSHJ P,HNGSTP## ;ISSUE "DEVICE PTP OK?"
JRST PTPOUT ;TRY AGAIN WHEN "CONT" TYPED
PTPIN0: TLZE S,IOBEG ;VIRGIN DEVICE? (IOBEG:=0)
JRST PTPIN2 ;YES
PTPIN1: TLZ S,IODISC ;CLEAR DISCONNECT BIT
PUSHJ P,SETACT## ;SET ACTIVE FLAG,STORE S, AND
;RESET HUNG DEVICE TIMEOUT COUNT
MOVE U,[PTPDON,,PTPDON+PTPCHN##] ;CONSO FLAGS + PI CHANNEL
CONO PI,PI.OFF
XCT PTPCNO(F)
HLRM U,@PTPCSO(F)
CONO PI,PI.ON
POPJ P, ;RETURN
PTPIN2: LDB T1,PIOMOD##
TLO S,IOFST+PTPFED+IO ;IOFST:=PTPFED:=IO:=1
TLZ S,PTPBIN+PTPIB ;CLEAR BINARY AND IMAGE BINARY BITS
CAIN T1,IB ;IMAGE BINARY?
TLO S,PTPIB ;YES
CAIN T1,B ;MODE=BINARY?
TLO S,PTPBIN ;YES, PTPBIN:=1
MOVEI T1,PTPFDN ;PTPCNT:=PTPFDN
MOVEM T1,PTPCNT(F)
PUSHJ P,SETBYT## ;SETBYT
HLLM T1,DEVPTR(F) ;DEVPTR0-5:=DEVPTR12-13:=0,DEVPTR6-11:=BYTE
;SIZE;
JRST PTPIN1
;PUNCH INTERRUPT SERVICE
PTPINT: XCT PTPCNI(F) ;READ STATUS
MOVEM T1,DEVSTS(F) ;SAVE IT
TRNE T1,PTPNTP ;OUT OF TAPE?
JRST NOTAPE ;YES - GO HANDLE IT
MOVE S,DEVIOS(F) ;S:=C(PTPIOS)
TLNE S,PTPFED ;FEED REQUEST? (PTPFED=1?)
JRST PTPS2 ;YES
PUSHJ P,IOSET## ;J=C(DEVCTR)
;S:=C(PTRIOS)
TLZE S,IODISC ;DISCONNECT? (IODISC=1?)
JRST PTPADV ;YES
TLZE S,IOFST ;IOFST=1? IOFST:=0
JRST PTP9 ;YES
TLNN S,PTPBIN+PTPIB ;BINARY PUNCH MODE?
JRST PTP3 ;NO
MOVE T1,PTPCHA(F) ;BINARY OUTPUT BYTE SIZE=36
ROT T1,6
MOVEM T1,PTPCHA(F)
ANDI T1,77 ;T1:=XX, SIXBIT SUB-BYTE
ADDI T1,200
XCT PTPDTO(F) ;PUNCH 2XX
SOSL PTPCNT(F) ;C(PTPCNT):=C(PTPCNT)-1. WORD DONE?
JRST STOIOS## ;NO
SOSL DEVCTR(F) ;C(DEVCTR):=C(DEVCTR)-1. J COUNT .LT. 0?
JRST PTPB1 ;NO
TLNE S,PTPIB ;IMAGE BINARY?
TLOA S,IODISC ;YES, SUPPRESS TAPE FEED.
TLO S,IODISC+PTPFED ;IODISC:=PTPFED:=1
MOVEI T1,10
MOVEM T1,PTPCNT(F) ;PTPCNT:=10
JRST STOIOS##
PTPB1: MOVEI T1,5 ;PTPCNT:=5
MOVEM T1,PTPCNT(F)
MOVE U,@DEVPTR(F) ;PTPCHA:=OUTPUT DATA WORD
AOS DEVPTR(F) ;DEVPTR:=C(DEVPTR)+1. ADVANCE J POINTER.
MOVEM U,PTPCHA(F)
JRST STOIOS##
PTP3: MOVE T1,PTPCHA(F) ;GET CHARACTER
XCT PTPDTO(F) ;DATAO DEV,T1
TRNE S,14 ;IS MODE AN ALPHA MODE
JRST PTP1 ;NO
MOVE U,PTPCHA(F)
CAIE U,HORTAB ;HORIZONTAL OR VERTICAL TAB?
CAIN U,VERTAB
JRST PTPP1 ;YES
CAIE U,FORMFD ;FORM FEED?
JRST PTP1 ;NO
TLO S,PTPFED+PTPEOL ;PTPFED:=PTPEOL:=1
MOVEI U,20
MOVEM U,PTPCNT(F) ;PTPCNT:=20
JRST STOIOS##
PTP1: SOSGE DEVCTR(F) ;C(DEVCTR):=C(DEVCTR)-1. IS C(DEVCTR) .LT. 0?
JRST PTP5 ;YES
ILDB T3,DEVPTR(F) ;T3:=OUTPUT J
LDB T1,PIOMOD##
CAIN T1,I ;MODE=IMAGE?
JRST PTP6 ;YES
IORI T3,200 ;NO, INSERT EIGHTH HOLE
TRNN T1,14 ;AN ASCII MODE?
PUSHJ P,PEVEN8## ;YES. TURN EIGHTH HOLE OFF IF
; APPROPRIATE TO GET EVEN PARITY
JUMPE T3,PTP1 ;IF AN ASCII NULL, IGNORE IT.
; THEY ARE PUT IN BY PTPFED STUFF
; ELSE FALL INTO PTP6
PTP6: MOVEM T3,PTPCHA(F) ;PTPCHA:=OUTPUT J
JRST STOIOS##
PTPS2: SETZB T1,PTPCHA(F) ;FEED CHARACTER
XCT PTPDTO(F) ;DATAO DEV,T1
SOSG PTPCNT(F) ;COUNT FEED LINES
TLZ S,PTPFED ;PTPFED:=0
MOVEM S,DEVIOS(F) ;PTPIOS:=C(S)
POPJ P, ;RETURN
PTP5: TLO S,IODISC ;IODISC:=1
JRST STOIOS##
PTPBN: MOVEI T2,@DEVOAD(F) ;T2:=BUFFER ADDRESS
PUSHJ P,CKS12## ;T1:=CALCULATE CHECKSUM
ADD T2,DEVOAD(F)
HLLM T1,@T2 ;STORE CHECKSUM IN LEFT HALF OF FIRST BUFFER DATA WORD.
JRST PTPB1
PTPADV: PUSHJ P,ADVBFE## ;ADVANCE BUFFER
JRST PTPDSC ;EXIT1. NEXT BUFFER EMPTY
PUSHJ P,SETIOD## ;IN A WAIT? IOW:=0
PTP9: TLZ S,IOFST ;IOFST:=0
MOVE T1,DEVOAD(F)
AOS T1
HRRM T1,DEVPTR(F) ;DEVPTR18-35:=C(PTPADR18-35)+1
HRRZ J,@T1 ;J:=WORD COUNT
LDB T2,PTP91 ;PICK UP BYTE SIZE
PUSHJ P,ITMCT1## ;J:=WORD COUNT*[36/BYTE SIZE]
MOVEM J,DEVCTR(F) ;DEVCTR:=C(J)
JUMPE J,PTPADV ;IS J COUNT=0?
TLNE S,PTPBIN ;BINARY PUNCH MODE?
JRST PTPBN ;YES
TLNN S,PTPIB ;IMAGE BINARY?
JRST PTP1
AOS DEVPTR(F) ;YES
SOS DEVCTR(F)
JRST PTPB1
PTP91: POINT 6,DEVPTR(F),11
PTPP1: MOVEI U,RUBOUT ;PTPCHA:=RUBOUT
MOVEM U,PTPCHA(F)
TLO S,PTPEOL ;PTPEOL:=1
JRST STOIOS##
PTPDSC: PUSHJ P,PTPREL ;CLEAR PTP CONTROL REG AND CONSO BITS
TRZ S,IOACT ;IOACT:=0
TLO S,IOFST ;IOFST:=1
;IN A WAIT? IOW:=0
PUSHJ P,SETIOD## ;YES. IOWS:=1
JRST STOIOS## ;STORE S, RESET HUNG TIMEOUT COUNT AND
;DISMISS INTERRUPT
;WHEN END OF TAPE ENCOUNTERED, COME HERE TO FORCE A HUNG DEVICE
NOTAPE: SETZ U, ;NO BITS
XCT PTPCNO(F) ;TURN OFF PTP-RESTART NOT ALLOWED
POPJ P, ;DISMISS INTERRUPT-BUT NO MORE
;TO BE RECEIVED SINCE PTP NOW OFF
END