Documentation for DDT version 1491
Documentation for DDT version 1491
List of DDT commands.
Note that angle brackets are used to delimit meta-variables.
Each of the following commands that takes a prefix arg
does so in one of two ways:
All other commands evaluate all the preceding syls and ops
to get 1 to 3 arguments (separate them with $,).
- If the arg is called <name>, <dev>, <user>, <prgm>, <flags>, <fn1>,
it is the syllable immediately preceding the operator.
- If it is a symbol, the symbol's name is used;
otherwise it is considered to be SIXBIT for the desired name.
eg. FOO$J and $1'FOO$$J are equivalent.
- will terminate an execute file or valret string.
- prints the default user's sends file.
- prints <user>'s sends file, and sets the default for ^A and
- print your own sends file, and set the default to you.
- like ^A but for MAIL files. (but see :DDTSYM PMLFLG)
- like $^A but for RMAIL, BABYL or OMAIL files. (tries both).
- is a special interrupt-level character, which turns
on output to the wallpaper file if there is one, by zeroing
..LPTFLG. In files and valret strings, one ^B merely
counteracts one ^E, by decrementinging ..LPTFLG unless it is
zero. When a wallpaper file is open and output to it is on,
every character DDT outputs goes to it, as does every
character that DDT reads and echoes. ^B, ^E, ^V and ^W are
interpreted at interrupt level when typed on the TTY; when
present in execute files and valret strings, they are
interpreted when read. They will not be seen at any higher
level (eg. ASCII type-in); in files and valrets, they will
be ignored within :IF conditionals that fail.
- types a CRLF but doesn't close the open location,
terminate an expression, reset the temporary mode, etc. The
CRLF will be typed even if ^W has turned off TTY output.
^C being the ITS end-of-file character, it terminates
- half-kills the last symbol typed out (not counting index
fields of instructions), then retypes $Q in the current mode
(after DDT types JRST FOO(A) , $$^C will half-kill FOO).
- is a special character which types "XXX?" and flushes any
incompletely typed in command. If typed while a $E, $N or $W
search is in progress, the search is stopped.
- is a special interrupt-level character which turns off output
to the wallpaper file (if any) but does not close it.
Specifically, it increments ..LPTFLG. See ^B.
- lists the last directory referenced.
- lists directory of device <dev>, using the :PRINT default
sname, and sets default :PRINT device (by special
dispensation, that isn't done if <dev> is TTY !). Doesn't
work if <dev> is also the name of a directory on DSK:.
In that case, you get ...
- lists user <user>'s directory on device DSK:, and makes <user>
the default sname for :PRINT, etc. If <user> isn't a
directory, and isn't a device name either, the default sname
for :PRINT, ^F, etc. is still set. Thus, <user>^F <dev>^F
will show the directory of <dev>:<user>; even if <user> isn't
a disk directory.
- is the same as <msname>^F.
- is like <dev>^F but doesn't set :PRINT defaults;
just the default for ^F without argument.
- is like <user>^F but doesn't set the :PRINT default.
this is a hairy command which uses the DIR: device to print the
current default directory. The display is controlled by the table
of two-word sixbit entries beginning at DIRFN1 (and DIRFN2) inside
your DDT. For numeric argument n, the nth FN1 and FN2 are used as
DIR: arguments. If the numeric arg is omitted it is assumed to be
zero (and DDT uses the arguments at DIRFN1+0 and DIRFN2+0).
If a DIRFN2 slot is zero: if there is no argument, we use the
default :PRINT FN1; else if there is an argument we use it and
set the default :PRINT FN1. If the DIRFN2 slot has something
in it: if there is an argument, we use that argument instead.
Here follow the DIR: arguments provided in DIRFN1.
You can patch them with :SELF if you have another preference.
DIRFN1: SIXBIT /NAME1/ ;Table of $$^F DIR: search options.
DIRFN2: SIXBIT /UP/
SIXBIT /FIRST/ ;$$1^F finds FN1
SIXBIT /SECOND/ ;$$2^F finds FN2
SIXBIT /CDATE/ ;$$3^F ascending in creation age
SIXBIT /SIZE/ ;$$4^F descending in size
SIXBIT /NOT/ ;$$5^F not backed up
SIXBIT /ONLY/ ;$$6^F just link pointers
Examples of use:
FOO$$1^F Shows DIR:FIRST FOO and sets FN1 to FOO
LISP$$2^F Shows DIR:SECOND LISP
$$2^F Shows DIR:SECOND BIN
$$3^F Shows DIR:CDATE DOWN
UP$$3^F Shows DIR:CDATE UP
PACK13$$6^F Shows DIR:ONLY PACK13
As an additional feature, if you set the DDT variable DIRDIR
to -1, $$^F (without a numeric argument) sets your default
:PRINT SNAME and otherwise ignores the argument. This lets
you look at other directories.
$$0^F Does DIR:NAME1 UP
$$^F Still does DIR:NAME1 UP
FOOBAR$$^F Changes default dir to FOOBAR and does DIR:NAME1 UP
DOWN$$0^F Changes no defaults (now FOOBAR), does DIR:NAME1 DOWN
- is a special interrupt level character that aborts any DDT
command. It is so powerful that it can leave DDT's data bases
in inconsistent states if typed at the wrong instant, so it
should be used only when DDT appears to be hung.
is equivalent to $J $P
- continues <prgm>, creating one if necessary. If a job named
<prgm> exists, it will be $P'd (or $G'd if it was loaded but
never started). Otherwise, <prgm>^K is done: a job <prgm> is
created, and <prgm> is loaded in and started. Since ^H only
loads <prgm> if no job <prgm> already exists, ^H never
clobbers anything useful. If the existing job is disowned, it
will be reowned before being continued, of course.
- like <prgm>^H but loads symbols if a new job is made.
goes to the next line, and then "types and opens the RH of
$Q", which involves typing the RH of $Q as an address, typing
a slash, and then printing the contents of the address typed
(in the current type-out mode), just as if the "/" command had
- deposits <arg> in the open location if any,
then types out and opens the RH of <arg>.
- are like ^I, <arg>^I but use the LH rather than the RH.
- are like ^I, <arg>^I but do an effective address calculation
on $Q or <arg> to determine the address to type and open.
Types out and opens location .+1 (remember that "." is always
the last location opened). Unlike ".+1/", ^J does NOT push
the old value of "." onto the 'ring buffer of "."'.
- stores <arg> in the open location, if any, then does ^J.
- pops the ring buffer of point, then does ^J.
After " 100/ 200/ ", $^J would open 101 . See $^M.
- stores <arg> in the open location, if any, then does $^J.
- pops the ring buffer of "." <n> times, then does ^J.
- stores <arg> in the open location, if any, then does $<n>^J.
- creates a job named <prgm>, loads TS <prgm> into it without
symbols (looking for the file on your directory, the SYS
directory, the SYS1, SYS2, and SYS3 directories, the
dirs. in the sname search list), and the connected
directory, and starts it, giving it
the TTY. The program is given a null :JCL command
string. If a job named <prgm> already existed, the newly
loaded copy of <prgm> overwrites it. Since that can be a
screw, if the job was disowned, or if ..CLOBRF is
nonzero, DDT will ask the user "–Clobber Existing Job–".
After such a query, type a space to tell DDT to go ahead
and clobber the job; type anything else to abort. DDT
will query "–Reload Protected Job–" if the job is "pro-
-tected" (its ..SAFE variable has been set nonzero).
- loads the current job's symbols from the
file which was loaded (eg by ^K)
- is like <prgm>^K but loads the symbols.
- disowns the current job. The job becomes a "disowned job"
and is no longer DDT's inferior. Anyone who wishes to
can "reown" it with $J, making it his inferior. In the
mean time, since it is no longer DDT's inferior, it will
not be harmed if DDT is logged out or killed.
An infix argument is used as the control-bits for the
DISOWN system call. Each bit controls a separate option.
The meaningful bits are these:
- disowns the job and arranges that if it ever remains stopped
or blocked for an hour without being reowned or attached,
the system will kill it.
- disowns the current job and starts it, simultaneously
(as far as it can tell).
- makes the current job be a disowned job scheduled as part of
the system (ie sharing the system job's resource word). It is
antisocial to use the "1" and "2" bits for private purposes.
- makes the current job into a non-disowned, top level job (but
not console-controlled). Useful for resurrecting dead system
- makes the current job be a non-disowned top level job with the
system job's resource word.
- is a special character that tells DDT to type out any input
characters that if been read but not yet fully processed,
after first typing a CRLF or clearing the screen. ^L is
ignored entirely in execute files and valret strings.
closes the open location if any, without changing it. Resets
the temporary (or "current") typeout mode to the permanent
- deposits <arg> in the open location if any, and closes it.
Resets the current typeout mode.
- pops the ring buffer of ".", then types and opens the new ".",
tab-style, on a new line. Does not reset the current typeout
mode to the permanent mode. After "30/ 100/ 200/", $^M would
pop the ring buffer once, opening location 100 and leaving 30
on the top of the ring buffer. A second $^M would open 30 .
- stores <arg> in the open location if any, then does $^M.
- like "$^M", but pops the ring buffer of "." <n> times instead
- stores <arg> in the open location, then does $<n>^M.
- does nothing if no location is open. Otherwise, it unpurifies
the page containing the open location (by replacing it with an
impure copy). $$^M is superfluous unless ..UNPURF has been
- like $$^M but deposits <arg> in the location after unpurifying
- proceeds one instruction, then returns to DDT.
- proceeds <n> instructions, then returns to DDT.
In "care" mode, UUOs will be treated specially - the whole
UUO handler will be executed. See $^^ command, Y flag.
- steps the current job one instruction, using breakpoints.
If the next instruction is a subroutine call, the whole
subroutine is executed. $^N works by putting temporary
breakpoints in the two words following the next instruction to
be executed, and then restarting the job. The temporary
breakpoints go away when either one of them is hit. If the
instruction to be executed next is a PUSHJ, the AC used and
its contents are remembered and the breakpoints will be
conditional on the AC's having the same contents. Thus, if
the PUSHJ is a recursive call all the inner recursions will
execute and return without stopping on the breakpoint.
Actually, the breakpoints don't always go immediately after
the instruction to be executed next; they start on the first
"reasonable" instruction after it ("reasonable" here means
"nonzero op-code field"). This makes it possible sometimes to
step over calls taking following arguments without taking any
- similar but puts the breakpoints <n> words after the insn: at
$.+<n>+1 and $.+<n>+2 . Good for calls followed by <n> args.
This form of $^N overrides DDT's search for the next
"reasonable" instruction by telling it explicitly how many
args there are.
- like $^N but puts the breakpoints at <pc> and <pc>+1 and does
no special hacking for PUSHJ instructions. Also, DDT will not
be insubordinate by looking for reasonable instructions, since
it has been told explicitly what to do.
- puts the breakpoints at the address in the word pointed to by
the RH of accumulator <p>. If you accidentally ^N through a
PUSHJ, <p>,$^N will proceed until after the subroutine POPJ's.
This is not considered to be an explicit specification of
where to break, so DDT looks for a reasonable instruction.
- is similar, but puts the breakpoints <n> words later,
overriding DDT's search for a reasonable instruction. Good
for exiting a subroutine with <n> args after the call.
- uses <n> ( <p> ) as the location of the first of the two
breakpoints. Like <p>,$^N except that the return address is
assumed to be <n> words down in the stack instead of at the
- executes one instruction at a time until the PC gets to be 1
or 2 larger than it was when the command was given. $^N is
usually equivalent, and much faster; $$^N's only advantage is
that it does not have to put breakpoints in the program.
- is like $$^N but continues till the PC is <pc> or <pc>+1.
In general, $$^N takes the same sorts of arguments as $^N.
- ^O <file>
- deletes the specified file. It warns you what it will do,
with "(Delete File)" (but see ..DELWARN).
- $^O <file1>,<file2>
- link <file1> to <file2>. Whether or not this will delete the
file if it exists is controled by ..LINKP (q.v.)
if ..DELWARN is 3, or ..LINKP is 0, it is disabled.
- $$^O <file1>,<file2>
- renames <file1> to the name <file2>, just like :RENAME.
- proceeds the job without giving it the TTY. If it's running,
does nothing. If it's waiting, lets it return and doesn't
start it. Normally, clears the job's %TBWAT bit, so if it
tries to use the TTY, it will interrupt and say "Job <jname>
wants the TTY". However, this feature can be overridden - see
- is like ^P except that %TBWAT is set instead of cleared, so
that if the job tries to use the TTY it will hang dumbly until
it is $P'd. You can interchange the meaning of ^P and $^P -
- is like ^P except that the job's %TBOUT is set, giving it
permission to type out even though it can't use the TTY for
- This is the same as ^ and is somewhat easier to type on some
- ^R <file>
- is equivalent to ":PRINT <file>" - the specified file is typed
on the terminal.
- $^R <file1>,<file2>
- is equivilent to ":COPY <file1>,<file2>" - the contents of the
first file are copied into the second file, writing over it if
it already exists.
- is the "shut up" character. It turns off typeout at interrupt
level, but turns it on again when read. Thus it turns off
typeout for the remainder of the command currently being
processed, not permanently.
- sets the current job's sname to <user>
- like <xuname>$^S; it undoes the effect of <user>$^S.
- causes the next ^K, ^H or :-command, if it runs a program, to
run it "as if <user> were running it". Precisely, its .XUNAME
variable will be <user> instead of you and its .HSNAME will be set to
<user>'s HSNAME. If the program follows the current convention, it
will use <user>'s init file, etc. $^S works by setting the ..TUNAME
and ..THSNAME variables.
- sets the master system name (the "msname"), the :PRINT default
sname, and the sname for ^F, to <user>.
The master system name is used:
To initialize the snames of newly created jobs.
To initialize their $L-default snames.
Is searched last for ^K and : commands
- makes filename-translations:
- <flags>^T <file1>,<file2>
- creates a translation entry for the current job, translating
<file1> to <file2>. The effect will be that if the job tries
to open <file1>, it will actually get <file2>. Any of the
names in the two files may be *, meaning "translation applies
to any name" in <file1>, "translation doesn't alter this name"
in <file2>. A translation that specifies only an SNAME in
<file1> (aside from *'s) is likely to confuse DDT and screw
you. <flags> should contain any subset of "A", "I", "O".
"A" means don't retranslate the result of applying this
translation. "I" means translate on input, "O" output. If
neither I nor O is specified, both are assumed.
Example: I^T FOO:*;* * , DSK:FOO;* *
will make any attempt by the current job to read a file from
device FOO: to read it from the disk directory named FOO;
instead. Since all four names default to *,
I^T FOO:,DSK:FOO; is a valid abbreviation.
- <flags>$^T <file1>,<file2>
- creates a translation that applies to DDT
and all of its inferiors to all levels.
- <flags>$$^T <file1>,<file2>
- creates a translation for the current job and
all of its inferiors to all levels.
- removes filename translations:
- <flags>^U <file>
- deletes any translation the current job may have which says
the <file> should be translated. I^U will only remove a
translation for input, and won't affect translations for
output. It will change a bidirectional translation into an
output-only translation. Note that ^U *:FOO;* * removes any
translation made on *:FOO;* *. It does NOT remove all
translations made on names containing FOO;. It would NOT undo
the effect of a ^T *:FOO;A B,C D. If you are not sure what
translations you made, do :PEEK T<cr> to see them all.
- <flags>$^U <file>
- removes a translation created by $^T (one which applies to
DDT and all its inferiors).
- <flags>$$^U <file>
- removes a translation created by $$^T (one which applies to
the current job and all its inferiors).
- is a special interrupt-level (see ^B) character that turns on
output to the TTY by zeroing ..TTYFLG . In valrets and
execute files, merely decrements ..TTYFLG by 1 (unless it is
already 0). Thus, one ^V in a valret or file cancels one ^W.
- special interrupt-level character that turns off
typeout on the TTY by AOSing ..TTYFLG . See ^B.
- is used to stop a job running without the TTY (after being
^P'd). ^X normally does what ^Z would do if the job had the
TTY. If the job is waiting to return, it is allowed to do so,
but if it is waiting for a chance to commit suicide it will be
stopped instead. ^X does nothing to a stopped job,
except print out the instruction where it is stopped (and
tell you it's stopped).
- $^X or $^X.
- (the point is required unless ..CONFRM is zero) deletes
("kills") the current job. All the data in it is lost. The $J
command is then used to select another job to be current (if
there are any); that job's name is typed out, followed by
"$J". If the job to be killed is "protected" (its ..SAFE
variable has been set nonzero), DDT will ask for confirmation
before killing it.
- is like $^X., except that after killing the current
job, $<n>J rather than $J is used to select another.
- kills the job named <job>. It asks for confirmation by typing
"–Kill–"; a space tells it to go ahead. Whether you
confirm the killing or not, the current job afterward is the
same as it was before (unless it was the one you killed).
- $$^X or $$^X.
- kills all jobs. The "." is required, unless ..CONFRM is zero.
Since this command is easily typed by accident instead of $^X.,
it is normally disabled, but may be turned on by ..MASSCP/-1
- uses $Q as an AOBJN pointer to a symbol table in the current
job's core, which should be appended to DDT's symbol table.
Make sure that every symbol has either the local bit or the
global bit (4.8 or 4.7) set; otherwise, a "DDT bug" message
may result (exceptions are allowed if the symbol table being
set up contains valid DDT-style block structure, but don't be
surprised to find that you made a mistake). See Symbol table
- is similar but uses <arg> instead of $Q.
- is like ^Y but flushes the symbols DDT already has.
- similar to ^Y.
- puts a copy of the job's symbol table into the job's core. It
assumes that <addr> is the location of an AOBJN pointer to an
old symbol table, which is to be replaced by DDT's current
one. The new symbol table is stored in core so that it ends
at the same place as the old one; expansion or contraction
occurs at the low end in core. The AOBJN pointer is updated
to record the new size. These actions are such that DDT-2$$^Y
will give the symbols to a non-timesharing DDT in the job.
- is not a DDT command. If given as a command to DDT, it is an
error. ^Z IS a command to ITS to give the job that owns the
TTY a fatal interrupt, if it is not a top-level job. If the
interrupted job's superior is a DDT, it will take control of
the TTY and begin reading commands as a response, but the ^Z
itself is never seen by the DDT.
- is altmode, which is a prefix-modifier for DDT commands.
- begins a patch at the location open (the location "being
patched"). It is a convenient way to replace one instruction
(at the open location) by several (the patch). The
instructions in the patch are stored in the job's "patch
area", a spare area allocated specifically to such use. Every
program should allocate one. The beginning of the patch area
is the value of PATCH if it is defined, or the value of PAT if
it is defined, or 50 . As patches are made, PATCH will be
redefined to point to the next free location in the patch
A patch started with ^\ must be terminated with some variety
of ^] command, which will store first the JUMPAs back from the
patch to the patched routine (two of them, in case the patch
skips), and then a JUMPA from the location being patched to
the patch itself. This order of actions guarantees that the
patch will never appear to be "half made" in any way that that
might cause trouble in a running program.
^\ begins by typing and opening the first location of the
patch area. Then the contents of the location being patched
are typed out and left as the argument to the next command.
If you wish to include that instruction as the first
instruction of the patch, type ^J. If you wish to get rid of
it, type <rubout>. Then deposit the other instructions of the
patch, and finish with a ^] (which see).
While patching, the pseudo-location ..PATCH contains
<location being patched>,,<start of patch>.
NOTE to users of relocatable programs, and MIDAS or FAIL block
structure: PATCH is redefined in the same symbol block that
it was found in. This permits some obscure hackery, but
normally the whole program will have only one patch area, and
it must be visible to ^\ no matter which symbol block is
currently selected for type in. That can be guaranteed by
defining PATCH as a global symbol (eg, using PATCH": in
- deposits <arg> in the open location, then does ^\. Equivalent
to ^\<rubout><arg>, except that with <arg>^\, <arg> will be
present in the location being patched while the patch is being
- unmakes the patch previously made to the open location. $$^\
uses the JUMPA to the patch to find the instruction that the
patch replaced. This works only for patches made by ^\, which
were either closed by $^], or closed by ^] and having the old
instruction as the first instruction of the patch.
- ends a patch started by ^\. Two JUMPAs back to the locations
following the one being patched are stored in the two words
starting with the open location (or in location .+1 if no
location is open). Then in the location being patched is
stored a JUMPA to the beginning of the patch. Finally, PATCH
is redefined to point at the word after the second JUMPA back
(the first free location of the patch area).
- stores <arg> in the open location, opens the next location,
then does ^].
- is like ^] but first stores the contents of the place the
patch was made from in the open location and linefeeds. It is
useful for putting a patch "before" an existing instruction.
- stores <arg> in the open location, opens the next location,
then does $^].
- is like $^] but omits the JUMPAs back to the place that the
patch was made from. It is useful when a patch is put on top
of a JRST or POPJ - it will store an identical JRST or POPJ,
and nothing else. $$^\ (unpatch) can't work after $$^]
because necessary information isn't there; it can however
figure out that it can't win and will complain. If this is
important, use $^] instead of $$^].
- stores <arg> in the open location, if any, then moves down
one word and does $$^].
- begins multi-stepping according to the job's stepping flags,
and continues indefinitely. Multi-stepping involves printing
the next instruction and executing it, repeatedly. Each step
is done with a ^N or an $^N depending on the type of
instruction and the settings of the stepping flags. Other
flags cause stepping to stop before certain kinds of
instructions. Errors, breakpoints, and .VALUE 0's will stop
stepping. So will typing any character while DDT is typing
the next instruction to step over. ..DOZTIM holds the number
of seconds that ^^ will insist must elapse between steps, to
give the user a chance to decide whether to type a character
and stop things. While multi-stepping, the SETAI instruction
(a no-op) invokes a special kludge for making specific
subroutines appear to be single instructions during
multi-stepping. If the first instruction of a subroutine is
an appropriately coded SETAI instruction (rules follow below),
then after multi-stepping steps through the call to the
subroutine, it will see the SETAI and immediately proceed
(with $^N) to the subroutine's return address. Note that
there is a stepping flag (see $^^ below) that causes ALL
subroutine calls to be treated as single instructions; the
purpose of the SETAI crock is to make only some subroutines
act that way. One might assemble a program with a SETAI at
every entry point and patch the SETAI's of some subroutines
into JFCL's, when they are themselves being debugged. The
SETAI instruction should address a word which contains the
subroutine's return address. For subroutines called by PUSHJ
P, use SETAI (P). For subroutines called by JSP T, use SETAI
T. For subroutines called by JSR use SETAI .-1. Note that
SETAI is not special with ^N - only with ^^.
- like ^^ but will stop after the <n>'th step
if nothing stops it earlier.
- like ^^ but first changes the job's stepping flags according
to the letters in <flags> (which must be 6 chars or less).
The letters that mean something are:
Each job has its flags, which are updated by $^^ and used by
^^. The flags are initialized when the job is created, from
the new-job-default flags, which are initially 'BPUZ' but may
be changed with $$^^ (which might well go in an INIT file).
|B ||step over a subroutine call in one step with $^N.
|C ||stop before a subroutine call.
(subroutine calls are PUSHJ, JSP, JSR, JSA)
|D ||step over subroutine calls with ^N and
then step through the subroutine.
|J ||stop before jump instructions.
|K ||^N over jumps.
|M ||stop before monitor calls.
|N ||^N over monitor calls, but $^N over a .VALUE
|P ||print each insn before stepping over it (normal state)
|Q ||print insn only when stepping stops before it.
|R ||stop before subroutine returns (POPJ and JRA).
|S ||^N over subroutine returns.
|U ||treat user UUOs as subroutine calls.
|V ||$^N over user UUOs.
|W ||stop before user UUOs.
|X ||^N thru user UUOs (and step thru UUO handler).
|Y ||enter "care" mode in which ^N'ing thru a UUO whether
or not as a result of a ^^, will cause the saved PC in
the UUO handler to have its 1-proceed flag set, and
the whole UUO handler to be executed as if it were one
instruction, returning whenever the UUO handler
restores the flags (with JRST 2,).
|Z ||leaves "care" mode.
- <n> <flags>$^^
- combines <flags>$^^ and <n>^^
- sets the new-job-default stepping flags according to the
letters in <flags>. Does not actually do any stepping.
- sets the current job's stepping flags according to
the new-job-default and the letters in <flags>.
separates prefix command arguments, like altmode-comma.
- Incluseive or.
- divides. Priority 2.
- floating divides. Priority 2. If unary, reciprocates.
- opens a location as / or <arg>/ would, but doesn't type the
contents. $Q is set, however. Future ^J, ^, and ^I commands
will also not type the contents of the locations they open,
until a /, [ or ] command is used.
- retypes $Q in the " typeout mode, initially ASCII mode.
- retypes <arg> in " typeout mode.
- selects the " typeout mode temporarily. The " mode is
controlled by the per-job variable ..TDQUOT. Unless
explicitly changed, it is full-word ASCII typeout:
ASCII/<foo>/ is printed as $0"<foo>$ . ASCII/<foo>/+1 appears
as $1"<foo>$ (the digit is the word's low bit). ^Q and ^ are
typed out with an extra ^Q in front. Other control characters
are typed out as an uparrow followed by the un-controlified
character. Rubout is typed out as "^?". See the section on
- is an ASCII syllable whose value is ASCII/<foo>/+1&<n> (that
is, <n> specifies the word's low bit). To put a control
character in <foo>, use uparrow (eg. uparrow and A for
control-A), or preceded the control character with a ^Q. To
put in an uparrow or altmode, precede it by ^Q. A rubout
typed in immediately after a ^Q will be quoted, but a ^Q will
be rubbed out if other characters were typed in and rubbed out
in between. Rubout may be typed in as uparrow-questionmark.
- specifies " typeout mode as the current mode permanently, so
that ^M will not undo it.
- is used for multi-word ASCII type-in. It acts just like $<n>"
if 5 or fewer characters are typed. When the sixth character
is typed, the first five are deposited in the open location
and the location after it is opened. This is repeated for as
many words as it takes to store the whole string of
- if there is anything before the #, it means exclusive-or;
otherwise, it retypes $Q in # mode.
- temporarily selects the # typeout mode, This mode is
controlled by the per-job variable ..TNMSGN. Unless it has
been explicitly changed, it is single-character ASCII typeout
mode. A value types out as $1# followed by the ASCII
character in the low 7 bits. Thus MIDAS's "A is typed as $1#A.
MIDAS's ^A (uparrow-a) is typed out as $1#^A . Rubout
comes out as uparrow-questionmark. If the number to be typed
out goes over the bottom 7 bits, the bottom 7 bits are typed
as a character and the rest as an instruction; MOVEI B,101
comes out as "MOVEI B, $1#A".
- used for single character type-in. Follow it by the character
(uparrow and ^Q quote as with $1"). The result is a syllable
whose value is the ASCII for that character. Thus, "$1#A"
means 101 .
- specifies # typeout mode as the current mode
permanently, so that ^M will not undo it.
is not a DDT command in itself, since it is a symbol constituent
(just like letters).
- (altmode dollarsign)
temporarily selects $ typeout mode.
That mode, held in ..TDOLLA, is initially symbolic mode (same
as $S). This command is useful only if the $ mode is changed
to a user defined typeout mode.
- (altmode altmode dollarsign)
specifies $ typeout mode as the current mode permanently,
so that ^M will not undo it.
- is not a DDT command in itself, since it is a symbol
constituent (just like letters).
- temporarily selects the % typeout mode. That mode is kept in
the current job's ..TPERCE variable and is initially symbolic
mode (same as $S). This command is useful only if the % mode
is changed to a user defined typeout mode.
- specifies % typeout mode as the current mode permanently, so
that ^M will not undo it.
- if not first thing typed, does logical-and, Priority 3.
If not preceded by args, retypes $Q in & mode.
- temporarily selects & typeout mode. This mode, held in the
current job's ..TAMPER, is initialized to SQUOZE mode in each
new job. In SQUOZE mode, SQUOZE <n>,<sym> types out as
- a syllable whose value is the SQUOZE for <sym>, with <n> in
the flags. <n> should be from 0 to 74; the two lowest bits
of <n> are ignored.
- specifies & typeout mode as the current mode permanently, so
that ^M will not undo it.
- retypes $Q in ' mode (normally SIXBIT mode).
- retypes <arg> in ' mode.
- temporarily selects ' typeout mode. This mode, held in
..TPRIME, is initially SIXBIT mode, in which SIXBIT/<foo>/
types out as $1'<foo>$ .
- is a SIXBIT syllable whose value is SIXBIT/<foo>/ .
Only the first 6 characters of <foo> are significant.
- specifies ' typeout mode as the current mode permanently, so
that ^M will not undo it.
- is used for multi-word SIXBIT type-in. A cross between $1'
and $$1". Uparrow is not special.
- are used for putting a value in an instruction's index field,
or, more generally, for swapping the halves of a word-long
value. DDT treats the value inside the parentheses just as
MIDAS does: if the ( is preceded by an arithmetic operator,
the parentheses and all between them act like one syllable
whose value is the value of that word with its right and left
halves interchanged. Otherwise, the two halves of that word
are added into the opposite halves of the word within which
the parentheses occur, in an otherwise invisible manner. That
is, the argument evaluator's state is the same after the ) as
it was before the (.
- these are ignored completely (they can't even be rubbed out).
useful with conditionals (see :IF)
- starts a literal. Use this when typing in an expression to
stand for the address of a literal whose data you will specify
later. DDT will type out a symbol name and a closeparen;
the expression you are typing will contain a forward reference
to that symbol, which will become the address of the literal.
As soon as it is safe (no location is open, and no literal or
patch is being defined), DDT will assign that symbol the
address of the patch area and open it, so you can fill in the
data of the literal. Deposit the last word of the literal
with a $$), which will update PATCH and set "." to what it
was before DDT opened the literal. This scheme causes
recursive literals to work fine - the inner literal will
not be opened until you close the outer one, since DDT
can't tell where to start a literal while another literal
is being typed in. When you have a delay between the $$(
and the opening of the literal, the symbol assigned by DDT
will allow you to match the definitions up with the uses.
- Closes a literal. Defines PATCH to be the open location,
or, if none is open, to .+1.
Says that no literal is in progress, which may cause DDT
to ask for the definition of some other literal.
- is equivalent to <arg> <linefeed> $$). It deposits <arg>,
then sets PATCH to .+1.
- multiplies. Priority 2.
- floating multiplies. Priority 2.
- adds. Priority 1.
- floating adds. Priority 1.
is used to separate fields in a word. Space also does so.
The significance of the fields in a word depend on the pattern
of spaces and commas. Usually the value of the word is that
of the first field, with all the other fields added into the
RH. However, if the first field is followed by two commas, it
is put in the left half, and otherwise if followed by one
comma, it is put in the AC field. If a space separates the
first two fields and a comma ends the second the second is
added into the AC field rather than the RH. Examples:
- truncates <lh> to 18. bits and puts it in the left half.
- halfword type-in format. <lh> is put in the left half, and
<rh> in the right half. Each is truncated to 18. bits first.
- <insn> <ac>,
- a format which adds <ac> into the AC field of <insn>.
- <insn> <ac>,<addr>
- a format like <insn> <ac>, but adds <addr> to the right half.
- a format which results in <ac> in the AC field.
- puts <ac> in the AC field and <addr> in the address field.
- separates multiple args to one operator.
- subtracts. Priority 1. If unary, negates.
- floating subtracts. Priority 1. Or, floating negates.
- is a symbol whose value is usually the last location opened
(except that \, etc., open but don't set ). Whenever "." is
randomly changed, the old value is saved in a ring buffer with
8 slots. $^M, $^J and $^ reopen the previous value of .,
(plus or minus one for $^J or $^) ^J and ^ increment and
decrement the current value of ., rather than pushing the old
- has as its value the current job's user mode PC.
- opens the location addressed by the RH of $Q. This means that
various commands including ^M will store into that location.
More immediately, it means that the location's contents will
be typed out in the current mode and will be the new value of
$Q. Also, the location itself will be "pushed onto the ring
buffer of ." meaning that .'s value is now that location, but
$^M, etc. can reopen the previous value of ".". (This will
not be done if the location just opened is the same as the
previous value of .)
- opens the location addressed by the RH of <arg>.
- opens the location addressed by the LH of $Q or <arg>.
- does a PDP-10-style address calculation on $Q or <arg>
to determine what location to open.
- defines symbols:
- defines <sym> to have the same value "." currently has. If
the symbol is already defined in the current block or any
containing block, it will be redefined in the same block.
Otherwise it will be defined in the current block.
- <arg> <sym>:
- defines <sym> to have the value <arg>.
- selects symbol table blocks:
- selects the symbols in block or program <block>.
- like <block>$: but insists on finding a block directly
inferior to the currently selected one. Useful for resolving
the ambiguity, when several blocks or programs have the same
- retypes $Q in the "semicolon mode", temporarily decrementing
..TTYFLG by 1, so it takes two ^W's to suppress the printout.
(Useful in execute files that shouldn't echo their contents,
but want to type stuff). The semicolon mode is the most
recently specified temporary or permanent typeout mode, even
if it was only a temporary mode which was later reset to the
permanent mode, e.g., $S sets the temporary mode and the
semicolon mode to symbolic. A carriage return will reset the
temporary mode to the permanent mode but the semicolon mode
will remain symbolic.
- is similar but retypes <arg>, not $Q.
- are like ; and <arg>; but also reset the temporary mode from
the semicolon mode, and don't temporarily SOS ..TTYFLG.
- are similar but also set the permanent mode.
- (angle brackets)
are like algebra's parentheses. > can be used to terminate
an expression read in by a colon command (as can a carriage
- surround an expression to be used as an infix argument in an
operator. For example, $<1+1>R is equivalent to $2R
- are similar, for operators with two altmodes.
- retypes $Q as a number in the current radix.
- retypes <arg> instead.
- retypes $Q as a number in radix <r>.
- retypes <arg> instead.
- retypes $Q as a floating point number.
- retypes <arg> instead.
- retypes up to three arguments in the modes used to input them.
- when changing part of an instruction, saves typing
the unchanged parts:
- takes those parts of <arg> that are nonzero, or which are
known to have been explicitly specified; takes the other
parts of a word from $Q, and returns the sum. The parts of a
word used are:
op code 777000,,
indirect bit 20,,
address right half.
The $> may actually appear anywhere within the argument,
because it does nothing but set a flag when the evaluation
happens. If an undefined symbol is used (with "?") in either
half of the argument, it overrides that halfword of $Q. The
fields which $> can tell have been explicitly specified are
the AC field, the indirect bit ("@" specs it explicitly as
0), the left half (eg, "0,,$>"), and the right half (eg
",0$>"). some fields may be explicitly zeroed magically:
"0$>" zeroes the address field; "0 $>", the op-code field;
and "()$>", the index field. If $> can determine that the
quantity is an I/O instruction (CONI, etc.) a different set of
fields is used:
device code 77400,,
The address, index and indirect fields are the same as usual.
In this situation, "<arg>,$>" will use <arg> to specify the
- performs many functions, in different situations:
- used in expressions to refer to a symbol currently undefined
which will be defined later. Attempting to do any arithmetic
but addition on such objects, or to put them in the AC field,
will lose. However, putting one before a ",," will succeed in
putting it in the left half. Only two such objects may appear
in an expression and they may be used only to deposit in a
When an undefined-reference is deposited in core, what really
happens is that an entry is made in the "undefined symbol
table". When a symbol is defined (with "<symbol>:"), the
undefined symbol table is searched, and the value is added to
the locations that need it. The table entries for those
locations are then removed.
The undefined symbol table is dumped by $Y, loaded by $L, and
merged by $$L. It can be listed by :LISTU.
? right after a "?U?" (undefined symbol) error message creates
a reference to that undefined symbol, just as if the "?" had
been typed right after the symbol with no other intervening
operator. For example, if FOO is an undefined symbol, and
"FOO+BAR" is typed, a "?U?" error will occur after the "+".
At that point, "?+BAR" will recover, producing an ultimate
result equivalent to "FOO?+BAR".
? when there is no current job, types a basic help text. In
other circumstances, retypes $Q in $H$? mode (bit typeout
- where <arg> does not end with a symbol (use a space before the
"?" to play it safe), retypes <arg> in $H$? mode.
- temporarily reselects bit typeout mode, with the details as
they were last specified.
- temporarily specifies bit typeout mode, and sets the main bit
name prefix to <prefix>. The alternate prefix is set to the
previous main prefix. The pattern associated with the new
prefix is the value of <prefix> in the symbol table, if it is
defined; otherwise, if "..B" followed by the prefix is
defined, its value is used; otherwise, the pattern defaults
to 525252,,525252. How those settings are used is described
in the special section "bit typeout mode". Note that symbols
defined for use as prefixes are also good as masks for $T
Especially useful prefixes predefined in DDT are .R, .S, ..R,
and ..S. If you have a .SUSET or .USET word that is positive
(reading), just do .R$?? to see what variable is being read.
For a writing .SUSET or .USET, use .S$??. ..R and ..S are
good for .BREAK 12's.
- temporarily selects bit typeout mode, and sets the pattern for
the main bit name prefix to <pat>.
- the same as <prefix>$? $<pat>?. Like <prefix>$? but uses
<pat> as the pattern, rather than the value of <prefix>
- interchanges the main and alternate bit name prefixes. When
combined with a <prefix>, this exchange happens first, so
- sets the main bit name prefix, without changing the alternate
- permanently selects bit typeout mode. $$? interprets
arguments otherwise the way $? does.
- complements the indirect bit in the word in which it appears.
Is otherwise invisible (see parentheses not preceded by
- temporarily or permanently selects absolute address typeout
mode; that is, addresses will be typed as numbers (see $R).
Temporarily or permanently deselects bit typeout mode.
- and variants manipulate breakpoints:
- legal if the current job is stopped at a breakpoint;
removes that breakpoint.
- sets breakpoint at location <loc>. Up to 8 breakpoints may be
set in any one job.
- (where <n> is between 1 and 8) sets breakpoint <n> at <loc>.
If breakpoint <n> had been set, it is removed first.
- is the "address" of the location inside DDT which begins the
3-word block holding the information about the current setting
of breakpoint number <n>. The first word holds <address to
open>,,<address broken>, or 0 if the breakpoint is not set.
The 2nd word holds the conditional instruction; the 3rd, the
- sets a breakpoint at <loc> that will type out and
open <addr> when it is reached by the program.
- removes any breakpoint set at <loc>.
- removes breakpoint <n>.
- removes all breakpoints from the current job.
- sets an auto-proceeding breakpoint at <loc>. When an
auto-proceeding breakpoint is hit, it prints the usual
information, but does not stop the job unless the user types a
- sets breakpoint <n> at <loc> and causes it to be
- temporarily or permanently selects Constant typeout mode.
When a location is opened, its contents will be typed out as a
number in the current radix. See $S.
- temporarily or permanently selects decimal typeout of numbers.
- temporarily or permanently selects E&S display processor
instruction typeout mode. See $S.
- searches current program for locations with effective address
of <n>. Starts at addr in lh of ..LIMIT . Stops at addr in
RH of ..LIMIT . Typing a ^D will stop the search, leaving "."
set to the last location found.
- searches for such locations after <loc>, stopping at RH(..LIMIT).
- searches for such locations from <loc1> to <loc2>. When such
a location <locx> is found, "<locx> / <contents-of-locx>" is
typed, and "." is set to <locx> (pushing the "." ring buffer).
- temporarily or permanently selects floating point typeout
mode. The contents of locations opened will be printed as
floating point numbers.
- starts the program at the starting address (which is contained
in ..STARTA). The previous PC is put in ..XECP (a DDT
location) in case the program wishes to examine it.
- starts the program at <loc>.
- does <n>^^ starting from the job's starting address. However,
the 1st insn to be stepped through is printed and might be
stopped before if the stepping flags say so (^^ would not
print the 1st insn or stop before it). Note that $0G merely
sets the PC and prints the first instruction to be executed -
it executes nothing.
- sets the PC and types the instruction which the new PC points at
- starts the program at <loc>, and make <loc> the default
- is analogous to <loc>$<n>G
- temporarily or permanently selects half-word typeout mode.
The contents of locations opened will be typed as two
addresses separated by ",,", each address being the contents
of one half-word.
- turns off the current job's MAR.
- is the same as <loc>$3I
- sets the MAR at location <loc>. If <n> is 1, a trap will
occur on fetching an instruction from <loc>;
if <n> is 2, on writing in <loc>;
if <n> is 3, on any reference to <loc>.
DDT will print MAR; pc>>instruction showing the instruction
that tripped the MAR, before printing the next instruction to
be executed. (as always). They may or may not be the same,
since the MAR may or may not abort the instruction that trips
Note that the MAR may be made conditional by putting a nonzero
instruction in ..MARCON. When the MAR'ed location is
referenced, the conditional instruction will be executed in
the job's core, and DDT will stop the job if the instruction
skips. Otherwise, DDT will rearm the MAR and restart the job.
Subroutine calls are often useful conditional instructions.
An arbitrary string of commands may be executed whenever the
MAR is tripped by putting the string in the job's core and its
address in ..MARXCT. Both ..MARCON and ..MARXCT are cleared
by the $I command to prevent confusion. Each job has its own
MAR, and its own copy of all the related DDT variables.
- switches the current job in a "convenient" way. If there is a
job that wants attention from the user (is waiting to return
to DDT), it is selected and allowed to return. If no job
needs attention, $J chooses from the existing jobs in an
arbitrarily chosen cyclic order, so that successive $J's will
find all of DDT's jobs.
In any case, the name of the newly selected job is typed out,
followed by "$J".
If the job reached is another user's job that was being
examined and which went away in the meanwhile, DDT will purge
itself of the memory of the job, type :KILL and try to open
the next job in order.
- makes job <name> the new current job. If no such job exists,
one is created (In that case, "!" is typed out). If a
disowned job exists, it is reowned, and ":$Reowned$" is typed.
- pops the job-selection ring buffer <n> times. Whenever a job
is selected by any command other than $<n>J, it is also pushed
on the job selection ring buffer (which is internal to DDT),
so that $<n>J can be used to retrace the recent history of job
selection. $<n>J is most useful in valret strings which wish
to reselect the job which did the valret after temporarily
selecting other jobs, without having to make any assumption
about the jname of the valretting job. For example, one could
do DEBUG$J, hack around, and return with $1J. One could also
create a new job with :NEW TECO <commands>, and on exiting
from the teco do :KILL $2J to return. The "2" is because the
:NEW TECO pushes once, and the :KILL pushes again. $1J $1J
could not be used, since the first $1J would try to pop to the
no-longer-existing TECO, which is an error condition.
- types the current job's UNAME, JNAME, state, and job number.
$$J prints the info on the current job that $$V prints about
- set current job's name to <name>. This doesn't switch jobs;
it gives the same job a new name. The job's XJNAME is not
- is used for killing symbols:
- half kills symbol <sym> in the current job's symbol table.
When a symbol is half-killed, DDT will no longer use it for
type out, but it is still recognized when typed in.
- kills the entire symbol table of the current job.
- fully kills the symbol <sym>, which will no longer be accepted
- $L <file>
- loads <file> into the current job's core image. Returns the
job's core, kills the symbol table, and closes I/O channels
before loading. Temporary breakpoints set by $^N are flushed
but ordinary breakpoints set by $B are not. DDT remembers the
name of the last file loaded or dumped in each job, and uses
it to default any names not given explicitly in <file>.
The name specified becomes the new default for the next
command. $L, $$L, $Y, $$Y, :LOAD, :PDUMP, :PDUMPI, :SL,
:SYMLOD, :SYMADD and $^K all use this default. when a job is
created by <name>$J, the default is initialzed to
DSK:<msname>;<name> BIN. When a job is loaded into by
<prgm>^K, etc. the default is set to the name of the file
- <arg>$L <file>
- loads with an offset of <arg>. That is, anything that should
load into <loc> loads into <loc>+<arg>. Doesn't work for
- $0L <file>
- like $L but rather than loading a binary program simply reads
the contents of the file directly into core. "." is set to
the first location not read into, so that "^" will open the
last word read.
- <arg>$0L <file>
- reads into core starting at <arg>.
- $1L <file>
- like $L, but doesn't load symbols.
- <arg>$1L <file>
- loads starting at <arg>, without symbols.
- $$L <file>
- as $L but does not zero core, kill symbols, or close I/O
channels. Can't be done to a running job.
- $$0L <file>
- pertains to word-search comparison masks:
- sets mask number 0 used for $W and $N searches to <mask>.
Only those bits that are on in <mask> will be compared.
The mask is initially -1.
- sets mask number <n>. <n> must be from 0 to 7. Each search
may speecify any one of the 8 masks. Thus, after (17)$1M
17,$2M, $1W will compare the index field and $2W will compare
the AC field.
Initially, $1M is 777777; $2M, 777777,,; $3M, 17,;
$4M, (17); $5M, (777000); $6M and $7M are -1, like $0M=$M.
- is the pseudo-address of the word in DDT which holds
mask number <n> ($M is the same as $0M).
- searches for locations whose contents differ from <word> in
one of the bit positions which are selected by <mask>, where
<mask> is what is in $M (set by <mask>$M). Locations found
are opened in the current mode and pushed on the "." ring
buffer. The range searched starts at LH(..LIMIT), and stops
at RH(..LIMIT) (see the $E command).
- where <n> is between 0 and 7, uses mask number <n> (the
contents of $<n>M, set by <mask>$<n>M). If <n> is not between
0 and 7, <n> itself is used as the search mask.
- searches starting at <loc>.
- searches from <loc1> to <loc2>. <loc1> and <loc2> may be
addresses inside DDT, in which case DDT will search through
- does the same thing. In <loc2>,,<loc1>$,<loc3>$,<word>$n,
<loc3> overrides <loc2>.
- temporarily or permanently selects octal type-out of numbers.
- proceeds the current job, giving it the TTY. If it is
running, gives it the TTY. If it is waiting to return, allows
it to return. If its reason was that it needed the TTY or
that it wanted to valret, it is proceeded.
- unless the current job is stopped at a breakpoint, identical
to $P. Otherwise, sets the proceed count for the breakpoint
that stopped the job to <n>. ($P sets it to 1 in that case)
- like $P but if job was stopped at a breakpoint, sets that
breakpoint to auto-proceed.
- this has the value of the last quantity which either
- DDT deposited in a location or
- DDT found in a location that was opened or
- DDT was specifically told to type out
(by =, $=, ', ", ;, $;, $$;, _, etc.)
- identical to $Q.
- next-to-last value of $Q (and so on up to $7Q).
- is $Q with its halves swapped; <($Q)>.
- is $<n>Q with its halves swapped.
- Temporarily or permanently selects relative address typeout
mode, and deselects bit typeout mode. Addresses will be typed
as <symbol>+<offset> when possible. The symbol whose value is
closest to the address is used. The maximum <offset> allowed
is kept in ..SYMOFS; an address requiring a larger <offset>
is typed numerically. Symbols in current or containing blocks
and programs are preferred to symbols in other blocks or
programs if they have the same value.
The alternative is absolute mode ($A) in which addresses are
always typed out as numbers.
- $<n>R or $$<n>R
- temporarily or permanently selects output radix <n>.
Input radix is always 8 (or 10. for numbers ending in ".").
- temporarily or permanently selects symbolic typeout mode.
Locations that are opened will have their contents printed in
the way DDT thinks is most reasonable (usually as an
instruction or in halfword format.) When an address is typed,
it may be numeric or symbolic according to the $A vs $R
- temporarily or permanently selects typeout as bytes, using the
most recently specified byte size or pattern.
- $<n>T or $$<n>T
- (where <n> is between 1 and 36.) temporarily or permanently
selects typeout of words as several bytes of <n> bits each.
- $<pattern>T or $$<pattern>T
- (where <pattern> is negative) temporarily or permanently
selects typeout of words divided into bytes according to
<pattern>. The block of consecutive 1's at the front of
<pattern> determines the first byte; the block of 0's
following, the second; the next block of 1's occupies the
third, etc. Each word to be typed out is divided up in that
way and each byte is typed in the current radix.
- (point required if ..CONFRM is non-zero) reloads and
re-initializes DDT. All inferiors are destroyed. If there
are any running inferiors, DDT will type
"–Kill Running Inferiors–", and read a character
from the TTY. If it is a space, DDT will go ahead;
otherwise it will type "Flushed" and do nothing. If
you were logged in, you remain so, and if you have a
<hsname>;<xuname> LOGIN file, DDT will type –Init– and the
file will be :XFILE'd iff the next char you type is a space.
- Logs in as <user>. If <user> is logged in elsewhere, <user>0,
<user>1, etc. are tried until one succeeds. Then, a :INTEST
(which see) is done to initialize things. $U puts 0 in
..CLOBRF and in ..MORWARN, on the theory that anyone who uses
$U (as opposed to :LOGIN) must be a winner.
- is like <user>$U except that it doesn't do a :INTEST. This
is useful to avoid running your init file.
- Logs in without running any init file or read messages or
anything. Super-fast login.
- logs out (you need not be logged in). Console becomes free.
If a file <hsname>;<xuname> LOGOUT or <hsname>:* LOGOUT
exists, it will be :XFILE'd before logging out.
The file need not have in it a command to log out. If there
is no such file, DDT will do a :OUTTEST<cr> as a default
action, and then log out. (In other words, check for running
inferiors (see $U.), delete the files <hsname>;<xuname> OMAIL
.TEMP.;<runame> SENDS if they exist, and clear the screen).
- is similar to $$U, but always acts as if there were no <xuname>
LOGOUT file. It is always performs $$U's default actions. It
is useful when the <xuname> LOGOUT file runs into trouble when it
- logs directly out. Does not run the <xuname> LOGOUT file, and
does not do the default actions (:OUTTEST) either.
- manipulates the current job's "raid registers" (also
Each job has several "raid registers", each of which may be
used to display automatically the contents of one location.
Each time the job returns to DDT, its raid registers are
displayed at the top of the screen. Each raid register
remembers one typeout mode and always displays its location
that way (each location is also displayed as a constant in the
remembered output radix). See also :RAIDFL which turns off
all of a job's raid regs, and ..RAID, which starts a block of
3 words that are global parameters controlling raid registers.
See also :RATE and :ATB which set up special sorts of raid
registers for observing real-time rates of incrementation of
counters, etc., and :RAIDRP which redisplays the raid
registers continually with a fixed time interval.
- redisplays the raid registers without changing them.
Normally, only raid registers which have changed are updated on
the screen. But $V with no arguments forces them all to be
updated. This is useful if other typeout has overwritten
some of them.
- toggles the switch ..RAID, which controls whether the raid
registers are displayed automatically when the job returns.
..RAID is initially zero, enabling automatic display, except
on printing terminals. When it is zero, the raid registers
are displayed only by $V commands.
- stores the current typeout mode into raid register <n>, without
changing the address it is set on.
- free raid register number <n>.
- set any free raid register on <addr>. If there was already a
raid register set on <addr>, it is freed up first. The
current typeout mode is remembered in the raid register that
is set. <addr> may be indexed or indirect, in which case when
the raid register is displayed the effective address will be
calculated and the addressed location opened, displaying as
"<addr> -> <e.a.>/ <contents>".
<addr> may be a .USET variable such as .PIRQC, or a DDT
location such as ..UPI0.
- free the raid register set on <addr>. If there is more than
one, only the lowest-numbered is freed.
- sets raid register <n> on address <addr>. With this command
it is possible to have more than one raid register set on a
- lists jobs that DDT knows about, along with their states.
For each job, one line is typed as follows:
<uname> <jname> <state> <job number>
(where <uname> will be omitted if the job is DDT's inferior).
The current job will be identified by a "*".
<state> is as follows:
P => proceedable (after a random interrupt).
R => running.
W => waiting to return to DDT ("needs attention").
- => just loaded.
<n>B => broken on breakpoint <n>.
- searches for locations whose contents coincide with <word> in
those bits that are set in the mask. Since the number of the
mask is not specified, mask number 0 (the contents of $M,
which may be set by <mask>$M) is used. The locations found
are opened and typed inthe current mode.
- are analogous to similar uses of
- executes a specified instruction:
- executes instruction <ins> in the current job's core image.
Not allowed if the job is running. It types "<SKIP>" if the
instruction skips. If <ins> is a DDT-reference (eg.
SETZM ..TTYFLG or SETZM :DDTSYM TTYFLG) the insn is executed
in DDT. While the instruction is executing, the PC before the
$X is remembered in ..XECPC.
- $Y <file>
- dumps the current job's nonzero core locations as <file>.
Uses and updates the same default as $L (but if the default
directory was SYS:, DSK:SYS1;, DSK:SYS2; or SYS3; because the job
was loaded by a ^K or :<prgm>, they will be changed to
DSK:<msname>; before the filespec in the $Y is processed.
This will not be done if SYS:, SYS1;, SYS2; or SYS3; is explicitly
specified by the user). If you quit out of a dump, a file
_DUMP_ OUTPUT will be left. A previous file with the names
being dumped under will not be clobbered.
- <loc1>$,<loc2>$Y <file>
- dumps core from <loc1> to <loc2>
- $0Y <file>
- writes core out into a file directly, without formatting
($Y dumps as a binary program).
- <loc1>$,<loc2>$$Y <file>
- and other combinations of the above are analogous to $^Y.
- zeroes core of this job. If the job's ..SAFE is nonzero,
asks "–Zero Protected Job–" before zeroing.
- sets core from <loc1> to <loc2> to <word>.
- is like / but types out as a number, rather than in the
- <arg>[, $[, <arg>$[, $$[, and <arg>$$[
- are like the corresponding / commands, but type the word
opened as a number.
- opens the location addressed by $Q's RH except: does not set
"." or push the "." ring buffer. Thus, linefeed will open 1 +
the last location opened other than by \ .
- deposits <arg> in the open location, if any, then opens the
location addressed by the RH of <arg> in the same way \ opens
- $\ and <arg>$\
- are similar, but open the LH of $Q or <arg>.
- $$\ and <arg>$$\
- do a PDP-10 address calculation on $Q or <arg>.
- is like / but types out in symbolic mode rather than the
- <arg>], $], <arg>$], $$], <arg>$$]
- are all analogous to the corresponding forms of /.
- types the value of and opens .-1, on a new line.
Sort of the opposite of linefeed.
- stores <arg> in the open location, then does ^.
- pops the "." ring buffer, then does ^.
- stores <arg>, then does $^.
- pops the ring buffer of "." <n> times, then does "^".
- stores <arg>, then does $<n>^.
- retypes $Q in symbolic mode.
- retypes <arg> in symbolic mode.
- left-shifts. Like _ in MIDAS. Priority 3.
- floating scales.
The DDT operators ":", "$:", and "$$:", when not preceded by
symbols, are prefixes that begin mnemonically named
"colon-commands". After the colon comes the command name,
followed by the arguments, if any. The command may be built
into DDT, or it may run a system program. In fact, if DDT
does not recognize the command name as a built in command,
it runs the system program with that name.
Note that many programs usually run in this way are popularly
thought of as "DDT commands". However, only the actual built-in
DDT commands are specifically described in this file (on the
next page). The general workings of colon commands that run
programs are described on this page, but for the format of
their arguments the documentation of the individual programs
must be consulted.
There are the following special hacks:
Anything else runs either a built-in command or a program.
- an altmode after a colon starts a comment. Everything from
the altmode to the next altmode, inclusive, is ignored.
For example, :$ FOO $PRINT BAR<cr> is the same as :PRINT BAR<cr>.
- :<cr> does nothing but close the open location
(There may be a comment between the : and the <cr>).
Colon commands to run programs:
where <prgm> is not the name of any
built-in colon command, tries to run the program named <prgm>.
It looks for TS <prgm> on DSK:<hsname>;, on SYS;,
then on SYS1;, then on SYS2;, then on SYS3;
and then on all the user directories in the sname search list
if it is enabled (see :NFDIR), and then on the connected dir.
If the file is found, it is loaded without symbols into the job
named <prgm> (which will be created if necessary)
and started at its normal starting address.
The job's command buffer will be cleared.
If the job already existed (was not created fresh by :<prgm>),
:<prgm> can behave either like :NEW <prgm> or like
:RETRY <prgm>, depending on ..GENJFL's contents.
If ..GENJFL is zero, :RETRY <prgm> is done:
the pre-existing job is used for running <prgm>,
thus overwriting any data that was in that job already.
However, before doing this, if ..CLOBRF is nonzero,
DDT will ask for confirmation
by saying "–Clobber Existing Job–". A space means "yes".
If ..GENJFL is nonzero, as it is by default, :NEW <prgm>
is done; the old job is left alone and another job is created
for the purpose of running <prgm>.
See :NEW and :RETRY, below.
In any case, the .XJNAME of the job will be <prgm>.
Programs that want to be runnable under many names and
do different things according to which name was used
should check their .XJNAME.
- :<prgm> <text>
is similar, but provides <text>
as an argument to <prgm>. As above, <prgm> must not be
the name of a built-in command. Also, <text> must end with
a <cr> or "^C" or "^_". <text> is put in DDT's command
buffer for the job <prgm> (instead of zeroing the buffer,
as :<prgm><cr> does).
Programs should read the command buffer with .BREAK 12,[..RJCL,,<loc>]
and interpret the contents in a useful way (eg, as commands).
For example, :MIDAS FOO<cr> will run MIDAS
and tell it to assemble FOO >, giving FOO BIN .
runs <dev>:<msname>;TS <prgm>
in a job named <prgm>, zeroing the command buffer.
It does not matter if <prgm> is the name of a built-in
command when a device is explicitly specified.
The job's $L default filename is set to
- :<dev>:<prgm> <text>
is similar but puts <text>
in the job's command buffer. <text> is terminated by
a carriage-return or "^C" or "^_".
is like 3) but uses file
DSK: <user>; TS <prgm>.
|:<user>;<prgm> <text> ||figure it out.
|:<dev>:<user>;<prgm> <text> ||"
- $: and $$: may be used instead of just : in all the
patterns described above. They suppress built-in
commands, and always try to run a program. In addition,
$: causes the program to be loaded with symbols.
$$: suppresses even the commands :NEW and :RETRY, but
$: causes them to load the programs specified to them
- :NEW <prgm><cr>
is similar to :<prgm><cr>, except in what happens when
a job named <prgm> already existed.
In that case, instead of destroying its old contents, a new
job with an incremented (with :GENJOB) name will be created.
Thus, :NEW T<cr> when a job named T existed will create job T0;
another :NEW T<cr> will create job T1.
In any case, the .XJNAME of the job will be <prgm>.
Programs that want to be runnable under many names and
do different things according to which name was used
should check their .XJNAME.
:NEW suppresses built-in commands, so that, for example,
:NEW START<cr> would load a new copy of a program names START
whereas :START by itself is a built-in command.
:NEW may be combined with the other options, as in
$:NEW MC:SYS;MACSYM command-string<cr>
- :RETRY <prgm><cr>
is similar to :<prgm><cr>, except that if a job named <prgm>
already exists a clean copy of ts <prgm> will be loaded into
it, clobbering any data from the previous invocation of <prgm>.
Even if ..CLOBRF is nonzero, DDT will not ask for confirmation,
since the :RETRY is taken to mean that clobbering is desired.
:RETRY suppresses built-in commands like :NEW (see above).
:RETRY may be combined with the other options, as in
$:RETRY MC:SYS;MACSYM command-string<cr>
Built-in colon commands:
(NEVER invoked by altmode-colon or altmode-altmode-colon)
- :6TYPE <expression>
- will type the expression as sixbit, with no quoting or
delimiters. If no <expression> is given, it uses $Q for its arg.
- :8TYPE <value>
- This is a quick-and-dirty crock to aid CHAOSNET hackers and CRTSTY
hackers. If used in the :8TYPE<cr> form, it uses the value of $Q,
otherwise it uses the given value, and prints it if it were a word
of 8 bit characters. If the 200 bit is on, the character is proceeded
by a ~. The characters are separated by spaces.
At some point in the future this should be re-done as a typeout mode
that you can put on & or % or such. Also, there should be a way to
type this stuff in. Suggestions for exactly what it should do are
welcome, in the meantime, I offer this crock as a way of getting it
into this version.
- prints the file .INFO.;DDT :CMNDS, which is a condensation
of the info on this page of DDT orders.
- :ALARM <hr>:<min>:<sec>
- (where <hr>, <min> and <sec> are decimal numbers and a <cr>
instead of a colon causes all the following fields to be
taken as 0) sets an alarm at the time specified. DDT will
type bells and a message every 20 seconds from that time on
until the alarm is cleared.
- :ALARM .+<hr>:<min>:<sec>
- sets an alarm when the specified time interval has elapsed.
- clears any alarm setting.
- is a conditional which succeeds if the previous conditional
succeeded. It should be followed by conditionalized commands,
surrounded by a $( - $) pair, just like :IF.
- assigns the microtape which is the current ^F default device.
If that device isn't a microtape, it is an error.
microtapes must be assigned to be used.
- :ASSIGN <tape>
- assigns that microtape. <tape> may be a number or a device name.
That microtape becomes the default device, as with <tape>^F.
- :ATB <addr>
- sets a raid register to display the average
time between increments of the contents of <addr>.
Each time the raid register is displayed it will
show the average over the time since the previous
display. See also :RATE, which will show
the average rate of change. :RAIDRP is likely
to be useful with this command.
- makes the current job replace DDT in the job tree.
DDT and its other inferiors cease to exist,
and the inferior attached takes on DDT's JNAME.
- :CHUNAME <newuname>
- changes your UNAME to <newuname>. Kills all jobs
(typing "$$^X." if there are any jobs to be killed).
Then, resets all user-options by reloading DDT
Then, does a :INTEST, to attach <newuname> HACTRO
or run <newuname>'s init file or whatever.
- clears the screen on graphics TTYs. Useful in files and valrets
since ^L is ignored in them. Although when the TTY is in scroll
mode DDT usually forbears to clear the screen, :CLEAR forces
the clear to be done even in scroll mode.
- restarts the current job where it last stopped, giving
it the TTY. Equivalent to $P.
- :COPY <file1>,<file2>
- :COPYD <file1>,<file2>
- copies <file1> as <file2>,
I/O is done in ASCII block mode. For DSK, AI, ML, MC, DM
and archive devices, that is the same as image block mode,
so :COPY will work for any files on those devices.)
The creation date of <file2> is set to that of <file1>, as
well as the file author. In addition, the real file names of <file1>
are used as the defaults for <file2>, so that :COPYD AI:FOO >,ML:
will preserve the FN2. If a <cr> is used instead of a
comma, the new defaults will be typed out before <file2>
is read. After the :COPYD, the defaults are set to <file1>.
- :COPYN <file1>,<file2>
- is like :COPYD except that the new file's creation date
is set to right now, and the defaults for <file2> are the
names specified for <file1>, not the real names of <file1>.
If <file1> was FOO >, then :COPYD would preserve the
version number of FOO, while :COPYN would increment the
version number present on the target directory.
- :CORBLK <subcommand> <address>
- creates, deletes, purifies or unpurifies the current
inferior's page containing the address <address>, according
to the <subcommand>, which may be FRESH, NONE, PURE or IMPURE.
- :CORTYP <loc>
- prints information on the type of page that <loc> is on in
the current job.
- maps :CORTYP over the existing pages of the current job.
- :CWD <directory>
- sets the working directory name (MSNAME) to <dir>.
Equivalent to <dir>$$^S.
- :DATPRT <expression>
- :DATPRT was released earlier using $Q for it's argument.
if no <expression> is given, it will still use $Q for it's argument.
- retypes $Q as a date. I.e. it assumes that Q is an ITS
disk-format date word, and types it in human-readable format.
- :DATWRD <date>
- has as a value the ITS disk-format date word corresponding
to date, in the same format taken by :SMDATE, :SFDATE, and
100/ :DATWRD 10/15/78 16:40:25<cr><cr>
will deposit the date word for October 15, 1978, 4:40:25 pm
in location 100.
- leaves monit mode. See :MONMODE
- :DDTSYM <sym>
- evaluates one of DDT's own symbols (NOT one of the current
job's symbols. That needs no special command).
The value is returned as a pointer into DDT.
The character terminating <sym> is re-read.
Thus, :DDTSYM TTYOPT/ will open location TTYOPT in DDT.
- :DELETE <file>
- deletes <file> . Uses and updates the same default name
as :PRINT, etc. See "filename reading" and "filename defaulting".
- deassigns the microtape which is the current ^F default device.
If that device isn't a microtape, error.
- :DESIGN <tape>
- deassigns that microtape. Sets defaults like <tape>^F.
- detaches the entire tree from the console, which becomes free.
The tree becomes disowned. It can be reconnected to a
terminal with the REATTACH program, or it can be reowned
with $J. If the same user logs in again, DDT will
automatically offer to attach the detached tree.
If the JNAME of the top-level job being detached is HACTRN,
it will be incremented at least once, and again until it
is unique; thus, it will become HACTRO or HACTRP, etc.
:DETACH is illegal if not logged in.
- turns the current inferior job into a disowned job. It can
be reowned later by you or anyone else using the $J or :UJOB
commands. Until then, it can continue to run (if it was
running when it was disowned) but cannot use the terminal
since it does not have one. See the $$^K command.
- is a conditional which succeeds if the previous conditional
failed. It should be followed by conditionalized commands,
surrounded by a $( - $) pair, just like :IF.
- prints out the error message associated with the last
IOC error or open or symbolic system call failure
in the current job.
- :ERR <chnl>
- where <chnl> is a channel number, prints out the error
message associated with the last error on that channel.
- :ERR <code>
- prints out the error message associated with the status
word <code>, where <code> might be obtained, for example,
by opening .IOS+<chnl>.
- :EXISTS <file>
- returns 0 iff <file> can be opened, else the I/O status word
containing the open failure code.
Uses the same defaults as :PRINT, etc.
Useful with conditionals (:IF).
- :FJOB FOO
- is like :JOB FOO, but will never reown the job. The job is
marked as permenently foreign, and subsequent $J's to it will not
reown. To reown it, do :FORGET and :JOB FOO
- :FJOB FOO BAR
- is like a combination of :UJOB FOO BAR and :FJOB
- flaps a microtape if it's the ^F default device.
- :FLAP <tape>
- flaps that tape; sets defaults like ^F. <tape>
may be either the microtape number or its device name.
- tells DDT to forget about the current job. If it is a foreign
job, this is equivalent to :KILL (this is stated backwards).
For an inferior job, the job remains DDT's inferior, but
DDT no longer knows it is there. If it had been $$^P'd,
it can still type out. The job can't be killed while
forgotten, unless you log out. To make DDT know about the
job once again, simply select it explicitly with $J.
- :GAG <n>
- if <n> is 0, tells DDT to stop accepting :SEND's.
Anyone who tries to :SEND to you will mail instead.
If <n> is not 0, DDT will resume accepting messages.
- rename the current job to a gensymmed name. Programs may
wish to valret a :GENJOB when they start up, to make sure
that running the program a second time doesn't interfere
with the first invocation. :GENJOB does not print the new name.
The new name is computed from the
current name as follows: the first space in the name, or
the last character if there is no space, is the incrementing
position. First, put a zero in that position; if that name
is in use put a 1 in that position, etc. Loop incrementing
that character until a name is obtained that is not in use.
That name is the new name of the job.
The .XJNAME variable is NOT changed.
- starts the current job at its starting address. Same as $G
- :GO <addr>
- starts the job at the spcified address, like <addr>$G
- starts the job at its starting addr without giving it the TTY.
like $0G ^P. Equivalent to an "instantaneous" sequence of
$G, ^Z, ^P (whence the name of the command).
- :GZP <addr>
- similar but starts at <addr>.
- prints out some very basic information on how to stay alive on
ITS (tells what ^S does, lists a few :-commands, where to get
more help, etc)
- :ICHAN <chan>
- <chan> is taken to be a channel number (it may be an expression)
Status info for that channel in the inferior is printed.
- :IF <condit> <arg>
- $( <conditionalized stuff> $)
- (where <condit> is one of "E", "N", "G", "L", "GE", "LE",
and "MORE"; and <conditionalized stuff> is balanced in parens)
skips up to the $) if the condition is false.
^B, ^E, ^V, ^W are ignored in what is skipped.
All the conditions except "MORE" compare the arg to 0.
"MORE" enters a –More– state waiting for a char to be
typed in, and succeeds if the –More– isn't flushed.
(–More– is not typed by this command. If such a message
is desired it should be typed before the :IF).
The "MORE" conditional needs an arg but ignores it.
To conditionalize something not balanced in parens,
such as $1#(, use extra $('s and $)'s to make the parens match
(since $( and $) are conveniently ignored by everything except
Actually, a false conditional skips until the close-paren
that matches the first open-paren. The parens need not be
part of $( and $); doing that is only to make sure they're
ignored if condition is true,which is usually right.
- flushes any pushed execute files and valret strings.
- useful when a valret or execute file was pushed;
pops back into it.
- :INPOP <line>
- (where <line> ends with a <cr>) causes <line> to be
executed as DDT commands, then pops back to a pushed
execute file or valret. eg., :INPOP $P <cr>
will proceed the current job and pop into a valret
- useful in a valret or execute file;
pushes that input source and allows input
from the TTY, until a :INPOP command is given,
after which input from the valret or file will resume.
An :INPUSH command is executed automatically
on any error in DDT, and whenever an inferior
returns to DDT in any way that .RESET's TTY input
(The only things which don't are:
.BREAK 16,'s which specifically say not to,
return from a ^N, return from $X,
and a .VALUE with nonzero arg, which will cause the
file or valret in progress to be pushed while the
new valret string is executed)
When that happens, DDT will type ":INPUSH ".
At those times, DDT will also turn on the typeout flag
and type "^V " if it had been off.
- performs the same actions that a $U command which succeeds
in logging in takes, except that it doesn't log in.
Those actions are:
A special hack causes a :INTEST given in an execute file
or valret string to pretend that there is no init file;
it will always try to print mail and messages. It is
a useful thing to put in an init file to print mail
and messages in the default manner, in addition to the
ideosyncratic things the init file is needed for.
- If your home directory is not the same as your <xuname>,
DDT will inform you by saying "[Home dir=<hsname>]"
- If a job <runame> HACTRO exists, and if running,
DDT types "–Attach Your Detached Tree–" and does so
if the reply is a space.
- Otherwise, DDT looks for an initialization file (in
<hsname>;<xuname> LOGIN, or in <hsname>;* LOGIN if
that is not found.) If DDT succeeds in finding one of
those files, it considers :XFILE'ing it: if <xuname>
equals <runame>, DDT just types "INIT" and :XFILE's it
unconditionally, but otherwise it asks "–Init–" and
:XFILE's the init file only if the user types a space.
However, if the init file which would be run is one of
GUEST1;* LOGIN or USERS1;* LOGIN, it is run without
asking, so that naive users can always get the "safe"
- Otherwise, if a file <hsname>;<xuname> MAIL exists, DDT
types "–Mail–" and reads a character from the TTY.
If the character is space, DDT prints the file and
renames it to <xuname> OMAIL.
- Also if there is no init file: if the user has a date entry
in the :MSGS database (i.e. if he has ever done a :MSGS),
or if he has a directory, a :MSGS command will be executed
a :MSGS command will be executed to print any new system
messages. If there are any new messages, "–Msgs–" will
be typed before each one, and if the user's response is
other than space or rubout, DDT will leave the messages
- If the automatic :MSGS is not done (user has no dir and
no database entry), the user will be informed of the
existance of the :MSGS command in case he is a new user.
- analyses the value of $Q as a word of
interrupt bits, printing out the names of the bits that
are set, using the same names used when a job returns
to DDT. If the sign is set, the word is interpreted as
2nd word interrupts; otherwise, as 1st word interrupts.
- :IOPEN <chan>$,<control bits>$,<filename>
- This opens <filename> with mode <control bits> on channel <chan>
in the current job. The resulting TRUENAME is then printed.
- clears the current job's command buffer.
(the one that .BREAK 12, can read)
Turns off the job's .OPTION variable's bit 4.6 (OPTCMD).
- :JCL <line>
- (where <line> ends with a <cr> or "^C" or "^_").
puts <line> in the command buffer, including the
terminating <cr> or "^C" or "^_".
Sets the .OPTION variable's bit 4.6 (OPTCMD bit)
- prints the JCL of a job
- :JOB <name>
- like <name>$J except that there may be non-squoze
characters in <name>.
- :JOBP <name>
- is like :JOB <name> except that it sets $Q to 0 if it
succeeds, else nonzero.
- :JUMP <tag>
- jumps to a :TAG <tag> in an execute file or valret string.
A conditionalized :JUMP to a :TAG which precedes it makes
a loop. :JUMP is not allowed to be typed from the terminal
unless you are inside a :INPUSH from a valret string or
execute file. In that case, :JUMP pops out to the file or
valret and jumps to the tag in it. Aside from this case,
nonlocal :JUMP's are not allowed.
- kills the current job, like $^X.
If the job is "protected" (its ..SAFE variable has
been set nonzero), DDT will ask for confirmation before
- prints the name of the last file loaded into the current
job (.BREAK 12, can also read this info).
- :LINK <file1>,<file2>
- makes a link named <file1> pointing to <file2>.
If a file named <file1> exists, :LINK will type an error
message rather than delete the file.
:LINK uses the same defaults that :PRINT, :DELETE, etc. use.
(see defaulting of filenames) the defaults for <file2>
will be <file1>. After the :LINK, the defaults will
revert to <file1>. Actually, the names in <file2> are
subject to "translation" (see $^T) as if they were
being opened, and the translated names are used.
If <file2> is on a non-disk device, such as another machine,
an error message occurs, unless <file1> is on the same device.
Thus, it is possible to make links on job devices provided
the job device handles the call correctly. The AI:, DM:, MC:,
and ML: devices do win.
** This command is disabled with warning if ..DELWARN is set to 3
- :LINKF <file1>,<file2>
- Just like :LINK, except if ..DELWARN is set to 3, it gives
warning message rather than being disabled.
- :LINKN <file1>,<file2>
- is like :LINK, except no check is made that <file1> does
not already exist. Thus, :LINKN may be used to replace
an existing file or link.
** This command is disabled with warning if ..DELWARN is set to 3
- lists all breakpoints set in the current job as follows
<n> <addr-to-open>,,<addr-of-bpt> <condit. insn> <count>
- :LISTF <dir-spec> <cr>
- lists the specified directory. A dir-spec may contain
a device name followed by ":" and/or an sname optionally
followed by ";". It is terminated by "," or <cr>.
Altmode may be used as in file-specs.
The specified directory becomes the default one for
:PRINT, :DELETE, etc.
- lists all the jobs that DDT knows about, along with their
states. For each job, one line as typed as follows:
<uname> <jname> <state> <job #>
(<uname> will be omitted if the job is DDT's inferior).
The current selected job will have a "*" before it. <state>
is one of:
P = Proceedable (after a random interrupt)
R = Running
W = Waiting to return to DDT ("needs attention")
- = just loaded.
<n>B = Broken on breakpoint <n>
- prints the block-structure of the current job's symbol table.
Each program is indented one space;
each block, 2 or more according to its level.
The entry for the global block comes first.
Every block or program precedes its subblocks.
- lists the names of all the symbols in the current job's
symbol table. Block and program names are flush against
the left margin. All others are in rows that start with
- lists all undefined symbol references
(created by <sym>? ) in the current job.
- allows you to give the current job arbitrary length JCL, ended with
a control-C, so carriage returns can be included in the JCL. This is
useful for mail from init files, for example. It provides the same
editing that :SEND does. See also :LRUN
- :LOAD <file>
- loads <file> into the current job's core image. Returns the job's
core, kills the symbol table, and closes I/O channels before loading.
See the $L command for more info.
- :LOGIN <name>
- identical to <name>$U except that non-squoze chars may
appear in <name> , and does not clear ..CLOBRF and ..MORWRN
(ie, a user of :LOGIN is assumed to be naive).
- logs you out (you needn't be logged in) – Console becomes free.
If a file <hsname>;<xuname> LOGOUT or <hsname>;* LOGOUT exists,
it will be :XFILE'd before logging out. The file need not have
in it a command to logout. If there is no such file, DDT will
do a :OUTTEST as a default action, and then log out. (In other
words, check for running inferiors (see $U), delete the files
<hsname>;<xuname> OMAIL and .TEMP.;<runame> SENDS if they exist,
and clear the screen).
- :LRUN <program> <optional line(s) of JCL>^C
- is not new, but should now work properly, so is being anounced. It
is like a cross between :LJCL and :RUN. The editing features of
:SEND are also present.
- :MAILNT <-2, -1, 0, 1, or 2> -- Mail notify
- This command is only useful if you have already told COMSAT
not to bother telling you of mail arivals (or if you gag yourself,
but that's not really useful). To turn off COMSAT's notifications,
make a NAMES entry of the form:
(CSTACY (R-OPTION NO-CLI))
The advantage of :MAILNT is that you can turn off mail notification,
but not higher priority :SENDS while in EMACS (see ..SENDRP/-2 and
..URANDM/ %URMAL), and then get the notification of arrival of
mail when you return to DDT, while getting your SENDS immediatly.
Also, DDT will do a better job (I think) of telling you who sent the
mail than COMSAT will with (R-OPTION SMALL-CLI).
Mail notification can be inhibited while in a specific
inferior by doing ..URANDM/ $Q^_100
from DDT or a valret string or by setting the URANDM word
with a .BREAK 12,
- :MAILNT 0
- – The default, do not notify.
- :MAILNT -1
- – Beep on arrival of mail, but print nothing.
- :MAILNT 1
- – Print who the message is from and how long it is. Assumes
the message will be the first one in the file.
- :MAILNT 2 or -2
- are like 1 and -1 except mail is deferred while in any
- kills all jobs, like 8 :KILL's.
- enters monit mode, in which DDT generates a colon whenever
it wants input at top level, except in valret strings
and execute files. This causes input to be taken as
colon-commands. Note that if you rub out one of those
colons DDT will not replace it - you will thus leave
monit mode temporarily, but any error will make DDT
start generating colons again (for example, rubout when
there's nothing to rub).
- useful in execute files and valrets. First, it turns on
typeout by zeroing ..TTYFLG. Then, it reads (and echoes
on the TTY) a line from the file, then reads a
character from the TTY. If it is a space, continues with
the file; otherwise does a :INPOP<cr> . One might want
to put this before a command which clears the screen.
A similar, more general feature is ":IF MORE".
- :MOVE <old file>,<new file
- Copies a file from <old file> to <new file> and deletes
the old copy. It does a delete-while-open, so there is
no danger of it deleting the new file if it displaces the
old, as in :MOVE FOO;BAR BAZ,SECOND:
- prints system messages. It uses a file SYS:^Q:MSGS TIMES
to store a database of login names and the date of the
most recent message they have seen, and prints only such
messages as have appeared since that time. The messages
are printed in chronological order. Before each message,
DDT will type "–Msgs–", and read a character from the
TTY. Space or rubout will tell DDT to clear the screen
and begin the message; anything else tells DDT to stop,
and the remaining messages will not be seen until the next
DDT begins to print a message by printing its filenames,
followed by the first line of text. After the first line
of the message, if there is more, "–More–" will be typed,
and a character read. Space will type the rest of the
message, rubout will flush the rest and continue with the
next message, if there are more. Anything else will be
as after "–Msgs–".
"^S" typed in while DDT is printing a message will throw
away the rest of that message only.
^G'ing out of a :MSGS is safe and will cause all the
messages to be seen again.
This command is automatically executed by :INTEST and on
login unless you have an init file or don't have an entry
in the date database.
NOTE that :MSGS<cr> will see only messages intended for
the machine that you are on, even though .MSGS.; will
contain all machines' messages. This is because :MSGS<cr>
turns itself into :MSGS *AI<cr> when done on AI;, :MSGS *ML
on ML, etc.
- :MSGS <kwd1>,<kwd2>,<kwd3>,...
- is like :MSGS<cr>, but prints only messages which have
at least one of the specified keywords in the "distrib"
field. Messages with no distrib field are for everyone,
so :MSGS with keywords will see all of them, too.
The keywords so far defined are *AI, *ML, *DM, and *MC.
A message's distrib field shows which machines it is
"intended" for; messages mailed to *ITS will have all
four keywords. Thus, :MSGS<cr> will see only the messages
intended for the machine it is done on, but :MSGS *AI,*ML
will see all messages intended for AI or ML, and can be
run on any machine (even MC!).
Someday additional keyword conventions may be implemented.
- :MSGS *
- shows all messages, no matter which machine they are for.
- :NEW <prgm>
- is similar to :<prgm> except in what happens when a job named
<prgm> already exists. In that case, instead of destroying
its old contents, a new job with an incremented (with :GENJOB)
name will be created. Thus, :NEW T when a job named T already
exists will create job T0; another :NEW T will make job T1, etc.
- informs DDT that its TTY may have changed its characteristics.
DDT will reinitialize all its info on what type of TTY
it is using. If the %TOROL bit is on (scroll mode is the
default), DDT will enter scroll mode. When in scroll mode,
DDT never clears the screen unless it is given an explicit
- :NFDIR <name1>,<name2>,<name3>,...
- (any number of names)
enables the sname search list feature if not enabled,
and puts the specified names, in reverse order, at
the front of the list, which is searched front to back.
A name appears only once in the list, which holds 8 names.
When the feature is enabled, ^K, etc., and $L on device
DSK with no directory specified look on all the directories
in the list if the file isn't found on the default directory.
If it is found on a directory in the list, the sname of
that directory will be typed out, followed by a semicolon.
(This can be silenced by zeroing the NFVRBS variable in DDT.)
A separate list of the 8 most recently used snames is also
- :NOMSG <n>
- if <n> is 0, turns off all unsolicited typeouts by DDT,
including alarms, sends, ITS revived messages, and
even system going down messages unless the system is going
down in less than 15 minutes.
The effect of :GAG 0 is implicit (and the :GAG setting is
ignored when :NOMSG 0 is in effect).
<n>=1 leaves this mode, and prints out the pending typeouts
(a list of waiting jobs, etc.) that couldn't be printed
Note that if a job sets bit 20 in its ..URANDM word, then
:NOMSG 0 is temporarily in effect whenever that job has
- :OFDIR <name1>,<name2>,<name3>,...
- (any number of names)
removes those names from the search list.
- disables the sname search feature and clears the list.
- :OLOAD <file>
- loads certain files whose symbol tables are incorrectly
formatted, because they were made by old versions of STINK
and had data loaded above 400000. Files produced by
recent versions of STINK and MIDAS never have this problem.
- :OMAIL <user> <message>^C
- ** This command is semi-obsolete – use the "MAIL" program **
adds <message> to the front of <user>'s mail file;
he will see it when he logs in (unless he has an init file
which doesn't print his mail) or when he does :PRMAIL<cr>.
When typing in the message, rubout deletes and echoes one
character; ^G and ^D cancel the message; ^L causes the
characters typed in so far to be printed (after clearing
the screen); ^C and ^_ end the message and cause it to be sent.
(^_ is useful in xfiles since ^C terminates them).
in the mail file, each note looks like:
<sender>@@<machine> <date> <time> <message>
- :OMAILA <user> <message>^C
- ** This command is semi-obsolete **
adds to the note this user most recently mailed to <user>;
that is, the message etc. is added not at the front
of the mail file but just before the ^_ terminating the
previous note. If there is no note from this user
in <user>'s mail file, the new note is added at the end.
- :OMSG <topic> <message>^C
- is the old way of mailing a message to all users.
:MAIL *ITS, which runs the mail program, should be used instead.
:OMSG writes a file .MSGS.;<topic> > containing your runame,
the date and time, and <message>. :MSGS will print the
file, so every user ought to see the message once.
^_ may be used instead of ^C. Please do not use this.
- Always runs DDT's :SEND command even if it has been disabled
- performs the actions normally associated with logging
out. It does not execute the <xuname> LOGOUT file.
:OUTTES always does what $$U and :LOGOUT do if there is
no LOGOUT file (except that :OUTTES does not actually log
out). Specifically, it checks for running inferiors,
querying "–Kill Running Inferiors–" if there are any
(and causing an error if the query is flushed), deletes
the files <hsname>;<xuname> OMAIL and .TEMP.;<runame>
SENDS, and clears the screen. Due to an extremely hairy
bug in the logout code, if the file <xuname> LOGOUT
exists AND BYERUN is set, :OUTTEST will not behave as
advertised, but instead will execute the LOGOUT file and
log out. In other words it will act the same as $$U. If
you have a LOGOUT file and you want a bye message, just
put :BYE in your logout file.
- :PDUMP <file>
- like $Y but does a "pure-dump" - all jobs which have that
file loaded will share the pure pages in it.
If you quit out of a pdump, a file _DUMP_ OUTPUT will be
left. A previous file with the names being dumped under
will not be clobbered.
- :PDUMPI <file>,<ifile>
- like :PDUMP, but writes an indirect symbol table pointer, pointing to
<ifile> instead of a regular symbol table. This is useful for dumping
programs which map in other files, such as dumped LISP's.
- prints the date of the last message seen. Only messages new than
that will be printed
- prints the name of the currently selected block of symbols.
If it is the global block, that's all.
If it is a program, types ", program".
Otherwise, prints ", level " and the block's level.
- :PRINT <file>
- types the file's contents. Uses the same default as :DELETE.
- prints your mail file (<hsname>;<xuname> MAIL and renames
it as OMAIL . On display terminals, "No mail" is typed
if no mail file exists. Depositing 0 in :DDTSYM OMAILF
causes :PRMAIL<cr> not to rename the mail file, but only
print it. Depositing a positive number causes it to ask
if you'd like to delete it.
- :PRMAIL <user>
- prints <user>'s mail file if it exists; else types
"No mail". It is not renamed to OMAIL.
- :PRMAIL <user>@<site>
- where <site> is one of AI, ML, MC, or DM, forces DDT to
look for the mail on that site. Useful for those few
people who direct their mail to more than one ITS.
- restarts the current job where it last stopped, but DDT
keeps the TTY. The job runs, but can't do any I/O on the
TTY, and DDT continues to execute the user's commands.
Equivalent to ^P.
- same as :PROCED - restarts the current job without giving
it the TTY.
- prints your SENDS file, which contains al the :SEND messages
you have received in this session. It is .TEMP.;<uname> SENDS
or COMMON;<uname> SENDS if the directory .TEMP.; doesn't
- :PRSEND <user>
- print's <user>'s SENDS file.
- :PRSEND <user>@<site>
- where <site> is AI, ML, MC, or DM, prints <user>'s SENDS
file from that site.
- turns off all of the raid registers of the current job.
The storage for them is deallocated, so their settings
are all forgotten.
- :RAIDRP <# secs>
- puts DDT in a loop redisplaying the raid registers
of the current job every <n> seconds. Typing any
character will cause DDT to exit the loop and
process the character.
- :RATE <addr>
- sets a raid register to display the
rate of change of the contents of <addr>.
Each time the raid register is displayed it will
show the average rate of change of the contents
since the previous display. See also :ATB which
shows the inverse rate.
- :REAP <file>
- sets <file>'s reference date to long ago, so that if automatic
grim reaping is done <file> will be reaped.
- :RENAME <file1>,<file2>
- renames <file1> to the name <file2>. Uses the same defaults
as :PRINT, :DELETE, etc. <file2> defaults to <file1>.
- :RETRY <prgm>
- is similar to :<prgm> except that if a job named <prgm> already
exists, a clean copy of TS <prgm> will be loaded into it,
clobbering any data from the previous invocation of <prgm>.
Even if ..CLOBRF is nonzero, DDT will not ask for confirmation,
since :RETRY is taken to mean that clobbering is desired.
- :RUN <program> <optional one line of JCL><return>
- (See also :LRUN)
<program> can be either a program or a DDT command.
If it's a DDT command, it will be performed with one level of ^V
- is equivalent to HACTRN$J except works if the JNAME isn't HACTRN
This is the right way to select the running DDT in an XFILE.
- :SEND <user> <message>^C
- If <user> is logged in and has not done :GAG 0, prints
"[MESSAGE FROM <your uname> at MIT-xx HH:MMxm]", followed
by <message>, on his TTY, and puts it at the head of the
file .TEMP.;<user> SENDS .
Otherwise, types "(Mail) " as soon as you have typed the
space after <user>, and then runs the MAIL program to
send mail to <user>. (See .INFO.;QMAIL ORDER for info on
the MAIL program.)
If the :SEND was able to determine the XUNAME of the user
you specified, the MAIL is addressed to that XUNAME.
Otherwise, it is addressed to the name you specified.
- :SEND <user>@<site> <message>^C
- where <site> is one of "AI", "ML", "MC", or "DM", will send
to the user on that site.
While in :SEND, several control characters have special
editing meanings: ^W means word kill, ^U = line kill,
and ^Y means to unkill. ^Z exits, saving in the kill
ring (so that a subsequent ^Y will yank back the saved
text). ^R retypes the current line, ^K retypes entire
message, ^L clears and retypes entire message. ^_H or
[HELP] will give help.
If the flag ..SNDFLG is non-zero, this command is disabled,
and the program SEND is run instead (SYS2;TS SEND is a link to
QSEND). It may still be accessed as :OSEND in this case.
- :SFAUTHOR <file>,<name>
- sets <file>'s author's name to <name>, which should be the
name of some directory in the system.
- :SFDATE <file>,<date>
- sets <file>'s creation date to <date>. <date> should have the
same format as dates in dsk directories as typed by ^F;
trailing numbers default to 0 if omitted, except for
the year, which defaults to the current year. If the date
is null, the current date and time are used.
:SFDATE uses the same defaults for <file> as :DELETE.
- :SFDUMP <file>,<0 or 1>
- sets <file>'s has-been-dumped bit to <0 or 1>. The dumped
bit is supposed to mean that the file has been copied onto
magnetic tape by the backup system (DUMP). It causes
incremental dumps not to copy the file again. "!" in
directory listings marks files which "have not been dumped".
- :SFREAP <file>,<0 or 1>
- sets <file>'s inhibit-reap bit to <0 or 1>. The DUMP program's
automatic GFR will not delete files which have this bit set
- :SHOUT <message>^C
- sends the specified message to all logged-in users
who can receive it. Does not send or mail the message
to users who are not logged in or are gagged.
Also does not send or mail to the shouting user himself.
As each user is sent the message, his name is typed
out on the terminal of the DDT which is shouting.
The actual message sent is
<sender's uname> <time> Everybody: <message>
but the automatically supplied parts can be rubbed out.
- :SL <file>
- Symbol Load - like $L but loads only the symbols, flushing
any that are already defined in the current job.
- :SLEEP <n>
- sleeps <n>/30. seconds.
- same as :LISTS - List this job's symbols.
- :SMDATE <date>
- sets that date. It takes a date in the same format as
:SFDATE and friends. (:SMDATE 10/15/78 16:40:25). Notable
special cases are :SMDATE 0, which sets it to NOW, and :SMDATE -
which sets it to print all of them.
- :SNARF <job>
- if the current job (say, FOO) has an inferior named <job>,
this command takes <job> away from FOO
and then does ":JOB <job> ". Thus, <job> becomes a direct
inferior of the DDT executing this command, instead of
an indirect inferior. FOO is not told that its
inferior is gone, but if it is a DDT it will recover
after an $J is done to it. This command is most useful
when done to a HACTRO that got detached because of a top-
level interrupt, but whose inferiors are valuable.
(The thing to do is "HACTRO$J :SNARF TECO ", etc.)
- prints system status info, as is done when DDT starts up.
On MC, prints the number of MACSYMA's being run.
- :START <addr>
- Same as :GO - Start current job at specified address.
- :SYMADD <file>
- loads the symbols from <file>, without killing the
symbols the current job already has.
- :SYMLOD <file>
- Like $L but loads only the symbols, flushing any that are
already defined in the current job. Same as :SL
- :SYMTYPE <sym>
- returns info on <sym>'s status. Useful in conditionals,
since it is 0 iff the symbol is undefined. The character
terminating <sym> is re-read. The bits in :SYMTYP's value:
4.9 - sym is half-killed.
4.8 - sym is predefined in DDT.
4.7 - sym defined but not in current block.
4.6 - sym is a DDT-reference (like ..TTYFLG or ..BTAD).
4.5 - sym is a .USET reference (like .SNAME).
the RH has the sym tab entry's addr in DDT
(but is 0 for PDP-10 instructions, which have none).
- :TAG <tag>
- is a label in an execute file or valret string, which a
:JUMP can jump to. :TAG is a no-op if executed; its only
purpose is to be recognized by a :JUMP.
- will print a CRLF iff the cursor is not already at the left margin.
It will do this even with the TTY off, so it can be done in init
files without needing a "^V ^W" to turn it on which would cause it
to echo a space and thereby always forcing a CRLF.
- :TPL <file>
- causes <file> to be printed on the LPT: eventually.
If <file> is on DSK:, makes a link from the TPL: device to <file> .
<file> must exist when the attempt is made to print it;
if it doesn't exist when the command is given it is an error
(the names in <file> are translated as if it were
being opened and the translated names are actually used).
If <file> is not on DSK:, it is copied to the TPL:.
On MC, device TPL just sends files to ML's TPL; it can't
hold links. :TPL on MC will always copy the file.
- :TPLN <file>
- like :TPL but no error if the file doesn't exist.
If it still doesn't exist when the time comes to print it,
it will be printed as soon as it is created.
- zeroes the directory of the microtape that is ^F
default device. Error if that device isn't a microtape.
:UINIT is allowed only after :ASSIGN'ing the tape.
- :UINIT <tape>
- similar but uses the specified microtape.
Sets defaults as ^F does.
- :UJOB <uname> <jname>
- opens the job <uname> <jname>, which presumably belongs
to <uname>'s tree instead of your own. The job can be
examined only, unless it is reowned when you select it.
- :UNPURE <addr>
- unpurifies the page of the current job in which
<addr> lies (thus, ":UNPURE 2000 " unpurifies page 1).
- unpurifies all shared and read-only pages of the
current job, except absolute pages. See the symbol
"..UNPURE" for the automatic unpurification feature.
- if read from the TTY, turns on TTY output by zeroing ..TTYFLG.
In a valret or file, cancels one ^W, just as a ^V does.
- prints the version numbers of ITS and DDT.
Also says which machine you're on, and your TTY number.
If logged in, DDT prints its UNAME and JNAME on the next line.
This command is executed automatically when DDT starts up.
- turns on typeout like :V and types a CRLF and a *
- turns on typeout and proceeds inferior without
actually typing anything. Like $P^V .
- :WALBEGIN <file>
- opens a wallpaper file. If successful, turns on output to it.
The default file names are LPT:WALL PAPER <msname>;
see ^B and ..LPTFLG
- closes the wallpaper file if any. Doesn't
change ..LPTFLG but its contents become irrelevant.
- :WALLP <file>
- opens a wallpaper file. Same as :WALLBEGIN
- :XFILE <file>
- executes <file> as DDT commands, after which input will
revert to its current source. The current input source is
pushed as by :INPUSH and input comes from the file;
at eof input will pop back into the source the
:XFILE was read from. However, if :XFILE is the last command
in an execute file, it will be able to loop without
input pdl overflow (the CRLF ending the :XFILE must
be absolutely the last thing in the file!).
Reading of filenames:
Some commands take filename arguments. These arguments
always follow the command itself. Such commands must always
be terminated by a carriage-return.
An ITS filename has four components: the device name,
the sname (or user name), and two filenames, called the FN1
and the FN2 (Yes, "filename" is ambiguous).
The device name and sname constitute the directory, and the
two filenames specify the file in it. A filespec can specify
any or all of the components. Those that are not specified will
be given default values, which will usually be whatever values
were used for those components in a previous command (see
Defaulting of filenames, on the next page).
A filespec as understood by DDT is composed of names
terminated by delimiters. A name is composed of any SIXBIT
characters which are not delimiters, except that delimiters
which are SIXBIT characters may be forced into names by preceding
them by ^Q.
The significance of a name depends on what the terminating
delimiter is. If a name is terminated by a colon, it specifies
the device name. A name ended by a semicolon specifies the sname.
In addition, it forces the default device name to be DSK:, if the
default device was one which does not use the sname (such as PTR:).
Names terminated by anything other than colon or semicolon
are "normal". The first normal name specifies the FN1.
The second specifies the FN2. If there are more normal names,
the third becomes the device name and the fourth becomes the sname.
Further normal names are ignored.
A normal name is usually separated from what follows by a space,
but a space is not needed before these special effect characters:
- like typing the default FN1 between spaces.
(treats the preceding name if any normally,
then treats the default FN1 normally)
Thus, if the defaults are FOO BIN, typing TS^X or TS ^X
will specify TS FOO. ^XNBIN or ^X NBIN will specify
- similar but uses the default FN2. It is never
necessary to use ^Y explicitly as the FN2, because
simply not specifying any FN2 has the same effect.
- , (comma)
- ends the file specification. It does not terminate the
command, however; only a ^M will do that.
Useful in commands that read a file specification and
then read something else.
- $ (altmode)
- Causes the filenames specified or defaulted thus far
to be typed out on a new line, followed by a tab,
then reads another file specification using
the typed-out names as the defaults.
- ^M (carriage-return)
- terminates the file specification and also
terminates rubout-processing. Unless the command wants
to read more arguments, it will immediately execute.
Defaulting of filenames:
When a filename is read in, defaults are provided for any
component of the filename that is not specified. Usually,
the names that are specified change the default for the next
command of the same class (filenames are "sticky").
The commands are divided into classes as follows:
- Loading and dumping commands
$L, $$L, $Y, $$Y, :LOAD, :PDUMP, :SL, :SYMADD, etc.
These commands all remember and update the same filename;
however each job has its own. When a job is created, that
default is set to DSK: <msname>; <jname> BIN .
When a job is loaded into by <prgm>^K or :<prgm>, etc.,
the default is set to the name of the file loaded.
Each command in this class updates the default for the job
that it loads or dumps to the file that was loaded or dumped.
(that is, the next such command in the same job will use the
same filenames unless the names are explicitly re-specified).
The commands that run system programs (^K, :, :NEW, etc.)
set the $L-default filename of the loaded job to the
filename of the loaded program. If that program was
actually found on SYS;, SYS1;, SYS2;, or SYS3;, a special feature
is invoked to prevent accidental overwriting of system
programs: although the default is cheerfully set to
SYS; or whatever, the first dumping command given will
change it to <msname>;. This causes the dumped file
to be written on the user's own directory instead of
on top of the loaded system program. Of course, if an
sname is specified in the dumping command it overrides
the change in the default. Also, this feature is activated
only by the program-running commands; if SYS; becomes
the default via an explicit specification (eg, $L SYS;)
DDT will not spontaneously change it.
- ^O, :DELETE, $$^O, :RENAME, :LINK, :LINKF, :LINKN, :SFDATE, :PRINT,
:COPY, :MOVE, :EXISTS, :TPL, :LISTF, ^F.
These commands all use and update the same default
filenames. There is, however, only one default for these
commands rather than one for each job. Logging in sets
the default to DSK:<hsname>;.FOO. >
^F is slightly special in that TTY^F, XGP^F and <arg>$^F do
not set the default for any of the other commands, but do set
it for successive ^F's without argument.
- ^T, $^T, $$^T, ^U, $^U, $$^U.
Defaults for these commands are not sticky between commands.
The first file's defaults are always *:*;* *.
With those commands that read two filenames (^T, $^T, $$^T)
the second defaults to the first.
- :XFILE remembers and updates its own special default, which
starts out as DSK:<hsname>;<xuname> LOGIN. :WALBEG has another
default that is initially DSK:<msname>;WALL PAPER.
Setting the msname ($$^S) sets the default sname for :XFILE, :WALLP,
:DELETE, etc., but not for $L, etc.
DDT's UNAMEs and SNAMEs:
DDT remembers several different "user names", each one with
its own significance. They are, in order of decreasing
significance and increasing frequency of alteration,
the RUNAME, the XUNAME, the HSNAME, the MSNAME.
The RUNAME is DDT's best idea of what its .UNAME user variable
is (in other words, it represents the fruits of DDT's attempts
to keep track of what the system thinks DDT's UNAME is).
DDT uses the RUNAME as the FN1 of the "SENDS" file to put
messages from other users in (see "Unsolicited typeouts"),
and also as the UNAME that inferiors must be created with.
It is unreasonable to change the RUNAME explicitly. DDT tries
hard to detect any change in its .UNAME and update the RUNAME
as necessary (see "When DDT determines the RUNAME").
This is "who you really are", as opposed to "what you are logged
in as". It is not infrequent for them to be different.
The XUNAME lives in the DDT
variable ..XUNAME, and in DDT's .SUSET variable .XUNAME;
they are both set by logging in, and by depositing in ..XUNAME.
When you log in, the XUNAME is normally set to the name you specify,
even if you end up logged in under another name (for example,
if you say FOO$U and end up as FOO0 because FOO already existed,
your XUNAME will still be FOO). However, if you try to log in
as "FOO1", and FOO1 has no directory, DDT init file, or _MSGS_ file
while FOO does, the XUNAME will be FOO instead of FOO1.
DDT uses the XUNAME as the name of the default mail file
for :PRMAIL, and as the name of the _MSGS_ file for :MSGS.
so, after "FOO1$U", you would see FOO's mail and messages.
DDT also uses the XUNAME to decide whose init file to use.
If you would like to have different initialization
performed depending on whether you log in as "FOO" or "FOO1",
you can put conditionals in the init file as follows:
:IF E $Q-$1'FOO$
$( <commands executed only if you log in as FOO> $)
a similar conditional can then specify commands to be executed
only if not logged in as FOO - just use "N" instead of "E".
Each inferior job also has a .XUNAME variable. When the job is
created, DDT will set its .XUNAME from DDT's XUNAME. After that,
DDT will never touch it, but the user can alter it at will by
depositing in .XUNAME. In addition, the DDT command $^S can be
used to cause the next job created to be given a different .XUNAME.
Programs that read init files should use the .XUNAME to decide
where to look for one. They should read their own .XUNAME
variables, rather than trying to read DDT's .XUNAME, so that
the user will be able to fake them out with $^S, etc.
The HSNAME is your "Home SNAME". It is the same as your normal
working directory or MSNAME. However, while you might reasonably
select a different working directory temporarily with :CWD or $$^S,
you hardly ever want to change your home directory. The home
directory is in location ..HSNAME in DDT, and also in the .HSNAME
ITS variable of DDT, and copied into the .HSNAME variable of every
inferior. However, most programs should use the working directory
(which they will find in .SNAME when they are started) rather than
the home directory, which is to be used only for things like your
RMAIL file which belong to YOU rather than to whatever you are hacking
at the moment.
"MSNAME" is short for "Master SNAME". It is DDT's super-default
SNAME. Whenever an inferior is created or reloaded,
its .SNAME variable is initted from the MSNAME. Also, when DDT
is about to load a program into a newly created job (one not
loaded before), the MSNAME is the first directory DDT looks on
for the file (see $L, ^K, :).
The MSNAME and HSNAME are set just like the XUNAME at login time.
The default init file (which is used if you fdon't have either
a directory or an init file of your own) will then run the SETMSN
program, which will set the MSNAME and the HSNAME according to
your INQUIR entry.
The MSNAME may be set explicitly by <name>$$^S, or by depositing in
Using $$^S or :CWD causes several other default SNAMEs to be set.
- "Who you are". This is what you normally log in as. However,
if you log in more than once, the second time you'll be logged in
as a slightly different name, but your XUNAME will still be the
same. For example, FOO logs in twice, the second time he becomes
FOO0, but his XUNAME is FOO in both instances.
- A decoding of the XUNAME into a directory. The directory on which
a user's mail and init files go. This is a permanent parameter of
a given user. (You don't move your mail file from day to day.)
There is no command to change this, it must be done through INQUIR.
There is, however, a command to use someone else's HSNAME and XUNAME
for the next command. FOO^S will use FOO's XUNAME (FOO, of course)
and HSNAME for the next program you run.
- "Master SNAME". This is what directory you are hacking, your
"Working directory". I.e. if today you are working on a program
kept on LISPM, and tomorrow on a system who's files are on your
own directory, the first case you might set your MSNAME to LISPM
and the second to your own directory. It's purpose is to tell
programs what directory to assume when you don't specify all of a
filename. It is subject to whims of convenience, and a command
exists to change it: :CWD FOO (or FOO^S) set's the MSNAME to FOO.
A program determines the MSNAME from it's SNAME at startup time.
NOTE: Normally, one should have a null FILE DIRECTORY entry in INQUIR.
It is only in unusual cases where DDT's default actions are inadaquate that
they should be over-ridden by your INQUIR entry.
When you log in, DDT calculates your HSNAME from your XUNAME, by looking
in INQUIR. If you have an INQUIR entry, with a non-null FILE DIRECTORY entry,
it parses that. It should consist of entries separated by commas, like
The entries are checked one at a time. An entry with no @ or % is taken to be
a directory, and if the directory exists, it is taken as the HSNAME and parsing
stops. If there is no such directory, the next is tried. Similarly, in an
entry with a @ or %, the part before the % or @ is taken as a directory, and
the part after the @ or % is taken as the machine on which it is aplicable.
The entry is ignored either if it applies to a different machine or the
directory does not exist.
If none of the entries in INQUIR applies, DDT then checks if there is a
directory of the same name as the XUNAME. If so, that is used as the HSNAME.
So people with their own directories don't need to have INQUIR entries
specifying what directory to use.
If none of the above applies, DDT assigns you to one of several public
directories, according to your position in the alphabet, and whether or
not you are a tourist (MC only). The public directories are called
USERS1, USERS2, USERS3, etc. On MC there are also GUEST1 GUEST2 and GUEST3
for tourists. On other machines, no distinction is made.
The mailer uses the same algorithm to find what directory to put your
mail on. This is how DDT knows where to find your mail with the :PRMAIL
init files and mail files and the like have the following naming convention:
<hsname>;<xuname> <program-ID> where <program-ID> is something like MAIL,
LISP, LOGIN, LOGOUT, etc. For example
|Old regime ||New Regime
|<random>;.LISP. (INIT) ||<hsname>;<xuname> LISP
|<random>;.DDT. (INIT) ||<hsname>;<xuname> LOGIN
|<random>;.DDT_ (INIT) ||<hsname>;<xuname> LOGOUT
As you can see, the new scheme is simpler conceptually. Also, given a person's
XUNAME, if you had a way of calculating the HSNAME, you'd be able to run his
init files, no matter where he kept them. This was not true of the old scheme.
The way to do this is with the <xuname>^S command. This command has the same
meaning as it always did, that is, "for the next program you run, pretend you
are <xuname>". Howver, it is smart about HSNAME's and set's the HSNAME as
well as the XUNAME, so if the program follows the conventions, it will find
FOO's init file if you do FOO^S LISP^K
Often people sharing a single directory wish to share a common init file.
This can be done using "*" for the first file name, rather than the XUNAME.
"*" means "match any XUNAME". Thus if several people, say A, B, and C, using
directory DD, all want the same init file, they can call the file
DD;* LISP or DDT;* LOGIN or whatever. If a person F also uses that directory,
but wants a different action, he can call his init file DD;F LISP and it
will be found in preference to the * LISP.
- ..RHSNAME (16) — Translate an XUNAME into an HSNAME
This performs the lookup function of ^S, plus being generalized to inquire
about on other ITS's The RH points to a two word block. The first is only read
by DDT, not written. If it is zero, the HSNAME of the ITS on which it is
running is read. If it isn't zero, it is expected to contain an ITS, and the
HSNAME for that site is used. The second word should contain the XUNAME to
look up, and DDT will return the HSNAME in that location.
- ..RMAIL (17) — Find a user's mail file. This performs the function of
^A. The RH points to a 3-word block of info. The first is the ITS name,
the second is the XUNAME, just like ..RHSNAME. The third is used only
to return a value. The value's returned are 1) ITS his mail file would be
on. If an ITS was explicitly specified, it will, of course, be the same
as specified. The XUNAME is clobbered to be the XUNAME mailed to. If the
FOO has a BAR@MC Network Address in INQUIR, the ITS returned would be MC,
and the XUNAME would be BAR. BAR's HSNAME would be returned in the third
word. The third word is always the HSNAME corresponding to the XUNAME
returned in the second word, regardless of whether a XUNAME translation is
made because of the Network Address entry.
When DDT determines the RUNAME:
At various times, DDT checks its .UNAME system variable.
If it is not equal to the RUNAME, DDT sets the RUNAME, and
also initializes the UNAME.
This happens just after logging in. Normally it will never
happen again, but if the DDT is detached or disowned, and
then reowned with a different UNAME, DDT will eventually
find out about it and redetermine its RUNAME.
Specially used symbols:
Symbols whose values are variables:
(It is reasonable to assemble definitions of these to direct DDT)
- the address of the start of the ^\ patch area.
(If you use MIDAS block structure, you should
define PATCH in the global block, by doing ' PATCH": ')
- will be used to initialize PATCH if PATCH
isn't defined. It is best to define both PAT and PATCH;
as patches are made, PATCH will change, but PAT will not.
- if this is defined, something which looks like
an I/O-instruction with device code 010 will be
typed out in $S mode as an I/O instruction.
If it is undefined, such values will be typed out
in halfword mode instead.
In general, for something with device code <dev>,
the symbol ..D<dev> is used.
(Except that for devices APR,PI,TTY,DIS I/O-instruction
format will always be used)
(also, if there is no job, no symbols,
or if the job is SYS, PDP6 or PDP-10,
the I/O-instruction format will be used for all
device codes less than 740, without searching for ..D!dev)
- if this is defined, it tells DDT what to do about
UUO opcode 010 – whether it uses its AC field, whether
it addresses memory, etc. This information is relevant
when DDT is considering opening the memory locations
referenced by a specific instruction (see ..PCPNT).
..U symbols are looked for only for opcodes less than 100
or greater than 700. The value has 3 significant bits:
1.1 this UUO refers to the addressed memory location.
1.2 this UUO refers to the specified ac, unless the AC field is 0
1.3 this UUO always refers to the specified ac.
- is one place that DDT looks for the bit pattern, when
FOO$? is done. See $? for details.
Special pseudo-locations (.USET variables):
These symbols have values which are the "addresses" of the current
job's .USET variables. Those .USET variables are not really in the
job's memory, and these "addresses" are not just numbers, but it
works to add numbers to them.
For more accurate and detailed info on .USET variables,
see .INFO.;ITS USETS.
- holds current job's PC.
- PC before most recent jump instruction.
Unfortunately, proceding from a breakpoint
clobbers this variable, and so does hitting a breakpoint
which does not break because of its proceed count or
conditional instruction. There is unfortunately no easy
way to fix this.
- PC at last insn that trapped to system's 40 .
- last UUO that trapped to 40 .
- set if system calls should trap to superior instead of normal action
(DDT doesn't handle that specially)
- job's default SNAME. Initted by DDT from the MSNAME.
- job's UNAME.
- job's XUNAME. DDT inits it to your XUNAME (usually, but see $^S),
but you can change it to fool the program if you like.
- job's name.
- job's "intended" name.
Tries to do the same thing for a job's JNAME that .XUNAME
does for the tree's UNAME - that is, it claims to be what
the JNAME would ideally have been. When a job is created by
$J, the XJNAME is set up to be the same as the JNAME.
If the JNAME is changed by $$J or :GENJOB, however, the
XJNAME is not changed. Also, if a job named FOO0 is
created by :NEW FOO, the job's .XJNAME will be FOO, not FOO0.
Programs that wish to take different actions depending on
the user's command should examine this variable.
- job's user index (printed by $$J, $$V).
- the job's superior's user index, or -1 if job is top-level.
- stop bits, nonzero => job not runnable.
- mask for 1st-word interrupts.
- when read, like .MASK . When written, IOR'ed into .MASK .
- similar but ANDCAM'd into .MASK when written.
- pending 1st-word interrupts.
- , .APIRQ analogous.
- mask for 2nd-word interrupts.
- .IMSK2, .AMSK2
- turn on or off bits in .MSK2
- pending 2nd-word interrupts.
- .IIFPI, .AIFPI
- defer-bits for 1st-word interrupts.
- similar, for 2nd-word interrupts.
- .IDF1, .ADF1, .IDF2, .ADF2
- also exist.
- 0 => PI in progress
-1 => PI cleared.
- top of user memory (1+ highest legal address).
- address and bits set in MAR
- last PC where MAR stopped program.
- # of channel most recently in error.
(the one whose status you might want to look at)
- address of the 1st word of the page
that the most recent MPV tried to refer to.
- job's runtime in 4-microsecond units.
- job's option bits.
Bit 4.5 (%OPBRK bit) is set by DDT in all inferiors.
The intention is that a superior should set it if it is
prepared to handle all .BREAK 12's and .BREAK 16's as DDT does.
Bit 4.4 (%OPDDT bit) is also set by DDT in all inferiors.
No one else should set this bit.
It is cleared in a job which is disowned.
The system does not use these bit, or bit 4.6 (%OPCMD bit)
which DDT will set iff there is a command available for the inferior.
Inferiors should try to read a command from their superiors
only if this bit is set. That will facilitate running
them under programs which can't handle .BREAK 12, at all.
- specifies the addresses of the special core locations
used by DDT and ITS The right half points to a
block used by I.T.S; the left half points to a block
used by DDT.
The RH normally contains 40 . Whenever the system references
locations "40", "41" or "42", etc., specifically (eg,
giving the user interrupts, or returning UUOs 50-77),
the system really references the block that .40ADDR
points to. Thus, if .40ADDR is set to 500, the system expects
location 502 to contain the address of the interrupt handler.
ITS reserves an 8-word block, but uses only 5 words
of it as of now. The words used are (assuming the block
starts at the default location, 40):
40 when a UUO is returned, its value is
41 the address of the returnable UUO handler
should be here. See ITS UUOS for details.
42 holds the interrupt handler address or
interrupt table AOBJN pointer,
if there are interrupts enabled.
43 holds the undo-list for the LOCKS feature
if the feature is turned on.
44 holds the critical routine table pointer
if the LOCKS feature is turned on.
If the LH is nonzero, it is the address of the 20-word
block used by DDT. If it is zero, the block starts
at location 20 . The uses of these locations are:
25 holds "." when a user-defined typeout
mode instruction is run.
26 holds a breakpoint conditional
instruction being executed.
27, 30 hold .BREAK 16's for getting control
back to DDT after a breakpoint
31 holds an instruction being executed
to proceed from a breakpoint which
didn't break (count not out and
condition, if any, didn't skip).
32, 33 JRSTs back to the program, or
data for the instruction in 31.
34 holds an instruction being $X'd
35, 36 hold .BREAK 16's to return to DDT
after the $X'd instruction.
37 holds $Q when a user-defined typeout
mode instruction is run.
- contains several things uninteresting to examine when
the job does not have the TTY, and also contains
%TBINT=100000,, if set, the job will interrupt on
any attempt to use the TTY when it
doesn't have the TTY. DDT sets this
bit in all jobs it creates, but will
not object if you alter it.
%TBNVR==200000,, if set, TTY opens will fail when the
job doesn't have the TTY. DDT initially
zeroes this bit, but you can alter it.
%TBDTY==10000,, not user settable, this bit is 0 iff
the job has done a .ATTY not undone
by a .DTTY.
- .TTST, .TTS1, .TTS2
- hold the saved values of the TTYSTS, TTYST1 and TTYST2
variables for the job's console, when the job doesn't
own the console.
- holds the job's "console register" that determines what
TV it will write on when it deposits in the TV memory,
and also what logical operation is used for depositing.
- contains the number of the TTY of the job's tree,
whether or not the job has the TTY. Also, will be
-1 for jobs "in the system tree" and -2 for
- +<n> is contents of I/O channel <n>
- +<n> is contents of I/O status word for channel <n>
- +<n> is contents of I/O pdl word <n>
- +<n> is "page-map word" <n> ;
see .INFO.;ITS USETS for its format.
Special per-job pseudo-locations (DDT's user variables):
These symbols have values that are the "addresses" of variables
in DDT's memory, pertaining to the current job. The visible
numeric part of such an address is in fact the address of
the variable in DDT, but there is also a hidden flag.
- after the job interrupts DDT, this word says
which fatal 1st-wd interrupts the job got to cause DDT
to be interrupted.
- holds the fatal 2nd-wd ints that the job had.
when a job has interrupted DDT, either ..UPI0 or ..UPI1
must contain nonzero (something must have stopped it!).
- PC to restart job at.
- holds the PC saved by the last $G or $X command.
$X will (presumably) eventually restore that PC.
- says why job stopped.
-1 => random interrupt.
0 => running.
1 thru 8 => that breakpoint.
16 => .BREAK 16,
21 => never started.
- number of insns to 1-proceed.
- nonzero in $$^N mode, in which case PC to stop at.
- number of times to multi-step,
negative => forever.
- holds the job's stepping-flags.
- usually zero. If set nonzero by the user, the job is made
"protected". Any attempt to kill or reload a protected
job will cause DDT to ask for confirmation.
- 0 => no temp. bpts in this job.
else RH is addr of the 1st; the second is in the next wd.
If LH is from 0 to 17, it is addr of an AC whose contents
should be compared with those of
- , breaking only if they are equal.
- (<n> from 1 to 8) (either altmode or dollar sign is okay)
1st word of a 4 word block describing setting of bpt <n>.
zero if bpt <n> not set. else,
RH as address of bpt, LH if nonzero is location
to open when the breakpoint is hit.
- nonzero if conditional breakpoint, in which case
holds conditional instruction (break if insn skips).
- holds proceed count for breakpoint.
- holds the MAR status.
after <adr>$<n>I, ..MARA contains 4+<n>,,<adr>
when there is no MAR set, ..MARA holds 0.
- the conditional MAR instruction.
If this is nonzero, the MAR will break only if
this instruction skips when executed in the job.
- if nonzero, this word is considered to be the address
of the first word of an ASCIZ string to be executed as DDT
commands whenever the MAR is tripped.
- 0 if no starting address, else JRST to the address.
- holds <default low search limit>,,<default high search limit>
- -1 => job allowed to execute valret strings, kill itself,
or do .BREAK 12,'s that write in DDT. 0 => DDT will stop
the job before doing any of those things. $P will make
DDT go ahead and do one such attempt, but still stop at
the next one.
- if nonzero causes the job to be stopped before each system
call. $P at that point will execute the system call, but
the job will stop again at the next one.
..SYSUUO is the location after ..PERMIT.
- holds the % typeout mode for this job. Initialized from
..MPERCE when the job is created. See ..TDOLLA for details.
- holds the & typeout mode for this job. Initialized
from ..MAMPER when the job is created. See ..TDOLLA.
- initialized from ..MDOLLA when the job is created,
it holds the job's $ (dollarsign) typeout mode. It is either
-1,,<addr of routine in DDT> or an insn to $X.
The insn can find the value to type out in 37 (but see .40ADDR).
The open location's addr will be in 25 (but see .40ADDR).
If the insn is a subroutine call it shouldn't skip;
otherwise it should return with .BREAK 16,504000 .
- holds the job's ' typeout mode. Initialized from ..MPRIME.
- holds the job's " typeout mode. Initialized from ..MDQUOT.
- holds the job's # typeout mode. Initialized from ..MNMSGN.
- 0 if not patching; else <patched-from>,,<patch-area>
- in the RH is the id number of the last literal you asked for
(with $$( ). In the LH is the number of the last literal
which has been defined (its contents specified). If they
are not equal, then there are literals which DDT knows must
be defined, and DDT will ask you to define one of them as
soon as things are in a state where that is possible.
- 4-word block holding the name of the last file loaded.
1st wd holds device, then FN1, FN2, SNAME.
All 4 wds are left-justified SIXBIT.
- a 5-word block containing the default names for
loading, dumping etc.
- an AOBJN pointer to the undefined-symbol-reference table
(in DDT's address space) for this job. See "?".
- an AOBJN pointer to this job's symbol table.
- an AOBJN pointer to a final segment of the symbol table,
starting at the header for the current block.
- is a word containing miscelaneous fields. Some of them
are read and written by .BREAK 12,[..RRND,,addr] and
.BREAK 12,[..SRND,,addr]. Others are internal to DDT,
will be read by .BREAK as 0, and can't be set with .BREAK.
When depositing with DDT, be sure not to change bits
except those of the field you intend to modify.
These fields are now defined for the user:
bit 1.5 (20) if 1 means that unsolicited typeouts should
be inhibited when this job has the tty. When the job
returns to DDT, any postponed messages will be printed.
bit 1.6 (40) if 1 means that other jobs, even if $$^P'd,
should be prohibited from typing out while this job
has the tty. They will wait instead. When this job
returns to DDT, they will resume typing out.
bit 1.7 (100) if 1 means not to print notification of
incoming mail while in this job. This applies only to
notifications generated by DDT via the :MAILNT command.
Special pseudo-locations in DDT:
These symbols are like those in the preceding section except that
the variables they point at are not per-job.
- location 0 in DDT.
..DDT+<addr> is location <addr> in DDT.
- is the address of the block of 8 words
holding the 8 search masks for $N and $W.
Their initial values are:
-1 ? ,-1 ? -1,, ? 0 17, ? 17,, ? -1 ? -1 ? -1.
See the $M command.
- if this flag is nonzero, the user is protected from himself.
<prgm>^K typed when a job named <prgm> already exists
queries "–Clobber Existing Job–". A space will tell
DDT to go ahead and load a new copy of <prgm> over the old.
Anything else aborts the operation.
This flag is initially nonzero, but is zeroed by "<name>$U".
It is not zeroed by :LOGIN, however.
The assumption is that anyone who doesn't know about $U
probably needs protection from himself.
If the DDT is already logged in when it starts (it is an
inferior, or was reloaded by $U.), ..CLOBRF is also zeroed.
- initially -1, if set to zero ..GENJFL causes :<prgm>
to behave like :RETRY <prgm> instead of :NEW <prgm>.
- if this flag is nonzero, every unsolicited offer (such as
–More–) will say "(Space=yes, Rubout=no)" so the user
will know how to respond. ..MORWARN initially holds 1,
but it is zeroed by $U and in inferior and reloaded DDT's.
- this determines whether single-character file-handling
commands should be verbose. If 0, they are all brief.
if 1, only ^O (delete) is verbose. If 2, most are verbose.
When a command is verbose, as soon as it is typed it will
print out a statement of what it will do (such as
"(Delete File)"), and then will pretend the user typed
an altmode - it will print out the default filenames.
A verbose command does not need any extra type-in as
confirmation; it just types more out.
If ..DELWARN is set to 3, it disables the commands :LINK,
:LINKN and ^O. These commands are often mistakenly taken as
a way to do a com link. The command :LINKF will work even if
..DELWARN is 3, but will print out a warning message first.
The default DDT init file on some machines sets this to 3.
The default setting of ..DELWARN is 1.
- iff this is non-zero, $$^X., $^X., and $U. require the
".". If zero, they execute immediately. The default is
- iff this flag is non-zero, the $$^X. command is enabled, doing
a :MASSACRE. If zero (the default) this is disabled. The
theory is that this command is dangerous, and easily type by
- If this is >0, $^O will link files, ala :LINKN
If it is <0, $^O will link files ala :LINK
If it is 0, $^O is an error.
- :DDTSYM NFVRBS
- This controls :NFDIR verbosity. If DDT must resort to your
:NFDIR search list (SNLIST), it will normally print the name
of the directory where it found the program. If you do not
want such notifications, set this variable to zero.
- If this is non-zero, :SEND is disabled as a DDT command, and
the program SEND will be run instead. This should be a link
to the QSEND command. :OSEND will still get the DDT version
of the SEND
- iff this word holds nonzero, as it does initially,
the automatic unpurification feature is enabled.
Whenever DDT tries to deposit in the inferior and can't
because the page is pure, DDT will unpurify the page
and type out ":UNPURE <addr> " where <addr> is the location
being deposited into. Absolute pages will not be unpurified
and will still cause "PUR? " errors.
- iff this word is nonzero, it enables the feature which,
whenever DDT prints the next instruction to be executed,
automatically opens the AC and memory location referenced
by that instruction (but returning due to a ^Z is an
exception - the locations are never opened in that case).
When this feature comes into play, the locations are
opened as if by slash. DDT tries to avoid opening any
which the instruction doesn't actually use.
The user can supply information on which UUOs use
their addressed locations and their specified ACs
by defining symbols starting with "..U" (see ..U010).
If the instruction doesn't refer to memory but is indexed
or indirect, DDT will give the effective address.
..PCPNT is initially nonzero iff the terminal is a display.
- if nonzero, DDT automatically displays the raid registers
whenever a job returns. If zero, raid registers are
displayed only by $V commands. Initialized to zero on
printing consoles, but nonzero on displays.
- holds the number of raid registers to allocate space
for. The default is 8. Space for raid registers for
a job is allocated the first time a raid register is set
in that job. The space is not freed except by a :RAIDFL.
increasing the value in ..RAID+1 will not give a job more
raid registers if they have already been allocated,
unless a :RAIDFL is done to force them to be re-allocated.
- if nonzero (as it is initially), causes raid registers to
be displayed at the top of the screen on display consoles.
Otherwise, they are just typed out in the normal stream.
On printing terminals this flag has no effect.
- holds the new-job-default stepping flags.
- holds the number of seconds to wait between multi-steps
and before auto-proceeding a breakpoint. The time delay
overlaps the printout describing the next instruction.
Its purpose is to prevent the multi-stepping from going
so fast that the user can't tell when to stop it.
..DOZTIM initially contains 1.
- tells DDT when to print various random typeouts.
-1 => if DDT doesn't have the TTY, it waits till it does.
0 => if a random typeout becomes necessary and
DDT has given the TTY away, it prints the message immediately,
and prints it again when it gets the TTY back.
Positive => like 0, but if the TTY is a display,
and DDT doesn't have it, DDT repeats the messages at
fixed intervals. When DDT gets the TTY back,
it prints them one last time. The length of time waited
is the contents of ..SENDRP times 1/60 sec.
-2 ==> Type each message ONCE as it comes, and if DDT
doesn't have the TTY, repeat it when DDT regains the
..SENDRP initially holds -2
- :DDTSYM OMAILF
- if negative (as normally) causes :PRMAIL<cr> to rename the
mail file as OMAIL after printing.
If OMAILF is 0, :PRMAIL<cr> leaves the mail file
untouched. If positive, :PRMAIL<cr> asks if you'd like
to delete the file.
- :DDTSYM PMLFLG
- If 0 (the default), $^A just prints your (or some other luser's)
mail file. Nonzero means $^A should act like :PRMAIL.
- holds the number of bells for DDT to type out when it has
something unsolicited to say to you. The default is 5.
- initially zero, if nonzero it tells DDT to truncate :SEND
messages. See "unsolicited typeouts" for details.
- tells DDT how to initialize the .TTY variables of new jobs.
If positive, ..TWAITF is copied into the .TTY variable
(initializing the %TBINT and %TBNVR bits only). If negative,
that says that the default settings - %TBINT on and %TBNVR
off - should be used. Initially, ..TWAIT is negative.
If a job is created with 0 in ..TWAIT, then even if you ^P
the job, thus setting %TBWAT, the job will still do
nothing but hang dumbly if it tries to use the TTY and
doesn't have it. However, you or the program can alter
.TTY in which case ..TWAIT has been overruled.
See .INFO.;ITS TTY for what %TBINT, %TBNVR, %TBWAT do
and why you might want to use these variables to hack them.
- is related to ..TWAIT. It is initially zero. If it is
set to -1, the meanings of ^P and $^P are interchanged.
- gives the largest allowed numeric offset in symbolic typeout
mode. Rather than print a value as <sym>+<n> with <n> larger
than the maximum, it will print the value numerically.
- holds the current temporary typeout mode.
- holds the % typeout mode for use when there is no current job.
Also used to initialize the ..TPERCE variables of new jobs.
Initially set to -1,,..TMS when DDT is loaded.
- similar, for & mode. Initially -1,,..TMSQ (SQUOZE mode)
thus, $& will cause typeout in SQUOZE mode,
unless you explicitly changed the contents of ..MAMPER
before the current job (if any) was created, or changed the
job's ..TAMPER variable after it was created.
- similar, for $ (dollar) typeout mode. Initially -1,,..TMS .
- similar, for ' mode. Initially -1,,..TM6 (SIXBIT typeout)
- similar, for " mode. Initially -1,,..TMA (ASCII typeout)
- similar, for # mode. Initially -1,,..TMCH (single-char. ASCII)
- the address of the symbolic mode typeout routin (in DDT).
Put -1,,..TMS in ..TDOLLA to reset it to symbolic mode.
- ..TMSQ, ..TM6, ..TMA, ..TMCH
- are the addresses (in DDT) of the SQUOZE, SIXBIT, ASCII,
and single-character ASCII routines.
- ..TMC, ..TMF, ..TMT, ..TMH
- are the addresses (in DDT) of the constant (numeric),
floating point, $T, and halfword mode routines.
- DDT types output on the TTY if this holds zero.
Incremented by 1 by ^W; decremented 1 (unless 0)
by ^V, :V, :VK or :VP in valret strings or execute files;
zeroed by ^V, :V, :VP, :VK when typed on the TTY,
and by errors, and abnormal returns from inferiors
(the same types of returns that would do a :INPUSH).
- DDT outputs to wallpaper file if any if this holds 0.
^E adds one to it, thus turning off output. ^B in
a valret string or execute file subtracts one from it
(but doesn't change it if it's 0), canceling one ^E.
^E typed on the TTY zeroes ..LPTFLG. When a wallpaper
file is first opened (with :WALBEG) ..LPTFLG is zero.
- if contents are zero, E&S display instructions
will be defined on type-in. Initially 0 except on DM machine.
- if this is nonzero, DDT is in monit mode.
DDT generates (and types out) colons, causing input to be
treated automatically as :-commands. To leave monit mode
temporarily, just rub out one of the colons -
DDT will not generate another until there is an error
(such as another rubout, when there's nothing to rub).
This is initialized to 0 when DDT starts up unless
it is on the Dynamod machine and not logged in.
- holds your "MSNAME", in SIXBIT. The MSNAME is used
as the default $L SNAME of new jobs, as the initial
sname for the new jobs themselves, as the first directory
to search for programs being run by ^K or :-commands,
etc. See "DDT's UNAMEs".
- holds the FN1 to be given to the DIR: device by the
$$^F command. Initially, it is SIXBIT/FIRST/.
Another useful setting is SIXBIT/NAME1/.
- holds the FN2 given to DIR: by $$^F. If it is zero,
as it initially is, the current default FN1 is used.
Thus, putting $1'CDATE$ in ..DIRFN1, and $1'DOWN$
in ..DIRFN1+1, will make $$^F give a directory sorted
by creation date.
- holds your "XUNAME", in SIXBIT. The XUNAME says who
the user is, for the sake of looking at mail and messages,
and for DDT init files.
In addition, the XUNAME will be put in the .XUNAME
variables of inferiors to tell them who is running them.
For more information, see "DDT's UNAMEs".
- :DDTSYM TTYTYP
- holds the terminal's TTYTYP word.
- :DDTSYM TCTYP
- holds the terminal's TCTYP word.
- :DDTSYM TTYOPT
- holds the terminal's TTYOPT word.
- :DDTSYM TTYNUM
- holds the terminal's number.
- :DDTSYM GETTY
- is nonzero if the terminal is a display.
- :DDTSYM NOERASE
- is nonzero if the terminal is a storage tube display.
- :DDTSYM ERASE
- is non-zero if the TTY can handle ^PX
- :DDTSYM OSPEED
- the output speed of the TTY line, in baud.
- :DDTSYM ISPEED
- the input speed of the TTY line, in baud.
- :DDTSYM SMARTS
- the SMARTS TTY variable for this TTY.
The above symbols are useful mainly for :IF conditionals
in init files. This is the way to test for being on
either a dialup line or a TELNET connection (but NOT
a SUPDUP connection). A :TCTYP to the parameters of
your favorite remote terminal MUST NOT be put in an
init file with out such conditionals - otherwise, you
will screw up any local terminals you use!
:IF N $Q&<%TYSTY+%TYDIL>
$( :DDTSYM TCTYP/
:IF E $Q
$( :TCTYP LINEL 69. etc.
- holds the instruction which DDT uses to type out a "*".
You can replace it with any other instruction.
To use "%" instead of "*", deposit $1#%$> in that location
($> to avoid clobbering the opcode without having to know
what it is).
- :DDTSYM PRMMCH
- if nonzero causes DDT to type the machine name when it
prompts. For example, it might say "AI*" or "ML*".
People who SUPDUP a lot may find this helps them orient
- initially non-zero, if it is non-zero it prints out the
instruction being executed. If zero, it XCT's ..RPRMPT
- holds the instruction to XCT when DDT gets control of the TTY
via a ^Z, if ..C.ZPRT is zero.
- ..DDT+<any .uset-variable>
- holds DDT's variable of that name
(just opening the .USET variable would give the current job's
Unsolicited typeouts are those that occur because of
asynchronous conditions detected by DDT, rather than
as the response to a user command.
They can occur at any time - even if you are in a COM link;
even if DDT has given the TTY to an inferior!
In that case, on display TTYs, the messages
will be repeated every minute until you return to DDT,
and then once more immediately. This is to prevent
display hacking programs from wiping out the messages
by clearing the screen, etc.
On printing TTYs, the messages won't be retyped.
Those actions are the default. Deposit in ..SENDRP to change them.
- Job <jname> interrupted: <interrupts>
means that an inferior that does not have the TTY has had
a fatal interrupt (which may mean a .BREAK 16, or simply that
the job attempted to use the TTY which it didn't have) and has
interrupted DDT. Since it can't really return to DDT without
the TTY, DDT informs you of its desire to return so you can give
it the chance if you wish (just type $J at DDT).
The job that interrupted is now in a "waiting" state, and will
show up with a "W" if $$V is done. $J without argument, or
$P, ^P or ^X with that job selected, will make it "return to DDT".
Then it will be "stopped" instead of "waiting".
- :Forgotten job <jname> interrupting
means that the job named <jname>, which is DDT's inferior but
which you did a :FORGET command on, is trying to return to DDT.
It can't do so unless you do :JOB <jname> to make DDT "remember"
- Job <jname> wants the TTY
means that the job tried to use the TTY and couldn't.
The job might be waiting for input or for a chance to type out.
In either case, $P will start it up again. Just as in case 1),
the job is "waiting", and $J, or ^X, will make it
return. It will say it got a "DTTY" interrupt, which is true.
At this point it will be "stopped", so $P, etc. will work.
This case is actually a special case of 1), except that $P
has been made more convenient and the message is different.
- Job <jname> finished
means that the job did a .BREAK 16,160000,
and is now gone unless it had been the current job, and ^P'd,
in which case $P will tell it to die and ^X will stop it.
- MESSAGE FROM <sender's-uname> <jname>
<text (possibly several lines)>
This means that someone has done a :SEND to you.
The texts of all the messages sent to you are
saved in .TEMP.;<your-runame> SENDS, but only until you log out.
If the text of the message begins with rubout,
the "Message from <uname> <jname>" which DDT normally supplies
will be suppressed. DDT uses this to give the "[Message from..."
line that heads messages sent with :SEND.
If ..SMLINS is nonzero, then under certain conditions (a display
terminal not in COM mode) DDT will stop printing a :SEND after
that many lines (however many ..SMLINS says), and either say
–More– or say how many lines are left. The whole message
always goes in the sends file. This feature needs changes
to become a real winner.
- <machine name> ITS going down in <rel time>
means that ITS will stop running in <rel time> from now.
When that happens, everyone will be logged off automatically.
- <machine name> ITS revived
means that ITS won't go down after all (we hope).
This happens when a request for ITS to go down is cancelled.
- ITS being debugged!
means that ITS is in danger of crashing at any moment.
- ITS No longer being debugged!
means that 8) above no longer applies.
- Alarm, type ":ALARM<cr>" to clear
means that the time mentioned in the last :ALARM command has
arrived. This message will repeat every minute, (or however
often ..SENDRP requires) regardless of whether an inferior has the
TTY, until you give the command mentioned, which clears the alarm.
At times DDT will think that you might want some service (such as
printing of mail), or will wonder whether you really want to execute
a command which will have drastic effects that it doesn't usually have
(such as starting a new copy of a program when you already have one).
In those cases, DDT offers to go ahead, and allows the user to say no
or abort. DDT prints a message, which will usually start and end with
"–", and then reads a character. Space tells DDT to perform the
optional service or go ahead with the command. Rubout tells DDT not
to perform the service, or to abort the command. Anything else acts
as if it were preceded by a rubout, on the theory that explicit orders
should override DDT's attempts to guess. Anything but space causes
a message (usually "Flushed") to be printed indicating that the
offered service was not performed.
For the sake of the naive, if ..MORWARN is nonzero DDT will print
"(Space=yes, CR=no)" after every offer.
The offers that can be made now are:
- when a typeout reaches the bottom of the screen, DDT offers
to print more. If flushed, not only the printing but the
execution of the command will be aborted.
This feature is disabled by :TCTYP NOMORE.
- when you log in or do :INTEST or :MSGS, and there are new
system messages you have not seen, DDT offers to print one.
This offer is unusual in that rubout acts like a space and
tells DDT to go ahead; all other characters still tell DDT
not to go ahead, but they say "Postponed" instead of "Flushed"
since DDT will offer again later.
- when you log in or do :INTEST, if you have mail DDT offers
to print it. If flushed, it says "Postponed" instead of
"Flushed". Rubout flushes, as usual, unlike –Msgs–.
- --Attach Your Detached Tree--
- when you log in, if you have a detached tree that appears
alive enough to be attached to successfully, DDT offers
to do so. If you flush this, it goes about logging in
in the normal way, and runs your init file, etc.
The detached job is left detached, and DDT says so.
If there is a detached tree that is to dead to attach,
DDT will inform you but not offer to attach it.
- You have several attachable detached trees.
- --Attach A Detached Tree--
- is like –Attach Your Detached Tree– but indicates that
you have more than one, and after attaching one the
others will still remain, still detached.
- DDT is offering to run your init file, because either
DDT was already logged in when started, or your XUNAME
doesn't equal your RUNAME. In either case, a space will
tell DDT to run your init file, while anything else will
tell it to do nothing.
These offers are essentially requests for confirmation of a command
that would make DDT do something drastic.
- --Kill Protected Job--
- a command has been given which would kill a protected job
(one whose ..SAFE variable is nonzero). DDT will go ahead
if a space is typed; otherwise, it will err out.
- --Reload Protected Job--
- a command has been given which would destroy the contents
of a protected job (eg, $L).
- --Despite Pending :Alarm--
- you tried to log out while a :alarm was pending. This is
just to keep you from forgetting whatever the alarm was
to remind you of.
- --No Symbols. Dump Anyway--
- you loaded a program without symbols (perhaps with ^K)
or killed the symbols, and tried to dump it back out in
the same file. If you go ahead, the symbols for the
program will be lost, along with the old file you loaded.
- --Undefined Symbols--
- you tried to start a job (with $G) which contained references
to symbols yet to be defined (created using the ? command).
Presumably, the existence of such symbol references means
that you started but did not finish making some patch.
The following confirmation-type offers are made only if ..CLOBRF
is nonzero. If it is zero, DDT goes ahead without asking.
- --Kill Running Inferiors--
- you attempted to log out or :CHUNAM while some of your
inferiors were running. Space causes the command to go
ahead, while flushing aborts it (you might :DISOWN the
job, or finish using it, and then log out again).
- --Clobber Existing Job--
- you tried to run a program with ^K, and there was already
a job with the same name as that program. Running the
program would require clobbering that job's contents.
- --Create Additional Job--
- you tried to run a program with :, when you already
had a job with that name. Running the program would
involve creating a new job.
- --Reload Running Job--
- you tried to $L a running job.
Returning to DDT:
When a job gets a class 1 or disabled class 2 interrupt,
DDT is interrupted. If the interrupt was due to a breakpoint
or MAR, DDT will use the conditional instruction, if any,
and the breakpoint proceed count, to decide whether the job
should really be stopped. Any other sort of interrupt always
causes DDT to decide the job must be stopped.
If the job had the TTY it "returns to DDT"
immediately. Otherwise it is waiting ($$V will type "W")
and will return to DDT when $J with no argument is given,
or an $J specifically to that job, or an $P in the job.
Returning to DDT involves the following actions:
Otherwise something may be printed out, depending
on what stopped the job. The possibilities are:
- Breakpoints are removed from the job.
- If the job stopped with a .BREAK 16, requesting
death, it will die, saying ":KILL ".
- ^Z (and nothing else)
- a ^_D or Control-CALL
- a breakpoint
- a .VALUE with nonzero address
- the job tried to use the TTY and didn't have it.
- any other interrupts.
DDT's reactions are (case by case):
- type <pc>) <next insn>.
In this case only, the AC and memory location of the
instruction are not opened, regardless of ..PCPNT, since
the user is probably not debugging.
- Type an asterisk.
- complicated; see below under "breakpoints".
- if the job is returning immediately (because it had
the TTY when it executed the .VALUE), or because of
an $P, execute the
ASCIZ string pointed to by the .VALUE as DDT commands
(this is what .VALUE is for. See "instructions that
return to or call DDT"). If the job is returning because
of an $J with argument, treat this like case 5).
- this is impossible if the job is returning immediately.
If it is returning because of an $P,
give the job the TTY and proceed it. If the job is
returning after being $J'd to, treat this
like case 5).
- print the next insn, and the names of the interrupts:
<fatal ints> <pc> >> <next insn>
then (if ..PCPNT is nonzero) open (as if by "/") the
AC and memory location referenced by the instruction just typed.
If the insn doesn't use the AC, or the memory location,
they won't be mentioned. If the insn doesn't use the memory
location, but it is indirect or indexed, the effective
address will be typed: " E.A. _ <value>".
If the instruction is a UUO, DDT looks for a symbol
whose name is "..U" followed by the op-code, to tell
whether the AC and memory location are used; see
..U010 for details.
The interrupt names are separated by semicolons. A table
listing all the interrupt names appears below.
In any case, if there are pending non-fatal interrupts (which
will be handled by the job, rather than by DDT), DDT prints
their names in parentheses before the pc.
A job that hits a breakpoint won't always return to DDT.
Upon encountering a bpt, the bpt's proceed count
is decremented, and tested for zero. If it has reached zero,
the program returns to DDT, typing $<n>B <pc> >> <insn>
(and opening the AC and memory location, if appropriate).
(A bpt's proceed count is stored in $<n>B+2 and is set by
<count>$p after stopping at that bpt.)
Otherwise, if the conditional break instruction (in $<n>B+1)
is non-zero, it is executed, and if it skips, then the
job returns to DDT typing $<n>B <pc> > <insn>
(and opening the AC and memory location, if appropriate).
Otherwise, the program is continued without typeout.
When a breakpoint causes a return to DDT,
if the bpt has been set to type out a specific location,
(LH of $<n>B has address) that location will be opened.
Then, if the breakpoint has been set to auto-proceed,
an $P will be done, unless a character has been typed in
(Any char. will do; it will be read normally).
..DOZTIM holds the # seconds DDT will insist must elapse
from the time the bpt is hit till DDT proceeds the job.
A breakpoint is represented by a .BREAK instruction,
whose AC field gives the number of the breakpoint.
The .BREAK is put into the job when it is started or
continued, without changing the address, index or indirect
fields of the broken instruction. When the job returns
to DDT, for any reason, the .BREAK's are replaced by the
remembered original op-codes and AC fields. The index,
indirect and address fields, again, are untouched.
If DDT finds itself unable to insert a .BREAK, it clears
the corresponding breakpoint, typing 0$<n>B to inform you;
if a breakpoint is no longer there when DDT tries to
remove it (it has been replaced by other than a .BREAK)
DDT says "Breakpoint <n> Clobbered".
1st word (.PIRQC) interrupt name table:
(The 1st char on each line is " " for a class 3 int.,
"?" for a class 2 int, and "-" for a class 1 int)
("Should never be typed" means that DDT handles that interrupt
specially. Eg, for the .BREAK int, DDT handles the .BREAK.
As a result, you will never see ".BREAK;" mentioned).
(The master list that this table reflects is in
Code Meaning Bit in ..UPI0
REALTM realtime interrupt (rqd by .REALT) 200000,,
RUNTIM run time interrupt (see .RTMR) 100000,,
<4/6> something set int. bit. <4.6> 40000,,
<4/5> is analogous.
?^_D the job read a ^_D or control-CALL 10000,,
ATTY the job was given back the TTY.
?DTTY the job tried to use the TTY and didn't 2000,,
have it, when %TBINT was 1 (which is
the normal case)
-PARERR a parity error in the job's core 1000,,
ARFOV floating overflow 400,,
?PURPG wrote in pure page 200,,
?PURINS insn fetch from impure page 100,,
(this causes an int. only if a certain bit in the PC is set)
-SYSUUO any trapping insn in user trapping mode 40,,
SYSDBG system being debugged 2,,
-.LOSE .LOSE instruction executed 1,,
CLI core link interrupt 400000
PDLOV push down overflow 200000
LTPEN light pen hit on 340 100000
-MAR the MAR (set by $I) was tripped 40000
(This is special in that the instruction that tripped
the MAR is printed after "MAR. " and all the remaining
messages come on the next line,
along with the next insn to do)
?MPV memory protection violation 20000
SCLOCK slow (60cps) clock tick 10000
-1PROC 1-proceed return (should never be typed) 4000
-.BREAK .BREAK executed (should never be typed) 2000
?ILUAD I don't think this happens since paging 1000
?IOC input-output channel error 400
(this is special in that it is mentioned on a line
by itself, along with the system error message
describing the type of error)
-.VALUE .VALUE executed (should never be typed) 200
SYSDED system going down 100
?ILOPR illegal instruction 40
?DPY 340 or E&S display got an MPV 20
AROV arithmetic over flow 10
-BADPI bad location 42 4
(job got int. but 42 wasn't set up, eg was 0)
-^Z ^Z typed on TTY (should never be typed) 2
TYPEIN any interrupt character typed on console 1
(this is obsolete - use 2nd-word ints instead)
.VALUE 0. job did a .VALUE 0. 400000,,
(note that that bit is not set in .PIRQC by the system
but rather by DDT when it sees that the address is 0)
2nd word (.IFPIR) interrupt name table:
(All these interupts are class 3. They can still be fatal
if the job requests it, using the vectoring interrupt scheme)
Code Meaning Bit in ..UPI1
<4.9> shouldn't be seen 400000,,
<4.8> something set bit 4.8 of .IFPIR 200000,,
(its won't do this itself, but a .SUSET or
.USET can do it)
<4.7>, <4.6>, ... <4.1>, <3.9> are similar.
INF7 bit 3.8 - an interrupt from an inferior job 200,,
INF6, INF5, ... INF0 interrupts from other inferiors.
(.UTRAN can be used to find what inferior
corresponds to a given interrupt bit.
Better yet is to read the .INTBIT uset-variable
of every inferior when it is created)
<2.9> something set bit 2.9 of .IFPIR 400000
<2.8> something set bit 2.8 of .IFPIR 200000
IOCH17 interrupt on I/O channel 17 100000
(possible reasons depend on the device open
examples: TTY input - a character was typed
TTY output - bottom of screen was reached)
IOCH16 interrupt on I/O channel 16 40000
IOCH15, ... IOCH0 similar 20000, ...
Symbol Table Format:
Symbol Tables Inside DDT:
The symbol table, in DDT, is composed of 0 or more groups of symbols.
Each group has one header entry and 0 or more symbol entries,
and corresponds to a single relocatable program or a single
.BEGIN block (except for one, the "GLOBAL block", which is
the "superior" in the hierarchy of everything else).
WD 1 Squoze name, with flags clear.
WD 2 -<Length in words of the group>,,<level>
(The level is 0 for the GLOBAL block, 1 for program name,
2 or more for a block name. The length includes 2 for
the header itself)
WD 1 Squoze name & flags:
4.9 (%SYHKL) Half killed (these symbols are not! predefined)
4.8 (%SYKIL) Fully killed
4.7 (%SYLCL) Local (either this or 4.6 must be set)
4.6 (%SYGBL) Global (all global syms are in the GLOBAL block)
4.5 and down The squoze itself.
WD 2 Value.
Order of Groups of Symbols
The last group is always the GLOBAL block.
Every program name group follows the groups for the program's blocks.
Every block group follows the groups of its subblocks.
A relocatable block-structured program should
have an outermost block whose name is the same as the program name.
The program name group itself should be empty;
symbols defined outside .BEGIN-.END's should go in the group
associated with the program's outermost block.
:LISTP prints the names of the groups' headers in the reverse
of the order they have in the symbol table.
The Undefined Symbol Table in DDT:
Inside DDT, the "undefined symbol table" records all
unsatisfied forward references to undefined symbols
that were "deposited" in a job's core image. It contains
one 2-word entry per symbol. The first word of each
entry contains the symbol name, in squoze. The
second word's RH contains the address deposited in.
The sign bit of the second word is set iff the
symbol was deposited in the left half.
Symbol Table Formats in Files:
The "symbol table" of a binary file contains the
DDT symbol table and the DDT undefined symbol table,
each divided at arbitrary points into "sections"
which should be concatenated again when the file
is read, or it contains an indirect pointer to another
file whose symbol table should be used. Either one is
located in the file immediately
after the "start instruction" which terminates
the data dumped from core (see AI:ITSDOC;BINFMT >).
Each section of DDT symbol table has a word containing
-<# of data words>,,0 at the beginning, followed by
as many data words as specified, and a checksum.
The checksum of a symbol table section is computed
just like that of an SBLK (see ITSDOC;BINFMT >).
Each section of DDT undefined symbol table starts
with a word containing -<# of data words>,,1 (not 0!)
after which come data words and a checksum.
The two types of sections may be interspersed
arbitrarily in the file. After the last section of
either type should come a positive word, which should
be a second copy of the file's start instruction.
An indirect file pointer looks just like a symbol table
section except that its data consists of four filenames.
It starts with a word -4,,2 (2 indicates this is an
indirect pointer), followed by the device, fn1, fn2 and sname
(each as a word of sixbit), followed by the checksum.
A file may contain only one such indirect pointer, and
it must be the last block present before the duplicate
start instruction which ends the file.
In any file dumped by a recent DDT or assembled
by a recent MIDAS, the DDT symbol table data (the
concatenation of all the DDT symbol table sections)
will have exactly the same format as the DDT symbol
table proper, described above. Some old files
may have that data in a different format. It is not
necessary for any new programs to understand such
formats, and certainly all new programs should write
the correct format. If such an old file is encountered
and causes any problem, loading it with DDT and dumping
the result should produce a usable new-format file.
Some old STINK-loaded files may fail to load with $L.
:OLOAD should be used for them.