Copyright (c) 1999 Massachusetts Institute of Technology
See the COPYING file at the top-level directory of this project.
------------------------------

ITS USETS:

This file attempts to maintain up-to-date documentation on
all user variables hacked by .USET/.SUSET.  Those wonderful
souls who update the information in any way (additions,
deletions, corrections) should describe their
modifications in a brief note to INFO-ITS@AI so
that interested parties can correct their copies or
conceptions without needing to print or read the
entire file again.  For example:

	:QMAIL INFO-ITS@AI I added more details to the .FOO user var ^C

If you want to be put on the INFO-ITS mailing list,
just say so in a message to it.
-------------------------------------------------
Each job running under ITS has a large number of variables
associated with it maintained by the system.  In order to
examine and set these variables, the .USET and .SUSET
uuo's are provided.  The .USET uuo allows the specification
of the job whose variables are to be accessed.  The .SUSET
uuo always accesses the variables of the job which executes it
(SUSET = Self USET).

The .USET uuo is used like this:	.USET CHNL,SPEC
and the .SUSET uuo like this:		.SUSET SPEC
The ac field CHNL of the USET must be the number of
an input/output channel for which a job is open,
as either the USR, JOB, or BOJ device.
The .USET may modify the variables only
if it has modification rights to the job (the job
is a JOB device, or is a direct inferior).

The contents of the effective address SPEC are of this form:
	4.9	0 = read variable, 1 = set variable.
	4.8	Block mode (see below).
	4.7-3.1	Number of user variable to access.
	2.9-2.1	Address of a location within the caller which
		is to receive the value of the variable, or which
		contains the new value for the variable.
If bit 4.8 is 1, then the word at location SPEC is really
an AOBJN pointer to a block of specifications.  This is
useful for getting several variables at a time easily.
The AOBJN pointer is updated as the operation progresses,
and so must be in a writable area.  Block mode may not be nested.
If an illegal specification is given to .USET or .SUSET,
the job will receive an illegal operation word 1 interrupt
(bit 1.6 of the .PIRQC user variable).

The variables are described in this document by the names which
DDT knows for them; the first character of each name is a ".".
If you open up a location by using one of these names, DDT
treats it specially and actually accesses the corresponding
variable and not a location in the job's core.

When writing .USET's and .SUSET's in MIDAS code,
one may use the symbols defined by MIDAS for accessing them.
These are the same as the names known to DDT, except that
the "." is followed by "R" for reading or "S" for setting.

If you open a location containing a SPEC, try typing
.R$?? if it is positive, or .S$?? if it is negative; this will
use bit typeout mode to print out the spec as it might have been
assembled; for example, 400001,,500  .S$??  gives .SVAL,,500 .

Examples:

To read your own runtime in 4-microsecond ticks into FOO:

	.SUSET [.RRUNT,,FOO]

To set your word 1 interrupt mask:

	.SUSET [.SMASK,,[%PIDWN\%PIPDL]]
		;enable "pdl overflow" and "sys going down" interrupts

To read your input/output status word for channel 13 into FOO:

	.SUSET [.RIOS+13,,FOO]

To start a job (your immediate inferior!) open on channel
	USRC at its location QUUX, with its option
	bits indicating your readiness to supply JCL:

	.USET USRC,[.SOPTION,,[%OPCMD,,]]
	.USET USRC,[.SUPC,,[QUUX]]
	.USET USRC,[.SUSTP,,[0]]

Another way to do the same thing is:

	MOVE AC,[-3,,USBLOK]
	.USET USRC,AC
	  . . .
USBLOK:	.SOPTION,,[%OPCMD,,]
	.SUPC,,[QUUX]
	.SUSTP,,[0]

FORM OF DESCRIPTIONS:

The descriptions of the various variables accessible by
.USET and .SUSET are in the following form:

<DDT name>	<access>	<mnemonic explanation for name>

	<long-winded paragraph describing variable>

The <access> descriptor contains four characters "wx yz".
The first two ("wx") refer to the access for .USET;
the last two ("yz") to the access for .SUSET.
In each case these characters are chosen from these sets:
	--	May neither read nor set.
	+-	May read but not set.
	+*	May read and set.
	+?	May read, may sometimes set (please read on...)
That is, + means may read, * may set, - denies access,
while ? says that things are more complicated.

