💾 Archived View for spam.works › mirrors › textfiles › programming › ddt.ord captured on 2023-06-16 at 20:09:34.
-=-=-=-=-=-=-
From rs@eddie.mit.edu Sun May 13 07:11:04 1990 From: rs@eddie.mit.edu (Robert E. Seastrom) Subject: HACTRN (LONG!) (was: Yet Another Proposed New Feature for INTERCAL) > From: bzs@world.std.com (Barry Shein) > Someone should post some of the ITS HACTRN manual...oops, there was no > manual. You were discouraged from understanding it, users were > considered a nuisance and tolerated only for their tax advantages. > Well, imagine a cross between TECO and Unix's ADB (really, DDT, but > that's a little circular) as the only command shell for an O/S. Sure there was a manual. I found two files. The one you probably want is INFO;DDT ORDER (remember that DDT and HACTRN are just different names for the same thing). There was also INFO;DDT DOC. Enjoy... ---Rob --------- Documentation for DDT version 1491 - Table of contents: (For users searching for command names with EMACS, each heading is the second line of its own page. The first line of each page is blank. There are no actual altmodes in this file; dollar signs are used instead. There are no non-formatting control characters; uparrow and a non-control character are used instead) (The DDTDOC program also searches this file, and knows that it uses dollar signs and uparrows rather than altmodes and control characters. So don't change this unless you fix DDTDOC first!) List of DDT commands Colon commands Built-in colon commands Reading of filenames Defaulting of filenames DDT's UNAMEs and SNAMEs Specially used symbols Unsolicited typeouts Unsolicited offers Returning to DDT Symbol table format 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: 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. All other commands evaluate all the preceding syls and ops to get 1 to 3 arguments (separate them with $,). ^@ will terminate an execute file or valret string. ^A prints the default user's sends file. <user>^A prints <user>'s sends file, and sets the default for ^A and friends. 0^A print your own sends file, and set the default to you. $^A like ^A but for MAIL files. (but see :DDTSYM PMLFLG) $^A like $^A but for RMAIL, BABYL or OMAIL files. (tries both). ^B 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. ^C 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 execute files. $^C 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). ^D 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. ^E 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. ^F lists the last directory referenced. <dev>^F 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 ... <user>^F 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. 0^F is the same as <msname>^F. $^F: <dev>$^F is like <dev>^F but doesn't set :PRINT defaults; just the default for ^F without argument. <user>$^F is like <user>^F but doesn't set the :PRINT default. $^F: <arg>$<n>^F 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 0 SIXBIT /SECOND/ ;$2^F finds FN2 SIXBIT /BIN/ SIXBIT /CDATE/ ;$3^F ascending in creation age SIXBIT /DOWN/ SIXBIT /SIZE/ ;$4^F descending in size SIXBIT /DOWN/ SIXBIT /NOT/ ;$5^F not backed up SIXBIT /DUMPED/ SIXBIT /ONLY/ ;$6^F just link pointers SIXBIT /LINKS/ Examples of use: FOO$1 Shows DIR:FIRST FOO and sets FN1 to FOO LISP$2 Shows DIR:SECOND LISP $2 Shows DIR:SECOND BIN $3 Shows DIR:CDATE DOWN UP$3 Shows DIR:CDATE UP PACK13$6 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. Examples: $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 ^G 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. ^H (back-space) is equivalent to $J $P <prgm>^H 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. $^H: <prgm>$^H like <prgm>^H but loads symbols if a new job is made. ^I (tab) 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 been used. <arg>^I deposits <arg> in the open location if any, then types out and opens the RH of <arg>. $^I and <arg>$^I are like ^I, <arg>^I but use the LH rather than the RH. $^I and <arg>$^I are like ^I, <arg>^I but do an effective address calculation on $Q or <arg> to determine the address to type and open. ^J (line-feed) 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 "."'. <arg>^J stores <arg> in the open location, if any, then does ^J. $^J pops the ring buffer of point, then does ^J. After " 100/ 200/ ", $^J would open 101 . See $^M. <arg>$^J stores <arg> in the open location, if any, then does $^J. {body}lt;n>^J pops the ring buffer of "." <n> times, then does ^J. <arg>{body}lt;n>^J stores <arg> in the open location, if any, then does {body}lt;n>^J. ^K: <prgm>^K 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). $^K loads the current job's symbols from the file which was loaded (eg by ^K) <prgm>$^K is like <prgm>^K but loads the symbols. $^K 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: $10^K 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. $4^K disowns the current job and starts it, simultaneously (as far as it can tell). $2^K 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. $1^K makes the current job into a non-disowned, top level job (but not console-controlled). Useful for resurrecting dead system demons. $3^K makes the current job be a non-disowned top level job with the system job's resource word. ^L 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. ^M (carriage-return) closes the open location if any, without changing it. Resets the temporary (or "current") typeout mode to the permanent mode. <arg>^M deposits <arg> in the open location if any, and closes it. Resets the current typeout mode. $^M 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 . <arg>$^M stores <arg> in the open location if any, then does $^M. {body}lt;n>^M like "$^M", but pops the ring buffer of "." <n> times instead of once. <arg>{body}lt;n>^M stores <arg> in the open location, then does {body}lt;n>^M. $^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 zeroed. <arg>$^M like $^M but deposits <arg> in the location after unpurifying the page. ^N proceeds one instruction, then returns to DDT. <n>^N 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. $^N 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 special care. {body}lt;n>^N 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. <pc>$^N 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. <p>,$^N 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. <p>,{body}lt;n>^N 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. -<n>(<p>)$^N 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 top. $^N 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. <pc>$^N 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. ^P 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 ..TWAITF $^P 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 - see ..TWAITF $^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 input. ^Q This is the same as ^ and is somewhat easier to type on some terminals. ^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. ^S 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. <user>^S sets the current job's sname to <user> $^S like <xuname>$^S; it undoes the effect of <user>$^S. <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. $^S: <user>$^S 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 ^T 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. $^T: <flags>$^T <file1>,<file2> creates a translation that applies to DDT and all of its inferiors to all levels. $^T: <flags>$^T <file1>,<file2> creates a translation for the current job and all of its inferiors to all levels. ^U 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. $^U: <flags>$^U <file> removes a translation created by $^T (one which applies to DDT and all its inferiors). $^U: <flags>$^U <file> removes a translation created by $^T (one which applies to the current job and all its inferiors). ^V 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. ^W special interrupt-level character that turns off typeout on the TTY by AOSing ..TTYFLG . See ^B. ^X 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. {body}lt;n>^X is like $^X., except that after killing the current job, {body}lt;n>J rather than $J is used to select another. <job>$^X 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 ^Y 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 format. <arg>^Y is similar but uses <arg> instead of $Q. $^Y is like ^Y but flushes the symbols DDT already has. <arg>$^Y similar to ^Y. $^Y: <addr>$^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. ^Z 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 area. 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 MIDAS). <arg>^\ 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 made. $^\ 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). <arg>^] 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. <arg>$^] 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 $^]. <arg>$^] 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 ^^. <n>^^ like ^^ but will stop after the <n>'th step if nothing stops it earlier. $^^: <flags>$^^ 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: 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. 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). <n> <flags>$^^ combines <flags>$^^ and <n>^^ <flags>$^^ sets the new-job-default stepping flags according to the letters in <flags>. Does not actually do any stepping. <flags>$0^^ sets the current job's stepping flags according to the new-job-default and the letters in <flags>. $ (altmode-space) separates prefix command arguments, like altmode-comma. ^_ Incluseive or. ! divides. Priority 2. $! floating divides. Priority 2. If unary, reciprocates. $! or <arg>$! 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. <arg>" 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 typeout modes. {body}lt;n>"<foo>$ 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. $<n>" is used for multi-word ASCII type-in. It acts just like {body}lt;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 characters. # 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". $1# 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. $ (dollarsign) 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. {body}amp; 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 {body}lt;n>&<sym> {body}lt;n>&<sym> 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). <arg>' retypes <arg> in ' mode.