Consolidate license copies
[its.git] / sysdoc / uuos.111
1 Copyright (c) 1999 Massachusetts Institute of Technology
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 3 of the License, or (at
6 your option) any later version.
7
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16 ------------------------------
17
18 ITS UUOS:
19
20 This file attempts to maintain up-to-date documentation on
21 all non-symbolic ("old") system calls.  Those wonderful
22 souls who update the information in any way (additions,
23 deletions, corrections) should describe their
24 modifications in a brief note to INFO-ITS@AI so
25 that interested parties can correct their copies or
26 conceptions without needing to print or read the
27 entire file again.  For example:
28
29         :QMAIL INFO-ITS@AI I added more details to the .FOO uuo ^C
30
31 If you want to be put on the INFO-ITS mailing list,
32 just say so in a message to it.
33 -------------------------------------------------
34
35 On the PDP-10, opcodes 0 through 77 are deliberately "not
36 defined", and are called uuos ("unimplemented user operations").
37 Also, certain other opcodes are either illegal in user mode
38 or undefined (for example, I/O instructions, JRST 4,).
39
40 When an undefined instruction is executed, it "traps to 40":
41 it is stored in location 40
42 with the index and indirect fields zeroed and the address field
43 replaced by the effective address, and then the instruction
44 in 41 is executed (it is usually a subroutine call).
45 (Some instructions actually trap to 60 on KA's, but ITS contrives
46 to make them appear to have trapped to 40 just like all
47 the others).
48
49 uuos 1 through 37 are reserved for user programs.  They
50 go through the entire trap sequence remaining in user mode,
51 so it is the user's locations 40 and 41 that are used.
52 The operating system is not involved at all.
53 These uuos are called "user uuos".
54
55 The other undefined opcodes enter exec mode during the trap,
56 so that the system's 40 and 41 are used;  the PC saved by the
57 subroutine call will say "user mode" if the uuo was executed
58 in user mode, however.  These instructions are the normal way
59 of calling any PDP-10 operating system.
60
61 ITS interprets uuos 40 through 47 as monitor calls;  those
62 uuos are called "system uuos".  The bulk of this file is devoted
63 to describing how to use them.  In addition, ITS will simulate
64 some I/O instructions for the user (for example, any CONI, and
65 DATAI 0,).  All other instructions that trap to the system
66 will be signaled to the user (they are "returnable uuos").
67 For simple programs, they will cause an ILOPR interrupt
68 (%PIILO, bit 1.6 of .PIRQC).  For programs that appear able to
69 handle them, they are "returned" to the user, pretending to
70 be user uuos - that is, the system makes it appear that they had
71 trapped to the user's 40.  However, they do not act precisely
72 like user uuos:
73  1) The system can't simulate any trap instruction but
74 unindexed, direct JSR.  If the user's trap instruction is
75 not a JSR, or is indexed or indirect, the system assumes that
76 the user can't handle the returnable uuos, and causes an ILOPR
77 interrupt instead.  Also, if the AC field of the JSR is nonzero,
78 the system will interrupt instead of returning the uuo;  this
79 is a way for a program to say explicitly that it doesn't want
80 to have uuos returned, but still handle user uuos.
81  2) If the opcode in 41 is 0, the system treats it as if it
82 were a JSR.
83  3) 0 is not considered a reasonable place to JSR to.  If the
84 address field of 41 is 0, the system will interrupt instead of
85 returning the uuo.
86  4) While the addresses 40 and 41 are fixed by hardware for
87 user uuos, for system returned uuos they are not.  They must
88 always be consecutive, but the address of the first one is
89 kept in the RH of the .USET variable .40ADDR (whose initial value is,
90 of course, 40).  Thus, the user may have one handler for user uuos
91 and another for returned uuos.
92 Note that the system uses "42" for interrupts and "43" and "44"
93 for the "locks" feature;  those locations are also shifted
94 by setting .40ADDR.
95  5) Returnable UUOs have complicated interactions with DDT.
96 When proceeding from a breakpoint, DDT must simulate certain
97 instructions, including all those that can transfer control.
98 User uuos can be simulated properly, but not returnable ones
99 since DDT does not know how to decide whether they are to cause
100 ILOPRs.  So DDT treats those uuos like the typical instructions;
101 it puts the uuo in 31, a jump to 1 + the actual address of the
102 uuo in 32, and a jump to 2 + that address in 33.  It then starts
103 the job at 31.  If the returnable uuo handler does nothing with
104 the PC except possibly return to it, and does not try to examine
105 the uuo except by looking at 40, this causes no problem.  However,
106 if the uuo is followed by arguments, or if it can skip more than
107 once, or if it tries to remember the PC somewhere, the handler
108 must understand that if the PC is 31 (+1) special treatment is required.
109 In addition, the real location of the uuo will contain not the
110 uuo but a .BREAK, which will be there to implement the breakpoint.
111
112 If the .UTRAP variable of a job is nonzero, ALL instructions
113 that trap to the system will cause ILOPR interrupts - even those
114 that are usually treated as system calls.  In addition, the
115 job will not handle any of its own interrupts - they all interrupt
116 its superior.  Thus, the superior can make the job believe it is
117 running under a non-ITS environment.  User uuos are not affected.
118 The .UTRAP variable is the same as the %OPTRP bit in the LH of .OPTION.
119
120 If the %OPDEC bit in the LH of .OPTION is set, uuos 40, 41 and 47
121 (as well as those I/O instructions which ITS usually simulates)
122 become returnable uuos instead of system calls.  By a lucky
123 coincidence, those uuos, which are the only ones used by both
124 ITS and TOPS-10, are not really necessary in ITS (they are
125 .OPEN, .IOT and .ACCESS, and all have alternative forms using .CALL).
126 In this mode, all uuos used as system calls by TOPS-10 are
127 returnable.  One of the TOPS-10 simulators works by setting
128 this bit, and making .40ADDR point into the simulator where
129 it lives at the top of core (to avoid conflicting with the user
130 uuo handlers of the simulated programs).
131 \f
132 CALLS:  Overview of ITS System Calls
133
134 ITS system calls come in two kinds: the older, numerically
135 decoded, non-standardized kind, and the newer "symbolic
136 system calls" with a standard calling sequence.
137
138 Each of the numerically decoded system calls is distinguished
139 from all of the others by the values of specific fields
140 in the instruction (the opcode, and maybe the AC and address
141 fields).  Each specific system call is known as "a uuo", and
142 its name is a predefined symbol in the assembler, whose value
143 is the appropriate instruction.  For example, one uuo is
144 .ACCESS; it is distinguished by the opcode field alone, which means
145 that the AC field and address are available as arguments.
146 The symbol .ACCESS is defined as the appropriate opcode.
147 .RCHST, however, is distinguished by its opcode and its address,
148 so that only the AC field can be used as an argument.  The uuos
149 distinguished by opcode and address all have the same opcode,
150 which is called .OPER; thus, all such uuos are called ".OPER's".
151 .FDELE is distinguished by opcode and ac field, leaving the address
152 as an argument; such uuos are called ".CALL's" since they all have
153 .CALL as their opcode.  Each uuo is described individually in this file.
154
155 The symbolic system calls all use the uuo .CALL.  They are
156 distinguished by the contents of the block addressed by the .CALL,
157 which also points to the arguments.  Ths symbolic system calls
158 are described in more detail in the file .INFO.;ITS .CALLS.
159 \f
160 .ACCESS chnum,[access pointer]          set file access pointer
161
162         Sets the access pointer for the I/O channel <chnum>
163         for the next input/output operation.  This is used to
164         effect random access.  On the DSK device (and DSK-like
165         JOB devices) the access pointer is the number of "bytes"
166         from the beginning of the file.  Bytes are normally the
167         same as words, but in unit ascii mode there are five
168         seven-bit bytes per word.  In the future there may be
169         the ability to have bytes of any size from 1 to 36 bits.
170         On the USR device the access pointer is the address
171         within the job's memory.
172         Random access on the USR device can also be effected
173         via page mapping (see the .CBLK uuo and the CORBLK
174         symbolic system call).  If the channel number <chnum>
175         is variable, the symbolic system call ACCESS may
176         be used in place of the .ACCESS uuo.
177         The symbolic call RFPNTR may be used to read the current
178         access pointer for a file.
179 \f
180 .ARMOFF
181
182 This uuo was for hacking the AMF arm.  The arm no longer exists.
183 \1f
184 .ARMOVE
185
186 This uuo was for hacking the AMF arm.  The arm no longer exists.
187 \1f
188 .ARMRS
189
190 This uuo was for hacking the AMF arm.  The arm no longer exists.
191 \f
192 .ASSIGN ac,                             assign a microtape
193         ;skip if successful
194
195         The accumulator <ac> should contain the number of a
196         microtape drive.  If it succeeds, it assigns the drive
197         to the user who executed the .ASSIGN.  When a job
198         attempts to use a microtape drive,
199         it will succeed only if it has the same
200         sname as the uname of the job which did the .ASSIGN.
201         A .ASSIGN will fail only if the drive is already
202         assigned to a different user (i.e. a different uname),
203         or if an invalid drive number is given.
204         See also the .DESIGN and .RCHST uuo's.
205 \f
206 .ATTY chnum,                            assign tty to inferior
207         ;skip if successful
208
209         Puts the job in the state of wishing to pass control of
210         the tty to the direct inferior open on the specified
211         channel.  It skips if successful; it fails if the
212         channel does not have a direct inferior open, if the
213         executing job had never had the tty, or if it had not
214         been in the state of wishing to retain the tty.  If the
215         job had the tty, after the .ATTY the tty will belong
216         to the specified inferior, or one of its inferiors.
217         A job need not have the tty to do an .ATTY.
218         See the .DTTY uuo, and the .TTY user variable.
219         Also see ITS TTY.
220 \f
221 .BREAK ac,address                       breakpoint instruction, etc.
222
223         The <ac> and <address> fields of this uuo are totally
224         ignored by ITS.  The procedure executing it receives
225         a class 1 interrupt (bit 2.2 of the .PICLR user
226         variable, called %PIBRK), stopping it and interrupting
227         its superior.
228
229         The standard superior procedure, DDT, assigns
230         the following semantics to .BREAK, dependent on
231         the <ac> field (for full information see DDT ORDER):
232
233         <ac>    meaning
234         1-10    Breakpoint number <n> in the program, for <n>
235                 between 1 and 10.
236         12      Request for information transfer.
237         15      Temporary breakpoint number 1.
238         16      Request for program suspension or termination.
239         17      Temporary breakpoint number 2.
240
241         The "normal termination" instruction is .BREAK 16,160000
242         (but also see .LOGOUT).
243
244         When DDT sets a breakpoint in a program on a given
245         instruction, it replaces the opcode with .BREAK
246         and the ac field with the breakpoint number.  Thus
247         the instruction will still calculate its usual effective
248         address before breaking.  The two temporary breakpoints
249         are used for \e^N (multiple instruction proceed), etc.
250
251         .BREAK 12, is used to transfer information between
252         DDT and the executing program at the latter's request.
253         .BREAK 12, is like .SUSET in that it points
254         either to a specification word or to an AOBJN
255         pointer of such words.  Bit 4.9=0 means read, =1 means
256         write (from the program's point of view).  Writing can
257         be illegal if the ..PERMIT variable in DDT for
258         the job is set appropriately.  Bits 4.7-3.1
259         determine the type of information transferred:
260         ..RSTA  1       Starting address of program.
261         ..RLFI  2       Loaded file name.
262                         Four words: device, sname, file name 1, file name 2.
263         ..RSTP  3       (read only)  AOBJN pointer to program's symbol table
264                         in DDT.  The left half is the negative of
265                         the symbol table size.  See type 7 (..RSTB).
266         ..RSYM  4       Symbol definition.  Uses two words.
267                         Read:   first word contains squoze for symbol.
268                                 Second word receives value.
269                                 If undefined, first word is zeroed.
270                         Write:  first word contains squoze, second value.
271         ..RJCL  5       Read:   fetches command string for program.
272                                 Set by : command or via :JCL.
273                                 Always transfers at least one word of
274                                 packed ascii, then more until either a
275                                 zero word is transferred or until a
276                                 non-zero is about to be transferred into.
277                                 String is terminated by ^M if non-null.
278                         Write:  clear command string.
279         ..RPFI  6       File name defaults used for :PRINT.
280                         Four words: device, sname, file name 1, file name 2.
281         ..RSTB  7       Symbol table.  Allows transfers of many
282                         symbols in either direction.
283         ..RCON  10      (read only)  Number to symbol conversion.
284                         Uses two words.  The first should initially
285                         contain a value.  It receives squoze for
286                         a symbol, and the next word receives a delta.
287                         The value of the symbol plus the delta equals
288                         the original argument.  The lookup used by DDT
289                         for symbolic typeout is employed here.
290                         If the lookup fails, the first word receives
291                         zero and the second receives what the first held.
292         ..RXUN  11      (read only)  The XUNAME (a uname to be used for
293                         getting mail, etc.).  This is like the UNAME, but
294                         has trailing digits stripped off, etc.  This is
295                         OBSOLETE; use the .XUNAME user variable.
296         ..RXJN  12      (read only)  The XJNAME (what this job should think
297                         of as its "real" name).  This is like the JNAME,
298                         but has trailing digits stripped off, etc.  This is
299                         OBSOLETE; use the .XJNAME user variable.
300         ..RLJB  13      (read only)  Read index of previously current job.
301         ..RRND  14      Reads or writes the ..URANDM variable in DDT for
302                         this job.
303         ..RPUR  15      Unpurify page.
304         ..RHSN  16      (read only)  Ask to lookup an HSNAME from an XUNAME.
305         ..RMAI  17      (read only)  Ask to lookup user's mail file name.
306         (Symbols with names starting with "..S" exist for all those not
307          marked as read only.  For example ..RSTA==1 and ..SSTA==400001.)
308
309         Illegal .BREAK 12,'s cause DDT to give the program an
310         illegal operation interrupt (bit 1.6 in the .PIRQC
311         user variable).
312
313         .BREAK 16, is used to return to DDT in various
314         nice ways.  The effective address is decoded as follows:
315         2.9     Return from \eX.  (Do not use unless you understand it!)
316         2.8     Type extra carriage return in DDT.
317         2.7     Do not reset TTY input (effective only if
318                 executing job has the TTY).
319                 "Normal" returns to DDT should always have
320                 this bit set.
321         2.6     Kill executing job:
322                         Immediately, if it has the TTY.
323                         When it gets the TTY, if current job.
324                         Otherwise when \eJ'd to in DDT.
325                         Will print ":KILL" when killed.
326         2.5     Kill executing job:
327                         Like 2.6 if job current.
328                         Otherwise is killed silently.
329         2.6&2.5 Together mean kill executing job:
330                         Like 2.6 if job current.
331                         Otherwise kill immediately, and print
332                         JOB <jname> FINISHED on TTY.
333         2.4     Conditional breakpoint return.
334                         2.8=1 => condition true.
335                         2.8=0 => condition false.
336                 Used by DDT.  Dangerous for users to play with.
337         2.3     Don't type even a carriage return.  Don't close
338                 the currently open location.  If killing self
339                 don't type :KILL.
340         2.2-1.1 Illegal.  (Reserved for expansion.)
341
342         DDT sets the %OPCMD and %OPBRK bits for
343         its inferiors appropriately.  See the .OPTION
344         user variable.
345 \f
346 .CALL [ SETZ ? SIXBIT \name\ ? -- args -- ]     symbolic system call
347         ;skip if successful
348
349         The .CALL uuo is used to invoke a large class of
350         operations which are distinguished by a sixbit name.
351         See the file ITS .CALLS for more information.
352
353         .CALL is sometimes used in a generic sense to denote
354         the set of uuo's with the same opcode as .CALL; they
355         are distinguished by their accumulator fields:
356                 .CALL 0,                .CALL
357                 .CALL 1,                .DISMISS
358                 .CALL 2,                .LOSE
359                 .CALL 3,                .TRANAD
360                 .CALL 4,                .VALUE
361                 .CALL 5,                .UTRAN
362                 .CALL 6,                .CORE
363                 .CALL 7,                .TRANDL
364                 .CALL 10,               .DSTART
365                 .CALL 11,               .FDELE
366                 .CALL 12,               .DSTRT
367                 .CALL 13,               .SUSET
368                 .CALL 14,               .LTPEN
369                 .CALL 15,               .VSCAN
370                 .CALL 16,               .POTSET
371                 .CALL 17,               unused
372 \f
373 .CBLK ac,                               hack a core block
374         ;skip if successful
375
376         This uuo is ARCHAIC.  Its use should be avoided
377         in new programs, since the CORBLK symbolic system call
378         is much more flexible and easy to understand.
379
380         The contents of accumulator <ac> specify an operation
381         on the executing job's core.  It modifies the job's
382         page map entry for one page.  The contents of <ac>
383         should be as follows:
384         4.9     Must be zero.
385         4.3-4.1 Desired operation:
386                 0       Get page from self.
387                 1       Get absolute page.
388                 2       Get a page from the user open on
389                         the channel specified by bits 3.8-3.1.
390                 3       Get a page from the user whose user
391                         index is in bits 3.8-3.1.
392                 4       Get fresh page.
393                 5       Get public page.
394                 6       Make my page public.
395                 7       Make my page private.
396         3.9     If 1, request write permission for the page.
397                 Assumed 1 for operation 4 (fresh page).
398                 Otherwise valid only for self, public page,
399                 or direct inferior open on channel.
400         3.8-3.1 User index or USR device channel.
401                 If the executing job is a job device, then
402                 377 will refer to the job which invoked it.
403         2.9     1 = insert page in core map.
404                 0 = delete page.  If the operation is 6 or 7,
405                 this bit is ignored.  Otherwise, the operation
406                 is ignored for deletion.
407         2.8-2.1 Virtual page to be affected within the core map
408                 of the executing job.
409         1.9-1.1 Block number within source specified by
410                 bits 4.3-4.1.
411
412         Sample contents of <ac> for various operations:
413         Delete my page 43:                      0,,43000
414         Create a fresh page 217:                4400,,517000
415         Make my page 45 be read-only:           0,,445045
416         Make my read-only page 45 writable:     400,,445045
417         Make page 16 of job 34 read-only
418                 as my page 377:                 3034,,777016
419
420         This uuo is all right for hacking single pages within
421         your own core map.  To alter another job's core map,
422         or to hack many pages at once, use the CORBLK
423         symbolic system call.
424         For more information on core blocks, see ITS CORBLK.
425 \f
426 .CLOSE chnum,                           close a file
427
428         The input/output channel <chnum> is closed.  All
429         operations associated with that channel are completed.
430         For file structured devices, if another file with
431         the same name exists (if <chnum> was being used for
432         output), that file is deleted at this time and the new
433         file replaces it.
434         Any further attempts to use the channel without re-opening
435         it will cause errors.
436         .CLOSE does nothing if the channel is not open.
437         If the USR device is open on the specified channel,
438         the job is not killed by .CLOSE; it is merely made
439         to be no longer open on the channel.  To kill a USR
440         device job, the .UCLOSE uuo must be used.
441         If the channel number is a variable, the CLOSE
442         symbolic system call may be used.
443 \f
444 .CORE <number of blocks>                set core limit
445         ;skip if successful
446
447         This uuo is a relic of the old pre-paging version of ITS.
448         For applications which want to be relatively clever
449         about paging and core allocation, see the .CBLK uuo
450         and the CORBLK symbolic system call.
451         The effective address of .CORE should be a number between
452         0 and 400 octal.  The core of the procedure executing it
453         is modified as follows:
454
455         (DEFUN *CORE (N)
456                (DO ((K (// (*SUSET *RMEMT) 2000)
457                        (// (*SUSET *RMEMT) 2000)))
458                    ((= K N))
459                    (COND ((< K N) (CREATE-PAGE K))
460                          (T (DELETE-PAGE (- K 1))))))
461
462         That is, at each step a page is either added or deleted
463         at the top of the job's memory until page <n-1> is the
464         highest one in the job's memory.  Only a .CORE to
465         acquire more core can fail.  If a .CORE fails to skip,
466         some of the requested core may have been obtained,
467         though not all.
468 \f
469 .DCLOSE                                 display close
470
471         This system call releases the 340 display or the
472         E&S display, if possessed by the executing job, and
473         closes all channels on which the display is open.
474         If the display is being hacked via .DSTART, this
475         won't be any channels.  In the case of the 340, the
476         display is made available to the pdp-6.
477         If the executing job does not possess the
478         display, .DCLOSE does nothing but return.
479 \1f
480 .DCONTIN                                display continue
481
482         This system call will restart the E&S display after stopping
483         or single stepping (.DSTOP, .DSTEP).  If the display is
484         stopped because of a Display MPV, a Hit Stop, WCR stop or
485         PROG Stop, the condition will NOT be cleared and the display
486         NOT restarted.  If the display is not stopped or does not
487         belong to the executing job, no action is taken.
488
489         This system call is ignored by the 340 display.
490 \f
491 .DEMON                                  acknowledge one demon request
492 .DEMON ac,                              acknowledge <n> demon requests
493         ;skip if successful and more requests pending
494
495         As of September 1, 1976, only the DM machine has this.
496
497         If the executing job is not a demon, the uuo merely returns
498         without skipping.  If it is a demon, then either 1 or
499         the contents of the specified non-zero <ac> are subtracted
500         from the demon's request count, and the uuo skips iff the
501         resulting count is still positive.
502         See the DEMSIG, RDDMST, and STDMST symbolic system calls.
503 \f
504 .DESIGN ac,                             de-assign a microtape
505         ;skip if successful
506
507         The accumulator <ac> should contain the number of a
508         microtape drive.  It reverses the effect of a .ASSIGN
509         uuo by making the drive unassigned again.  A .DESIGN
510         will fail only if an invalid drive number is given,
511         or if the drive is assigned to some other user than
512         the one owning the job trying to do the .DESIGN.
513         It will succeed if the drive is already unassigned.
514 \f
515 .DIAL ac,               ANCIENT HISTORY dial a dataphone line
516         ;skip if successful
517
518         This uuo NO LONGER EXISTS.
519         It is documented here for historical purposes only.
520         Its function is obsolete.
521         Its opcode has been recycled as .NETAC.
522
523         The accumulator <ac> should contain a byte pointer
524         of the following form:
525                 440600,,[data](n)
526         where <n> is not an index field, but the number of
527         a dialer (0 or 1), and <data> is a series of dialing
528         bytes.  The byte string may not be longer than 5 words.
529         Each byte specifies a dialing step as follows:
530         0       End of data.
531         1-10.   Send 1-10. dialing pulses.  Pauses are supplied
532                 between digits automatically.
533         > 10.   Pause <<byte>-10.> seconds in dialing.
534         If the accumulator is zero except for the dialer number,
535         then the "break" signal is sent after any previous
536         dialing has been completed.
537         A .DIAL will fail if the dialer number is invalid,
538         if the TTY associated with the dialer (0=T07, 1=T06)
539         is in use by another job, or if the dialer is being used
540         by some other job (the other job has not done .HANGUP yet).
541         See the .DIALW and .HANGUP uuos.
542 \f
543 .DIALW dialnum,         ANCIENT HISTORY wait for dialing to finish
544         ;skip if successful
545
546         This uuo NO LONGER EXISTS.
547         It is documented here for historical purposes only.
548         Its function is obsolete.
549         Its opcode has been recycled as .NETS.
550
551         If dialer number <dialnum> is assigned to the job
552         executing the .DIALW (i.e. the job has done a .DIAL
553         but not a .HANGUP), then .DIALW skips after waiting
554         for dialing to be completed.  Otherwise it fails.
555         See the .DIAL and .HANGUP uuos.
556 \f
557 .DIETIME ac,            OBSOLETE        time until system dies
558
559         This uuo is ARCHAIC and OBSOLETE.
560         It is documented here for historical purposes only.
561         Its use in new programs is to be avoided.
562         Its function has been superseded by the SSTATU
563         symbolic system call.
564
565         The accumulator <ac> is set to the maximum time
566         (in thirtieths of a second) before ITS will go
567         down.  If the system is not planning to go down
568         (the normal case, we hope!) <ac> is set to -1.
569         See also the .REVIVE and .SHUTDN uuos.
570 \f
571 .DISMISS [new PC]                       dismiss an interrupt
572
573         Dismiss an interrupt.  The user variable .PICLR
574         is set to -1, thereby enabling interrupts, and the PC
575         receives the quantity <new PC>.
576
577         This is for the so-called "old-style" interrupt scheme.
578         See also the DISMIS symbolic system call, which
579         is ordinarily used with the "new-style" vectored
580         interrupt scheme, but may be used in either case.
581
582         Typically .DISMISS is used in this manner:
583
584         LOC 42
585                 JSR TSINT       ;pointer to interrupt handler
586         LOC 100                 ;or wherever
587         TSINT:  0               ;interrupt flags
588                 0               ;PC as of interrupt
589                 EXCH A,TSINT
590         TSINT1: TLZE A,<bit1>   ;check for various interrupts
591                  JRST <handler1> ;handlers return to TSINT1
592                 TLZE A,<bit2>
593                  JRST <handler2>
594                 . . . .
595                 MOVE A,TSINT    ;restore accumulator
596                 .DISMISS TSINT+1 ;dismiss interrupt
597
598         See ITS INTRUP for more information on interrupts.
599 \f
600 .DISOWN chnum,                          disown an inferior
601
602         An inferior job should be open on channel <chnum>.
603         The job is caused to be no longer an inferior of
604         the executing job, and is made to be the top level
605         job of a disowned job tree.  The usual reason for
606         disowning a job is so that it can continue to exist
607         after its former superior has been killed (for instance,
608         after the user who disowned it has logged out).
609         Another reason for disowning a subtree is to reown it
610         under a different superior, thus altering the shape
611         of the system's job-tree structure.
612         All channels on which the executing job has open the
613         job being disowned will be closed in the process of
614         disowning (see the .CLOSE uuo).  Disowning is illegal if
615         <chnum> does not have an inferior open, or if the
616         subtree being disowned controls the console (see the
617         .ATTY uuo).  If the jobs of the subtree have opened
618         the console, then the channels are not closed, but
619         are marked as "disowned tty"; certain operations
620         on such a channel will succeed, and others will hang
621         until the tree is re-owned and a console tty given
622         to the job.  Such channels appear to be open on
623         tty number %TINON=77 octal.
624         A disowned job is distinguished by the fact that
625         bit 4.9 of its .APRC user variable is set.
626         A disowned job never succeeds in executing the RELOAD symbolic
627         system call, even if it is the top level job in its tree.
628         When a job tree is logged out, any micro-tapes assigned
629         to the uname of that job tree are de-assigned (see the
630         .ASSIGN and .DESIGN uuo's), but only if the job tree is
631         not disowned.
632         All disowned jobs share a resource word for purposes of
633         scheduling, in the same way that all jobs in a single
634         non-disowned tree share a resource word.  Thus all disowned
635         jobs tend collectively to use no more runtime than any
636         single non-disowned job tree.
637         Furthermore, individual disowned jobs are given only 1/4
638         the priority to run as a non-disowned job.  This does
639         not apply, however, if the disowned job in question has
640         .MASTER mode, or controls the 340 display, the E&S display,
641         the vidisector, the arm, the LPT (line printer), or the
642         PLT (plotter).
643         When operating under heavy loads, the swapper prefers to
644         swap out disowned jobs rather than non-disowned jobs.
645
646         The DETACH symbolic system call makes a non-disowned tree
647         disowned.
648
649         When a non-disowned top-level job encounters
650         a fatal interrupt, the system will make it disowned and
651         print a suitable message on the system console and on
652         the job's console (if it has one).  The disowned tree
653         can then be reowned with DDT and debugged.
654 \f
655 .DMPCH ac,              OBSOLETE        mung dump check bit
656
657         This uuo is ARCHAIC and OBSOLETE.
658         It is documented here for historical purposes only.
659         Its use in new programs is to be avoided.
660         Its function has been superseded by the RDMPBT
661         and SDMPBT symbolic system calls.
662
663         The accumulator should contain a channel number
664         in the right half, which should have a disk channel
665         open on it.  The left half describes any alterations
666         to be made to the dump check bit for the open file:
667                 4.9     Set dump check bit.
668                 4.8     Clear dump check bit.
669         The state of the dump check bit (possibly after setting)
670         is returned in accumulator <ac> in bit 1.1.
671         The dump check bit is used by the magtape file backup
672         system to keep track of which files have been backed
673         up on magtape.  This bit therefore should not be
674         twiddled light-heartedly.  The "!" you sometimes see
675         in front of a date in a disk file directory is present
676         iff the dump check bit for the file is zero.
677 \f
678 .DSTART [start-addr]                    start the display
679         ; skip if successful
680
681         This system call is used to start the E&S or 340 display processor,
682         whichever one the system has.  If it has neither, the uuo is
683         an illegal operation and gives a %PIILO interrupt.
684         .DSTART assigns the display to the executing job if it is available,
685         and skips if successful.  If the display is not available
686         .DSTART does not skip.
687
688         In the case of the 340 display, the effective address of the
689         .DSTART is the address of the user's display list.  This can
690         be either a single BLKO pointer (if the word is negative), or
691         the first word in a linked list (if the word is positive).
692         The right half of each word in the linked list is zero
693         to end the list, or the address of the next word in the list.
694         The left half of each word in the linked list is the address
695         (which must be less than 400000!) of a BLKO pointer.  If this
696         address is zero, or the BLKO pointer is zero, it is ignored
697         (this allows "jump-type" entries in the list.)
698         The display will continually execute the commands pointed
699         to by this list.  It is OK to change the list, or the single
700         BLKO pointer, while the display is running, provided everything
701         always points to valid data.
702         The .DSTRTL uuo is the same as .DSTART except that it uses
703         regular AOBJN pointers instead of BLKO pointers.
704
705         In the case of the E&S display, the argument to .DSTART contains
706         in the right half, the address at which the display program will
707         start, and in the left half, a code to determine modes of
708         operation:  There are four 3-bit fields in this code:
709
710         3.1-3.3 Start mode.  Only the 3.1 bit is significant.  If set,
711                 the display is started in single step mode.
712         3.4-3.6 Action to take on Program stop.
713         3.7-3.9 Action to take on Hit stop.
714         4.1-4.3 Action to take on Memory stop.
715
716         Each of the three Action fields is decoded as follows:
717
718         0       Restart from address of the last .DSTART.
719         1       Continue after the stop condition has been reset.
720         2       Stop.
721         3       (Reserved).
722         4       Interrupt and restart.
723         5       Interrupt and continue.
724         6       Interrupt and stop.
725 \f
726 .DSTEP                                  step the E&S display
727
728         The .DSTEP call will step the display processor one instruction
729         cycle if it has been stopped (.DSTOP) or started (.DSTART) in
730         step mode.  If the display is not stopped, .DSTEP will first
731         simulate a .DSTOP.  If the display is not the executing job's,
732         no action is taken.
733
734         The .DSTEP call is ignored by the 340 display.
735 \1f
736 .DSTOP                                  stop the display
737
738         The .DSTOP call will stop the E&S or 340 display processor,
739         if the display belongs to the executing job.
740 \1f
741 .DSTRTL                                 start the display
742
743         In the case of the 340 display, this is the same as
744         .DSTART (q.v.) except that the display will use AOBJN
745         pointers instead of BLKO pointers.
746
747         In the case of the E&S display, this
748         crashes the system.  Maybe someday this will be fixed.
749 \f
750 .DTTY                                   devour the tty
751
752         .DTTY is used when a job decides that it wishes to
753         retain the tty.  It skips if it succeeds; it fails if
754         the job was already in the state of wishing to retain
755         the tty, or if it had never had the tty.  If the tty had
756         actually belonged to some (possibly indirect) inferior, it
757         will belong after the .DTTY to the job that executed it.
758         A job need not have the tty to do a .DTTY.
759         See ITS TTY for a full explanation of .DTTY.
760         See also the .ATTY uuo, and the .TTY user variable.
761 \1f
762 .DWORD [word]                           send word to E&S display
763
764         The specified word is sent to the E&S display via
765         the DATAO instruction.  The display is stopped first
766         via .DSTOP if necessary.
767
768         This system call is ignored if there is no E&S display
769         or the executing job does not own it.
770 \1f
771 .EOFC ac,               OBSOLETE        end of file character
772
773         This uuo is ARCHAIC and OBSOLETE.
774         It is documented here for historical purposes only.
775         Its use in new programs is to be avoided.
776         Its function has been obsoleted and not replaced.
777
778         Accumulator <ac> receives the eof character used to
779         pad the end of the file open on the channel specified
780         by the contents of <ac> before the uuo is executed.
781         Apparently early microtape files used 141 as the pad
782         character.
783 \1f
784 .EVAL ac,                               evaluate squoze symbol
785         ;skip if successful
786
787         Before the uuo is executed, accumulator <ac> should
788         contain the squoze code for a symbol.  This symbol
789         is looked up in the symbol table used by exec DDT
790         (the one used to debug ITS); this table contains
791         symbols defined within ITS.  The uuo fails to
792         skip if the symbol is not found; otherwise the value
793         is placed in <ac> and the uuo skips.
794
795         This uuo offers a useful method of obtaining
796         information from ITS, when combined with the .GETLOC
797         uuo or with absolute memory pages;  for example,
798         to find out how many irrecoverable disk errors there
799         have been, PEEK .EVAL's the symbol QIRRCV and examines
800         that location in the system.  Naturally, this is more
801         risky than using a system call, since the system's
802         symbols may be changed.  One protection against that
803         is to make an entry in the file AI:SYSTEM;EVSYMS >
804         mentioning which symbol is being .EVAL'ed by which
805         program.  Then, there will probably be warning from
806         ITS hackers of any change.
807 \f
808 .FDELE fblock           OBSOLETE        delete or rename file
809         ;skip if successful
810
811         This uuo is ARCHAIC and OBSOLETE.
812         It is documented here for historical purposes only.
813         Its use in new programs is to be avoided.
814         Its function has been superseded by the DELETE,
815         RENAME, and RENMWO symbolic system calls.
816
817         This uuo may be used to delete and rename files.
818         It points to a five-word block describing the
819         operation to be performed.  There are three cases.
820
821         [1] Delete a file.
822
823         fblock: SIXBIT \   dev\         ;right-justified device name
824                 SIXBIT \fname1\         ;file name 1
825                 SIXBIT \fname2\         ;file name 2
826                 0                       ;zero
827                 ---                     ;not examined
828
829         [2] Rename a file open for writing on channel <chnum>.
830
831         fblock: ---                     ;not examined
832                 0                       ;zero
833                 <chnum>                 ;channel number
834                 SIXBIT \fname1\         ;new file name 1
835                 SIXBIT \fname2\         ;new file name 2
836
837         [3] Rename an arbitrary file.
838
839         fblock: SIXBIT \   dev\         ;right-justified device name
840                 SIXBIT \fname1\         ;old file name 1
841                 SIXBIT \fname2\         ;old file name 2
842                 SIXBIT \fname1\         ;new file name 1
843                 SIXBIT \fname2\         ;new file name 2
844
845         In cases [1] and [3], if the device specified has
846         true directory structure, the .SNAME user variable
847         for the executing job is used as the directory name.
848         Also, the file names (for case [1]) or the old file
849         names (for case [3]) are subject to input translation
850         (see the TRANAD symbolic system call).
851         If the device is not file structured, .FDELE
852         succeeds and skips.  If .FDELE fails, it returns
853         an error code on channel 0 which can be retrieved via
854         the .STATUS uuo or the ERR device.
855 \f
856 .FEED chnum,                            feed paper tape
857         ;skip if successful
858
859         If device PTP (the paper tape punch) is open on
860         channel <chnum>, the uuo punches one line of blank
861         tape and skips.  Otherwise it fails and does not skip.
862 \1f
863 .GENNUM ac,                             generate number
864
865         Accumulator <ac> receives a unique generated number
866         which will not be generated again for a very long
867         time (unless the system crashes, in which case the
868         counter is reset, of course).
869         [ In ITS 1554 and later. ]
870 \1f
871 .GENSYM ac,                             generate symbol
872
873         Accumulator <ac> receives the sixbit name of a
874         unique generated symbol which will not be generated
875         again for a very long time (unless the system
876         crashes, in which case the counter is reset, of
877         course).
878 \1f
879 .GETLOC ac,                             get absolute location
880
881         The accumulator <ac> should contain
882         an absolute address in the left half and an address
883         within the executing job in the right half.
884         The contents of the absolute location specified is
885         deposited in the location specified within the job.
886         This is useful for examining locations within the
887         system.  However, if many locations are to be
888         examined, or if a location is to be examined many
889         times, it is far more efficient to map the absolute
890         page(s) containing the location(s) of interest into
891         the job's core map as read-only memory; the job
892         can then examine the locations at top speed without
893         having to go through the system uuo handler.
894         Such page mappings can be established via the .CBLK
895         uuo or the CORBLK symbolic system call.
896 \f
897 .GETSYS ac,                             get system data
898         ;skip if successful
899
900         Accumulator <ac> should contain an AOBJN pointer to a data area in
901         the user's core.  (A zero left half means the data area extends to
902         the end of core.)  Accumulator <ac+1> should contain the sixbit
903         name of a system data area.  The specified system data area is
904         transferred into the user's core in such a way that the data is
905         consistent (i.e. interrupts are inhibited in appropriate ways,
906         etc.).  If the .GETSYS is successful, <ac> is updated to point to
907         the unused part of the user's data area.
908
909         If the named data area does not exits, <ac+1> is cleared.  If the
910         area in the user's core is too small, the left half of <ac> is
911         replaced with the negative of the correct size.  In both of these
912         cases .GETSYS fails to skip.
913
914         Valid data areas are:
915         MEMORY  Memory tables.
916         UTAPE   Micro-tape variables.
917         NCPSM   Network control program socket map.
918         NCPPQ   Network control program pending RFC queue.
919         NCPHT   Network control program host table.
920         USERS   User variables for all jobs.
921         USER    User variables for job whose user index is in <ac+2>.
922                 Formerly a uname-jname pair was accepted in <ac+2>
923                 and <ac+3>, but this is no longer true (ANCIENT HISTORY).
924         GETS    Valid sixbit .GETSYS area names.
925         DEVS    Valid sixbit built-in device names.  (Doesn't include those on
926                 DEVICE directory.)
927         CALLS   Official system symbol table.  Squoze symbols and values for
928                 UUO's, .USET variables, and bits DEFSYM'ed in SYSTEM;BITS.
929         IMPX    Input multiplexor data area.
930         CLINK   Core link device variables.
931         DSYMS   Exec DDT symbol table.  Squoze symbols and values.
932         USYMS   Squoze symbols and values for .USET variables only.
933                 (Does -not- contain .RMEMT or .SMEMT, but rather .MEMT.
934                 Used by DDT when you type ".MEMT/".)
935         CHDEVS  Device names, from .RCHST table.
936         NCALLS  Valid sixbit names for symbolic system calls.
937         USRVAR  Valid sixbit user variable names for USRVAR system call.
938         TTYVAR  Valid sixbit tty variable names for TTYVAR system call.
939         ITSNMS  Valid sixbit names of all local ITS machines.
940
941         Names which used to be valid but are no longer (ANCIENT HISTORY):
942         TRANS   Translation tables.
943         OMPX    Output multiplexor data area.
944
945         PEEK used to use this uuo to get system information.
946         Nowadays it merely maps systems pages into its core
947         image, thereby gaining efficiency at some small cost
948         in accuracy.
949 \1f
950 .GSNAME ac,             ANCIENT HISTORY get system name
951
952         This uuo NO LONGER EXISTS.
953         It is documented here for historical purposes only.
954         Its function has been superseded by .SUSET of .RSNAM.
955         Its opcode has been recycled as .REALT.
956
957         Put the executing job's .SNAM user variable
958         into accumulator <ac>; this is the default directory
959         name ("system name") for the job.
960 \f
961 .GUN ac,                                gun down a job tree
962         ;skip if successful
963
964         Accumulator <ac> should contain the user index of the
965         top level job of a job tree.  That job tree is expunged
966         from the system.  All the jobs are closed and killed.
967         This is to be used as a last resort to flush hung
968         and worthless jobs.  The system program LOCK
969         contains a command which performs this operation.
970         The system job will print a message on the system console
971         describing what job was gunned and who gunned it.
972 \f
973 .HANG                                   hang until condition satisfied
974
975         The .HANG uuo is to make it easy for programs to wait for various
976         conditions.  It should be used the way a JRST .-1 would be used in
977         a stand-alone program.  Explicitly, it should be preceded by an
978         instruction that will skip or jump if the awaited condition is
979         true.  Because the system must understand that instruction, only
980         certain instructions are allowed to be used (any others cause
981         illegal operation interrupts (%PIILO, bit 1.6 of the .PIRQC user
982         variable)).  They are: SKIP, JUMP, AOS, SOS, AOJ, SOJ, CAI, and CAM
983         class instructions, -all- test instructions, CONSO and CONSZ (which
984         work only if the job is in .IOTLSR mode, and the processor is not a
985         KS10), SKIP and JFCL, which are used to hang forever (really, until
986         some interrupt routine jumps away instead of returning), SKIPA and
987         CAIA, which are used to cause rescheduling but don't actually hang,
988         and JFFO.  XCT is also allowed, but the ultimate end of the chain
989         of XCT's must be one of the instructions listed above.
990
991         In the case of hanging forever, the job is specified to be
992         desirable to swap out, since it may hang for a long time.
993
994         .HANG conditional instructions which reference only ACs are treated
995         as hang-forever, except that they don't set the desire-to-swap-out
996         flag, since the contents of the AC can't change without the job
997         being interrupted out of the .HANG.
998
999         When a job executes a .HANG, the system effectively executes the
1000         preceding instruction at each schedule to decide whether the job
1001         may be run (cf. the .FLS user variable).  If the job is
1002         interrupted, the interrupt routine will find that the saved PC
1003         points to the instruction before the .HANG instruction.  It may
1004         dismiss normally, in which case the .HANG will be executed again
1005         unless the condition has become true (of course, the interrupt
1006         routine may do something to make the condition true).
1007
1008         .HANG takes care to be certain that any side effects of the
1009         instruction will be performed when the condition finally becomes
1010         true.  .HANG does this by always exiting by jumping to .-1.  Thus
1011         an AOSE instruction followed by a .HANG really will increment the
1012         referenced location after it becomes -1, JFFO AC, followed by .HANG
1013         really will store a bit number into AC+1, and TLZN followed by
1014         .HANG really will clear out the bit after it comes on.
1015
1016         While a job is waiting in a .HANG, the system does not re-examine
1017         the AC used by the conditional instruction each time it executes
1018         that instruction; it uses what was in the AC when the .HANG was
1019         entered.  However, there is no way for this AC to change without
1020         the job being interrupted of the .HANG so it can change it, or
1021         PCLSRed out when it's superior changes it.  Also, the effective
1022         address calculation is not repeated, and if the actual instruction
1023         supplied is an XCT, the XCT'd instruction is not re-fetched.
1024         Therefore, it does not work to expect the condition to become true
1025         because the contents of a memory location indirected through or
1026         XCTed will change.  Because an interrupt always causes the .HANG to
1027         be redone, it does work to expect the interrupt routine to change
1028         the AC or the indirect pointer in order to make the instruction
1029         skip.
1030
1031         In the special case of waiting for a specific interval of time to
1032         pass, the .SLEEP uuo (q.v.) may be useful.  In the special case of
1033         waiting for a network socket to change state, the NETBLK symbolic
1034         system call may be useful.
1035
1036 .HANG ac,                               .HANG with timeout
1037
1038         [In ITS version 1622 and later]
1039
1040         .HANG with a non-zero AC field acts as the disjuction of .HANG and
1041         .SLEEP, allowing a program to wait either for a condition to become
1042         true or for some time to pass.  The contents of accumulator <ac>
1043         specify when the .HANG should stop waiting for the condition to
1044         become true by returning to the instruction following the .HANG.
1045         If non-negative, it is a length of time to wait in thirtieths of a
1046         second.  If negative, it means to wait until the system TIME
1047         variable exceeds its absolute value.  
1048
1049         As with .SLEEP, if the job is interrupted while .HANGing, the
1050         accumulator will be found to contain the appropriate negative
1051         number to allow the .HANG to be resumed properly when the interrupt
1052         is dismissed.
1053
1054         If .HANG times out before the awaited condition becomes true, the
1055         accumulator will contain 0.  This is the only case in which .HANG
1056         will exit to the following instruction.
1057
1058         If the awaited condition becomes true, so that the previous
1059         instruction skips or jumps away, the accumulator will contain the
1060         negative of the time at which the .HANG would have timed out.
1061
1062 \f
1063 .HANGUP dialnum,        ANCIENT HISTORY hang up a dialed line
1064         ;skip if successful
1065
1066         This uuo NO LONGER EXISTS.
1067         It is documented here for historical purposes only.
1068         Its function is obsolete.
1069         Its opcode has been recycled as .REVIVE.
1070
1071         This uuo was used to hang up on a line which had
1072         been dialed by the .DIAL uuo.
1073 \f
1074 .IFSET ac,                              if location contains what I think, set it
1075         ;skip if successful
1076
1077         The accumulator <ac> should contain an absolute 18.-bit
1078         address in the right half and a pointer to a two-word block
1079         in the left half.  The first word of the two-word block
1080         contains a test word, and the second a new value.
1081
1082         If the absolute core location specified contains exactly
1083         the quantity specified by the test word, then the contents
1084         of that location are replaced by the new value specified,
1085         and the .IFSET skips.  If the contents of the location
1086         are not the same as the test word, the .IFSET fails.
1087
1088         This is similar to the .SETLOC uuo, but provides a
1089         measure of safety if the contents of the location
1090         may be volatile.  Like the .SETLOC uuo, if the .IFSET
1091         succeeds the system job prints out a message on the
1092         system console detailing the old and new contents
1093         of the location and who modified it.
1094 \f
1095 .IOPDL                                  reset I/O pdl
1096
1097         The I/O channel pdl of the executing job is reset.
1098         Entries on the I/O pdl contain the channel number
1099         from which they were pushed; .IOPDL is equivalent
1100         to just enough .IOPOP's (possibly none) to clear
1101         the I/O pdl, popping each entry into the channel
1102         it was pushed from.
1103         See the .IOPUSH and .IOPOP uuos, and the .IOC, .IOS,
1104         .IOP user variables.
1105 \1f
1106 .IOPOP chnum,                           pop I/O channel
1107
1108         This uuo is the inverse of the .IOPUSH uuo.
1109         The top entry of the I/O pdl is popped into
1110         channel <chnum>, which may be a different channel
1111         from the one the entry was pushed from.
1112         A .CLOSE is first performed on the channel popped into.
1113         If the channel originally pushed was a closed channel,
1114         then after popping channel <chnum> will be closed.
1115         If the I/O pdl has no entries on it, IOC error
1116         number 5 is signaled on channel <chnum>, giving the
1117         job a class 2 interrupt (%PIIOC, bit 1.9 of the .PIRQC
1118         user variable).
1119
1120         If the channel number is variable, the IOPOP symbolic
1121         call may be used.
1122
1123         See the .IOPUSH and .IOPDL uuos, and the .IOC, .IOS,
1124         and .IOP user variables.
1125         See also the .UCLOSE uuo for a discussion of what
1126         occurs when a job open on a pushed channel is killed.
1127 \1f
1128 .IOPUSH chnum,                          push I/O channel
1129
1130         The channel <chnum> is pushed onto the I/O pdl
1131         for the executing job.  A channel may be pushed
1132         whether or not it is actually open; if it is open,
1133         transactions on the channel are suspended when
1134         it is pushed, and any transfer on that channel is
1135         inaccessible until the pushed entry is popped
1136         again.  The error status and access pointer are
1137         correctly saved as well.  The channel number <chnum>
1138         is also saved in the pdl entry for use by the .IOPDL uuo.
1139         After the channel has been pushed it is returned to
1140         a non-open state (this is not the same as being closed
1141         since closing implies terminating the I/O transaction).
1142         The I/O pdl for each job has room for eight entries;
1143         if all are in use .IOPUSH will signal IOC error
1144         number 6 on channel <chnum>, giving the job a
1145         class 2 interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable).
1146
1147         If the channel number is variable, the IOPUSH
1148         symbolic call may be used.
1149
1150         See the .IOPOP and .IOPDL uuos, and the .IOC, .IOS,
1151         and .IOP user variables.
1152         See also the .UCLOSE uuo for a discussion of what
1153         occurs when a job open on a pushed channel is killed.
1154 \f
1155 .IOT chan,[foo]                         input/output transfer
1156
1157         Input or output is performed, according to the device
1158         open on the specified channel and the mode in which it
1159         was opened.  If an error occurs, any of several IOC
1160         errors may occur, giving the job a class 2 interrupt
1161         (%PIIOC, bit 1.9 of the .PIRQC user variable.)
1162
1163         In "unit mode", foo is the datum to be transferred
1164         in or out.  (In the case of input, the word pointed
1165         to by the effective address of the .IOT is modified.)
1166
1167         In "block mode", foo is an AOBJN pointer to the data
1168         to be transferred in or out.  The left half is the
1169         negative of the number of words, the right half is
1170         the address of the first word.  The pointer is updated
1171         as the transfer proceeds.  When the .IOT returns the
1172         pointer will have been fully counted out, that is
1173         the left half will be zero, except in the case of input
1174         that stops because the end of the file was reached.
1175
1176         In the case of block mode on an intrinsically character
1177         device, such as TTY, bits 4.9-4.7 of the pointer are
1178         fiddled to indicate which byte in the word is being
1179         processed.
1180
1181         The VID, NVD, and IMX devices handle .IOT in a non-standard
1182         way because they do both input and output at the same time.
1183
1184         The symbolic system calls IOT and SIOT are versions of
1185         .IOT which have additional features.
1186 \f
1187 .IOTLSR ac,                             iot loser mode
1188
1189         This uuo is used to request permission from
1190         the system to run in user I/O mode (bit 4.3 of the PC).
1191         In this mode a program is in user mode (and thus is
1192         subject to user mode page mapping), but may perform
1193         I/O instructions without trapping to the system.
1194         This facility must naturally be used with discretion.
1195         It should be noted that ITS will interpretively
1196         simulate most I/O instructions anyway, if it thinks
1197         that the operation will not harm the time-sharing
1198         system.  For example, one may use DATAI to read the
1199         console switches even when not in .IOTLSR mode.
1200         This simulation is slower than direct execution
1201         of I/O instructions, but much safer.
1202
1203         If bit 4.9 (the sign bit) of accumulator <ac> is zero,
1204         .IOTLSR mode is relinquished, even if it was not formerly
1205         possessed by the job.
1206         If bit 4.9 is one, then the executing job is granted .IOTLSR
1207         mode, and the system job prints a message on the system
1208         console to document the fact.
1209 \f
1210 .IPDP chnum,                            interrupt PDP-6
1211
1212         Channel <chnum> should have the PDP-6 open as an
1213         inferior procedure; if it does not, .IPDP does nothing.
1214         Otherwise the PDP-6 receives an interrupt.
1215
1216         The PDP-6 can also interrupt the PDP-10; when this occurs
1217         a job with the PDP-6 open as an inferior will receive
1218         an interrupt if enabled for it.  See the .IFPIR
1219         user variable for PDP-6 channel interrupts.
1220
1221         The interface between the PDP-6 and the PDP-10
1222         is device 20 octal.
1223         The interrupts are given via a CONO:
1224         1.5     Interrupt other processor.
1225         1.4     Clear interrupt flag.
1226         1.3-1.1 Priority interrupt assignment.
1227         The bits read by CONI are as follows:
1228         1.4     Interrupt flag.
1229         1.3-1.1 Clear interrupt flag.
1230 \f
1231 .ITYI ac,               OBSOLETE        input tty interrupt
1232         ;skip if successful
1233
1234         This uuo is ARCHAIC and OBSOLETE.
1235         It is documented here for historical purposes only.
1236         Its use in new programs is to be avoided.
1237         Its function has been superseded by the .ITYIC uuo.
1238
1239         This uuo is exactly like .ITYIC except that it applies
1240         only to the job's console, if any.  This uuo is to be
1241         flushed eventually.
1242 \1f
1243 .ITYIC ac,                              input tty interrupt on channel
1244         ;skip if successful
1245
1246         The specified accumulator <ac> should contain the
1247         number of a channel which is open for tty input.
1248         If an interrupt character is pending in that tty's
1249         input buffer, that character replaces the channel number
1250         in <ac> and the .ITYIC skips.  It will fail if the
1251         channel is bad, if it does not have a tty open, if the
1252         tty is the job's console but the job does not possess it,
1253         or if there is no interrupt character pending.
1254         If the job does not possess its console and the job's
1255         %TBINT bit is set in the .TTY user variable, the job
1256         receives a class 2 word 1 interrupt (bit 4.2 in the
1257         .PIRQC user variable).
1258
1259         This uuo is typically used in an interrupt routine
1260         invoked by bit 1.1 (%PITYI) in the .PIRQC user variable or by
1261         a word 2 I/O interrupt on a tty input channel.
1262         If the .ITYIC does not skip the program should ignore
1263         the interrupt entirely; this can happen due to certain
1264         timing screws related to passing the console around
1265         among several jobs.
1266
1267         See the TTYGET and TTYSET symbolic system calls, which
1268         manipulate bits relevant to interrupt characters.
1269         See the WHYINT system call, which (in the case of
1270         TTY channels) is another way to do the same function
1271         as .ITYIC.
1272         See the .PIRQC and .TTY user variables.
1273         See ITS TTY for a complete explanation of .ITYIC.
1274 \1f
1275 .LISTEN ac,                             listen to tty
1276
1277         If the job possesses its console, .LISTEN waits
1278         for any output to be completed, and then returns the
1279         number of input characters pending in the input
1280         buffer.  If the job does not possess a console, zero is
1281         returned.
1282         See also the LISTEN symbolic system call.
1283 \f
1284 .LOGIN  ac,             ANCIENT HISTORY log in
1285         ;skip if successful
1286
1287         This uuo NO LONGER EXISTS.
1288         It is documented here for historical purposes only.
1289         Its function has been superseded by the LOGIN symbolic system call.
1290         Its opcode has been recycled as .DEMON.
1291
1292         Accumulator <ac> contains the sixbit name to log in as.
1293         Attempting to log in with a uname equal to 0 or -1 fails,
1294         as does attempting to log in when already logged in.
1295 \1f
1296 .LOGOUT                                 log out
1297
1298         The executing job and all direct inferiors are killed,
1299         providing that it is the top-level job of its job tree.
1300         All resources used by such jobs are freed.  If the job
1301         tree was console-controlled, the system job will print
1302         a "console free" message on the freed console.
1303
1304         If the executing job is not top-level, .LOGOUT with zero
1305         in the AC field merely returns without skipping.
1306         (An inferior job may not commit suicide without the consent
1307         of its superior.)  .LOGOUT with a nonzero AC field will
1308         cause a fatal %PIBRK interrupt which will inform the superior
1309         that the job wants to be killed.  If the superior is DDT,
1310         it will kill the job.  Here is how a program should exit:
1311
1312                 SKIPE DEBUG             ;optional debugging aid:
1313                  .VALUE                 ; job hangs if being debugged
1314                 .LOGOUT 1,              ;log out or be killed.
1315 \f
1316 .LOSE lossage-code                      report lossage
1317
1318         The job's Program Counter is set to the address of the
1319         .LOSE minus one, the job's .VAL user variable is set
1320         to the new PC,,the magic bits, and the
1321         job is given a %PILOS interrupt.  If the job does not
1322         enable this interrupt, and it's superior is DDT, a
1323         helpful error message will be printed.
1324
1325         The magic bits are documented in DDT ORDER.
1326         The most useful ones are 0 for a random error,
1327         1000 to ask DDT to type the error message corresponding
1328         to the most recent system call error return, and
1329         1400 if DDT should attempt to print the names of
1330         the file that the call was opening/referring to.
1331
1332         The lossage codes are defined by DDT's interpretation of them.
1333         The defined values are:
1334
1335         %LSSYS==1000    The last error code returned by a failing
1336                 system call describes the problem.
1337
1338         %LSFIL==1400    The last error code returned by a failing
1339                 system call, together with the name of the file
1340                 it was operating on, describe the problem.
1341                 That system call should be right before the .LOSE.
1342                 DDT will decode it to determine the filenames
1343                 (if it is an OPEN) or the channel number and then
1344                 the filenames via an RFNAME.
1345
1346         %LSSYS+errcode  Means that the system call error code
1347                 <errcode> describes the problem.
1348
1349         %LSFIL+errcode  Means that the error code <errcode>
1350                 together with the filenames being used
1351                 describe the problem.
1352
1353         1+.LZ <interrupt bit>
1354                 Means that the error should be handled as if it
1355                 were a fatal interrupt on the specified interrupt
1356                 bit.  For example, the lossage code 1+.LZ %PIMPV
1357                 will to cause DDT to print out an MPV error message.
1358                 These lossage codes are more useful with the
1359                 LOSE and DISMIS symbolic system calls.
1360
1361         0       Signifies some other nondescript error condition.
1362
1363         The usual way of using this uuo is to put it
1364         after a system call which is expected always to
1365         skip.  If it fails to skip, DDT will print an error
1366         message based on what the system call is and what
1367         it was failing to do (if you said 1000 or 1400).
1368         Proceeding the job will retry the call.
1369
1370         See also the LOSE symbolic system call.
1371
1372         This call never gets an error, and never returns.
1373 \f
1374 .LTPEN block                            hack light pen
1375
1376         This uuo hacks the light pen on the 340 display.
1377         The address <block> should be the start of a six-word
1378         block.  The first word controls the mode:
1379         4.9     0 => ignore other bits, 1 => examine them.
1380         3.1     1 => hang until light pen seen at least once.
1381         1.1     Used to set the multiple sighting mode (1 = on).
1382         The six words of data returned are as follows:
1383         wd 0    The word read by DATAI from the 340 display at
1384                 the last light pen interrupt.
1385         wd 1    Number of times the light pen interrupted
1386                 since the last .LTPEN uuo.
1387         wd 2    Sum of all Y coordinates since the last .LTPEN uuo.
1388         wd 3    Sum of all X coordinates since the last .LTPEN uuo.
1389         wd 4    The current linked display list pointer.
1390         wd 5    The current BLKO display pointer.
1391         If the job does not currently possess the 340 display,
1392         words 0 and 1 are set to zero.
1393
1394         If the system has no 340, .LTPEN is ignored.    
1395 \1f
1396 .MASTER ac,                             request/release master mode
1397         ;skip if successful
1398
1399         Accumulator <ac> should have bit 4.9=1 to request
1400         master mode, or =0 to release it.  Releasing master
1401         mode always succeeds, even if the job did not have it.
1402         Requesting master mode succeeds if the job already has
1403         master mode, or if it has control of its tty (as determined
1404         by bit 4.9 (%TBNOT) of the .TTY user variable).
1405         Only one job at a time may have master mode; thus requesting
1406         master mode may imply taking it from some other job.
1407
1408         A job in master mode gets double priority for run time;
1409         that is, it tends to get twice as much run time as any other
1410         job competing for run time.  Furthermore, it has priority
1411         in grabbing the 340 display from another user.  (The precise
1412         algorithm for grabbing the 340 is actually a function of
1413         who has master mode and of the %TT340 and %TT3HP bits of
1414         the TTYTYP variables of the jobs involved.)
1415
1416         Master mode should be used only when absolutely necessary.
1417         Needless use of it is considered to be antisocial, and may
1418         be grounds for harassment.
1419 \f
1420 .MTAPE ac,                              hack magtape
1421         ;skip if successful
1422
1423         Accumulator <ac> should have a channel number in the
1424         left half and an address in the right half.
1425         (An illegal channel number causes an illegal operation
1426         interrupt (%PIILO, bit 1.6 of the .PIRQC user variable).)
1427         The channel should have device MTn open on it.
1428         The address should point to a word with a signed count <n>
1429         in the left half and a function code in the right half.
1430         Valid function codes are:
1431         0       Hang until tape motion done.
1432         1       Rewind tape.
1433         2       Rewind and dismount.
1434         3       Write end-of-record (i.e. force current output buffer).
1435         4       Write three inches of blank tape.
1436         5       Write end-of-file.
1437         6       Space over <n> records (negative => backwards).
1438                 Illegal for output channel.
1439         7       Space over <n> files (negative => backwards).
1440                 Illegal for output channel.
1441         10      Space to end-of-tape.
1442         11      Stop all commands on this channel.
1443         12      Set block size for writing to <n> words.
1444         13      Return block size in <ac>.  For reading, this is the size
1445                 of the record most recently swallowed by an IOT.
1446         This operation may trigger one of the following IOC errors,
1447         causing an interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable):
1448         1       ILLEGAL HARDWARE OPERATION ATTEMPTED
1449         3       NON-RECOVERABLE DATA ERROR
1450         9       DEVICE FULL
1451 \f
1452 .NDIS ac,                               display <n> times
1453         ;skip if successful
1454
1455         This uuo is intended for use in taking pictures of
1456         the 340 display screen.  It sets a display control
1457         variable from the contents of accumulator <ac>.
1458         This variable has no effect if negative, but if
1459         zero it inhibits display completely, and if positive
1460         is decremented by 1 each time the current display
1461         block or list of blocks is displayed.  This call
1462         fails to skip if the job does not possess the 340 display.
1463
1464         On systems which don't have a 340, .NDIS is ignored.
1465 \f
1466 .NETAC chnum,           OBSOLETE        accept network connection
1467         ;skip if successful
1468
1469         This UUO is obsolete.
1470         It is documented here for historical purposes only.
1471         It now ALWAYS fails to skip.
1472
1473         Channel <chnum> should be be a network channel in
1474         the "RFC received while listening" (%NSRFC) state (see
1475         the ITS NCP file.)
1476         This is used to accept a connection on a socket opened
1477         with mode bit 1.5=1 (see the OPEN symbolic system call).
1478         An RFC is sent back and the channel put into the
1479         "connection open" state.
1480
1481         To reject a connection, the channel should be closed with
1482         either the .CLOSE uuo or the CLOSE symbolic system call.
1483 \1f
1484 .NETINT chnum,          OBSOLETE        network interrupt
1485
1486         This UUO is obsolete.
1487         It is documented here for historical purposes only.
1488         It is now always a no-op.
1489
1490         Sends an interrupt out on the network socket associated
1491         with channel number <chnum>, which should be open on
1492         the NET device.  If the local socket number is even
1493         (receiving), an INR message is sent; otherwise, INS
1494         is sent.
1495 \1f
1496 .NETS chnum,                            network send
1497
1498         Channel number <chnum> should be open for network
1499         output.  The .NETS uuo forces the current output buffer
1500         to be sent.  If the channel is open in the wrong direction,
1501         IOC error 1 (ILLEGAL HARDWARE OPERATION ATTEMPTED) will occur,
1502         possibly giving the user an IOC interrupt (%PIIOC, bit 1.9 of
1503         the .PIRQC user variable).
1504 \f
1505 .OPEN chnum,block                       open a file
1506         ;skip if successful
1507
1508         This uuo is semi-obsolete.  The OPEN symbolic system
1509         call is somewhat more flexible and consistent.
1510         However, it is still reasonable to use .OPEN for
1511         devices which do not use directory names.
1512
1513         A file is opened on the channel specified by <chnum>.
1514         That channel number is then used to specify the file
1515         on all further I/O transactions on that file.
1516         The address <block> should be the first of several
1517         locations:
1518         wd 0    <mode bits>,,<device name>
1519         wd 1    File name 1, if applicable.
1520         wd 2    File name 2, if applicable.
1521         wd 3    For the NET device, the foreign host number.
1522         The directory name, if applicable, is taken from the
1523         .SNAME user variable.  Note that the device name may
1524         be only three characters.  The mode bits are as for
1525         the OPEN symbolic system call.
1526
1527         If bits 4.9-4.7 of word 0 contain 2, then a link is
1528         created.  Words 1-5 are then as follows:
1529         wd 1    From file name 1.
1530         wd 2    From file name 2.
1531         wd 3    To file name 1.
1532         wd 4    To file name 2.
1533         wd 5    To sname.
1534         .OPEN should never be used in this way in new programs;
1535         use the MLINK symbolic system call instead.
1536
1537         If the .OPEN fails to skip, an error code as for
1538         .CALL OPEN will be returned on channel <chnum>.
1539 \f
1540 .OPER                                   random operation
1541
1542         The term .OPER is used to refer to a class of uuo's
1543         which all have the same op-code and are decoded by
1544         the value of their effective address.  Those .OPER's
1545         which take arguments generally specify either an
1546         accumulator or an I/O channel number in the accumulator
1547         field of the .OPER.
1548         If the effective address is not a valid .OPER number,
1549         then the job executing the .OPER receives an illegal
1550         operation interrupt (%PIILO, bit 1.6 of the .PIRQC user
1551         variable).
1552         A list of currently valid .OPER's is given below in
1553         numerical order.
1554
1555         .OPER 0         illegal
1556         .OPER 1         .ITYI
1557         .OPER 2         .LISTEN
1558         .OPER 3         .SLEEP
1559         .OPER 4         .SETMSK
1560         .OPER 5         .SETM2
1561         .OPER 6         .DEMON
1562         .OPER 7         .CLOSE
1563         .OPER 10        .UCLOSE
1564         .OPER 11        .ATTY
1565         .OPER 12        .DTTY
1566         .OPER 13        .IOPUSH
1567         .OPER 14        .IOPOP
1568         .OPER 15        .DCLOSE
1569         .OPER 16        .DSTOP
1570         .OPER 17        .RDTIME
1571         .OPER 20        .RDSW
1572         .OPER 21        .GUN
1573         .OPER 22        .UDISMT
1574         .OPER 23        .GETSYS
1575         .OPER 24        .IPDP
1576         .OPER 25        .GETLOC
1577         .OPER 26        .SETLOC
1578         .OPER 27        .DISOWN
1579         .OPER 30        .DWORD
1580         .OPER 31        .DSTEP
1581         .OPER 32        .GENSYM
1582         .OPER 33        .LOGOUT
1583         .OPER 34        .REALT
1584         .OPER 35        .WSNAME
1585         .OPER 36        .UPISET
1586         .OPER 37        .RESET
1587         .OPER 40        .ARMOVE
1588         .OPER 41        .DCONT
1589         .OPER 42        .CBLK
1590         .OPER 43        .ASSIGN
1591         .OPER 44        .DESIGN
1592         .OPER 45        .RTIME
1593         .OPER 46        .RDATE
1594         .OPER 47        .HANG
1595         .OPER 50        .EOFC
1596         .OPER 51        .IOTLSR
1597         .OPER 52        .RSYSI
1598         .OPER 53        .SUPSET
1599         .OPER 54        .PDTIME
1600         .OPER 55        .ARMRS
1601         .OPER 56        .UBLAT
1602         .OPER 57        .IOPDL
1603         .OPER 60        .ITYIC
1604         .OPER 61        .MASTER
1605         .OPER 62        .VSTST
1606         .OPER 63        .NETAC
1607         .OPER 64        .NETS
1608         .OPER 65        .REVIVE
1609         .OPER 66        .DIETIME
1610         .OPER 67        .SHUTDN
1611         .OPER 70        .ARMOFF
1612         .OPER 71        .NDIS
1613         .OPER 72        .FEED
1614         .OPER 73        .EVAL
1615         .OPER 74        .REDEF
1616         .OPER 75        .IFSET
1617         .OPER 76        .UTNAM
1618         .OPER 77        .UINIT
1619         .OPER 100       .RYEAR
1620         .OPER 101       .RLPDTM
1621         .OPER 102       .RDATIM
1622         .OPER 103       .RCHST
1623         .OPER 104       .RBTC
1624         .OPER 105       .DMPCH
1625         .OPER 106       .SWAP
1626         .OPER 107       .MTAPE
1627         .OPER 110       .GENNUM
1628         .OPER 111       .NETINT
1629 \f
1630 .PDTIME ac,                             PD time
1631
1632         Returns in accumulator <ac> the time since the beginning of the
1633         year, measured in sixtieths of a second.  If the time is not known,
1634         -1 is returned.  PD = Paul DeCoriolis, who hacked the original
1635         clock on which this was based.  Said clock ceased to work many
1636         years ago.
1637 \1f
1638 .POTSET
1639 \1f
1640 .RBTC ac,                               robot console switches
1641
1642         The contents of accumulator <ac> are sent to the
1643         robot console (device 514) with a DATAO.  After a short
1644         delay the result of a DATAI are returned in <ac>.
1645
1646         What the heck is device 514???
1647 \f
1648 .RCHST ac,              OBSOLETE        read channel status
1649
1650         This uuo is ARCHAIC and OBSOLETE.
1651         It is documented here for historical purposes only.
1652         Its use in new programs is to be avoided.
1653         Its function has been superseded by the RCHST
1654         and RFNAME symbolic system calls.
1655
1656         Accumulator <ac> should contain a channel number
1657         in the left half and an address in the right half
1658         pointing to a block of several words.
1659         The executing job receives an illegal operation
1660         interrupt (%PIILO, bit 1.6 of the .PIRQC user variable)
1661         if the channel number is illegal.
1662
1663         The block of words is filled with information
1664         about the status of the channel.  The general
1665         pattern of this information is as follows, though
1666         not all devices adhere to it strictly:
1667         wd 0    Device name in the right half.
1668         wd 1    First file name, if applicable.
1669         wd 2    Second file name, if applicable.
1670         wd 3    Sname (directory name), if applicable.
1671         wd 4    Access pointer.  Measured in words.
1672                 A byte pointer if in character mode, for some devices.
1673                 -1 if not randomly accessible.
1674         wds 5-n Other data.  May be garbage, or not stored,
1675                 depending on the device as specified by word 0.
1676
1677         See the RCHST symbolic system call for details
1678         of what information is returned for specific devices.
1679         Wd 0 from .RCHST has in its RH the LH of symbolic
1680         RCHST's 1st value.  Wds 1-4 from .RCHST are the same as
1681         the 2nd-5th values returned by symbolic RCHST.
1682         Wds 5 and up from .RCHST are the same as values 7 and up
1683         of symbolic RCHST, except that they are not stored for
1684         devices which do not return significant information in
1685         them.  Note that value 6 of the RCHST symbolic system
1686         call is not available from .RCHST.
1687 \f
1688 .RD500 ac,              ANCIENT HISTORY read device 500
1689
1690         This uuo NO LONGER EXISTS.
1691         It is documented here for historical purposes only.
1692         Its function is obsolete.
1693         Its opcode has been recycled as .IPDP.
1694
1695         Device 500 formerly purported to be some kind of clock.
1696 \1f
1697 .RD710 ac,              ANCIENT HISTORY read device 710
1698
1699         This uuo NO LONGER EXISTS.
1700         It is documented here for historical purposes only.
1701         Its function is obsolete.
1702         Its opcode has been recycled as .HANG.
1703
1704         Device 710 used to be a kind of clock on the PDP-6.
1705         This uuo read a 24.-bit quantity from this clock,
1706         measured in 4-microsecond ticks.
1707 \1f
1708 .RD760                  ANCIENT HISTORY
1709
1710         This uuo NO LONGER EXISTS.
1711         It is documented here for historical purposes only.
1712         Its function is obsolete.
1713         Its opcode has been recycled as .DWORD.
1714
1715         Device 760 of the PDP-6 used to be used for temporary
1716         direct sense hookups.  (For example, the low six
1717         bits controlled lights on the hand of the AMF arm.)
1718         This uuo returned the result of a DATAI on this device.
1719 \f
1720 .RDATE ac,                              read date
1721
1722         The current date is returned in accumulator <ac> as a
1723         word of sixbit characters "YYMMDD", where YY is the
1724         year (modulo 100.), MM is the month, and DD is the day,
1725         all as two-digit decimal numbers.
1726         If the system does not know what the current date is,
1727         -1 is returned.
1728 \1f
1729 .RDATIM ac,                             read date and time
1730
1731         This is exactly like the sequence
1732                 .RTIME ac,
1733                 .RDATE ac+1,
1734         except that the timing error involved with crossing
1735         midnight between execution of the two uuo's is avoided.
1736         Thus accumulator <ac> receives the time of day as a word
1737         of sixbit "HHMMSS", where HH is the hour (in 24.-hour
1738         notation), MM is the minute, and SS is the second,
1739         all as two-digit decimal numbers.
1740         Accumulator <ac+1> receives the date as a word of sixbit
1741         characters "YYMMDD" where YY is the year (modulo
1742         100.), MM is the month, and DD is the day,
1743         all as two-digit decimal numbers.
1744         If one of the quantities is not known by the system,
1745         -1 is returned for that quantity.
1746 \1f
1747 .RDSW ac,               OBSOLETE        read switches
1748
1749         This uuo is ARCHAIC and OBSOLETE.
1750         It is documented here for historical purposes only.
1751         Its use in new programs is to be avoided.
1752         Its function has been superseded by DATAI.
1753
1754         The contents of the data switches on the PDP-10 console
1755         are returned in accumulator <ac>.
1756         The same effect can be achieved by using DATAI 0,<ac>
1757         (or any arbitrary location instead of <ac>), which, if
1758         the job is not in .IOTLSR mode, ITS will interpret
1759         specially and simulate.
1760         Neither .RDSW nor DATAI works correctly on KL10s.
1761         Hopefully this will not inconvenience anyone.
1762         On KS10s .RDSW no longer exists.
1763 \1f
1764 .RDTIME ac,                             read system time
1765
1766         The time since the system started running, measured in
1767         thirtieths of a second, is returned in accumulator <ac>.
1768         Thus the difference between two successive values gives
1769         the amount of real time which passed between the two
1770         executions of .RDTIME.  This time does not include time
1771         during which the system was temporarily down, for instance
1772         stopped at a bug halt from which it was later continued
1773         by a system hacker.
1774 \f
1775 .REALT ac,                              real time hackery
1776         ;maybe skip on success (see below)
1777
1778         This uuo controls a fairly complex facility allowing
1779         a job to get good service in real time.  The contents
1780         of the specified accumulator are decoded as follows:
1781         %RLFLS  4.9     Turn off old clock rate, zero the tick count,
1782                         and release the real time facility.
1783         %RLSET  4.8     Turn on new clock rate.
1784         %RLUSR  4.7     Attempt to seize the real time facility.
1785         %RLNPS  4.6     Do not settle for pseudo-real time status.
1786         %RLPSD  4.5     Insist on pseudo-real time status.
1787         %RLBLK  4.4     Block me except during high priority period.
1788         %RLGET  4.3     Read into words 2-3 (see below) before
1789                         interpreting the other bits.
1790         4.2-3.1 Reserved.  Should be zero.
1791         2.9-1.1 Pointer to four word block:
1792                 wd0     Frame time in sixtieths of a second.
1793                         Must fit in the right half.
1794                 wd1     Priority time in sixtieths of a second.
1795                         Must be less than 15 octal, and less
1796                         than or equal to half the contents
1797                         of word 0.
1798                 wd2     If bit 4.3 on, set the right half to
1799                         the frame time, and the left half to
1800                         the tick count since last examined.
1801                 wd3     If bit 4.3 on, set the right half to
1802                         the high priority time, and the left
1803                         half to 0 if currently at low priority
1804                         or -1 if currently at high priority.
1805
1806         The real time facility is interpreted as follows:
1807         real time is broken up into cycles, each the number
1808         of sixtieths of a second in length specified by the frame
1809         time.  At the beginning of each frame, the %PIRLT
1810         bit (4.8) in the job's .PIRQC user variable is turned
1811         on.  This causes an interrupt if the corresponding
1812         bit is on in the .MASK user variable.
1813           Within each frame, the first <n> sixtieths are
1814         high priority time for the job with the real time
1815         facility, where <n> is the specified high priority time.
1816         If a job has the facility, presently has high priority,
1817         and otherwise wants to run, then it is scheduled above
1818         all other jobs.  This guarantees that a job will
1819         get a certain amount of run time at specified intervals;
1820         this is useful for responding to real-time conditions.
1821         The system will not schedule the job during its low-priority
1822         phase if it has requested that it be blocked (bit 4.4),
1823         unless it gets an interrupt and is not using the new-style
1824         interrupt system.
1825         The .REALT uuo will skip only if the facility
1826         was requested and successfully seized.  In all other
1827         cases it does not skip, even if the requested operation
1828         succeeded.  If an invalid quantity is supplied for
1829         a frame time, or for the high priority time, an
1830         illegal operation interrupt occurs
1831         (%PIILO, bit 1.6 of the .PIRQC user variable).
1832 \f
1833 .REDEF ac,                              redefine symbol to exec DDT
1834         ;skip if successful
1835
1836         The specified accumulator should contain the address of
1837         a two word block:
1838                 wd0     SQUOZE bits,symbol
1839                 wd1     value
1840         If the <bits> are all ones, then the symbol is deleted.
1841         Otherwise it is defined with the specified value,
1842         replacing any old value.  This occurs in the symbol
1843         table used by exec DDT, which is used to debug the
1844         system, and which is used by the .EVAL uuo.
1845         A .REDEF fails to skip only if it tries to add
1846         a new symbol and fails for lack of room in the system.
1847 \1f
1848 .RESET chnum,                           reset I/O channel
1849
1850         I/O channel <chnum> is reset.  This is exactly
1851         like the symbolic system call RESET.  What happens
1852         is device-dependent; see the description of that call.
1853 \1f
1854 .REVIVE                                 revive system
1855
1856         This uuo reverses the effect of the .SHUTDN uuo.
1857         It is used by the REVIVE command of LOCK.
1858         Jobs which have enabled it will receive an
1859         interrupt (bit 1.7 of the .PIRQC user variable).
1860         See the .DIETIME and .SHUTDN uuo's, and the SSTATU
1861         symbolic system call.
1862 \f
1863 .RLPDTM ac,                             read localized PD time and .RYEAR
1864
1865         This returns the time and date in <ac> and <ac+1>, in a binary
1866         form.  <ac+1> contains the result of .RYEAR; see the description
1867         of that uuo for details.  <ac> contains the "localized" number
1868         of seconds since the beginning of the year.  If this is divided
1869         by the number of seconds in a day (86400.), the remainder will
1870         be the number of seconds since midnight local time, and the
1871         quotient will be the number of days since the beginning of the
1872         year, with the (mis)feature that all years are considered to
1873         include February 29.  This is done so that date-printing
1874         routines do not have to check for leap-year, but it does mean
1875         that during the last 10 months of non-leap years the day number
1876         is 1 greater than the correct Julian day.  Bit 4.9 of <ac+1> is
1877         set in this case.
1878
1879         Note also that when daylight savings time is in effect <ac> will
1880         be advanced by one hour.  Again this is done to simplify date
1881         and time printing routines.  Bit 4.7 of <ac+1> is set in this
1882         case.
1883
1884         Note that .RLPDTM should be used instead of .PDTIME followed by
1885         .RYEAR, since it guarantees consistency of the two values
1886         returned.
1887
1888 \1f       
1889 .RRTIM ac,              ANCIENT HISTORY read run time
1890
1891         This uuo NO LONGER EXISTS.
1892         It is documented here for historical purposes only.
1893         Its function has been superseded by the .RUNT user variable.
1894         Its opcode has been recycled as .CBLK.
1895
1896         The job's run time is returned in accumulator <ac>.
1897         See the .RUNT user variable.
1898 \1f
1899 .RSYSI ac,                              read system incarnation
1900
1901         Returns in <ac> the .FNAM2 of the system when it
1902         was assembled.  Thus, it is a version number in sixbit.
1903         This is the same as the seventh value of the
1904         SSTATU symbolic system call.
1905 \1f
1906 .RTIME ac,                              read time
1907
1908         The time of day is returned in accumulator <ac> as a word
1909         of sixbit characters "HHMMSS", where HH is the hour
1910         (in 24.-hour notation), MM is the minute, and SS is
1911         the second, all as two-digit decimal numbers.
1912         If the system does not know the time, -1 is returned.
1913         See also .RDATIM.
1914 \1f
1915 .RYEAR ac,                              read year
1916
1917         Returns in accumulator <ac> a word as follows:
1918
1919         4.9     This year has 365. days, and it is after February 28.
1920         4.8     This year is a leap year (366. days).
1921         4.7     Daylight savings time is in effect.
1922         4.6     The time of year is known.
1923         4.2-3.9 If bit 4.6 set, the current day of the week.
1924                 Sunday=0, Monday=1, etc.
1925         3.8-3.6 The day of the week of January 1 of this year.
1926         3.5-3.1 Zero.
1927         2.9-1.1 The year, not modulo 100., but as a full quantity,
1928                 e.g. 1969. or 1975.
1929
1930         If the system does not know the time, zero is returned.
1931 \f
1932 .SETLOC ac,                             deposit in system
1933
1934         Expects the rh of <ac> to contain the address of a
1935         location in physical core, and the lh of <ac> to point
1936         to a word of data in the executing job's memory.
1937         The job's argument word is copied into the addressed
1938         location in physical core, and a message is printed
1939         on the system console.
1940 \1f
1941 .SETM2                  OBSOLETE        set two interrupt masks
1942
1943         This uuo is ARCHAIC and OBSOLETE.
1944         It is documented here for historical purposes only.
1945         Its use in new programs is to be avoided.
1946         Its function has been superseded by block-mode
1947         .SUSET of .MASK and .MSK2.
1948
1949         The job's .MASK and .MSK2 user variables are set to
1950         the respective contents of accumulators <ac> and <ac+1>.
1951 \1f
1952 .SETMSK ac,             OBSOLETE        set interrupt mask
1953
1954         This uuo is ARCHAIC and OBSOLETE.
1955         It is documented here for historical purposes only.
1956         Its use in new programs is to be avoided.
1957         Its function has been superseded by .SUSET of .MASK.
1958
1959         The job's .MASK user variable is set to the contents of
1960         accumulator <ac>.
1961 \f
1962 .SHUTDN ac,                             shut down system
1963         ;skip on success
1964
1965         This uuo causes the system to prepare to go down.
1966         (It is used by the KILL command in LOCK.)
1967         Accumulator <ac> should contain a time interval,
1968         in thirtieths of a second.  The system will go down
1969         exactly that much time after the present moment.
1970
1971         When the system prepares to go down, all jobs enabled
1972         for it receive a system going down interrupt (%PIDWN, bit 1.7
1973         of the .PIRQC user variable).  (DDT prints a message when it
1974         receives such an interrupt; part of this message is the
1975         contents of the file SYS:DOWN MAIL.)  This interrupt will
1976         occur repeatedly every time 3/4 of the time from the previous
1977         interrupt to the time of shutdown has elapsed, except that
1978         interrupts will not occur less than ten seconds before shutdown.
1979         (Thus, if the system were scheduled to go down in ten minutes,
1980         interrupts would happen at the following times before shutdown:
1981         10:00, 2:30, 0:37.  If in five minutes:  5:00, 1:15, 0:17.)
1982         When the magic moment arrives, all users are forceably logged
1983         out, all jobs killed (except job trees whose top-level jobs
1984         have the %OPLIV bit set in their respective .OPTION user variables
1985         -- a feature used primarily by system daemons.  Such trees are
1986         expected to log out on their own after finishing their work),
1987         all micro-tapes are flapped, the file  SYS:DOWN MAIL  is deleted,
1988         "ITS NOT IN OPERATION" messages are printed on all consoles,
1989         all Terminet motors are stopped, all files, directories, and TUTs
1990         are written out, and everything generally put into a good state;
1991         the system then calls DDT.  It may be brought back up again
1992         with XREVIV$X, which reloads demons and allows ^Z'ing once more.
1993
1994         The effects of a .SHUTDN may be reversed by a .REVIVE uuo.
1995         See the .DIETIME and .REVIVE uuo's, and the SSTATU symbolic
1996         system call.
1997 \f
1998 .SLEEP ac,                              sleep
1999
2000         The .SLEEP uuo temporarily puts the executing job into
2001         a dormant but interruptable state.  The job consumes no
2002         run time until the specified time interval has elapsed,
2003         unless an interrupt occurs.
2004         The contents of accumulator <ac> specify how long the
2005         job is to sleep.  If non-negative, it is the length
2006         of time to sleep in thirtieths of a second.  If negative,
2007         it means to sleep until the system TIME variable (which
2008         is read by the .RDTIME uuo (q.v.)) exceeds the absolute
2009         value of the specified quantity; thus one can sleep
2010         until a specific time.
2011
2012         If the job is interrupted in the middle of a .SLEEP,
2013         the accumulator will be seen to contain the appropriate
2014         negative number, either the one originally there or one
2015         calculated from the original positive argument.  Thus
2016         re-executing the .SLEEP after dismissing the interrupt
2017         will cause the .SLEEP to be resumed correctly.
2018
2019         Often it is desirable to "sleep" until some condition
2020         other than the passing of time occurs.  For this see
2021         the .HANG uuo.  For the special case of sleeping until
2022         a network socket changes state, see the NETBLK symbolic
2023         system call.
2024 \1f
2025 .STATUS chnum,loc                       I/O channel status
2026
2027         The status of I/O channel <chnum> is placed in
2028         location <loc>.  This is exactly like the STATUS
2029         symbolic system call.
2030 \1f
2031 .SUPSET ac,                             SUPCOR set
2032
2033         The system job is partially controlled by a variable
2034         called SUPCOR; .SUPSET XOR's the contents of accumulator
2035         <ac> with that variable, returning the result of
2036         the XOR in <ac>.  Not all bits specified by <ac> take
2037         effect; some are AND'ed out first.  A message is printed on
2038         the system console as for the .IFSET and .SETLOC uuo's.
2039
2040         The only really useful bits to set are as follows:
2041         1.6     Update TV who lines.
2042         1.2     Kill current file being spooled from TPL to LPT
2043                 (this is what the TPL command in LOCK uses).
2044 \1f
2045 .SUSET [suset spec]                     self USET
2046
2047         This uuo is used to examine and set user variables
2048         associated with the executing job.  See ITS USETS
2049         for more information on .SUSET and .USET.
2050 \f
2051 .SWAP ac,                               hack swapping
2052
2053         This uuo is illegal unless the system is being
2054         debugged (the SYSDBG variable in the system is
2055         non-zero; see the SSTATU symbolic system call).
2056
2057         The bits in the specified accumulator indicate
2058         a test of the page swapping software in the
2059         system:
2060         4.9-4.7 Operation to perform.
2061                 0       Swap out the number of pages
2062                         specified in 2.9-1.1.
2063                 1,3,5,7 Go into a loop, waiting for
2064                         a few seconds and then referencing
2065                         location 2000 octal.
2066                 2       Hack the PCLSR test feature on
2067                         this job.  Bits 2.9-1.1 specify
2068                         the test mode:
2069                         -1      Enter in hold mode.
2070                         0       Leave PCLSR test mode.
2071                         1       Enter in advance mode.
2072                         2       Enter in advance but don't ^Z.
2073                 4       Swap out the virtual page specified
2074                         by bits 2.9-1.1 for the user specified
2075                         by bits 3.9-3.1.
2076                 6       Swap out all pages for the user
2077                         specified by bits 3.9-3.1.
2078         3.9-3.1 User index, for operations 4 and 6.  A user
2079                 index of zero means the job executing the .SWAP.
2080                 (After all, it's hard to swap out the system!)
2081         2.9-1.1 Number of pages for operation 0.
2082                 Test mode for operation 2.
2083                 Virtual page number for operation 4.
2084 \1f
2085 .TRANAD                 OBSOLETE        translation-list add
2086 \1f
2087 .TRANDL                 OBSOLETE        translation-list delete
2088 \1f
2089 .TRANS                  ANCIENT HISTORY translate file name
2090 \1f
2091 .UBLAT ac,                              micro-tape blat (?)
2092         ;skip if successful
2093
2094         The specified accumulator should contain a micro-tape
2095         drive number.  If the uuo succeeds, the drive is marked
2096         as being in .UBLAT mode.  In this mode, there are
2097         only two permissible operations on the drive: to dismount
2098         (flap) it, and to open it as one giant file.  This uuo
2099         is intended for use in reading micro-tapes written in
2100         non-standard  (e.g. DEC) format.  Any .OPEN
2101         on a micro-tape in .UBLAT mode will ignore the
2102         file names, and all the blocks of the tape except block 0
2103         will be read or written consecutively.  No deletes, renames,
2104         etc. are permitted.  A .UBLAT will fail if the drive does
2105         not exist, if the micro-tape directory has been read in
2106         already by the system, or if the drive is not assigned
2107         to the user whose job is trying to do a .UBLAT.
2108 \f
2109 .UCLOSE chnum,                          USR close
2110
2111         This uuo is used to explicitly kill an inferior
2112         open on channel <chnum>.  Merely performing a
2113         .CLOSE on the channel is not enough - that
2114         dissociates the inferior from the I/O channel,
2115         but does not destroy the inferior procedure.
2116         When the procedure is destroyed, all of its
2117         inferiors, direct or indirect, are destroyed also.
2118         As each job is destroyed, its I/O channels
2119         are automatically .CLOSE'd, and any facilities
2120         such as .MASTER mode are released.  The translation
2121         lists are cleared for all destroyed jobs.
2122
2123         If any procedure whatever has a destroyed job
2124         open on an I/O channel, that channel is automatically
2125         closed; in particular, the channel <chnum> is
2126         closed.  All jobs with channels which have the job open
2127         as a foreign user (as opposed to an inferior or a
2128         job device) also receive a word 2 I/O interrupt on each
2129         such channel (see the .IFPIR user variable).
2130         If a procedure has pushed a channel with a job to be
2131         destroyed onto its I/O pdl (see the .IOPUSH, .IOPOP, and
2132         .IOPDL uuos, and the .IOC, .IOS, and .IOP user variables),
2133         then that I/O pdl entry is replaced on the pdl with a special
2134         entry for a pseudo-device called the "interrupt on .IOPOP
2135         device", which delivers a word 2 interrupt when popped from
2136         the I/O pdl and then closes its channel (thus it should be
2137         impossible to perform any operation on this "device" except
2138         .IOPOP).  In this way a job can detect the fact that a
2139         foreign job disappeared while it was pushed.
2140
2141         A procedure which executes a .UCLOSE receives
2142         an I/O channel error interrupt (%PIIOC, bit 1.9 of the
2143         .PIRQC user variable) if the specified channel
2144         does not have an immediately inferior procedure
2145         open on it.
2146 \f
2147 .UDISMT ac,                             micro-tape dismount
2148         ;skip if successful
2149
2150         The specified accumulator should contain a micro-tape
2151         drive number.  If the uuo succeeds, the directory
2152         is written back onto the micro-tape and excised from
2153         the system's memory.  The micro-tape is then physically
2154         dismounted (this is known as "flapping" the tape, since
2155         when it runs off the reel it goes flap, flap).
2156         Micro-tapes should not be manually dismounted, for this
2157         will cause the directories to get out of phase, messing
2158         up that micro-tape and the next one to use that drive.
2159         The .UDISMT will fail if any files are still
2160         open on the micro-tape, or if someone else has the
2161         drive assigned to him.
2162         DDT makes this available via its command :FLAP.
2163         See also the FLAP symbolic system call.
2164 \1f
2165 .UINIT ac,                              initialize micro-tape
2166         ;skip if successful
2167
2168         The specified accumulator should contain a micro-tape
2169         drive number.  If the uuo succeeds, the directory
2170         of the micro-tape is initialized (containing no files).
2171         The uuo fails if the drive does not exist, or if the
2172         drive is not assigned to the user whose job is trying
2173         to do the .UINIT.
2174         See the .ASSIGN and .DESIGN uuos.
2175 \1f
2176 .UPISET ac,             OBSOLETE        user priority interrupt set
2177
2178         This uuo is ARCHAIC and OBSOLETE.
2179         It is documented here for historical purposes only.
2180         Its use in new programs is to be avoided.
2181         Its function has been superseded by .SUSET of .PICLR
2182         and/or the .DISMISS uuo and the DISMIS symbolic system
2183         call.
2184
2185         The value of the ac is converted to -1 or 0 on the basis
2186         of bit 4.9; this value is then exchanged with the .PICLR
2187         user variable for the executing job.  Thus the accumulator
2188         gets the old value of .PICLR even as it specifies a
2189         new value.  This allows enabling and disabling of
2190         interrupts.
2191 \f
2192 .USET chnum,[uset spec]                 set (or get) user variable
2193
2194         This uuo is used to inspect or alter the user variables
2195         of a job open on channel <chnum>, which may be a channel
2196         open on the USR or BOJ device.
2197         See ITS USETS for further information on .USET and .SUSET.
2198 \1f
2199 .UTNAM ac,                              set micro-tape name
2200         ;skip if successful
2201
2202         The specified accumulator should contain a micro-tape
2203         drive number in the right half and a three character
2204         sixbit name in the left half.  If the uuo succeeds,
2205         the name of the micro tape will be changed to the one
2206         specified.  The uuo fails if there is no such drive,
2207         if it is in .UBLAT mode, or if it is assigned
2208         to another user.
2209         The name of a micro-tape can be examined with the .RCHST uuo.
2210 \1f
2211 .UTRAN loc                              user interrupt bit translate
2212         ;skip if successful
2213
2214
2215         The effective address of .UTRAN must be a three-word
2216         block:
2217                 loc:    bit,,   ;interrupt bit of inferior
2218                         0       ;uname returned here
2219                         0       ;jname returned here
2220
2221         The first word should be all zero, except for one
2222         of bits 3.1-3.8; these correspond to inferior
2223         interrupt bits in the .IFPIR user variable.
2224         If the job executing job has an inferior for that
2225         interrupt bit, .UTRAN stores the uname and jname
2226         of the inferior in the second and third words and skips;
2227         otherwise it fails to skip.
2228
2229         DDT uses this to find jobs which have been :FORGET'ed, or
2230         accidentally created by open's of the USR: device via :PRINT
2231         etc.  Normally, superiors should keep track of the interrupt bit
2232         and job names when the job is created, and this UUO should be
2233         used only for exceptional cases.
2234
2235         See the .IFPIR, .UNAME, .JNAME, and .UIND user variables.
2236 \f       
2237 .VALUE [item]                           return value to superior
2238
2239         The job which executes a .VALUE receives a class 1
2240         interrupt, which stops the job, turns on %PIVAL (bit 1.8)
2241         in its .PIRQC variable, and interrupts its superior.
2242         The word <item> is placed in the .VAL variable of
2243         the executing job (this fact is a historical artifact,
2244         relatively useless now).
2245
2246         The standard superior procedure (DDT) imposes the
2247         following additional semantics on .VALUE:
2248         If the effective address is zero, then DDT prints
2249         out a message to that effect, and the job is left stopped.
2250         This used to be the standard way to crap out from a grossly
2251         irrecoverable situation (e.g. can't get core, or can't
2252         open the TTY when started).  Now .LOSE (q.v.) is preferred.
2253         A typical sequence is:
2254
2255         GO:     .OPEN TTYC,[SIXBIT \  !TTY\]
2256                  .VALUE ;unhappy if never got TTY
2257                 .CALL [ SETZ ? 'TTYGET ? 1000,,TTYC ? 2000,,A ? 402000,,B ]
2258                  .VALUE ;shouldn't lose if .OPEN succeeded
2259
2260         If the effective address is not zero, it is assumed to
2261         point to an ASCIZ string in the memory of the job
2262         which executed the .VALUE.  DDT proceeds to
2263         interpret these characters as if they were typed to
2264         DDT on the console.  Thus a job might execute
2265
2266                 .VALUE [ASCIZ \:PROCED :DISOWN \e\eV\]
2267
2268         or something similar, to get itself running again and
2269         disowned from its superior.  See the DDT documentation
2270         for specific details on .VALUE.
2271 \f
2272 .VSCAN
2273 \1f
2274 .VSTST
2275 \1f
2276 .WMAR ac,               ANCIENT HISTORY write mar address
2277
2278         This uuo NO LONGER EXISTS.
2279         It is documented here for historical purposes only.
2280         Its function has been superseded by .SUSET of .MARA.
2281         Its opcode has been recycled as .DCONT.
2282
2283         The user's mar address variable is set from the
2284         contents of the specified accumulator.
2285 \1f
2286 .WR760 ac,              ANCIENT HISTORY write device 760
2287
2288         This uuo NO LONGER EXISTS.
2289         It is documented here for historical purposes only.
2290         Its function is obsolete.
2291         Its opcode has been recycled as .DSTEP.
2292
2293         Device 760 of the PDP-6 used to be used for temporary
2294         direct sense hookups.  (For example, the low six
2295         bits controlled lights on the hand of the AMF arm.)
2296         This uuo used the contents of accumulator <ac> for a
2297         DATAO to device 760.
2298 \1f
2299 .WSNAME ac,             OBSOLETE        write system name
2300
2301         This uuo is ARCHAIC and OBSOLETE.
2302         It is documented here for historical purposes only.
2303         Its use in new programs is to be avoided.
2304         Its function has been superseded by .SUSET of .SNAME.
2305
2306         The system name for the job (used as a file directory name)
2307         is set to the sixbit contents of accumulator <ac>.