.40ADDR		+* +*	"40" address

	The right half:

	Initially 40 octal.  Whenever the system
	references locations "40" through "44" specifically,
	(e.g. giving the user interrupts, or returning uuo's 50-77),
	the system really references the 5-word block that
	.40ADDR points to.  Thus, if .40ADDR is set to 500, the
	system expects location 502 to contain the address of
	the interrupt routine.  This is especially useful to
	distinguish system-returned uuo's (0 and 50-77) from
	standard user-mode uuo's (1-37); the latter always
	trap through location 40, while the former trap
	through .40ADDR.
	The various words accessed through .40ADDR are
	as follows (indexed by "normal" location #):
		40	System places a uuo here when it wants
			to give it to the user.
		41	Should contain the address of the uuo handler.
			If .40ADDR is not indeed 40, this
			may be a different uuo handler from the
			one which handles uuo's 1-37.
			If .40ADDR is actually 40, then unless
			41's index and indirect fileds are 0 and its
			opcode is either 0 or JSR, all system-returned
			UUOs will cause ILOPR interrupts instead.
			This is to protect programs that want their
			hardware user-UUOs to be handled by a PUSHJ
			from being clobbered when they accidentally
			execute a meaningless UUO.
		42	If the job's %OPINT bit in its
			.OPTION variable (q.v.) is 0, then
			this is a JSR to the user's old-style
			interrupt handler.  The three words addressed
			by the JSR are, in order, the word in
			which the interrupt bits are placed, the
			return address for the interrupt, and the
			first instruction of the handler.
			If the %OPINT bit is 1, then this
			is an AOBJN pointer to a vector of
			5-word blocks describing the various
			interrupt handlers and their priorities.
			See ITS INTRUP for details.
		43	If the job's %OPLOK bit is set in
			its .OPTION variable, then this is
			the pointer to the list of switches
			to be reset if the job is killed.
		44	If the job's %OPLOK bit is set,
			this is an AOBJN pointer to a block
			of critical code region descriptors.
			See ITS LOCKS for details.

	The left half:

	Initially 20 octal.  This is the address of a block of
	20 octal words which a job's superior may use to hack
	that job.  For compatibility, if LH(.40ADDR) is zero,
	the default of 20 will be assumed.

.ADF1		+* +*	ANDCAM into .DF1

	Like .DF1 (q.v.) when reading.
	Performs ANDCAM into .DF1 when writing.


.ADF2		+* +*	ANDCAM into .DF2

	Like .DF2 (q.v.) when reading.
	Performs ANDCAM into .DF2 when writing.


.AIFPIR		+* +*	ANDCAM into .IFPIR

	Like .IFPIR (q.v.) when reading.
	Performs ANDCAM into .IFPIR when writing.


.AMASK		+* +*	ANDCAM into .MASK

	Like .MASK (q.v.) when reading.
	Performs ANDCAM into .MASK when writing.


.AMSK2		+* +*	ANDCAM into .MSK2

	Like .MSK2 (q.v.) when reading.
	Performs ANDCAM into .MSK2 when writing.


.APIRQC		+* +*	ANDCAM into .PIRQ

	Like .PIRQC (q.v.) when reading.
	Performs ANDCAM into .PIRQC when writing.

.APRC		+- +-	APR CONO

	4.9	Procedure is in a disowned tree.
	4.7	(BUMRTL)  Tree will be gunned if hasn't run for an hour
		(meaningful only in top level job).  Cleared by reowning or
		attaching.  See the DETACH and DISOWN system calls.
	4.6	Core request pending for this job.
	4.5	User disabled, waiting to be flushed by SYS job.
		The SYS job will delete the job tree eventually.
	4.4-4.1	.BCHN user variable (q.v.).
	3.9	In process of deleting or logging out this job.
		Bit 4.5 will probably be set eventually.
	3.5-3.1	Must be zero.
	2.9-1.1	CONO'ed to APR whenever job is about
		to be run.  Initially 447.  Modified by
		altering the .MASK user variable.


.BCHN		+* +*	bad channel number

	Initially 0.
	Number of channel most recently in error.
	Typically after reading this variable one does a
	.STATUS or a STATUS symbolic system call
	to get the status word for the channel.  This word
	can then be fed to the ERR device.
	.BCHN is actually part of the .APRC variable.
	See also the .IOS variable.


.CNSL		+- +-	console tty number

	If the job is in a console-controlled tree, this
	variable contains the console's number, even if
	the job doesn't own the console.  If the job is
	in a non-console-controlled tree, .CNSL is -1
	if the job is scheduled as part of the system,
	-2 if the job is scheduled as a disowned job;
	for a job-device-handler job, .CNSL is the same
	as it is for the job it is serving.


.DF1		+* +*	defer bits, word 1

	Initially 0.
	Defer bits for word 1 interrupts (see .PIRQC
	and .MASK).  If an interrupt bit is set in both
	.PIRQC and .MASK, but is also set in .DF1,
	it is temporarily deferred.


.DF2		+* +*	defer bits, word 2

	Initially 0.
	Defer bits for word 2 interrupts (see .IFPIR
	and .MSK2).  If an interrupt bit is set in both
	.IFPIR and .MSK2, but is also set in .DF2,
	it is temporarily deferred.

.EBO1		+- +-	KL-10 Ebox counter

	This is the low-order word of the KL-10 Ebox counter
	value for the job. It contains garbage on KA-10's.
	Its location is .EBOX+1, for convenience.


.EBOX		+- +-	KL-10 Ebox counter

	This is the high-order word of the KL-10 Ebox counter
	value for the job. It contains garbage on KA-10's.


.FLS		+- --	flush instruction

	Initially 0.
	The instruction which is blocking the running of
	the job.  Zero if user not blocked (user can run
	if .USTP is also zero).
	(The scheduler tests a job for runnability by first
	checking the .USTP variable, and if it is zero,
	then executing the flush instruction.  The job is
	runnable iff the flush instruction skips.)


.FTL1		+- +-	Fatal interrupt first word

	After a fatal interrupt, this variable contains the
	.PIRQC bits which caused the error.  At any other time
	it contains garbage.

.FTL2		+- +-	Fatal interrupt second word

	After a fatal interrupt, this variable contains the
	.IFPIR bits which caused the error.  At any other time
	it contains garbage.


.HSNAME		+* +*	Home System Name

	This is a word of sixbit like .SNAME (q.v.).  It
	is initialized to be the same as the UNAME on creation
	of a not-logged-in tree, and when a job is created
	as an inferior or as a job device, it's .HSNAME is
	copied from that of it's creator.  The LOGIN system call
	sets it to be the same as the UNAME, although this should
	be changed to be the XUNAME.

	This is not used by ITS for anything, but is intended to
	associate a directory with a specific XUNAME for the sake
	of init and mail files of people without a directory of
	the same name as their XUNAME.  DDT will soon initialize
	it by looking up information in the INQUIR database for
	the particular user.

.IDF1		+* +*	IORM into .DF1

	Like .DF1 (q.v.) when reading.
	Performs IORM into .DF1 when writing.

.IDF2		+* +*	IORM into .DF2

	Like .DF2 (q.v.) when reading.
	Performs IORM into .DF2 when writing.


.IFPIR		+* +*	inferior procedure and i/o requests (?)

	Initially 0.
	This variable contains bits for pending word 2 interrupts.

	Bit 3.n is the interrupt bit for the n'th job directly
	inferior to the specified job (see the .INTB user variable).
	These therefore occupy bits 3.8-3.1.
	An inferior interrupt bit is set if an a class 1
	or untrapped class 2 interrupt occurs in the inferior,
	or if the inferior is using new-style interrupts
	(see ITS INTRUP, and the %OPINT bit of the .OPTION
	user variable) and any unhandled interrupt occurs.
	Performing a .UCLOSE on an inferior clears the
	inferior interrupt bit in the .IFPIR variable
	of the job performing the .UCLOSE.

	Bit 1.n is the interrupt bit for input/output
	channel n-1 (actually, these occupy bits 2.7-1.1).
	Thus bit 1.1 = channel 0, 1.2 = channel 1,
	1.3 = channel 2, . . ., bit 2.7 = channel 17.
	When an input/output interrupt is detected, the
	system call WHYINT shoud be used to discover the
	cause (see ITS .CALLS).

	The following devices can cause channel interrupts:

	TTY	Input:	A character was typed which according
			to the job's TTYST1 and TTYST2 variables
			(see ITS TTY) should be treated as an interrupt
			character.  If the tty is opened for input
			on more than one channel, only one channel,
			if any, receives the interrupt.
		Output:	The **MORE** condition has occurred.
			See ITS TTY.
	STY	Input:	Input is pending (i.e. the corresponding TTY
			has attempted output).  If the STY is open
			for input on more than one channel, only
			one channel, if any, receives the interrupt.
			See ITS TTY.
		Output:	The STY's alter ego is waiting for input,
			or at least was (it isn't guaranteed not to
			stop waiting and do something else).
	STK	Input is available.  Interrupts occur on all enabled channels.
	USR	A foreign job open on the channel has been killed.
		If the job went away while the channel was pushed
		on the I/O pdl, this interrupt will occur when the
		channel is popped.  See the .UCLOSE, .IOPUSH, and
		.IOPOP uuo's.
		If the job is the PDP-6, the PDP-6 has requested an interrupt.
	JOB	Various conditions, some programmable.  See ITS JOB.
	BOJ	Various conditions, some programmable.  See ITS JOB.
	NET	One of the following conditions has occurred:
			The IMP has gone down.
			RFC received.
			After RFC sent, the connection is now open.
			Input available.
			Connection closed.
			Net interrupt received (INR or INS).
	MSP	Message has been sent.

.IIFPIR		+* +*	IORM into .IFPIR

	Like .IFPIR (q.v.) when reading.
	Performs IORM into .IFPIR when writing.


.IMASK		+* +*	IORM into .MASK

	Like .MASK (q.v.) when reading.
	Performs IORM into .MASK when writing.


.IMSK2		+* +*	IORM into .MSK2

	Like .MSK2 (q.v.) when reading.
	Performs IORM into .MSK2 when writing.


.INTB		+- +-	interrupt bit

	Gets the interrupt bit for the procedure.  This is
	the word 2 interrupt bit which the procedure's
	superior will see when the procedure interrupts
	its superior.  This variable will therefore have
	exactly one of bits 3.1-3.8 set, and no others.
	If the procedure is top level (has no superior),
	then this variable is negative.


.IOC +<n>	+- +-	input/output channel

	The variable .IOC+<n> is the input/output channel
	word for channel <n>, for n between 0 and 17 octal.
	Normally zero for a closed channel.


.IOP +<n>	+- +-	input/output pdl

	The input/output pdl is a pdl of two-word entries
	used by the .IOPUSH, .IOPOP, and .IOPDL uuo's.
	The first word of each pair is the .IOC word for
	the stacked channel, and the second is the .IOS word.
	In addition, bits 4.9-4.6 of the .IOS word of each
	pair contain the channel number which the channel was
	pushed from (this is used by the .IOPDL uuo).
	The pdl has eight entries; thus <n> should be between
	0 and 17 (0 is the .IOC word for the least recently
	pushed entry, etc.).

.IOS +<n>	+- +-	input/output status

	The variable .IOS+<n> is the input/output status
	word for channel <n>, for <n> between 0 and 17 octal.
	Normally zero for a closed channel.
	This word contains various bits describing the status
	of the channel.  The left half is a set of error
	codes if non-zero; the .IOS word can be given to
	the ERR device to obtain an ascii message for
	the error.  The right half contains various bits
	describing the state of the device.  (Internally to
	ITS, the right half contains an access pointer;
	the right half bits supplied for .IOS are the
	same as those generated by the .STATUS uuo or
	the STATUS symbolic system call.)

	The various bits in the .IOS word are as follows:
	4.9-4.6	Always zero (see the .IOP variable).
	4.5-4.1	If non-zero, the number of a non-display
		input/output error (see table below).
	3.9-3.7	If non-zero, the number of an IDS interpreted
		display input/output error (see table below).
	3.6-3.1	If non-zero, the number of a standard error.
		Set primarily by failing .OPEN's and
		.FDELE's.  These are the same as the error
		codes returned by failing .CALL's (see
		table below).
	2.9-2.3	Device dependent.
	2.2	Buffering capacity empty.
	2.1	Buffering capacity full.
	1.9-1.7	Mode in which device was opened.
		1.9	0 = ascii, 1 = image.
		1.8	0 = unit, 1 = block.
		1.7	0 = input, 1 = output.
	1.6-1.1	ITS internal physical device code
		(see table below).

	The error messages indicated by bits 4.5-4.1 are:
	  1	DEVICE HUNG OR REPORTING NON-DATA ERROR
	  2	END OF FILE
	  3	NON-RECOVERABLE DATA ERROR
	  4	NON-EXISTENT SUB-DEVICE
	  5	OVER IOPOP
	  6	OVER IOPUSH
	  7	USR OP CHNL DOES NOT HAVE USR OPEN
	 10	CHNL NOT OPEN
	 11	DEVICE FULL (or directory full)
	 12	CHNL IN ILLEGAL MODE ON IOT
	 13	ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY
	 14	DIRECTORY FULL
	 15	DIRECTORY'S ALLOCATION EXHAUSTED

	The error messages indicated by bits 3.9-3.7 are:
	  1	IDS ILLEGAL SCOPE MODE
	  2	IDS SCOPE HUNG
	  3	MORE THAN 1K SCOPE BUFFER
	  4	IDS MEM PROTECT
	  5	IDS ILLEGAL SCOPE OP
	  6	IDS MEM PROTECT ON PDL PNTR
	  7	IDS ILLEGAL PARAMETER SET

	The error messages indicated by bits 3.6-3.1 are:
	  1	NO SUCH DEVICE
	  2	WRONG DIRECTION
	  3	TOO MANY TRANSLATIONS
	  4	FILE NOT FOUND
	  5	DIRECTORY FULL
	  6	DEVICE FULL
	  7	DEVICE NOT READY
	 10	DEVICE NOT AVAILABLE
	 11	ILLEGAL FILE NAME
	 12	MODE NOT AVAILABLE
	 13	FILE ALREADY EXISTS
	 14	BAD CHANNEL NUMBER
	 15	TOO MANY ARGUMENTS (CALL)
	 16	PACK NOT MOUNTED
	 17	DIRECTORY NOT AVAIL
	 20	NON-EXISTENT DIRECTORY NAME
	 21	LOCAL DEVICE ONLY
	 22	SELF-CONTRADICTORY OPEN
	 23	FILE LOCKED
	 24	M.F.D. FULL
	 25	DEVICE NOT ASSIGNABLE TO THIS PROCESSOR
	 26	DEVICE WRITE-LOCKED
	 27	LINK DEPTH EXCEEDED
	 30	TOO FEW ARGUMENTS (CALL)
	 31	CAN'T MODIFY JOB
	 32	CAN'T GET THAT ACCESS TO PAGE
	 33	MEANINGLESS ARGS
	 34	WRONG TYPE DEVICE
	 35	NO SUCH JOB
	 36	VALID CLEAR OR STORED SET
	 37	NO CORE AVAILABLE
	 40	NOT TOP LEVEL
	 41	OTHER END OF PIPELINE GONE OR NOT OPEN
	 42	JOB GONE OR GOING AWAY
	 43	ILLEGAL SYSTEM CALL NAME
	 44	CHANNEL NOT OPEN
	 45	INPUT BUFFER EMPTY OR OUTPUT BUFFER FULL
	 46	UNRECOGNIZABLE FILE (LOAD)
	 47	LINK TO NON-EXISTENT FILE

	The physical device codes from bits 1.6-1.1 are as
	follows.  Note that, as a half-hearted rule, bit 1.6
	indicates that file names are significant, and bit 1.5
	indicates a software-implemented device.
	This list is subject to additions and deletions!
	CODE	SYMBOL	DEVICE	DESCRIPTION
	 0		TTY	Console input.
	 1	SNTTY	TTY	Printing console output.
	 2	SNTDS	TTY	Display console output.
	 3	SNLPD	LPT	Data Products line printer.
	 4	SNVID	VID	Vidisector ???
	 5	SNBAT		Vidisector ???
	 6	SNPLT	PLT	Calcomp plotter.
	 7	SNPTP	PTP	Paper tape punch.
	10	SNIMPX	IMX	Input multiplexor.
	11	SNOMPX	OMX	Output multiplexor.
	12	SNPTR	PTR	Paper tape reader.
	13	SN340	DIS	DEC 340 display, Ascii output.
	14	SN340I	IDS	Interpreted 340 display.	???
	15	SNMTC	MTn	Magnetic tape.
	16	SNCOD	COD	Morse code device.
	17	SNTAB	TAB	Tablet.	???
	21	SNNUL	NUL	Source of zeroes, or output sink.
	22	SNJOB	JOB	Job device.
	23	SNBOJ	BOJ	Inverse of JOB.
	24	SNSPY	SPY	Spy on another console.
	25	SNSTY	STY 	Pseudo-teletype.
	26	SNNET	NET	ARPAnet (NCP).
	27	SNLPV	LPT	Vogue line printer (yech!)
	30	SNSTK	STK	Stanford keyboard.
	31	SNMSP	MSP	(DM) Interprocess message protocol.
	32	SNCHA	CHAOS	CHAOS net.
	33	SNTCP	TCP	TCP Internet.
	34	SNTRAP	TRAP	Trap "device"
	35	SNIPQ	IPQ	Internet IP Queue.
	36	SNUBI	UBI	KS10 Unibus interrupt.
	41	SNUTC	UTn	Microtape (DECtape).
	43	SN2311	DSK	2311 disk drives or equivalent.
	60	SNFUSR	USR	A foreign (not immediately inferior) procedure.
	61	SNUSR	USR	An immediately inferior procedure.
	62	SNCLK	CLx	Various core link devices (x  {AIOU})
	63	SNDIR	---	File directory or ERR device.
	64	SNPDP	USR	The PDP-6.
	65	SNDIRH	DIRHNG	Directory hang "device"
	66	SNLCK	LOCK	Lock "device"

.IPIRQC		+* +*	IORM into .PIRQC

	Like .PIRQC (q.v.) when reading.
	Performs IORM into .PIRQC when writing.


.JNAME		+* +?	job name

	The name of the job as a word of sixbit characters.
	The uname-jname pair must be unique to a job
	(there are some exceptions involving system-created
	jobs or jobs not logged in).
	The uname and jname are used as file names when
	creating or subsequently opening the job on the USR
	device.  See also the .UNAME user variable.
	The .JNAME variable may be set by a .SUSET only in a
	top-level job, and then only if the job has no
	inferiors.
	Attempting to set a jname to zero causes an
	illegal operation interrupt (bit 1.6 of the .PIRQC
	user variable).  So does attempting to set it such that
	the uname-jname pair would no longer be unique.
	So does attempting to illegally set one's own jname.


.JPC		+* +*	jump program counter

	The PC as of the most recent jump instruction,
	i.e. an instruction which changed the PC by other
	than 1 or 2.  This is actually a register in the
	paging box when running.


.MARA		+* +*	MAR (memory address register) address

	Initially 0.
	The address for the MAR register in the paging box,
	which gives a %PIMAR interrupt when the specified operation
	is performed on the specified address.
		3.3	0 = exec mode, 1 = user mode.
			This is forced to 1 when set with
			.SUSET or .USET; exec mode is for very
			obscure system hacks only.
		3.2-3.1	0  Never interrupt.
			1  Interrupt on instruction fetch.
			2  Interrupt on write.
			3  Interrupt on any reference.
		2.9-2.1	Address for MAR.
	The MAR does not work well on accumulators.
	See also the .PIRQC user variable, bit %PIMAR;
	and ITS INTRUP and ITS USR.

.MARPC		+* +*	MAR program counter

	The PC as of the instruction that most recently
	tripped the MAR interrupt, if any.  In addition,
	the indirect bit will be set if that instruction
	completed successfully (was not aborted by the MAR
	hit).  See the .MARA user variable.


.MASK		+* +*	word 1 interrupt mask

	Initially 0.
	This is a mask for word 1 interrupts which indicates
	which interrupts the job is prepared to handle.
	If a class 2 or class 3 word 1 interrupt tries to
	occur, but the corresponding bit in .MASK is not
	set, then the interrupt is converted to class 1 or
	ignored, respectively.  The bits in .MASK directly
	correspond to those in .PIRQC (q.v.).  Bits for class
	1 interrupts are AND'ed out before setting the .MASK
	variable.

	
.MBO1		+- +-	KL-10 Mbox counter

	This is the low-order word of the KL-10 Mbox counter
	value for the job.  On KA-10's, it holds garbage.
	Its location is .MBOX+1, for convenience.

	
.MBOX		+- +-	KL-10 Mbox counter

	This is the high-order word of the KL-10 Mbox counter
	value for the job.  On KA-10's, it holds garbage.


.MEMT		+* +*	memory top

	This variable contains 1 plus the highest legal
	address in the job (the accessible word with the
	largest address).  Setting this variables is like
	performing an equivalent .CORE uuo (q.v.):
		.SUSET [.SMEMT,,[FOO]]
	is like doing:
		.CORE <FOO+1777>_12


.MPVA		+- +-	memory protect violation address

	The address which the last instruction to cause a memory protection
	violation (or a write into read only memory violation) attempted to
	reference, on KA-10's rounded down to a page boundary.  Thus an
	attempt to reference the non-existent location 317435 would cause
	.MPVA to be set to 316000 octal on a KA-10, or 317435 on a KL-10.

	On the KS-10, .MPVA also holds the non-existant IO register address
	after a %PINXI.

	See also the .PIRQC variable.

.MSK2		+* +*	word 2 interrupt mask

	Initially 0.
	This is a mask for word 2 interrupts which indicates
	which interrupts the job is prepared to handle.
	If a class 2 or class 3 word 2 interrupt tries to
	occur, but the corresponding bit in .MSK2 is not
	set, then the interrupt is converted to class 1 or
	ignored, respectively.  The bits in .MSK2 directly
	correspond to those in .IFPIR (q.v.).


.OPC		+- +-	old program counter

	The PC just before the last instruction was executed.
	This corresponds to a register in the paging box.
	It doesn't exist on KL-10's.

.OPTION		+* +*	option bits

	Initially 0.
	The bits in this word correspond to various options
	as follows:
	4.9	%OPTRP	Same as the .UTRP user variable.  See ITS UUO.
	4.8	%OPDET	** This bit is OBSOLETE and NO LONGER EXISTS **
			It is documented for historical purposes only.
			Nowadays, fatal interrupts always cause top-level
			jobs to be detached.  Once upon a time, top-level
			jobs with consoles would be reloaded instead of
			detached, unless they had set %OPDET=1.
			See the DETACH and RELOAD symbolic system calls.
	4.7	%OPDEC	Uuo's 40, 41, and 47 (that is,
			.IOT, .OPEN, and .ACCESS)
			should trap to the user as uuos
			via the .40ADDR user variable (q.v.).
			This is useful for programs which wish to
			interpret DEC TOPS-10 UUO's, since those are the
			only ones which conflict with ITS UUOs.
			Luckily, those ITS UUOs are not essential since
			there are symbolic system calls to do the same things.
	4.6	%OPCMD	Superior claims it has JCL which
			it will cheerfully supply in response to
			the appropriate .BREAK 12, command.
	4.5	%OPBRK	Superior claims to handle all .BREAK's.
	4.4	%OPDDT	Superior claims to be DDT.
	4.3	%OPINT	Job desires new-style (vectored
			and stacked) interrupts.  See also the
			.40ADDR variable.  See ITS INTRUP for
			information on old- and new-style
			interrupts.
	4.2	%OPOJB	Other jobs may open this job
			as the OJB device, thereby turning it
			into a JOB device.  See ITS JOB.
	4.1	%OPLOK	Job desires the switch locking
			and unlocking synchronization feature.
			See also the .40ADDR variable.
			See ITS LOCKS for information on locks.
	3.9	%OPLIV	The job tree of which this is the
			top-level job is permitted to survive a
			system shutdown -- it should take care
			of logging itself out.  See the .SHUTDN uuo.
			Meaningful only for top-level jobs.
			Primarily useful for system demons which need to
			survive system death (e.g. the statistics
			demon PFTHMG DRAGON).
	3.8	%OPOPC	Job desires that instruction-aborting interrupts
			such as MPV leave the PC pointing before the
			instruction that lost, instead of the old
			convention of leaving it pointing after.
			The new convention is far better and all new
			programs should use it.
	3.7	%OPLSP	Superior claims to be MacLisp.
	3.6	%OPLKF	Unlock locks on fatal interrupt.  When a
			non-disowned top-level job receives a fatal
			interrupt, if it has set this bit, its locks will
			be unlocked by the system job as part of the
			process of detaching it.  See the %OPLOK bit and
			ITS LOCKS.

