Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_SRC_1_19910112 - 7/ft3/monitor/stanford/pnvsrv.mac
There is 1 other file named pnvsrv.mac in the archive. Click here to see a list.
;<6-1-MONITOR>PNVSRV.MAC.6, 11-Apr-85 18:08:49, Edit by WHP4
;<6-1-MONITOR>PNVSRV.MAC.5, 11-Apr-85 17:23:12, Edit by WHP4
; add PNRRH routine for Pup NTINF% support
;<6-1-MONITOR>PNVSRV.MAC.4, 23-Mar-85 23:31:59, Edit by LOUGHEED
;<6-1-MONITOR>PNVSRV.MAC.3, 21-Mar-85 14:04:46, Edit by LOUGHEED
;<6-1-MONITOR>PNVSRV.MAC.2, 14-Mar-85 01:19:01, Edit by LOUGHEED
;<6-1-MONITOR>PNVSRV.MAC.1, 12-Mar-85 19:45:59, Edit by LOUGHEED
; Turn TTPNDV into PNVSRV for Release 6.1
SEARCH PROLOG,TTYDEF
TTITLE (PNVSRV,PNVSRV,< -- PUP NVT Service>)
SUBTTL Frank Gilmurray / SUMEX Project, Stanford University / 6-Jun-80

;Define additional data in dynamic data block

TTYPUP==:TTDEV			; PUP NVT data in device dependent word

	RESCD			; This module is resident
;TTCPNL - Check if Pup NVT logins are allowed

TTCPNL::SAVELN			; Preserve static line number
	MOVE T3,FACTSW		; Get the facts
	TXNE T3,SF%PNV		; See if PUP NVT logins allowed
	 JRST RETO		; Yes, return +1 with T1 negative
	HRROI T1,[ASCIZ/
?Logging in on PUP network terminals is currently disallowed.
/]
	CALL TTEMES		; Print an error message
	JRST RETZ		; T1 is non-negative on failure
;PUPSTP - Set terminal type and mechanical bits
;Returns +1 always

PUPSTP::CAIL T1,NTTYPS
	 RET			; Terminal type out of range
	STOR T1,TTTYP,(T2)	; Store new terminal type
	LDB T3,[POINT 3,TTYPE0(T1),2] ; Get mechanical bits (TTMBIT in TTYSRV)
	DPB T3,[POINT 3,TTFLGS(T2),3] ; Put where noticed
	HRRZ T3,TTYPE1(T1)	; Get video attribute
	SKIPE T3		; Is this a video terminal?
	 MOVEI T3,1		; Yes
	STOR T3,TTNXO,(T2)	; Set page-stop bit if video
	RET

;PUPACT - Set output in progress
;Returns +1 always

PUPACT::SETONE TTOTP,(T2)
	RET

;PUPACT - Clear output in progress
;Returns +1 always

PUPIAC::SETZRO TTOTP,(T2)
	RET
;CHKPNV - See if this line number is a PNV

;Accepts:
;	T2/ internal line number
;	CALL CHKPNV

;Returns +1: if not PNV
;	 +2: if PNV
;PUPCTY is alternative entry point with T2 containing dynamic data

PUPCTY::SAVELN			; Save dynamic data pointer
	DYNST			; Get static line nbr
CHKPNV::ACVAR <W1>		; Get an AC to work with
	LOAD W1,TTSTY,(T2)	; Get line type from static data
	CAIE W1,TT.PNV		; Test for PUP NVT
	 RETBAD			; No. Failure
	RETSKP			; Return success

	ENDAV.			; End ACVAR W1

;Check TTMSG to a Pup NVT line
PNVSND::SAVELN			; Save static line nbr
	CALL STADYN		; Get corresponding dynamic addr
	 RET			; Inactive, return +1
	CALLRET CKPRT1		; Check if port attached and not hanging up
;PPSOUT - Check for output waiting for BSP processing
;Note that sense of skip in PPSOUT is different from PPSOBE and PPSALL
;Returns +1 output of some type is pending
;	 +2 no output need be done

