;;;-*-MIDAS-*-

title HELP A TOTAL LUSER


;; This less losing version written by RWK.
;; Hacked 4/79 by RLB


X=0				;super-temporary non-index AC
A=1
b=2
c=3				;I/O channel for output routines.
d=4
e=5
f=6
t=7				;temporary
tt=10				;temporary, and T+1
j=11				;JNAME we're looking for (I.e. HACTRN)
H=13				;pointer to helper
M=14				;offset for machine
R=15				;random pointer into the system
U=16				;pointer into the system for a job
sp=17				;stack pointer
p=sp				;synonym for those of us who aren't RWK

tyoc==1				;TTY output channel
clic==2				;CLI output channel
dskc==3				;DSK channel for inquir database

pjrst==jrst			;a JRST hack JRST, that ends in a RET
call=pushj sp,			;nicer name for it.
ret=popj sp,

sysloc=400000
%jssys==400000			;system job

define syscal a,b
	.call [setz ? sixbit/a/ ? b ? setz+errret+calerr] termin

argi==1000,,0
val==2000,,0
errret==3000,,0
cnt==4000,,0
cnti==5000,,0

define type &string
	move t,[440700,,[ascii string]]
	movei tt,<.length string>
	.call typebk
	  .lose %lsfil
	termin

typebk:	setz
	sixbit /SIOT/
	c ? t ? setz tt

iotblk: syscal iot,[c ? x]
	  .lose %lsfil
	ret
IOT=call iotblk

beg:	move sp,pdl		;initialize the pdl
	call whoami		;find out who we are
	call syseval		;evaluate some system symbolic locations etc.

	syscal open,[cnti .uao
	       argi tyoc
	       [sixbit /TTY/]]
	  .lose %lsfil


;; gotta do SSTATU since isn't symbolicly in the system!!!!!!!!!!!!!!!!
	syscal sstatu,[val x ? val x ? val x ? val x ? val x ? val itsnam]
	  .lose %lssys

	move t,itsnam		;get the ITS name
	movsi m,-itscnt
	came t,itstab(m)	; Find this machine, or the default
	 aobjn m,.-1
usrgo:	setz r,			;prepare to map over the jobs
	setz u,
	move j,[sixbit /HACTRN/]	;for quick comparison
usrlop:	skipe @uname		;non-empty job slot?
	  came j,@jname		;  and a HACTRN?
	    caia		;    nope!
	      call usrchk	;      yep, go check him out, maybe he's one
	add u,lublk		;next job
	camg u,@usrhi		;still more jobs?
	  jrst usrlop		;  yes, try next

	skipe helpsw		;all done, were we helped?
	  jrst [movei c,tyoc	;  switch typeout to the TTY
	        type /
Help has been sent for, please wait.
/
		.logout 1,]	;  yes, bye-bye
	skipe idlesw		;were there idle people?
	  jrst [movei c,tyoc	;  switch typeout to the TTY
	        type /
I am sorry, it looks as if all the helpers are away from their
consoles.  I'd suggest you wait 5 minutes, then try again.
/
		.logout 1,]
	movei c,tyoc		;no, type on the TTY
	type /
I am sorry, there is no one to help you at the moment.
/
	.logout 1,		;bye-bye

usrchk:	movsi h,-usrmax		;aobjn ptr to helpers
	skipn b,@xuname		;get his XUNAME
	  ret			;  huh?  Can't allow 0 UNAME'...
	setom tellsw		;we tell him we asked

chklop:	camn b,@hlptab(m)	;hlptab(m) -> xxHELP(H) -> sixbit /<helper>/
	  pjrst usrhak		;  it's him, go hack him!
	aobjn h,chklop		;not him, try next?
	ret			;not one of us!

usrhak:		;before we get too eager to send the message, find out whether
		;the helper offers help!
	skipn turist		;if we're not a turist, help is offered.
	  jrst usrhk1
	move t,tbits(m)		;pick up turist refuse bits
	lsh t,(h)		;bit for this helper to sign
	jumpge t,usrhk1		;if not refusing, help
	ret			;else no help.

