Google
 

Trailing-Edge - PDP-10 Archives - BB-X140B-BB_1986 - 10,7/703anf/dndn11.p11
There are 3 other files named dndn11.p11 in the archive. Click here to see a list.
.SBTTL	DNDN11 - DN11 ROUTINES  09 SEP 80

;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.

VRDN11=015			;FILE EDIT NUMBER

.IF NE FTDN11

;	DN11 DATA FIELDS
;
; IN DDB:
;
;	DB.DNS	DN11 SOFTWARE STATUS BITS
	DNDIAL=B7		;1=MEANS WE ARE DIALING
	DNDISP=B0+B1+B2+B3+B4+B5;DISPLACEMENT OF THIS DN11 (0-63)
;
;
;	DB.DNT	DN11 TIMER AND TIMER CODE BITS
	DNTIME=B0+B1+B2+B3+B4+B5	;TIMER (MAX 63 SECS)
	DNCODE=B6+B7			;TIMER CODE

;
;	DN11 PARAMETERS
;
; TIMER VALUES (IN SECONDS)
;
	.IIF NDF DN.TDG,DN.TDG=10.	;TIME FOR DIGIT
	.IIF NDF DN.TCL,DN.TCL=20.	;TIME FOR END OF CALL
	.IIF NDF DN.TDL,DN.TDL=20.	;TIME FOR DLO TO CLEAR

;TIMER CODES. THESE ARE 0,1,2,3 FOR PAUSE,END OF CALL, DIGIT AND DLO WAIT
	TMPAUS=0		;TIME FOR PAUSE (CODE 16)
	TMEOC=1			;TIME FOR END OF CALL
	TMDGT=2			;TIME FOR DIGIT
	TMDLO=3			;TIME FOR DLO TO CLEAR
; DNTAB:		12(10) WORD TABLE OF DN11 DATA
;
;			;1ST WORD IS ADR OF HDW STATUS REGISTER
;			;2ND WORD IS ADR OF DDB ASSOCIATED WITH ACU
	DNPTR=4		;3RD WORD IS POINTER TO LAST DIGIT DIALED
;			;NEXT 18 BYTES ARE DIGITS TO DIAL
;			;FIRST DIGIT IS NULL
;			;LAST IS ALWAYS 17
	DNTABL=^D24	;NUMBER OF BYTES IN A BLOCK

.MACRO	X	Q
DN'Q'BLK:
	.REPT	4
	ZZ		;HDW ADR
	.WORD	0	;DDB ADR
	.WORD	0	;POINTER TO NUMBER
	.BLKB	^D18	;NUMBER TO DIAL
	ZZ=ZZ+2
	.ENDR
.ENDM	X
	Z=0
	ZZ=DNBASE
.REPT	DN11N
	X	\Z
	Z=Z+1
.ENDR
	.WORD	0
;	DEFINE INTERRUPT VECTOR ROUTINES
;
.MACRO	X	A
DNVA'A':	MOV	R0,-(P)
	MOV	#DN'A'BLK,R0		;ADDRESS OF DN11 BLOCK
.ENDM	X
	Z=DN11N-1
.REPT	DN11N
	X	\Z
.IIF NE Z,	BR	DNINT
	Z=Z-1
.ENDR	;.REPT DN11N
;	DN11 INTERRUPT SERVICE ROUTINE
;
;	REGISTER USAGE
;
;	R3	DNTAB ENTRY FOR THIS 801 CONTROLLER
;	R2	ADDRESS OF HARDWARE STATUS REGISTER
;	J	POINTER TO TTYDDB FOR THIS LINE
;
DNINT:	SAVE	<R1,R2,R3,J>		;SAVE REGS
	CLR	-(P)			;CLEAR COUNT OF CONDITIONS HANDLED
	MOV	R0,R3			;POINT TO ITS DNTAB ENTRY
DNLOOP:	MOV	@R3,R2			;GET HARDWARE ADDRESS
	BEQ	20$			;IF DOESN'T EXIST TRY NEXT ONE
	MOV	2(R3),J			;GET DDB ADDRESS
	BIT	#DN..IE,@R2		;IS INTERRUPT ENABLE SET FOR THIS ONE ?
	BEQ	20$			;BECAUSE IF NOT DON'T CARE ABOUT IT
	BIT	#DN.DNE,@R2		;SEE IF DONE IS SET FOR THIS ONE
	BEQ	20$			;NO, TRY NEXT
	INC	(P)			;COUNT IT
	JSR	PC,DNFUNC		;AND HANDLE IT