PPSOUT::TMNN <TTHPO,TTSAL>,(T2)	; If sendall output
	SKIPE TTOCT(T2)		; Or normal output
	 RET			; Take a non-skip return
	RETSKP			; Skip return if no output

;PPSOBE - Test for TTY output pending
;Returns +1 TTY output buffer empty
;	 +2 need to empty TTY output buffer

PPSOBE::SKIPN TTOCT(T2)
	 RET
	RETSKP

;PPSALL - Test for a non-empty sendall buffer 
;Returns +1 sendall buffer is empty
;	 +2 need to copy from sendall buffer to TTY buffer

PPSALL::TMNN <TTHPO,TTSAL>,(T2)
	 RET
	RETSKP

;GETAB routine for NVTPUP table (NVT offset already checked at .GETAB)
GTBNVT::ADD T2,TT1LIN+TT.PNV	; Convert NVT offset to TTY line number
	CALL STADYN		; Is line active?
	 TDZA T1,T1		; No, return 0
	MOVE T1,TTYPUP(T2)	; Yes, return PUP NVT info
	RET

;PNVCLX - Handle a hangup
;We use the standard TTYDEA routine which knows how to handle the special
; case of a PNV connection.
;Returns +1 always
;Preserves T2

PNVCLX::CALL TTYDEA		; Invoke standard deassignment routine
	IFNSK.
	  HRLI T1,(T2)		; Static line number for scheduler test
	  MDISMS		; Wait for PNV connection to close
	  JRST PNVCLX		; Try again
	ENDIF.
	RET			; All done, take a single return
;Flag user-invoked DETACH on PUP NVT (to avoid carrier-off PSI)
;This prevents job from being logged out -- see JOBCOF
;Called from LDATCH in the module MEXEC

PNVDET::SKIPG T2,CTRLTT		; Get controlling TTY
	 RET			; Inactive line or already detached
	LOAD T3,TTSTY,(T2)	; Get line type from static data
	CAIN T3,TT.PNV		; Is this line a PUP NVT?
	 CALL STADYN		; Yes, get dynamic addr
	  RET			; Here if not NVT or inactive
	SETONE TTPDT,(T2)	; Flag user-invoked detach on PUP NVT
	RET

;Start output to a PUP NVT
PNVSOU::DYNST T3		; Get static line number
	XCALL (XCDSEC,PNVIN0)	; Schedule a scan request for this line
	RETSKP			; Return to caller

;Check if PUP NVT port attached and not hanging up
CHKPRT:	SAVELN			; Save dynamic line nbr
CKPRT1:	SKIPGE T2,TTYPUP(T2)	; Port attached
	TXNE T2,HUREQF		;  and not hanging up?
	 RETBAD			; No
	RETSKP			; Yes
;PNVDYM - set up dynamic data for a PUP/TTY buffer
;Caller must be NOSKED with CHNOFF DLSCHN
;Takes	T1/ byte allocation
;	T2/ dynamic data pointer
;	T3/ byte pointer to start of buffer
;Returns +1 always

PNVDYM::CAIGE T1,MINBYT		; Within expected range?
	 BUG.(INF,PNVDYX,TTYSRV,SOFT,<Too small PNV buffer size>)
	STOR T1,TOMAX,(T2)	; Set up buffer capacity
	SKIPE TTOIN(T2)		; Sanity check
	 BUG.(INF,PNVDYY,TTYSRV,SOFT,<PNV output pointer clobbered>)
	MOVEM T3,TTOIN(T2)	; Store input byte pointer
	MOVEM T3,TTOOUT(T2)	; Store output byte pointer
	SKIPE TTOCT(T2)		; Another sanity check
	 BUG.(INF,PNVDYZ,TTYSRV,SOFT,<PNV output count clobbered>)
	MOVEI T1,1		; Only one output buffer
	STOR T1,TTNOU,(T2)	; ...
	STOR T1,TOWRN,(T2)	; Wakeup if one character in buffer
	RET			; Return to caller

;PNVREL - "Release" a TTY buffer belonging to a PNV
;We just pretend to not have a buffer by clearing our pointers
; and output byte count.  PNVBUF takes care of actually discarding
; the storage. TTCOBI is the old name for the routine that would clear
; a TTY output buffer without doing SYNCH negotiations (PNVCOB does that).
;Takes	T2/ dynamic data pointer
;Returns + 1 always

