Copyright (c) 1999 Massachusetts Institute of Technology This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ------------------------------ ITS UUOS: This file attempts to maintain up-to-date documentation on all non-symbolic ("old") system calls. Those wonderful souls who update the information in any way (additions, deletions, corrections) should describe their modifications in a brief note to INFO-ITS@AI so that interested parties can correct their copies or conceptions without needing to print or read the entire file again. For example: :QMAIL INFO-ITS@AI I added more details to the .FOO uuo ^C If you want to be put on the INFO-ITS mailing list, just say so in a message to it. ------------------------------------------------- On the PDP-10, opcodes 0 through 77 are deliberately "not defined", and are called uuos ("unimplemented user operations"). Also, certain other opcodes are either illegal in user mode or undefined (for example, I/O instructions, JRST 4,). When an undefined instruction is executed, it "traps to 40": it is stored in location 40 with the index and indirect fields zeroed and the address field replaced by the effective address, and then the instruction in 41 is executed (it is usually a subroutine call). (Some instructions actually trap to 60 on KA's, but ITS contrives to make them appear to have trapped to 40 just like all the others). uuos 1 through 37 are reserved for user programs. They go through the entire trap sequence remaining in user mode, so it is the user's locations 40 and 41 that are used. The operating system is not involved at all. These uuos are called "user uuos". The other undefined opcodes enter exec mode during the trap, so that the system's 40 and 41 are used; the PC saved by the subroutine call will say "user mode" if the uuo was executed in user mode, however. These instructions are the normal way of calling any PDP-10 operating system. ITS interprets uuos 40 through 47 as monitor calls; those uuos are called "system uuos". The bulk of this file is devoted to describing how to use them. In addition, ITS will simulate some I/O instructions for the user (for example, any CONI, and DATAI 0,). All other instructions that trap to the system will be signaled to the user (they are "returnable uuos"). For simple programs, they will cause an ILOPR interrupt (%PIILO, bit 1.6 of .PIRQC). For programs that appear able to handle them, they are "returned" to the user, pretending to be user uuos - that is, the system makes it appear that they had trapped to the user's 40. However, they do not act precisely like user uuos: 1) The system can't simulate any trap instruction but unindexed, direct JSR. If the user's trap instruction is not a JSR, or is indexed or indirect, the system assumes that the user can't handle the returnable uuos, and causes an ILOPR interrupt instead. Also, if the AC field of the JSR is nonzero, the system will interrupt instead of returning the uuo; this is a way for a program to say explicitly that it doesn't want to have uuos returned, but still handle user uuos. 2) If the opcode in 41 is 0, the system treats it as if it were a JSR. 3) 0 is not considered a reasonable place to JSR to. If the address field of 41 is 0, the system will interrupt instead of returning the uuo. 4) While the addresses 40 and 41 are fixed by hardware for user uuos, for system returned uuos they are not. They must always be consecutive, but the address of the first one is kept in the RH of the .USET variable .40ADDR (whose initial value is, of course, 40). Thus, the user may have one handler for user uuos and another for returned uuos. Note that the system uses "42" for interrupts and "43" and "44" for the "locks" feature; those locations are also shifted by setting .40ADDR. 5) Returnable UUOs have complicated interactions with DDT. When proceeding from a breakpoint, DDT must simulate certain instructions, including all those that can transfer control. User uuos can be simulated properly, but not returnable ones since DDT does not know how to decide whether they are to cause ILOPRs. So DDT treats those uuos like the typical instructions; it puts the uuo in 31, a jump to 1 + the actual address of the uuo in 32, and a jump to 2 + that address in 33. It then starts the job at 31. If the returnable uuo handler does nothing with the PC except possibly return to it, and does not try to examine the uuo except by looking at 40, this causes no problem. However, if the uuo is followed by arguments, or if it can skip more than once, or if it tries to remember the PC somewhere, the handler must understand that if the PC is 31 (+1) special treatment is required. In addition, the real location of the uuo will contain not the uuo but a .BREAK, which will be there to implement the breakpoint. If the .UTRAP variable of a job is nonzero, ALL instructions that trap to the system will cause ILOPR interrupts - even those that are usually treated as system calls. In addition, the job will not handle any of its own interrupts - they all interrupt its superior. Thus, the superior can make the job believe it is running under a non-ITS environment. User uuos are not affected. The .UTRAP variable is the same as the %OPTRP bit in the LH of .OPTION. If the %OPDEC bit in the LH of .OPTION is set, uuos 40, 41 and 47 (as well as those I/O instructions which ITS usually simulates) become returnable uuos instead of system calls. By a lucky coincidence, those uuos, which are the only ones used by both ITS and TOPS-10, are not really necessary in ITS (they are .OPEN, .IOT and .ACCESS, and all have alternative forms using .CALL). In this mode, all uuos used as system calls by TOPS-10 are returnable. One of the TOPS-10 simulators works by setting this bit, and making .40ADDR point into the simulator where it lives at the top of core (to avoid conflicting with the user uuo handlers of the simulated programs). CALLS: Overview of ITS System Calls ITS system calls come in two kinds: the older, numerically decoded, non-standardized kind, and the newer "symbolic system calls" with a standard calling sequence. Each of the numerically decoded system calls is distinguished from all of the others by the values of specific fields in the instruction (the opcode, and maybe the AC and address fields). Each specific system call is known as "a uuo", and its name is a predefined symbol in the assembler, whose value is the appropriate instruction. For example, one uuo is .ACCESS; it is distinguished by the opcode field alone, which means that the AC field and address are available as arguments. The symbol .ACCESS is defined as the appropriate opcode. .RCHST, however, is distinguished by its opcode and its address, so that only the AC field can be used as an argument. The uuos distinguished by opcode and address all have the same opcode, which is called .OPER; thus, all such uuos are called ".OPER's". .FDELE is distinguished by opcode and ac field, leaving the address as an argument; such uuos are called ".CALL's" since they all have .CALL as their opcode. Each uuo is described individually in this file. The symbolic system calls all use the uuo .CALL. They are distinguished by the contents of the block addressed by the .CALL, which also points to the arguments. Ths symbolic system calls are described in more detail in the file .INFO.;ITS .CALLS. .ACCESS chnum,[access pointer] set file access pointer Sets the access pointer for the I/O channel for the next input/output operation. This is used to effect random access. On the DSK device (and DSK-like JOB devices) the access pointer is the number of "bytes" from the beginning of the file. Bytes are normally the same as words, but in unit ascii mode there are five seven-bit bytes per word. In the future there may be the ability to have bytes of any size from 1 to 36 bits. On the USR device the access pointer is the address within the job's memory. Random access on the USR device can also be effected via page mapping (see the .CBLK uuo and the CORBLK symbolic system call). If the channel number is variable, the symbolic system call ACCESS may be used in place of the .ACCESS uuo. The symbolic call RFPNTR may be used to read the current access pointer for a file. .ARMOFF This uuo was for hacking the AMF arm. The arm no longer exists.  .ARMOVE This uuo was for hacking the AMF arm. The arm no longer exists.  .ARMRS This uuo was for hacking the AMF arm. The arm no longer exists. .ASSIGN ac, assign a microtape ;skip if successful The accumulator should contain the number of a microtape drive. If it succeeds, it assigns the drive to the user who executed the .ASSIGN. When a job attempts to use a microtape drive, it will succeed only if it has the same sname as the uname of the job which did the .ASSIGN. A .ASSIGN will fail only if the drive is already assigned to a different user (i.e. a different uname), or if an invalid drive number is given. See also the .DESIGN and .RCHST uuo's. .ATTY chnum, assign tty to inferior ;skip if successful Puts the job in the state of wishing to pass control of the tty to the direct inferior open on the specified channel. It skips if successful; it fails if the channel does not have a direct inferior open, if the executing job had never had the tty, or if it had not been in the state of wishing to retain the tty. If the job had the tty, after the .ATTY the tty will belong to the specified inferior, or one of its inferiors. A job need not have the tty to do an .ATTY. See the .DTTY uuo, and the .TTY user variable. Also see ITS TTY. .BREAK ac,address breakpoint instruction, etc. The and
fields of this uuo are totally ignored by ITS. The procedure executing it receives a class 1 interrupt (bit 2.2 of the .PICLR user variable, called %PIBRK), stopping it and interrupting its superior. The standard superior procedure, DDT, assigns the following semantics to .BREAK, dependent on the field (for full information see DDT ORDER): meaning 1-10 Breakpoint number in the program, for between 1 and 10. 12 Request for information transfer. 15 Temporary breakpoint number 1. 16 Request for program suspension or termination. 17 Temporary breakpoint number 2. The "normal termination" instruction is .BREAK 16,160000 (but also see .LOGOUT). When DDT sets a breakpoint in a program on a given instruction, it replaces the opcode with .BREAK and the ac field with the breakpoint number. Thus the instruction will still calculate its usual effective address before breaking. The two temporary breakpoints are used for ^N (multiple instruction proceed), etc. .BREAK 12, is used to transfer information between DDT and the executing program at the latter's request. .BREAK 12, is like .SUSET in that it points either to a specification word or to an AOBJN pointer of such words. Bit 4.9=0 means read, =1 means write (from the program's point of view). Writing can be illegal if the ..PERMIT variable in DDT for the job is set appropriately. Bits 4.7-3.1 determine the type of information transferred: ..RSTA 1 Starting address of program. ..RLFI 2 Loaded file name. Four words: device, sname, file name 1, file name 2. ..RSTP 3 (read only) AOBJN pointer to program's symbol table in DDT. The left half is the negative of the symbol table size. See type 7 (..RSTB). ..RSYM 4 Symbol definition. Uses two words. Read: first word contains squoze for symbol. Second word receives value. If undefined, first word is zeroed. Write: first word contains squoze, second value. ..RJCL 5 Read: fetches command string for program. Set by : command or via :JCL. Always transfers at least one word of packed ascii, then more until either a zero word is transferred or until a non-zero is about to be transferred into. String is terminated by ^M if non-null. Write: clear command string. ..RPFI 6 File name defaults used for :PRINT. Four words: device, sname, file name 1, file name 2. ..RSTB 7 Symbol table. Allows transfers of many symbols in either direction. ..RCON 10 (read only) Number to symbol conversion. Uses two words. The first should initially contain a value. It receives squoze for a symbol, and the next word receives a delta. The value of the symbol plus the delta equals the original argument. The lookup used by DDT for symbolic typeout is employed here. If the lookup fails, the first word receives zero and the second receives what the first held. ..RXUN 11 (read only) The XUNAME (a uname to be used for getting mail, etc.). This is like the UNAME, but has trailing digits stripped off, etc. This is OBSOLETE; use the .XUNAME user variable. ..RXJN 12 (read only) The XJNAME (what this job should think of as its "real" name). This is like the JNAME, but has trailing digits stripped off, etc. This is OBSOLETE; use the .XJNAME user variable. ..RLJB 13 (read only) Read index of previously current job. ..RRND 14 Reads or writes the ..URANDM variable in DDT for this job. ..RPUR 15 Unpurify page. ..RHSN 16 (read only) Ask to lookup an HSNAME from an XUNAME. ..RMAI 17 (read only) Ask to lookup user's mail file name. (Symbols with names starting with "..S" exist for all those not marked as read only. For example ..RSTA==1 and ..SSTA==400001.) Illegal .BREAK 12,'s cause DDT to give the program an illegal operation interrupt (bit 1.6 in the .PIRQC user variable). .BREAK 16, is used to return to DDT in various nice ways. The effective address is decoded as follows: 2.9 Return from X. (Do not use unless you understand it!) 2.8 Type extra carriage return in DDT. 2.7 Do not reset TTY input (effective only if executing job has the TTY). "Normal" returns to DDT should always have this bit set. 2.6 Kill executing job: Immediately, if it has the TTY. When it gets the TTY, if current job. Otherwise when J'd to in DDT. Will print ":KILL" when killed. 2.5 Kill executing job: Like 2.6 if job current. Otherwise is killed silently. 2.6&2.5 Together mean kill executing job: Like 2.6 if job current. Otherwise kill immediately, and print JOB FINISHED on TTY. 2.4 Conditional breakpoint return. 2.8=1 => condition true. 2.8=0 => condition false. Used by DDT. Dangerous for users to play with. 2.3 Don't type even a carriage return. Don't close the currently open location. If killing self don't type :KILL. 2.2-1.1 Illegal. (Reserved for expansion.) DDT sets the %OPCMD and %OPBRK bits for its inferiors appropriately. See the .OPTION user variable. .CALL [ SETZ ? SIXBIT \name\ ? -- args -- ] symbolic system call ;skip if successful The .CALL uuo is used to invoke a large class of operations which are distinguished by a sixbit name. See the file ITS .CALLS for more information. .CALL is sometimes used in a generic sense to denote the set of uuo's with the same opcode as .CALL; they are distinguished by their accumulator fields: .CALL 0, .CALL .CALL 1, .DISMISS .CALL 2, .LOSE .CALL 3, .TRANAD .CALL 4, .VALUE .CALL 5, .UTRAN .CALL 6, .CORE .CALL 7, .TRANDL .CALL 10, .DSTART .CALL 11, .FDELE .CALL 12, .DSTRT .CALL 13, .SUSET .CALL 14, .LTPEN .CALL 15, .VSCAN .CALL 16, .POTSET .CALL 17, unused .CBLK ac, hack a core block ;skip if successful This uuo is ARCHAIC. Its use should be avoided in new programs, since the CORBLK symbolic system call is much more flexible and easy to understand. The contents of accumulator specify an operation on the executing job's core. It modifies the job's page map entry for one page. The contents of should be as follows: 4.9 Must be zero. 4.3-4.1 Desired operation: 0 Get page from self. 1 Get absolute page. 2 Get a page from the user open on the channel specified by bits 3.8-3.1. 3 Get a page from the user whose user index is in bits 3.8-3.1. 4 Get fresh page. 5 Get public page. 6 Make my page public. 7 Make my page private. 3.9 If 1, request write permission for the page. Assumed 1 for operation 4 (fresh page). Otherwise valid only for self, public page, or direct inferior open on channel. 3.8-3.1 User index or USR device channel. If the executing job is a job device, then 377 will refer to the job which invoked it. 2.9 1 = insert page in core map. 0 = delete page. If the operation is 6 or 7, this bit is ignored. Otherwise, the operation is ignored for deletion. 2.8-2.1 Virtual page to be affected within the core map of the executing job. 1.9-1.1 Block number within source specified by bits 4.3-4.1. Sample contents of for various operations: Delete my page 43: 0,,43000 Create a fresh page 217: 4400,,517000 Make my page 45 be read-only: 0,,445045 Make my read-only page 45 writable: 400,,445045 Make page 16 of job 34 read-only as my page 377: 3034,,777016 This uuo is all right for hacking single pages within your own core map. To alter another job's core map, or to hack many pages at once, use the CORBLK symbolic system call. For more information on core blocks, see ITS CORBLK. .CLOSE chnum, close a file The input/output channel is closed. All operations associated with that channel are completed. For file structured devices, if another file with the same name exists (if was being used for output), that file is deleted at this time and the new file replaces it. Any further attempts to use the channel without re-opening it will cause errors. .CLOSE does nothing if the channel is not open. If the USR device is open on the specified channel, the job is not killed by .CLOSE; it is merely made to be no longer open on the channel. To kill a USR device job, the .UCLOSE uuo must be used. If the channel number is a variable, the CLOSE symbolic system call may be used. .CORE set core limit ;skip if successful This uuo is a relic of the old pre-paging version of ITS. For applications which want to be relatively clever about paging and core allocation, see the .CBLK uuo and the CORBLK symbolic system call. The effective address of .CORE should be a number between 0 and 400 octal. The core of the procedure executing it is modified as follows: (DEFUN *CORE (N) (DO ((K (// (*SUSET *RMEMT) 2000) (// (*SUSET *RMEMT) 2000))) ((= K N)) (COND ((< K N) (CREATE-PAGE K)) (T (DELETE-PAGE (- K 1)))))) That is, at each step a page is either added or deleted at the top of the job's memory until page is the highest one in the job's memory. Only a .CORE to acquire more core can fail. If a .CORE fails to skip, some of the requested core may have been obtained, though not all. .DCLOSE display close This system call releases the 340 display or the E&S display, if possessed by the executing job, and closes all channels on which the display is open. If the display is being hacked via .DSTART, this won't be any channels. In the case of the 340, the display is made available to the pdp-6. If the executing job does not possess the display, .DCLOSE does nothing but return.  .DCONTIN display continue This system call will restart the E&S display after stopping or single stepping (.DSTOP, .DSTEP). If the display is stopped because of a Display MPV, a Hit Stop, WCR stop or PROG Stop, the condition will NOT be cleared and the display NOT restarted. If the display is not stopped or does not belong to the executing job, no action is taken. This system call is ignored by the 340 display. .DEMON acknowledge one demon request .DEMON ac, acknowledge demon requests ;skip if successful and more requests pending As of September 1, 1976, only the DM machine has this. If the executing job is not a demon, the uuo merely returns without skipping. If it is a demon, then either 1 or the contents of the specified non-zero are subtracted from the demon's request count, and the uuo skips iff the resulting count is still positive. See the DEMSIG, RDDMST, and STDMST symbolic system calls. .DESIGN ac, de-assign a microtape ;skip if successful The accumulator should contain the number of a microtape drive. It reverses the effect of a .ASSIGN uuo by making the drive unassigned again. A .DESIGN will fail only if an invalid drive number is given, or if the drive is assigned to some other user than the one owning the job trying to do the .DESIGN. It will succeed if the drive is already unassigned. .DIAL ac, ANCIENT HISTORY dial a dataphone line ;skip if successful This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .NETAC. The accumulator should contain a byte pointer of the following form: 440600,,[data](n) where is not an index field, but the number of a dialer (0 or 1), and is a series of dialing bytes. The byte string may not be longer than 5 words. Each byte specifies a dialing step as follows: 0 End of data. 1-10. Send 1-10. dialing pulses. Pauses are supplied between digits automatically. > 10. Pause <-10.> seconds in dialing. If the accumulator is zero except for the dialer number, then the "break" signal is sent after any previous dialing has been completed. A .DIAL will fail if the dialer number is invalid, if the TTY associated with the dialer (0=T07, 1=T06) is in use by another job, or if the dialer is being used by some other job (the other job has not done .HANGUP yet). See the .DIALW and .HANGUP uuos. .DIALW dialnum, ANCIENT HISTORY wait for dialing to finish ;skip if successful This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .NETS. If dialer number is assigned to the job executing the .DIALW (i.e. the job has done a .DIAL but not a .HANGUP), then .DIALW skips after waiting for dialing to be completed. Otherwise it fails. See the .DIAL and .HANGUP uuos. .DIETIME ac, OBSOLETE time until system dies This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by the SSTATU symbolic system call. The accumulator is set to the maximum time (in thirtieths of a second) before ITS will go down. If the system is not planning to go down (the normal case, we hope!) is set to -1. See also the .REVIVE and .SHUTDN uuos. .DISMISS [new PC] dismiss an interrupt Dismiss an interrupt. The user variable .PICLR is set to -1, thereby enabling interrupts, and the PC receives the quantity . This is for the so-called "old-style" interrupt scheme. See also the DISMIS symbolic system call, which is ordinarily used with the "new-style" vectored interrupt scheme, but may be used in either case. Typically .DISMISS is used in this manner: LOC 42 JSR TSINT ;pointer to interrupt handler LOC 100 ;or wherever TSINT: 0 ;interrupt flags 0 ;PC as of interrupt EXCH A,TSINT TSINT1: TLZE A, ;check for various interrupts JRST ;handlers return to TSINT1 TLZE A, JRST . . . . MOVE A,TSINT ;restore accumulator .DISMISS TSINT+1 ;dismiss interrupt See ITS INTRUP for more information on interrupts. .DISOWN chnum, disown an inferior An inferior job should be open on channel . The job is caused to be no longer an inferior of the executing job, and is made to be the top level job of a disowned job tree. The usual reason for disowning a job is so that it can continue to exist after its former superior has been killed (for instance, after the user who disowned it has logged out). Another reason for disowning a subtree is to reown it under a different superior, thus altering the shape of the system's job-tree structure. All channels on which the executing job has open the job being disowned will be closed in the process of disowning (see the .CLOSE uuo). Disowning is illegal if does not have an inferior open, or if the subtree being disowned controls the console (see the .ATTY uuo). If the jobs of the subtree have opened the console, then the channels are not closed, but are marked as "disowned tty"; certain operations on such a channel will succeed, and others will hang until the tree is re-owned and a console tty given to the job. Such channels appear to be open on tty number %TINON=77 octal. A disowned job is distinguished by the fact that bit 4.9 of its .APRC user variable is set. A disowned job never succeeds in executing the RELOAD symbolic system call, even if it is the top level job in its tree. When a job tree is logged out, any micro-tapes assigned to the uname of that job tree are de-assigned (see the .ASSIGN and .DESIGN uuo's), but only if the job tree is not disowned. All disowned jobs share a resource word for purposes of scheduling, in the same way that all jobs in a single non-disowned tree share a resource word. Thus all disowned jobs tend collectively to use no more runtime than any single non-disowned job tree. Furthermore, individual disowned jobs are given only 1/4 the priority to run as a non-disowned job. This does not apply, however, if the disowned job in question has .MASTER mode, or controls the 340 display, the E&S display, the vidisector, the arm, the LPT (line printer), or the PLT (plotter). When operating under heavy loads, the swapper prefers to swap out disowned jobs rather than non-disowned jobs. The DETACH symbolic system call makes a non-disowned tree disowned. When a non-disowned top-level job encounters a fatal interrupt, the system will make it disowned and print a suitable message on the system console and on the job's console (if it has one). The disowned tree can then be reowned with DDT and debugged. .DMPCH ac, OBSOLETE mung dump check bit This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by the RDMPBT and SDMPBT symbolic system calls. The accumulator should contain a channel number in the right half, which should have a disk channel open on it. The left half describes any alterations to be made to the dump check bit for the open file: 4.9 Set dump check bit. 4.8 Clear dump check bit. The state of the dump check bit (possibly after setting) is returned in accumulator in bit 1.1. The dump check bit is used by the magtape file backup system to keep track of which files have been backed up on magtape. This bit therefore should not be twiddled light-heartedly. The "!" you sometimes see in front of a date in a disk file directory is present iff the dump check bit for the file is zero. .DSTART [start-addr] start the display ; skip if successful This system call is used to start the E&S or 340 display processor, whichever one the system has. If it has neither, the uuo is an illegal operation and gives a %PIILO interrupt. .DSTART assigns the display to the executing job if it is available, and skips if successful. If the display is not available .DSTART does not skip. In the case of the 340 display, the effective address of the .DSTART is the address of the user's display list. This can be either a single BLKO pointer (if the word is negative), or the first word in a linked list (if the word is positive). The right half of each word in the linked list is zero to end the list, or the address of the next word in the list. The left half of each word in the linked list is the address (which must be less than 400000!) of a BLKO pointer. If this address is zero, or the BLKO pointer is zero, it is ignored (this allows "jump-type" entries in the list.) The display will continually execute the commands pointed to by this list. It is OK to change the list, or the single BLKO pointer, while the display is running, provided everything always points to valid data. The .DSTRTL uuo is the same as .DSTART except that it uses regular AOBJN pointers instead of BLKO pointers. In the case of the E&S display, the argument to .DSTART contains in the right half, the address at which the display program will start, and in the left half, a code to determine modes of operation: There are four 3-bit fields in this code: 3.1-3.3 Start mode. Only the 3.1 bit is significant. If set, the display is started in single step mode. 3.4-3.6 Action to take on Program stop. 3.7-3.9 Action to take on Hit stop. 4.1-4.3 Action to take on Memory stop. Each of the three Action fields is decoded as follows: 0 Restart from address of the last .DSTART. 1 Continue after the stop condition has been reset. 2 Stop. 3 (Reserved). 4 Interrupt and restart. 5 Interrupt and continue. 6 Interrupt and stop. .DSTEP step the E&S display The .DSTEP call will step the display processor one instruction cycle if it has been stopped (.DSTOP) or started (.DSTART) in step mode. If the display is not stopped, .DSTEP will first simulate a .DSTOP. If the display is not the executing job's, no action is taken. The .DSTEP call is ignored by the 340 display.  .DSTOP stop the display The .DSTOP call will stop the E&S or 340 display processor, if the display belongs to the executing job.  .DSTRTL start the display In the case of the 340 display, this is the same as .DSTART (q.v.) except that the display will use AOBJN pointers instead of BLKO pointers. In the case of the E&S display, this crashes the system. Maybe someday this will be fixed. .DTTY devour the tty .DTTY is used when a job decides that it wishes to retain the tty. It skips if it succeeds; it fails if the job was already in the state of wishing to retain the tty, or if it had never had the tty. If the tty had actually belonged to some (possibly indirect) inferior, it will belong after the .DTTY to the job that executed it. A job need not have the tty to do a .DTTY. See ITS TTY for a full explanation of .DTTY. See also the .ATTY uuo, and the .TTY user variable.  .DWORD [word] send word to E&S display The specified word is sent to the E&S display via the DATAO instruction. The display is stopped first via .DSTOP if necessary. This system call is ignored if there is no E&S display or the executing job does not own it.  .EOFC ac, OBSOLETE end of file character This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been obsoleted and not replaced. Accumulator receives the eof character used to pad the end of the file open on the channel specified by the contents of before the uuo is executed. Apparently early microtape files used 141 as the pad character.  .EVAL ac, evaluate squoze symbol ;skip if successful Before the uuo is executed, accumulator should contain the squoze code for a symbol. This symbol is looked up in the symbol table used by exec DDT (the one used to debug ITS); this table contains symbols defined within ITS. The uuo fails to skip if the symbol is not found; otherwise the value is placed in and the uuo skips. This uuo offers a useful method of obtaining information from ITS, when combined with the .GETLOC uuo or with absolute memory pages; for example, to find out how many irrecoverable disk errors there have been, PEEK .EVAL's the symbol QIRRCV and examines that location in the system. Naturally, this is more risky than using a system call, since the system's symbols may be changed. One protection against that is to make an entry in the file AI:SYSTEM;EVSYMS > mentioning which symbol is being .EVAL'ed by which program. Then, there will probably be warning from ITS hackers of any change. .FDELE fblock OBSOLETE delete or rename file ;skip if successful This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by the DELETE, RENAME, and RENMWO symbolic system calls. This uuo may be used to delete and rename files. It points to a five-word block describing the operation to be performed. There are three cases. [1] Delete a file. fblock: SIXBIT \ dev\ ;right-justified device name SIXBIT \fname1\ ;file name 1 SIXBIT \fname2\ ;file name 2 0 ;zero --- ;not examined [2] Rename a file open for writing on channel . fblock: --- ;not examined 0 ;zero ;channel number SIXBIT \fname1\ ;new file name 1 SIXBIT \fname2\ ;new file name 2 [3] Rename an arbitrary file. fblock: SIXBIT \ dev\ ;right-justified device name SIXBIT \fname1\ ;old file name 1 SIXBIT \fname2\ ;old file name 2 SIXBIT \fname1\ ;new file name 1 SIXBIT \fname2\ ;new file name 2 In cases [1] and [3], if the device specified has true directory structure, the .SNAME user variable for the executing job is used as the directory name. Also, the file names (for case [1]) or the old file names (for case [3]) are subject to input translation (see the TRANAD symbolic system call). If the device is not file structured, .FDELE succeeds and skips. If .FDELE fails, it returns an error code on channel 0 which can be retrieved via the .STATUS uuo or the ERR device. .FEED chnum, feed paper tape ;skip if successful If device PTP (the paper tape punch) is open on channel , the uuo punches one line of blank tape and skips. Otherwise it fails and does not skip.  .GENNUM ac, generate number Accumulator receives a unique generated number which will not be generated again for a very long time (unless the system crashes, in which case the counter is reset, of course). [ In ITS 1554 and later. ]  .GENSYM ac, generate symbol Accumulator receives the sixbit name of a unique generated symbol which will not be generated again for a very long time (unless the system crashes, in which case the counter is reset, of course).  .GETLOC ac, get absolute location The accumulator should contain an absolute address in the left half and an address within the executing job in the right half. The contents of the absolute location specified is deposited in the location specified within the job. This is useful for examining locations within the system. However, if many locations are to be examined, or if a location is to be examined many times, it is far more efficient to map the absolute page(s) containing the location(s) of interest into the job's core map as read-only memory; the job can then examine the locations at top speed without having to go through the system uuo handler. Such page mappings can be established via the .CBLK uuo or the CORBLK symbolic system call. .GETSYS ac, get system data ;skip if successful Accumulator should contain an AOBJN pointer to a data area in the user's core. (A zero left half means the data area extends to the end of core.) Accumulator should contain the sixbit name of a system data area. The specified system data area is transferred into the user's core in such a way that the data is consistent (i.e. interrupts are inhibited in appropriate ways, etc.). If the .GETSYS is successful, is updated to point to the unused part of the user's data area. If the named data area does not exits, is cleared. If the area in the user's core is too small, the left half of is replaced with the negative of the correct size. In both of these cases .GETSYS fails to skip. Valid data areas are: MEMORY Memory tables. UTAPE Micro-tape variables. NCPSM Network control program socket map. NCPPQ Network control program pending RFC queue. NCPHT Network control program host table. USERS User variables for all jobs. USER User variables for job whose user index is in . Formerly a uname-jname pair was accepted in and , but this is no longer true (ANCIENT HISTORY). GETS Valid sixbit .GETSYS area names. DEVS Valid sixbit built-in device names. (Doesn't include those on DEVICE directory.) CALLS Official system symbol table. Squoze symbols and values for UUO's, .USET variables, and bits DEFSYM'ed in SYSTEM;BITS. IMPX Input multiplexor data area. CLINK Core link device variables. DSYMS Exec DDT symbol table. Squoze symbols and values. USYMS Squoze symbols and values for .USET variables only. (Does -not- contain .RMEMT or .SMEMT, but rather .MEMT. Used by DDT when you type ".MEMT/".) CHDEVS Device names, from .RCHST table. NCALLS Valid sixbit names for symbolic system calls. USRVAR Valid sixbit user variable names for USRVAR system call. TTYVAR Valid sixbit tty variable names for TTYVAR system call. ITSNMS Valid sixbit names of all local ITS machines. Names which used to be valid but are no longer (ANCIENT HISTORY): TRANS Translation tables. OMPX Output multiplexor data area. PEEK used to use this uuo to get system information. Nowadays it merely maps systems pages into its core image, thereby gaining efficiency at some small cost in accuracy.  .GSNAME ac, ANCIENT HISTORY get system name This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function has been superseded by .SUSET of .RSNAM. Its opcode has been recycled as .REALT. Put the executing job's .SNAM user variable into accumulator ; this is the default directory name ("system name") for the job. .GUN ac, gun down a job tree ;skip if successful Accumulator should contain the user index of the top level job of a job tree. That job tree is expunged from the system. All the jobs are closed and killed. This is to be used as a last resort to flush hung and worthless jobs. The system program LOCK contains a command which performs this operation. The system job will print a message on the system console describing what job was gunned and who gunned it. .HANG hang until condition satisfied The .HANG uuo is to make it easy for programs to wait for various conditions. It should be used the way a JRST .-1 would be used in a stand-alone program. Explicitly, it should be preceded by an instruction that will skip or jump if the awaited condition is true. Because the system must understand that instruction, only certain instructions are allowed to be used (any others cause illegal operation interrupts (%PIILO, bit 1.6 of the .PIRQC user variable)). They are: SKIP, JUMP, AOS, SOS, AOJ, SOJ, CAI, and CAM class instructions, -all- test instructions, CONSO and CONSZ (which work only if the job is in .IOTLSR mode, and the processor is not a KS10), SKIP and JFCL, which are used to hang forever (really, until some interrupt routine jumps away instead of returning), SKIPA and CAIA, which are used to cause rescheduling but don't actually hang, and JFFO. XCT is also allowed, but the ultimate end of the chain of XCT's must be one of the instructions listed above. In the case of hanging forever, the job is specified to be desirable to swap out, since it may hang for a long time. .HANG conditional instructions which reference only ACs are treated as hang-forever, except that they don't set the desire-to-swap-out flag, since the contents of the AC can't change without the job being interrupted out of the .HANG. When a job executes a .HANG, the system effectively executes the preceding instruction at each schedule to decide whether the job may be run (cf. the .FLS user variable). If the job is interrupted, the interrupt routine will find that the saved PC points to the instruction before the .HANG instruction. It may dismiss normally, in which case the .HANG will be executed again unless the condition has become true (of course, the interrupt routine may do something to make the condition true). .HANG takes care to be certain that any side effects of the instruction will be performed when the condition finally becomes true. .HANG does this by always exiting by jumping to .-1. Thus an AOSE instruction followed by a .HANG really will increment the referenced location after it becomes -1, JFFO AC, followed by .HANG really will store a bit number into AC+1, and TLZN followed by .HANG really will clear out the bit after it comes on. While a job is waiting in a .HANG, the system does not re-examine the AC used by the conditional instruction each time it executes that instruction; it uses what was in the AC when the .HANG was entered. However, there is no way for this AC to change without the job being interrupted of the .HANG so it can change it, or PCLSRed out when it's superior changes it. Also, the effective address calculation is not repeated, and if the actual instruction supplied is an XCT, the XCT'd instruction is not re-fetched. Therefore, it does not work to expect the condition to become true because the contents of a memory location indirected through or XCTed will change. Because an interrupt always causes the .HANG to be redone, it does work to expect the interrupt routine to change the AC or the indirect pointer in order to make the instruction skip. In the special case of waiting for a specific interval of time to pass, the .SLEEP uuo (q.v.) may be useful. In the special case of waiting for a network socket to change state, the NETBLK symbolic system call may be useful. .HANG ac, .HANG with timeout [In ITS version 1622 and later] .HANG with a non-zero AC field acts as the disjuction of .HANG and .SLEEP, allowing a program to wait either for a condition to become true or for some time to pass. The contents of accumulator specify when the .HANG should stop waiting for the condition to become true by returning to the instruction following the .HANG. If non-negative, it is a length of time to wait in thirtieths of a second. If negative, it means to wait until the system TIME variable exceeds its absolute value. As with .SLEEP, if the job is interrupted while .HANGing, the accumulator will be found to contain the appropriate negative number to allow the .HANG to be resumed properly when the interrupt is dismissed. If .HANG times out before the awaited condition becomes true, the accumulator will contain 0. This is the only case in which .HANG will exit to the following instruction. If the awaited condition becomes true, so that the previous instruction skips or jumps away, the accumulator will contain the negative of the time at which the .HANG would have timed out. .HANGUP dialnum, ANCIENT HISTORY hang up a dialed line ;skip if successful This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .REVIVE. This uuo was used to hang up on a line which had been dialed by the .DIAL uuo. .IFSET ac, if location contains what I think, set it ;skip if successful The accumulator should contain an absolute 18.-bit address in the right half and a pointer to a two-word block in the left half. The first word of the two-word block contains a test word, and the second a new value. If the absolute core location specified contains exactly the quantity specified by the test word, then the contents of that location are replaced by the new value specified, and the .IFSET skips. If the contents of the location are not the same as the test word, the .IFSET fails. This is similar to the .SETLOC uuo, but provides a measure of safety if the contents of the location may be volatile. Like the .SETLOC uuo, if the .IFSET succeeds the system job prints out a message on the system console detailing the old and new contents of the location and who modified it. .IOPDL reset I/O pdl The I/O channel pdl of the executing job is reset. Entries on the I/O pdl contain the channel number from which they were pushed; .IOPDL is equivalent to just enough .IOPOP's (possibly none) to clear the I/O pdl, popping each entry into the channel it was pushed from. See the .IOPUSH and .IOPOP uuos, and the .IOC, .IOS, .IOP user variables.  .IOPOP chnum, pop I/O channel This uuo is the inverse of the .IOPUSH uuo. The top entry of the I/O pdl is popped into channel , which may be a different channel from the one the entry was pushed from. A .CLOSE is first performed on the channel popped into. If the channel originally pushed was a closed channel, then after popping channel will be closed. If the I/O pdl has no entries on it, IOC error number 5 is signaled on channel , giving the job a class 2 interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable). If the channel number is variable, the IOPOP symbolic call may be used. See the .IOPUSH and .IOPDL uuos, and the .IOC, .IOS, and .IOP user variables. See also the .UCLOSE uuo for a discussion of what occurs when a job open on a pushed channel is killed.  .IOPUSH chnum, push I/O channel The channel is pushed onto the I/O pdl for the executing job. A channel may be pushed whether or not it is actually open; if it is open, transactions on the channel are suspended when it is pushed, and any transfer on that channel is inaccessible until the pushed entry is popped again. The error status and access pointer are correctly saved as well. The channel number is also saved in the pdl entry for use by the .IOPDL uuo. After the channel has been pushed it is returned to a non-open state (this is not the same as being closed since closing implies terminating the I/O transaction). The I/O pdl for each job has room for eight entries; if all are in use .IOPUSH will signal IOC error number 6 on channel , giving the job a class 2 interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable). If the channel number is variable, the IOPUSH symbolic call may be used. See the .IOPOP and .IOPDL uuos, and the .IOC, .IOS, and .IOP user variables. See also the .UCLOSE uuo for a discussion of what occurs when a job open on a pushed channel is killed. .IOT chan,[foo] input/output transfer Input or output is performed, according to the device open on the specified channel and the mode in which it was opened. If an error occurs, any of several IOC errors may occur, giving the job a class 2 interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable.) In "unit mode", foo is the datum to be transferred in or out. (In the case of input, the word pointed to by the effective address of the .IOT is modified.) In "block mode", foo is an AOBJN pointer to the data to be transferred in or out. The left half is the negative of the number of words, the right half is the address of the first word. The pointer is updated as the transfer proceeds. When the .IOT returns the pointer will have been fully counted out, that is the left half will be zero, except in the case of input that stops because the end of the file was reached. In the case of block mode on an intrinsically character device, such as TTY, bits 4.9-4.7 of the pointer are fiddled to indicate which byte in the word is being processed. The VID, NVD, and IMX devices handle .IOT in a non-standard way because they do both input and output at the same time. The symbolic system calls IOT and SIOT are versions of .IOT which have additional features. .IOTLSR ac, iot loser mode This uuo is used to request permission from the system to run in user I/O mode (bit 4.3 of the PC). In this mode a program is in user mode (and thus is subject to user mode page mapping), but may perform I/O instructions without trapping to the system. This facility must naturally be used with discretion. It should be noted that ITS will interpretively simulate most I/O instructions anyway, if it thinks that the operation will not harm the time-sharing system. For example, one may use DATAI to read the console switches even when not in .IOTLSR mode. This simulation is slower than direct execution of I/O instructions, but much safer. If bit 4.9 (the sign bit) of accumulator is zero, .IOTLSR mode is relinquished, even if it was not formerly possessed by the job. If bit 4.9 is one, then the executing job is granted .IOTLSR mode, and the system job prints a message on the system console to document the fact. .IPDP chnum, interrupt PDP-6 Channel should have the PDP-6 open as an inferior procedure; if it does not, .IPDP does nothing. Otherwise the PDP-6 receives an interrupt. The PDP-6 can also interrupt the PDP-10; when this occurs a job with the PDP-6 open as an inferior will receive an interrupt if enabled for it. See the .IFPIR user variable for PDP-6 channel interrupts. The interface between the PDP-6 and the PDP-10 is device 20 octal. The interrupts are given via a CONO: 1.5 Interrupt other processor. 1.4 Clear interrupt flag. 1.3-1.1 Priority interrupt assignment. The bits read by CONI are as follows: 1.4 Interrupt flag. 1.3-1.1 Clear interrupt flag. .ITYI ac, OBSOLETE input tty interrupt ;skip if successful This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by the .ITYIC uuo. This uuo is exactly like .ITYIC except that it applies only to the job's console, if any. This uuo is to be flushed eventually.  .ITYIC ac, input tty interrupt on channel ;skip if successful The specified accumulator should contain the number of a channel which is open for tty input. If an interrupt character is pending in that tty's input buffer, that character replaces the channel number in and the .ITYIC skips. It will fail if the channel is bad, if it does not have a tty open, if the tty is the job's console but the job does not possess it, or if there is no interrupt character pending. If the job does not possess its console and the job's %TBINT bit is set in the .TTY user variable, the job receives a class 2 word 1 interrupt (bit 4.2 in the .PIRQC user variable). This uuo is typically used in an interrupt routine invoked by bit 1.1 (%PITYI) in the .PIRQC user variable or by a word 2 I/O interrupt on a tty input channel. If the .ITYIC does not skip the program should ignore the interrupt entirely; this can happen due to certain timing screws related to passing the console around among several jobs. See the TTYGET and TTYSET symbolic system calls, which manipulate bits relevant to interrupt characters. See the WHYINT system call, which (in the case of TTY channels) is another way to do the same function as .ITYIC. See the .PIRQC and .TTY user variables. See ITS TTY for a complete explanation of .ITYIC.  .LISTEN ac, listen to tty If the job possesses its console, .LISTEN waits for any output to be completed, and then returns the number of input characters pending in the input buffer. If the job does not possess a console, zero is returned. See also the LISTEN symbolic system call. .LOGIN ac, ANCIENT HISTORY log in ;skip if successful This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function has been superseded by the LOGIN symbolic system call. Its opcode has been recycled as .DEMON. Accumulator contains the sixbit name to log in as. Attempting to log in with a uname equal to 0 or -1 fails, as does attempting to log in when already logged in.  .LOGOUT log out The executing job and all direct inferiors are killed, providing that it is the top-level job of its job tree. All resources used by such jobs are freed. If the job tree was console-controlled, the system job will print a "console free" message on the freed console. If the executing job is not top-level, .LOGOUT with zero in the AC field merely returns without skipping. (An inferior job may not commit suicide without the consent of its superior.) .LOGOUT with a nonzero AC field will cause a fatal %PIBRK interrupt which will inform the superior that the job wants to be killed. If the superior is DDT, it will kill the job. Here is how a program should exit: SKIPE DEBUG ;optional debugging aid: .VALUE ; job hangs if being debugged .LOGOUT 1, ;log out or be killed. .LOSE lossage-code report lossage The job's Program Counter is set to the address of the .LOSE minus one, the job's .VAL user variable is set to the new PC,,the magic bits, and the job is given a %PILOS interrupt. If the job does not enable this interrupt, and it's superior is DDT, a helpful error message will be printed. The magic bits are documented in DDT ORDER. The most useful ones are 0 for a random error, 1000 to ask DDT to type the error message corresponding to the most recent system call error return, and 1400 if DDT should attempt to print the names of the file that the call was opening/referring to. The lossage codes are defined by DDT's interpretation of them. The defined values are: %LSSYS==1000 The last error code returned by a failing system call describes the problem. %LSFIL==1400 The last error code returned by a failing system call, together with the name of the file it was operating on, describe the problem. That system call should be right before the .LOSE. DDT will decode it to determine the filenames (if it is an OPEN) or the channel number and then the filenames via an RFNAME. %LSSYS+errcode Means that the system call error code describes the problem. %LSFIL+errcode Means that the error code together with the filenames being used describe the problem. 1+.LZ Means that the error should be handled as if it were a fatal interrupt on the specified interrupt bit. For example, the lossage code 1+.LZ %PIMPV will to cause DDT to print out an MPV error message. These lossage codes are more useful with the LOSE and DISMIS symbolic system calls. 0 Signifies some other nondescript error condition. The usual way of using this uuo is to put it after a system call which is expected always to skip. If it fails to skip, DDT will print an error message based on what the system call is and what it was failing to do (if you said 1000 or 1400). Proceeding the job will retry the call. See also the LOSE symbolic system call. This call never gets an error, and never returns. .LTPEN block hack light pen This uuo hacks the light pen on the 340 display. The address should be the start of a six-word block. The first word controls the mode: 4.9 0 => ignore other bits, 1 => examine them. 3.1 1 => hang until light pen seen at least once. 1.1 Used to set the multiple sighting mode (1 = on). The six words of data returned are as follows: wd 0 The word read by DATAI from the 340 display at the last light pen interrupt. wd 1 Number of times the light pen interrupted since the last .LTPEN uuo. wd 2 Sum of all Y coordinates since the last .LTPEN uuo. wd 3 Sum of all X coordinates since the last .LTPEN uuo. wd 4 The current linked display list pointer. wd 5 The current BLKO display pointer. If the job does not currently possess the 340 display, words 0 and 1 are set to zero. If the system has no 340, .LTPEN is ignored.  .MASTER ac, request/release master mode ;skip if successful Accumulator should have bit 4.9=1 to request master mode, or =0 to release it. Releasing master mode always succeeds, even if the job did not have it. Requesting master mode succeeds if the job already has master mode, or if it has control of its tty (as determined by bit 4.9 (%TBNOT) of the .TTY user variable). Only one job at a time may have master mode; thus requesting master mode may imply taking it from some other job. A job in master mode gets double priority for run time; that is, it tends to get twice as much run time as any other job competing for run time. Furthermore, it has priority in grabbing the 340 display from another user. (The precise algorithm for grabbing the 340 is actually a function of who has master mode and of the %TT340 and %TT3HP bits of the TTYTYP variables of the jobs involved.) Master mode should be used only when absolutely necessary. Needless use of it is considered to be antisocial, and may be grounds for harassment. .MTAPE ac, hack magtape ;skip if successful Accumulator should have a channel number in the left half and an address in the right half. (An illegal channel number causes an illegal operation interrupt (%PIILO, bit 1.6 of the .PIRQC user variable).) The channel should have device MTn open on it. The address should point to a word with a signed count in the left half and a function code in the right half. Valid function codes are: 0 Hang until tape motion done. 1 Rewind tape. 2 Rewind and dismount. 3 Write end-of-record (i.e. force current output buffer). 4 Write three inches of blank tape. 5 Write end-of-file. 6 Space over records (negative => backwards). Illegal for output channel. 7 Space over files (negative => backwards). Illegal for output channel. 10 Space to end-of-tape. 11 Stop all commands on this channel. 12 Set block size for writing to words. 13 Return block size in . For reading, this is the size of the record most recently swallowed by an IOT. This operation may trigger one of the following IOC errors, causing an interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable): 1 ILLEGAL HARDWARE OPERATION ATTEMPTED 3 NON-RECOVERABLE DATA ERROR 9 DEVICE FULL .NDIS ac, display times ;skip if successful This uuo is intended for use in taking pictures of the 340 display screen. It sets a display control variable from the contents of accumulator . This variable has no effect if negative, but if zero it inhibits display completely, and if positive is decremented by 1 each time the current display block or list of blocks is displayed. This call fails to skip if the job does not possess the 340 display. On systems which don't have a 340, .NDIS is ignored. .NETAC chnum, OBSOLETE accept network connection ;skip if successful This UUO is obsolete. It is documented here for historical purposes only. It now ALWAYS fails to skip. Channel should be be a network channel in the "RFC received while listening" (%NSRFC) state (see the ITS NCP file.) This is used to accept a connection on a socket opened with mode bit 1.5=1 (see the OPEN symbolic system call). An RFC is sent back and the channel put into the "connection open" state. To reject a connection, the channel should be closed with either the .CLOSE uuo or the CLOSE symbolic system call.  .NETINT chnum, OBSOLETE network interrupt This UUO is obsolete. It is documented here for historical purposes only. It is now always a no-op. Sends an interrupt out on the network socket associated with channel number , which should be open on the NET device. If the local socket number is even (receiving), an INR message is sent; otherwise, INS is sent.  .NETS chnum, network send Channel number should be open for network output. The .NETS uuo forces the current output buffer to be sent. If the channel is open in the wrong direction, IOC error 1 (ILLEGAL HARDWARE OPERATION ATTEMPTED) will occur, possibly giving the user an IOC interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable). .OPEN chnum,block open a file ;skip if successful This uuo is semi-obsolete. The OPEN symbolic system call is somewhat more flexible and consistent. However, it is still reasonable to use .OPEN for devices which do not use directory names. A file is opened on the channel specified by . That channel number is then used to specify the file on all further I/O transactions on that file. The address should be the first of several locations: wd 0 ,, wd 1 File name 1, if applicable. wd 2 File name 2, if applicable. wd 3 For the NET device, the foreign host number. The directory name, if applicable, is taken from the .SNAME user variable. Note that the device name may be only three characters. The mode bits are as for the OPEN symbolic system call. If bits 4.9-4.7 of word 0 contain 2, then a link is created. Words 1-5 are then as follows: wd 1 From file name 1. wd 2 From file name 2. wd 3 To file name 1. wd 4 To file name 2. wd 5 To sname. .OPEN should never be used in this way in new programs; use the MLINK symbolic system call instead. If the .OPEN fails to skip, an error code as for .CALL OPEN will be returned on channel . .OPER random operation The term .OPER is used to refer to a class of uuo's which all have the same op-code and are decoded by the value of their effective address. Those .OPER's which take arguments generally specify either an accumulator or an I/O channel number in the accumulator field of the .OPER. If the effective address is not a valid .OPER number, then the job executing the .OPER receives an illegal operation interrupt (%PIILO, bit 1.6 of the .PIRQC user variable). A list of currently valid .OPER's is given below in numerical order. .OPER 0 illegal .OPER 1 .ITYI .OPER 2 .LISTEN .OPER 3 .SLEEP .OPER 4 .SETMSK .OPER 5 .SETM2 .OPER 6 .DEMON .OPER 7 .CLOSE .OPER 10 .UCLOSE .OPER 11 .ATTY .OPER 12 .DTTY .OPER 13 .IOPUSH .OPER 14 .IOPOP .OPER 15 .DCLOSE .OPER 16 .DSTOP .OPER 17 .RDTIME .OPER 20 .RDSW .OPER 21 .GUN .OPER 22 .UDISMT .OPER 23 .GETSYS .OPER 24 .IPDP .OPER 25 .GETLOC .OPER 26 .SETLOC .OPER 27 .DISOWN .OPER 30 .DWORD .OPER 31 .DSTEP .OPER 32 .GENSYM .OPER 33 .LOGOUT .OPER 34 .REALT .OPER 35 .WSNAME .OPER 36 .UPISET .OPER 37 .RESET .OPER 40 .ARMOVE .OPER 41 .DCONT .OPER 42 .CBLK .OPER 43 .ASSIGN .OPER 44 .DESIGN .OPER 45 .RTIME .OPER 46 .RDATE .OPER 47 .HANG .OPER 50 .EOFC .OPER 51 .IOTLSR .OPER 52 .RSYSI .OPER 53 .SUPSET .OPER 54 .PDTIME .OPER 55 .ARMRS .OPER 56 .UBLAT .OPER 57 .IOPDL .OPER 60 .ITYIC .OPER 61 .MASTER .OPER 62 .VSTST .OPER 63 .NETAC .OPER 64 .NETS .OPER 65 .REVIVE .OPER 66 .DIETIME .OPER 67 .SHUTDN .OPER 70 .ARMOFF .OPER 71 .NDIS .OPER 72 .FEED .OPER 73 .EVAL .OPER 74 .REDEF .OPER 75 .IFSET .OPER 76 .UTNAM .OPER 77 .UINIT .OPER 100 .RYEAR .OPER 101 .RLPDTM .OPER 102 .RDATIM .OPER 103 .RCHST .OPER 104 .RBTC .OPER 105 .DMPCH .OPER 106 .SWAP .OPER 107 .MTAPE .OPER 110 .GENNUM .OPER 111 .NETINT .PDTIME ac, PD time Returns in accumulator the time since the beginning of the year, measured in sixtieths of a second. If the time is not known, -1 is returned. PD = Paul DeCoriolis, who hacked the original clock on which this was based. Said clock ceased to work many years ago.  .POTSET  .RBTC ac, robot console switches The contents of accumulator are sent to the robot console (device 514) with a DATAO. After a short delay the result of a DATAI are returned in . What the heck is device 514??? .RCHST ac, OBSOLETE read channel status This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by the RCHST and RFNAME symbolic system calls. Accumulator should contain a channel number in the left half and an address in the right half pointing to a block of several words. The executing job receives an illegal operation interrupt (%PIILO, bit 1.6 of the .PIRQC user variable) if the channel number is illegal. The block of words is filled with information about the status of the channel. The general pattern of this information is as follows, though not all devices adhere to it strictly: wd 0 Device name in the right half. wd 1 First file name, if applicable. wd 2 Second file name, if applicable. wd 3 Sname (directory name), if applicable. wd 4 Access pointer. Measured in words. A byte pointer if in character mode, for some devices. -1 if not randomly accessible. wds 5-n Other data. May be garbage, or not stored, depending on the device as specified by word 0. See the RCHST symbolic system call for details of what information is returned for specific devices. Wd 0 from .RCHST has in its RH the LH of symbolic RCHST's 1st value. Wds 1-4 from .RCHST are the same as the 2nd-5th values returned by symbolic RCHST. Wds 5 and up from .RCHST are the same as values 7 and up of symbolic RCHST, except that they are not stored for devices which do not return significant information in them. Note that value 6 of the RCHST symbolic system call is not available from .RCHST. .RD500 ac, ANCIENT HISTORY read device 500 This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .IPDP. Device 500 formerly purported to be some kind of clock.  .RD710 ac, ANCIENT HISTORY read device 710 This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .HANG. Device 710 used to be a kind of clock on the PDP-6. This uuo read a 24.-bit quantity from this clock, measured in 4-microsecond ticks.  .RD760 ANCIENT HISTORY This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .DWORD. Device 760 of the PDP-6 used to be used for temporary direct sense hookups. (For example, the low six bits controlled lights on the hand of the AMF arm.) This uuo returned the result of a DATAI on this device. .RDATE ac, read date The current date is returned in accumulator as a word of sixbit characters "YYMMDD", where YY is the year (modulo 100.), MM is the month, and DD is the day, all as two-digit decimal numbers. If the system does not know what the current date is, -1 is returned.  .RDATIM ac, read date and time This is exactly like the sequence .RTIME ac, .RDATE ac+1, except that the timing error involved with crossing midnight between execution of the two uuo's is avoided. Thus accumulator receives the time of day as a word of sixbit "HHMMSS", where HH is the hour (in 24.-hour notation), MM is the minute, and SS is the second, all as two-digit decimal numbers. Accumulator receives the date as a word of sixbit characters "YYMMDD" where YY is the year (modulo 100.), MM is the month, and DD is the day, all as two-digit decimal numbers. If one of the quantities is not known by the system, -1 is returned for that quantity.  .RDSW ac, OBSOLETE read switches This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by DATAI. The contents of the data switches on the PDP-10 console are returned in accumulator . The same effect can be achieved by using DATAI 0, (or any arbitrary location instead of ), which, if the job is not in .IOTLSR mode, ITS will interpret specially and simulate. Neither .RDSW nor DATAI works correctly on KL10s. Hopefully this will not inconvenience anyone. On KS10s .RDSW no longer exists.  .RDTIME ac, read system time The time since the system started running, measured in thirtieths of a second, is returned in accumulator . Thus the difference between two successive values gives the amount of real time which passed between the two executions of .RDTIME. This time does not include time during which the system was temporarily down, for instance stopped at a bug halt from which it was later continued by a system hacker. .REALT ac, real time hackery ;maybe skip on success (see below) This uuo controls a fairly complex facility allowing a job to get good service in real time. The contents of the specified accumulator are decoded as follows: %RLFLS 4.9 Turn off old clock rate, zero the tick count, and release the real time facility. %RLSET 4.8 Turn on new clock rate. %RLUSR 4.7 Attempt to seize the real time facility. %RLNPS 4.6 Do not settle for pseudo-real time status. %RLPSD 4.5 Insist on pseudo-real time status. %RLBLK 4.4 Block me except during high priority period. %RLGET 4.3 Read into words 2-3 (see below) before interpreting the other bits. 4.2-3.1 Reserved. Should be zero. 2.9-1.1 Pointer to four word block: wd0 Frame time in sixtieths of a second. Must fit in the right half. wd1 Priority time in sixtieths of a second. Must be less than 15 octal, and less than or equal to half the contents of word 0. wd2 If bit 4.3 on, set the right half to the frame time, and the left half to the tick count since last examined. wd3 If bit 4.3 on, set the right half to the high priority time, and the left half to 0 if currently at low priority or -1 if currently at high priority. The real time facility is interpreted as follows: real time is broken up into cycles, each the number of sixtieths of a second in length specified by the frame time. At the beginning of each frame, the %PIRLT bit (4.8) in the job's .PIRQC user variable is turned on. This causes an interrupt if the corresponding bit is on in the .MASK user variable. Within each frame, the first sixtieths are high priority time for the job with the real time facility, where is the specified high priority time. If a job has the facility, presently has high priority, and otherwise wants to run, then it is scheduled above all other jobs. This guarantees that a job will get a certain amount of run time at specified intervals; this is useful for responding to real-time conditions. The system will not schedule the job during its low-priority phase if it has requested that it be blocked (bit 4.4), unless it gets an interrupt and is not using the new-style interrupt system. The .REALT uuo will skip only if the facility was requested and successfully seized. In all other cases it does not skip, even if the requested operation succeeded. If an invalid quantity is supplied for a frame time, or for the high priority time, an illegal operation interrupt occurs (%PIILO, bit 1.6 of the .PIRQC user variable). .REDEF ac, redefine symbol to exec DDT ;skip if successful The specified accumulator should contain the address of a two word block: wd0 SQUOZE bits,symbol wd1 value If the are all ones, then the symbol is deleted. Otherwise it is defined with the specified value, replacing any old value. This occurs in the symbol table used by exec DDT, which is used to debug the system, and which is used by the .EVAL uuo. A .REDEF fails to skip only if it tries to add a new symbol and fails for lack of room in the system.  .RESET chnum, reset I/O channel I/O channel is reset. This is exactly like the symbolic system call RESET. What happens is device-dependent; see the description of that call.  .REVIVE revive system This uuo reverses the effect of the .SHUTDN uuo. It is used by the REVIVE command of LOCK. Jobs which have enabled it will receive an interrupt (bit 1.7 of the .PIRQC user variable). See the .DIETIME and .SHUTDN uuo's, and the SSTATU symbolic system call. .RLPDTM ac, read localized PD time and .RYEAR This returns the time and date in and , in a binary form. contains the result of .RYEAR; see the description of that uuo for details. contains the "localized" number of seconds since the beginning of the year. If this is divided by the number of seconds in a day (86400.), the remainder will be the number of seconds since midnight local time, and the quotient will be the number of days since the beginning of the year, with the (mis)feature that all years are considered to include February 29. This is done so that date-printing routines do not have to check for leap-year, but it does mean that during the last 10 months of non-leap years the day number is 1 greater than the correct Julian day. Bit 4.9 of is set in this case. Note also that when daylight savings time is in effect will be advanced by one hour. Again this is done to simplify date and time printing routines. Bit 4.7 of is set in this case. Note that .RLPDTM should be used instead of .PDTIME followed by .RYEAR, since it guarantees consistency of the two values returned.  .RRTIM ac, ANCIENT HISTORY read run time This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function has been superseded by the .RUNT user variable. Its opcode has been recycled as .CBLK. The job's run time is returned in accumulator . See the .RUNT user variable.  .RSYSI ac, read system incarnation Returns in the .FNAM2 of the system when it was assembled. Thus, it is a version number in sixbit. This is the same as the seventh value of the SSTATU symbolic system call.  .RTIME ac, read time The time of day is returned in accumulator as a word of sixbit characters "HHMMSS", where HH is the hour (in 24.-hour notation), MM is the minute, and SS is the second, all as two-digit decimal numbers. If the system does not know the time, -1 is returned. See also .RDATIM.  .RYEAR ac, read year Returns in accumulator a word as follows: 4.9 This year has 365. days, and it is after February 28. 4.8 This year is a leap year (366. days). 4.7 Daylight savings time is in effect. 4.6 The time of year is known. 4.2-3.9 If bit 4.6 set, the current day of the week. Sunday=0, Monday=1, etc. 3.8-3.6 The day of the week of January 1 of this year. 3.5-3.1 Zero. 2.9-1.1 The year, not modulo 100., but as a full quantity, e.g. 1969. or 1975. If the system does not know the time, zero is returned. .SETLOC ac, deposit in system Expects the rh of to contain the address of a location in physical core, and the lh of to point to a word of data in the executing job's memory. The job's argument word is copied into the addressed location in physical core, and a message is printed on the system console.  .SETM2 OBSOLETE set two interrupt masks This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by block-mode .SUSET of .MASK and .MSK2. The job's .MASK and .MSK2 user variables are set to the respective contents of accumulators and .  .SETMSK ac, OBSOLETE set interrupt mask This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by .SUSET of .MASK. The job's .MASK user variable is set to the contents of accumulator . .SHUTDN ac, shut down system ;skip on success This uuo causes the system to prepare to go down. (It is used by the KILL command in LOCK.) Accumulator should contain a time interval, in thirtieths of a second. The system will go down exactly that much time after the present moment. When the system prepares to go down, all jobs enabled for it receive a system going down interrupt (%PIDWN, bit 1.7 of the .PIRQC user variable). (DDT prints a message when it receives such an interrupt; part of this message is the contents of the file SYS:DOWN MAIL.) This interrupt will occur repeatedly every time 3/4 of the time from the previous interrupt to the time of shutdown has elapsed, except that interrupts will not occur less than ten seconds before shutdown. (Thus, if the system were scheduled to go down in ten minutes, interrupts would happen at the following times before shutdown: 10:00, 2:30, 0:37. If in five minutes: 5:00, 1:15, 0:17.) When the magic moment arrives, all users are forceably logged out, all jobs killed (except job trees whose top-level jobs have the %OPLIV bit set in their respective .OPTION user variables -- a feature used primarily by system daemons. Such trees are expected to log out on their own after finishing their work), all micro-tapes are flapped, the file SYS:DOWN MAIL is deleted, "ITS NOT IN OPERATION" messages are printed on all consoles, all Terminet motors are stopped, all files, directories, and TUTs are written out, and everything generally put into a good state; the system then calls DDT. It may be brought back up again with XREVIV$X, which reloads demons and allows ^Z'ing once more. The effects of a .SHUTDN may be reversed by a .REVIVE uuo. See the .DIETIME and .REVIVE uuo's, and the SSTATU symbolic system call. .SLEEP ac, sleep The .SLEEP uuo temporarily puts the executing job into a dormant but interruptable state. The job consumes no run time until the specified time interval has elapsed, unless an interrupt occurs. The contents of accumulator specify how long the job is to sleep. If non-negative, it is the length of time to sleep in thirtieths of a second. If negative, it means to sleep until the system TIME variable (which is read by the .RDTIME uuo (q.v.)) exceeds the absolute value of the specified quantity; thus one can sleep until a specific time. If the job is interrupted in the middle of a .SLEEP, the accumulator will be seen to contain the appropriate negative number, either the one originally there or one calculated from the original positive argument. Thus re-executing the .SLEEP after dismissing the interrupt will cause the .SLEEP to be resumed correctly. Often it is desirable to "sleep" until some condition other than the passing of time occurs. For this see the .HANG uuo. For the special case of sleeping until a network socket changes state, see the NETBLK symbolic system call.  .STATUS chnum,loc I/O channel status The status of I/O channel is placed in location . This is exactly like the STATUS symbolic system call.  .SUPSET ac, SUPCOR set The system job is partially controlled by a variable called SUPCOR; .SUPSET XOR's the contents of accumulator with that variable, returning the result of the XOR in . Not all bits specified by take effect; some are AND'ed out first. A message is printed on the system console as for the .IFSET and .SETLOC uuo's. The only really useful bits to set are as follows: 1.6 Update TV who lines. 1.2 Kill current file being spooled from TPL to LPT (this is what the TPL command in LOCK uses).  .SUSET [suset spec] self USET This uuo is used to examine and set user variables associated with the executing job. See ITS USETS for more information on .SUSET and .USET. .SWAP ac, hack swapping This uuo is illegal unless the system is being debugged (the SYSDBG variable in the system is non-zero; see the SSTATU symbolic system call). The bits in the specified accumulator indicate a test of the page swapping software in the system: 4.9-4.7 Operation to perform. 0 Swap out the number of pages specified in 2.9-1.1. 1,3,5,7 Go into a loop, waiting for a few seconds and then referencing location 2000 octal. 2 Hack the PCLSR test feature on this job. Bits 2.9-1.1 specify the test mode: -1 Enter in hold mode. 0 Leave PCLSR test mode. 1 Enter in advance mode. 2 Enter in advance but don't ^Z. 4 Swap out the virtual page specified by bits 2.9-1.1 for the user specified by bits 3.9-3.1. 6 Swap out all pages for the user specified by bits 3.9-3.1. 3.9-3.1 User index, for operations 4 and 6. A user index of zero means the job executing the .SWAP. (After all, it's hard to swap out the system!) 2.9-1.1 Number of pages for operation 0. Test mode for operation 2. Virtual page number for operation 4.  .TRANAD OBSOLETE translation-list add  .TRANDL OBSOLETE translation-list delete  .TRANS ANCIENT HISTORY translate file name  .UBLAT ac, micro-tape blat (?) ;skip if successful The specified accumulator should contain a micro-tape drive number. If the uuo succeeds, the drive is marked as being in .UBLAT mode. In this mode, there are only two permissible operations on the drive: to dismount (flap) it, and to open it as one giant file. This uuo is intended for use in reading micro-tapes written in non-standard (e.g. DEC) format. Any .OPEN on a micro-tape in .UBLAT mode will ignore the file names, and all the blocks of the tape except block 0 will be read or written consecutively. No deletes, renames, etc. are permitted. A .UBLAT will fail if the drive does not exist, if the micro-tape directory has been read in already by the system, or if the drive is not assigned to the user whose job is trying to do a .UBLAT. .UCLOSE chnum, USR close This uuo is used to explicitly kill an inferior open on channel . Merely performing a .CLOSE on the channel is not enough - that dissociates the inferior from the I/O channel, but does not destroy the inferior procedure. When the procedure is destroyed, all of its inferiors, direct or indirect, are destroyed also. As each job is destroyed, its I/O channels are automatically .CLOSE'd, and any facilities such as .MASTER mode are released. The translation lists are cleared for all destroyed jobs. If any procedure whatever has a destroyed job open on an I/O channel, that channel is automatically closed; in particular, the channel is closed. All jobs with channels which have the job open as a foreign user (as opposed to an inferior or a job device) also receive a word 2 I/O interrupt on each such channel (see the .IFPIR user variable). If a procedure has pushed a channel with a job to be destroyed onto its I/O pdl (see the .IOPUSH, .IOPOP, and .IOPDL uuos, and the .IOC, .IOS, and .IOP user variables), then that I/O pdl entry is replaced on the pdl with a special entry for a pseudo-device called the "interrupt on .IOPOP device", which delivers a word 2 interrupt when popped from the I/O pdl and then closes its channel (thus it should be impossible to perform any operation on this "device" except .IOPOP). In this way a job can detect the fact that a foreign job disappeared while it was pushed. A procedure which executes a .UCLOSE receives an I/O channel error interrupt (%PIIOC, bit 1.9 of the .PIRQC user variable) if the specified channel does not have an immediately inferior procedure open on it. .UDISMT ac, micro-tape dismount ;skip if successful The specified accumulator should contain a micro-tape drive number. If the uuo succeeds, the directory is written back onto the micro-tape and excised from the system's memory. The micro-tape is then physically dismounted (this is known as "flapping" the tape, since when it runs off the reel it goes flap, flap). Micro-tapes should not be manually dismounted, for this will cause the directories to get out of phase, messing up that micro-tape and the next one to use that drive. The .UDISMT will fail if any files are still open on the micro-tape, or if someone else has the drive assigned to him. DDT makes this available via its command :FLAP. See also the FLAP symbolic system call.  .UINIT ac, initialize micro-tape ;skip if successful The specified accumulator should contain a micro-tape drive number. If the uuo succeeds, the directory of the micro-tape is initialized (containing no files). The uuo fails if the drive does not exist, or if the drive is not assigned to the user whose job is trying to do the .UINIT. See the .ASSIGN and .DESIGN uuos.  .UPISET ac, OBSOLETE user priority interrupt set This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by .SUSET of .PICLR and/or the .DISMISS uuo and the DISMIS symbolic system call. The value of the ac is converted to -1 or 0 on the basis of bit 4.9; this value is then exchanged with the .PICLR user variable for the executing job. Thus the accumulator gets the old value of .PICLR even as it specifies a new value. This allows enabling and disabling of interrupts. .USET chnum,[uset spec] set (or get) user variable This uuo is used to inspect or alter the user variables of a job open on channel , which may be a channel open on the USR or BOJ device. See ITS USETS for further information on .USET and .SUSET.  .UTNAM ac, set micro-tape name ;skip if successful The specified accumulator should contain a micro-tape drive number in the right half and a three character sixbit name in the left half. If the uuo succeeds, the name of the micro tape will be changed to the one specified. The uuo fails if there is no such drive, if it is in .UBLAT mode, or if it is assigned to another user. The name of a micro-tape can be examined with the .RCHST uuo.  .UTRAN loc user interrupt bit translate ;skip if successful The effective address of .UTRAN must be a three-word block: loc: bit,, ;interrupt bit of inferior 0 ;uname returned here 0 ;jname returned here The first word should be all zero, except for one of bits 3.1-3.8; these correspond to inferior interrupt bits in the .IFPIR user variable. If the job executing job has an inferior for that interrupt bit, .UTRAN stores the uname and jname of the inferior in the second and third words and skips; otherwise it fails to skip. DDT uses this to find jobs which have been :FORGET'ed, or accidentally created by open's of the USR: device via :PRINT etc. Normally, superiors should keep track of the interrupt bit and job names when the job is created, and this UUO should be used only for exceptional cases. See the .IFPIR, .UNAME, .JNAME, and .UIND user variables. .VALUE [item] return value to superior The job which executes a .VALUE receives a class 1 interrupt, which stops the job, turns on %PIVAL (bit 1.8) in its .PIRQC variable, and interrupts its superior. The word is placed in the .VAL variable of the executing job (this fact is a historical artifact, relatively useless now). The standard superior procedure (DDT) imposes the following additional semantics on .VALUE: If the effective address is zero, then DDT prints out a message to that effect, and the job is left stopped. This used to be the standard way to crap out from a grossly irrecoverable situation (e.g. can't get core, or can't open the TTY when started). Now .LOSE (q.v.) is preferred. A typical sequence is: GO: .OPEN TTYC,[SIXBIT \ !TTY\] .VALUE ;unhappy if never got TTY .CALL [ SETZ ? 'TTYGET ? 1000,,TTYC ? 2000,,A ? 402000,,B ] .VALUE ;shouldn't lose if .OPEN succeeded If the effective address is not zero, it is assumed to point to an ASCIZ string in the memory of the job which executed the .VALUE. DDT proceeds to interpret these characters as if they were typed to DDT on the console. Thus a job might execute .VALUE [ASCIZ \:PROCED :DISOWN V\] or something similar, to get itself running again and disowned from its superior. See the DDT documentation for specific details on .VALUE. .VSCAN  .VSTST  .WMAR ac, ANCIENT HISTORY write mar address This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function has been superseded by .SUSET of .MARA. Its opcode has been recycled as .DCONT. The user's mar address variable is set from the contents of the specified accumulator.  .WR760 ac, ANCIENT HISTORY write device 760 This uuo NO LONGER EXISTS. It is documented here for historical purposes only. Its function is obsolete. Its opcode has been recycled as .DSTEP. Device 760 of the PDP-6 used to be used for temporary direct sense hookups. (For example, the low six bits controlled lights on the hand of the AMF arm.) This uuo used the contents of accumulator for a DATAO to device 760.  .WSNAME ac, OBSOLETE write system name This uuo is ARCHAIC and OBSOLETE. It is documented here for historical purposes only. Its use in new programs is to be avoided. Its function has been superseded by .SUSET of .SNAME. The system name for the job (used as a file directory name) is set to the sixbit contents of accumulator .