.PAGAHEAD	+* +*   page-ahead control

	Normally zero, this word is set nonzero to enable
	sequential paging through a part of the address space
	specified by .PAGRANGE.  The right half of .PAGAHEAD is
	the page-ahead interval width and the left half is the page-behind
	distance.  Each time a page in the designated range is
	touched for the first time, the next few pages, forming the
	page-ahead interval begin to swap in, and a page a certain
	distance behind (specified by the page-behind distance) is
	swapped out or marked for swap out in the near future.  The
	precise treatment depends on how loaded the system is.

	Exactly one of the page-ahead interval width and the
	page-behind distance should be negative.  The page-behind
	distance should be negative, if memory is being used from low
	addresses to high ones.  The page-ahead width should be
	negative if moving from high addresses to low ones.

	Example: -2,,4 means on first reference to page n, start
	reading in pages n+1 through n+4 and possibly swap out page n-2.
	Page n-1 is not affected until page n+1 is touched.  A
	page-behind distance of 2 means that two consecutive pages are
	always available.

.PAGRANGE	+* +*	page-ahead range

	Normally zero, this word is made nonzero together with .PAGAHEAD
	to enable the sequential paging feature.  The two halves of
	.PAGRANGE are page numbers which specify the region of the 
	address space in which sequential paging should go on.
	The left half specifies the first page in the sequentially
	paged region, and the right half specifies the first page
	after the end of that region.

