This reference manual consists of two parts. The first (sections 1 through 6) is intended for those who are either interested in the ITS 1.5 time sharing monitor for its own sake or who wish to write machine language programs to run under it. Some knowledge of PDP-6 (or PDP-10) machine language is useful in reading this part. The second part (sections 7, 8 and 9) describes three programs that run under ITS. The first program (DDT) is a modified machine language debugging program that also replaces the "monitor command" level (where the user is typing directly at the monitor) present in most time-sharing systems. The remaining two (PEEK and LOCK) are a status display and a miscellaneous utility program. It should be remembered that the McCulloch Laboratory PDP-6 and PDP-10 installation is undergoing continuous software and hardware development which may rapidly outdate this manual.
Work reported herein was supported by the Warren McCulloch Laboratory, an M.I.T.
research program sponsored by the Advanced Research Projects Agency of the Department
of Defense under Office of Naval Research contract number N00014-70-A-0362-0002.
Reproduction of this document, in whole or in part, is permitted for any purpose
of the United States Government.
This manual was transcribed by David Carter from a
scanned, typewritten original between February 27, 2004 and March 10, 2004. Effort
has been put into being as accurate as possible in the transcription process,
but due to the condition of the original, some errors have no doubt been made.
Where there is uncertainty about a particular character or word, a best guess
has been made. Please send any corrections to dcarter at sigfs dot org, especially
if you have page 19 of the original! The original file came from ftp://publications.ai.mit.edu/ai-publications/0-499/AIM-161A.ps
so refer to that if you're in doubt about anything.
This came from http://www.sigfs.org/its-reference/
so you should check there for any updates. This file is available in PDF, HTML,
ASCII, LATEX and the original LYX, so hopefully one of those formats fits
your need. If you convert this file to another widely-used format, please send
me a copy so I can post it.
The reader will find below in section 0.2 a few notes on the notation used in this manual. This is followed in section 0.3 by fairly extensive introductory and overview material on the Incompatible Time Sharing system monitor (ITS), the body of the information which appears in sections 1 through 6. Then in section 0.4 will be found a brief preview of the information appearing in sections 7, 8, and 9 about the three programs DDT, PEEK, and LOCK respectively. The first of these is a modified machine language debugging program that replaces the "monitor command" level (where the user is typing directly at the monitor) present in most time sharing systems. The remaining two are of a status display and miscellaneous utility nature. These three sections are each fairly self-contained as opposed to any particular section of the six on ITS which may be highly interdependent with other ITS sections. Finally, in section 0.5, appears a summary of the appendices to this manual.
It should be remembered that Project MAC, AI Group, PDP-6 and PDP-10 installation is undergoing continuous software and hardware development that may rapidly outdate this manual. Please direct all corrections, additions or comments to the author at:
Donald E. Eastlake III,
Room 915,
545 Technology Square,
Cambridge, Mass. 02139
All numbers written in arabic numerals are octal except as follows:
Character objects and strings are usually surrounded by quotation marks ("") and are relatively clear from context. Non-graphic characters typed by holding down the control key of a teletype and striking a graphic are represented by the graphic preceeded by a "" as in A for "control-A". The special character alt.-mode (or escape or prefix) is represented by "$".
Bit positions in thirty-six bit words (word length on the PDP-6 and PDP-10) are represented by the concatenation of a digit from 1 through 4, a ".", and a digit from 1 through 9. The first digit is a quadrant number starting from the right or least arithmetically significant part of the word. The second digit is a bit number in the quadrant, also starting from the right or least significant bit. Thus 1.1 is the lowest bit and 4.9 the sign bit.
Bit intervals are represented by the concatenation of an included starting bit position, a "-", and an included terminating position. Thus 3.3-3.1 is the lowest octal digit in the left half of a word.
Most internal references in the text of this manual are of the following form: [App x], [Ref x], and [Sec x]. These refer, respectively, to the x'th appendix, the x'th item in the section of this manual entitled "References", and the x'th numbered section of this manual. Some internal references are written out in less formality and combined forms are allowed, such as the following, whose meaning should be evident: [Sec x, y], [App x; Ref x, y], etc.
UUO's ("UnUsed Operations[Ref 1]) that trap to the system [Sec 1.2.1] to request action by it are frequently referred to as "system calls". (This should not be confused with the .CALL subclass of systems calls.) Individually they are written in all capital letters with a preceding period. The reasons for this is that the MIDAS [Ref 3] assembler has just these character strings (actually the first six characters including the period) pre-defined as symbols. In pronouncing them, the period should be ignored.
The use of the system calls described in this manual is frequently illustrated by a short excerpt of pseudo-assembly-language. In such examples, the tag CALL will appear on the line of the system call in question. Frequently set-up instructions precede the call to emphasize certain of its properties. They should not be taken too literally.
The Incompatible Time Sharing system (ITS) is a control program tailored to the Project MAC Artificial Intelligence (AI) Group PDP-6 and PDP-10 installation. It was designed in an attempt to provide the following potential advantages of a time sharing system:
The user of ITS normally commands a hierarchy of programs in machine storage organized in an inverted tree. The top procedure [Sec 7] is initially loaded for him by the system when he informs it of his presence by typing a Z on an idle console [Sec 1.1.1]. All programs may have inferior procedures which they can control. Almost all commands to the system are machine instructions [App A, B; Ref 1], which trap to the monitor, executed for the user by his programs [Sec 1.2]. The only exception is that he may interrupt the superior procedure of the program with which he is conversing by typing Z [Sec 1.2.1]. By this method the user can return to his top procedure at which point Z's typed on his console are ignored by the system.
The majority of the code in the ITS monitor is devoted to input-output. It has been organized with such goals in mind as flexibility, speed, and generality. Simple device-independent system calls applicable to all devices where they are meaningful, more complex but efficient calls applicable to most devices, and specialized system calls enabling nearly full use of some special devices are all available. Most devices are referenced symbolically [App C] and procedures may cause symbolic translations such that an inferior procedure referencing a particular device will in fact get a different device. Input-output may be done a character or word per system call or, for less overhead per character or word, an arbitrary size block of words may be transferred into or out of the user program's core with one system call. The user program is not required to have any buffers in its core image. Many special features relate to consoles or special devices on the PDP-6 such as eyes, arms and the DEC 340 display.
A feature of the ITS monitor not frequently found in time sharing systems and contributing greatly to its flexibility and generally is that user programs may receive software implemented interrupts in much the same way that ITS receives hardware interrupts. The system is so designed that the user is rarely involuntarily uninterruptable for more than a few hundred microseconds. If the interrupt is dismissed in a normal manner the non-interrupt portion of the program can proceed even from the "middle" of a system call taking an arbitrary amount of time.
The ITS core allocator keeps a record of the status of each 2000 word block of memory and the 200 word sub-blocks into which some of these are divided. It allocates and de-allocates memory for and at the request of procedures and system input-output routines. Most of its complexity is due to the lack of paging on the PDP-6 which makes it sometimes necessary to "shuffle" memory to provide sufficient contiguous space for a procedure.
A scheduling algorithm is used which tries primarily to equalize machine time used by each active procedure tree (console) and secondarily to equalize machine time among those procedures in each tree. The system variables related to a particular procedure [App D] used by the scheduler and other parts of ITS are kept in system memory and do not impinge on the user's core image.
User programs operating within the environment provided by ITS are organized (as mentioned in section 0.3.2) as inverted tree hierachies. Superior procedures can retrieve and store words in their inferior procedures as if they were input-output devices. There also exists a large set of special system calls for controlling procedures immediately beneath them and several special ways that procedures may communicate with their superior procedure. Buffered communication between arbitrary pairs of procedures treating each other as input-output devices is also provided [Sec 3.4.3].
A large number of miscellaneous system calls and features exist for a variety of purposes. Some provide easy input-output to devices which do not fit the forms of standard ITS devices. Others provide the use of certain hardware modifications to the PDP-6 which enable the simulation of certain features of manual control of the PDP-6 such as address stop [Ref 1]. The remainder are such minor but necessary functions as login and logout.
A special procedure, known as the system job, exists under ITS. it performs various low priority functions for the system and can check constant portions of ITS against a copy in an attempt to detect some forms of system or hardware failure.
These three programs all run under ITS but are more closely related to it than most other systems programs. The editor (TECO), assembler (MIDAS [Ref 3]), list processing language (LISP), etc. used by the Project MAC AI Group have also been modified to run under ITS but have very similar non-time-sharing versions. PEEK and LOCK would generally be meaningless outside ITS and while there is a non-time-sharing DDT, the version for ITS has been very extensively modified.
DDT originated as a general machine language debugging program on the Digital Equipment Corporation PDP-1 computer. When the hierarchical organization of procedures [Sec 5] and logical simplicity of procedure origination of almost all system actions [Sec 1.2] had been decided upon, the need for a conversational "monitor command" program was recognized. An extensively modified DDT, with commands relating to various ITS features and modifications so as to be able to control multiple procedures was the obvious answer. For historic reasons a top level modified DDT under ITS is known as a "HACTRN".
The first of these utility programs, PEEK, is described in section 8 of this manual. It provides periodically updated displays or printouts of various aspects of the time sharing system's status.
The second and smaller program, LOCK, is described in section 9 of this manual. It performs a variety of miscellaneous functions, some related to testing or debugging ITS.
DDT, described in section 7, is the normal means by which the user may load and transfer control to these programs. Note that the commands P, Q, and ? have the same meaning for both programs. The ? command causes each of them to print a list of their commands with short explanations.
The first three appendices to this manual are for cross-reference and index usage (although important cross-references are frequently included in the text [Sec 0.2.4]). Appendices A and B list system calls [Sec 0.2.5, 1.2.1] in numeric and alphabetic order, respectively, with the number of the manual section most relevant to the call. Appendix C lists symbolicly referenceable input-output devices in alphabetic order with the section or sections most relevant to them.
Appendix D is nearly a direct extract from the source listing of ITS. It is the initial "dummy" image of the user variable area, one of which exists for each procedure [Sec 4, 5] in a system.
Appendix E, included for completeness, lists certain system calls that are being phased out along with their replacements and short descriptions of their functions.
Appendix F lists persons to consult for further information on ITS.
The last appendix, denominated G, gives a single console session with ITS as an illustration in which the self documenting features of DDT, PEEK, and LOCK are exercised.
See also section 0.3.1.
The only item of input-output data recognized by ITS directly as a command is the character Z when received from an idle teletype or from an active console, that is a teletype in control of a procedure tree [Sec 5]. A teletype is a member of the class of devices that may be consoles, currently either a GE Datanet 760 terminal or a KSR 35/37. Teletypes may also be in use as ordinary devices (as Tnm instead of TTY [Sec 3.2.1]) in which case ITS ignores Z's typed on them.
If the teletype is idle, Z normally causes the teletype to become a console and loads and starts as its top level procedure [Sec 5.1, 7] the dump file named "@ HACTRN" on device SYS, or if not found there from device UT2 (see section 2.1 for a discussion of file and device names). The JNAME of a thus initiated procedure is HACTRN and its UNAME and SNAME are set to the value minus 1 [Sec 2.2.3, 5.1; App D]. This will not happen if there is insufficient memory available or if too many people type Z simultaneously. ITS will echo a Z typed on an idle teletype if and only if it succeeded in starting a top procedure. If a failure to start a top procedure is due to a lack of memory, a console free message will be typed out [Sec 6.5].
The effect of Z in the second case, that of an active console, is intended to be such that the user at the console may cause control of his console to revert to higher level procedures and ultimately to his top level procedure even in the face of hostile inferiors.
A Z typed on an active console is ignored by ITS if the console is being controlled by its top level procedure. Otherwise it sets a flag associated with the console so that it may not be assigned downward in the procedure tree [Sec 3.2.1.1]. This flag is cleared only by typing any character other than Z on the console. ITS also sets the Z interrupt bit, a class on interrupt [Sec 4.2], for the procedure controlling the console and possible for an arbitrary number of procedures, each the immediate superior of the last, extending upward in the tree from the procedure controlling the console. The condition for each step upward in the procedure tree is that either the superior to the procedure having its Z interrupts bit set is stopped or the current procedure was found to already have its Z bit on.
Action on Z interrupt bits set will be taken in less than one quantum time when the scheduler [Sec 4.4] next runs.
With the exception of Z all commands to ITS are given by instructions which trap to the monitor. All valid commands are from a class of instructions called UUO's which are characterized by an initial octal digit of 0. These are discussed in section 1.2.1 and listed in Appendices A and B. Section 1.2.2 concerns all other trapping instructions. It is a useful characteristic of the PDP-6 and PDP-10 that an identical effective address calculation is performed on all words fetched as instructions regardless of their operation code or legality [Ref 1]. Thus indexing and indirect addressing are available on all trapping instructions. Interrupts to the monitor as a result of conditions encountered in the execution of an instruction (such as memory protection violation, AR overflow, PDF overflow, etc) rather than the type of instruction are discussed in section 4.2.
The instruction as instructions or words with an operation code [Ref 1] of from 000 to 077 normally results in the instruction word being stored in absolute location 40 modified by having had its effective address computed and stored in its address field and its indirect and index fields cleared. The instruction in absolute location 41 is then executed. Since all ITS system calls utilize only UUO's 040 through 047 the Project MAC AI Group's PDP-6 has been modified so that UUO's 001 through 037 and 050 through 077 will trap, as described above, but directly to the user program's relocated core image with no extra overhead. UUO 000 will also appear to trap to the user but this occurs via monitor simulation that checks to see if relocated location 41 directly addresses (indexing or indirect addressing ignored) a location between 20 and the location 6 less than the top of the user's core image inclusive. If so, a JSR to that location is simulated. If not, the user's illegal instruction interrupt bit, a class two interrupt [Sec 4.2], is turned on and a schedule [Sec 4.4] immediately performed.
Complete lists of system calls appear in numeric order in Appendix A and in alphabetic order in Appendix B. However, a list classified by operation code is listed here:
| UUO | Symbol | Description |
| 040 | .IOT | Executed for each item or block of data transmitted between |
| a user program and a symbolic input-output device [Sec 2.3]. | ||
| 041 | .OPEN | Used to initialize input-output between a device and a |
| program [Sec 2.2]. | ||
| 042 | .OPER | A class of system calls further decoded by the value of their |
| effective address. | ||
| 043 | .CALL | A class of system calls further decoded by the value of their |
| accumulator field. | ||
| 044 | .USET | Executed by procedures to examine and set some of the system |
| variables associated with their inferior procedures [Sec 5.2.3]. | ||
| 045 | .BREAK | Executed by a procedure to signal its superior [Sec 4.3.2]. |
| 046 | .STATUS | Used to ascertain the status of an input-output device, channel, |
| or transfer [Sec 2.5]. | ||
| 047 | .ACCESS | Used in input-output to randomly addressable devices [Sec 2.7.4]. |
ITS system calls were designed to be numerically rather than symbolically decoded
to decrease their cumbersomeness and increase monitor efficiency.
The only other trapping instructions are those whose first octal digit is 7 and the instruction JRST with the 10 or 4 bit on in its accumulator field [Ref 1]. The first of these two includes all instructions which effect hardware input-output and most of those affecting the state of the PDP-6 instruction processor (including user/executive mode). In the second the 10 and 4 bits respectively dismiss a hardware interrupt and stop the PDP-6. The execution of any of these trapping instructions causes an illegal instruction interrupt to the user (a class two interrupt [Sec 4.2]) unless the user's procedure is in iot-user mode [Sec 5.8.3]. The remaining way to affect the state of the processor is a JRST instruction with the 2 bit on in the accumulator field; however, in user mode this will not effect the state of the user, special or iot-user [Sec 6.8.3] modes except that it may turn off iot-user mode.
[original document missing page 19 here]
user core image input-output is negligible in comparison to any significant
processing of the data. Using system buffers has the following advantages:
| CALL: | .OPEN CHNUM,FILNAM |
| ;error return | |
| ;normal return | |
| FILNAM: | MODE,,(SIXBIT /DEV/) |
| SIXBIT /FILNM1/ | |
| SIXBIT /FILNM2/ |
Input-output on a particular channel is initialized by executing a
.OPEN. The channel is numerically specified by the accumulator field of the .OPEN
(CHNUM in the illustration above) and any previous transfer of that channel is
terminated as if by a .CLOSE [Sec 2.7.1]. If the user is interrupted [Sec
4.2] during a .OPEN the channel may have been closed and not yet reopened.
The effective address of the .OPEN should point to the first word of a block
of three words in the user's core image which specify a device, mode, and file.
The second two words specify the two file names (FILNM1 and FILNM2 in the above
illustration). As a convention, the file names are usually thought of as up to
six left-justified sixbit characters rather than thiry-six bit quantities. Some
devices ignore the supplied file names. Other devices augment the file names
by the procedure's system name as explained in section 2.2.3 below. These properties
are indicated in the device descriptions in section 3. The first word has the
three character sixbit device name in its right half (DEV in the above illustration)
and the direction and mode in its left. Immediately below are the standard mode
bits from this left half.
| Bit(s) | Meaning |
| 4.9 | Always ignored. |
| 4.8-3.4 | Device dependant but using zero should be safe. |
| 3.3 | 1ÞImage mode. |
| 0ÞASCII mode, alias character mode. | |
| 3.2 | 1ÞBlock mode. |
| 0ÞUnit mode. | |
| 3.1 | 1ÞOutput. |
| 0ÞInput. |
The device and file specified will be altered by entries in the translation table
[Sec 2.2.2] made by either the procedure or any of its superior procedures.
Because of this translation and the symbolic nature of .OPEN, it is one of the
slower ITS system calls.
If the .OPEN is successful it will skip the immediately following instruction. If not successful it will not skip and will set a "most recent channel in error" system variable associated with the procedure to the channel number on which the .OPEN was attempted. The reason for the failure may be ascertained with a .STATUS [Sec 2.5] or via the ERR device [Sec 3.4.4]. Zero file names are not allowed on many devices and attempts to use them will cause the .OPEN to fail. Any .OPEN closes previously opened devices on that channel whether or not the .OPEN is successful.
For devices with true file structure a file directory of the device may be read by trying to input the file with the name ".FILE.(DIR)". If character mode is used, a readable file directory terminated by a L and C results. If this pseudo-file is read from the DSK, DKn, or Pnm device, only files with the system name [Sec 2.2.3] of the reading procedure will be listed. Both block and unit modes are available [Sec 2.3]. For non-file devices character input of this file name will yield the string "NON-DIRECTORY DEVICE". Attempted binary input will fail (the .OPEN will not skip) except for the UTn devices [Sec 3.1.2] and the DSK family of devices [Sec 3.1.1, 3.1.3] where an actual device dependant binary of the directory will be read. For the DSK family of devices a pseudo-file "M.F.D. (FILE)" is also recognized by the system and yields a list of the system names [Sec 2.2.3] for which directories exist on the disk. In general files may be written with these pseudo-file names and then renamed [Sec 2.4] so their contents can be read back.
In an ITS-produced readable file directory, an "*" by a file name indicates the file is inaccessible. This may be due to the fact that it is just then being written or it may have been deleted while open for reading and will vanish when closed.
Entries in the translation table may be made or deleted by any procedure and have effect only at .OPEN time for the procedure making the entry and its inferiors. The entry consists of the following:
| CALL: | .TRANS FILNAM |
| ;error return | |
| ;normal return | |
| FILNAM: | MODE,,(SIXBIT /DEV/) |
| SIXBIT /FILNM1/ | |
| SIXBIT /FILNM2/ |
This system call is expected to point to a three word block in the
same manner as a .OPEN [Sec 2.2]. It normally skips and returns with the
block replaced by its translation (the block pointed to by a .OPEN is never changed
by the execution of the .OPEN). If too many levels of translation are required
it will not skip and the block will be unchanged.
| CALL: | .TRANAD TBLOCK | |
| ;error return | ||
| ;normal return | ||
| TBLOCK: | UNAME | ;UNAME of procedure making & subject to entry |
| JNAME | ;JNAME for procedure subject to entry | |
| ATMIO,,DEV1 | ;4.9 = 0 Þ retranslate | |
| ;4.9 = 1 Þ atomic, don't retranslate | ||
| ;3.2 = 1 Þ applies to output .OPEN's | ||
| ;3.1 = 1 Þ applies to input .OPEN's | ||
| ;DEV1 = from device | ||
| FN11 | ;from file names | |
| FN12 | ||
| ,,DEV2 | ;to device | |
| FN21 | ;to file names | |
| FN22 |
This system call makes new entries in the translation table. All information
for the entry is specified by an eight word block pointed to by the UUO (TBLOCK
in the illustration above). Before trying to insert a new entry in the translation
table, this system call simulates a .TRANDL pointing at the same block to eliminate
redundant entries. If a .TRANAD is successful in creating an entry it skips.
If not, because the first entry in the block is incorrect or the translation
table is full, it returns without skipping.
This system call deletes entries in the translation table and normally points at an eight word block identical to the one which was used by the corresponding .TRANAD. See section 2.2.2.2 immediately above for the contents of this normal block. If may, if appropriate, modify the ATMIO bits of an entry for both input and output to delete one or the other. It skips if successful in deleting an entry or removing one of the directions to which it applies. If it effects no change in the translation table, it returns without skipping. It also has a special form where the first work of the block is zero (not a possible UNAME). In this case all entries previously made by the procedure doing the .TRANDL relating to the JNAME in the second word of the block are deleted. This special form always skips and does not examine the remaining six words of the block.
In order to distinguish the files of different users of ITS on shared devices with common file directories a third file name is used. This file name is referred to as a procedure's "system name" or SNAME.
In reading, writing, deleting, etc. files on the DSK and related devices [Sec 3.1.1] and on the core link devices [Sec 3.4.3], ITS obtains a third file name from the SNAME [App D] associated with the procedure. This variable is set, when the procedure is initially created, to the common UNAME [App D] of the procedure tree [Sec 5.1] the procedure is in. This is normally the name the user has logged in as [Sec 5.1] so his procedures will initially refer to his files. However, a procedure may examine and change its own SNAME by means of an .SUSET [Sec 4.5] and may examine and change the SNAME of any of its inferiors with a .USET [Sec 5.2.3].
The system name facility is also used to simulate certain pseudo-devices as explained in sections 3.1.3 and 3.4.5.
| ;unit mode | ||
| CALL: | .IOT CHNUM,DATLOC | |
| ;return | ||
| DATLOC: | ;place char or word read into or written from | |
| ;block mode | ||
| CALL: | .IOT CHNUM,PNTR | |
| PNTR: | -LENGTH,,DATLOC | ;pointer, modified during transfer |
| DATLOC: | BLOCK LENGTH | ;block read into or written from |
All actual data transfers to or from devices being handled via input-output
channels are initiated by .IOT's. The accumulator field of a .IOT should contain
the number of an input-output channel (CHNUM in the above illustrations) that
has been set up for transfer in a particular mode between the procedure and a
particular device by a successful .OPEN [Sec 2.2]. If the channel has not
been .OPEN'ed the procedure will receive an input-output channel error interrupt
(a class two interrupt [Sec 4.2]). Also the number of the channel on which
the .IOT was attempted will be remembered as the most recent erroneous channel
for use by the ERR device [Sec 3.4.4]. The effective address of a .IOT is
used somewhat differently depending on whether the channel is open in unit or
block mode.
For unit mode (the first of the two illustrations above) the effective address points to a word to be written from or read into. For character unit modes the character is right justified and the rest of the word is ignored on output and zeroed (except as mentioned in section 2.3.1 on input. Some devices, which are classified as input, use the contents of the effective address as an argument to determine what they will store back (see devices IMX, VID, and NVD).
Block modes always read or write to a contiguous block of words. The contents of the effective address of the .IOT is interpreted as having minus the length of the block in its left half and the address of the first word in its right half (see second illustration above). Block mode normally treats each word in the block identically to the corresponding unit mode except that block character modes pack five characters of seven bits per word left adjusted. The block pointer word pointed to by the .IOT is advanced as the transfer progresses so that if it completes the left half will be zero and the right half will point to one greater than the last word processed. If a procedure is interrupted out of a block mode .IOT the pointer word will reflect the progress of the transfer when it was interrupted.
Block character input-output from some devices which are naturally one character at a time is limited to blocks of length 77777 words or less and the top three bits of the pointer word are used during the transfer as a character count.
When a .IOT returns to the user without causing an input-output channel error, the transfer it requested will have been completed for unit mode input or output or block mode output. For block mode input, the count in the pointer word will indicate the amount transferred which may be less than that requested if an end of file is reached [Sec 2.3.1].
For devices on which the end of file while reading condition is meaningful it is signaled to the user in various ways depending on the transfer mode. For character devices in the character at a time mode a C will be read with the left half of the word read into set to minus one. In block character mode the last word will be filled out with C's. Usually the pointer word will not have counted out as the end of file did not occur on a block boundary. For word devices, the user must normally determine the logical end of file from the data being read although physical end of file is detectable in block mode by the lack of advancement of the pointer word. On some devices, attempts to read beyond an end of file will cause the input-output channel to be automatically .CLOSE'ed [Sec 2.7.1] and further .IOT's will cause input-output channel errors (class two interrupts [Sec 4.2]).
When packed characters are being read from a word device the physical block is normally filled out with C's but some older files on DEC tape [Sec 3.1.2] are filled out with the character whose ASCII value is 141 ("a"). The end of file character for a particular file can be determined after the file has been opened by putting the number of the input-output channel it is open on in the accumulator specified by an .EOFC. This channel number will be replaced with the end of file character for that channel by the execution of the .EOFC. See following illustration:
| MOVEI AC,CHNUM | ||
| CALL: | .EOFC AC, | ;replaces CHNUM in AC with eof character |
| ;return |
Attempted output on a full file structured device (UTn, DSK) results in an input-output channel error (a class two interrupt [Sec 4.2]) for the outputing procedure. This interrupt will occur for the .IOT that failed in such a way that it may be successfully resumed if the procedure's interrupt routine or some other procedure deletes material from the full device. The channel on which the error occured is saved by ITS for the ERR device.
ITS normally encounters non-recoverable data errors when reading into its buffer for the user asynchronously with any UUO's by the user. After a fixed number of attempts it accepts the possible erroneous data which it will later give to the user if her reads far enough. It also sets a flag related to the channel so the next .IOT performed on it will give an input-output channel error interrupt. The purpose of this flag is to avoid giving the user a channel error interupt with no indication of which channel it is on. The user's program may return to the .IOT and continue reading the file after handling the interrupt.
The system call .FDELE is used for deleting and renaming files. It points at a five word block which, for the three types of .FDELE's, contain the following:
| CALL: | .FDELE FBLOCK |
| ;error return | |
| ;normal return | |
| ;file delete | ||
| FBLOCK: | -,,DEV | ;device on which to find file |
| FN1 | ;names of file to be deleted | |
| FN2 | ||
| 0 | ;zero | |
| - | ;unexamined | |
| ;normal file rename | ||
| FBLOCK: | -,,DEV | ;device on which to find file |
| FN11 | ;old file names | |
| FN12 | ||
| FN21 | ;new file names | |
| FN22 | ||
| ;rename of file while open for writing | ||
| FBLOCK: | - | ;unexamined |
| CHNUM | ;channel on which open | |
| FN1 | ;new file names | |
| FN2 |
An .FDELE on a device that is not truly file structured has no effect but skips
as do all successful effective .FDELE's. If a .FDELE does not skip the reason
for its failue may be determined with a .STATUS as though the .FDELE had been
a failing .OPEN on channel zero [Sec 2.5].
| CALL: | .STATUS CHNUM,DATLOC |
| ;return | |
| DATLOC: | ;location status information is stored in by call |
The accumulator field of this system call is the number of an input-output
channel (CHNUM in the above illustration) whose status word replaces the contents
of the effective address (DATLOC in the above illustration) of the UUO. This
status word is described in detail by the tables below; however, its general
composition is as follows:
| Bit(s) | Meaning |
| 1.1-1.6 | ITS physical device code (see table below). |
| 1.7-1.9 | Mode in which device was opened. |
| 2.1 | 1 Þ buffering capacity empty. |
| 2.2 | 1 Þ buffering capacity full. |
| 2.3-2.9 | Device dependent. |
| 3.1-3.6 | Set by failing .OPEN's and .FDELE's |
| 3.7-3.9 | Set by interpreted display [Sec 3.4.1] |
| input-output channel errors (see table below). | |
| 4.1-4.5 | Set by non-display input-output channel |
| errors (see table below). | |
| 4.6-4.9 | Always zero. |
The following is a table of ITS device codes (note that the 40 bit indicates
that the file names used are significant and the 20 bit indictes a software device):
| Code | Symbol | Device |
| 1 | Tnm | Teletype (KSR 35/37). |
| 2 | Tnm | GE display and keyboard. |
| 3 | LPT | Line printer. |
| 4 | VID | Old vidisector ("TVB"). |
| 5 | NVD | New vidisector ("TVC"). |
| 6 | PLT | Calcomp plotter. |
| 7 | PTP | Paper tape punch. |
| 10 | IMX | Input multiplextor (A-D). |
| 11 | OMX | Output multiplexor (D-A). |
| 12 | PTR | Paper tape reader. |
| 13 | DIS | DEC 340 display. |
| 14 | IDS | Interpreted display. |
| 15 | COD | Morse code transmitter. |
| 16 | COD | Morse code receiver. |
| 21 | NUL | Null device. |
| 41 | UTn | DEC tape. |
| 43 | DSK | 2311 disks. |
| 60 | USR | A not immediately inferior procedure. |
| 61 | USR | An inferior procedure. |
| 62 | CLx | Core link device. |
| 63 | - | The directory service [Sec 2.2.1]. |
| 64 | USR | PDP-10 device. |
The following is a list of the codes left by failing .OPEN's and .FDELE's:
| Code | Reason |
| 1 | No such device. |
| 2 | Wrong direction. |
| 3 | Too many translations. |
| 4 | File not found. |
| 5 | Directory full. |
| 6 | Device full. |
| 7 | Device not ready. |
| 10 | Device not available. |
| 11 | Illegal file name. |
| 12 | Mode not available. |
| 13 | File already exists (attempted rename). |
| 14 | Bad channel number (attempted open rename). |
| 15 | Link depth limit exceeded (DSK). |
| 16 | Pack not mounted (Pnm). |
| 17 | Directory not now available. |
| 20 | User doesn't exist (DSK or USR). |
| 21 | Local service only. |
The following are the error codes left by the 340 interpretive display routines:
| Code | Meaning |
| 1 | Illegal scope mode. |
| 2 | Scope hung. |
| 3 | More than 2000 words scope buffer. |
| 4 | Memory protection violation. |
| 5 | Illegal scope operation. |
| 6 | Memory protection violation on PDL pointer. |
| 7 | Illegal parameter set. |
The following are the non-display input-output channel error codes:
| Code | Meaning |
| 3 | Non-recoverable data error on read [Sec 2.3.3]. |
| 4 | Non-existant sub-device (such as IMX channel [Sec 3.3.3]). |
| 5 | Over .IOPOP [Sec 2.6.1]. |
| 6 | Over .IOPUSH [Sec 2.6.1]. |
| 7 | Channel does not have a procedure open on it. |
| 8 | Channel not open. |
| 9 | Device full [Sec 2.3.2]. |
For greater flexibility in input-output than that available with the basic input-output channel system [Sec 2.1], a facility is provided whereby a limited number of input-output transactions may be stored for later resumption. Meanwhile the channel they were being effected on may be otherwise utilized.
| CALL: | .IOPUSH CHNUM, | ;push channel number CHNUM |
| ;return | ||
| CALL: | .IOPOP CHNUM, | ;pop channel number CHNUM |
| ;return |
These instructions treat input-output channels as the PUSH and POP
instructions [Ref 1] do memory locations. A channel may be .IOPUSH'ed regardless
of whether it is open or not and any transfer in progress on it will be inaccessable
until the slot occupied by the information pushed is .IOPOP'ed (possible by .IOPDL
[Sec 2.6.2]) into a channel (possible different from that from which it was
.IOPUSH'ed). The error status and .ACCESS [Sec 2.7.4] pointer for a channel
are also correctly stored and restored. Executing a .IOPOP into a channel first
.CLOSE's the channel. Each procedure's input-output channel push down list [App
D] has space for eight entries.
| CALL: | .IOPDL | ;reset input-output channel pdl |
| ;return |
This system call takes no arguments and is intended to reset a procedure's
input-output channel push down list. Entries on a procedure's input-output channel
push down list actually contain the number of the channel that was pushed to
produce the entry. This information is used only by .IOPDL whose execution is
equivalent to the number of .IOPOP's [Sec 2.6.1] equal to the number of entries
in the procedure's input-output push down list and which .IOPOP each entry back
into the channel from which it was .IOPUSH'ed.
The following system calls relate to most or all devices handled via input-output channels.
| CALL: | .CLOSE CHNUM, | ;close input-output channel |
| ;return |
This system call closes the input-output channel whose number (CHNUM
in the above illustration) is in its accumulator field. It has no effect if the
channel is not open. Executing a .IOT on the channel without reopening it will
result in an input-output channel error. For devices with true file structure
it is at close time that a file with the same name as one being written is deleted.
| CALL: | .RESET CHNUM, | ;reset input-output channel |
| ;return |
This system call is intended to reset system buffer pointers so that
buffered data on an input-output channel (specified by the accumulator field
as with CHNUM in the above illustration) will be ignored. It is currently implemented
for the following devices: Tnm, TTY, LPT, PLT, PTR, TVC, and USR. For the USR
device it has special effects [Sec 3.4.2].
| MOVEI AC, CHNUM | ;set up for channel number CHNUM | |
| CALL: | .ITYIC AC, | ;get interrupt character |
| ;error return | ;none available | |
| ;normal return | ;got one |
It is frequently desirable to examine the characters of an incoming
stream at the interrupt [Sec 4.2] level of a procedure (for "quit"
features, etc.). This system call provides the facility to read these characters
from channels on which devices are open that will provide appropriate interrupts
(TTY and Tnm). The accumulator referred to by an .ITYIC should have an appropriate
channel number placed on it (see illustration above). The execution of an .ITYIC
will then replace this number with the character read and skip. If no character
is available the .ITYIC will return without skipping and if an improper channel
is specified the procedure will receive an illegal instruction interrupt.
| CALL: | .ACCESS CHNUM,LOC | ;set channel pointer to value LOC |
| ;return |
This system call is intended to be used in accessing randomly addressable
devices. A pointer is associated with each input-output channel which is set
to the effective address of a .ACCESS executed with the channel's number (CHNUM
in the above illustration) in its accumulator field. This pointer is set to zero
whenever the channel is closed. Currently this pointer influences only the USR
device [Sec 3.4.2] but it is hoped that random access will be added to the
disk [Sec 3.1.1] routines soon.
Properties and system calls related to particular devices handled via input-output channels are discussed below. Lower case letters in a device name indicate that there are several devices distinguished by numeric digits in their place. The phrase "all standard modes" in descriptions below implies that all combinations of ASCII/image and unit/block modes are available and that ASCII mode implies seven bit ASCII characters and image mode thirty-six bit binary words.
These symbolic devices represent IBM 2311 units attached to the PDP-6. These disks are characterized by interchangable disk packs. A single logical directory is maintained by the system for the entire disk volume. Files are identified by two names [Sec 2.2] and a system name [Sec 2.2.3]. If a file is being read, which of the above symbolic device names is used is entirely immaterial. There are some special aspects to reading directories from these devices as explained in section 2.2.1.
If a file is being written, the DSK device will physically write it on a particular drive whose number is assembled into the system. In contrast the DKn device will write the file on the n'th drive. The Pnm device will try to write on a pack with a particular two digit number.
The actual directory for these devices consists of a master directory for each drive and a user directory for each system name that has been used to write files on the disk. The maximum number of user directories is one hundred. The maximum number of files per user is not fixed as the area in a users directory, used to describe the location of the blocks each file consists of is dynamically allocated. When as is occasionally necessary a garbage collection, to compact the information in a user directory, occurs, the system job [Sec 2.5] prints out a message on its teletype. This warning was added when the garbage collector was less reliable than it now is. The master directory for a drive is read in the first time the drive is referenced. A copy is written back out whenever the disks are idle and the master directory has been changed since it was last written out. User directories are read in when first referenced. If a currently nonexistant user directory is referenced to write it will be created. If rereferenced to read, a special open lose [Sec 2.5] will indicate this to the user. User directories are copied out whenever the disks are idle and they have been changed since last copied out. A user directory in memory may be erased if no files are open in it, a current copy has been written out, and a core request provokes the core allocator [Sec 4.3] to examine the status of an area of memory including the buffer.
The IBM 2311 interface transfers information directly to memory in units of 2000 words. Dynamically allocated buffers in system memory are used for input and output. The capacity of each pack is about thirty times that of a reel of DEC tape [Sec 3.1.2].
| CALL: | .FDELE FBLOCK |
| ;error return | |
| ;normal return | |
| FBLOCK: | 200000,,[SIXBIT /DSK/] |
| SIXBIT /FFNAM1/ | |
| SIXBIT /FFNAM2/ | |
| SIXBIT /TFNAM1/ | |
| SIXBIT /TFNAM2/ | |
| SIXBIT /TSNAME/ |
A special feature of the disk device is that users may establish symbolic
links. If the call illustrated above has been executed, then an attempt to read
the file FFNAM1 FFNAM2 with the system name [Sec 2.2.3] that was being used
by the procedure that established the link will actually refer to file TFNAM1
TFNAM2 with the system name TSNAME. A link may refer to another link and so on
for up to eight levels. Attempting to write or delete through a link writes on
top of or deletes the link rather than the file it refers to.
The devices UT1, UT2, UT3 and UT4 represent the four DEC tape drives on the PDP-6. They are true file structured devices under ITS with all standard modes available. Data is dynamically buffered by ITS for both input and output. The file directory of a tape is read in by the system and retained when a drive is referenced and there is no directory being retained for it. An updated directory will be written out on a particular tape whenever the directory has been changed, no files are open on the tape, and no data transfers are in progress on any drive. Files on UTn do not have a system name [Sec 2.2.3] associated with them. Directories can be excised from core only by the .UDISMT UUO.
| MOVEI AC,TAPEN | |
| CALL: | .UDISMT AC, |
| ;error return | |
| ;normal return |
This system call, if successful, causes a DEC tape's file directory
to be excised from core and the tape to be physically demounted. The drive number
must be in the accumulator specified by the UUO. Manually removing tapes or switching
drive numbers of drives for which ITS is retaining a directory may result in
out-of-date file entries left on tapes and directories for one tape being written
on another.
A .UDISMT skips if and only if successful. It will fail if any files are open on the tape. If a file is opened, deleted, or renamed on a tape while the tape is being dismounted by ITS the dismount will be aborted and the tape retained.
| MOVEI AC,TAPEN | |
| CALL: | .ASSIGN AC, |
| ;error return | |
| ;normal return | |
| MOVEI AC,TAPEN | |
| CALL: | .DESIGN AC, |
| ;error return | |
| ;normal return |
These system calls are to enable a user to protect against other users
accidentally referencing his DEC tape to write or delete a file or rename [Sec
3.1.2.4] the tape. Both specify the drive numbers as the contents of their
specified accumulator. The .ASSIGN UUO skips if successful and results in attempts
to write on the designated drive failing unless the writing procedure has the
same system name [Sec 2.2.3] as the UNAME of the procedure that executed
the .ASSIGN. For a procedure in a disowned tree [Sec 5.2.2], an .ASSIGN will
be treated as an illegal instruction. An .ASSIGN will fail only if the drive
is already assigned. The .DESIGN UUO skips if successful and causes the drive
to be unassigned. It fails if the drive is already unassigned or assigned to
a different user. A drive may also be .DESIGN'ed by a .UDISMT [Sec 3.1.2.1]
and the .ASSIGN'ing of a drive does not protect against other users dismounting
it.
| MOVEI AC,TAPEN | |
| CALL: | .UBLAT AC, |
| ;error return | |
| ;normal return |
This system call is intended for reading non-MAC format [Ref 4]
(such as DEC format) DEC tapes. The contents of the specified accumulator must
be a drive number for which ITS is not retaining a directory. If a directory
is already being retained, the .UBLAT will fail and return without skipping.
(The user might try first .UDISMT'ing the drive.)
If successful, the .UBLAT skips. Instead of attempting to read in the directory from the tape mounted on the specified drive, ITS internally marks the drive so that its contents may not be changed (no writes, deletes, or renames). At this point a successful .OPEN of the tape may be executed with any file name and all blocks of the tape will be read consecutively. Thus the tape may only be referenced to read the file containing the entire contents or to .UDISMT [Sec 3.1.1] it.
| MOVE AC,[(SIXBIT /lll/),,TAPEN | |
| CALL: | .UTNAM AC, |
| ;error return | |
| ;normal return |
This system call changes the three character tape name of a particular
DEC tape. The tape drive number must be specified in the right half of the specified
accumulator. The call will fail and return without skipping if there is no such
drive or if the drive is in .UBLAT mode [Sec 3.1.2.3] or .ASSIGN'ed [Sec
3.1.2.2] to another user. Otherwise it modifies the tape's directory (reading
it in if necessary) so as to have a tape name corresponding to the left half
of the accumulator specified by the call and skips on return.
| MOVE AC,TAPEN | |
| CALL: | .UINIT AC, |
| ;error return | |
| ;normal return |
This system call initializes the directory for the DEC tape on the
drive whose number is the contents of the accumulator it specifies. The tape
must have been .ASSIGN'ed [Sec 3.1.2.2] to the user doing the .UINIT. If
successful the .UINIT skips on returning. If the specified drive is nonexistant
or the tape on it is not .ASSIGN'ed to the user doing the .UINIT, it returns
without skipping.
The device SYS is used for storage of systems programs and the "message of the day" [Sec 7.1.1]. It is currently those files on device DSK with system name SYS. Reading or writing device SYS causes one to reference DSK as though one's system name were momentarily SYS. The device COM is used for commonly used user files and the mail feature [Sec 7.2.1, 7.2.2]. In a manner similar to device SYS it is DSK with system name COMMON.
Device T00 is the console teletype. Devices T11 through T14 (the two digits are treated as an octal number) are GE Datanet 760 terminals with a character only display and keyboard. Devices T01 through T10 are available for more teletype and teletype-like hardware and are read and written through the Knight Teletype Kludge. Device TTY for a particular procedure is the console controlling the procedure tree it is on. All input-output to these devices is in ASCII characters and the "image" mode [Sec 2.2] has special meanings. Further detail on which Tnm is "where" is given in the following table (as of July 14, 1969):
| Tnm | Location |
| T0 | Main console (by PDP-6). |
| T1 | Advanced Remote Display Station. |
| T2 | Outside line (or 1479 depending on switch). |
| T3 | Robot console. |
| T4 | PDP-10 console. |
| T5 | System console (by line printer). |
| T6 | Inside line 1425. |
| T7 | Inside line 1474 (or outside depending on switch) 15cps. |
| T10 | Spare. |
| T11 | GE console by plotter. |
| T12 | GE console on 8th floor. |
| T13 | GE console by air conditioner. |
| T14 | GE console by ham rig (in far corner). |
| T15up | Nonexistent. |
A procedure may not open its console by referring to it as Tnm for the corresponding
n and m. Only one procedure at a time may have a teletype open as a device rather
than a console. The procedure with T00 opened as a console (TTY) and that actually
has control of it [Sec 3.2.1.1] can always seize the DEC 340 display [Sec
3.4.1].
Image mode output to KSR 35/37's is very straight forward and just sends the character to the teletype unmodified. ASCII mode differs only in the following:
Input to keyboards (which are all full duplex) is buffered by ITS in relatively small fixed size buffers. Striking a key when this input buffer is full results only in a G (bell) (or "?" on a GE terminal) being output as echo. Any input when the keyboard is not in use, except Z [Sec 1.1.1], is ignored by ITS. Procedures may enable interrupts (class three) due to non-empty input buffers [Sec 4.2] and also examine the input characters at interrupt time with .ITYIC [Sec 2.7.3].
Image mode input is characterized by no ITS-supplied echo and no modofication of the character codes unless open mode [Sec 2.2] bit 3.5 ("old mode") is also on, in which case lower case KSR 37 characters are transformed to upper case KSR 35 characters.
ASCII mode input provides echo in approximately the same manner as outputing the characters in ASCII mode. Procedure output has higher priority than echo output. On GE terminals input is normally echoed in the bottom three lines unless the 3.4 open mode bit was on, in which case characters are echoed where output is appearing except that a few characters are not echoed at all. In ASCII mode input, the characters whose values are 175 and 176 are input and echoed as if they were the character whose value is 33. Having open mode bit 3.5 on has the same effect for ASCII mode input as it did for image mode input. In general, all of the various mode bits affecting input are obtained from the first input .OPEN [Sec 2.2] executed by a procedure for a particular teletype. For all the above input modes, adding block mode results in input until the block input pointer runs out or until a C is typed at which point the .IOT [Sec 2.3] being executed terminates as on an end of file [Sec 2.3.2].
Any input or output TTY .OPEN by a procedure that has never had control of a console will fail. Any input or output .IOT or .OPEN executed on a TTY device by a procedure that has had control of the device while it is actually being controlled by another procedure [Sec 3.5.1] will hang until the executing procedure regains the device.
The device dependent .STATUS [Sec 2.5] bits for the teletype devices are as follows:
| Bit | Meaning |
| 2.3 | Channel open in "DDT mode" (3.4 mode bit). |
| 2.4 | A console (TTY device) open on this channel. |
| 2.5-2.9 | If channel open for output: |
| Current line number if a GE console. | |
| 2.5-2.9 | If channel open for input: |
| 2.5 | Indicates some characters have been seen at |
| interrupt and not main program level. | |
| 2.8 | Teletype is at the 340 [Sec 3.4.1] or a 340 slave. |
| 2.9 | Teletype is local, not dial in. |
| CALL: | .ATTY CHNUM, |
| ;error return | |
| ;normal return | |
| CALL: | .DTTY CHNUM, |
| ;error return | |
| ;normal return |
These system calls enable procedures in a single console controlled
procedure tree to transfer control of their console between each other. The execution
of either by a procedure that does not have control of the console, because it
was taken away by a higher procedure's execution of a .DTTY, will hang until
it regains control. The accumulator field of each must specify a channel (CHNUM
in the above illustration) on which an immediate inferior procedure is open [Sec
3.4.2]. An .ATTY will pass control of the console to this open procedure unless
the procedure executing the .ATTY has control of the teletype by taking it from
some deeper inferior along the same procedure tree branch in which case it reverts
to the procedure from which it came. An .ATTY will hang instead of doing the
above if the last character typed on the console was a Z. A
.DTTY retrieves control of the console from some inferior to the procedure executing
it.
Both of these calls skip if successful. An .ATTY will fail to skip only if no inferior is open on the channel it specifies. A .DTTY will fail to skip if no inferior is open on the channel it specifies or if the procedure executing it never had control of the console or never gave control away. All other conditions blocking the success of either system call cause them to hang.
| CALL: | .LISTEN AC, |
| ;error return | |
| ;normal return |
This system call is usable only on the console a procedure is associated
with. It will hang if control of the console [Sec 3.2.1.1] has been taken
away from the procedure executing it and if all procedure output has not been
typed. It then returns with the number of buffered input characters in the specified
accumulator. If the procedure has never had control of the console or is in a
disowned tree [Sec 5.2.2] zero will be returned.
A feature is available under ITS that allows procedures to dial calls on the two dataphone lines now available. Caution should be exercised in using this feature if one is using the system over one of these lines. The computer may "hang-up" in a more literal sense than usual.
| MOVEI AC,[440600+DIALN,,DLBUF] | |
| CALL: | .DIAL AC, |
| ;error return | |
| ;normal return | |
| DLBUF: | 010201,,020202 |
| 100506,,101000 |
The .DIAL call is used to initially associate a procedure with a dialer and to
actually request dialing on the dataphone line associated with the dialer. The
accumulator specified by the call, AC in the above example, should contain a
byte pointer directly addressing a byte within the user's core image. Indirect
addressing and indexing are ignored and in fact the index field is used to specify
the dialer number, DIALN in the above example. This corresponds to a teletype
as follows:
| Dialer | Teletype |
| 0 | T07 |
| 1 | T06 |
The .DIAL will have no effect and return without skipping if any of
the following conditions hold:
As dialing proceeds, each byte is examined in succession. A zero byte indicates the end of bytes to be processed. A byte whose value is between one and ten causes a similar number of dial pulses to be sent. Interdigital pauses are automatically inserted after each digit. Bytes with a value larger than ten cause a pause in dialing of as many tenths of a second as the byte's value minus ten.
A special means is provided to send the "break" signal. If the accumulator specified by a .DIAL is zero except possibly for the index field (where the dialer number is specified), then a "break" will be sent after a .DIALW has been simulated to avoid garbling any dialing in progress.
| CALL: | .DIALW DIALN, |
| ;error return | |
| ;normal return |
This call refers to the dialer specified by its accumulator field (DIALN in the
above example). It has no effect and returns without skipping if the dialer has
not been assigned to the .DIALW'ing procedure by a successful .DIAL (see above).
Otherwise it returns and skips after requested dialing by the dialer is complete.
| CALL: | .HANGUP DIALN, |
| ;error return | |
| ;normal return |
This call refers to the dialer specified by its accumulator field (DIALN in the
above example). It has no effect and returns without skipping if the dialer has
not been assigned to the .HANGUP'ing procedure by a successful .DIAL (see above).
Otherwise it returns and skips after hanging up the line for at least three seconds
and freeing the dialer so it is no longer assigned to any procedure.
A six hundred line per minute Data Products, Inc. line printer with one hundred and twenty print positions and sixty four printing characters is available for character output as device LPT. The ASCII/image mode bit [Sec 2.2] is ignored in .OPEN's on device LPT but either single ASCII characters or blocks of packed characters may be output as indicated by the block/unit mode bit. The following "transformations" are made to the output text:
The device dependent .STATUS [Sec 2.5] bits for the LPT device have in the 2.2-2.9 field the current character position in the print line. This count starts at zero at the left margin.
A CalComp model 565 plotter [Ref 9] is available via "character" output to device PLT. Available with the same modal restrictions as the LPT device [Sec 3.2.2], it is also similar to that device in that it may only be open by one procedure at a time but may be open on more than one channel. A fixed 200 word area is used in ITS to buffer output.
Only the right most six bits of characters output to the PLT device have effect. They are as follows:
| Bit | Effect if a one |
| 1.1 | drum down |
| 1.2 | drum up |
| 1.3 | carriage right |
| 1.4 | carriage left |
| 1.5 | pen up |
| 1.6 | pen down |
The PTP and PTR devices represent, respectively, the sixty three and a third character per second paper tape punch and four hundred character per second photoelectric paper tape reader on the PLP-6 [Ref 1]. They are similar to the LPT and PLT devices [Sec 3.2.2, 3.2.3] in that only one procedure may have each open at one time but that procedure may have the device open on more than one channel possibly in different modes. Also output or input is buffered in ITS in fixed areas of 20 and 100 words, respectively. These devices differ from the LPT and PLT devices in that all standard modes [Sec 4] are available and the following special mode. If in a successful .OPEN for one of these devices, the 3.4 mode bit [Sec 2.2] is on then the 3.3 mode bit is ignored, the 3.2 mode bit must indicate unit mode, and all eight paper tape channels may be written or read from or into the eight rightmost bits of the word addresses by each .IOT [Sec 2.3] executed.
| CALL: | .FEED CHNUM, |
| ;error return | |
| ;normal return |
This system call checks to see if the PTP device is open on the channel
it specifies (CHNUM above). If not, it returns without skipping. If so, it causes
one line of blank tape to be punched and skips.
This is a character output device that may be used in block or unit mode but not any form of image mode and not by more than one procedure at a time. It causes transmission of low power FM Morse code at a frequency just off the bottom of the FM broadcast band. Characters for which there is no standard Morse code (such as line feed) are ignored except that the speed it set by characters whose value is greater than 137 to approximately, seventy five divided by the difference between the character value and 137, words per minute. It tries to interrupt on the input-output channel it is open on when the fixed buffer in ITS it uses is almost empty.
The VID and NVD devices are somewhat similar to the IMX device [Sec 3.9] in that they may be open by any number of procedures, have block and unit modes, and "functional" word input where the quantity read is a function of the contents. They differ in that the ASCII/image .OPEN mode bit [Sec 2.2] is ignored and they represent vidissectors. The initial contents of words input into should be the coordinates of a point in the field of view of the particular vidissector at which it is desired to know the light intensity. This contents will be replaced by a function of said intensity. The exact form of these words and the use of any device dependent .OPEN mode bits [Sec 2.2] is listed in the table below.
| Item | VID | NVD |
| X | 2.3-1.1 | 4.5-3.2 |
| Y | 4.3-3.1 | 2.5-1.2 |
| value | 1.8-1.1 | (reciprocal of intensity) |
| 4.9-3.3 (normalized floating reciprocal intensity) | ||
| 2.1-1.1 (integar logarithm reciprocal intensity) | ||
| (too | 400 | 3.1 (overflow) |
| dark) | 3.2 (dim cut off) | |
| dead | -1 | 4000000 |
| modes | 3.6-3.4 | (340 intensity) |
| 3.5-3.4 (confidence level) | ||
| 3.8-3.6 (dim cut off level) |
The VID device is of little use as it is a lower quality subset of the NVD device.
The deflection signals for the VID device come from the DEC 340 display [Sec
3.4.1] whose use will be degraded by using device VID.
The TVC device is the same as the NVD device except that it should be opened on two channels, one for output and one for input. Words with coordinates in them are output on one channel and stored in a fixed length buffer in system memory. There they are replaced by ITS, at its interrupt level, with the response word shown above (value). They may be read, in the same order as output, on the input channel. Unlike most devices, a block mode .IOT outputting to the TVC device when its buffer is full will not hang up but return with the block .IOT pointer word pointing at the first word not transferred.
(Some of this section is taken from Reference 13.)
| PTABLE: | WBIT,,VCONO | ;+0 |
| -LENGTH,,ARRAY | ;+1 | |
| XRES,,YRES | ;+2 | |
| R1 | ;+3 | |
| R2 | ;+4 | |
| C1 | ;+5 | |
| R3 | ;+6 | |
| R4 | ;+7 | |
| C2 | ;+10 | |
| P1 | ;+11 | |
| P2 | ;+12 | |
| ARRAY: | BLOCK LENGTH |
This system call allows the user to read the light intensity at an array of points
with low overhead and, if desired, overlapped computation.
The effective address of a .VSCAN should point at an eleven word block of parameters defining the points to be scanned, the locations to read into, the mode they are to be read in, and whether the call should hang until the scan is through. The effect of the parameters, in order, is described below.
The first word has in its right half the control bits for the vidisector as in section 3.3.1 for NVD. The sign bit, if a one, causes the .VSCAN to hang until the scan is over. If a zero, computation by the .VSCAN'ing user may procede while the scanning proceeds at ITS's interrupt level.
The second word should be similar to a block mode .IOT [Sec 2.3] pointer word. Its right half should point to the beginning of an array to be read into in the response format of NVD in section 3.3.1. Its left half should be a negative count equal to or larger, in magnitude, than the number of points being scanned. (If in the above illustration either PTABLE+12 or ARRAY+LENGTH-1 were beyond the users memory bound, the .VSCAN would be treated as an illegal instruction.)
The third word has in its left and right halves, as eighteen bit integers, the "X" and "Y" resolution or number of points to be scanned in each direction.
The remaining nine parameters, which are fixed point quantities with the binary point between 2.9 and 3.1, define where the XRES by YRES points lie in vidissector coordinates according to the following ALGOL program:
| FOR Y1<-0 STEP 1 UNTIL YRES-1 DO |
| BEGIN |
| Y2<-(2*Y1+1)/(2*YRES) |
| FOR X1<-0 STEP 1 UNTIL XRES-1 DO |
| BEGIN |
| X2<-(2*X1+1)/(2*XRES) |
| TEMP<-P1*X2+P2*Y2+1 |
| X<-(R1*X2+R2*Y2+C1)/TEMP |
| Y<-(R3*X2+R4*Y2+C2)/TEMP |
| ARRAY(Y1*XRES+X1)<-SCAN(X,Y) |
| END |
| END |
A .VSCAN will hang up until the NVD device is free. This device is then seized,
not to be released until the scan is over or aborted. A scan is only aborted
if the procedure it is being executed for is reset [Sec 3.4.2] or its core
size reduced so as to exclude the array being read into (ARRAY in the above illustrations)
or by .VSTST.
| MOVSI AC,1 | ;or 0 or 400000 | |
| CALL: | .VSTST AC, | |
| ;return |
This system call allows later control of and sensing by a procedure that has
overlapped computation with a .VSCAN. It is illegal if executed when another
procedure is .VSCAN'ing. If the contents of the specified accumulator is positive,
the .VSTST hangs till the scan is over. If the contents of the specified accumulator
is negative, any scan in progress is aborted. If the contents of the specified
accumulator is zero, the user's location then being stored into by the scan,
if any, replaces it.
A multiplexed digital to analog converter on the PDP-6 is available via word output to the OMX device [Ref 5, 6]. Block and unit modes are available and the "ASCII/image" mode bit [Sec 2.2] has a special significance explained below. Each word output should have the desired channel number in bits 4.9-4.4 and the value to be converted in bits 4.3-3.1. Thus channel numbers range from zero to 77 and values from zero to 7777. These output channels decay exponentially with some large time constant so ITS stores the current desired value for each channel and outputs them every half second as long as the OMX device is open by some procedure. Output in "ASCII" mode immediately affects the channel as well as storing a value to be output periodically. Slightly less overhead occurs in "image" mode which only stores a value in ITS and may have no effect for up to half a second. Any number of users may have the OMX device open, possibly on more than one channel and possible in different modes. Current OMX channel assignments are as follows:
| Channel | Effect |
| 0-31 | Unused. |
| 32 | NVD iris. |
| 33 | NVD focus. |
| 34 | NVD mirror. |
| 35-55 | Unused. |
| 56 | TVB pan. |
| 57 | TVB tilt. |
| 60 | MA3 hand extend. |
| 61 | MA3 hand rotate. |
| 62 | MA3 hand grasp. |
| 63 | Cannon lens zoom (MA3 hand finger #1). |
| 64 | Cannon lens focus (MA3 hand finger #2). |
| 65 | MA3 hand tilt. |
| 66 | Alles hand grip. |
| 67 | Alles hand tilt. |
| 70 | Alles hand extend. |