TTCOBI::			;An old name for this function
PNVREL::SETZM TTOIN(T2)		;Clear pointer for putting in
	SETZM TTOOUT(T2)	;Clear pointer for taking out
	SETZM TTOCT(T2)		;Clear output byte count
	MOVEI T1,MINBYT		;Capacity of smallest PUP buffer we will get
	STOR T1,TOMAX,(T2)	;Reset the buffer capacity
	RET			;Return to caller

;PNVOBP - return byte pointer to last output byte
;Must be called NOSKED with CHNOFF DLSCHN
;Takes	T2/ dynamic data pointer
;Returns +1 always, T1/ output buffer byte pointer

PNVOBP::MOVE T1,TTOIN(T2)	;Get pointer to last byte
	RET			;Return to caller
;PNVSAL - do sendall processing for PNV's
;Must be called NOSKED and CHNOFF DLSCHN
;Called immediately after PNVBUF.  We are thus ensured that there will be
; room for at least one character.
;Takes	T2/ dynamic data pointer
;Returns +1 buffer ready for sending
;Preserves T2,T3; clobbers T1,T4

PNVSAL::TMNN <TTHPO,TTSAL>,(T2)	;Sendall or high priority?
	 BUG.(INF,PNVSAX,TTYSRV,SOFT,<PNVSAL called but no sendall>)
	LOAD T4,TOMAX,(T2)	;Get buffer capacity
PNVSA0:	CALL PNVGTO		;Get next sendall character
	 RET			;No more, return to caller with buffer space
	JN TTFLO,(T2),PNVSA0	;Loop back again if flushing characters
	IDPB T1,TTOIN(T2)	;Deposit character into output buffer
	AOS T1,TTOCT(T2)	;Count another output character
	CAIGE T1,(T4)		;Any more room in the buffer?
	 JRST PNVSA0		;Yes, go for another character
	RET			;Full. Must send off packet


;PNVGTO - helper routine for PNVSAL, based on TTSND routine
;Takes	T2/ dynamic data pointer
;Returns +1 no more characters
;	 +2 success, T1/ next character

PNVGTO:	TMNN TTHPO,(T2)		;High priority message queued?
	IFSKP.
	  ILDB T1,TTSAL2(T2)	;Yes, get next char
	  CAIE T1,.CHDEL	;End of string?
	  RETSKP		;No, return character
	  SETZRO TTHPO,(T2)	;Rubout marks end of string, clear
	ENDIF.
	TMNN TTSAL,(T2)		;Sendall?
	IFSKP.
	  ILDB T1,TTSAL2(T2)	;Get next character
	  DECR TSALC,(T2)	;Decrement count of remaining characters
	  TRZ T1,200		;Clear parity bit on PNV's
	  OPSTR <SKIPG>,TSALC,(T2) ;Any more characters to send?
	   CALL CLRSAL      	;Clear sendall for line
	  RETSKP		;Return the char
	ENDIF.
	RET			;No more characters
;PNVXOF - here when we have decided to XOFF. We set the standard
; XOFF flag (TTSFG). We lower the capacity of our output buffer to match
; the amount of output we have queued; this ensures we will send this
; buffer and then block (most likely in the CTRLQW test).
 
;This routine takes the place of the TTOPFC 9-bit character that is
; inserted into a TTY output buffer to indicate a page full point.
; We deal only with 8-bit bytes for efficiency reasons. 

PNVXOF::JN TTSFG,(T2),R		;Do this only once
	SETONE TTSFG,(T2)	;Set CTRL-S flag
	NOSKED			;Prevent races
	CHNOFF DLSCHN		;Turn off TTY scanning
	SKIPG CX,TTOCT(T2)	;Get number of bytes queued for output
	 MOVEI CX,1		;So we don't hang in TCOTST
	STOR CX,TOMAX,(T2)	;Make our buffer look full
	CHNON DLSCHN		;Reallow TTY scanning
	OKSKED			;Resume scheduling
	RET			;Skip return to caller