usrhk1:	syscal open,[cnti .uao	   ;open the CLI channel!
	       argi clic
	       [sixbit /CLI/]
	       @uname		   ;helper UNAME
	       [sixbit /HACTRN/]]
	  ret			   ;  gagged or gone!

	movei c,clic		   ;change output channel to CLI channel
	move tt,runame		   ;get our uname!
	call 6type		   ;type it
	.iot clic,["@]		   ;@ a machine
	move tt,itsnam		   ;get the name of the machine
	call 6type		   ;and type it
	type / (T/		   ;prettify
	ldb x,[030300,,ttynum]	   ;get first digit of our TTY #
	addi x,60		   ;convert to ascii
	.iot clic,x		   ;type it
	ldb x,[000300,,ttynum]	   ;get second digit of our TTY #
	addi x,60		   ;convert to ascii
	.iot clic,x		   ;type it
	.iot clic,[")]		   ;prettify
	.rdatim a,		   ;get the date & time
	exch a,b		   ;switch them into the correct order
	rot a,14		   ;and make the year come last
	move tt,[440600,,a]	   ;get 6-bit bytp ptr to chars as date & time
	movei d,"/		   ;get delimiter for first time word in D
	call timprt
	movei d,":		;get delimiter for HH:MM:SS in D
	call timprt		;print the rest
	type /  Help me -- I am a luser.
/
	.close clic,		;sent it off

	move r,@utmptr		;get the ptr to the resource word for this
	sub r,usrrce		;tree and the offset in that table of
				;resource words is the TTY # !!!
				;(That's how .suset [.rcnsl,,] is computed!)
	caml r,nct		;is it disowned?
	  ret			;  yes, don't go any further
	move a,@time		;get the system time
	sub a,idlmax		;IDLMAX contains the maximum time before we
				;consider a user to be asleep!
	camg a,@ttitm		;is he idle?
	  jrst [ setom helpsw ? ret]  ;note we found an active helper
	setom idlesw		;note we found an idle helper
	movei c,tyoc		;switch output back to the TTY
	ret

whoami:
	.suset [.RUNAME,,RUNAME]	;get our UNAME
	.suset [.RXUNAM,,XUN]	;get our XUNAME
	.suset [.rcnsl,,ttynum]	;get our TTY number

;;Now ask the INQUIR data base about this user
	setzm turist		;assume it's not a turist
	hlrz t,runame
	cain t,(sixbit /___/)	; Not logged in?
	 jrst lsrnli		; Assume he's a turist
;;Get the data base mapped in
	movei a,dskc
	move b,[-77,,frepag]	;aobjn to free page range
	pushj p,lsrtns"lsrmap	;try to map in the data base
	 jrst lsrluz		;no skip if it lost
;;Find our entry
	movei a,dskc
	move b,xun		;xuname
	pushj p,lsrtns"lsrunm	;find the entry, addr in B if found
	 jrst lsrluz
;;Find out if a turist or unknown
	pushj p,lsrtns"lsrtur	;skip if turist or unknown
	 caia
lsrnli:	  setom turist		;set flag saying we're a turist
lsrluz:	.close dskc,
	ret

syseval:
;;; evaluate all the system symbolic locations
	movsi t,-.symbt
symev:	move tt,symbt(t)
	.eval tt,
	  .lose
	aos t
	addi tt,sysloc
	movem tt,symbt(t)
	aobjn t,symev

;;; evaluate all the system symbolic values
	movsi t,-.vals
valev:	move tt,valtab(t)
	.eval tt,
	  .lose
	aos t
	movem tt,valtab(t)
	aobjn t,valev

	movsi t,-.usymb
usymev:	move tt,usymbt(t)
	.eval tt,
	  .lose
	aos t
	add tt,[sysloc(U)]
	movem tt,usymbt(t)
	aobjn t,usymev

	movsi t,-.rsymb
rsymev:	move tt,rsymbt(t)
	.eval tt,
	  .lose
	aos t
	add tt,[sysloc(R)]
	movem tt,rsymbt(t)
	aobjn t,rsymev

	move t,[-200,,0]
	move tt,[-200,,<sysloc/2000>]
	syscal corblk,[argi %cbndr
		argi %jself
		tt
		argi %jssys
		t]
	  .lose %lssys

	ret

6iot:	ildb x,tt		   ;print a 6bit char from bp in TT
	addi x,40		   ;convert to ascii
	syscal iot,[c ? x]
	  .lose %lsfil
	ret

6iot2:	call 6iot		   ;6iot once
	pjrst 6iot		   ;6iot twice

timprt:	.iot clic,[" ]		   ;type a leading space
	call 6iot2		   ;type the first 2 chars
	.iot clic,d		   ;type the delimiter
	call 6iot2		   ;type the next 2 chars
	.iot clic,d		   ;type the delimiter again
	call 6iot2		   ;type the last 2 chars
	ret			   ;and return

;;; type a six-bit word
6type:	setz t,			   ;clear t
	lshc t,6		   ;grab first char
	movei x,40(t)		   ;move to X & convert to ascii
	IOT			   ;always type at least one char
	jumpn tt,6type		   ;if there's more, keep typing
	  ret


10type:	idivi t,10.		   ;figure first digit
	push sp,tt		   ;push remainder
	skipe t			   ;done?
	  call 10type		   ;  no compute next one

decpn1:	pop sp,x		   ;yes, take out in opposite order
	addi x,60		   ;make ascii
	IOT			   ;type it out!
	ret			   ;and return for the next one.

;;;Here are the tables of people who offer help to lusers.
;An # after a name means this helper doesn't offer to help turists.

define mactab mac,tab
.zzbit==<setz>
mac!bits==0
mac!help:
	irps x,y,[tab]
	sixbit /X/
ifse #,[y]	mac!bits==mac!bits\.zzbit
.zzbit==.zzbit_-1
termin
loc mac!help+usrmax
termin

usrmax=20.			;keep usrmax < 36 because of bit-encoding above

MACTAB MC,[Alan#Ellen#GLS,CBF,BEE,KMP,MAP,JPG,HIC,CStacy,GSB,OAF,CENT,Gren,Grenny,Gumby,cent,Maeda]
MACTAB MLKA,[Ellen#MRC,GLS,CBF,JPG,HIC,MAP,GSB,Gumby,CStacy,JSOL,CENT]
MACTAB AIKA,[CStacy,Chris,RMS,BEE,ED,DLW,MAP,HIC,JIS,Klotz,PGS,JSOL,KWH,Gumby,CENT,Gren]
MACTAB DM,[SWG,PDL,CStacy,Chris,MAP,MJL,JSOL]
MACTAB AI,[Alan#CStacy,Chris,CENT,MAP,Gren,Gumby,Maeda]
MACTAB X,[Alan#CStacy,Chris,CENT,MAP,Gren,Gumby]	; Default

;;; table of ITS's to get offsets into HLPTAB
ITSTAB:	irp x,,[MC,MLKA,AIKA,DM,AI]
	sixbit /X/
termin
itscnt==.-itstab		   ;# of ITS's!!!

;; table of helper-table pointers
HLPTAB:	irp x,,[MC,MLKA,AIKA,DM,AI]
	X!help(H)
termin
	XHELP(H)		; Default

tbits:	irp x,,[MC,MLKA,AIKA,DM,AI]
	x!bits
termin
	XBITS			; Default

;;Set up and include the inquire database hacking routines
lsrtns"$$ulnm==0		;don't need last name search
lsrtns"$$ulnp==0		;don't need abbrev l.name lookup
lsrtns"$$unam==0		;don't need name permutation
lsrtns"$$hsnm==1		;we need this to get LSRTUR
.insrt syseng;lsrtns

symbt:	irp x,,[USRHI,TIME]	   ;Foo, can't find the version # !!
	squoze 0,x
x:	0
termin
.symbt==<.-symbt>/2

usymbt:	irp x,,[UNAME,JNAME,UTMPTR,XUNAME]
	squoze 0,x
x:	0
termin
.usymb==<.-usymbt>/2

valtab:	irp x,,[LUBLK,NCT,USRRCE]
	squoze 0,x
x:	0
termin
.vals==<.-valtab>/2

RSYMBT:	irp x,,[TTITM]
	squoze 0,x
x:	0
termin
.rsymb==<.-rsymbt>/2


runame:	0
ttynum:	0			   ;our TTY number
turist:	0			;nonzero if inquir says we're a turist
xun:	0			;xuname
helpsw:	0			   ;non-zero if we've been helped
itsnam:	0			   ;gotta get this via SSTATU !!
idlmax:	7.*60.*30.		   ;7 minutes decimal before we tell him how
				   ;long this user has been idle
calerr:	0			   ;error return from SYSCAL's
tellsw:	0			   ;set zero to denote this helper is silent.
idlesw:	0			   ;non-zero means we found an idle helper

consta
variab

pdl:	-40,,.
	block 40
-1
frepag=<<.+1777>/2000>

	end beg




;;; During some flammmage about the services to be provided to
;;; unlogged terminals, someone at a TOPS-20 site finally
;;; grokked othe idea of a :LUSER program.
;;; He explained the idea to the other people with this example:
;;;
;;;  @HELPME
;;;  Enter request for help, terminate with ^Z.  Please be
;;;  sure to identify yourself and leave a mailbox or phone number
;;;  where you can be reached.  Enter message:
;;;
;;;  please help me very confused unhappy.  account doesnt work
;;;  files dont print and coke machine ate my quarter.  can you please
;;;  tell me where game about caves and dwarves is?  thanks.
;;;  joe at 444-1212.  ^Z
;;;  @
;;;
;;;
