Google
 

Trailing-Edge - PDP-10 Archives - bb-jr93d-bb - 7,6/ap014/ttdint.x14
There are 3 other files named ttdint.x14 in the archive. Click here to see a list.
TITLE TTDINT - DRIVER FOR DTE20 TELETYPES V073
SUBTTL	A. WILSON/WRS/CDO    15 APR 86

	SEARCH	F,S,DTEPRM

;NOTE:
; IF ANY CHANGES ARE MADE TO DTEPRM THAT THIS MODULE MUST HAVE, UPDATE
; THE FOLLOWING SYMBOL TO THE VERSION OF DTEPRM THAT MUST BE USED
	PRMMIN==16
; THIS WAY, ASSEMBLING THIS MODULE WITH WRONG VERSION OF DTEPRM FOR SOME REASON
; (LIKE FORGETTING TO ASSEMBLE IT) WILL CAUSE ASSEMBLY TO TERMINATE.
; THIS SCHEME DOES NOT CAUSE EXTRA EDITING, SINCE ONLY FILES
; WHICH NEED THE CHANGES NEED PRMMIN TO BE UPDATED. MODULES
; THAT DO NOT NEED A NEW VERSION OF DTEPRM NEED NOT DEMAND IT.

IFL VDTPRM-PRMMIN,<PRINTX ?PLEASE USE LATEST VERSION OF DTEPRM
			PASS2
			END>


	$RELOC
	$HIGH

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


;
;
;XP VTTDNT,073
	SALL
	ENTRY	TTDINT

TTDINT::


;BITS IN LEFT HALF OF .CP20F

F20ADS==(1B0)		;TOLD -20F ITS OK TO ANSWER DATASETS
F20LPP==:(1B1)		;LOST PRIMARY PROTOCOL (SET BE DTESER)
F20SDT==:(1B2)		;TELL FRONT-END OF DATE/TIME CHANGE (SET BY DTESER)
SUBTTL	MACROS AND STRINGS

DEFINE	$8BIT(SIZE,TEXT),<
	SIZE==<COUNT==<C%0==<C%1==<C%2==<C%3==0>>>>>
	IRPC (TEXT)<
		CHAR==<ASCII\TEXT\>_-^D29
		STOBYT(\COUNT,CHAR)
		COUNT==COUNT+1
		SIZE==SIZE+1
		IFE COUNT-4,<
			BYTE (8) C%0,C%1,C%2,C%3
			COUNT==<C%0==<C%1==<C%2==<C%3==0>>>>
		>
	>
	IFN COUNT,<BYTE (8) C%0,C%1,C%2,C%3>
>

DEFINE	STOBYT(BYTE,CHAR),<C%'BYTE==CHAR>



;STRING TO SEND TO ALL TERMINALS AFTER SWITCHING FROM PRIMARY PROTOCOL TO
;	SECONDARY AND BACK AGAIN.  -20F SAID "%DECSYSTEM-10 NOT RUNNING"

CONMSG:	$8BIT	CONSIZ,<
[DECsystem-10 Continued]
>
SUBTTL	DISPATCH TABLES

	CPOPJ##			;(-1)
CT0DSP::EATMSG##		;(0)
	EATMSG##		;(1)
	EATMSG##		;(2)
	EATMSG##		;(3)
	CTYLND			;(4)TAKE LINE, CHAR
	EATMSG##		;(5)
	EATMSG##		;(6)
	EATMSG##		;(7)
	EATMSG##		;(10)
	EATMSG##		;(11)
	EATMSG##		;(12)
	EATMSG##		;(13)
	EATMSG##		;(14)
	EATMSG##		;(15)
	EATMSG##		;(16)
	CTYACK			;(17)ACK
	EATMSG##		;(20)
	EATMSG##		;(21)
	EATMSG##		;(22)
	EATMSG##		;(23)
	EATMSG##		;(24)
	EATMSG##		;(25)
	EATMSG##		;(26)
	EATMSG##		;(27)
	EATMSG##		;(30)
	EATMSG##		;(31)
	EATMSG##		;(32)
	EATMSG##		;(33)
	EATMSG##		;(34)
	CPOPJ##			;(-1)
DLSDSP::EATMSG##		;(0)
	EATMSG##		;(1)
	EATMSG##		;(2)
	EATMSG##		;(3)
	DLSLND			;(4)TAKE LINE, CHAR
	EATMSG##		;(5)
	EATMSG##		;(6)
	EATMSG##		;(7)
	EATMSG##		;(10)
	EATMSG##		;(11)
	EATMSG##		;(12)
	EATMSG##		;(13)
	EATMSG##		;(14)
	TTDDWA			;(15)DATASET WAS ANSWERED
	TTDDHU			;(16)DATASET HUNG UP
	DLSACK			;(17)ACK
	EATMSG##		;(20)
	EATMSG##		;(21)
	TTDHLS			;(22)HERE ARE LINE SPEEDS
	EATMSG##		;(23)
	EATMSG##		;(24)
	DLSAAL			;(25)ACK ALL
	EATMSG##		;(26)
	EATMSG##		;(27)
	EATMSG##		;(30)
	EATMSG##		;(31)
	EATMSG##		;(32)
	EATMSG##		;(33)
	EATMSG##		;(34)
;DISPATCH FOR SCNSER COMMUNICATION WITH TTDINT

CTYDSP::			;USE SAME DISPATCH TABLE FOR THE CTYS
TTDDSP::PJRST	SPCTYO##	;SECONDARY PROTOCOL XMIT INTERRUPT
	PJRST	TTDDSC		;GO TO DATASET CONTROL ROUTINE
	PJRST	TTDSEC		;GO TO ONCE-A-SECOND ROUTINE
	POPJ	P,		;NO INITIALIZATION ROUTINE
	PJRST	SETCHP##	;MARK H/W PARAMETERS TO COME BACK THROUGH TTDSCN
	POPJ	P,		;RETURN ON LINE PARAMETER CONTROL CALL
	POPJ	P,		;RETURN ON SET ELEMENT NUMBER CALL
	PJRST	TTDREM		;HANDLE REMOTE CALL (^O)
	PJRST	CPOPJ1##	;ALWAYS SAY ON-LINE