20$:	ADD	#DNTABL,R3		;POINT TO NEXT DNTAB ENTRY
	BIT	#6,@R3
	BNE	DNLOOP			;AND CONTINUE
40$:	TST	(P)+			;CHECK COUNTER
	BNE	90$			;SKIP IF NON-ZERO
	TWIDDLE				;NO INTERRUPT CONDITION FOUND???
90$:	RESTORE	<J,R3,R2,R1,R0>
	RTI				;DISMISS
;SUBROUTINE TO DETERMINE CAUSE OF INTERRUPT AND DO APPROPRIATE DN FUNCTION
DNFUNC:	BIC	#DN.DGT!DN.DNE,@R2	;CLEAR DONE AND DIGIT
	BIT	#DN.PWI!DN.ACR,@R2	;POWER LOSS OR 801 TIMEOUT?
	BNE	DNFAIK			;YES, ABORT CALL FUNCTION
	BIT	#DN.PND,@R2		;IS IT TIME TO GIVE NEXT DIGIT
	BEQ	DNINT9			;NO, RETURN
	MOVB	@DNPTR(R3),R0		;GET LAST DIGIT DIALED
	CMP	#17,R0			;WAS IT END OF CALL?
	BEQ	DNINT9			;YES, DON'T PRESENT ANOTHER
DNEXTD:	INC	DNPTR(R3)		;POINT TO NEXT DIGIT
	MOVB	@DNPTR(R3),R0		;GET IT
	CMP	R0,#16			;SEE IF 5 SEC DELAY
	BNE	30$			;NO,CONTINUE
	MOVB	#<100*TMPAUS+5>,DB.DNT(J)	;SET TIME
	BR	DNINT9			;DONE
30$:	CMP	R0,#17			;END OF CALL?
	BNE	40$			;NO, CONTINUE LOOKING
	MOVB	#<100*TMEOC+DN.TCL>,DB.DNT(J)	;SET END OF CALL TIME
	BR	DNINT9			;CHECK FOR SUCCESS
40$:	MOVB	#<100*TMDGT+DN.TDG>,DB.DNT(J)	;SET DIGIT TIME
	MOVB	R0,1(R2)		;PUT CHARACTER TO 801
	BISB	#DN..DP,@R2		;SET DIGIT PRESENT
DNINT9:	BIT	#DN.DSS,@R2		;DID WE WIN ?
	BEQ	99$			;NOT YET
	BIC	#DN..IE,@R2		;DON'T NEED INTERRUPT ENABLE
	BICB	#DNTIME,DB.DNT(J)	;CLEAR END OF CALL TIMER
	MOV	DB.LCB(J),R0		;ADDRESS OF LCB
	MOVB	#LCS.DS,LC.STA(R0)	;SET TO DIAL SUCCEEDED STATE
99$:	RTS	PC			;RETURN
;HERE ON RECEIPT OF DIAL MESSAGE

DNSTRT:	MOV	DB.LCB(J),R3		;POINT TO LCB
	MOVB	#LCS.DL,LC.STA(R3)	;SET TO DIALING INITIATE
	BIS	#TS.RNG,DB.DCS(J)	;SET RING AND
	BIC	#TS.DTR,DB.DCS(J)	;CLEAR DTR TO TELL -10 WE'RE TRYING
	JSR	PC,QUEXDS		;ENSURE STATUS GETS SENT
	BIT	#40,DB.DVT(J)		;AUTO-DIAL LINE?
	BEQ	94$			;IF NOT STOP NOW
.IF NE FT.CHK
	BIT	#LCB.DS,@DB.LCB(J)	;DATASET LINE?
	ASSERT	NE			;BETTER BE
.ENDC;.IF NE FT.CHK
	CMP	DB.OCN(J),#16.		;NUMBER OF CHARACTERS GREATER THAN 16?
	BGT	94$			;YES, ERROR
	JSR	PC,DNADDR		;GET R1=DNTAB,R2=HDW
	BIT	#DN.PWI,@R2		;POWER ON & HEALTHY ?
	BNE	94$			;NO GOOD
	MOV	#6,R3			;DISPLACEMENT INTO DNTAB
	ADD	R1,R3			;OF FIRST DIGIT
	MOV	R3,4(R1)		;INITIALIZE POINTER
	CLRB	(R3)+			;FIRST BYTE IS 0
