Google
 

Trailing-Edge - PDP-10 Archives - scratch - 10,7/unsmon/ppsser.mac
There are 3 other files named ppsser.mac in the archive. Click here to see a list.
	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 ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
.CPYRT<1973,1986>
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1982,1986 BY
;DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;ALL RIGHTS RESERVED.


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