;HERE ON REMOTE CALL FROM SCNSER ISR DISPATCH

TTDREM:	CAIE	T3,3		;ONLY CARE ABOUT ^O STRUCK
	POPJ	P,		;WASN'T, RETURN
	MOVSI	T1,LTLCTO##	;GET ^O STRUCK FLAG FOR -20F
	IORM	T1,LDBTTD##(U)	;STORE IN LDB
	PJRST	SETCHP##	;AND LET ONCE-A-TIC CODE SEE IT

;HERE FROM DTESER WHEN DTELDR RESTARTS PRIMARY PROTOCOL ON THE MASTER

TTDRLD::SE1ENT			;ENTER SECTION 1
	PUSHJ	P,SAVE1##	;SAVE P1
	HRRZS	.CP20F##	;CLEAR -20F FLAGS
	PUSH	P,U		;SAVE U
	SETZ	P1,		;START WITH DLS #0
TTDRL1:	MOVE	U,P1		;COPY DLS LINE NUMBER
	PUSHJ	P,DLSMON	;CONVERT TO -10 LINE NUMBER
	  JRST	UPOPJ##		;ALL DONE
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	TRNN	U,-1		;SETUP YET?
	JRST	TTDRL2		;NOPE
	SETZM	LDBTTD##(U)	;CLEAR FLAGS
	PUSHJ	P,SETCHP##	;NEED TO RE-SEND LINE SPEEDS
TTDRL2:	AOJA	P1,TTDRL1	;STEP TO NEXT DLS

;HERE FROM DTESER FOR DTE. UUO FUNCTION 21
;T1=CPU,,DTE (ALREADY VERRIFIED AND WE ARE ON RIGHT CPU)

TTDDLN::HLRZ	T2,T1		;GET CPU NUMBER
	TRNN	T1,-1		;WANT CFE
	JRST	TTDDL1		;YES, GET KLINIK,,CTY
	ADD	T1,TTDOFS##(T2)	;CONVERT DTE# TO 10 LINE #
	MOVEI	T1,.UXTRM(T1)	;CONVERT TO A UDX
	PJRST	STOTC1##	;GIVE GOOD RETURN
TTDDL1:	HRRZ	T1,.CPCTN##	;GET CTY # ON THIS CPU
	HRL	T1,TTDOFS##(T2)	;GET KLINIK (=LOWEST ENTRY)
	TDO	T1,[.UXTRM,,.UXTRM] ;CONVERT BOTH
	PJRST	STOTC1##	;GIVE GOOD RETURN
SUBTTL	ONCE A TICK CODE FOR TTDINT

;TTDSTO IS CALLED ONCE-PER-TICK ON EACH CPU TO DE-QUEUE OUTPUT

TTDSTO::HRRZ	T1,.CP20F##	;NUMBER OF CHARACTERS STILL IN BUFFER
	JUMPN	T1,CPOPJ##	;STILL ACTIVE, WAIT FOR POSTING
	PJRST	TTDSCN		;GO START UP OUTPUT IF ANY WAITING




;HERE FROM DTESER ON POST CALL FOR STRING OUTPUT

TTDPST:	SE1ENT			;ENTER SECTION 1
	HRRZ	U,S		;GET SAVED VALUE OF U (LINE NUMBER)
	MOVE	U,LINTAB##(U)	;LDB ADDRESS
	MOVEI	T2,TTDTIM##	;IRMA-LIKE VALUE FOR LTLACK
	DPB	T2,LDPTDT##	;SET TIMER LIMIT
	MOVSI	T1,LTLACK##	;WAITING FOR ACK FLAG
	IORM	T1,LDBTTD##(U)	;MARK THE LINE
	HLLZS	.CP20F##	;START STRING CHAR COUNT AT ZERO
;;	PJRST	TTDSCN		;SCAN FOR A BUSY LINE
;ROUTINE TO FIND AN ACTIVE LINE AND START OUTPUT ON IT.