20$:	JSR	PC,DVGDBY		;GET NEXT NUMBER
70$:	BIC	#^C17,R0		;STRIP EXTRA BITS
	MOVB	R0,(R3)+		;STASH
	TST	DB.OCN(J)		;MORE LEFT ?
	BNE	20$			;IF SO GET IT
	MOVB	#17,(R3)+		;TRAILING FLAG
	BISB	#DNDIAL,DB.DNS(J)	;MARK THIS LINE AS CONTROLLED BY DN11/801
	BIT	#DN..CR!DN.DLO,@R2	;CALL REQUEST UP?
	BEQ	DNBEGN			;IF READY BEGIN AT ONCE

;HERE BECAUSE WANT TO DIAL BUT DN11 STILL IS BUSY

	BIC	#^CDN..ME,@R2		;CLEAR CALL REQUEST
	MOVB	#<100*TMDLO+DN.TDL>,DB.DNT(J)	;SET TIMER
	RTS	PC			;RETURN
;HERE IF DIAL REQUEST CAN'T BE HONOURED.

93$:	JSR	PC,DVGDBY		;EAT NEXT BYTE
94$:	TST	DB.OCN(J)		;MORE LEFT IN MESSAGE?
	BGT	93$			;YES, EAT REST OF MESSAGE
;	BR	DNFAIL			;NO, TELL -10 WE FAILED

;DN11 CLEAR ROUTINES

DNFAIK:	
DNFAIL:	MOV	DB.LCB(J),R3		;POINT TO LCB
	MOVB	#LCS.DF,LC.STA(R3)	;SET TO DIAL FAIL STATE
DNCLR:	BITB	#DNDIAL,DB.DNS(J)	;THIS LINE CONTROLLED BY US?
	BEQ	99$			;NO
	JSR	PC,DNADDR		;YES, GET DNTAB AND HDW ADDRESS
	BIC	#^CDN..ME,@R2		;CLEAR CALL REQUEST
	BICB	#DNDIAL,DB.DNS(J)	;LINE NO LONGER UNDER OUR CONTROL
	CLRB	DB.DNT(J)		;SO WE SHOULDN'T HAVE A TIMER EITHER
99$:	RTS	PC
;DISPATCH TABLE FROM SECDEV WHEN TIMER IN DB.DNT EXPIRES

DNTDSP:	DNTM5S				;5 SECOND DELAY
	DNTMEC				;END OF CALL
	DNTMDG				;DIGIT
	DNTMDL				;DLO CLEAR

;HERE WHEN END OF 5 DIGIT DELAY EXPIRES

DNTM5S:	JSR	PC,DNADDR		;GET DNTAB ADDR IN R1, HWD IN R2
	MOV	R1,R3			;PUT DNTAB IN R3 FOR DNFUNC
	PIOFF				;DON'T ALLOW INTERRUPTS
	JSR	PC,DNFUNC		;PND SHOULD STILL BE ON
	PION				;ENABLE INTERRUPTS
	RTS	PC			;RETURN

;HERE WHEN END OF CALL DELAY EXPIRES

DNTMEC:	JSR	PC,DNADDR		;GET DNTAB AND HDW ADDRESSES
	BR	DNFAIL			;CALL FAILED

;HERE WHEN DIGIT TIMER EXPIRES
;	ONLY HAPPENS IF DIALER NOT WORKING

DNTMDG:	JSR	PC,DNADDR		;SETUP R1 &R2 TO POINT TO DNTAB & HDW
	BR	DNFAIL			;CALL FAILED

;HERE WHEN DLO CLEAR TIMER EXPIRES

DNTMDL:	JSR	PC,DNADDR		;GET HARDWARE AND DNTAB
	BIT	#DN.DLO,@R2		;DATA LINE OCCUPIED STILL ON?
	BNE	DNFAIL			;YES, MUST BE BROKEN
DNBEGN:	MOVB	#<100*TMDGT+DN.TDG>,DB.DNT(J)	;START DIGIT TIMER
	BIS	#DN..CR!DN..IE,@R2	;SET CALL REQUEST
	RTS	PC			;EXIT

;SUBROUTINE TO GET DNTAB ADDRESS IN R1, DN STATUS REG ADDRESS IN R2
; DESTROYS R0

DNADDR:	MOVB	DB.DNS(J),R0		;DNTAB DISPLACEMENT
	BIC	#177700,R0		;CLEAR UNWANTED BITS
	ASL	R0			;TIMES 2.
	ASL	R0			;TIMES 4.
	ASL	R0			;TIMES 8.
	MOV	R0,R1			;SAVE FOR LATER
	ASL	R0			;TIMES 16.
	ADD	R0,R1			;TIMES 24.
	ADD	#DN0BLK,R1		;PLUS ADDRESS OF FIRST
	MOV	@R1,R2			;GET HARDWARE ADDRESS
	RTS	PC

.ENDC;.IF NE FTDN11