1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-01 17:26:38 +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

279 lines
7.9 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 PPSSER - Paper Tape Punch Service Routine for KS10s - V004
Subttl Timothe Litt 17-FEB-87
;From PTPSER V433
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 VPTPSR,004
;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
ENTRY PTPSER
PTPSER::
; CSR and DDB bit definitions
PPS==PTPCNO##+0 ;Word in DDB with IO address of CSR
ERR==100000 ;Error (No tape, or No power)
RDY==000200 ;Ready (Cleared on write to PPB, set by DONE)
INTENB==100 ;Interrupt enable
PPB==PTPCNO##+1 ;Word in DDB with IO address of data buffer
PTPIVA==PTPCNO##+2 ;Word in DDB with interrupt vector
PTPIVI==PTPCNO##+3 ;Word in DDB with interrupt instruction
;FORMAT CONTROL
PTPFDN==200
; 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
RUBOUT==377
HORTAB==11
VERTAB==213
FORMFD==14
Subttl UUOCON Interface -- Dispatch table
;PTP SERVICE DISPATCH TABLE
JRST PTPONL ;SEE IF ON-LINE
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
SUBTTL UUOCON Interface -- Initialize, CLOSE & RELEAS
PTPINI: MOVE T1,PPS(F) ;Get base address of IO registers
PUSHJ P,UBGOOD## ;Alive?
JRST CPOPJ1## ;No, hopeless case
HLRZ T1,PPS(F) ;Get UNIBUS adapter number
HRRZ T2,PTPIVA(F) ;Get interrupt vector address
PUSHJ P,AUTVIA## ;Compute address of interrupt instruction
MOVE T2,PTPIVI(F) ;Get interrupt instruction
MOVEM T2,(T1) ;Save for interrupts
PUSHJ P,PTPREL ;Do the RELEAS code
JRST CPOPJ1## ;And return to SYSINI
PTPREL: MOVE T1,PPS(F) ;Get IO address
PUSHJ P,UBGOOD## ;Be sure it's alive
POPJ P, ;Dead, don't touch
MOVEI T1,INTENB ;Get interrupt enable
BCIO T1,@PPS(F) ;Ensure it's clear
POPJ P, ;Done
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 T1,INTENB ;Get interrupt enable
BSIO T1,@PPS(F) ;Take an interrupt
JRST WAIT1## ;WAIT FOR IOACT=0, ALL BUFFERS FINISHED
Subttl UUOCON Interface -- OUT
PTPOUT: MOVE T1,PPS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;Make sure we have a live one
JRST PTPOU1 ;We don't, say OPR ACTION REQUESTED
MOVEI T1,ERR ;Get error bit
TION T1,@PPS(F) ;Any errors?
JRST PTPIN0 ;No, proceed
PTPOU1: 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
MOVEI T1,INTENB ;Set to take an interrupt
BSIO T1,@PPS(F) ;Do so (may wait for a char to punch or feed)
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) ;PTPPTR0-5:=PTPPTR12-13:=0,PTPPTR6-11:=BYTE
;SIZE;
JRST PTPIN1
PTPONL: MOVE T1,PPS(F) ;Get CSR address
PUSHJ P,UBGOOD## ;Alive?
POPJ P, ;No, off-line
MOVEI T2,ERR ;Error set?
TION T2,(T1) ; ...
AOS (P) ;No, on-line
POPJ P, ;Return
Subttl Punch Interrupt Service
PTPINT::
RDIO T1,@PPS(F) ;Read Punch status
MOVEM T1,DEVSTS(F) ;Save for watchers
TRNE T1,ERR ;Out of tape?
JRST NOTAPE ;Yes, stop
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
;Here when processing binary output
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
WRIOB T1,@PPB(F) ;Punch 10xxxxxx (2XX)
SOSL PTPCNT##(F) ;C(PTPCNT):=C(PTPCNT)-1. WORD DONE?
JRST STOIOS## ;NO
SOSL DEVCTR(F) ;C(PTPCTR):=C(PTPCTR)-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##
;Here to set up for next binary word
PTPB1: MOVEI T1,5 ;PTPCNT:=5
MOVEM T1,PTPCNT##(F)
MOVE U,@DEVPTR(F) ;PTPCHA:=OUTPUT DATA WORD
AOS DEVPTR(F) ;PTPPTR:=C(PTPPTR)+1. ADVANCE J POINTER.
MOVEM U,PTPCHA##(F)
JRST STOIOS##
;Here when ready to punch next character in ASCII mode
PTP3: MOVE U,PTPCHA##(F) ;Get character
WRIOB U,@PPB(F) ;Punch it
TRNE S,14 ;IS MODE AN ALPHA MODE
JRST PTP1 ;NO
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##
;Here with no special fill initiated. See if more in this buffer
PTP1: SOSGE DEVCTR(F) ;C(PTPCTR):=C(PTPCTR)-1. IS C(PTPCTR) .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
;Here to set up char to punch at next interrupt
PTP6: MOVEM T3,PTPCHA##(F) ;PTPCHA:=OUTPUT J
JRST STOIOS##
PTPS2: SETZB T1,PTPCHA##(F) ;PUNCH FEED
WRIOB T1,@PPB(F)
SOSG PTPCNT##(F) ;COUNT FEED LINES
TLZ S,PTPFED ;PTPFED:=0
MOVEM S,DEVIOS(F) ;PTPIOS:=C(S)
POPJ P, ;Dismiss
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
;Here at end of buffer, see if can start a new one
PTPADV: PUSHJ P,ADVBFE## ;ADVANCE BUFFER
JRST PTPDSC ;EXIT1. NEXT BUFFER EMPTY
PUSHJ P,SETIOD## ;IN A WAIT? IOW:=0
;Here to start a new buffer
PTP9: TLZ S,IOFST ;IOFST:=0
MOVE T1,DEVOAD(F)
AOS T1
HRRM T1,DEVPTR(F) ;PTPPTR18-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) ;PTPCTR:=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: MOVEI T1,INTENB ;Get interrupt enable
BCIO T1,@PPS(F) ;Turn the PTP off
POPJ P, ;Now dismiss the interrupt
END