Google
 

Trailing-Edge - PDP-10 Archives - bb-bt99l-bb - dnptp.p11
There are 4 other files named dnptp.p11 in the archive. Click here to see a list.
.SBTTL	DNPTP - PAPER TAPE PUNCH ROUTINES  28 MAR 79

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1981,1984 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.

VRPTP=006			;FILE EDIT NUMBER

.IF NE PTPN

DRESET=0
	DDBGEN	PTP,PP,PTPN,2,<DS.OUT>	;MAKE A DEVICE BLOCK FOR THE PTP

;	DB.DCS - DEVICE CONTROL STATUS BITS
;	000001	;MASTER ERROR
;	000002	;NO POWER
;	000004	;END OF TAPE

PTPSER:	MOV	#PTPMML,DB.MML(J)	;largest size we like
	MOVB	#1,DB.DVV(J)		;CONTROLLER TYPE 1
	JSR	PC,DVCCFM		;SEND CONNECT CONFIRM
	CLR	R1			;IN CASE NO ERROR
	MOV	@DB.HDW(J),R0		;GET PUNCH STATUS
	BPL	30$
	INC	R1			;MASTER ERROR FLAG
30$:	CMP	R1,DB.DCS(J)		;DID THAT CHANGE STATUS ?
	BEQ	36$
	BIS	#DS.XDS,@J
	MOV	R1,DB.DCS(J)		;SAVE UPDATED STATUS
36$:	JSR	PC,DVXDCS		;SEND STATUS TO THE 10
	TST	DB.DCS(J)
	BNE	60$			;IF TROUBLE WE ARE DONE
	JSR	PC,DVXDRQ		;SEND DATA REQUESTS
	BIT	#DS.ACT,@J		;IS PUNCH ALREADY PUNCHING
	BNE	50$			;IF SO WE ARE DONE
	TST	DB.OBF(J)		;IS THERE OUTPUT ?
	BEQ	64$			;IF NOT JUST WAIT
	MOVB	#-5,DB.TIM(J)		;GIVE IT 4-5 SECONDS TO PUNCH
	BIS	#DS.ACT,@J		;FLAG DEVICE IS ACTIVE
	BIS	#PP.INE,@DB.HDW(J)	;ENABLE INTERRUPTS
50$:	RTS	PC
60$:	MOVB	#-5,DB.TIM(J)		;CHECK PUNCH AGAIN IN A WHILE
64$:	BIT	#DS.DSC!DS.DIE,@J	;TIME TO QUIT ?
	BEQ	50$
	JMP	DVCCFM			;SEND DISCONNECT MSG

PTPTIM:	BIT	#DS.ACT,@J		;WAS PUNCH NOT READY ?
	BEQ	20$
	TWIDDLE	@DB.HDW(J)		;COUNT TIMES THIS HAPPENS
	BIC	#DS.ACT,@J		;NO LONGER ACTIVE
	BIC	#PP.INE,@DB.HDW(J)	;DISABLE INTERRUPTS
20$:	JMP	QUEDEV			;QUEUE UP THE DEVICE

DEVINT	PTP,PP

PTPINT:	SAVE	<R0,R1>
	TST	@DB.HDW(J)		;IS HDW ERROR FLAG UP ?
	BMI	20$			;STOP PUNCHING
10$:	JSR	PC,DVGBYT		;GET NEXT BYTE TO PUNCH
	BR	40$			;WE GOT ONE
	BR	30$			;GOT MESSAGE TYPE
20$:	BIC	#PP.INE,@DB.HDW(J)	;DISABLE INTERRUPTS
	BIC	#DS.ACT,@J		;FLAG NOT ACTIVE
	CLRB	DB.TIM(J)		;RESET TIMER
	JSR	PC,QUEDEV
	BR	90$
30$:	DEC	R0			;DATA ?
	BEQ	10$
	DEC	R0			;DATA WITH EOR ?
	BEQ	10$
.IF EQ DGUTS
	TRAP
.IFF
	CTYMSG	NCL
35$:	JSR	PC,DVGBYT		;GET NEXT BYTE
	BR	35$			;EAT BAD MSG
	BR	30$			;TRY AGAIN WITH NEXT MSG
	BR	20$			;ALL DONE
.ENDC ;.IF EQ DGUTS
40$:	MOVB	#-2,DB.TIM(J)		;RESET TIMER
	MOVB	R0,PP.DAT		;PUNCH DATA
90$:	RESTORE	<R1,R0,J>
	RTI

.ENDC;.IF NE PTPN