TTDSCN:	SE1ENT			;ENTER SECTION 1
	MOVEI	T1,.CPCTQ##	;GET QUEUE HEADER
	PUSHJ	P,TOTAKE##	;FIND NEXT ACTIVE LINE
	  POPJ	P,		;NONE LEFT, RETURN
	PUSHJ	P,SKPMPP##	;PRIMARY PROTOCOL?
	  JRST	TTDSC4		;IF SECONDARY
	MOVEI	T1,L1RCHP##	;CHANGE HARDWARE PARAMETERS REQUEST BIT
	TDNE	T1,LDBBYT##(U)	;WAITING TO CHANGE?
	JRST	TTDCHP		;CHANGE IF NECESSARY
	MOVSI	T1,LTLACK##	;WAITING FOR ACK
	TDNN	T1,LDBTTD##(U)	;IS IT WAITING
	SKIPL	LDBDCH##(U)	;OR IS THIS LINE IDLE?
	JRST	TTDSCN		;CANNOT OUTPUT, TRY FOR ANOTHER LINE
	PUSH	P,P1		;SAVE P1
	MOVE	P1,[POINT 8,.CP20B##] ;GET POINTER TO STRING AREA
TTDSC1:	PUSHJ	P,XMTCHR##	;GET A CHARACTER TO SEND
	  JRST	TTDSC2		;LINE IS IDLE
	IDPB	T3,P1		;STORE CHARACTER IN BUFFER
	AOS	T1,.CP20F##	;ADVANCE COUNT
	TLZ	T1,-1		;CLEAR FLAG BITS
	CAIL	T1,TTDMOS##	;HAVE AS MANY CHARS AS WE WANT?
	JRST	TTDSC3		;YES, SEND WHAT WE'VE GOT
	JRST	TTDSC1		;TRY FOR ANOTHER CHARACTER
TTDSC2:	HRRZ	T1,.CP20F##	;ANY CHARACTERS FOUND THIS PASS
	JUMPE	T1,[POP	P,P1	;NO, RESTORE P1
 		    JRST TTDSCN] ;AND LOOK FOR ANOTHER LINE
TTDSC3:	POP	P,P1		;RESTORE
	PUSHJ	P,SAVE4##	;SAVE P1-P4
	PUSHJ	P,STDTQ		;SET UP DTEQUE ARGUMENTS
	HRRI	P2,EM.IND+.EMSTR ;OUTPUT INDIRECT STRING TO DLS
	HRR	P3,.CP20F##	;SET P3 TO DLS LINE #,,COUNT
	MOVE	P4,[POINT 8,.CP20B##] ;POINT TO INDIRECT STRING
	LDB	S,LDPLNO##	;REMEMBER LINE NUMBER
	HRLI	S,TTDPST	;POST ADDRESS
	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
	  HLLZS	.CP20F##	;FAILED, UNBLOCK CODE
	POPJ	P,		;RETURN

;HERE IF RUNNING SECONDARY PROTOCOL

TTDSC4:	LDB	T1,LDPLNO##	;GET LINE NUMBER
	HRRZ	T2,.CPCTN##	;GET CTY ON THIS CPU
	CAIE	T1,(T2)		;THIS IT
	JRST	TTDSC5		;NO, IGNORE DATA
	SKIPGE	LDBDCH##(U)	;LINE IDLE?
	PUSHJ	P,XMTCHR##	;YES, GET CHARACTER FOR OUTPUT
	  POPJ	P,		;IDLE, RETURN
	PUSHJ	P,CLRIRM##	;CLEAR LOST ACK FLAG
	PJRST	SPCTYO##	;AND TYPE OUT ON CTY
TTDSC5:	SKIPGE	LDBDCH##(U)	;LINE IDLE
	PUSHJ	P,XMTCHR##	;YES, GET A CHARACTER
	  POPJ	P,		;ALL DONE
	JRST	.-2		;THROW IT AWAY
SUBTTL	ROUTINE TO CHANGE HARDWARE PARAMETERS

;ENTRY TTDCHP IS USED WHEN SCANNING THE 'START OUTPUT' QUEUE.
;IT CLEARS THE L1RCHP BIT IN LDBBYT BEFORE SENDING THE CHP MESSAGE.
;ARGS:	T1/BIT TO CLEAR, SETUP BY MOVEI T1,L1RCHP
;	U/LDB ADDRESS
;	PUSHJ	P,TTDCHP
;	RETURN HERE

TTDCHP:	PUSHJ	P,SAVE4##	;SAVE P1-P4
	ANDCAM	T1,LDBBYT##(U)	;CLEAR CHP REQUEST BIT
	MOVSI	T1,LTLCTO##	;CONTROL-O STRUCK
	TDNE	T1,LDBTTD##(U)	;WAS IT
	PUSHJ	P,TTDCTO	;YES, TELL -20F
	MOVSI	T1,LTLXFF##	;SEND XOFF STATUS BIT
	TDNN	T1,LDBTTD##(U)	;DO WE WANT TO?
	 JRST	TTDCH2		;NO, SKIP THE CHECKS
	ANDCAM	T1,LDBTTD##(U)	;YES, CLEAR THE BIT
	MOVSI	T2,LOLSTP##	;CONTROL-S STRUCK
	MOVSI	T1,LTLXOF##	;GET TTD XOF BIT
	TDNN	T2,LDBOST##(U)	;WAS IT ^S
	JRST	TTDCH1		;NO, NOT ^S
	TDNN	T1,LDBTTD##(U)	;YES, DID WE KNOW THAT?
	PUSHJ	P,TTDXOF	;SEND XOF MESSAGE FOR LINE
	JRST	TTDCH2		;NOW SET SPEEDS
TTDCH1:	TDNE	T1,LDBTTD##(U)	;NOT ^S DID WE THINK IT WAS?
	PUSHJ	P,TTDXON	;SEND XON MESSAGE FOR LINE
TTDCH2:	PUSHJ	P,TTDSSP	;SEND SPEEDS
	LDB	T1,[POINT 4,LDBTTD##(U),3] ;GET TRANSMIT SPEED OF TERMINAL
	MOVSI	T2,LPLXNF##	;TERMINAL PAGE SET
	MOVSI	T1,LTLAXF##	;AUTO XOFF ENABLE SET
	TDNN	T2,LDBPAG##(U)	;ARE WE IN PAGE MODE?
	 JRST	TTDC2A		;NO
	TDNN	T1,LDBTTD##(U)	;HAS IT BEEN SET YET?
	PUSHJ	P,TTDAXF	;NO, GO DO IT
	JRST	TTDCH3		;
TTDC2A:	TDNE	T1,LDBTTD##(U)	;HAS IT BEEN CLEARED YET?
	PUSHJ	P,TTDAXF	;NO, DO SO NOW
TTDCH3:	PJRST	TOPOKE##	;LOOK AT MORE (AND THIS) NEXT TICK
SUBTTL	SET LINE SPEEDS

;HERE TO SET SPEEDS FOR RSX-20F FRONT-END LINE
;ARGS:	U/LDB ADDRESS
;CALL:	SAVE P1-P4
;	PUSHJ	P,TTDSSP
;	RETURN HERE
;WON'T NOT SEND SPEEDS TO -20F IF THEY DIDN'T CHANGE FROM LAST TIME.  IF A LINE
;	GETS CONFUSED, MUST SET TO ANOTHER SPEED AND THEN BACK TO DESIRED ONE.

TTDSSP:	MOVE	T3,[POINT ^D16,.CP20B##] ;POINT TO PLACE IN CDB
	SETO	T4,		;INDICATE BOTH CHANGED
	SETCM	T1,LDBDCH##(U)	;COMPLEMENT DATASET BIT
	HLL	T1,LDBTTD##(U)	;GET REMOTE FOR -20F
	TDNN	T1,[LTLRBS##,,LDRDSD##] ;ALREADY TOLD -20F
	TRZ	T4,-1		;NO, MUST SEND SPEED
	LDB	T1,LDPRSP##	;GET CODE FOR LINE TRANSMIT SPEED
	LDB	T2,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
	CAIN	T1,(T2)		;DID SPEED CHANGE
	AOSA	T4		;NO, COUNT NUMBER THAT DIDN'T
	DPB	T1,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
	MOVE	T1,LSPTAB##(T1)	;CONVERT TO BAUD
	IDPB	T1,T3		;BUILD THE SPEED MESSAGE
	LDB	T1,LDPTSP##	;GET CODE FOR LINE RECEIVE SPEED
	LDB	T2,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
	CAIN	T1,(T2)		;DID THIS ONE CHANGE
	AOJG	T4,CPOPJ##	;RETURN IF NEITHER CHANGED
	DPB	T1,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
	MOVE	T1,LSPTAB##(T1)	;CONVERT TO BAUD
	IDPB	T1,T3		;BUILD THE SPEED MESSAGE
	MOVEI	T2,1		;ASSUME ONE STOP BIT
	CAIG	T1,^D110	;LESS THAN OR EQUAL TO 110 BAUD?
	MOVEI	T2,2		;YES, SO USE TWO STOP BITS
	MOVE	T1,LDBDCH##(U)	;GET LINE CHARACTERISTICS WORD
	TRNE	T1,LDRDSD##	;DATASET LINE?
	JRST   [MOVSI	T1,LTLRBS##;YES, GET "REMOTE BIT SENT" BIT
		TDNE	T1,LDBTTD##(U);REMOTE BIT ALREADY SENT?
		JRST	.+1	;YES, BACK TO MAIN CODE
		IORM	T1,LDBTTD##(U);NO, MARK IT SENT AS OF NOW
		TRO	T2,140000;SET REMOTE BIT AND AUTO BAUD
		JRST	.+1]	;BACK TO MAIN CODE
	IDPB	T2,T3		;STORE ARGUMENT
	PUSHJ	P,STDTQ		;SET UP DTEQUE ARGUMENTS
	HRRI	P2,EM.16B+EM.IND+.EMHLS ;SET DLS LINE SPEEDS
	HRRI	P3,6		;SIX BYTES OF ARGUMENT
	MOVE	P4,[POINT ^D16,.CP20B##] ;POINT TO SPEED MESSAGE
	HLLOS	.CP20F##	;MARK BUFFER IN USE
	MOVSI	S,TTDSS1	;POST ADDRESS
	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
TTDSS1:	  HLLZS	.CP20F##	;FAILED (OR DONE)
	POPJ	P,		;RETURN

;NOTE:	THE NONSENSE WITH THE LTLRBS BIT IN THE CODE ABOVE IS NECESSITATED
;BY A QUIRK OF THE RSX-20F FRONT-END.  THE REMOTE BIT IN A LINE-SPEED
;MESSAGE SHOULD BE SENT ONLY ONCE; IF IT'S SENT AGAIN AFTER A USER HAS
;DIALED-IN, IT CAUSES THE DATASET TO BE DISCONNECTED.
SUBTTL	XOFF/AUTO-XOFF/XON/CONTROL-O PROCESSING

;ROUTINE TO SEND AUTO-XOFF/XOFF/XON/CNTRL-O FOR ^S/^Q/^O ON AN RSX-20F LINE
;ARGS:	U/LDB ADDRESS
;	T1/BIT TO SET/CLEAR IN LDBTTD
;CALL:	SAVE P1-P4
;	PUSHJ	P,TTDXXX	WHERE XXX IS AXF, XOF, XON, OR CTO
;	RETURN HERE

TTDAXF:	MOVEI	P2,.EMAXF	;ENABLE/DISABLE AUTO XOFF FUNCTION
	PUSHJ	P,STDTQ		;SET UP DTEQUE ARGUMENTS
	MOVSI	T2,LPLXNF##	;GET TERMINAL PAGE BIT
	TDNE	T2,LDBPAG##(U)	;IS IT SET?
	 JRST	TTDAX1		;YES
	TRZ	P3,-1		;NO, CLEAR AUTO-XOFF
	ANDCAM	T1,LDBTTD##(U)	;AND SHOW IT AS CLEAR
	JRST	TTDXO2		;GO QUEUE IT
TTDAX1:	HRRI	P3,1		;ENABLE AUTO-XOFF
	IORM	T1,LDBTTD##(U)	;AND SHOW IT AS SET
	JRST	TTDXO2		;GO QUEUE IT

TTDXOF:	MOVEI	P2,.EMXOF	;XOF FOR DLS
	IORM	T1,LDBTTD##(U)	;SET REQUESTED BIT
	JRST	TTDXO1		;GO SET UP DTESER ARGUMENTS
TTDCTO:	SKIPA	P2,[.EMFLO]	;FLUSH OUTPUT FOR DLS LINE
TTDXON:	MOVEI	P2,.EMXON	;XON FOR DLS
	ANDCAM	T1,LDBTTD##(U)	;CLEAR REQUESTED BIT

TTDXO1:	PUSHJ	P,STDTQ		;SET UP DTEQUE ARGUMENTS
TTDXO2:	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
	  JFCL			;FAILED, IGNORE IT
	POPJ	P,		;RETURN

SUBTTL	DATASET CONTROL

;SUBROUTINE TO EXERCISE CONTROL OVER A DATASET
;ARGS:	U/DSCTAB INDEX
;	T3/TRANSACTION CODE
;CALL:	PUSHJ	P,TTDDSC
;	RETURN HERE

TTDDSC:	CAIN	T3,DSTON##	;WANT TO TURN DATASET ON?
	PJRST	TTDCND		;YES
	CAIN	T3,DSTOFF##	;WANT TO TURN IT OFF?
	PJRST	TTDHUD		;YES, TELL RSX-20F TO HANG UP DATASET
	CAIN	T3,DSTREQ##	;WANT TO KNOW STATUS?
	MOVEI	T3,DSTNAC##	;YES, TELL SYSINI NOT TO TAKE ACTION
	POPJ	P,		;RETURN

TTDHUD:	PUSHJ	P,SAVE4##	;SAVE P1-P4
	HRRZ	P3,DSCTAB##(U)	;GET MONITOR LINE NUMBER
	PUSHJ	P,STDT1		;SET UP DTEQUE ARGUMENTS
	HRRI	P2,.EMHUD	;HANG UP DATASET FOR DLS LINE
	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
	  JFCL			;FAILED, JUST IGNORE
	POPJ	P,		;RETURN
TTDCND:	PUSHJ	P,SAVE4##	;SAVE P1-P4
	HRRZ	P3,DSCTAB##(U)	;GET MONITOR LINE NUMBER
	PUSHJ	P,STDT1		;SET UP DTEQUE ARGUMENTS
	HRRI	P2,.EMDSC	;CONNECT DATASET
	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
	  JFCL			;FAILED, JUST IGNORE
	POPJ	P,		;RETURN
SUBTTL	TAKE LINE SPEEDS FROM FRONT-END

;HERE FROM DTESER WHEN RSX-20F SENDS LINE SPEEDS

TTDILS:	TDZA	S,S		;HERE ON COMPLETION OF INDIRECT TRANSFER
TTDHLS:	MOVSI	S,TTDILS	;HERE ON START OF MESSAGE
	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;FAILED, IGNORE THIS MESSAGE
	HLRZ	U,P3		;GET DLS LINE NUMBER
	PUSHJ	P,DLSMON	;CONVERT TO MONITOR LINE NUMBER IN U
	  PJRST	EATMSG##	;OUT OF RANGE, IGNORE THIS MESSAGE
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	MOVE	P4,[POINT ^D16,.CP20S##] ;WHERE TO PUT INDIRECT DATA
	JUMPE	S,TTDIL1	;BRANCH IF HAVE INDIRECT DATA
	MOVEI	P3,6		;WE WANT 6 8-BIT BYTES
	POPJ	P,		;RETURN

TTDIL1:	ILDB	T1,P4		;GET LINE TRANSMIT SPEED IN BAUD
	PUSHJ	P,FNDSPD	;SET T1 TO CODED SPEED VALUE
	SE1ENT			;ENTER SECTION 1
	JUMPE	T1,TTDIL2	;IGNORE IF -20F DOESN'T KNOW
	DPB	T1,LDPRSP##	;SAVE IN LDB
	DPB	T1,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
	ILDB	T1,P4		;GET LINE RECEIVE SPEED IN BAUD
	PUSHJ	P,FNDSPD	;SET T1 TO CODED SPEED VALUE
	DPB	T1,LDPTSP##	;SAVE IN LDB
	DPB	T1,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
TTDIL2:	SETZB	P3,P4		;TELL DTESER WE'RE DONE
	MOVSI	T1,LTLAXF##	;IF -20F TOLD US THE SPEEDS
	ANDCAM	T1,LDBTTD##(U)	;IT ALSO CLEARED AUTO-XOFF ENABLE
	PJRST	SETCHP##	;EXIT, WILL SEND ENABLE AUTO-XOFF AT TTDCHP

;ROUTINE TO FIND CODED VALUE OF LINE SPEED IN BAUD
;ARGS:	T1/SPEED IN BAUD
;CALL:	PUSHJ	P,FNDSPD
;	RETURN HERE, CODED VALUE IN T1

FNDSPD:	MOVSI	T2,-LSPLEN##	;MAKE AOBJN POINTER
	CAME	T1,LSPTAB##(T2)	;IS THIS THE SPEED?
	AOBJN	T2,.-1		;NO, TRY NEXT ONE
	SKIPL	T2		;MAYBE, POINTER STILL VALID?
	MOVEI	T2,0		;NO, INVALID SPEED, BUT SAY 0
	HRRZ	T1,T2		;PUT CODE IN T1
	POPJ	P,
SUBTTL	HANDLE DATASET(S) ANSWERED

;HERE FROM DTESER WHEN A DATASET WAS ANSWERED BY RSX-20F

TTDDWA:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
TTDDW1:	SUBI	P3,2		;ACCOUNT FOR TWO BYTES/ARGUMENT
	JUMPL	P3,CPOPJ##	;RETURN WHEN COUNT EXHAUSTED
	ILDB	U,P4		;GET DLS LINE NUMBER

;ZERO THE LINE'S SPEED BYTES SO THAT INITIA WON'T GET A MISTAKEN NOTION AS TO
;WHAT THIS LINE'S SPEED IS.  RSX20F SHOULD BE COMING ALONG SOON TO TELL US WHAT
;THE SPEED REALLY IS.  THIS IS WORKING ON THE ASSUMPTION THAT ALL RSX20F
;DIALUPS ARE ALSO AUTOBAUD DETECT LINES, WHICH IS CURRENTLY THE CASE.  SHOULD
;THIS EVER CHANGE ...

	PUSHJ	P,DLSMON	;CONVERT TO MONITOR LINE NUMBER IN U
	  PJRST	EATMSG##	;OUT OF RANGE, IGNORE THIS MESSAGE
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	SE1ENT			;ENTER SECTION 1
	SETZ	T1,		;GET LINE SPEED BYTE FOR ZERO
	DPB	T1,LDPRSP##	;SAVE IN LDB
	DPB	T1,[POINT 4,LDBTTD##(U),3] ;REMEMBERED SPEED
	DPB	T1,LDPTSP##	;SAVE IN LDB
	DPB	T1,[POINT 4,LDBTTD##(U),7] ;REMEMBERED SPEED
	MOVSI	T1,LTLACK##!LTLTIM##	;MAKE SURE WE AREN'T WAITING
	ANDCAM	T1,LDBTTD##(U)	; FOR AN ACK ON THIS LINE
	LDB	U,P4		;GET THE DLS LINE NUMBER AGAIN
	IBP	P4		;MOVE PAST UNUSED BYTE
	PUSHJ	P,TTDCDD	;CONVERT DLS LINE # TO DSCTAB INDEX
	  JRST	TTDDW1		;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
	MOVEI	T3,DSTRNG##	;GET CODE FOR PHONE RANG
	PUSHJ	P,DSCREC##	;CALL SCNSER
	MOVEI	T3,DSTON##	;RSX-20F ALREADY HAS DATASET ON
	PUSHJ	P,DSCREC##	;TELL SCNSER
	JRST	TTDDW1		;LOOP FOR NEXT ARGUMENT


SUBTTL	HANDLE DATASET(S) HUNG UP

;HERE FROM DTESER ON DATASET(S) HUNG UP

TTDDHU:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
TTDDH1:	SUBI	P3,2		;ACCOUNT FOR TWO BYTES/ARGUMENT
	JUMPL	P3,CPOPJ##	;RETURN IF COUNT EXHAUSTED
	ILDB	U,P4		;GET DLS LINE NUMBER
	IBP	P4		;MOVE PAST UNUSED BYTE
	PUSHJ	P,TTDCDD	;CONVERT DLS LINE # TO DSCTAB INDEX
	  JRST	TTDDH1		;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
	MOVEI	T3,DSTOFF##	;GET CODE FOR DATASET OFF
	PUSHJ	P,DSCREC##	;TELL SCNSER
	JRST	TTDDH1		;LOOP FOR NEXT ARGUMENT
SUBTTL	RECEIVE LINE DATA FROM RSX-20F

;HERE TO HANDLE CHARACTER DATA FOR DLS LINES
;THIS ROUTINE PROCESSES "MULTIPLEXED" INPUT (DATA,LINE,DATA,LINE,...)

DLSLND:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
DLSLN1:	SUBI	P3,2		;DECREMENT COUNT BY 2
	JUMPL	P3,CPOPJ##	;RETURN IF DONE
	ILDB	T3,P4		;GET DATA
	ILDB	U,P4		;GET DLS LINE NUMBER
	PUSHJ	P,DLSMON	;CONVERT TO MONITOR LINE NUMBER IN U
	  JRST	DLSLN1		;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
	PUSHJ	P,GIVLND	;GIVE CHARACTER TO SCNSER
	JRST	DLSLN1		;LOOP FOR MORE



;HERE TO HANDLE CHARACTER DATA FOR CTY

CTYLND:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
	HRRZ	U,.CPCTN##	;GET CTY LINE NUMBER
CTYLN1:	SUBI	P3,2		;ACCOUNT FOR TWO BYTES/ARGUMENT
	JUMPL	P3,CPOPJ##	;RETURN IF COUNT EXHAUSTED
	ILDB	T3,P4		;GET DATA
	IBP	P4		;FIX UP POINTER
	PUSHJ	P,GIVLND	;GIVE CHARACTER TO SCNSER
	JRST	CTYLN1		;LOOP FOR ANY MORE



;HERE TO HAND THE CHARACTER TO SCNSER, CHECK TO XOFF HANDLED BY -20F

GIVLND:	SE1ENT			;ENTER SECTION 1
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	ANDI	T3,CK.CHR	;KEEP ONLY CHARACTER
	MOVE	T1,T3		;COPY THE CHARACTER
	SKIPL	LDBATR##(U)	;EIGHT-BIT TERMINAL?
	ANDI	T1,CK.CH7	;NO, KEEP ONLY ASCII PART
	CAIE	T1,"S"-100	;INCOMING XOFF
	CAIN	T1,"Q"-100	;OR XON
	 CAIA			;YES, DO SOME CHECKING
	PJRST	RECPTY##	;NO, GIVE IT TO SCNSER
	MOVSI	T2,LTLAXF##	;HAVE WE ENABLED AUTO-XOFF YET
	TDNN	T2,LDBTTD##(U)	;DON'T SAY -20F STOPPED IF IT DIDN'T
	 JRST	GIVLN1		;
	MOVSI	T2,LTLXOF##	;BIT SAYING WE TOLD -20F TO STOP OUTPUT
	CAIN	T1,"S"-100	;XOFF?
	IORM	T2,LDBTTD##(U)	;MARK SINCE IT DID IT ITSELF
	CAIN	T1,"Q"-100	;XON?
	ANDCAM	T2,LDBTTD##(U)	;CLEAR SINCE IT DID IT ITSELF
	PUSHJ	P,SETCHP##	;COME BACK AND CHECK IF XOFF/XON IS A DATA CHAR
GIVLN1:	PJRST	RECPTY##	;NOW GIVE THE XOFF/XON TO SCNSER
SUBTTL	PROCESS NORMAL ACK MESSAGE FOR TERMINALS

;HERE TO PROCESS ACK MESSAGE FOR DLS LINES

DLSACK:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
DLSAC1:	SUBI	P3,2		;DECREMENT COUNT BY 2
	JUMPL	P3,CPOPJ##	;RETURN WHEN COUNT EXHAUSTED
	ILDB	U,P4		;GET DLS LINE NUMBER
	IBP	P4		;MOVE PAST UNUSED BYTE
	PUSHJ	P,DLSMON	;GET MONITOR LINE NUMBER IN U
	  JRST	DLSAC1		;OUT OF RANGE, LOOP FOR NEXT ARGUMENT
	PUSHJ	P,PRCACK	;ACK THE LINE
	JRST	DLSAC1		;LOOP FOR NEXT ARGUMENT



;HERE FROM DTESER ON ACK MESSAGE FOR CTY

CTYACK:	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
CTYAC1:	SUBI	P3,2		;ACCOUNT FOR TWO BYTES/ARGUMENT
	JUMPL	P3,CPOPJ##	;RETURN WHEN COUNT EXHAUSTED
	ILDB	T1,P4		;GET DLS LINE NUMBER
	IBP	P4		;MOVE PAST UNUSED BYTE
	HLRZ	U,.CPCTN##	;GET CTY DLS LINE NUMBER
	CAME	T1,U		;IS THIS IT?
	JRST	CTYAC1		;NO, LOOP FOR NEXT ARGUMENT
	HRRZ	U,.CPCTN##	;GET -10 LINE NUMBER
PRCACK:	SE1ENT			;ENTER SECTION 1
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	MOVSI	T1,LTLACK##!LTLTIM##	;WAITING FOR ACK
	ANDCAM	T1,LDBTTD##(U)	;NOT ANYMORE
	PJRST	TOREQ##		;GET LINE STARTED AGAIN
SUBTTL	ACK ALL PROCESSING FOR RSX-20F TERMINALS

;HERE TO HANDLE ACK ALL MESSAGE FOR DLS LINES

DLSAAL:	SE1ENT			;ENTER SECTION 1
	PUSHJ	P,CHKP1		;CHECK P1 FROM DTESER
	  PJRST	EATMSG##	;COULDN'T, IGNORE THIS MESSAGE
	PUSHJ	P,SAVE3##	;SAVE DTESER'S ACS
	MOVE	P1,.CPCPN##	;GET CPU NUMBER
	MOVE	P2,TTDOFS##(P1)	;GET STARTING LINE NUMBER FOR TTD GROUP
	MOVSI	P3,LTLACK##!LTLTIM##	;WAITING FOR ACK
DLSAA1:	CAML	P2,TTDLOM##(P1)	;STILL IN THIS TTD GROUP?
	PJRST	DLSAA2		;NO, ACK CTY AND RETURN
	MOVE	U,LINTAB##(P2)	;YES, GET LDB ADDRESS
	ANDCAM	P3,LDBTTD##(U)	;SIGNAL LINE ACK'ED
	PUSHJ	P,TOREQ##	;KICK THE LINE
	AOJA	P2,DLSAA1	;LOOP FOR NEXT LINE
DLSAA2:	HRRZ	U,.CPCTN##	;GET CTY LINE NUMBER
	MOVE	U,LINTAB##(U)	;GET LDB ADDRESS
	ANDCAM	P3,LDBTTD##(U)	;SIGNAL LINE ACK'ED
	PJRST	TOREQ##		;EXIT, GIVING THE LINE A KICK
SUBTTL	ONCE A SECOND ROUTINES

;HERE ONCE A SECOND (CALLED THROUGH ISRCHK DISPATCH)

TTDSEC:	PUSHJ	P,SKPMPP##	;RUNNING PRIMARY PROTOCOL
	  POPJ	P,		;NO, WAIT UNTIL WE ARE
	PUSHJ	P,SAVE4##	;SAVE NOW IN CASE WE NEED THEM
	MOVSI	T2,F20LPP	;DID WE SWITCH PROTOCOL AND BACK AGAIN
	TDNN	T2,.CP20F##	; SET BY SVPPC
	JRST	TTDSE1		;NO, GO CHECK OUT DATASETS
	ANDCAM	T2,.CP20F##	;YES, CLEAR BIT
	HRLZ	P1,.CPCPN##	;GET CPU,,0 FOR DTEQUE
	MOVEI	P2,EM.IND+.EMSNA ;THIS IS A SEND ALL
	MOVEI	P3,CONSIZ	;SIZE OF CONTINUED MESSAGE
	MOVE	P4,[POINT 8,CONMSG] ;POINT TO THE MESSAGE
	SETZ	S,		;NO POST ADDRESS
	SKIPL	DEBUGF##	;DON'T BOTHER IF DEBUGGING
	S0PSHJ	DTEQUE##	;TELL TERMINAL USERS WE ARE NOT "NOT RUNNING"
	  JFCL			;IGNORE ERRORS HERE
TTDSE1:	MOVSI	P1,F20SDT	;DOES DTESER WANT US TO TELL
	TDNE	P1,.CP20F##	;THE FRONT-END ABOUT A DATE TIME CHANGE?
	PUSHJ	P,DTEDTM##	;YES, DO SO
	ANDCAM	P1,.CP20F##	;AND CLEAR THE FLAG
	MOVEI	T1,ST.NRL	;GET BIT FOR NO REMOTE LOGINS
	MOVSI	T2,F20ADS	;ANSWER DATASET FLAG
	TDNE	T1,STATES##	;REMOTE LOGINS ALLOWED?
	JRST	[TDNN T2,.CP20F## ;IS -20F ANSWERING DATASETS
		 JRST TTDSE3	;NO, DO NEXT THING IN SECOND CODE
		 ANDCAM T2,.CP20F## ;CLEAR FLAG THAT WE TOLD -20F ITS OK
		 JRST TTDSE2]	;AND TELL IT TO STOP ANSWERING
	TDNE	T2,.CP20F##	;IS -20F ANSWERING DATASETS
	JRST	TTDSE3		;YES, GO ON TO NEXT THING
	IORM	T2,.CP20F##	;MARK THAT WE TOLD IT TO ANSWER
	TDZA	P3,P3		;ZERO MEANS ENABLE TO ANSWER DATASETS
TTDSE2:	MOVEI	P3,1		;NON-ZERO MEANS DON'T ANSWER DATASETS
	HRLZ	P1,.CPCPN##	;GET CPU,,0 FOR DTEQUE
	MOVE	P2,[.EMDH1,,.EMEDR];ENABLE/DISABLE DATASETS FOR DH11 LINES
	SETZB	P4,S		;NO BYTE POINTER OR POST ROUTINE
	S0PSHJ	DTEQUE##	;QUEUE THE REQUEST
	  JFCL			;IGNORE ANY FAILURE
TTDSE3:	POPJ	P,		;DONE WITH ONCE-A-SECOND CODE FOR NOW

;HERE ONCE A SECOND (CALLED FROM SCNSEC)

TTDSIN::MOVSI	T2,LTLACK##	;GET BIT IMPLYING HUNG CHECKING IS DESIRED
	TDNN	T2,LDBTTD##(U)	;IS IT ON?
	POPJ	P,		;NO, NOTHING TO DO HERE
	LDB	T2,LDPTDT##	;YES, GET CURRENT TIMEOUT VALUE
	SOJLE	T2,TTDSI1	;GO IF EXPIRED
	DPB	T2,LDPTDT##	;STORE UPDATED VALUE IF NOT
	POPJ	P,		;DONE FOR THIS SECOND
TTDSI1:	JUMPL	T2,CPOPJ##	;LTLACK MUST HAVE CLEARED WHILE WE WERE LOOKING
	MOVSI	T2,LTLACK##!LTLTIM## ;GET BITS TO CLEAR
	ANDCAM	T2,LDBTTD##(U)	;ALLOW THE LINE TO GO AGAIN
	PUSH	P,T1		;PRESERVE LDBDCH
	PUSHJ	P,TOPOKE##	;KICK THE LINE
	JRST	TPOPJ##		;RETURN HAPPY
SUBTTL	COMMON SUBROUTINES FOR TTDINT

;ROUTINE TO CHECK P1 AS SUPPLIED BY DTESER FOR VALID -20F DTE
;ARGS:	P1/CPU,,DTE (FROM DTESER)
;CALL:	PUSHJ 	P,CHKP1
;	  RETURN HERE IF NOT A -20F FRONT END
;	RETURN HERE IF IT IS

CHKP1:	HRLZ	T1,.CPCPN##	;GET THIS CPU,,0
	CAMN	T1,P1		;THIS IT
	AOS	(P)		;YES, OK TO PROCEED
	POPJ	P,		;NO, IGNORE CALL


;ROUTINE TO SET UP FOR CALL TO DTEQUE FOR DLS LINE FUNCTIONS
;ARGS:	U/LDB ADDRESS  (ENTER AT STDT1 IF P3 IS ALREADY THE LINE NUMBER)
;CALL:	PUSHJ	P,STDTQ
;	ALWAYS RETURNS HERE WITH
;		P1/CPU # ,, DTE #
;		P2/.EMDLS ,, <UNCHANGED>
;		P3/DLS # ,, 0
;		P4/ 0
;		S/  0

STDTQ:	LDB	P3,LDPLNO##	;GET -10 LINE NUMBER
STDT1:	MOVE	P1,.CPCTN##	;GET DLS,,-10 LINE NUMBERS FOR CTY ON THIS CPU
	CAIE	P3,(P1)		;IS THIS THE CTY
	JRST	STDT2		;NO, WORK HARDER
	HLLZ	P3,P1		;GET DLS # ,, 0
	JRST	STDT3		;FINISH UP AND RETURN
STDT2:	MOVE	P4,.CPCPN##	;GET CPU NUMBER
	SUB	P3,TTDOFS##(P4)	;CONVERT TO A DLS LINE ON THIS CPU
	HLRZS	P1		;ISOLATE CTY LINE NUMBER
	CAIL	P3,(P1)		;LINE BELOW THE CTY
	AOS	P3		;NO, ACCOUNT FOR THE HOLE
	HRLZS	P3		;POSITION THE ANSWER
STDT3:	HRLZ	P1,.CPCPN##	;GET CPU,,0 FOR DTEQUE
	HRLI	P2,.EMDLS	;SET LH P2 = DLS FUNCTION
	SETZB	P4,S		;CLEAR BYTE POINTER AND POST ADDRESS
	POPJ	P,		;AND RETURN
;ROUTINE TO CONVERT DLS LINE # TO DSCTAB INDEX AND RANGE CHECK
;ARGS:	U/DLS LINE NUMBER
;CALL:	PUSHJ	P,TTDCDD
;	  RETURN HERE IF OUT OF RANGE OR CTY ( NOT IN DSCTAB )
;	RETURN HERE IF VALID, DSCTAB INDEX IN U

TTDCDD:	PUSHJ	P,DLSMON	;FIRST, CONVERT TO -10 LINE NUMBER
	  POPJ	P,		;OUT OF RANGE
	PUSH	P,T1		;SAVE T1
	HRRZ	T1,.CPCTN##	;GET CTY FOR THIS CPU
	CAIN	T1,(U)		;THIS IT
	JRST	TPOPJ##		;YES, CTY'S ARE NOT IN DSCTAB, OUT OF RANGE
	MOVEI	U,TTDDSO##(U)	;ADJUST FOR DSCTAB
	JRST	TPOPJ1##	;AND RETURN



;ROUTINE TO CONVERT DLS LINE NUMBER TO MONITOR LINE NUMBER AND RANGE CHECK
;ARGS:	U/DLS LINE NUMBER
;CALL:	PUSHJ	P,DLSMON
;	  RETURN HERE IF LINE NUMBER OUT OF RANGE
;	RETURN HERE, MONITOR LINE NUMBER IN U

DLSMON:	PUSH	P,T1		;SAVE ALL
	MOVS	T1,.CPCTN##	;GET -10 LINE NUMBER,,DLS LINE NUMBER
	CAIN	U,(T1)		;IS THIS CTY ON THIS CPU
	JRST	DLSMN1		;YES
	CAIL	U,(T1)		;IS THIS LINE BELOW CTY#
	SOS	U		;NO, COMPENSATE FOR HOLE
	MOVE	T1,.CPCPN##	;GET CPU WE ARE ON
	ADD	U,TTDOFS##(T1)	;ADD TO START OF LINES ON THIS CPU
	CAMGE	U,TTDLOM##(T1)	;IN RANGE?
	AOS	-1(P)		;YES, GIVE GOOD RETURN
	JRST	TPOPJ##		;RESTORE T1 AND RETURN
DLSMN1:	HLRZ	U,T1		;GET CTY LINE NUMBER
	JRST	TPOPJ1##	;AND TAKE GOOD RETURN


	END