;PNVSFG - test if we are in a page wait
;Don't get another output buffer if CTRL-S has been typed
;Returns +1 must block, T1/ scheduler test
;	 +2 okay to get a buffer

PNVSFG::JE <TTSFG>,(T2),RSKP	;Take a skip return if not in a page hold 
	DYNST T1		;Else convert dynamic to static
	HRLI T1,CTRLQW		;Set scheduler test
	MOVSS T1		;Normalize
	RET			;Return to caller

;CTRLQW - wait until the CTRL-S flag is cleared

CTRLQW:	MOVE T2,T1		;Copy static line number
	CALL STADYN		;Convert to dynamic pointer
	 JRST 1(T4)		;Nothing there?  Shouldn't happen.
	JE <TTSFG>,(T2),1(T4)	;Wakeup if flag has been cleared
	SKIPL TTYPUP(T2)	;Still assigned?
	 JRST 1(T4)		;No, wakeup
	JRST 0(T4)		;Keep on sleeping

;PNRRH - PNV device dependent "return remote host" code
;
; Given the line #, returns the originating hostname, line and
; network type. Places this info in the users NTINF% .NWRRH 
; argument block.  NTINF has already checked the user arguments 
; for validity.
;
; Call with T1/ address of internal arg block
;
;   ARG+.NWABC/ # of bytes available for host name
;   ARG+.NWFNC/ not used
;   ARG+.NWNNP/ byte pointer to store hostname string
;   ARG+.NWLIN/ address of dynamic data for line
;   ARG+.NWTTF/ flags, and network and terminal types
;   ARG+.NWNNU/ node # word 1
;   ARG+.NWNU1/ node # word 2
;
; Returns + 1 on error with T1/ error code
;	  + 2 on success

	SWAPCD

PNRRH::	ACVAR <UAB>		;DECLARE A TEMPORARY WORKING AC
	MOVE UAB,T1		;SAVE POINTER TO ARG BLOCK
	MOVX T4,NW%PN		;SET NETWORK TYPE
	DPB T4,[POINT 9,.NWTTF(UAB),17] ;STORE NETWORK TYPE
	NOSKED			;DON'T LET THINGS GO AWAY
	MOVE T2,.NWLIN(UAB)	;GET ADDRESS OF DYNAMIC DATA
	CALL DYNSTA		;GET TTY LINE NUMBER
	CALL STADYN		;IS IT OKAY?
	 JRST PNRRH1		;NO, GO SET "NO NODE NAME KNOWN"
	SKIPL T2,TTYPUP(T2)	;GET TTYPUP WORD FOR THIS CONNECTION
	 JRST PNRRH1		;PNV NOT ASSIGNED
	HRRZS T2		;CLEAR FLAG BITS
	SKIPE T3,PUPFPT(T2)	;GET POINTER INTO PUP SECTION
	MOVE T3,1(T3)		;GET HOST ADDRESS OR LEAVE ZERO IF FULLY WILD
	OKSKED			;ALL OKAY AGAIN
	MOVEM T3,.NWNNU(UAB)	;SAVE NET,,HOST INFORMATION
	SETZ T4,		;NO PORT INFO WANTED
	MOVE T1,.NWNNP(UAB)	;GET POINTER FOR DEPOSITING HOSTNAME
	MOVE T2,[PN%FLD!PN%OCT!T3] ;NO DEFAULTS, SHOW CONSTANTS, ARGS IN T3,T4
	PUPNM%			;TRANSLATE TO STRING
	 ERJMPS PNRRH2		;SOME ERROR
	RETSKP			;SUCCCESS, RETURN TO CALLER

;HERE TO HANDLE ERROR RETURNS

PNRRH1:	OKSKED			;ALLOW SCHEDULING AGAIN
PNRRH2:	MOVX T1,NW%NNN		;SET "NO NODE NAME KNOWN" FLAG
	IORM T1,.NWTTF(UAB)	;SET IN ARGUMENT BLOCK
	RETSKP			;RETURN TO CALLER

	ENDAV.

	RESCD

	TNXEND
	END