.PICLR		+* +*	priority interrupt clear

	Initially -1.
	If non-zero, the job may take interrupts.  If zero,
	interupts are deferred.  This variable is cleared
	when an old-style interrupt occurs (but not by new-style
	interupts!), and is set to -1 by the .DISMISS uuo
	and the DISMIS symbolic system call.  Attempts
	to set this variable will convert the value to -1 or 0
	depending on bit 4.9.

	
.PIRQC		+* +*	priority interrupt request cruft (?)

	This word contains bits for pending word 1 interrupts.
	Setting bits in this causes the corresponding interrupts
	to attempt to take place, subject to .MASK, .DF1,
	.PICLR (q.v.), and the %OPINT bit of the .OPTION user
	variable (see ITS INTRUP).

	Interrupts are of three classes:
	1	Very serious.  The job is stopped and its
		superior interrupted.
	2	Semi-serious.  The job may request to handle
		such an interrupt by setting the corresponding
		bit in .MASK (q.v.); otherwise it is treated
		as a class 1 interrupt.
	3	Trivial.  The job receives the interrupt if it
		has requested to handle it; otherwise the
		interrupt condition is ignored.  (Under the
		new-style interrupt scheme, a class 3 interrupt
		may become a class 1 interrupt.)
	See also the .IFPIR variable for word 2 interrupts.

	The interrupt bits and their classes are as follows.
	The character * denotes a class 1 interrupt, and + a
	class 2 interrupt.
		4.9	Must be zero.
	%PIRLT	4.8  	Clock break (see the .REALT uuo).
	%PIRUN	4.7  	Run time interrupt (see the .RTMR user variable).
	%PINXI	4.6  +	Non-Existent IO register
			A Job in User IOT mode referenced a non-existent IO
			register on the KS10 Unibus.  The PC is left
			pointing before the guilty instruction.  The address
			of the non-existant register may be found in .MPVA.
	%PIJST	4.5	Job Status display request.
			The sequence ^_J was typed on the console owned
			by this process or some inferior.
	%PIDCL  4.4  *	A defered call was typed while the job had the TTY.
	%PIATY	4.3	The tty was given back to the job by
			its superior.  Indicates that the screen has
			probably been written on and its contents
			have changed unpredictably.
	%PITTY	4.2  +	Attempt to use tty when not possessing it.
	%PIPAR	4.1  +	Parity error.
	%PIFOV	3.9  	Arithmetic floating overflow.
	%PIWRO	3.8  +	Attempt to write into read only memory.
			See the .MPVA user variable.
	%PIFET	3.7  +	Pure page trap (attempt to fetch an instruction from
			writable memory when bit 4.2 of the PC set).
			This feature doesn't exist on KL-10's, instead
			this interrupt is signalled for "Illegal entry
			to concealed mode" which you probably can't make
			happen.  (See the KI10 Processor Reference Manual.)
			See bit 4.2 of the .UPC user variable.
	%PITRP	3.6  *	System uuo to user trap (see the .UTRP user variable).
		3.5  	Arm tip break 3 (OBSOLETE).
		3.4  	Arm tip break 2 (OBSOLETE).
		3.3  	Arm tip break 1 (OBSOLETE).
	%PIDBG	3.2  	System being debugged.
			Occurs when someone uses the .SETLOC or .IFSET uuo
			to alter SYSDBG and the new contents are non-zero
			and the old contents non-negative.
			(See also the SSTATU symbolic system call.)
	%PILOS	3.1  +	A .LOSE UUO or LOSE system call was executed
			(their purpose is to signal the superior).
	%PICLI	2.9  	CLI device interrupt.
	%PIPDL	2.8  	Pdl overflow.
	%PILTP	2.7  	Light pen interrupt on 340.
			Program stop or hit stop on E&S display.
	%PIMAR	2.6  +	MAR interrupt.
			(See the .MARA and .MARPC user variables.)
	%PIMPV	2.5  +	Memory protection violation (attempt to reference
			a page not in the job's page map).
			(See the .MPVA user variable.)
	%PICLK	2.4  	Slow clock interrupt (every .5 second).
	%PI1PR	2.3  *	Single intruction proceed interrupt.
			Used by DDT for ^N commands.
	%PIBRK	2.2  *	Breakpoint interrupt (.BREAK uuo executed).
	%PIOOB	2.1  +	Illegal user address. (OBSOLETE)
	%PIIOC	1.9  +	Input/output channel error.
			(See the .BCHN and .IOS user variables.)
	%PIVAL	1.8  *	Value interrupt (.VALUE uuo executed).
	%PIDWN	1.7  	System going down or being revived.
			(See the .SHUTDN, .REVIVE, and .DIETIME uuo's,
			and the SSTATU symbolic call.)
	%PIILO	1.6  +	Illegal instruction operation.
	%PIDIS	1.5  +	Display memory protection violation (340 or E&S).
	%PIARO	1.4  	Arithmetic overflow.
	%PIB42	1.3  *	Bad location 42.
			(See the .40ADDR user variable, and ITS INTRUP.)
	%PIC.Z	1.2  *	^Z typed when this job had the TTY.
	%PITYI	1.1  	Character enabled for interrupt was typed on TTY.
			(Semi-obsolete; see the .IFPIR user variable,
			and ITS TTY.) 

.PMAP +<n>	+- +-	page map word

	This is the page map word for page <n> of the job,
	for <n> between 0 and 377 octal (256.K = 400 1K pages).
	The map word read has this form:
	4.9	%CBWRT	Page is writable.
	4.8	%CBRED	Page exists (if this bit is zero, then the
			whole word is zero).
	4.7	???	Page is in core (as opposed to swapped out).
	4.6	%CBPUB	Page is public (any job can write into it
			which wants to).
	4.2	%CBLOK	Page is locked in core
			(inhibited from swapout)
	3.9	%CBSLO	Page is in slow memory
			(Doesn't work; Moon says it never will)
	3.8-3.1	Number of times the page is shared.
		(See the CORTYP symbolic system call,
		right half of value 4.)
	2.9-2.1	Absolute page number, or page number in next
		sharer in the circular list of sharers.
		(See CORTYP, value 3.)
	1.9-1.1	0	Page is absolute.
		777	Page is not shared.
		<m>	Next sharer in circular list of sharers
			is the job with user index <m>.


.RTMR		+* +*	runtime timer

	Initially -1.
	If non-negative, the amount of run time remaining until the job
	will receive a word 1 runtime interrupt.  (See bit %PIRUN of the
	.PIRQC variable.)  The time is measured in slightly different units
	on different CPUs.  On the KA in 4.069 microsecond units, on the KL
	in 4 microsecond units, and on the KS in 3.9 microsecond units.


.RUNT		+- +-	run time

	Initially 0.
	This is the run time used so far by the job,
	measured in units of 4 microseconds.

.SERVER		+* +*	server job

	Initially -1.
	This is the user index of a job that has been given special
	permission to modify this job, or -1 if there is no such job.

	This can be used to implement various oddball client/server
	protocols between jobs.  The client job will request some service
	from the server job and will set his .SERVER variable to the server's
	user index to allow the service to be performed.

	If the server job is killed, all of the client jobs will have their
	.SERVER variables set back to -1.

	Although it is safe to set .SERVER to -1 using .SUSET or .USET,
	there can be timing errors if a client loads his .SERVER variable
	by simply writing the server's user index into it.  Specifically,
	during the time the server's user index is sitting in the client's
	memory, the server job might be killed and another job started with
	the same user index.  This can be guarded against by handling
	interrupts on the USR: channel, but this is clumsy.  A better
	method is to use the SSERVE system call.  (See .INFO.;ITS .CALLS)

.SNAME		+* +*	system name

	This is a word of six sixbit characters which is
	the default "directory name" for various input/output
	operations.  It is initially the same as the job's
	.UNAME (q.v.).  It can be overridden by supplying the
	directory name explicitly to a symbolic system call.
	The other uuo's such as .OPEN and .FDELE always use .SNAME.

.SUPPRO		+- +-   superior

	This is -1 if the job is top-level, or the user index
	of the job's superior.  See .UIND.


.SV40		+- +-	saved 40

	The contents of absolute location 40 (i.e., the last
	uuo that trapped to the system for this job).
	See also the .UUOH user variable.
	Note that only uuo's 40-47 are really used for
	communication with the system.  All other uuo's are
	handed back to the executing job via its .40ADDR
	user variable (q.v.).


.TR1INS		+? +?	Trap 1 instruction.

	This is the instruction to be executed when arithmetic
	overflow occurs.  Op-code 0 is special, and uses
	its E.A. as interrupt bits to turn on in the RH of .PIRQC.
	The default contents of .TR1INS are simply %PIARO to
	set the overflow interrupt.  On the KA-10, writing the
	variable doesn't change it.


.TR2INS		+? +?	Trap 2 instruction.

	This is the instruction to be executed when pdl
	overflow occurs.  Op-code 0 is special, and uses
	its E.A. as interrupt bits to turn on in the RH of .PIRQC.
	The default contents of .TR2INS are simply %PIPDL to
	set the pdl overflow interrupt.  On the KA-10, writing the
	variable doesn't change it.


.TTST		+- +-	saved TTYSTS

	In a job which does not have the TTY, this variable
	holds the saved contents of TTYSTS (what would be in
	TTYSTS if the job were given a TTY).   This is primarily
	useful for examining from DDT.
	See ITS TTY for a description of the contents of TTYSTS.
	See also the TTYGET and TTYSET symbolic system calls.


.TTS1		+- +-	saved TTYST1

	Like .TTST, but for the TTYST1 variable instead of the
	TTYSTS variable.


.TTS2		+- +-	saved TTYST2

	Like .TTST, but for the TTYST2 variable rather than the
	TTYSTS variable.

.TTY		+* +*	random TTY variable

	This variable indicates the status of the job with
	respect to the console controlling its job tree.
	The %TBNVR, %TBINT, %TBWAT, %TBOUT, %TBINF, %TBOIG, and %TBIIN bits
	are settable. %TBWAT may be set only by the superior.
	4.9	%TBNOT	Does not have TTY now.
	4.8	%TBNVR	If 1, an OPEN on the tty will fail
			rather than hanging, unless %TBWAT is on.
	4.7	%TBINT	An attempt to use the console without owning
			it will cause a %PITTY interrupt (LH of
			the .PIRQC user variable), unless
			%TBWAT is set to 1.
			In particular an OPEN on the tty
			will interrupt instead of failing or
			hanging.
	4.6	%TBWAT	If 1, overrides the setting of %TBINT
			and %TBNVR, and makes the system act
			as if they were 0.  Settable only with
			.USET.  DDT sets this bit when $P'ing a
			job, so that even if the job loses the tty
			momentarily it will not get upset.
	4.4	%TBDTY	If the TTY was taken from the job,
			then when it gets it back, this bit says
			that the TTY should stay with the job
			and not be passed down to an inferior.
	4.3	%TBOUT	Allow this job to type out, even if it
			doesn't have the TTY.  Some operations,
			and all input will still require the job
			to have the TTY.  Not effective unless
			the superior enables it by setting %TBINF
			in the superior's .TTY var.
	4.2	%TBINF	Enable this job's inferiors to take
			advantage of their %TBOUT's.
	4.1	%TBOIG	Ignore output.  Overrides %TBWAT, %TBINT.
	3.9	%TBIIN	Interrupt on attempt to do input.  Overrides
			%TBWAT.
	3.6-3.1	$TBECL	Number if echo lines, if the job
			doesn't currently have the TTY.
	2.9-1.1	If the job has the TTY, this is the TTY number.
		If it doesn't, and doesn't want it, this is the
		(internal) user number of the immediately
		inferior job to give the TTY to.

.TVCREG		+* +*	TV console register

	Initially -1.
	This variable is placed in the console register
	when the job is run if it is non-negative.
	It controls which video buffer memory is used
	when writing into the job's tty's TV buffer	
	(see the CORBLK symbolic system call).
	The format of the console register is as follows:
	4.9-4.2	ALU function, used when writing into TV memory:
		VALUE	SYMBOL	FUNCTION
		0	CSETC	SETCAM
		1	CNOR	ANDCBM
		2	CANDC	ANDCAM
		3	CSETZ	SETZM
		4	CNAND	ORCBM
		5	CCOMP	SETCMM
		6	CXOR	XORM
		7	CANCSD	ANDCMM
		10	CORCSD	ORCAM
		11	CEQV	EQVM
		12	CSAME	SETMM/MOVES/JFCL
		13	CAND	ANDM
		14	CSETO	SETOM
		15	CORSCD	ORCMM
		16	CIOR	IORM
		17	CSET	SETAM/MOVEM
	Note that those symbols are not predefined in MIDAS.
	4.1-3.3	Video buffer number (video switch input number).
		See the VIDSW symbolic system call.


.UIND		+- +-	user index	

	The unique number assigned to the job by the system	
	when the job was created.  These numbers typically
	are between 0 and 77 octal or so (the exact maximum value
	is a function of the particular incarnation of the
	system).  When a job is killed, its user index is
	freed for re-use.
	Most symbolic system calls  which require a job
	to be specified will accept 400000+the user index
	in lieu of a channel with the job open on it if the
	call is only to examine the job and not to modify it.
	The .GUN and DETACH commands require a user index.
	Jobs 0 and 1 are special in that they always stand for
	the system itself and for the CORE job, respectively.
	(The CORE job manages core allocation for the system.)
	This may have various implications depending on context;
	for example, when sharing a page with a job via the
	CORBLK symbolic system call, sharing with
	job 0 means sharing with an absolute page, and "sharing"
	with job 1 means getting a fresh page.

.UNAME		+- +?	user name

	A word of sixbit characters which is the user
	name of the job.  All jobs in a given job
	tree must all have the same user name.  Furthermore,
	a console-controlled tree may not log in if another
	console-controlled tree is logged in under the same
	uname.  When a new console-controlled tree is created
	by typing ^Z on a free console, the uname of the newly
	created top-level job of the tree is set to "___nnn",
	where "nnn" is the user index of the newly-created
	job.  A non-disowned non-console controlled job is also given
	such a uname initially.  This may subsequently be changed to
	something more reasonable by using the LOGIN symbolic
	system call.
	The uname of a newly created inferior job is initialized
	to the uname of its creator.
	If a disowned job tree is re-owned, the unames of all the
	jobs in the re-owned job tree are set to the uname of the
	re-owning job tree.
	The .UNAME user variable may be set only with a .SUSET, and
	only by a top level job which has no direct inferiors;
	furthermore, attempting to set the uname to zero or the left
	half to -1 causes an illegal operation interrupt (bit 1.6 of
	the .PIRQC user variable), as does attempting to make the
	uname-jname pair of the job non-unique.
	See also the .JNAME user variable.

.UPC		+* +-	user program counter

	The PC for the job.  This word, of course,
	contains the PC flags in the left half;
	a job may set these flags for itself only by
	using JRST 2,@[<word with flags and pc>].
	On KA's, the flags in the left half are as follows:
	(- = .USET may not set; % = peculiar to ITS)
	%PCARO==400000	Overflow.
	%PCCR0==200000	Carry 0.
	%PCCR1==100000	Carry 1.
	%PCFOV==40000	Floating overflow.
	%PCFPD==20000	First part of instruction already done.
	%PCUSR==10000 -	User mode.
	%PCUIO==4000  -	User I/O.
	%PCPUR==2000  %	Pure.  Instructions may only be fetched from
			read-only memory.  See bit 3.7 of the .PIRQC user
			variable.  This feature is not available on
			all machines -- beware!
	%PCSPC==1000  -	Unused.  (A PDP6 feature)
	%PC1PR==400   %	One proceed.  An interrupt will occur at the end
			of the next instruction.  See bit 2.3 of the .PIRQC
			user variable.  Used by DDT for ^N commands.
	%PCX17==200   %	AI KA-10 computer only.  Index-off-the-PC hack.
			When this bit is set, an index field of 17 means
			index off the PC instead of ac 17.
	%PCFXU==100	Floating underflow.
	%PCDIV==40	No divide.
		3.5-3.1	Always zero.  May not be set non-zero.

	On KL's the flags are as follows (note the "|" at the front
	of lines that differ significantly from those for KA's):

|	%PSPCP==400000	"Previous Context Public" - this applies only
			in exec mode; in user mode this bit is the same
			as in KA (%PCARO, Arithmetic overflow).
	%PSCR0==200000	Carry 0.
	%PSCR1==100000	Carry 1.
	%PSFOV==40000	Floating overflow.
	%PSFPD==20000	First part of instruction already done.
	%PSUSR==10000 -	User mode.
	%PSUIO==4000  -	User I/O.
|	%PSPUB==2000	"Public Mode" - not used in ITS
|	%PSINH==1000	Inhibits MAR-breaks and trap3 (one-proceed trap)
|			for one instruction.
|	%PSTR2==400	Set by pdl overflow;  causes the "trap 2 instruction"
|			to be executed.  That instruction is kept in .TR2INS
|	%PSTR1==200	Set by arithmetic overflow;  causes the
|			"trap 1 instruction" in .TR1INS to be executed.
|			Both %PSTR1 and %PSTR2 set generates a one-proceed
|			trap. 
|	%PS1PR==160   %	%PSINH+%PSTR2+%PSTR1.  Setting those bits
|			causes a single instruction proceed.
	%PSFXU==100	Floating underflow.
	%PSDIV==40	No divide.
		3.5-3.1	Always zero.  May not be set non-zero.

	The user mode (4.4) is always set to 1.
	The user I/O bit (4000, bit 4.3) is set according
	to whether the job is in .IOTLSR mode.

	If the .UPC user variable for one job is read by another while
	the first is running, an exec mode PC may be seen (bit 4.4 = 0);
	this reflects the fact that the job is in the middle
	of a system call or something.  The .UUOH user variable
	should then be examined (this is precisely what DDT does
	for the evaluation of .).

.USTP		+* --	user stop bits

	Initially <100000,,>.
	If this variable is non-zero, the job is being blocked
	from running for one reason or another.  If zero, the
	.FLS variable controls whether the job may run.
	The form of the .USTP variable is as follows:
	4.9	BCSTOP	Job is being moved in core.
	4.8	BUCSTP	Core job is stopping this job
			in order to get more core for another job.
	4.7	BUSRC	User control bit.  Only this
			bit may be modified, and only by the
			procedure's superior.  Any attempt to
			set the .USTP variable non-zero
			will set this bit; any attempt to set it
			to zero will clear this bit.
	4.6	BSSTP	Set while superior is altering the page
			map for the job.  (Not directly settable
			by superior.)
	2.9-1.1	Count of transient reasons for stopping the job.
		If non-zero, inhibits relocation of the job by
		the core job.
	PEEK displays this variable by printing the high six bits
	in octal, then a "!", then the rest in octal.  This is
	why one normally sees "10!0" for a stopped job.


.UTRP		+* --	user trap switch

	When non-zero, this switch specifies that all uuo's
	which trap to the system should, instead of performing
	their usual actions, should cause a word 1 class 1
	interrupt to the job executing the uuo.  This allows
	simulators, etc., to trap all uuo's executed by a job.
	An attempt to set this variable will use only bit 1.1.

	This is the same as the %OPTRP bit of the .OPTION user variable.


.UUOH		+- +-	system uuo PC

	The program counter as of the last uuo which trapped
	to absolute location 40 (not location 40 in the job,
	nor the location specified by .40ADDR!)
	See also the variable .SV40.


.VAL		+* +*	value or error code of job

	.VALUE instructions set this word to the contents
	of the memory location they address.  That is useless.
	More importantly, .LOSE instructions, and the LOSE
	system call, set .VAL to <error code>,,<addr of losing
	instruction>, so that the superior can decode the
	error.

.WHO1		+* +*	user who-line control word

	This variable controls the printing of .WHO2 and .WHO3
	at the end of the TV who-line (see ITS TV).
	4.9	If 1, suppress the who-line entirely when focused
		on this job.
	4.8	Suppress space between halves of .WHO2.
	4.7-4.5	Mode for printing left half of .WHO2:
		0	Do not print.
		1	Date in packed form:
			4.9-4.3	Year (mod 100.).
			4.2-3.8	Month.
			3.7-3.3	Day.
			3.2-3.1	Unused.
			See the RQDATE symbolic system call, but
			note that here the date is shifted.
		2	Time in fortieths of a second, printed in tenths
			in the form HH:MM:SS.T.
		3	Time in half-seconds, printed in the form HH:MM:SS.
		4	Octal halfword.
		5	Decimal halfword (no . is supplied).
		6	Three sixbit characters.
		7	Unused.
	4.4-4.2	Mode for printing right half of .WHO2.
	4.1	Print 3.9-3.3 twice (doubled character).
	3.9-3.3	If non-zero, character to print after left half of .WHO2.
	3.2	If 1, suppress the space between .WHO2 and .WHO3 printout.
	3.1	If 1, suppress the space between halves of .WHO3.
	2.9-2.7	Mode for printing left half of .WHO3.
	2.6-2.4	Mode for printing right half of .WHO3.
	2.3	Print 2.2-1.5 twice.
	2.2-1.5	If non-zero, character to print after left half of .WHO3.
	1.4-1.1	Unused.
	That is, if the who-line is printed at all, what appears
	at the end is these characters:
			AAAAXX-BBBB=CCCCYY+DDDD
	where:	AAAA is the result of printing the left half of .WHO2.
		BBBB right half of .WHO2.
		CCCC left half of .WHO3.
		DDDD right half of .WHO3.
		XX one or two characters specified by .WHO1 4.1-3.3.
		YY one or two characters specified by .WHO1 2.3-1.5.
		- space, unless .WHO1 4.8 is 1.
		= space, unless .WHO1 3.2 is 1.
		+ space, unless .WHO1 3.1 is 1.
	Note that the specifications fall neatly into 8-bit bytes
	(for the convenience of the PDP-11); hence it is easiest
	to specify this word using .BYTE 8 in MIDAS.
	Example:
		.SUSET [.SWHO1,,[ .BYTE 8 ? 166 ? 0 ? 144 ? 200+", ]]
	causes .WHO2 to appear as a word of sixbit, and .WHO3 to
	appear as octal halfword typeout in mmm,,nnn format.


.WHO2		+* +*	first user who-line variable

	See .WHO1 for details.


.WHO3		+* +*	second user who-line variable

	See .WHO1 for details.

.XJNAME		+* +*   "intended" job name.

	This variable holds what the job's name was "intended"
	to be, by its creator.  Why might the job's name not
	actually be what it was intended to be?  Perhaps because
	that name was already in use by some other job, and the
	creator had to find a second choice.  For example, when
	:NEW T in DDT creates a job named T0 because there was
	already a job named T, the job T0's .XJNAME will be "T".
	In any case, when using the common technique of having
	several programs be links to one file, which figures
	out what name it was invoked under and behaves
	accordingly, the .XJNAME is the right place to look to
	find out what behavior the invoker desires.

	When a job is first created, its .XJNAME is the same as it's .JNAME.


.XUNAME		+* +*	"real" user name.

	This variable holds what says who you really are,
	as opposed to what you are logged in as.
	It should be a word of sixbit, just like .UNAME.
	For example, if you are logged in as FOO1 then
	your XUNAME will probably be FOO, because that's
	what DDT will normally set it to.  However, though
	the .UNAME may change because of reowning or attaching,
	the .XUNAME will ot change iunless requested specifically.
	However, the user may alter DDT's .XUNAME by depositing in
	..XUNAME, which works by informing DDT and having DDT
	tell ITS.
	Whenever an inferior is created, its .XUNAME is initialized
	from its superior's.
