	TITLE LYNX - TYPE OUT ALL SYSTEM TLINKS
	SUBTTL P. BUDNE @DEC
 
	SEARCH MONSYM,MACSYM
	.REQUIRE SYS:MACREL
	SALL
 
	T1==1
	T2==2
	T3==3
	T4==4
 
	P==17
 
EV:	JRST ST
	JRST ST
 
ST:	RESET
	MOVE P,[IOWD PDLSIZ,PDL]
 
	MOVEI T1,.FHSLF
	SETO T3,
	EPCAP
	CALL INIT
	CALL WORKER
	HALTF
	JRST ST

INIT:	MOVEI T1,.SNPSY
	MOVE T2,[RADIX50 0,TTACTL]
	MOVE T3,[RADIX50 0,STG]
	SNOOP
	 JSHLT
	HRLI T2,1
	MOVEM T2,TTACTL#
 
	MOVE T2,[RADIX50 0,TTLINK]
	MOVE T3,[RADIX50 0,TTYSRV]
	SNOOP
	 JSHLT
	HRLI T2,1
	MOVEM T2,TTLINK#
	RET

WORKER:	ACVAR <P2>
 	MOVE T1,[SIXBIT /TTYJOB/]
	SYSGT
	HLLZ P2,T2
TOP:	MOVEI T1,(P2)
	CALL DOIT
	 NOP
BOT:	AOBJN P2,TOP
	RET 
	ENDAV.

; Print all links for a given terminal
; Call with terminal number in T1, and TTY
; Returns +2 on win, +1 on error
 
DOIT:	ACVAR <T5,P1>		;Save away P1
	MOVE P1,T1		;Save argument
	CALL GETLNK		;Get link information
	 RET			;Loss- return
 
	MOVE T5,[POINT 9,T4]	;Load out 4 9-bit bytes
 
	TMSG <TTY>		;Print luser's (Lunkee's) tty number
	MOVEI T1,.PRIOU		;Onto the tty
	MOVE T2,P1		;get tty number again
	MOVEI T3,10		;print in octal
	NOUT			;type it out
	 JSHLT			;<morte>
	CALL PRTUSR		;type associated user name
 
;<
	HRROI T1,[ASCIZ / ==> TTY/] ;type out lunkers
	PSOUT
 
LOOP:	ILDB T2,T5		;fetch first 9 bit byte
	CAIN T2,777		;-1?
	 JRST LOOP		;yes, ignore
	JRST LOOP2		;no, go type it
 
LOOP1:	ILDB T2,T5		;load next byte
	CAIN T2,777		;-1?
	 JRST ELOOP		;yes, check for end
	TMSG <, TTY>		;no, type next lunker
 
LOOP2:	MOVEI T3,10		;Here to type out link-er
	MOVEI T1,.PRIOU		;on tty
	NOUT			;in octal
	 JSHLT
	CALL PRTUSR		;type user name
 
ELOOP:	TLNE T5,770000		;end of word?
	 JRST LOOP1		;no, keep looking
	TMSG <
>
	AOS (P)			;we won (didn't lose)
	RET
	ENDAV.

; PEEK link information for tty in T1
; returns +2 with TTLINK word in T4
; returns +1 on error
 
GETLNK:	ADD T1,TTACTL
	MOVEI T2,T4
	PEEK			;GET TTACTL ENTRY
	 JSHLT
 
	JUMPLE T4,.POPJ		;NOT ACTIVE TTY
 
	MOVE T1,TTLINK
	ADD T1,T4		;ADD TTACTL ENTRY
	MOVEI T2,T4		;RESULT TO T4
	CALL .PEEK
	 JSHLT
	CAME T4,[-1]
	 AOS (P)
.POPJ:	RET

.PEEK:	TLNE T1,^-<1>		;EXTENDED ADDR??
	 JRST [	MOVEM T1, PEKMON ;  STORE MONITOR ADDRESS
		MOVEM T2, PEKADR ;  SAVE
		MOVEI T1, PEKBLK ;  GET ARG BLOCK
		XPEEK%		;  GO-FOR-IT!
		 ERJMP R
		RETSKP ]
	PEEK
	 RET
	RETSKP

; Type user on a given tty
; Takes TTY in T2
; Returns +1 allways
 
PRTUSR:	ACVAR <TT>
	MOVE TT,T2		;Save TTY

	MOVEI T1,.TTDES(TT)	; Make 'terminal designator'
	MOVE T2,[-3,,GJIBLK]	;Get info
	SETZ T3,		;Start at top
	GETJI			;Get job info
	 JFCL

	TMSG <: (>		;Type : for TTY
 	MOVEI T1,.TTDES(TT)	;Make 'terminal designator'
	DVCHR
	 ERJMP PRTU.0
	HLRE T2,T3		;Get assigner
	JUMPL T2,PRTU.0		;None
	CAMN T2,GJIBLK+.JIJNO	;Same as job's controller?
	 JRST PRTU.1		; yes, normal
	MOVEI T1,"*"		;Otherwise say assigned
	PBOUT
	SKIPA T1,T2
PRTU.0:  MOVEI T1,.TTDES(TT)	; Make 'terminal designator'
	MOVE T2,[-3,,GJIBLK]	;Get info
	SETZ T3,		;Start at top
	GETJI			;Get job info
	 IFJER.
	  TMSG <Beats me!)>
	  RET
	 ENDIF.

PRTU.1:	SKIPE T2,GJIBLK+.JIUNO
	IFSKP.
	 TMSG <Not logged in>
	ELSE.
 	 MOVEI T1,.PRIOU	;Get I/O designator
	 DIRST
	  IFJER.
	   TMSG <Unknown>
	  ENDIF.
	ENDIF.

	SKIPG GJIBLK+.JIJNO
	 IFSKP.	
	  MOVEI T1,.PRIOU
	  MOVEI T2,"#"
	  BOUT
	  MOVE T2,GJIBLK+.JIJNO
	  MOVEI T3,^D10
	  NOUT
	   TRN
	 ENDIF.

	MOVEI T1,")"
	PBOUT
	RET
	ENDAV.

 
PDL:	BLOCK <PDLSIZ==20>
GJIBLK:	BLOCK 3
PEKBLK:	PEKLEN			;*** XPEEK% BLOCK ****
	.XPPEK			;FUNCTION
PEKCNT:	1			;COUNT
	0			;WORDS XFERED
PEKMON:	0			;MONITOR ADDR
PEKADR:	0			;USER ADDR
PEKLEN==.-PEKBLK		;*** END OF XPEEK BLOCK ***

JUNK:	END <2,,EV>
