(navigation image)
Home American Libraries | Canadian Libraries | Universal Library | Community Texts | Project Gutenberg | Children's Library | Biodiversity Heritage Library | Additional Collections
Search: Advanced Search
Anonymous User (login or join us)
Upload
See other formats

Full text of ""

STANFORD ARTIFICIAL INTELLIGENCE LABORATORY December 1973 

OPERATING NOTE 55.3 



UUO MANUAL 



Martin Frost 



ABSTRACT 

This document describes the UUOs (monitor calls) available to users of the Stanford Artificial 
Intelligence Laboratory timesharing system. Additional general information relevant to the use of 
the UUOs is contained in the introductory section, and some useful tables are included in the 
appendices. This manual supersedes SAILON 55.2 by Andy Moorer (Monitor Manual, Chapter 



This work was supported by the Advanced Research Projects Agency of the Office of the Secretary 
of Defense under contract DAHC15-73-C-0435. 



ACKNOWLEDGEMENTS 

The author wishes to thank the following people who contributed significantly to this manual: 
Ralph Gorin for Section 13.4 on the XGP, Ted Panofsky for Appendix 1 and Appendix 2 on 
the III and Data Disc display systems (both appendices taken from Panofsky's Facility Manual, 
SAILON 56), and Andy Moorer for Section 13.12 on the IMP. Further thanks go to Brian 
Harvey for saving me the trouble of writing the new Monitor Command Manual (SAILON 54.3) 
and for working with me in getting our two manuals PUBed; to Dick Helliwell and Fred Wright, 
whose contributions to the system helped make this manual necessary; and finally to Larry Tester 
for his PUB program and its many new features without which this manual could not have been 
printed so well on the XGP. 



CONTENTS i 
TABLE OF CONTENTS 

SECTION PAGE 

1 INTRODUCTION 1 

1.1 UUOs (Un-Used Operation codes) l 

1.2 Extended UUOs 2 

1.3 CALLs and CALLIs 2 

1.4 UUO Trapping and User-Defined UUOs 3 

1.5 DEC vs. Stanford UUOs 4 

1.6 Understanding this Manual . 4 

2 GENERAL INPUT/OUTPUT 7 

2.1 User I/O Channels 7 

2.2 Data Modes 8 

2.3 Dump Mode Command Lists . 9 

2.4 Buffer Rings 10 

2.5 Buffers . . . . . . . . 1 1 

2.6 Device I/O Status Word 13 

2.7 Files 14 

2.8 Initializing a Device . . ... . . 17 

2.9 Setting Up Buffer Rings 19 

2.10 Opening Files 21 

2.11 Transferring Data 26 

2.12 Terminating I/O 28 

2.13 Random Access to Files 29 

2.14 I/O Status Testing and Setting 31 

3 TTY INPUT/OUTPUT 37 

3.1 TTY Echoing and LF Insertion 37 

3.2 Codes Returned for Characters Typed 38 

3.3 TTYUUO ... ... . .... ....' 38 

3.4 Miscellaneous TTY UUOs . . . . ; 46 

3.5 Pseudo-Teletypes ' 48 

4 DISPLAY OUTPUT 59 

4.1 III Displays .... . . . . . , . . . . -. 59 

4.2 Data Disc Displays ...... . . 'V . . . .'V' 60 

4.3 Page Printer Manipulation . . . . . . . .". .... 61 



ii CONTENTS 



4.4 Running Display Programs 64 

4.5 Extra Data Disc Channels 68 

4.6 The Video Switch . 70 

4.7 The Audio Switch 72 



5 UPPER SEGMENTS 77 

5.1 Making and Killing Segments 77 

5.2 Getting/Setting Segment Status 81 



6 GETTING/SETTING INFORMATION 85 

6.1 Dates and Times 85 

6.2 Job Information 86 

6.3 Looking at the Monitor 89 



7 INTER-JOB MAIL SYSTEM 95 

7.1 Sending Mail 95 

7.2 Receiving Mail 96 

7.3 Peeking at Mailboxes 97 



8 SPACEWAR MODE . 99 

8.1 Spacewar UUOs 101 

9 USER INTERRUPTS 103 

9.1 New Style Interrupts 107 

9.2 Old Style Interrupts ..116 

10 LIBRASCOPE FAST BAND STORAGE 119 

10.1 Getting and Releasing Fast Bands 120 

10.2 Reading and Writing Fast Bands 121 

10.3 Miscellaneous Fast Band UUOs .122 

11 MISCELLANEOUS UUOS 125 

12 OBSOLETE OR OTHERWISE USELESS UUOS 137 



CONTENTS iii 



12.1 Old UUOs . . 137 

12.2 Privileged UUOs 140 

12.3 Useless UUOs 140 



13 INDIVIDUAL DEVICE DESCRIPTIONS 141 

13.1 The Disk 141 

13.2 Terminals 146 

13.3 The Line Printer . , 147 

13.4 TheXGP 149 

13.5 Dectapes 159 

13.6' Magnetic Tapes 161 

13.7 Paper Tape Punch/Plotter . . 163 

13.8 Paper Tape Reader 164 

13.9 User Disk Pack 165 

13.10 AD/DA Converter 167 

13.11 TV Cameras 170 

13.12 The IMP 173 



14 EXAMPLES 183 

14.1 Example of General I/O 183 

14.2 Example of Display Programming 185 

14.3 Example of Using Interrupts 188 



APPENDICES 

1 III DISPLAY PROCESSOR 189 

2 DATA DISC DISPLAY SYSTEM 195 

3 GENERAL INFORMATION ABOUT THE PDP-10 201 

4 JOB DATA AREA 205 

5 LOCATIONS OF USEFUL POINTERS IN THE MONITOR 209 

6 DEVICE DATA BLOCKS (DDBS) 215 

7 STANFORD CHARACTER SET 217 

8 UUOS BY NUMBER 219 



1. Introduction 1 

SECTION 1 
INTRODUCTION 



This document describes the UUOs (monitor calls) available to users of the Stanford Artificial 
Intelligence Laboratory timesharing system. Additional general information relevant to the use of 
UUOs is contained in this introductory section, and some useful tables are included in the 
appendices. This manual supersedes SAILON 55.2 by Andy Moorer (Monitor Manual, Chapter 

m. 

The reader is assumed to know the PDF- 10 instruction set and format, data types and assembly 
languages. However, the aspects of these subjects that are relevant to this manual are explained in 
Appendix 3. The user who is new to the PDP-10 should read that appendix before going any 
further. The experienced user may skip to Section 1.6, Understanding this Manual. 



1.1 UUOs (Un-Used Operation codes) 



UUOs are monitor calls which make use of instruction codes that would otherwise be unused or 
illegal. The opcodes from 000 to 077 are not used by any machine instruction, and opcodes from 
700 to 777 are input/output machine instructions, which are normally illegal in user programs. All 
these opcodes trap to the monitor, which can then take whatever action it deems appropriate. 
Taking advantage of this situation, the system designates some of these opcodes to be monitor calls 
for certain common functions such as I/O. Thus whenever a UUO is encountered in the 
instruction stream, the monitor is called to execute the function corresponding to the particular 
UUO. When the function has been executed, control returns to the user program. Some UUOs 
may take skip returns; that is, control does not always return at the instruction immediately 
following the UUO, but sometimes at one of the next instructions after that one. The individual 
writeups explain when a UUO skips; unless otherwise described, a UUO's return is always at the 
instruction immediately following the UUO. 

Some UUOs take arguments or return values in memory cells. In such cases the cells can be 
accumulators (ACs), but a block of such cells must not extend beyond the last accumulator (octal 17) 
because words 20 through 37 in a user's core image are used by the system for special temporary 
storage of sets of ACs. (Words 40 through 137 are used by the system to store information about 
the job. This part of a core image is referred to as the Job Data Area; the data stored here is 
described in Appendix 4.) 

Note also that some UUOs have unused argument fields. Such a field should be made zero so that 
if at some later time it becomes used for a new feature, an old program using that UUO will still 
work. 

Some of the opcodes not defined by the system are available to the user for defining his own special 
purpose UUOs. The method for defining these UUOs is explained in Section 1.4. The 
categories of opcodes that are used for UUOs are: 



2 Introduction 1.1 



083 always i I legal , 

801:037 user-definable UUOe, 

048:877 system-defined regular UUOs, 

700:777 system-defined IOT UUOs. 

The IOT UUOS are available only when the program is not in IOT-USER mode; in IOT-USER 
mode these opcodes are machine I/O instructions instead. A user program will not be in 
IOT-USER mode unless it has done something special to get into that mode. For a complete 
explanation of IOT-USER mode, see Appendix 3. 

Finally, a special feature allows the user to have normal system-defined UUOs trap to a given 
location in the user program instead of being executed by the system. For details of this feature, 
see the UUOSIM UUO on page 131. 



1.2 Extended UUOs 



In order to define more UUOs than there are opcodes available, two primary methods are 
employed that allow a single opcode to represent many different UUO functions. The first of these 
methods is to use the value of the accumulator (AC) field in the instruction to specify one of 20 
(octal) possible UUOs for a given opcode. Thus, for example, the OUTSTR UUO (which types 
out an ASCIZ string on the terminal) is invoked by specifying the opcode 051 and the AC field 3. 
There are currently six opcodes that use the value of the AC field in this manner. Each of these 
opcodes has a generic mnemonic which, together with a specific value for the AC field, can be used 
to indicate a specific UUO. In addition, each combination of generic mnemonic and specific AC 
field has a specific mnemonic which also can be used to indicate the UUO. Opcode 051 has the 
generic mnemonic TTYUUO, and TTYUUO with an AC field of 3 has the specific mnemonic 
OUTSTR. Thus the following three lines of code are equivalent. (ADR is an argument of this 
UUO; it specifies the address of the ASCIZ string to be typed out.) 

OUTSTR ADR 
TTYUUO 3, ADR 
051140,, ADR 

Note, however, that not all of the mnemonics are known by all of the assemblers or all of the 
debuggers. FAIL, however, gets its UUO mnemonic definitions directly from the system and thus is 
always up to date, even just after a new UUO has been added. 



1.3 CALLs and CALLIs 



The second method of defining many UUOs with the same opcode has two versions. In one of 
these, the address field of the UUO points to a word which contains the sixbit name of the UUO 
function desired. In the other version, the address field of the UUO is itself the number of the 
function desired. The opcode in the first case is 040 and its mnemonic is CALL; the opcode in the 
second case is 047 and its mnemonic is CALLI (for CALL Immediate). 



1.3 CALLs and CALLIs 3 

CALL [OP=040] 

CALL AC, tSIXBIT /<name>/] 



CALL1 [OP-047] 

_____. ..___._ _ ._____- .. .. ^ 

CALLI AC,<number> 

Exactly the same UUO functions are available through these two methods. Thus, the following 
two lines of code are functionally equivalent; each will cause execution of the EXIT UUO. 

CALLI 12 

CALL tSIXBIT /EXIT/) 

Since there are these two versions of calling the same UUOs, the following fact should be noted. 
When you use a CALL instead of a CALLI, not only do you need an extra word in which to store 
the name of the CALL function, but also (and more importantly) you force the system to look up 
the function name in a table in order to find out the function number. This means that using 
CALLs instead of CALLIs creates a substantial amount of extra work that could be completely 
avoided. In addition, it is easier to use CALLIs instead of CALLs because, in FAIL and MACRO, 
if you use the name of a CALL as an opcode, the appropriate CALLI will be generated. (In 
MACRO, only the DEC CALLIs are predefined.) For example, the following two lines will 
produce the same machine code. 

CALLI 12 
EXIT 

Thus the CALL UUO is essentially obsolete; it is mentioned here mainly for completeness sake. 
Please use CALLIs! 



1.4 UUO Trapping and User-Defined UUOs 

The method employed by the PDP-10 to trap to the monitor when an unused opcode is 
encountered is the following: 

1. The effective address calculation for the instruction is carried out as usual with the 
address field, index field and indirect bit in the instruction and in any words referenced 
indirectly by the instruction. 

2. Bits to 12 (opcode and AC field) of the instruction are deposited in bits to 12 of user 
or monitor location 40 (depending on whether the opcode represents a user or a monitor 
UUO). The calculated effective address from 1 above is deposited into bits 18 to 35 
(address field) of the same location 40. Bits 13 to 17 (index field and indirect bit) of this 
location are cleared. 

3. The instruction at location 41 (user or monitor as above) is then executed (as if from an 
XCT instruction). This location usually contains a JSR instruction to jump to a 



Introduction 1.4 



subroutine to interpret the UUO. The JSR saves the program counter (which points to 
the instruction immediately following the UUO) for returning to the program containing 
the UUO. 

Thus, for a user to define his own UUOs (selected from opcodes 001 to 037), he need only deposit a 
JSR or similar instruction in user location 41 to jump to the subroutine that will interpret his user 
UUOs. The instruction in location 41 should be one that saves the program counter for returning. 
For instance it could be a PUSHJ if you have a stack. 

Note: Because the effective address calculation has already been completed by the time a UUO's 
function is executed, what the monitor (or a user's UUO code) sees in the address field of a UUO 
is this effective address. In the UUO writeups in this manual, the two expressions the effective 
address of the UUO and the address field of the UUO mean the same thing, namely, this final value 
of the effective address calculation. 

(In the Stanford system, UUOs trapping into the monitor actually go to absolute 140 and 141 
rather than 40 and 41 although user UUOs do trap to user 40 and 41.) 



1.5 DEC vs. Stanford UUOs 



UUOs with opcodes 040 through 077 and CALLIs with numbers through 44 are essentially 
standard DEC UUOs modified for use at Stanford. (Some have been modified completely out of 
existence.) The exceptions are the TTYUUOs (opcode 051) with AC fields 14 through 17 and the 
SPCWAR UUO (opcode 043), which are special Stanford UUOs. All of the IOT UUOs (opcodes 
over 700) and all CALLIs with numbers from 400000 up are also special Stanford UUOs. 



1.6 Understanding this Manual 



In each of the sections that follow, a collection of related UUOs is explained along with the system 
concepts involved. Preceding the writeup for each UUO are 1) a line containing the UUO's 
mnemonics and numerical codes and 2) a sample usage (calling procedure) to which the writeup 
will often refer. For numerical codes, the abbreviation OP stands for the operation code field, AC 
for the accumulator field and ADR for the effective address of the UUO. For CALL/CALLI 
UUOs, the numerics will be those of the CALLI. 

The phrases AC left and AC right mean, respectively, the left half of AC and the right half of AC. 

Wherever there is a data block of length N used or set up by a UUO, the words of the block will 
be referred to as word through word N-l or sometimes (usually with short blocks) as the first word 
through the Nth word. Please note the difference between these two terminologies. 

A range of bits or words will often be referenced by an expression of the form "X:Y", where X and 
Y are numbers. This represents all values from X through Y. For example, "bits 18:26" means 
bits 18 through 26. 



1.6 Understanding this Manual 5 

All numbers will be in OCTAL except for the following, which will be in DECIMAL: bit numbers 
(e.g., "bit 35"), byte sizes (e.g., "12-bit bytes"), times (e.g., "30 seconds"), and numbers preceded by an 
equals sign (e.g., "-15"). 

References to particular bits or groups of bits will usually be made both by the bit numbers and by 
the octal value resulting from 1's in the specified bit positions. For example: 

...if bit 8 (480800,, 8 bit) is on... 
...and bits 18:26 (8, ,777088 bits)... 

The octal value will be in half-word format, as shown above. 



2. 



General I/O 7 



SECTION 2 
GENERAL INPUT/OUTPUT 



The purpose of input/output (I/O) is to transfer data between the computer's memory and an 
external device such as a tape, a disk, a printer, etc. The UUOs are set up to allow I/O with a fair 
amount of flexibility and device independence. I/O here is done on a very low level and involves 
three basic phases: initialization of the device, transfer of the data, and releasing of the device. 
Another phase, file selection, is necessary for the disk and other directory devices. 

There are other simpler forms of I/O for certain devices (including terminals); I/O for those 
devices is explained in later sections. 

The basic phases of I/O can be seen in the corresponding UUOs, so I will give an example 
sequence of the UUOs used in I/O. Since much of the I/O done by programs uses the disk, I will 
include the file selection phase in the example below. Note that this example is not a complete 
program; it contains only some excerpts involving the use of UUOs. This is intended to introduce 
you to various I/O concepts which will be explained in great detail in the remainder of this section. 



INIT 1,18 
SIXBIT /DSK/ 
OBUF.,0 
HALT 



ENTER 
HALT 



l.FILE 



OUTPUT 1, 
CLOSE 1 , 
RELEAS 1, 



This initializes the disk (DSK) on channel 1 in 
mode 10 and specifies an output buffer header at 
location OBUF. Upon an error in the execution 
of this UUO, the program will HALT. 

This opens the file specified at location FILE for 
output on channel 1; this will HALT on any error. 

This is used to write out data on channel 1. 
This closes the file open on channel 1. 
This releases the device on channel 1. 



In general I/O, the methods for doing output are very similar to those for doing input. 
Consequently, the following discussion will describe the basics of input; minor differences for doing 
output will usually be mentioned in parenthetical remarks. Any significant differences will be called 
to your attention. 



2.1 User I/O Channels 



A program is allowed to use up to 20 I/O devices at the same time. In order to keep straight which 
device an I/O UUO is meant for, each device in use is assigned a channel number. The channel 
number, which can be any number between and 17 inclusive, is specified by the user when he 
initializes the device. Subsequent operations involving that device refer only to the channel 
number and not to the name of the device. The channel number is chosen by the user and has 



8 General I/O 2.1 



significance only to the program in which it is assigned. Furthermore, when a device is released, 
the channel number is disassociated from it; so if the device is to be used again, it must be 
initialized again with a new (possibly the same) channel number. 

A single I/O channel may not be used for both input and output at the same time, except on the 
disk in the special Read-Alter (RA) mode, which is explained on page 24. 



2.2 Data Modes 



When you are doing I/O, you must select the data mode to be used. The mode indicates how the 
data is to be transferred: primarily, whether the data transfers are to be buffered and, if so, 
whether the data is made up of characters or of full words. 

In buffered mode, the system transfers data between the device and some buffers in your core area. 
A transfer of this type is initiated for input by the INPUT UUO and for output by the OUTPUT 
UUO. To get data from a buffer on input or to put data into a buffer for output, you simply do 
ILDBs (input) or IDPBs (output) with a byte pointer that is set up by the system. The data is thus 
handled a byte at a time, with the bytes being either characters (7 bits each) or full words (36 bits 
each); the mode determines the byte size. When a buffer is used up, you give an INPUT UUO to 
get another buffer of data (or an OUTPUT UUO to write out a buffer of data). The buffers you 
use are set up by the system in the form of buffer rings. Buffer rings will be described in detail in 
Section 2.4, but now back to data modes. 

The alternative to buffered mode is dump mode. To read (write) in dump mode, you tell the 
system where in your core image you want the data to go (come from) and how many words are to 
be transferred. This is done with dump mode command lists, which will be explained in Section 
2.3. 

The basic data modes are listed in the following table and described below. (There are many 
special modes for specific devices; these modes are described in Section 13, which deals with 
device-dependent features.) 

Mode Name Type of transfers 

ASCII Buffered characters (7-bit byte pointer) 

1 ASCII LINE Buffered characters (7-bit byte pointer) 
10 IMAGE Buffered words (36-bit byte pointer) 

13 IMAGE BINARY Buffered words (36-bit byte pointer) 

14 BINARY Buffered words (36-bit byte pointer) 

16 DUMP RECORD Unbuffered 

17 DUMP Unbuffered 

ASCII mode (mode 0) is used for inputting (outputting) text. You get (put) one ascii character at a 
time from (into) your buffer by using the byte pointer. (Note: For TTY input in ASCII mode, an 
INPUT UUO will not return until your TTY buffer is full (holding 95 characters) or TZ 
(control-meta-linefeed on the displays) is typed. However, TTY I/O is usually done with the 
special UUOs described in Section 3.) 



2.2 Data Modes 9 



ASCII LINE mode (I) is the same as ASCII mode except for TTY input. There it means that an 
INPUT UUO will return when an activation character is typed or when the buffer is full, 
whichever comes first. (Normally the activation characters are carriage return, linefeed, altmode 
and control characters.) 

IMAGE mode (10) is similar to ASCII mode except that the bytes are 36 bits instead of 7. When 
you do an 1LDB (IDPB) you get (put) a whole word from (into) the buffer. You can read text files 
in this mode, in which case you will get 5 characters at a time. 

IMAGE BINARY (13) and BINARY (14) modes are the same as IMAGE mode except for the 
paper tape reader and punch and the XGP. See Section 13.4 for the use of mode 13 with the 
XGP, and see Section 13.7 and Section 13.8 for the meanings of these modes with paper tape 

I/O. 

DUMP mode (17) is used to do I/O without buffering. With each INPUT or OUTPUT UUO, 
you must give the address of a dump mode command list, which specifies how many words are to 
be transferred and where in your core image they are to come from or go. The INPUT or 
OUTPUT UUO does not return until the transfer is complete. Dump mode command lists are 
explained below. 

DUMP RECORD mode (16) is the same as DUMP mode for most devices. However, with output 
on magnetic tapes in DUMP RECORD mode, the data from each dump mode command is written 
on the tape in 200 word records, whereas in DUMP mode the data from each command is written 
in one large record. 



2.3 Dump Mode Command Lists 



The effective address of an INPUT or OUTPUT UUO in dump mode (16 or 17) must be the 
address of a dump mode command list. This list consists of up to 100 dump mode commands, each 
of which takes one word. The end of the list is indicated by a zero word after the last command. 

In the left half of a dump mode command word is the negative of the number of words to be 
transferred, and in the right half is the address of the word before the first word in your core image 
to which (from which) the data is to go (come). 

(This is the standard dump mode command format. Some devices like the TV cameras and the 
AD converter take non-standard dump mode commands. See the individual device descriptions in 
Section 13.) 

In the assembly languages, there is a pseudo-op called IOWD that generates dump mode 
commands. The line 
IOUD N.LOC 

generates a word with -N in the left half and LOC-1 in the right half. As a dump mode 
command, this will cause N words to be transferred to (from) the block consisting of locations LOG 
through LOC+N-1. 



10 General I/O 2.3 



Each dump mode command in a list causes a separate I/O transfer to take place. In particular, 
with record devices (like the disk, dectapes and magnetic tapes) each command is executed from the 
beginning of a record. For example the command list- 

IOUD 180, A 
IOUID 108, B 
8 

will read 100 words from one record and then 100 words from the next record, ignoring all but the 
first 100 words oj each record. 

Consecutive commands in a list are usually fetched from consecutive words. However, if the left 
half of a dump mode command word is zero, then that word is taken not as a command, but as a 
pointer to the next command word, which is then fetched from the location specified by the right 
half of that word. (Of course, if the right half is zero also, then that word marks the end of the 
command list.) For example, the two command lists given below (beginning at LIST1 and LIST2, 
respectively) are equivalent. 



LIST1: IOUD 200, LOCI 
IOUD 288.LOC2 



L1ST2: IOUD 288, LOCI 
LIST2B 

LIST2B! IOUD 288.LOC2 
8 

The only difference is that in the second example, the commands are in two different places instead 
of being directly in line. Either of these lists would cause 200 words to be transferred to (from) 
LOG 1 and then 200 words to (from) LOC2. 



2.4 Buffer Rings 

When you are doing input (output) in one of the buffered modes, a ring of buffers is set up by the 
system for storage of data in your core image. This allows you to empty (fill) one buffer while the 
device is filling (emptying) another buffer independently. 

A buffer ring consists of some number of buffers with each one containing a pointer to the next. 
The last buffer contains a pointer to the first; hence it is a ring. The user can specify the number 
of buffers in a ring with the INBUF and OUTBUF UUOs (see Section 2.9), or he can accept 
the system default number of buffers, which is two. The current buffer in a ring is referenced 
through a three word block called the buffer header. When you initialize a device in buffered 
mode, you give the address of a three word block where the buffer header is. The system will 
initialize the header when it sets up the buffer ring. 

The buffer header contains 1) a bit indicating whether the buffer has ever been used, 2) a pointer 
to the buffer the user is currently emptying (filling), 3) the byte pointer that is used for loading 
(storing) data from (into) the current buffer, and 4) a count of the number of bytes left in the 
current buffer. Normally only the byte pointer and the byte count are needed by the user. The 



2.4 Buffer Rings 11 

byte pointer is in the second word of the header and the byte count in the third. The first word 
contains the use indicator in the sign bit (400000..0 bit) (which is set to 1 when the buffers are 
created and cleared to zero when the first INPUT or OUTPUT UUO is given) and the buffer 
pointer in the right half. For input, the byte count is the number of bytes of data left in the buffer; 
for output it is the number of bytes not yet filled with data by the user. The byte pointer is set up 
so that you can get (put) the next byte by doing an ILDB (IDPB). When you initialize a device in 
buffered mode, the system clears the buffer header and then sets up the size field of the byte 
pointer. If you so desire, you may then change the byte size to any size you want, and the system 
will do the right things. (The system actually uses the byte size in the byte pointer to calculate the 
byte count.) Finally, whenever you do an INPUT or OUTPUT UUO, the system updates the 
entire buffer header before returning control to you. 



2.5 Buffers 



The first three words of each buffer are used by the system and contain no data. The first word 
contains the device I/O status word (explained in Section 2.6) for the device at the time the 
buffer was transferred. The left half of the second word has the size of the buffer not counting the 
first two words, that is, the number of data words in the buffer plus one. The right half of the 
second word holds the address of the next buffer in the ring (which may be the same buffer). All 
pointers to buffers, both in the buffer header and from one buffer to the next, point not to the first 
word of the buffer but to the second word, where the pointer to the next buffer is. The sign bit 
(400000,,0 bit) of the second word in a buffer is set to 1 by the system when the buffer is full of 
data and cleared to when it is empty. 

The right half of the third word holds a count of the number of words of data actually contained 
in the buffer. The left half of this word is reserved for bookkeeping use by the system. On output 
the word count is computed from the byte pointer in the buffer header unless the IOWC bit in the 
device status word (see Section 2.6) is on, in which case the value in the third word of the buffer 
is taken as the count. That means you must specifically place the word count there yourself. Many 
devices (including the disk) will not take a word count larger than their standard buffer size. 
There are at least two devices that will accept buffers of any size: terminals and magnetic tapes. 
For other devices, consult the individual device writeup in Section 13. 

The illustration on the next page shows the structure of a buffer ring with two buffers. 



12 General I/O 



2.5 



DIAGRAM OF A 2-BUFFER RING 



BUFFER HEADER 

\ 

|s| | buffer pointer | ----------4, 
/ 4, 

| byte pointer | 4< 
4. 

| byte count | 4- 

4, 

I 

I 

^ - 4- f- 4- - - f- *- - - *-- *- 4- *- 4- f- f- #- 4-** 4- *- - *- *- 4- 4- - *- - - *- - 1- - <- f- 4- - *- f- *- - - ~ - 4- -- 4- *---f-- *-<-#- 4- *---<- 

4- FIRST BUFFER T 

4- t 

4, t 

4. | I/O status bits | t 

4- \ \ t 

--*--*-->--> 1 3 1 data size + 1 | buffer pointer | ----------* 4 t 

/ / 4, t 

| bookkeeping | data word count | 4- t 
I t 

4, t 

4- t 

data 4- t 

I t 
4- T 
4, f 

4- t 
I 

1 SECOND BUFFER t 

4> t 

4, t 

4- | I/O status bits | t 

4, \ _ \ t 

--------> | s | data size + 1 | buffer pointer |---+..---------->.->->t 
| bookkeeping | data word count | 



data 



2.6 



Device I/O Status Word 13 



2.6 Device I/O Status Word 



For each device on the system there is a word called the device I/O status word. The left half of 
this word is used internally by the system and the right half is used to communicate with the user. 
The right half word is set up when the user initializes the device. Thereafter, certain bits may be 
set by the system to tell the user of conditions that have arisen (such as end of file). These bits can 
be tested or changed by the user with the STATZ, STATO, GETSTS and SETSTS UUOs (see 
Section 2. 14). The following table gives the meanings of the bits in the right half of the device 
status word. 



Bits Octal 
18 0..400000 



19 0..200000 

20 0,, 100000 



21 Q.,40000 



22 0..20000 



23 0,, 10000 

24:29 0..7700 
30 0,,40 



Name Meanings of I's in device status word 

IOIMPM Improper mode. This can mean many 
things. If you attempt to write on a 
write-locked dectape or UDP, you get this 
error bit. If you initialize a device in a 
mode that is not legal for that device, you 
will get either this error bit or a system 
error message. 

IODERR Device detected error. 

IODTER Device detected error. This bit and the 
IODERR bit generally mean that the 
device has detected an undesirable, if not 
catastrophic, condition. 

IOBKTL Dectape block number out of bounds. 
This bit comes on if you reference a 
non-existent block on a dectape. 

IODEND End of file. This bit comes on only with 
input; it means there is no more data to 
be read in because you have reached the 
end of the file. On teletypes and 
pseudo-teletypes, end of file is indicated 
by typing control-Z (TZ); on Data Disc 
and III displays, end of file is indicated 
by typing control-meta-linefeed. 

IOACT Device is active. 

Reserved for device-dependent features. 

IOCON Synchronize buffered I/O. An attempt is 
made to make buffered I/O synchronous 
when this bit is on. That is, exactly one 
buffer is transmitted for every INPUT 



14 General I/O 2.6 



UUO and at most one buffer for each 
OUTPUT UUO. The best way to 
insure synchronous I/O, however, is to 
have exactly one buffer in your ring, or 
better yet, to use dump mode. 

31 0,,20 IOWC Inhibit system computation of output 

word count. The system is inhibited 
from computing the word count that goes 
in the third word of each buffer. 
Normally, when you do an OUTPUT 
UUO in buffered mode, the system uses 
the byte pointer in the buffer header to 
compute the number of words of data in 
the buffer. This computed word count is 
then deposited in the third word of the 
buffer. If the IOWC bit is on, the word 
count computation is inhibited and 
whatever is in the third word of the 
buffer is taken as gospel for the word 
count. 

32:35 0,,17 Data mode. 



2.7 Files 



Data on certain devices is stored in the form of files. To access data on one of these devices, you 
must specify the filename in addition to the device name. Devices that are file structured are called 
directory devices; the disk and dectapes are such devices. 

Every file has a name of one to six characters and an optional extension of one to three characters. 
On the disk each file is associated with some project-programmer name (PPN). A 
project-programmer name consists of a project code and a programmer code, each of which is one 
to three characters. All of the files for a particular project-programmer name are referred to 
collectively as that PPN's disk area. 

File names, file name extensions and project-programmer names are stored in sixbit representation. 
File names are left- justified in one whole .word; file name extensions are left- justified in the left half 
of a word. If a filename has no extension, the extension half word is zero. A zero file name is not 
permitted. Project-programmer names are stored in one word with the project code in the left half 
and the programmer code in the right half, each half being right-justified. For an example of all 
this, the file RAD.Y[A,BC] would be represented by the following octal values and corresponding 
assembly language lines of code (the date word is included to make this four-word block into a 
sample block for the LOOKUP UUO): 



2.7 Files 15 



Octal Assembly language 

filename: 624144888888 SIXBIT/RAD/ 

extension: 718888088888 SIXBIT /Y/ 

date word: 888888888888 8 

PPN: 888841884243 SIXBIT / A BC/ 

where 62 is the octal value for "R" in sixbit, 41 is the octal value for "A" in sixbit, etc. 



Disk File Protection System 

Each file on the disk has a nine-bit protection key that indicates who may do what to the file. A 
one in the first bit (400 bit) position means that the file dumping program DART (that provides file 
backup on magnetic tape) should never dump this file. A one in the second bit (200 bit) means 
that COPY should not delete this file without getting special confirmation; this prevents accidental 
deletion of a file with the monitor DELETE command. The remaining seven bits (177 bits) are 
broken into three groups: the third bit (100 bit) tells what the owner of the file may do to the file, 
the middle three bits (070 bits) tell what a PPN consisting of the owner's programmer code and a 
different project code may do with the file, and the last three bits (007 bits) tell what anyone else 
may do. Corresponding bits in these last two groups mean the same thing but for the two different 
classes of users. The sole bit in the first group means the same as the third bit in each of the other 
groups but applies to the owner of the file. 

In each group, a one in the first bit position (the 4 bit) means that the users corresponding to that 
group are not permitted to change the file's protection key. This is called protection protection. A 
user is always permitted to change the protection keys of his own files. A one in the second bit 
position (the 2 bit) means that the corresponding users may not read the file. This is called read 
protection, and, again, a user may always read his own files. A one in the third bit position (the 1 
bit) means that the corresponding users may not write, alter or delete the file. This is called write 
protection. 

Here is a summary of the nine protection bits. 
Bits Octal Meaning 

400 Dump never (DART only). 

1 200 Delete protect (COPY only). 

2 100 Write protection for the file's owner. 

3:5 070 Protection, read, and write protection for PPNs consisting 

of the owner's programmer code and some other project 
code. 

6:8 007 Protection, read, and write protection for others. 



16 General I/O 2.7 

Disk Project-Programmer Names 



When you reference a file on the disk, you must specify the project-programmer name of the file's 
owner. If the file is your own, this can be done by indicating a PPN word of zero. Sometimes, 
however, you would like a program to act as if it were logged in under a different PPN. This can 
be accomplished with respect to file references through the use of Disk PPNs and the DSKPPN 
UUO. Each job has associated with it a Disk Project-Programmer Name (the Disk PPN) that is 
gsed whenever the PPN word for a disk file specification contains zero. Your Disk PPN is set to 
your tea! PPN when you log in and can be changed with the monitor ALIAS command; it can also 
be changed or retrieved with the DSKPPN UUO. Thus if you specify a file with a zero PPN, the 
project-programmer name of your Disk PPN will be assumed for the file. This method does not, 
however, allow you violate any protection keys for the files you reference. These protection keys are 
applied to your real (logged in) PPN to see if you are permitted the kind of access you are 
requesting for the file. 



DSKPPN [OP=047, ADR-400071] CALL1 400871 



MOVE AC, [<code>] 
DSKPPN AC, 

Code Meaning 

Return own Disk PPN in AC. 

-1 Reset own Disk PPN to logged in PPN. 

0,,n Return the Disk PPN of job n. 

<proj>,,0 Set own Disk PPN to: <proj>, ,<logged in prog. name>. 

<proj>, , <prog> Set own Disk PPN to that in AC. 

The DSKPPN UUO is used to change or retrieve your Disk Project-Programmer Name or to 
retrieve the Disk PPN of someone else. The action taken by this UUO is determined by the code 
in AC. If AC contains zero, your current Disk PPN is returned in AC. If AC contains -1, your 
Disk PPN is reset to your logged in PPN. If AC contains a job number, the Disk PPN for that 
job is returned; if the job is not logged in, zero is returned. If the right half of AC contains zero 
and the left half is non-zero, then the project part of your Disk PPN is set to the project specified 
by AC left and the programmer part is set to the programmer code under which you are logged in. 
If- both halves of AC are non-zero and AC doesn't contain -I, then your Disk PPN is set to the 
PPN specified by the whole AC. No error checking is done to make sure AC holds a legal or 
existing PPN. 



2.8 Initializing a Device 17 

2.8 Initializing a Device 

There are two UUOs available to initialize a device: the INIT UUO and the OPEN UUO. Either 
of these UUOs can be used; the only difference between them is the format for passing parameters 
to the system. 

Each of these UUOs tells the system what device you want to use, what mode you want to use it in, 
where your buffer headers are, if any, and what channel number you want to associate with the 
device. If the device is a non-sha'rable device (such as the line printer, a terminal, a dectape or a 
magnetic tape) which is not available now, the system will normally type out a message asking if 
you will wait for it. However, the following bits in the data mode half word which you specify 
when you attempt to initialize the device can be used to indicate special action to be taken. 

Bits Octal Meanings of 1's in the initial data mode 

26 0..1000 Wait automatically until the device is available. 

27 0..400 Take error return automatically if the device is busy. 

This bit takes precedence over bit 26. 

If you want to have your program wait automatically without your being asked, you should have 
bit 26 (the 1000 bit) on in the data mode half word. If you would like to get the error return 
automatically when a device is busy, you should have bit 27 (the 400 bit) on in the data mode. 
The automatic error return bit takes precedence over the automatic wait bit. Note that these two 
bits (26 and 27) are among those reserved for device-dependent features. Thus, if you have either 
of these bits on when you initialize a device, you should use the SETSTS UUO (explained in 
Section 2.14) to turn them off after you get the device unless you want the particular features they 
represent for that device. See the device writeups in Section 13 for the meanings of these bits for 
the individual devices. 

A device can be referred to by either its physical name or its logical name. The physical name of a 
device is the permanent name given that device by the system. A logical device name is a 
temporary name that can be specified with the monitor ASSIGN command. Device names (physical 
or logical) are stored left- justified in sixbit representation. For example, the device DTA1 is 
represented by the octal number 446441210000, which can be set up by the SIXBIT pseudo-op in 
the assembly languages, i.e., SIXBIT /DTA1/. If a given device name is both a physical name (of 
one device) and a logical name (of another device), the logical name takes precedence. 



18 General I/O 2.8 



INIT iOP-041] 



INIT <channel number>, <data mode> 
<physical or logical device name in sixbit> 
OBUF,, IBUF 
<error return> 

The INIT UUO initializes the named device on the channel indicated by the AC field and in the 
data mode specified by the address field of the instruction. OBUF should be the address for your 
output buffer header or zero if none. IBUF should be the the address for your input buffer header 
or zero if none. If you are not going to do any buffered output on this channel, OBUF can be 
zero. If you are not going to do any buffered input on this channel, IBUF can be zero. 

The data mode half word is used to set the right half of the device I/O status word for this device. 
The IOACT bit, however, is masked out when this is done. (The device status word is explained 
in Section 2.6.) 

When you initialize a device, any device open on the channel specified is released before the new 
device is initialized. (See the RELEAS UUO in Section 2.12.) 

If there is no device with the name you give, the error return (double skip) is taken. If this UUO 
is successful, the triple skip return is taken. 



OPEN [OP=050] 



OPEN <channel number >, ADR 
<error return> 

ADR: <data mode> 

<device name in sixbit> 
OBUF,, IBUF 

The OPEN UUO does exactly the same thing as the INIT UUO above. The difference is that the 
information passed to the system by OPEN does not have to appear in line with the instruction 
stream. The location of this information is specified by the effective address of the UUO. Hence 
OPEN can be used by reentrant programs that change the data referenced by the UUO. 

The left half of the data mode word is ignored. 



2.9 Setting Up Buffer Rings 19 

2.9 Setting Up Buffer Rings 

For buffered I/O, a buffer ting must be set up in your core area. Unless you issue an explicit 
buffer-creating UUO (described below), or make the buffer ring yourself (very carefully!), the system 
will set up a buffer ring for you when you first give an INPUT or OUTPUT UUO. That is, if a 
device open in buffered mode has no associated input (output) buffer ring when the first INPUT 
(OUTPUT) UUO is given, the system will set up a two-buffer ring before carrying out the normal 
function of the UUO. To do buffered input (output), you must have given the address of the 
input (output) buffer header when you initialized the device. 

Whenever the system sets up a buffer ring for you, it places the ring at the address contained in 
JOBFF in your job data area (see Appendix 4). You may cause your buffers to be set up 
anywhere in your core image by temporarily changing JOBFF to point to the place where you want 
the buffers to be. If there is not enough room between JOBFF and JOBREL for the number of 
buffers you request, your core image is automatically expanded to make room. After the ring is set 
up, JOBFF is left pointing to the first word beyond the ring and your buffer header is made to 
point to the first buffer in the ring. 

The following UUOs cause a buffer ring to be set up, and they permit specification of a 
non-standard number of buffers and non-standard sizes. 



INBUF tOP=064] 

INBUF <channel number>, <number of buffers> 

The INBUF UUO causes an input buffer ring to be set up in your core area and to be associated 
with the specified channel. The effective address of this UUO is interpreted as the number of 
buffers the ring is to have. If the effective address is zero, two buffers are set up (the same number 
of buffers you would get if you did not give this UUO at all). 



OUTBUF [OP-8651 

OUTBUF <channel number >,<number of buffers> 

The OUTBUF UUO causes a ring of output buffers to be set up exactly as INBUF does for input 
buffers. 



20 General I/O 2.9 

UINBF [OP=7041 

UINBF <channel number>,ADR 

ADR: <number of buffers> 

<number of words of data in each buffer> + 1 

The UINBF UUO causes an input buffer ring to be set up in your core area and to be associated 
with the specified channel. The effective address points to a two word block. The first word of this 
block contains the number of buffers to be in the ring (zero means two), and the second word 
contains a number which is one greater than the number of words of data in each buffer. 

Some devices (including the disk) do not accept nonstandard buffer sizel Devices that will accept 
nonstandard sizes include terminals and magnetic tapes. For other devices see the individual 
device descriptions in Section 13. 



UOUTBF [OP=705) 

UOUTBF <channel number >, ADR 



ADR: <number of buffers> 

<number of words of data in each buffer> + 1 

The UOUTBF UUO causes a ring of output buffers to be set up exactly as UINBF does for input 
buffers. 



BUFLEN [OP-047, ADR=400042] CALLI 400042 



MOVE AC,[<device name in sixbit, or channel number>] 
BUFLEN AC, 

The BUFLEN UUO tells you the standard buffer size for the device specified by the contents of 
AC. AC should contain either the name (logical or physical) of the device or the number of the 
channel on which it is open. The buffer size, which is returned in AC, is one greater than the 
length of the data portion of a buffer that would be set up if you did an INIT and then an 
INBUF or OUTBUF for the particular device. This is the number you would need to use to set 
up a standard size buffer with a UINBF or a UOUTBF UUO. The total number of words each 
buffer would take up is two greater than this number (see Section 2.5). If there is no such device, 
zero is returned in AC. 



2.10 Opening Files 21 

2.10 Opening Files 

After initialization of a directory device, a particular file on the device must be opened (i.e., 
selected) before any I/O can take place. Opening of a file for input is done with the LOOKUP 
UUO; opening of a file for output is done with the ENTER UUO. The RENAME UUO is 
available for changing a file's name or specifications (date written, protection, etc.) after the file has 
been opened. RENAME is also used to delete files. 

If you initialize a directory device and attempt to transfer data with an INPUT (OUTPUT) UUO 
without having done a LOOKUP (ENTER), the system will type out a message and require you to 
type in a filename so that a LOOKUP (ENTER) can be done before the data is transferred. 

For non-directory devices, the UUOs LOOKUP, ENTER and RENAME are no-ops; they always 
take the success (skip) return. 

LOOKUP tOP=8761 



LOOKUP <channel number >, ADR 
<error return> 

ADR: <file name in sixbit> 

<file name extension in sixbit> 

<this word is ignored> 

<pro ject-programmer name in sixbit> 

The LOOKUP UUO opens for input the file specified by the four-word block pointed to by the 
effective address of the UUO. The first word of the block should contain the sixbit name of the 
file to be read; the second word should contain the sixbit file name extension in the left half. If the 
device is the disk, the fourth word of the block should contain the project-programmer name for 
the file or zero; zero will cause your current Disk PPN to be assumed for the file (see page 16). The 
right half of the file extension word is ignored as is the whole word following the extension word. 
For clectapes the project-programmer name is also ignored. 

If the LOOKUP is successful, the skip return is taken and some information about the file is 
returned. If the file does not exist or if some other error condition arises, then the error return (no 
skip) is taken and, if the device is the disk, an error code is returned in the right half of ADR + 1 
(the rest of the block is unchanged). The error codes for LOOKUP, ENTER and RENAME are 
explained in a table on page 25. No error codes are returned for dectapes. 

After a successful LOOKUP of a disk file, the following information is returned in the LOOKUP 
block. The word at ADR+2 contains: the file's protection in bits 0:8 (777000,,0 bits) the data mode 
in which the file was written in bits 9:12 (740,,0 bits), the file's time written in bits 13:23 (37,,770000 
bits), and the file's date written in bits 24:35 (0,,7777 bits). These values are stored in the directory 
when the file is created and may be changed with the RENAME UUO (see page 23). (The date 
written is in system date format which is explained under the DATE UUO on page 85. The time 
written is in minutes past midnight on the date given. The protection bits are explained on page 



22 Genera) I/O 2.10 



15 and the data mode is explained in Section 2.2.) The word at ADR+3 contains the negative 
swapped word count, that is, the negative of the number of words in the file, with the left and right 
halves exchanged. (The word count is returned in this strange format to be compatible with DEC's 
format.) Finally, the right half of the word at ADR+1 contains, in system date format, the "creation 
date" of the file, which is a slightly less than well defined quantity. The date written in ADR+2 is a 
much more significant date. 

Here is a summary of the information in the block after a successful LOOKUP on the disk. 

ADR: <f i le name> 

ADR+1: <file name extension>, , <"creat ion date"> 

ADR+2: <Bits0-8 (777000, ,0 bi ts) : protection; 

bits 3-12 (740,, bits): data modes 

bits 13-23 (37,, 770000 bits): time written; 

bits 24-35 (0,,7777 bits): date written> 
ADR+3: <negative swapped word count> 

WARNING! You may not do two consecutive successful LOOKUPS for the disk with the same 
four-word block without restoring the project-programmer name in the fourth word of the block 
after the first LOOKUP! The negative swapped word count probably will not represent the PPN 
you want! 

After a successful LOOKUP on a dectape, the following information will be found in the 
LOOKUP block: 

ADR: <f i I e name> 

ADR+1: <extension>, ,<number of first block of file> 

ADR+2: <date file wr.it ten> 

ADR+3: <whatever was in 4th word of ENTER block when the file was created> 



ENTER [OP=077] 



ENTER <channel number>,ADR 
<error return> 

ADR: <file name in sixbit> 

<file name extension in sixbi t>, , <creat ion date> 
protection key in bits 0)8 (777000,, bits)> 
<pro ject-programmer name> 

The ENTER UUO opens for output a new file with the specifications given in the four-word block 
pointed to by the effective address of the UUO as indicated above. For a disk file, the time and 
date written are set to the current time and date when the ENTER is done, and the file's protection 
is set from bits 0:8 of ADR+2. If the device is a dectape, the words at ADR+2 and ADR+3 are 
copied into the dectape's directory with the exception that if bits 24:35 (Q.,7777 bits) of ADR+2 are 
zero, the current date is substituted for this 12-bit field before the word is written into the directory. 
For the disk, if the PPN is zero, your current Disk PPN is assumed. If the ENTER is successful, 
the skip return is taken and exactly the same information is returned in the block as after a 
successful LOOKUP (see above and note that for a new file the word count is zero), If there 



2.10 Opening Files 23 

already was a file with the given name, its creation date is returned; otherwise the specified creation 
date (zero means today) is returned. If the ENTER fails for any reason, then the no skip error 
return is taken and, if the device is the disk, a code is returned in the right half of ADR+1 (the rest 
of the block is unchanged). The error codes for LOOKUP, ENTER and RENAME with the disk 
are explained in a table on page 25. No error codes are returned for dectapes. 

An ENTER can fail for a number of reasons. It will fail if the file name is zero, if the PPN (or 
Disk PPN) is illegal, if the file already exists and is write protected against you, if the file is already 
open for output (by anyone), if the device is a dectape which is already full, or if you have already 
done a LOOKUP on this channel and the filename for the ENTER does not agree with that given 
in the LOOKUP (see Read-Alter mode for the disk on page 24). 

With a successful ENTER of a disk file, if the file specified already exists, then that file will be 
replaced with the new file when the new file is closed. Until that time, any attempt to read the 
specified file will access the old file. After the new file is closed, any attempt to read the specified file 
will get the new version; the old version will stay around only long enough for anyone still reading 
it to finish. 



RENAME tOP=055] 



RENAME <channel number >, ADR 
<error return> 

ADR: <new file name or zero for deletion> 
<new file extension>, ,<ignored> 

<neu protection key, mode, time and date last written> 
<project-prbgrammer name> 

The RENAME UUO is used to change the name, extension, protection key, mode, or time and date 
written, or a combination of these, for a file, or to delete a file. This UUO must be given after a 
successful LOOKUP or ENTER has been done on this channel and may be given after a CLOSE 
UUO (see Section 2.12) for this channel. After an ENTER, a CLOSE is necessary before 
RENAME! As with LOOKUP and ENTER, if the project-programmer name is zero, your current 
Disk PPN is assumed. 

If the file name specified is zero, and if the effective PPN matches the PPN of the file open on this 
channel, then that file is marked for deletion. This means that as soon as no one is reading the file, 
it will go away. (After a file has been marked for deletion, anyone attempting to start reading it 
will not find it.) 

If the file name is not zero, then the name, extension and protection key for the file open on this 
channel are all changed to those specified in the four-word block. Also, if bits 9:35 at ADR+2 are 
not all zero, then the mode and time/date written of the file are set to those specified by these bits 
(9:12 are mode; 13:23 are time; 24:35 are date). Note that you cannot rename a file to a different 
disk area (different PPN); if the effective PPN is different from the file's original PPN, the file will 
be lost. 



24 General I/O 2.10 



If the RENAME is successful, the skip return is taken. Otherwise, the no-skip error return is taken 
and (for the disk) an error code is returned in the right half of ADR+1, with the rest of the block 
left unchanged. The meanings of the possible disk error codes for LOOKUP, ENTER and 
RENAME are explained in a table on page 25. 



Read-Alter Mode 



There are two basic methods of updating data in a file. In the first, the file is copied, with 
appropriate changes, into a new file with the same name. This is accomplished by doing a 
LOOKUP of the old file on one channel and an independent ENTER of the same filename on a 
different channel. When the new version of the file is closed, the old version will be deleted (after 
all read references to it are finished). This method requires the whole file, however, to be read in 
and written out again even if only a little of the data in the file is to be changed. The second 
method allows you to open an already existing disk file and to change data in it in place, without 
rewriting the whole file. This method of file manipulation is known as READ-ALTER (RA) mode. 
When you have a file open in this mode, you may do (on the same channel) both input and output 
with the file. To open a file in this mode, you do a LOOKUP of the file and then an ENTER of 
the same file on the same channel. If both the LOOKUP and the ENTER are successful, then the 
file will be open in RA mode. If you give a different filename for the ENTER than you used with 
the LOOKUP, the ENTER will fail with an error code of 6 (see table below). In RA mode, at the 
moment any data is written out, that data overwrites whatever was there before. So if the file does 
not get closed thereafter, the new data will still have replaced the old data in the file. Data can be 
written into selected parts of a file by use of the random access UUOs USETI, USETO and 
UGETF (see Section 2.13). While a file is open in RA mode, anyone attempting to do either a 
LOOKUP or an ENTER of that file will get the FILE BUSY error return (code 3, see below). 
Also, an attempt to open a file in RA mode (by doing an ENTER after a successful LOOKUP) will 
also fail with the FILE BUSY error return if anyone else is reading or writing the file. 



2.10 Opening Files 25 

Disk Error Codes for LOOKUP, ENTER and RENAME 

Code Meaning 

8 NO SUCH FILE. 

LOOKUP: File specified does not exist. 

ENTER: Zero file name given. 

RENAME: File LOOKUPed or ENTERed no longer exists. 

1 ILLEGAL PPN. PPN specified has no UFO. 

2 PROTECTION VIOLATION. File is protected from what you 
tried to do. 

3 FILE BUSY. 

LOOKUP: File is currently open in Read-Alter mode. 

ENTER: File is currently being uritten. 

ENTER after LOOKUP: File is currently being read or written. 

RENAME: File is currently being read.. 

4 FILE ALREADY EXISTS. (RENAME only) 

RENAME: There is already a file with the new name given. 

5 NO FILE OPEN. (RENAME only) 

RENAME: No successful LOOKUP or ENTER has been done yet. 

6 DIFFERENT FILENAME SPECIFIED. (ENTER only) 

ENTER: The filename does not match that of a LOOKUP 
already done on this channel (attempt to open 
file in Read-Alter mode). 

7 (This error code cannot occur.) 

18 BAD RETRIEVAL. Some disk pointers have been garbaged 
somewhere. This should not happen. 

11 BAD RETRIEVAL. Slightly different version of above. 

12 DISK IS FULL. (ENTER only) 

ENTER: There is no more room on the disk. 

Note: Errors 10, 11 and 12 will cause a system error message to be typed out unless bit 28 (the 
0,,200 bit) is on in the device status word (see Section 2.6). When one of these error messages is 
typed out, the program will be stopped; if you then type CONTINUE, the error return will be 
taken with the appropriate error code given. 



26 General I/O 2.11 

2.11 Transferring Data 

The following UUOs are used to transfer data between your core image and a device, which must 
already have been initialized on some channel (see Section 2.8). If you give one of these UUOs for 
a device open in buffered mode with no buffer ring set up, a two-ring buffer will be set up for you 
before the normal action of the UUO is taken (see Section 2.9). 

IN [OP-956] 



IN <channel number>, ADR 
<success return> 
<error return> 

The IN UUO causes some data to be read in to your core image from the device open on the given 
channel. In buffered mode, at least one buffer will be filled with input data and the buffer header 
will be updated so that the byte pointer and byte count are correct for the newly filled buffer. In 
dump mode, ADR is taken to be the address of a dump mode command list (see Section 2.3), and 
the UUO will not return until all the data indicated by the command list has been transferred. In 
buffered mode, ADR is ignored. 

If any error (including end of file) occurs, then the UUO skips. Specifically, when the UUO is to 
return, if any of the error bits IOBKTL, IODTER, IODERR, IOIMPM or 1ODEND (see Section 
2.6) are on, the skip return is taken. Otherwise, the direct return (no skip) is taken. 

In dump mode, if end of file occurs before the command list has been satisfied, then IODEND will 
come on and the UUO will skip, but there will be no way of telling how much data, if any, was 
read in before end of file occurred. In buffered mode, there is always a byte count that tells how 
much data has been read in. 

On teletypes and pseudo-teletypes, end of file is indicated by typing control-Z (TZ); on Data Disc 
and III displays, end of file is indicated by typing control-meta-linefeed. 



INPUT [OP-866] 

INPUT -cchannel number>,ADR 



The INPUT UUO does exactly the same thing as the IN UUO except that no error checking is 
done and the UUO never skips. 



2.11 Transferring Data 27 



OUT [OP-857] 



OUT <channel number>,ADR 
<success return> 
<error return> 

The OUT UUO causes some data to be written out from your core image to the device open on 
the given channel. In buffered mode, the buffer pointer, byte pointer and byte count in the buffer 
header are set up for the next buffer that you may fill and the device is started up to empty the 
buffer you just filled. The first OUT UUO you give in buffered mode, however, does not cause 
any data to be written out, only the buffer header to be set up with the buffer pointer, byte pointer 
and byte count for the first buffer for you to fill. 

In dump mode ADR is taken as the address of a dump mode command list (see Section 2.3) that 
indicates what data are to be written out; the UUO does not return until the transfer is complete. 

In buffered mode, if ADR is non-zero, this UUO does not write out your current buffer but instead 
switches you to the new buffer ring pointed to by ADR. (ADR should be the address of the second 
word of a buffer in the ring.) Your buffer header and some internal system data are adjusted so 
that you will next be filling the first buffer in the new ring. The buffer ring you are switching to 
must be completely set up with the buffer-to-buffer pointers and the buffer sizes in the second word 
of each buffer. The purpose of this feature is to let you switch among several output buffer rings if 
you so desire. Note, however, that when you switch rings there is no provision for forcing data still 
in buffers in the old ring to be written out. 

As with the IN UUO, if any of the error bits IOBKTL, IODTER, IODERR, IOIMPM or 
IODEND (see Section 2.6) are on at completion of the UUO, the UUO skips. Otherwise, the direct 
return (no skip) is taken. 



OUTPUT tOP=8671 

OUTPUT <channel numbers-, ADR 



The OUTPUT UUO does exactly the same thing as the OUT UUO except that no error checking 
is done and the UUO never skips. 



WAIT [OP-847, ADR-10] CALLI 18 

UAIT <channel number>, 



The WAIT UUO simply waits for all I/O on the channel indicated by the AC field to finish. 
Normally, when a device is open in buffered mode, the system does I/O with your buffers while 
your program is running. This means that only the buffer pointed to by your buffer header can be 



28 General I/O 2.11 



expected to be remain untouched by the system. After giving this UUO, you can expect all of your 
buffers to be stable and untouched by the system. 



2.12 Terminating I/O 



The following two UUOs are used to finish up I/O on a given channel. The CLOSE UUO 
essentially undoes the effect of a LOOKUP or ENTER, and the RELEAS UUO undoes the effect 
of an INIT or OPEN. 



CLOSE tOP-070] 

CLOSE <channel number>, <close-inhibi t flags> 

(<c I ose- i nhibi t flags>: 

1 (bit 35) inhibits closing output, 

2 (bit 34) inhibits closing input.) 

The CLOSE UUO is used to terminate I/O on the channel specified by by AC field of the UUO. 
The effective address of the instruction determines whether input or output or both or neither is 
closed. If the low order bit (bit 35--the 0,,1 bit) of the effective address is on, then the closing of 
output is inhibited. If bit 34 (0,,2 bit) of the effective address is on, the closing of input is 
inhibited. The remaining bits in the effective address are ignored. 

On non-directory devices like terminals and paper tape, this UUO forces out any data still in any 
output buffers. For magnetic tape, closing output causes two end-of-file marks to be written on the 
tape and causes the drive to backspace over one of them; this means that there will be one 
end-of-file mark between each pair of files and two end-of-file marks after the last file on the tape. 
The two consecutive end-of-file marks denote what is called the logical (as opposed to physical) end 
of tape. 

On the disk and dectape, closing output forces out any data still in any output buffers and then 
closes the file; closing input simply closes the file. After a disk or dectape file is closed, no more data 
may be transferred to or from it. However, a file may be RENAMEd even after it is CLOSEd. 



2.12 Terminating I/O 29 

RELEAS tOP-071] 

_ _ _ _ _ _ _ _ __ _________________________ _ ______________ _ ____ _ 

RELEAS <channel number>,<close-inhibi t flags> 

(<c I ose- i nhibi t flags>: 

1 (bit 35) inhibits closing output, 

2 (bit 34) inhibits closing input.) 

The RELEAS UUO does a CLOSE of the given channel with the given <close-inhibit flags> 
specified by the effective address (see the CLOSE UUO above) and then frees the channel number. 
Thus, after giving this UUO, you must do another INIT or OPEN to do any more I/O on this 
channel. 

i 

The RESET UUO (see page 126) simulates a RELEAS <channel>,3 for every channel you have 
open. The normal EXIT UUO (that is, "EXIT 0,") simulates a RELEAS <channel>,0 for every 
channel you have open (see page 125). 



REASSI IOP-847, ADR-21) CALLI 21 



MOVE AC, t<job number>] 

MOVE AC+1, [<device name in sixbit, or channel number>] 

REASSI AC, 

The REASSI UUO is used to turn over a device you are using to another job. Accumulator AC 
should contain the number of the job to whom you wish to give the device, and accumulator AC+1 
should contain the logical or physical name of the device or the channel on which it is open. This 
UUO gives the same results as the following sequence: 1) you release the device with both input 
and output inhibiting, 2) you deassign the device with the monitor DEASSIGN command, and 
3) the job indicated assigns the device with the monitor ASSIGN command. 

If the job number you give is not that of a logged in job, then this UUO will return with 
accumulator AC set to zero. If the device is not assigned to your job, or if the device may not be 
reassigned at this time, then the UUO will return with accumulator AC+1 set to zero (which might 
be confusing if you specified channel zero in AC+1). . 



2.13 Random Access to Files 



A disk or dectape file consists of a series of 200 word records. Often, these records are read (or 
written) sequentially from the beginning of the file to the end. But sometimes one wishes to read or 
alter only selected parts of a file. Three random access UUOs are provided to allow the user to do 
exactly that. To do random access input or output, you must specify which record you want to 
reference next. On the disk, the records of a file are numbered consecutively from 1 to n, where 



30 General I/O 2.13 



the file is n records long. (Hidden records can precede logical record 1 of a disk file. The hidden 
records have non-positive logical record numbers. See the disk file record offset feature on page 
143.) On dectapes the records of a file are physical blocks and are numbered differently; for a 
precise explanation of dectape files, read Section 13.5. 

For each disk file open, the system maintains a pointer to the record that will be referenced by the 
next INPUT or OUTPUT UUO. For each dectape file open, the system maintains two pointers, 
one for input and one for output. The following three UUOs set these pointers to specific values. 
If you try to set the record pointer for a disk file to a value less than that of the first physical record 
in the file, you get the first physical record instead. If you try to set it to a record beyond the end of 
a disk file, you get the first record after the last record in the file (and IODEND in the device status 
word is turned on; see Section 2.6). If you try to set it to a value greater than the number of the 
last physical block on a dectape, IOBKTL will be turned on in the device status word; thus the 
error return will be taken with the next IN or OUT UUO. 



USETI COP-874] 

USETI <channel number>, <record number> 



The USETI UUO prepares you to read from a file at a specific record. You must have a file open 
for input on the channel indicated by the AC field. The record pointer for the file (input block 
pointer for dectape files) is set to the value in the address field of the instruction and the status of 
any input buffers is set to unused. The IODEND bit in the device status word is cleared unless 
you have selected a record beyond the end of a disk file. 

Note that the record number in a USETI for the disk is taken as a signed 18-bit number in 
twos-complement notation; see the record offset feature on page 143. 



USETO [OP-875] 

USETO <channel number >,<record number> 



The USETO UUO prepares you for writing into a file at a specific record. You must have a file 
open for output on the channel indicated by the AC field. This UUO forces out the data in any 
output buffers that have not yet been written and then sets the record pointer for the file (output 
block pointer for dectape files) to the value in the address field of the instruction. The status of any 
output buffers is set to unused. 

Note that the record number in a USETO for the disk is taken as a signed 18-bit number in 
twos-complement notation; see the record offset feature on page 143. 



2.13 Random Access to Files 31 

UCETF [OP-873] 

UGETF <channel number >, ADR 

The UGETF UUO prepares you. to extend the file open on the given channel. It forces out the 
data in any output buffers that have not yet been written. Then, for the disk, the record pointer is 
set to the number of the record after the last record of the file and IODEND is turned on. For 
dectapes, the output block pointer is set to the number of the next free block you may write on. In 
either case, the number of the record (or block) so selected is returned in the word pointed to by the 
effective address of the UUO. The status of any input or output buffers is set to unused. 



2.14 I/O Status Testing and Setting 

There are various pieces of information one can find out about an I/O device or about a logical 
I/O channel, namely: the I/O device status bits (explained in detail in Section 2.6), the channel use 
bits (explained below), the device characteristics (explained below), the physical name of a device, 
and the number of people waiting to use a given device. This section describes the UUOs used to 
get and/or set these. 



GETSTS [OP-062] 

GETSTS <channel number >, ADR 



The GETSTS UUO puts the I/O device status word for the device open on the indicated channel 
into the word located at ADR. See Section 2.6. 



SETSTS COP-060] 

SETSTS <channe I number>,<status bits> 



The SETSTS UUO waits for the device open on this channel to become inactive and then sets the 
right half of the I/O device status word for this device from the address field of the UUO. See 
Section 2.6. 



32 General I/O 2.14 



STATZ COP-863] 



STATZ <channel number>, <status bits to be tested> 
<return if any of the indicated bits are on> 
<return if all indicated bits are off> 

The STATZ UUO tests certain bits in the right half of the status word for the device open on the 
indicated channel. The address field of the UUO should contain 1's in the bit positions to be 
tested. If all of the tested bits are off (zero), then this UUO skips. If any of them are on, the direct 
return is taken. 



STATO [OP-061] 



STATO <channel number>,<status bits to be tested> 
<return if all indicated bits are off> 
<return if any of the indicated bits are on> 

The STATO UUO tests bits in the right half of the status word just like STATZ does but skips if 
any of the tested bits are on and does not skip if all of them are off. 



CHNSTS IOP-716] 

CHNSTS <channel number >, ADR 



The CHNSTS UUO puts the use bits for the I/O channel indicated into the word located at ADR. 
Here is a list of the meanings of these bits. 

Bits Octal Name Meanings of 1's in channel usage word 

18 0..400000 INITB The channel has been initialized with an 

IN1T or an OPEN and a RELEAS has 
not been given yet. 

19 0..200000 IBUFB The INIT or OPEN which initialized 

this channel specified an input buffer 
header address. 

20 0,, 100000 OBUFB The INIT or OPEN which initialized 

this channel specified an output buffer 
header address. 

21 0,,40000 LOOKB A LOOKUP (successful or not) has been 

done on this channel. 

22 0..20000 ENTRB An ENTER (successful or not) has been 

done on this channel. 

23 0,, 10000 INPB An INPUT or IN UUO has been done 

on this channel. 



2.14 



I/O Status Testing and Setting 33 



24 


0..4000 


25 


0,,2000 


26 


0..1000 


27 


Q.,400 


28 


0,,200 


29 


0..100 



OUTPB An OUTPUT or OUT UUO has been 

done on this channel. 
ICLOSB The input side of this I/O channel has 

been closed. 
OCLOSB The output side of this I/O channel has 

been closed. 
INBFB An input buffer ring has been set up for 

this channel. 
OUTBFB An output buffer ring has been set up for 

this channel. 
SYSDEV The device open on this channel is SYS 

(i.e., disk area [1,3]). 



DEVCHR 



[OP-847, ADR-4] CALL I 4 



HOVE AC, [<device name in sixbit, or channel number>] 
DEVCHR AC, 



The DEVCHR UUO returns the device characteristics word for the device specified by the 
contents of AC. AC should contain either the name (logical or physical) of the device or the 
number of the channel on which it is open. The characteristics are returned in the AC. If the 
device does not exist, a zero is returned. Here are the meanings of the bits in the returned word. 



Bits Octal 




1 

2 
3 



4 
5 
6 
7 
8 



10 
II 
12 

13 
14 



400000,,0 
200000..0 
100000..0 
40000,,0 



20000..0 

10000..0 

4000..0 

2000..0 

1000..0 



400..0 

200..0 
100..0 
40..0 

20..0 
10..0 



Meanings of I's in device characteristics word 

Dectape with directory in core. 

Disk. 

User disk pack (UDP). 

Line printer (LPT) or XGP. The LPT and the 

XGP can be distinguished from each other by 

checking bit 8 (long dispatch table), which will be on 

for the XGP and off for the LPT. 

Terminal which is attached to a job. 

Terminal which is in use. 

TV camera. 

The IMP. 

Long dispatch table. This means that the device will 

accept UUOs other than INPUT and OUTPUT, 

such as MTAPE, USETO and LOOKUP. 

Paper tape punch or plotter (which are logically the 

same device). 

Paper tape reader. 

Dectape. 

The device is available to the job that gave the 

DEVCHR UUO. 

Magnetic tape. 

Terminal. 



34 General I/O 2.14 



15 4,,0 Directory device. At Stanford, this means the device 

is a dectape, the disk or a UDP. 

16 2,,0 Input device. 

17 1,,0 Output device. 

18 0..400000 ASSIGNed device. 

19 0..200000 Some job has done an INIT or OPEN on this device. 
20:35 0,, 177777 A one in bit 35-J means mode J is legal for this 

device. 



DEVUSE [OP=847, ADR=400051] CALLI 400851 



MOVE AC, [<device name in sixbit, or channel number>] 
DEVUSE AC, 

The DEVUSE UUO can be used to find out what job, if any, is using a device and how many 
jobs are waiting for that device. The AC should contain the name (logical or physical) of the 
device or the channel number on which it is open. If there is no such device, a zero is returned in 
AC. Otherwise, the following information is returned in AC: 

Bits Octal Value 

400000,,0 One if the device has been ASSIGNed by monitor 

command. 

1 200000..0 One if a program has done an INIT or OPEN on 

this device. 

2 100000..0 One if the device is a TTY attached to a job. 

12:17 77,,0 Number of the job the device is being used by, or 

zero if it is not in use. If the device has been 
detached from the system, then this field will contain 
zero but bit (ASSIGNed device, see above) will be 
on. 

8:35 0..777777 The number of jobs (not including you) in the queue 

. waiting for the device. 



2.14 I/O Status Testing and Setting 35 

PNAME [OP-047, ADR=480007] CALLI 400087 



MOVE AC,[<device name in sixbit, or channel number>] 

PNAME AC, 

<error return for no such device> 

The PNAME UUO returns the physical name of the device specified by the contents of the AC. 
AC should contain either the device name (logical or physical) or the number of the channel on 
which the device is currently open. If the device exists, the skip return is taken and the device's 
physical name is returned in AC. If there is no such device, the direct (error) return is taken and 
the AC is unchanged. 



DEVNUM [OP-047, ADR-4000184] CALLI 4000104 



MOVE AC, [<device name in sixbit, or channel number>] 

DEVNUM AC, 

<error return for no such device> 

The DEVNUM UUO is used to find out the unit number of a particular device. AC should 
contain either the logical or physical name of the device or the number of the channel on which 
the device is open. If there is a device with the name given or open on the channel given, then its 
unit number is returned in AC and the skip return is taken. If there is no such device, the direct 
(error) return is taken. 

The unit number of a device specifies which of several logically identical devices a specific device 
is. For instance, the unit number of TTY41 is 41, the unit number of MTA1 is 1, etc. 



3. TTY I/O 37 

SECTION 3 
TTY INPUT/OUTPUT 



The terminal is one of the most important I/O devices for the user. He controls his programs by 
typing in various commands, and the programs type back certain things to keep him informed. 
This section explains several UUOs that are provided to make terminal I/O control flexible but 
simple. The word TTY is used in this manual to mean a user terminal of any type, whether 
display, teletype or pseudo-teletype. 



3.1 TTY Echoing and LF Insertion 

The system provides two services to terminals doing input. The first is that characters typed in are 
normally sent back to the terminal in order for the user to see what he has typed. This is called 
echoing of input. The second action taken on input is that normally, when the system receives a 
carriage return from a TTY line, it inserts a linefeed after the carriage return. Thus the user does 
not have to type a linefeed (hereafter abbreviated LF) after each carriage return (hereafter 
abbreviated CR). The LF is put into the terminal's input buffer just as if the user had typed it; it 
is also usually echoed to the terminal. 

These actions can be modified by the user to suit his particular purposes. Echoing can be turned 
off in two different manners. The first of these is intended for terminals that always print each 
character typed. If the system were to echo characters to this kind of terminal, each character 
would appear twice. This method of turning echoing off causes all echoing to be suppressed except 
for echoing of LFs inserted after CRs. Bit 15 (4,,0 bit) in the line characteristics word (see the 
GETL1N UUO on page 40) indicates the state of this type of echo suppression. This bit can be 
set and cleared by the monitor commands TTY NO ECHO and TTY ECHO, respectively. 

The second type of echo suppression is designed to be used by programs that, for whatever reasons, 
do not want typed-in characters to appear on the terminal. This method turns off all echoing 
except when TTY input is going to the monitor rather than to the program. The state of this type 
of echo suppression is indicated by the NOECHO bit (bit 28--the 0,,200 bit) in the TTY I/O status 
word (see Section 2.6 and Section 2.14); when the NOECHO bit is on, echoing is suppressed. This 
bit can be turned on or off only by UUO, currently only by the CTLV UUO (see page 47), by the 
PTJOBX UUO (with the DOFF and DON functions-see page 56) and by the INIT and 
SETSTS UUOs. PTJOBX is the recommended UUO for this purpose. A RESET (see page 126) 
clears this bit, thus turning echoirig back on. (A program can also disable just the echoing of the 
CONTROL and META bits; see the NOECHB bit in Section 13.2.) 

Insertion of linefeeds after carriage returns is affected by three factors: 1) whether TTY input is 
going to the monitor or to a user program, 2) whether the terminal is a pseudo-teletype (see Section 
3.5), a display or a teletype, and 3) the value of bit 16 (2,,0 bit) in the TTY line characteristics 
word (see the GETLIN UUO on page 40). LFs are always inserted after CRs on III and Data 



38 TTY I/O 3.1 



Disc displays. For other TTYs in the normal case, LFs are inserted after CRs. They are not 
inserted if both 1) bit 16 in the line characteristics word is on and 2) either the terminal is a 
pseudo-teletype or input is going to a user program. Note that pseudo-teletypes (PTYs) are 
initialized with bit 16 on; thus LFs are normally not inserted after CRs on PTYs. Bit 16 in the 
characteristics word can be changed only by UUO, currently only by the SETLIN UUO (see page 
42) and the PTSETL UUO (see page 54). 



3.2 Codes Returned for Characters Typed 

When a character is read from a TTY, the 7-bit Stanford ascii code for that character is returned 
in bits 29:35 (0,,177 bits) (see the Stanford ascii character set in Appendix 7); in addition, 
characters read from displays are returned with the CONTROL and META keys represented as 
bits 28 (0,,200-CONTROL) and 27 (0,,400-META). Furthermore, when control-Z is typed on a 
teletype and read by any of the UUOs described below, the value returned is 612, which is the 
code for control-meta-linefeed from displays. Thus the end-of-file character always appears as the 
same code regardless of the type of terminal on which it was typed. Note that when characters are 
being read from a TTY by means of the INPUT or IN UUOs described in Section 2, only 7 bits 
are returned for each character (the CONTROL and META keys on displays are lost), and the 
EOF characters (control-Z and control-meta-linefeed) do not appear as characters at all-they merely 
set the EOF bit in the TTY I/O status word. 



3.3 TTYUUO 



The most important UUO is probably TTYUUO (known some places as TTCALL). This is an 
extended UUO with many different functions. With a couple of exceptions, which are noted, these 
functions all operate on the terminal attached to the job giving this UUO. 



TTYUUO [OP-8511 

TTYUUO <f unction number>,ADR 



TTYUUO uses the accumulator field of the instruction to determine the particular function to be 
executed. Each of these functions is described separately below. 



3.3 TTYUUO 39 

INCHRW IOP-851, AC=0] TTYUUO 0, 

_ _____ _ _____...._ _> . .__-_ _ .. _,_>_ _ _ _ _ ,___. _ _ 

INCHRU ADR 

The INCHRW UUO waits for a character to be typed and then returns the character 
right- justified in the word at ADR. 

OUTCHR 'tOP-851, AC-1] TTYUUO 1, 

OUTCHR ADR 
ADR: oscii character> 

The OUTCHR UUO types out the single ascii character represented by the right-most seven bits 
of the word at ADR. 

INCHRS [OP-051, AC-2] TTYUUO 2, 



INCHRS ADR 

<return if no character has been typed> 

<success return> 



The INCHRS UUO looks to see if a character has been typed. Then, if so, the character is 
returned in the word at ADR and the skip return is taken. If no character has been typed, the 
direct return is taken and the word at ADR is not changed. 



OUTSTR tOP-851, AC-3] TTYUUO 3, 

_________ _____ .- .- _ . . 

OUTSTR ADR 
ADR: <asciz string> 



The OUTSTR UUO types out the ASCIZ string that starts at location ADR. (An ASCIZ string is 
terminated by the first null (zero) byte.) 



40 TTY I/O 3.3 

INCHWL [OP-051, AC=4] TTYUUO 4, 

INCHUL ADR 

The INCHWL UUO waits until an entire line (ended by carriage return, linefeed, altmode or a 
control character) has been typed and then returns a single character right-justified in ADR. This 
is called line mode and should be used instead of character mode (as in INCHRW) whenever 
possible. In character mode you cannot always backspace over mistyped characters because your 
program may already have eaten them up; in line mode you can backup as far as the last 
activation character. 



1NCHSL IOP-851, AC=5J TTYUUO 5, 



INCHSL ADR 

<return if no entire line has been typed yet> 

<success return> 

The INCHSL UUO looks to see if an entire line has been typed, and if so, returns one character 
right- justified in ADR and takes the skip return. If an entire line has not yet been typed, the direct 
return is taken and ADR is not changed. 



GETLIN tOP-851, AC=6] TTYUUO 6, 

GETLIN ADR 



The GETLIN UUO can be used to find out what terminal a job is attached to, if any, and what 
the characteristics are for any terminal. If the original contents of ADR are less than zero, then the 
characteristics for your own terminal are returned in ADR. If ADR originally contains the number 
of a TTY line (a number between zero and the maximum legal TTY line number), the 
characteristics of that terminal are returned in ADR. If ADR originally contains a number greater 
than the maximum legal TTY line number, then zero is returned in ADR. 

If a job requests the line characteristics for its own terminal, and if that job is detached, that is, not 
attached to any terminal, then a -1 (all bits on) will be returned as the line characteristics. You 
should check for this condition before testing any of the particular bits or you will be deceived by a 
detached job. 

If the characteristics word is not -1, then the right half contains the line number of the terminal 
and the left half contains the characteristics of the terminal, as explained below. 

Note: If the terminal is a pseudo-teletype (see Section 3.5) controlled directly or indirectly 
(through a chain of pseudo-teletypes) by a Data Disc or III display, then the Data Disc bit (bit 
4-the 20000..0 bit) or the III bit (bit 0--the 400000..0 bit) will be on in the characteristics for the 
pseudo-teletype. 



3.3 



TTVUUO 41 



Bits 

1 
2 



4 

5 
6 
7 
8 



11 



12 



13 



Octal 
400000,,0 
200000,,0 
100000..0 



20000..0 

10000..0 

4000,,0 

2000..0 

1000..0 



400..0 



100..0 



40..0 



20..0 



Meanings of I's in TTY line characteristics word 

The terminal is a III display. 

The terminal is the PDF- 10 console teletype (CTY). 

Carriage returns are made into multiple carriage 
returns in order to allow the teletype carriage to reach 
the left margin before the next character reaches the 
teletype. This bit can be set and cleared with the 
monitor commands TTY FILL and TTY NO FILL, 
respectively, and with the SETLIN and PTSETL 
UUOs (see below and page 54). Data Disc and III 
displays are not affected by this bit. 

The terminal is a Data Disc display. 

The terminal is a model 37 teletype. 

The terminal is a pseudo-teletype (see Section 3.5). 

The terminal is an IMLAC. 

The terminal is a pseudo-teletype and is controlled by 
a job connected to the IMP. This means the PTY's 
job is being run through the ARPA network. This 
bit can be set and cleared with the SETLIN and 
PTSETL UUOs. 

v 

Pseudo-teletype input wait will be terminated by TTY 
input also (see the PTRD1W UUO on page 52). 
This is the PTYWAKE bit; it can be set and cleared 
with the SETLIN and PTSETL UUOs. 

The terminal is in special activation mode. This 
means that line mode input will be activated by the 
characters whose bits are I's in the special activation 
table. This bit can be set and cleared with the 
SETLIN and PTSETL UUOs. A RESET (see page 
126) clears this bit, as well as resetting your special 
activation table to the standard special activation 
table. See the SET ACT UUO on page 44. 

The last character typed was a rubout, and a 
backslash will be typed out when a character that is 
not a rubout is typed. 

The terminal is in full-character-set mode. When this 
bit is off, lower case letters are automatically changed 



42 TTY I/O 3.3 



to upper case. This bit can be set and cleared with 
the monitor commands TTY FULL and 
TTY NO FULL, respectively, and with the SETLIN 
and PTSETL UUOs. On displays this bit can be set 
by [ESC] F and cleared by [BRK] F. 

14 10..0 The terminal is assumed not to have a hardware 

tabbing mechanism. When this bit is on, tabs get 
converted into the appropriate number of spaces. 
This bit can be cleared and set by the monitor 
commands TTY TAB and TTY NO TAB, 
respectively, and with the SETLIN and PTSETL 
UUOs. Data Disc and III displays are not affected by 
this bit. 

15 4,,0 Echoing of input characters is inhibited except for 

linefeeds inserted by the system after carriage returns. 
This inhibition is provided primarily to avoid double 
echoing on terminals that always print each character 
typed. See Section 3.1. This bit can be set and 
cleared by the monitor commands TTY ECHO and 
TTY NO ECHO, respectively, and with the SETLIN 
and PTSETL UUOs. Data Disc and III displays are 
not affected by this bit. 

16 2,,0 Linefeeds will not be inserted after carriage returns, 

except in monitor mode. This bit always determines 
whether linefeeds are to be inserted after carriage 
returns on a pseudo-teletype (PTY), regardless of 
whether the PTY is in monitor mode. See Section 
3.1. On Data Disc and III displays, this bit does not 
inhibit insertion of LFs; it merely inhibits echoing of 
inserted LFs. This bit can be set and cleared with 
the SETLIN and PTSETL UUOs. A RESET (see 
page 126) clears this bit except on PTYs. 



SETLIN [OP-8S1, AC-71 TTYUUO 7, 

SETLIN ADR 
ADR: < I i ne characteristics bits which you want on> 

The SETLIN UUO allows you to change certain bits in the line characteristics for your terminal. 
You are allowed to change only bits 2, 8, 9, 11, 13, 14, 15 and 16 (101536,,0 bits). These bits in 
your line characteristics word are set to their values in the word at ADR. All other bits in the 
word at ADR are ignored. 



3.3 TTVUUO 43 

RESCAN [OP-851. AC-10] TTYUUO 10. 

RESCAN ADR ; ADR is ignored if it is zero 

ADR: <uorcl for returned character count> 

The RESCAN DUG attempts to back up your TTY input buffer pointer to the beginning of the 
previous monitor command typed in. By using this UUO, a program started up by a monitor 
command can re-read the command line that started it. In fact, this UUO can be given over and 
over to read the command line several times. If this UUO is given with a non-zero effective 
address, then the number of characters over which the pointer is backed up is returned in the word 
(jointed to by the effective address. 

Warning: If more than a buffer full of characters have been typed since the beginning of the last 
monitor command, then the characters you get after giving this UUO will not be from the 
command. The pointer into the buffer will simply have been set to the value it had at the 
beginning of the command; the command itself may have been overwritten by other text typed in 
more recently, in which case you will be reading garbage after giving this UUO. 



CLRBFI IOP-051, AC-111 TTYUUO 11, 

CLRBFI 



The CLRBFI UUO clears your TTY input buffer. This is used mainly to throw away any 
characters the user has typed ahead when a fatal error occurs. 



CLRBFO [OP-851, AC-12] TTYUUO 12, 

CLRBFO 



The CLRBFO UUO clears your TTY output buffer. 



INSKIP [OP-851, AC-13] TTYUUO 13, 

1NSKIP <flag> 

<return if no characters have been typed> 

<success return> 

The INSKIP UUO tells you if the user has typed anything which you have not yet read. If the 
low order bit of the address field <flag> is on, then this UUO checks for a whole line having been 
typed; otherwise it checks for anything having been typed. If something has been typed, then this 
UUO skips; if not, the direct return is taken. 



44 TTY I/O 3.3 

IN WAIT [OP-051, AC-141 TTYUUO 14, 

INUAIT ADR 

The INWAIT UUO just waits until a full line has been typed in. Then if the address ADR is 
non-zero, the number of characters in the last line re-edited (III and Data Disc terminals only) with 
a conttol-CR or with a PTLOAD UUO (see page 55) is returned in the word at ADR. In other 
words, if you give a PTLOAD UUO and then do an INWAIT ADR, you will get in location ADR 
the number of characters in the re-edited line. If you are not at a III or Data Disc display, or if 
you did not re-ecut a line somehow, the number placed in ADR will be meaningless. 



SETACT [OP-851, AC-IB] TTYUUO 15, 

SETACT [OLD,, NEW] 

OLD: <4 word block to receive the current activation table> 

NEU: <4 word block to provide a new activation table> 

The SETACT UUO is used to retrieve and/or change the activation t.aWe used in special 
activation mode. An activation table consists of 4 words, with one bit for each character and a 
couple of extra bits thrown in for some special effects. The first three words plus the high-order 20 
bits of the fourth word (total of 128 bits) specify which characters are activation characters (bit of 
first word represents ascii 0, bit 1 represents ascii 1, etc.). The activation characters are defined to 
be those characters whose bits are 1 in the activation table. The meanings of the low order bits of 
the fourth word are given below: 

Bits Octal Meaning of 1's at end of fourth word 

35 0,,1 Suppress activation on characters with control bits 

except for those characters that would activate 
without any control bits. See also bit 33 below. 

34 0,,2 Disable control-carriage-return from giving back the 

last line typed. 

33 0,,4 Always activate on characters that have both 

CONTROL and META on, regardless of setting of 
bit 35 above. 

This UUO takes the current activation table and places it in the four words at OLD, then sets up 
the new activation table from the four words at NEW. If either address OLD or NEW is zero, the 
corresponding function of this UUO is omitted. Thus if OLD is zero, the old activation table is 
not returned, and if NEW is zero, the (old) activation table is not changed. 

Your special activation table is initialized by the system so that all characters except letters and 



3.3 



TTYUUO 45 



digits cause activation (when you are in special activation mode). The precise value of the initial 
special activation table is shown below. 



777777,, 777777 
777788,, 037680 
880888,, 374880 
080887,, 608880 



sActivate on octal 
{Activate on octal 
{Activate on octal 
{Activate on octal 



0:43 

44:57 or 
133:140 
173:177 



72:188 



TTHEAI) [OP-851, AC-161 TTYUUO 16, 

T TREAD ADR 
ADR: < I 'me number > 



The TTREAD UUO allows you to read the microswitch keyboard bits of any display's keyboard. 
The effective address in this instruction specifies a location which should contain the TTY line 
number of the keyboard you wish to read. If the line number specified is illegal, then your line 
number is used. Then if the line is not on the keyboard scanner (that is, if the line is not a III or 
Data Disc display line), then this UUO is a no-op. 

The keyboard bits ate returned in the right half of ADR. The line number minus 20 is returned 
in the left half of ADR. 



OUTFIV [OP=051, AC-17] TTYUUO 17, 

OUTFIV ADR 
ADR: <f i ve-character ASCII string> 



The OUTFIV UUO is designed for sending special commands to IMLACs. The effective address 
should point to a word containing a five-character ASCII string. Characters from the string are 
sent to the terminal until either a null byte is encountered or the fifth character in the string has 
been sent. If the low order bit (bit 35--the 0,,1 bit) of the ASCII word is on, a 177 character will be 
appended to the front of the string sent to the terminal. 

The special feature of this UUO is that it insures that the characters (including the 177) will be 
sent to the terminal without any intervening characters. This prevents commands sent to IMLACs 
from getting mixed up with normal typeout. 



46 TTY I/O 3.4 

3.4 Miscellaneous TTY UUOs 



TTYMES [OP-047, ADR-400047] CALL I 400047 

MOVE I AC, ADR 
TTYMES AC, 
<error return> 

ADR: <number or physical name of destination tty> 

ppcccc, ,MESS j where ppcccc is a 6-digit octal number 

HESS: ASCII /...message.../ 

The TTYMES UUO can be used to type out an ASCII string on any terminal. Unlike the 
OUTSTR UUO, TTYMES allows the message to start in any byte of a word. The end of the 
message is indicated by a null (zero) byte or by exhaustion of an explicit character count. 

Upon call, AC should contain the address of a two word block. The first word of this block should 
contain either the name (physical or logical) of the destination terminal, e.g., SIXBIT /TTY21/, or 
the number of the destination terminal, e.g., 21. The second word of the block should contain in its 
right half the address of the ASCII message. The first six bits of the left half (pp in the sample 
call above) indicate the position (within the first word) of the first character of the message in 
normal byte pointer format; that is, pp is the number of bits to the right of the first byte of the 
message. If the position field contains zero, then 44 is assumed; that means the first byte of the 
word at MESS is the first character in the message. The remaining twelve bits of the left half (cccc 
above) may contain either the number of characters in the message or zero. If the count field 
contains zero, then the count is effectively set to infinity. Characters are sent to the destination until 
either the character count runs out or a null (zero) byte is encountered in the message. Thus, if you 
don't wish to calculate the length of your message, you can use a zero count and a null byte at the 
end of the message (i.e., use an ASCIZ string). 

If you try to send a message to a nonexistent terminal, you get the error return. You also get the 
error return if the message can't be sent right now (for instance, if the TTY's output is being held) 
unless the terminal is your own, in which case this UUO waits until it can send the message. 



3.4 Miscellaneous TTY UUOs 47 

SNEAKW [OP=047, ADR=400063] CALLI 488063 

SNEAKU AC, 

SNEAKS [OP-047, ADR-400064] CALLI 488864 



SNEAKS AC, 

<return if no char is waiting for you> 

ouccess return> 

The SNEAKW and SNEAKS UUOs look to see if any characters have been typed that have not 
yet been read. If there is such a character, it is returned in the AC. SNEAKW always returns a 
character, after waiting until there is one if necessary. SNEAKS never waits; if there is a character 
present, it is returned and the skip return is taken. Otherwise, SNEAKS does not change the AC 
and takes the direct return. 

Note that SNEAKW does not wait for a whole line to be typed, only one character. Also, neither 
of these UUOs actually reads in a character. 



ACTCHR [OP-047, ADR-400105] CALLI 480105 

ACTCHR AC, 

The ACTCHR UUO (III and Data Disc displays only) waits for a line to be typed and then 
returns in AC the character (including control bits) that activated the last line re-edited with a 
cotitrol-CR or with a PTLOAD UUO (see page 55). 

If you are not on a III or Data Disc display, this UUO returns without waiting for a line to be 
typed. 



CTLV [OP=047. ADR-400001] CALLI 400081 

CTLV 

The CTLV UUO inverts the state of echoing of TTY input by the system. Normally every 
character you type is sent back to your terminal by the system so that you can see what you have 
typed. If you give this UUO when echoing is turned on (normal state), echoing will cease; and if 
you give this UUO when echoing is turned off, echoing will resume. The system always echoes 
characters typed in when the terminal is in monitor mode. See Section 3.1. 



48 TTY I/O 3.4 



TTYIOS [OP-047, ADR-4-00014] CALLI 400014 



MOVE AC, [<job number or sixbit device natne>] 
TTYIOS AC, 

The TTYIOS UUO returns the I/O status word of the device indicated by the contents of the AC. 
If AC contains a logical or physical device name, that device's status word is returned. If AC 
contains a job number, then the status word of the terminal belonging to that job is returned; if 
that job has more than one TTY, then there is no telling which one's status word will be returned. 
The I/O status -word is returned in the AC; if there is no such device, -1 is returned. The 
meanings of some bits in the right half of the device status word are explained in Section 2.6. 
Other bits for specific devices are explained in the device writeups in Section 13. 



CETLN [OP-047, ADR-34] CALLI 34 

GETLN AC, 



The GETLN UUO is used to find out the physical name of the terminal attached to your job. 
The name (in sixbit) is returned in AC. If the job is detached, zero is returned. 



3.5 Pseudo-Teletypes 

The pseudo-teletype (PTY) is a special system concept designed to allow users to have control of 
more than one job at a time. A PTY is like a physical terminal in almost all respects. However, a 
PTY is controlled by the job which created it, and no other job can access it. To type characters on 
a PTY, the controlling job does character output to the PTY; and to see the characters typed out on 
a PTY, a job does character input from the PTY. If you send a new PTY the character "L" 
followed by a carriage return and linefeed, a job will begin logging in on the PTY. You can run 
programs and communicate with the monitor through a PTY just as you can through a physical 
terminal, but PTYs are controlled by program rather than by keyboard. Thus, a single job 
(attached to a terminal or even detached) can control one or more PTYs and hence one or more 
other jobs, which themselves can control other PTYs. 

Just as each physical terminal has a unique line number, so does each PTY. Currently the line 
numbers assigned to PTYs begin with 121 and go upward. The PTYs have physical device 
names, just like other terminals; for example, the physical name the PTY on line 121 is SIXBIT 
/TTY121/. There is a maximum number of PTYs that the system can support at any one time 
and this maximum is currently 24. 

PTYs have line characteristics just as other terminals do (see the GETLIN UUO on page 40). 
When a PTY is initialized (with the PTYGET UUO), it is set up with the following bits on in the 
characteristics word: 6--PTY, 10-(this bit is used by the system) and 16-linefeeds are not inserted 
after carriage returns. You can of course change certain bits in the characteristics word to suit your 



3.5 Pseudo-Teletypes 49 

purposes. This can be done for a PTY with the PTSETL UUO (see page 54) just as SETLIN 
(see page 42) does it for other terminals. 

When you output characters to a PTY, those characters will be echoed by the monitor as usual and 
will thus appear in subsequent inputs that you do from the PTY. You can turn off the automatic 
echoing by the usual means for doing so with terminals; namely, you can turn on bit 15 in the 
PTY's line characteristics, (this inhibits echoing so that only linefeeds inserted after carriage returns 
get echoed), or you can have the job that is running on the PTY do a CTLV UUO (see page 47), 
which eliminates all echoing except while the PTY is in monitor mode. You can get the same effect 
as doing a CTLV (to turn echoing off) but more easily by using the PTJOBX UUO with the 
control function DOFF. This will always turn echoing off, whereas CTLV inverts the state of 
echoing, turning it off when it is on and on when it is off. The control function DON for 
PTJOBX can be used to turn echoing back on. The PTJOBX UUO is explained on page 56. 



PTYUUO 



The UUO that is used to communicate with PTYs is PTYUUO, which has many different 
functions that it can perform, including reading from and writing on a PTY. 



PTYUUO [OP-7111 

PTYUUO < function number>,ADR 



ADR: <PTY's line number> 

<other data depending on the function> 

PTYUUO is an extended UUO that uses the AC field to determine which of many possible 
pseudo-teletype functions is to be executed. Each of these functions (which are described in detail 
below) expects a two word block to be pointed to by the address field of the instruction. The right 
half of the first word of this block should contain the line number of the pseudo-teletype for which 
the UUO is intended (except with PTYGET which returns this line number). The second word is 
a data word that is used or returned by the UUO. 



Doing PTYUUOs to Physical TTYs 

It is sometimes useful for a program to be able to type things into its own TTY input buffer just as 
if the user had typed them. This can be done with PTYUUO by specifying a PTY line number 
of zero in the word at ADR. When this word is zero, the PTY function is executed with your 
terminal instead of with a pseudo-teletype. Thus, if you do output to a PTY with a line number of 
zero, the characters will go to your terminal's input buffer (into your line editor if you are on a III 
or Data Disc display) just as if you had typed them. 



50 TTV I/O 3.5 



If bit 18 (the 0..400000 bit) of the word at ADR is on for a PTYUUO, the number in the 
remaining bits of the right half is interpreted as the line number of a terminal and the PTY 
function is carried out for that terminal. However, if you do not own the terminal, you must have 
a privilege to do anything with it. 

Any attempt to do input (PTRD1S, PTRD1W or PTRDS UUOs) from a physical terminal's 
output buffer with either of the above two methods will not work; the PTYUUO will simply be a 
no-op. 



Now here are the individual PTYUUO functions. 



PTYCET [QP-711, AC-81 PTYUUO 8, 



PTYGET ADR 

<return if no PTYs available> 

<success return> 

ADR: <PTY's line number and characteristics are returned here> 

The PTYGET UUO gets you a pseudo-teletype and places its line characteristics word (see the 
GETL1N UUO on page 40) in the location pointed to by the effective address of the instruction 
(i.e., ADR). This means that the PTY's line number will appear in the right half of ADR and its 
characteristics will appear in the left half. 

If a PTY is available, this UUO skips and the PTY is assigned to you. If there are none 
available, the direct return is taken and you get no PTY. 



PTYREL [OP-711, AC-1] PTYUUO 1, 

PTYREL ADR 
ADR: <line number of PTY to be released> 



The PTYREL UUO releases the pseudo-teletype whose line number is in the right half of ADR. 
The job running on that PTY is killed, and any PTYs it may have acquired are released. 

The RESET UUO (see page 126) releases all pseudo-teletypes you own. 



3.5 Pseudo-Teletypes 51 

PTIFRE tOP-711, AC=2] PTYUUO 2, 

PT1FRE ADR 

ADR: <PTY's line number> 

<count of free bytes is returned here> 

The PTIFRE UUO returns to you in ADR+1 the number of free bytes left in the input buffer of 
the PTY whose line number is in ADR. This is the number of characters you may send to that 
PTY before its input buffer is full. If you use a PTY output UUO that waits, and if you send 
more that this many characters, you will have to wait until the program running on the PTY reads 
some characters and makes room for your output. 



PTOCNT tOP-711, AC=3] PTYUUO 3, 

PTOCNT ADR 



ADR: <PTY's line number> 

<count of characters in PTY's output buffer is returned here> 

The PTOCNT UUO returns in ADR + 1 the number of characters in the output buffer of the PTY 
whose line number is in ADR. 



PTRD1S IOP-711, AC=4] PTYUUO 4, 



PTRD1S ADR 

<return if no character is present> 

<success return> 

ADR: <PTY's I ine number> 

<one 7-bit character is returned here> 

The PTRD1S UUO looks to see if there are any characters in the output buffer of the PTY whose 
line number is in ADR. If there are, one 7-bit character is read from there and returned in ADR + 1 
and the skip return is taken. If there are no characters in the PTY's output buffer, then a zero is 
returned in ADR + 1 and the direct return is taken. 



52 TTV I/O 3.5 

PTRD1W [OP-711, AC-5] PTYUUO 5, 

PTRD1U ADR 

ADR: <PTY's line number> 

<one 7-bit character is returned here> 

The PTRD1W UUO reads one 7-bit character from the output buffer of the PTY whose line 
number is in ADR and returns the character in ADR + 1. If there are no characters in the PTY's 
output buffer, thr UUO waits for the PTY to do some output and then returns the first character. 

If the PTYWAKE bit (bit 9--the 400..0 bit) is on in the line characteristics word for your terminal 
(see the GETLIN UUO on page 40), then this instruction will return when a character is typed 
either on the PTY or on your terminal. If the first character typed is from the terminal, a zero will 
be returned in ADR+1 and no characters will have been read from either the terminal or the PTY. 
In this manner, you may wait for either PTY or TTY input. 



PTWR1S [OP-711, AC-6] PTYUUO 6, 



PTUR1S ADR 

<return if character not sent> 

<success return> 

ADR: <PTY's line number> 

<9-bit character to be sent> 

The PTWR1S UUO sends the 9-bit character right-justified in ADR+1 to the PTY whose line 
number is in ADR. If the character can be sent, the skip return is taken. If the PTY's input 
buffer is already full, the character is not sent and the direct return is taken. The CONTROL and 
MET A keys which display lines have are represented by bit 28 (0,,200-CONTROL) and bit 27 
(0,,400~META)in ADR + 1. 

The [ESCAPE], [BREAK] and [CLEAR] characters (as available on Data Disc and III display 
keyboards) can be sent with this UUO (or with the PTWR1W UUO below) by having ADR+1 
contain 0..10042 for [ESCAPE] or 0,, 1004 1 for [BREAK] or O..I0044 for [CLEAR]. Also, if bit 23 
(0..10000 bit) is on in ADR+1, then the character represented by the low order 7 bits (if not 41, 42 
or 44) will be sent to the PTY preceded by the [ESCAPE] character; and if both bits 23 and 24 
(0,,14000 bits) are on, then the character in the low order 7 bits will be sent preceded by the 
[BREAK] character. In either of these two cases, if the character in the low order 7 bits is not an 
[ESCAPE] or [BREAK] keyboard command and is not either 41, 42 or 44, then this UUO 
becomes a no-op, taking the skip return. Also, if the PTY specified is not a display, then only the 
low order 7 bits (bits 29:35--the 0,,177 bits) of ADR+1 are used; no [ESCAPE] or [BREAK] 
commands can be sent for teletypes. (Imlacs can send 8 bits; the 0,,200 bit on an Imlac means that 
this character should not be checked against the special activation table even if the Imlac is in 
special activation mode.) 



3.5 Pseudo-Teletypes 53 

PTWR1W [OP-711, AC-7] PTYUUO 7, 

PTUR1U ADR 

ADR: <PTY's line numtaer> 

<9-bit character to be sent> 

The PTWR1W UUO sends the 9-bit character right- justified in ADR + 1 to the PTY whose line 
number is in ADR. If the PTY's input buffer is already full, this UUO waits until there is room 
and then sends the character. 

This UUO interprets the character in ADR+t exactly as the PTWR1S UUO does. See the 
PTWR1S UUO above for the details of sending the [ESCAPE], [BREAK] and [CLEAR] 
characters to a display's input buffer. 



PTRDS [OP-711, AC-18] PTYUUO 18, 

PTRDS ADR 



ADR: <PTY's line number> 

oddress or byte pointer for returned string> 

The PTRDS UUO reads all the characters that are in the output buffer of the PTY whose line 
number is in ADR and returns these characters as an ASCIZ string at the location indicated by 
ADR + 1. If bits 6:17 (7777,,0 bits) in ADR+1 are not all zero, the word at ADR+1 is taken as a byte 
pointer to be used to return the ASCIZ string, with the byte pointer incremented before the first 
character is deposited. (Before the byte pointer is used, the size field is set up for 7-bit bytes and 
the index and indirect fields are cleared.) If bits 6:17 of ADR+1 are zero, the ASCIZ string is 
returned such that the first byte is in the high-order 7 bits of the location pointed to by the right 
half of ADR + 1. 



PTWRS7 [OP-711, AC-11] PTYUUO 11, 

PTURS7 ADR 



ADR: <PTY's line nutnber> 

oddress or byte pointer for string to be sentx 

The PTWRS7 UUO takes the ASCIZ string specified by ADR+1 and sends it to the PTY whose 
line number is in ADR. This UUO waits as necessary until the whole string has been sent. If bits 
6:17 (7777..0 bits) of ADR+1 are not all zero, then ADR+1 is taken as a byte pointer to be used to 
access the string, with the byte pointer incremented before the first character is loaded. (Before the 
byte pointer is used, the size field is set up for 7-bit bytes and the index and indirect fields are 
cleared.) If bits 6:17 are zero, the string is assumed to start in the high-order 7 bits of the word 
pointed to by ADR + 1. 



54 TTY I/O 3.5 

PTWRS9 IOP-711, AC-12] PTYUUO 12, 

PTURS9 ADR 

ADR: <PTY's line number> 

oddress or byte pointer for string to be sent> 

The PTWRS9 UUO does the same as PTWRS7 except that the string sent is not a standard 7-bit 
ASCIZ string, but a string of 9-bit characters terminated by a zero (null) character. The two high 
order bits (400 and 200 bits) in each 9-bit character represent the CONTROL and META keys, 
respectively, which Data Disc and III display keyboards have. As with PTWRS7, ADR + 1 can 
contain either a simple pointer to the string or a byte pointer to it. 

This UUO is important because octal code 00? ($ or control-C) does not mean control-C if you are 
sending this string to yourself (line number in ADR set to zero) and you are at a III or Data Disc 
display. The code representing control-C in that case is 600, which takes 9 bits to represent. The 
code 600 works as control-C for all PTYs, so it can always be sent instead of 003 to stop a job. 
Note that you must send two 600s (two control-C's) to stop a job immediately. Another method for 
stopping a PTY is to use the PTJOBX UUO with the HALT control function; see page 56. 



PTCETL IOP-711, AC-13] PTYUUO 13, 

PTGETL ADR 



ADR: <PTY's line number> 

<PTY's line characteristics word ie returned here> 

The PTGETL UUO returns in ADR+1 the line characteristics for the PTY whose line number is 
in ADR. The meaning of the line characteristics word is explained under the GETLIN UUO on 
page 40. 

Note: If a pseudo-teletype is controlled directly or indirectly (through a chain of pseudo-teletypes) 
by a Data Disc or III display, then the Data Disc bit (bit 4--the 20..0 bit) or the HI bit (bit 0-the 
400000..0 bit) will be on in the characteristics word for the pseudo-teletype. 



PTSETL IOP-711, AC-14J PTYUUO 14, 

PTSETL ADR 



ADR: <PTY'e line number> 

<new line characteristics desired> 

The PTSETL UUO sets the line characteristics for the PTY whose line number is in ADR from 
the word at ADR + 1. In the line characteristics word, only bits 2, 8, 9, 11, 13, 14, 15 and 16 



3.5 Pseudo-Teletypes 55 

(101536,,0 bits) can be changed by the user. Other bits in the word at ADR + 1 are ignored. See the 
GETLIN UUO on page 40. 



PTLOAD tOP-711, AC-15] PTYUUO 15, 

PTLOAD ADR 



ADR: <PTY's line number must be a display> 
oddrees or byte pointer for string> 

The PTLOAD UUO loads a display's line editor with the ASCII string specified by the word at 
ADR + I. If the left half of ADR+1 is non-zero, then ADR+1 is assumed to be a byte pointer to the 
string; characters are picked up from the string with ILDBs, so the byte pointer should point to the 
byte just before the string. The end of the string is defined by the first occurrence of a null or an 
activation character. The activation character, if any, is left on the end of the string in the line 
editor; typing carriage return will simply activate the line up to and including any activation 
character. Note that if the string was terminated with a null, then typing carriage return will 
activate the string but will not add a carriage return to it. If you activate the re-edited line with 
anything besides carriage return, the activation character will be inserted in the line wherever you 
typed it. 

This UUO only works if the line number at ADR specifies a III or Data Disc display; otherwise 
this is a no-op. The normal use of this UUO is with a zero at ADR, which selects your own line 
editor to be loaded with the given string (provided you are at a display). After giving this UUO, 
you may read input from the terminal to get the line back with any changes that may have been 
made. See particularly the INWAIT UUO on page 44 and the ACTCHR UUO on page 47 for 
special features regarding re-edited lines. 



56 TTY I/O 



3.5 



PTJOBX 



[OP-711, AC-16] PTYUUO 16, 



PTJOBX ADR 

<error return for HALT and CONT no job logged in> 
<error return for CONT job cannot be continud> 
<success return for CONT> 

ADR: <pseudo-teletype line number> 

< index, or sixbit name, of control function> 



Control functions: 

Index Name Function 



1 


HALT 


Stop the pty' s job. 


2 


CONT 


Continue the pty's job. 


3 


DOFF 


Turn off echoing of input to pty. 


4 


DON 


Turn on echoing of input to pty. 


5 


LOGIN 


Log in a job on pty. 


6 


IUA1TS 


Skip if pty waiting for input. 



Success Return 

skips 

double skips 
no skip 
no skip 

skips 

skips 



PTJOBX is the extended PTY job control UUO. Any one of several control functions can be 
exercised over a PTY without sending it any character strings. The control is exercised over the 
job running on the PTY whose line number is in ADR; a zero line number means the control is 
exercised over your own job. This is a good method for turning on and off the echoing of input to 
your job. 

The word at ADR+1 should contain either the index or the sixbit name of the control function 
desired. The currently available control functions are listed above with their names and indices. 

The HALT function takes the skip return on success and the direct (error) return if there is no job 
logged in on the PTY. If you HALT your own job (PTY line 0) this way, your terminal is left in 
user mode and you cannot type commands to the monitor; you must type control-C to get out of this 
condition. 

The CONT function takes the double skip return on success, the direct return if there is no job 
logged in on the PTY, and the single skip return if the job cannot be continued. 

The DOFF and DON functions always take the direct return; DOFF sets bit 28 (0..200 bit) in the 
TTY I/O status word (thus turning off echoing) and DON clears this bit (turning echoing back on). 
See Section 3.1 for the meaning of this bit. 

The LOGIN function logs the PTY in under the PPN of the controlling job and copies the 
controlling job's Disk PPN and privileges; the job number of the new job is returned at ADR+1 
and the skip return is taken if the job gets successfully logged in. If there is already a job logged 
in on the PTY, that job's number is returned in ADR+1 and the direct return is taken. (This is a 
good way to find out the number of the job logged in on a PTY.) If there is no job logged in on 
the PTY but there are no job slots available, zero is returned in ADR+1 and the direct return is 
taken. 



3.5 Pseudo-Teletypes 57 

The IWAITS function lets you find out if the PTY is waiting for input. That is, if the PTY has 
returned to monitor level and needs a monitor command typed to it, or if the job running on the 
PTY is waiting for TTY input, then this function skips. Otherwise, the direct return is taken. 



4. Display Output 59 

SECTION 4 
DISPLAY OUTPUT 



The availability of displays for output provides great flexibility and convenience in many 
programs. This section explains several UUOs that allow the user to determine what will appear 
on a display. These UUOs include: the PPIOTs to select and position various pieces of paper on 
your screen; the PClOTs and UPGIOT to run display programs on Data Discs and Ills and to 
select from various pieces of glass on Ills; DDCHAN to acquire and manipulate extra Data Disc 
channels; VDSMAP to select the sources for the picture on a Data Disc display; ADSMAP to select 
the sound source to be connected to the speaker associated with a given display; and a few other 
related UUOs. 

This section does not discuss how to program the III or Data Disc display processors. These 
processors are explained in Appendix 1 and Appendix 2, respectively. However, since the two 
display processors are somewhat different in their operation, I shall attempt to explain for each how 
it works and how it interacts with the system so that you can understand what the various UUOs 
are intended to do. Some references are made to specific III or DD instructions; these are all 
explained in the above-mentioned appendices. 



4.1 III Displays 

The III display processor runs continuously, executing display instructions from main memory. 
The code it executes is located in system free storage. Any change to a single word of this code will 
cause the resultant display to change. A user-written III display program can be run by using the 
UPGIOT UUO. (The III instructions are explained in Appendix 1.) UPGIOT takes as 
arguments the location and length of the display program to be run. The system copies the display 
program out of the user's core image into free storage, making transformations such as address 
relocation. 

The system uses the first word in your program to interface with other display programs; you must 
include an extra word at the beginning of each III display program you write. To exit from the 
middle of your display program, insert a HLT instruction. Otherwise, you should simply plan to 
fall through to the end of your program. You need not have a HLT at the end. 

Every job running on a III is permitted to have up to 20 independent display programs. A III 
display program is called a piece of glass, and each piece of glass (hereafter abbreviated POG) has 
a number between and 17 inclusive. RAID uses POG 17; please note the obvious conflict if your 
program uses this POG too. 

You may choose which of your pieces of glass are to be visible and which are to be invisible. The 
display code for an invisible POG continues to reside in system free storage but is simply not 
executed; you may reactivate it at any time. 



60 Display Output 4.1 

The only III instruction that is illegal in a user display program is the JMS Instruction. To get the 
effect of a JMS, use the JSR and/or SAVE instructions (see Appendix 1). 

You are not allowed to display anything on someone else's III unless you are privileged. You may 
display on a III that is not in use. 



4.2 Data Disc Displays 

The Data Disc (DD) display processor works by storing complete TV pictures bit by bit on a disk. 
The disk we have has -64 tracks; two tracks are needed to hold a complete picture. Thus -32 
complete TV images can be stored on the Data Disc. Each combination of two tracks that makes 
up a whole picture is called a Data Disc channel. The Data Disc hardware reads the disk and puts 
out a TV signal for each channel. Each TV signal can then be routed by the video switch 
(controlled by software) to any combination of TV monitors (Data Disc displays). 

When the DD processor executes a program, the resultant picture changes are recorded on the disk, 
and the displayed picture changes. The Data Disc display processor does not execute the same 
display program continuously like the III processor. The only way to make a DD picture disappear 
is to explicitly erase it from the disk by means of a DD program (from either the system or a user). 

There is no such thing as a piece of glass on a DD display. Also, you should not include an extra 
word at the beginning of a DD display program as you do for III display programs; every word of 
a DD display program is executed as a display instruction. (The DD instructions are explained in 
Appendix 2). 

More words of warning: 

The DD processor executes your display program directly from your core image. No address 
relocation is done; thus jumps will not work correctly since their destination addresses are taken as 
absolute! 

Your Data Disc display program should end with a HALT instruction; if it does not, the system 
will zero the last word of the program to make sure it halts. 

Finally, you may do a channel select only to your own main channel or to an extra DD channel 
that you own or are permitted to write on. If you have no channel select in the first 10 words of 
your DD program, the system will select your main DD channel for you. (On the DD display 
processor, only the first channel select in a program will work; so any channel select beyond the first 
10 words will be ignored.) In addition, a select of channel will get your main DD channel. Thus 
to select the real channel 0, you select channel 40. You see, 40 is non-zero so you don't get your 
main channel, but only the low order 5 bits of the channel number are used in the select (since 
there are only -32 channels). You can always select channel 40+C and be assured of getting 
channel C. However, if you select a channel that you are not allowed to write on, the select is 
changed to your own main channel. In all of these cases where the system selects your own main 
DD channel for you, it does so by starting the DD processor at a special two word block that 
contains a channel select in the first word and a jump to your program in the second word. 



4.3 Page Printer Manipulation 61 

4.3- Page Printer Manipulation 

.j 

Your page printer is the part of the monitor that prints text on your display screen. Normally your 
entire screen is used by the page printer. However, you may have up to 20 logical pieces of paper, 
numbered from to 17 inclusive, to which TTY output and echoing of input may be directed, and 
each of these pieces of paper may be placed at any part of the screen. You select the piece of paper 
(hereafter abbreviated PP) which is to be used currently, and all TTY printing and echoing will go 
to that PP until you select some other PP. Initially, PP is selected. 

PPIOT [OP-782] 

PPIOT <funct ion>, <argument> 

PPIOT is an extended UUO that uses the AC field to determine which of several page printer 
functions is to be executed. The individual functions are described separately below. 

PPSEL iop-782, AC-SI PPIOT e, 

PPSEL <piece of paper number> 

The PPSEL UUO selects the piece of paper whose number is the effective address of the 
instruction. This number should be between and 17, inclusive. Piece of paper number zero is 
the one normally selected for you. After you give this UUO, all your TTY printing and echoing 
will go to the specified piece of paper. This UUO deactivates all other PPs as if you had done a 
PPACT UUO with only this PP specified. See the PPACT UUO below. 

PPACT IOP-702, AC-1] PPIOT 1, 

PPACT <piece of paper activation map> 



The PPACT UUO is used to display selected pieces of paper. The effective address of the 
instruction is interpreted as a bit map indicating which pieces of paper are to be displayed. A one 
in bit 18+N will cause PP number N to be displayed. Thus bit 18 (400000 bit) of the effective 
address is for PP 0, bit 19 (200000 bit) for PP 1, etc. 

. 

On the Ills any PPs turned off by this UUO will disappear. However, on the Data Discs those 
PPs will not disappear; you must erase them explicitly if you no longer want them displayed. 



62 Display Output 4.3 

DPVPOS [OP-702, AC-2] PPIOT 2, 

DPYPOS <Y-position> 

The DPYPOS UUO causes the currently selected piece of paper to be positioned on the screen so 
that its first line is located at the Y-position specified by the effective address of this instruction, 
where +1000 is the top of the screen and -1000 is the bottom. 

DPYSIZ [OP-702, AC-3] PPIOT 3, 

DPYSIZ <G*1898 + L> 

The DPYSIZ UUO sets two values for the currently selected piece of paper: the number of glitches 
(G) and the number of lines per glitch (L). Both of these numbers are set from the effective 
address of the instruction, G from bits 18:26 (0..777000 bits) and L from bits 27:35 (0..777 bits). 

Now a word about glitches. When a piece of paper fills up, the text in it jumps up to provide 
room for more text (thus moving some text off the top of the PP). This jumping up is called a 
glitch. The number of lines it jumps is the number of lines per glitch (L) as set by the last 
DPYSIZ tor this PP or by the default if no DPYSIZ has been given. The total number of lines in 
a PP is L*G. 



PPREL [OP-782, AC-4] PPIOT 4, 

PPREL <piece of paper number> 



The PPREL UUO releases the piece of paper whose number is the effective address of the UUO. 
Piece of paper zero cannot be released; PPREL is a no-op. The system storage associated with a 
PP being released is freed; you cannot possibly get back the text that was on it. If you release the 
currently selected PP, a PPSEL (see above) to piece of paper zero is done. On Ills, released PPs 
will disappear. 



PPINFO (OP-702, AC=SJ PPIOT 5, 

PPINFO ADR 
ADR: <block 24 words long for returned informat ion> 

The PPINFO UUO gives you a 24-word table of information about your page printer. The 
effective address in the instruction should point to a 24-word block into which the table is to be 
placed. 



4.3 Page Printer Manipulation 63 

The information returned in the table is indicated below, where PP means piece of paper and PG 
means piece of glass. To get the same information for some other job, use the PPSPY UUO (see 
page 64). 

Words Value 

<POG activation bits>,,<PP activation bits> 

These are in PGACT and PPACT formats. See these two UUOs. 

1 <number of the currently selected PP> 

2 Bit (400000,,0 bit) is 1 if the Data Disc page color is green on black. 
Bit 1 (200000,,0 bit) is 1 if your screen has been erased by an escape 
command since you last gave this UUO. 

Bit 2 (100000,,0 bit) is 1 if you are on a Data Disc display. 

Bits 18:35 (the 0..777777 bits) hold your line editor Y-position in 

LEYPOS format. See the LEYPOS UUO below. 

3:22 <Y-position>,,<G * 1000 + L> 

There is one word here for each PP; in word 3 is the status for PP 0, 
word 4 for PP 1, etc. The <Y-position> is in DPYPOS format, G 
means number of glitches, and L means lines per glitch. See the 
DPYPOS and DPYSIZ UUOs above. 

23 Bit (400000..0 bit) is 1 if the size of the currently selected PP was last 
set by keyboard command rather than by UUO. 
Bit 1 (200000,,0 bit) is the same for the Y-position of the current PP. 
Bit 2 (I00000,,0 bit) is the same for the line hold count. 
Bit 3 (40000,,0 bit) is the same for the glitch hold count. 
Bits 9:17 (777,,0 bits) have the actual line hold count. . 
Bits 18:26 (0..777000 bits) have the actual glitch hold count. 
Zero in either of these hold counts means that that hold count is not 
being used. 

Bits 27:35 (0..777 bits) hold the character (including control bits) that 
activated the last line re-edited with a control-CR or with a PTLOAD 
UUO (see page 55). 



LEYPOS tOP-702, AC-G1 PPIOT 6, 

LEYPOS <Y-position for line edi tor> 



The LEYPOS UUO sets the Y-position of your line editor to that specified by the effective address 
of the instruction, which is interpreted in DPYPOS format (+1000 is top of screen, -1000 is bottom). 
A Y-position of zero does not mean the middle of the screen, but instead means return the line 
editor to the bottom of your page printer (its normal location). 



G 1 Display Output 4.3 

PPHLD [QP-702, AC7] PPIOT 7, 

PPHLD <LHC*1000 + GHC> 

The PPHLD UUO sets the line hold count (LHC) and the glitch hold count (GHC) for your page 
printer. These two numbers indicate how many lines or glitches the system should allow to be 
printed before automatically holding the typeout for your display. Both the LHC and the GHC 
are set from the effective address of the UUO, LHC from bits 18:26 (the 0,,777000 bits) and GHC 
from bits 27:35 (the 0,,777 bits). If the high order bit of either of these fields is on, the 
corresponding hold count is not changed. A zero in either field disables that particular type of 
automatic holding. 



PPSPV tOP-047, AOR-488187] CALL1 408107 



MOVE AC, t<job number or -tty number>, , ADR] 
PPSPY AC, 
<error return> 

ADR: <24-word block for returned information> 

The PPSPY UUO returns a 24-word block of information about the page printer of a specific job 
or display. The information returned is exactly the same as that returned by the PPINFO UUO 
(see page 62). The right half of AC should contain the address of the 24-word block where you 
want the information returned. The left half of AC should contain either the number of the job 
or the negative of the number of the display for which you want the page printer information. If 
this UUO is successful, the skip return is taken. If there is no such job or if the terminal is not a 
display, then the direct (error) return is taken. 



4.4 Running Display Programs 



This section describes the UUOs that allow the user to have his own display programs run on the 
III and Data Disc display processors. 



4.4 Running Display Programs 65 

UPGIOT [OP-7031 

UPGIOT <piece of glass number>,ADR 

ADR: <f lags>, ,<address of display program> 
<length of display program in words> 
<transfer-in-progress flag, if bit in ADR is on> 
<address of low order line command, if bit 1 in ADR is on> 

The UPGIOT UUO (also known as DPYOUT) causes a display program to be run. If you are on 
a Data Disc, the program is assumed to be a Data Disc display program and thus is run on the 
Data Disc display processor. If you are on a III terminal, the program is run on the III display 
processor. If you are on a pseudo-teletype (PTY) which is owned either directly or indirectly (that 
is, through a chain of PTYs) by a job running on a display, then the program is run on that 
display, whether it be III or Data Disc. 

If the display program is to be run on a III, the AC field of the instruction indicates which piece of 
glass the program is to be run as. If the program is intended for a Data Disc display, the AC field 
is ignored. 

The address field of this UUO points to a data block, of which the first word contains the address 
of the display program that is to be run and the second word contains the program's length in 
words. 

For Data Disc programs there are some other optional parameters which you may specify. If bit 
(400000..0 bit) of the word at ADR is on, then the display program is run in overlapped mode. 
This means the UUO will return without waiting for the display program to finish. (However, it 
will wait for any previous DD program to finish.) In this mode the word at ADR+2 is set non-zero 
while the program is being sent to the DD processor and is set to zero when the program has 
finished. Thus you can test to see if the program has completed; you should not change any part of 
the display program until ADR+2 has been set to zero. Also, if you indicate a DD program length 
of zero in ADR + 1, no program will be run at all, but the UUO will not return until any previous 
DD program has finished. 

If bit 1 (200000,,0 bit) at ADR is on, the display program is run in double field mode. This is 
useful for writing text on a Data Disc channel. Normally you have to send text to the DD 
processor twice, once for each of the two tracks that make up the DD channel. In these two passes, 
you would indicate two line addresses that are the same except in the low order bit position. In 
double field mode, the system sends the program to the DD processor twice, once with the low order 
bit of the line address select set to zero and once with it set to one. The original value of this bit 
when you give the UUO is irrelevant and its final value is unspecified. The low order line address 
select must occur as the third command in the word pointed to by ADR+3. This feature will not 
work properly if you have more than one line address select in your DD program. 

For details on the format of a display program, see Section 4.1 for Ills and Section 4.2 for Data 
Discs. For descriptions of the instructions for the two display processors, see Appendix 1 and 
Appendix 2. 



66 Display Output 4.4 

PGIOT IOP-71S1 

PGIOT <funct1on>,<argument> 

The PGIOT UUO is an extended UUO that uses the AC field to determine which of several 
display functions is to be executed. The individual functions are described separately below. Of 
these, the PGSEL, PGACT, and PGCLR UUOs are meaningful only for Ills and are no-ops when 
given on Data Discs. 



PGSEL COP-715, AC-01 PGIOT 8, 

PGSEL <piece of glass number> 



The PGSEL UUO causes the piece of glass whose number is the effective address of the UUO to 
be selected. This means that the UPGMVM and UPGMVE UUOs (see page 67) will refer to 
this piece of glass until the next PGSEL is given. 



PGACT [OP-71S, AC-11 PGIOT 1, 

PGACT <piece of glass activation map> 



The PGACT UUO is used to select which pieces of glass are to be displayed. The effective 
address of this UUO is interpreted as a bit map; a one in bit 18+P will cause piece of glass number 
P to be displayed, and a zero will cause that piece of glass to be invisible. 



PGCLR KF-71S, AC-2J PGIOT 2, 

PGCLR 



The PGCLR UUO causes all of your pieces of glass to be cleared. This means that the system free 
storage that was allocated for these PCs is freed and whatever was displayed by them disappears 
never to be seen again. This UUO does not affect your page printer at alt. 



4.4 Running Display Programs 67 

DDtJPC IOP-715. AC3] PGIOT 3, 

DDUPG ADR 

ADR: <f lac)s>, , oddress of display program> 
< length of display program in words> 
<transfer- in-progress flag, if bit in ADR is on> 
oddress of low order line command, if bit 1 in ADR is on> 

The DDUPG UUO causes a user's Data Disc display program to be run. This UUO works just 
like UPGJOT except that the program is always run on the Data Disc display processor. See the 
UPGIOT UUO on page 65 for an explanation of the various options. 



PGINFO [OP-715, AC=4] PGIOT 4, 

PGIOT ADR 
APR: <block 21 words long for returned informat ion> 

The PGINFO UUO returns a 21 word table of information about your pieces of glass. The 
effective address of the instruction should specify the location of a 21 word block where the table is 
to be stored. The information returned in the table is indicated below. 

Words Value 

<POG activation bits>,,<PP activation bits> 

These are in PGACT and PPACT formats respectively; see these two 
UUOs. 

1:20 <word count>,,<starting address> 

There is one word here for each piece of glass. 



UPGMVM tOP-7141 

UPGHVM AC, ADR 



The UPGMVM UUO is used to update a III display program. Before you give this UUO, you 
must have selected some piece of glass with the PGSEL UUO. This UUO is then used to update 
the display program of that piece of glass by replacing the word that would have been at ADR in 
that program with the word in the specified AC. In other words, you could update your display 
program by doing a MOVEM AC, ADR and then another UPGIOT, or you can give this UUO 
with the same AC and ADR specified. This causes a change to one word of your display program, 



63 Display Output 4.4 

which is already running (unless deactivated by a PGACT UUO). The address ADR must be 
within the bounds of the core area that contained the display program when you created this piece 
of glass with the UPGIOT UUO. 



UPGMVE KF-713J 

UPGflVE AC, ADR 



The UPGMVE UUO is the MOVE analog of the UPGMVM UUO described above. This UUO 
picks up a word from the currently selected display program and returns it in the specified AC. 



DPYCLR [OP-7811 

DPYCLR 



The DPYCLR UUO resets your display to its initial state. Any display programs running are 
cleared and the page printer is returned to its normal condition. On a III, this means that all 
pieces of glass will disappear. On a Data Disc, however, nothing is erased except that which is 
overwritten by the newly redrawn page printer. The RESET UUO (see page 126) simulates a 
DPYCLR. If you are not on a display, this UUO has no effect. 



4.5 Extra Data Disc Channels 



The DDCHAN UUO is provided to allow users to acquire extra Data Disc channels for use in 
displaying text and graphics. 



DDCHAN tOP-847, ADR-488867] CALL I 488867 



MOVE AC, Uchannel request>] 

DDCHAN AC, 

<error return - for get channel and set status only> 

The DDCHAN UUO is used to get and retease DD channels and to get and set the status of DD 
channels. This UUO should be given with a channel request in the specified AC; this request is 
interpreted as follows. 



4.5 



Extra Data Disc Channels 69 



Bits Octal 
28:29 0..300 



30:? 5 0..77 



400000..0 



200000..0 



Meanings of bits in a Data Disc channel request 

Operation. 

8 = release channel 2 - get status 

1 - get channel 3 - set status 

A get channel will fail if the requested channel is 

unavailable. A set status will fail if the channel 

doesn't belong to you. These two commands skip on 

success; otherwise, the direct return is taken. 

Channel number. Values through 37 specify a 
particular DD channel. In a get channel request, the 
value 77 specifies any channel. In a get status or set 
status, 77 means your main channel. In a release 
channel, 77 releases all channels assigned to the job. 
Other values for the channel number are undefined. 

Privacy flag. A one in this bit means no one else can 
look at this channel. 

Write permission. A one in this bit means that other 
jobs may write on this channel. 



After execution of this UUO (except for a release all channels or a get any channel failure), the AC 
contains the channel number in the right half, the privacy and write permission status in bits 
and 1, plus the channel use in bits 10:17 (377..0 bits). A value of zero in this use field means the 
channel is free; 1 through 77 mean that it is an extra channel belonging to that job number; 100 
through 177 mean that it is the main channel for the TTY line whose number is 52 less than this 
number; 200 through 377 are for special channels, such as the one used by the system to advertise 
free DD terminals. 

The RESET UUO (see page 126) releases all of your extra DD channels. 
Example: To request a private channel that only your job can write on. 



WIN: 



MOVE AC, [490988,, 177] 
DDCHAN AC, 
JRST LOSE 



If you get to WIN, the channel number will be in the right half of AC and the left half will have 
the sign bit on with your job number in bits 10:17. 



70 Display Output 4.6 

4.6 The Video Switch 



The Video Switch is the device that determines which pictures will appear on which TV monitors 
(Data Disc displays). Available to these displays are -32 Data Disc (DD) channels, numbered to 
37 octal, a null channel, and 7 television channels, numbered 41 to 47, 

Each TV monitor is controlled by a 36-bit map that specifies which channels are connected to that 
monitor. This map is explained below. 

Bits Octal Meanings of bits in a Data Disc display map 

0:31 777777..777760 DD channels. A one in bit N means that DD channel 

N is connected to this monitor. 

33:35 0,,7 TV channel. Zero in this field selects the null 

channel; 1 through 7 select the corresponding TV 
camera, receiver, or synthesizer. In terms of keyboard 
commands, these are channels 41 through 47. 

32 0,,10 Asynchronous flag. A zero in this bit causes DD sync 

to be inserted; a one blocks DD sync and all DD 
channels. Whenever bits 33:35 specify an 
asynchronous source, the system automatically sets this 
bit to one. 

Example: A map containing "200000,,7 H selects DD channel 1 and TV channel 47. 

The system keeps two maps for each TV monitor; these maps are called the permanent map and 
the temporary map. The video switch is set to the permanent map whenever a RESET (CALLI 0) 
is performed. 



The following UUO has been added to permit user programs to set the maps for particular TV 
monitors. 



VDSMAP [OP-847, ADR-488878] CALLI 488878 



tlOVE AC, [<switch request>, ,ADR] 

VDSMAP AC, 

<error return for all operations except "get map"> 

ADRs <DD channel map> 

The VDSMAP UUO is used to select the channels that are displayed on a given TV monitor or to 
find out which channels are currently being displayed. The right half of the AC should point to a 



-1.6 The Video Switch 71 



channel map, as described above; the meaning of the <switch request> in the left half is explained 
below. If you specify a TTY line that is not a TV monitor, then -1 is returned in the AC. 
Otherwise, the new map for the indicated monitor is returned in AC. 

Bits Octal Meanings of bits in a video switch request 

11:17 177..0 TTY line number of the DD display to be switched. 

Zero means your own TTY line. Other lines 
associated with TV monitors (26 through 1 17) may be 
switched only if they have no job logged in. 

9 400,,0 Shadow line map. If this bit is on, then the UUO 

will refer to one of the six unused TV lines rather 
than to a normal TV monitor. The number in bits 
11:17 should be in the range 0:5 and specifies which 
one of these six lines is to be mapped or examined. 

400000,,0 Temporary/permanent flag. Zero means make a 

temporary change; one means make a permanent 
change. 

6:8 7000..0 Operation. 

- Get map. The current channel map of the 

indicated line is returned in the AC, and the 
direct return (no skip) is always taken. 

1 - Set channel map from word at ADR. This 

operation skips if it is entirely successful. 

2 - Add specified channels. Bits 0:31 of the map at 

ADR are "or"ed into the current map. If bits 
33:35 of the map at ADR are not all zero, they 
replace the corresponding brts in the current 
map. This operation skips on complete success. 

3 Delete channels (inverse of 2). The 

complements of bits 0:31 are "and'ed with the 
old map. If bits 33:35 in the new map are not 
all zero, this field is cleared to zero, which 
selects the null TV channel. This operation 
can fail only on a busy line number. It skips 
on success. 

4 = Reset map. In temporary mode (per bit 0), reset 

the map to the permanent one. In permanent 
mode, reset the map to the main channel alone. 
This operation can fail only on a busy line 
number. It skips on success. 
5:7 Undefined. 

An attempt to map someone else's private channel to any display will fail. However, each channel 
being mapped is considered separately, and a mapping- operation may successfully map some 
channels while failing on others. If the mapping operation fails on at least one channel, then the 



17. 



Display Output 4.6 



UUO will take the error return. Also, unless you are privileged, you cannot change the map of 
someone else's display. A job running on a PTY can change the map of the display of the job 
owning the PTY (possibly through a chain of PTYs). 

Exnm/itc: To temporarily connect DD channel 21 and TV channel 47 to your monitor. 

MOVE AC. [1000,, fl,. 7]] 

VDSMAP AC, 

JRST LOSE 
UIN: 

v<7 ;/)/(: To get the current channel map of TTY line 37. 

I10VSI AC, 37 
VDSHAP AC. 



The channel map would be returned in AC. 



4.7 The Audio Switch 



Associated with each display is an audio speaker which can be connected to any one of several 
sound sources. The ADSMAP UUO (see below) is used to choose the sound source to be heard 
over the speaker at a program's attached terminal. The BEEP UUO is used to send a short beep 
to any display's speaker. 

Each sound source that can be connected to a display's speaker is assigned an audio channel 
numbei . The current assignments of channels to sources is as follows: 

Channel Sound source 

Laboratory personnel paging system. 

1 Lounge TV audio. 

2 Tuner in Helliwell's office. 

3 Tuner in computer room. 

4 AD D-to-A output converter, channel 1. 

b A continuous beeping--used by the BEEP UUO. 

6:17 Unconnected. 

To connect a speaker to a sound source, the user specifies the source's channel number. A speaker 
cannot be connected to more than one source. 

Each display has both a permanent audio switch connection and a temporary connection. When a 
temporary connection is made, its duration (possibly infinite) must be specified; when the duration 
inns out, the permanent connection is reselected automatically. A RESET (see page 126) will also 
resrlrct the permanent connection. 

The system allows a user to send a beep to a display terminal in order to attract the attention of 
that display's user. Since a beep may interrupt something a user is listening to, the user is 



4.7 The Audio Switch 73 



permitted to inhibit beeping on his display's speaker. Furthermore, the personnel paging system of 
the laboratory uses the audio switch to make paging announcements over users' speakers, and these 
pages may also interrupt a user's selected sound source. Thus the following system has been 
implemented to allow each user to decide what will interrupt his audio switch connections. 

Four possible dispositions are allowed for handling audio interruptions; for each connection, one of 
these is selected for paging interruptions and one for beep interruptions:- 

INTERRUPT 

DON'T INTERRUPT 

INTERRUPT UITH EXTENDED DURATION 

DELAY BEEP 

I menu fit means that if an interruption comes along, the connection will be momentarily changed 
until the beep or page ends. 

Don't interrupt means ignore all interruptions; no change will be made even momentarily to the 
audio switch connection. 

Interrupt with extended duration means allow interruptions to take place but extend the duration of 
the connection. This is meaningful only for temporary connections. 

Delay b(fp means postpone any beep interruption until the expiration of the connection. This 
again applies only to temporary connections, and further is not a defined disposition for paging 
interruptions. 



ADSMAP [OP=847, ADR-488118] CALLI 408118 



HOVE AC,[<audio snitch connection>] 
ADSMAP AC, 

The ADSMAP UUO is used to connect a specific sound source to a display's speaker or to find out 
the status of a display's audio switch connection. The job giving this UUO must be attached to a 
display terminal for this UUO to do anything; also it is not possible for a job to affect the audio 
switch connection for any display but its own. 

If AC contains -I, the audio switch connection is reset to the current permanent connection. 
Otherwise, the value in AC specifies either the temporary or permanent connection and indicates 
whether that connection is to be changed or just its status returned. If a temporary connection is to 
be made, the duration of the new temporary connection must be given in the right half of the AC; 
this duration is in units of 1/4 second. The various fields of AC are interpreted as follows: 



74 Display Output 



4.7 



Bits Octal 

400000..0 

1 200000,,0 



2:3 HOOOO.,0 



20000..0 



5:6 14000,,0 



Meanings of audio switch connection fields 

Temporary/permanent flag. A in this bit specifies 
the permanent audio switch connection; a 1 means the 
temporary connection. 

Set/get flag. If this bit is 0, the connection indicated 
by bit will not be changed; the connection status 
will simply be returned in AC (with bit unchanged, 
bits 1:4 zero, bits 5:17 containing the data indicated 
below, and bits 18:35 containing the time remaining 
in any temporary connection's duration, or for 
infinite, even if getting permanent connection status). 
A 1 in this bit means the connection is to be changed. 

Action taken if there is a current temporary 
connection (applies only if setting new connection): 

Wait for any existing finite temporary connection 
to expire. An infinite temporary connection in 
progress will be flushed. 

1 If making a temporary connection and there is 
already a finite temporary connection, don't 
change the connection; if there is an infinite 
temporary connection, it is flushed and the new 
connection is made. If making a permanent 
connection, same as 2 below. 

2 Make this connection now regardless of former 
status. Any current temporary connection is 
flushed immediately. 

3 Same as 2. 

Return-immediately flag. If this bit is and a finite 
temporary connection is to be made, the UUO will 
not return until the new connection expires. A 1 in 
this bit makes the UUO return immediately, possibly 
after waiting for an old temporary connection to 
expire--see bits 2:3 above. 

Paging disposition (bit 5 is ignored for a permanent 
connection): 

Interrupt. 

1 Don't interrupt. 

2 Interrupt and extend duration (only for temporary 
connection). 



4.7 The Audio Switch 75 



7:8 3000,,0 Beep disposition (bit 7 is ignored for a permanent 

connection): 

Interrupt. 

1 Don't interrupt. 

2 Interrupt and extend duration (only for temporary 
connection). 

3 Delay beep (only for temporary connection). 

14:17 17..0 Audio switch channel. 

18:35 0..777777 Duration in 1/4 second units, or for infinite 

(temporary connections only). 

9:13 760,,0 The original contents of this field are ignored, but if 

bit 1 is (getting status), these bits are used to return 
the following status information: 

9 400,,0 Temporary connection active. This bit will be a 1 if 

you have a current temporary connection. This bit is 
returned whether you are getting the status of a 
temporary connection or of a permanent connection. 
If you are getting the temporary connection status and 
this bit is returned as (no temporary connection), 
then only bits 9:12 (740,,0 bits) will return significant 
data. 

10 200,,0 Page in progress. This bit will be 1 whenever a 

paging announcement is being made, whether or not 
your display is allowing page interruptions. 

11 100,,0 Paging interruption in progress. This bit will be 1 

whenever a paging announcement Is in progress and 
you are enabled for page interruptions. 

12 40,,0 Beep interruption in progress.. This bit will be 1 

whenever a beep is happening oh your display. 

13 20..0 Delayed beep pending. This bit will be 1 if you have 

selected the delayed beep disposition and there is a 
beep interruption waiting for the expiration of your 
temporary selection. 



76 Display Output 4.7 



BEEP tOP=047, ADFU4001111 CALLI 408111 



MOVE AC, [<TTY line number, or -1 for self>] 
BEEP AC, 

The BEEP UUO causes a beep interruption for a specific display terminal. The AC should 
contain the display's line number, or -1 to beep your own display. The beep may happen at once, 
be delayed, or be ignored altogether, depending on the recipient's audio switch connection status. 
This UUQ returns at once in any case, giving no indication of what happened. 

It the terminal being beeped is not a display, a control-G (bell) is sent to the terminal instead of the 
beep. 



5. Upper Segments 77 

SECTION 5 
UPPER SEGMENTS 



Programs may be split into two discontiguous parts. The first part goes from user address zero to 
an address called the job's protection constant. This address, whose low order 10 bits are always 
1777, is contained in the word at JOBREL in the job data area (see Appendix 4). The second 
part, if it exists, starts at user address 400000 and goes up to the program's second protection 
constant, which is kept in the right half of JOBHRL in the job data area. This second part of a 
program, when it exists, is called the upper segment, second segment or high segment of that job. 
The first part is usually called the lower segment and is the controlling job. An upper segment 
cannot execute code except when attached to a lower segment. 

An upper segment can be shared by several jobs; this saves core by eliminating all but one copy of 
the same piece of code. However, it uses up an extra job slot because each upper segment is given 
a separate job number. 

Since upper segments are sometimes shared, they can be write protected to prevent any job from 
changing the code and/or data in a segment, which, after all, may be part of another job. Write 
protection is just an option, however, and shared segments are not required to be protected. The 
SETUWP UUO is used to change an upper segment's write protection status. The sign bit of 
JOBHRL will be on when your upper segment is write protected. 

Another use of upper segments involves having several of them which are attached by a lower 
segment one at a time and detached when the next one is needed. For a job to be run, it must be 
entirely in core, including its attached upper segment, if any. 

Upper segments have a protection scheme similar to that used on the disk. Each upper segment 
has a nine bit protection key which indicates who may use that segment and how they may use it. 
The nine bits are in three groups of three bits each. The first group tells what the creator PPN 
may do with the segment, the second group tells what others with the same project as the creator 
may do, and the third group tells what anyone else may do. Within each group, the first bit is 
unused, the second bit is read protection and the third bit is status change protection. Read 
protection prevents you from attaching to the segment; status change protection prevents you from 
changing the name, write protection status, core size, or protection of the segment. 



5.1 Making and Killing Segments 



There are three ways you can become attached to an upper segment. You can run an SSAVEd 
program (i.e., one that was saved with its upper segment), in which case you will get the segment 
that was attached to the program when it was saved; or you can attach to an already existing upper 
segment; or you can create a new upper segment. 



78 Upper Segments 5.1 



Every job, including upper segments, has a list of credentials. These include the job name, the 
project-programmer name of the source dump file of the current program, the physical and logical 
names of the device the dump file was on, the creation date of the dump file and the protection. 
The protection for a lower segment will always be 000 unless it has been changed by the SETCRD 
UUO (see page 88), which can also be used to set the protection and creation date for an upper 
segment. When you cause a new upper segment to be created, its credentials are copied from your 
job. For a given job, all of the credentials except the protection are set from their values for the 
dump file which holds the current program. If the dump file was SSAVEd, then the upper segment 
will be initialized to the same protection it had when it was saved. The lower segment is set up 
with protection 000. 

Let me explain this a bit further with some examples. If you run a system program, your job name 
will be the file name of the dump file on [1,3], your job PPN (not to be confused with your 
logged-in PPN) will be 1,3, your job physical device name will be DSK, your logical device name 
will probably be null, and your job creation date will be the creation date of the dump file. If you 
run a user program from, say, the disk area [ABC.DEF], then all this stuff will be the same except 
that your job PPN will be ABC.DEF. 

The LINKUP UUO is used to search the system for an upper segment with credentials that match 
those of your job. The SETPRO UUO (see page 81) can be used to set an upper segment's 
protection. The SETCRD UUO (see page 88) can be used to set the creation date and protection 
either for a lower segment or for an upper segment. 

When you are finished with an upper segment, you should kill it. This means that it will go away 
(giving up its job number) unless someone else is still using it. 

The following UUOs are used to create, kill, attach and detach upper segments and to change the 
size of an upper segment. 



LINKUP [OP-047, ADFU400023] CALLI 400823 



LINKUP 

<error return> 

The LINKUP UUO attempts to find an already existing upper segment with the same job name, 
date of creation, and other credentials as your job has. (The list of credentials required for an 
upper segment to match your job is given above.) If such an upper segment is found which is not 
protected from you, it is attached to your job and the skip return is taken. If there is no such 
upper segment, you get the direct (error) return. Any segment you were attached to when you gave 
this UUO is killed before all this happens. 



5.1 Making and Killing Segments 79 



REMAP [OP=847. ADR=37] CALLI 37 



MOVE AC, [<wr i te-protect f lag>, , <highest address in louer>] 
REMAP AC, 
<error return> 

The REMAP UUO causes your core image to be broken into two segments. The address 
contained in the AC right is taken as the address of the last word to be in the lower segment. The 
next word becomes the first word in the upper segment and its address becomes 400000. If the sign 
bit of the AC is on when this UUO is given, the upper segment will be write protected. 

Before your core image is broken, an automatic LINKUP is attempted in order to find an already 
existing upper segment with your credentials; see the LINKUP UUO above. If one is found, the 
part of your core image that would otherwise have become your upper segment is discarded and 
your core size reduced appropriately before attaching to the already existing upper segment. 

If this UUO is successful, the skip return is taken apd the job number of your upper segment is 
returned in AC. If the automatic LINKUP fails and there are no more job numbers left to create 
a high segment under, or if there is something illegal in your specifications, the direct (error) return 
is taken. 

Any upper segment you are attached to when you give the REMAP UUO is killed before anything 
else is done. 



CORE2 (OP-847, ADR=488815] CALLI 488815 



hOVEI AC,<highest upper segment address desired> 
CORE2 AC, 
<error return> 

The CORE2 UUO is used to change the size of your upper segment. The address in the AC is 
interpreted as the highest address you want in your upper segment; this address, if non-zero, is 
ORcd with 1777 and the 400000 bit is ignored. If the AC contains zero, any upper segment you 
have will be killed (unless it is protected from you, in which case it will simply be detached from 
your job) and the skip return will be taken. 

If the AC contains a non-zero number and you do not have an upper segment, an upper segment 
of the specified size will be created for you. If you already have an upper segment, its size is 
adjusted to that specified by the number in the AC. If this UUO is successful, the skip return is 
taken. If there is not enough core to grant your request, or if the segment is protected from you, 
the direct (error) return is taken. Unless you are killing your upper segment (with a zero in AC), 
this UUO returns with the AC containing the total number of IK blocks available to a single user 
program, counting both upper and lower segments. 



80 Upper Segments 5.1 



ATTSEG [OP=047, ADR=400016] CALLI 400016 



MOVE AC, [<job number or name>] 

ATTSEG AC, 

<error return - code in AC> 

The ATTSEG UUO is used to attach to an upper segment that already exists. You must not 
already have an attached upper segment. The AC should contain either the sixbit job name or the 
job number of the upper segment to which you wish to attach. If this UUO is successful, the skip 
return is taken. Otherwise the direct (error) return is taken and a code is returned in the AC 
indicating the cause of failure. The error codes and their meanings are explained below. 

Error Code Meaning 

A protection violation has occurred; you are not allowed to 
attach to this upper segment. 

1 There are two or more upper segments with the job name you 
gave. The job number of the first one is returned in the left 
half of AC. 

2 The job number you gave is not the job number of an upper 
segment. 

3 There is no job with the name you gave. 

4 You already have an upper segment. 



DETSEG [OP=047, ADR=400017] CALLI 400017 

DETSEG <flag>, 

The DETSEG UUO detaches your upper segment from your job. Normally your upper segment is 
placed into a list of the segments you have detached, so that when you do a RESET (see page 126), 
all your detached segments will go away. However, if the low order bit of the AC field is a one, 
then the segment will not go into the list, but will stick around like any other detached job. This is 
not recommended because it can result in the proliferation of unused upper segments. Only the 
low order bit of the AC field is looked at by this UUO. 

If you have a simulated upper segment (see the SETPR2 UUO on page 92), it is killed by this 
UUO. 



5.2 Getting/Setting Segment Status 81 

5.2 Getting/Setting Segment Status 

The following UUOs are used to find out and/or change the protection, name and other 
information associated with an upper segment. 

SF.TUWP [OP=047. ADR=361 CALLI 36 



HOVEI AC,<zero for unprotect, non-zero for protect> 

SETUUP AC, 

<protection violation return> 

The SETUWP UUO is used to write protect or unprotect your attached upper segment. If AC 
contains zero, the segment becomes unprotected; otherwise it becomes protected. If this UUO is 
successful, the skip return is taken. If the segment is protected from you, then you get the direct 
(error) return. If you have no upper segment, you always get the skip (success) return. The sign 
bit of JOBHRL in the job data area is a one if your upper segment is write protected. 



UNPURE [OP-047, ADR-400102] CALLI 400102 



UNPURE 

<error return> 

The UNPURE UUO is used to unprotect your upper segment. If you are sharing a 
write-protected upper segment with other users, this UUO will create an unprotected copy of that 
upper segment (assigning it a new job number), detach you from the old segment and attach you to 
this new segment. If you are the sole user of a write-protected upper segment, this UUO will 
simply unprotect that segment. The skip return will be taken upon success, at which time your 
upper segment will not be write protected. If there are no job numbers available for a copy of 
your upper segment, or if you cannot be granted enough core, the direct (error) return will be 
taken. If you have no upper segment, or if your upper segment is not write protected, you always 
get the skip (success) return. 



SETPRO [OP-047, ADR=400020] CALLI 400028 



HOVE AC, [<Bits 0:8 = new prot key; bits 30:35 - job no.>] 
SETPRO AC, 
<error return> 

The SETPRO UUO can be used to change the protection key of any upper segment not protected 
from you. Bits 30:35 (0,,77 bits) in the AC should contain the job number of the upper segment 
whose protection you wish to change, where zero means your own attached upper segment; bits 0:8 



82 Upper Segments 5.2 

of the AC should contain the new protection key you wish the segment to have. If this UUO is 
successful, the skip return is taken. If a protection violation occurs or if the job indicated is not 
an upper segment, the direct (error) return is taken. 



SETNM2 [OP=847, ADR=400836] CALLI 408836 



MOVE AC,[<sixbit name for your upper segment>] 
SETNM2 AC, 
<error return> 

The SETNM2 UUO is used to change the job name of your upper segment. The name you wish 
your segment to have should be in the AC when you give this UUO. If your segment is 
successfully renamed, the monitor then scans the names of other upper segments in the system, and 
if there is one with the same name as yours, its job number is returned in the AC; if there is no 
other upper segment with the same name, zero is returned in the AC. The skip return is taken on 
success. If you are not permitted to change your upper segment's name, the direct (error) return is 
taken. If you have no segment attached, the skip (success) return is always taken. 



POINTS tOP-7121 

POINTS ADR 
ADR: <block =63 words long for returned job number s> 

The POINTS UUO returns a list of the job numbers of all jobs, including your own, which are 
attached to your upper segment. This list is returned in the block pointed to by the effective 
address of the UUO, with one job number per word. The end of the list is indicated by a zero. 
This list can be up to =63 words long. 



SEGNAM [OP-847, ADR=488837] CALLI 488837 

SEGNAM AC, 

The SEGNAM UUO returns in AC the sixbit job name of your upper segment. If you have no 
upper segment attached, zero is returned. 



5.2 Getting/Setting Segment Status 83 

SEGNUM [OP=847, ADR=480821J CALL I 480821 



HOVE I AC, < job number > 
SEGNUM AC, 

The SEGNUM UUO gets the job number of the upper segment attached to the job whose number 
is in AC The segment number is returned in AC. A zero in AC gets your own segment number. 
A zero returned means the specified job has no upper segment attached. 



Information 85 



SECTION 6 
GETTING/SETTING INFORMATION 



This section describes numerous UUOs that allow you to get certain types of information from the 
system and to change some of this information regarding your job. 



6.1 Dates and Times 

jf 

Here are some UUOs to get various flavors of date and time. 

DATE [OP-847, ADR14] CALLI 14 

DATE AC, 



The DATE UUO returns in AC the current date in system date format. The number returned has 
the following value: ((year-1964>: l2+month-l>31+day-l, where all these numbers are in decimal. 
You can calculate the day, month and year by dividing. If you divide by -31, the remainder is 
then day-1. Then if you divide the quotient by -12, the new remainder is month-1. Finally, if you 
take the quotient again and add -1964, you get the year. 



DAYCNT IOP-047, ADR-488188] CALLI 488188 



MOVE AC, [<date in system date format>3 
DAYCNT AC, 

The DAYCNT UUO converts a date from system date format (see the DATE UUO above) to the 
number of days from 1 January 1964 to the date indicated. AC should contain the date of interest, 
where zero or a negative number is taken to mean today's date. The corresponding day count is 
returned in AC. 



TIMER [OP-847, ADR-22] CALLI 22 

TIMER AC, 



The TIMER UUO returns in AC the time of day in 60ths of a second after midnight. 



86 Information 6.1 

MSTIME tOP=047, ADR=23] CALLI 23 

MSTIME AC, 

The MSTIME UUO returns in AC the time of day in milliseconds after midnight. This time is 
accurate only to the nearest 60th of a second. 



ACCTIM [OP-047, ADR-400101] CALLI 400101 

ACCTIM AC, 

The ACCTIM UUO returns the current date and time. The date is returned in the left half of 
AC and is in system date format (see the DATE UUO above). The time is returned in the right 
half of AC and is in seconds after midnight. 



DSKT1M [OP=047, ADR=400072J CALLI 400072 

DSKTIM AC, 

The DSKTIM UUO returns in AC the current date and time in file time/date written format: bits 
13:23 (37,,770000 bits) hold the time in minutes after midnight, and bits 24:35 (0,,7777 bits) hold the 
date in system date format (see the DATE UUO above). 



RUNTIM [OP-047. ADR=27] CALLI 27 



MOVE AC, [<job number>] 
RUNTIM AC, 

The RUNTIM UUO returns in AC the total compute time since login used by the job whose 
number is in the AC. A zero job number in the AC will get the compute time for your own job. 
The time returned is in milliseconds although it is kept by the system in 60ths of a second and is 
not even exact to that accuracy. An illegal job number specified will cause zero to be returned. 



6.2 Job Information 



Here are some UUOs to find out things about specific jobs and even to set certain values for your 
own job. 



62 Jb Information 87 



CORE [OP=047, ADR=11] CALLI 11 



hOVEI AC,<highest address you want in your lower segment> 
CORE AC, 
<error return> 

The CORE UUO is used to change your core size (the size of your lower segment if you have a 
two segment program). AC should contain the highest address (in your lower segment) that you 
want to be able to reference. This address, if non-zero, is ORed with 1777 (to make it a IK 
boundary), and then your core size is adjusted, if necessary, to the size indicated. If you can be 
e;iven the amount of core you request, the skip return is taken; if not, the direct (error) return is 
taken. In any case, the maximum number of IK blocks a single program is allowed to use, 
counting both upper and lower segments, is returned in the AC. If the AC originally contains zero, 
then no change is made in your core size, but the number of IK blocks available to a single 
program is returned in the AC and the direct (error) return is taken. 



PJOB [OP=047, ADR-30] CALLI 30 

PJOB AC, 



The PJOB UUO returns your job number in the AC. 

GETPPN [OP-047, ADR-24] CALLI 24 

GETPPN AC, 

The GETPPN UUO returns in AC the logged-in project-programmer name of your job. 



CETNAM [OP-047, ADR-400062] CALLI 400062 

MOVE I AC, < job number > 
GETNAM AC, 

The CETNAM UUO is used to get the name of any job on the system. AC should contain the 
number of the job whose name you wish to know. If AC contains zero, a negative number, or an 
illegal job number, then your job is assumed. The sixbit name of the job specified is returned in 
AC. 



88 Information 6.2 



SETNAM [OP=847, ADR=43J CALLI 43 



HOVE AC,[<sixbit job name>] 
SETNAM AC, 

The SETNAM UUO is used to change your job name to that given in the AC. Any job name is 
legal. 



S ETC RE) IOP-847, ADR-488073] CALLI 480873 



MOVE' AC, [<new protection and creation date>] 
SETCRD AC, 

The SETCRD UUO is used to set the protection and creation date of either your lower segment or 
your upper segment. The new protection and creation date are taken from the AC specified in the 
UUO. If any of bits 0, 3 and 6 (444000,,0 bits) are ones, the protection and creation date of your 
upper segment are set; otherwise the protection and 'Creation date of your lower are set. Bits 0:8 
specify the protection, bits 13:23 the time of creation (in minutes after midnight) and bits 24:35 the 
date of creation (in system date format). Bits 0, 3 and 6 (444000,,0 bits) are turned off before the 
protection is stored. If bits 13:35 are all zero, the current time and date will be used. The 
protection and creation date are used mainly in conjunction with linking to or creating an upper 
segment; see Section 5 on upper segments. 



SETPRV [OP-847, ADR-400866] CALLI 480066 



MOVE AC, <pr i vi lege bits you uant> 
SETPRV AC, 

The SETPRV UUO is used to find out and/or change your privileges. AC should contain either 
-1 or the privilege bits you want. If AC contains -1, then your privileges will not be changed. 
Otherwise, an attempt will be made to set your privilege bits to those indicated in AC. New 
privilege bits will be granted only if either 1) you currently have the privilege privilege (bit 0-the 
400000,,0 bit represents the privilege privilege) or 2) JBTSTS indicates that you are an accounting 
program with JACCT set. However, the system will be glad to turn off the bits for any privileges 
you wish to surrender. Under any circumstances, the resultant settings of your privilege bits will be 
returned in AC. For the meanings of the various privilege bits, or to request privileges, see any 
system programmer. 



6.2 Job Information 89 

SLEVEL [OP=047. ADR-400044] CALLI 488044 



NOVE1 AC, < job number> 
SLEVEL AC, 

The SLEVEL DUO is used to find out a job's current service level. AC should contain the 
number of the job whose service level you want to know; a zero job number means your own job. 
The service level (in percent) of the job indicated will be returned in the left half of AC; the right 
half will contain the job number. If you specify an illegal job number, zero will be returned in 
AC. 



R LEV EL (OP=047, ADR=400054] CALLI 480054 



MOVE1 AC, <programmer name> 
RLEVEL AC, 

The RLEVEL UUO is used to find out how much service level is reserved for the current hour by 
a particular programmer name. The programmer name should be in the right half of AC; the 
service level (in percent) is returned in the left half of AC. The right half of AC is unchanged by 
this UUO unless the reserved service level is zero, in which case zero is returned in the whole AC. 
The original value of AC left is ignored by this UUO. 



6.3 Looking at the Monitor 
Here are some UUOs used to examine various parts of the monitor. 

NAMEIN [OP=047, ADR=400043] CALLI 400043 



HOVE AC,[<sixbit job name>] 

NAME IN AC, 

<error return - code in AC> 

The NAMEIN UUO is used to determine if there are any jobs in the system with a particular job 
name. AC should contain the job name you are interested in. If there is exactly one job with the 
given name, the skip (success) return is taken and the job number of the job with that name is 
returned in the AC. Otherwise, the direct (error) return is taken and a code is returned in AC; a 
code of 1 means that there is no job with the given name, and a code of 3 means that there are two 
or more jobs with that name. 



90 Information 



6.3 



JBTSTS 



[OP=847, ADR-400013] CALLI 480813 



nOVEI AC, < job number> 
JBTSTS AC, 



The JBTSTS UUO is used to get from the system the job status word for a particular job. AC 
should contain the number of the job of interest, where zero means your own job. The table below 
gives the meanings of some of the bits in this word. 



Bits Octal 



400000..0 



200000..0 



2 


100000..0 


JACCT 


3 


40000..0 


JNA 


4 


20000,,0 


JERR 


5 


10000..0 


JLOG 



6 4000..0 

7 2000..0 

8 1000..0 



Namt Meanings of 1's in the job status word 

RUN The job is runnable, though it may be in 

a wait state of some kind. This bit gets 
turned off by typing control-C, giving the 
EXIT UUO, or hitting some kind of 
error. 

CMWB The job is waiting to be swapped in to 
service a monitor command. 



LOGIN or LOGOUT is running; 
control-C cannot be typed at this time. 

A job number has been assigned to this 
job. 

The job has hit an error and cannot be 
continued. 

The job is successfully logged in. System 
phantom jobs (see the WAKEME UUO 
on page 132) run with this bit off as do 
temporary jobs (project-programmer 
name of 100,100) started up by monitor 
commands (like WHO) that need a job 
but which do not require you to be 
logged in. A job with the JLOG bit off 
will go away if it hits an error (such as a 
parity error or illegal memory reference) 
or if a monitor command is typed to it. 



SHF The job is currently being shuffled in 

core. 

SWP The job is swapped out. 

JSEG The job is really an upper segment. 



6.3 



Looking at the Monitor 91 



17 



20 0,, 100000 

23 0,, 10000 

24 0..4000 
30:35 0..77 



JWP This upper segment is write protected. 

This bit is meaningful only if bit 8 is on, 
that is, only if this job is an upper 
segment. 

JLOCK The job is locked in core by the LOCK 
UUO; see page 133. 

FBINP The job has a fast band transfer in 
progress. See Section 10. 

FBERP The job had an error on the last fast 
band transfer. See Section 10. 

Job number of this job's upper segment, 
if any; this field is zero if the job has no 
upper. 



SWITCH [OP=047, ADR=20] CALLI 20 

SWITCH AC, 



The SWITCH UUO returns in AC the current setting of the PDF- 10 console data switches. 



CALLIT 



[OP-047, ADR=400074] CALLI 400874 



MOVE AC, [<opcode, CALLI number or UUO mnemonio] 
CALLIT AC, 



The CALLIT UUO is used to find out the opcode corresponding to a given UUO mnemonic or to 
find out the mnemonic for an opcode or CALLI number. AC should contain the opcode, CALLI 
number or sixbit mnemonic of the UUO you are interested in. The result is returned in AC: for 
UUO mnemonics, the opcode is returned (i.e., a full 36-bit instruction including relevant AC or 
address fields); for opcodes the most specific sixbit mnemonic is returned (e.g., opcode 051000..0 
returns 'INCHRW and 051040..0 returns 'OUTCHR'), unless bit 17 (1..0 bit) was on originally in 
the AC, in which case the generic mnemonic is returned (e.g., opcode 051001,,0 returns 
TTYUUO'); for CALLI numbers, the sixbit CALL name is returned (e.g., 0,,400003 returns 
'SPCVVGO'). If the given mnemonic, opcode or CALLI number is undefined, zero is returned. 

This UUO works by first checking bits 13:16 (36,,0 bits) in the AC. If these bits are all zero, the 
argument is assumed to be an opcode; if any of these bits is non-zero, the argument is assumed to 
be a sixbit mnemonic. Thus any one- or two-character mnemonic will be mistaken for an opcode; 
however all UUO mnemonics are three or more characters. Also, all irrelevant fields in the 
argument must be zero to avoid confusion. 



92 Informal ion 6.3 



SETPR2 [OP=847, ADFU48B852] CALLI 400852 



MOVE AC, [<prot>,,<reloc>) 
SETPR2 AC, 
<error return> 

(Lou order bit of <prot> on means write protect "upper segment;" 
low order bit of <reloc> on means <reloc> is in relative mode.) 

The SETPR2 UUO sets your second protection/relocation register in order to simulate the 
possession of an upper segment. There are two purposes for doing this: the first is to allow you to 
look at any part of core, particularly at the monitor, efficiently; the second purpose is to enable your 
job to address part of your core image as if it were in an upper segment (addresses over 400000) 
even though it isn't. The table in Appendix 5 tells where in the monitor you can find various 
interesting pieces of system information which you can access by using this UUO. 

Note: Any attached upper segment (real or simulated) that you have will be killed when you give 
this UUO. See Section 5 on upper segments. Also, both the RESET UUO (see page 126) and the 
DETSEG UUO (see page 80) undo the effect of SETPR2. 

At the time this UUO is called, AC right should contain the relocation you wish to simulate and 
AC left should contain the protection you wish to simulate as an upper segment. Furthermore, if 
the low order bit of AC left (bit l7--the 1,,0 bit) is on, your "upper segment" will be write protected; 
and if the low order bit of AC right (bit 35--the 0,,l bit) is on, the relocation specified will be 
assumed relative to your core image-that is, your own true relocation constant will be added in to 
<reloc> before setting the second prot/reloc register. Upon success, this UUO takes the skip return; 
if your request specifications are impossible to satisfy, then the direct (error) return is taken. 

If you give an absolute <reloc> and you are not privileged, your "upper segment" will automatically 
be write protected. Finally, the system will adjust the values you specify in AC to IK boundaries; 
for <reloo the low order =10 bits (0,,1777 bits) will be turned off, and for <prot> the low order =10 
bits (1777..0 bits) will be turned on. Thus, a <prot> of 4321 will be made into 5777, and a <reloc> 
of 3210 will be made into 2000, with all this happening after the system has taken note of the low 
order bits of both AC left and AC right. 

Now, if you still don't understand (and even if you do), let me explain further. Suppose you wish 
to look at certain locations in the monitor (for whatever reason). You can use this UUO once and 
then do simple MOVEs (or their equivalent) to get the information you want. For instance, if you 
would like to put into AC whatever is in the system at EXEC location 220, you can execute the 
following sequence of instructions.. 

MOVSI AC1, 377777 ;<reloc> = 8, <prot> = 377777 

SETPR2 AC1, ;make the first 128K of core 

; into your "upper segmerrt" 
HALT jhalt on error return- 

HOVE AC, 408228 ;get whatever is in EXEC 220 

The relative mode use of this UUO allows you to write code as if it were going to run as a second 



6.3 Looking at the Monitor 93 

segment, and then to execute it without making it into a second segment, provided you have used 
this UUO with the relative mode bit set. You could even do overlays by reading another piece of 
code, also written to run as a second segment, into the same place. The base address of the second 
segment code, however, should be on a IK boundary or you might get confused about what is 
happening. 



CETPR2 [OP-047, ADR-400053] CALLI 480053 

GETPR2 AC, 

The GETPR2 UUO is used to fetch the protection/relocation of your simulated upper segment. 
The protection is returned in the left half of AC; bit 17 (1,,0 bit) is on if access to the segment is 
write protected. The relocation is returned in the right half of AC; bit 35 (0,,1 bit) is on if the 
relocation is in relative mode. See SETPR2 above for an explanation of simulated upper segments. 

If you do not have a simulated second segment at the time you call this UUO (for example, if you 
have a real second segment), then zero is returned in AC. 



PEEK [OP-047, ADR-33] CALLI 33 



HOVEI AC.obsolute address you want to look at> 
PEEK AC, 

The PEEK UUO is used to get the contents of any absolute location in memory. AC should 
contain the absolute address you wish to examine. The contents of that address will be returned in 
AC. Appendix 5 tells where you can find some interesting system information in the monitor. 

This UUO has been largely replaced by the SETPR2 UUO (explained above), which makes 
examining memory outside your core image much more efficient. However, if you have an upper 
segment, you must detach it to use the SETPR2 UUO but not to use the PEEK UUO. 



7. Mail System 95 

SECTION 7 
INTER-JOB MAIL SYSTEM 



The inter- job mail system provided by the monitor allows =32 word letters to be passed between 
jobs. Each job in the system has a mailbox which can hold exactly one -32 word letter. For a 
letter to be sent, the sending job identifies the destination job by either the job number or the 
six bit job name. This causes the letter to be placed in the mailbox of the destination job, who can 
then take the letter out of his own mailbox (i.e., receive the letter) whenever he wants. While a 
job's mailbox is full (holding a letter he hasn't read yet), no one can send that job a letter. 

. The RESET UUO (see page 126) will cause any letter in your mailbox to be thrown away. 



MAIL [OP-710] 

MAIL <function>,ADR 

The MAIL UUO is an extended UUO that uses the AC field to determine which of several 
mail-handling functions is to be executed. Each of these functions is described separately below. 
Notice that MAIL is an IOT UUO and hence cannot be given by a program that is currently in 
USER-IOT mode (which is explained in Appendix 3). 



7.1 Sending Mail 

The following two UUOs allow you to send a letter to any job. 

SEND [OP-710, AC=0] -MAIL 8, 



SEND ADR 
<error return> 

ADR: <dest inat ion job name or number> 

oddress of -32 word letter to be sent> 

The SEND UUO is used to send a letter to any job in the system. The effective address of the 
UUO should point to a two-word block. The first word of this block should be the job number or 
the sixbit job name of the job to which the letter is to be sent. The second word of the block 
should contain the address of the -32 word letter. 



96 Mail System 7.1 



If the letter is successfully sent, the skip return is taken. If the destination job already has a letter 
in his mailbox (meaning the letter cannot be sent at this time), the direct (error) return is taken. If 
there is no job with the name or number you give, you get the system error message NON-EX 
JOB NAME OR NUMBER. If there are two or more jobs with the job name you give, you get 
the system error message AMBIGUOUS JOB NAME. With either of these last two errors, your 
program will be stopped and you will be permitted to type CONTINUE, which will cause this 
UUO to be tried again. 



SKPSEN tOP-718. AC=5] MAIL 5, 



SKPSEN ADR 

<return for destination mailbox full> 

<return for letter successfully sent> 

<return for non ex job name or number, or ambiguous name> 

ADR: <jota name or number> 

<address of =32 word letter to be sent> 

The SKPSEN UUO is used to send a letter to another job just as the SEND UUO (see above) 
docs except that there is an extra return, which is taken when there is no job with the given name 
or number or when there are two or more jobs with the given name. Thus, there are three 
possible returns that this UUO can take. The direct return (no skip) is taken if the letter cannot be 
sent because the addressee already has a letter in his mailbox. The skip return is taken if the letter 
is successfully sent. The double skip return is taken if there is no job with the given name or 
number or if there are two or more jobs with the given name. 



7.2 Receiving Mail 



The following two UUOs allow you to receive mail sent to you, that is, to have a letter removed 
from your mailbox and deposited in your core image. 



WRCV COP-718, AC-1] HAIL .1, 

URCV ADR 
ADR: <block =32 words long to receive a letter> 

The WRCV UUO takes the letter, if any, that is in your mailbox and places it in the -32 word 
block specified by the effective address of the UUO. If there is no letter in your mailbox, this 
UUO waits until someone sends you one and then gives it to you. 



7.2 Receiving Mail 97 



SRCV [OP-710, AC=2] HAIL 2, 



SRCV ADR 

creturn if no letter is in your mailbox> 

<success return> 

ADD: <block -32 words long to receive a letter> 

The SRCV UUO checks to see if there is a letter in your mailbox. If there is one, it is returned to 
you in the =32 word block pointed to by the effective address (ADR) of this UUO and the skip 
return is taken. If there is no letter in your mailbox, the direct return is taken and the block at 
ADR is untouched. 



7.3 Peeking at Mailboxes 
The following two UUOs allow you to find out whether a job has a letter in its mailbox. 

SKPME [OP-710, AC3] NAIL 3, 



SKPME 

<return for your mailbox empty> 

The SKPME UUO tells you whether or not there is a letter in your mailbox. If there is a letter 
there, the'skip return is taken; if not, the direct return is taken. 



SKPHIM [OP-710, AC-4] HAIL 4, 



SKPHIM ADR 

<return for his mailbox empty> 

ADR: <name or number of job you are interested in> 

The SKPHIM UUO is used to find out if a given job has a letter in his mailbox. The job 
number or sixbit job name of the job of interest should be in the word pointed to by the effective 
address of this UUO. If that job has a letter in his mailbox, the skip return is taken; if his 
mailbox is empty, the direct return is taken. If there is no job with the name or number given, you 
will get the system error message NON-EX JOB NAME OR NUMBER. If there are two or more 
jobs with the job name given, then you will get the system error message AMBIGUOUS JOB 
NAME. If either of these two errors occurs, your program will be stopped and you will be 
permitted to type CONTINUE, which will cause this UUO to be tried again. 



8. Spacewar Mode 99 

SECTION 8 
SPACEWAR MODE 



In a timesharing- system the available CPU time must be split up among all the programs that are 
trying to run. Any one program will be run only for a short period of time, then stopped for a 
while to let other programs run, then run a little more, etc. The intervals between, and durations 
of, the times when a program is allowed to run are generally irregular and depend on the system 
load. Certain programs require fairly regular service (in the form of CPU time allocated) in order 
to operate meaningfully. The system provides spacewar mode to assure regular service to such 
programs. 

To use spacewar mode, a job tells the system the starting address of the spacewar module (process) 
and how often and on which processor(s) (PDP-10, PDP-6) it should be run. A spacewar module is 
a separate process from your job's main process (the one that initiates the spacewar module) but 
runs in the same core image. The spacewar module will be restarted at a fixed interval after it last 
stopped; you specify this interval when you initiate the module. A spacewar process cannot quite 
be guaranteed of running every so often because, for example, another spacewar process on the 
same processor could have conflicting time demands. After you have initiated a spacewar module, 
your job's main process can continue doing whatever it wants. You are allowed to have one 
spacewar module active on each processor; i.e., you can have one on the PDP-10 and another one 
on the PDP-6. 

While you have a spacewar module active, your job usually will not be swapped out although it 
may be shuffled to a different place in core. Before your job is either shuffled or swapped out, your 
spacewar module will be warned that it is not going to be run for a while; so it can take whatever 
precautions are necessary to see that nothing bad happens while it is away. 

Each time a spacewar process is started up, it is allowed to run until either it signals by the 
DISMIS UUO (see page 102) that it is done or it times out. Normally a spacewar process will time 
out if it runs for more that half a second during a single activation. If you set the 
timeout-suppression bit (see the SPCWGO UUO below) for a spacewar process, then that process 
will never time out. However, running for very long (like more than a few milliseconds) will cause 
system performance to deteriorate noticeably, especially if the process is running on the PDP-10! In 
fact, a spacewar module running on either processor for more than about half a second will cause 
the other processor to think that the first processor is dead. 

If a spacewar process makes an illegal or non-existent memory reference, or if it gets a push-down 
overflow, then the message SPACEWAR LOSSAGE will be typed on the job's terminal and both 
the spacewar process and the main process will be stopped. If you try to initiate a spacewar process 
when one is already active, or if you indicate that a spacewar process should be run on the PDP-6 
and the PDP-6 is not running, or if one of your spacewar processes times out, then you will get an 
error message and your spacewar processes will be killed. 

Spacewar modules are started in IOT-USER mode; this means that operation codes 700:777 are 
machine I/O instructions rather then UUOs. Thus a spacewar process can do its own I/O directly; 



100 Spacewar Mode 8. 



however, it should make sure that its use of I/O devices will not conflict with the system. For more 
information on JOT-USER mode, see its description in Appendix ?. 

Spaccwar modules running on the PDP-6 can never 'do UUOs. Any attempt by such a process to 
do a UUO will result in termination of that run (as by DISMIS). Spacewar modules running on 
the PDF- 10 are allowed to do certain UUOs. However, a UUO that attempts to reference any 
accumulators will never access the correct set of ACs (whether the AC is referenced as an AC or as 
a memory location); and a UUO that returns results in the ACs may in fact return the results in 
the ACs of the job's main process (if the main process is at UUO level), thus clobbering whatever 
the main process had in its AC(s)! Furthermore, any UUO that must wait for something to happen 
will not work from a spacewar module. Finally, some illegal UUOs will cause the SPACEWAR 
LOSS AGE message to be printed. and the spacewar modules to be killed. With those warnings in 
mind, note that spacewar modules on the PDP-10 can in general do any of the 1OT UUOs, that is, 
those with opcodes over 700 (including the display UUOs) but not until the process gets itself out 
of IOT-USER mode!! See the preceding paragraph. 

Each time a spacewar process is started up, the system loads up several accumulators with data that 
might be needed by the spacewar module. The ACs set up and the data they contain are listed 
below. 

AC Contents 

1 The current value of the spacewar buttons. See the SPWBUT UUO 
on page 134. 

2 Your current protection-relocation constant. Your protection constant 
is in the left half and your relocation constant is in the right half of 
this AC. 

3 A warning value. This AC usually contains zero but is set up with -1 
if this is the last time your spacewar process will be run for a while 
(because your job is being swapped out or shuffled). The next time 
your spacewar module runs, this AC will contain the number of 60ths 
of a second for which your spacewar module was suspended. 

4 The number of the processor this spacewar module is running on. 
This number is 1 for the PDP-10 and 2 for the PDP-6. 

5 A flag indicating the status of the processor that this spacewar process 
is not running on. This flag is zero if that processor is running 
(normal state) and -1 if that processor is dead. 

6 Your job status word. See the JBTSTS UUO on page 90. If the run 
bit (bit 0--the 400000..0 bit) of this word is zero, then your main 
process has stopped for some reason; for instance, control-C may have 
been typed. 

If you initiate a spacewar process with the time between runs set to zero, then the process will be 
run only once. 



8. Spacewar Mode 101 

Whenever you do a RESET (see page 126), any spacewar modules active will be killed. The EXIT 
UUO (see page 125) will also kill any spacewar modules you have. Finally, the SPCWAR UUO 
can also be used to kill your spacewar modules; see below. 



8.1 Spacewar UUOs 



Here are the UUOs used to initiate and to kill spacewar processes and to terminate spacewar 
activations. 



SPCWAR [OP=043J 

SPCUAR <number of ticks between startups>, <start ing address> 

The SPCWAR UUO initiates a spacewar process on the PDP-6. If the PDP-6 is not running, the 
spacewar process will be run on the POP- 10 instead. The effective address of the UUO is the 
process' starting address. The number of SOths of a second between startups is specified by the AC 
field of the instruction (possible values of 0:17). If the AC field is zero, then the spacewar process 
will be run only once. Timeout suppression is not possible with the SPCWAR UUO; any process 
started with this UUO will time out if it runs for more than half a second during a single 
activation. 

If the effective address of this UUO is 636367 (that's 'SSW' in sixbit) and the AC field is zero, then 
instead of a spacewar module being initiated, alt your spacewar modules will be killed. This is the 
normal way to kill spacewar modules. The RESET UUO (see page 126) and all flavors of the 
EXIT UUO (see page 125) will also kill your spacewar modules. 



SPCWCO [OP=847. ADFU400003] CALLI 400003 



MOVE AC.UBits 0:1 (600800, ,0 bi ts) -processors; 

bits 2:3 (140000, ,0 bits) - timeout suppression; 

bits 14:17 (000017, ,0 bits) - startup interval; 

bits 18:35 (0,, 777777 bits) starting address>] 
SPCUGO AC, 

The SPCWGO UUO is used to initiate a spacewar process on either the PDP-6 or the PDP-10 or 
both. The starting address of the spacewar module should be in the right half of the AC. Bits 
M:17 (17..0 bits) of the AC should contain the time in 60ths of a second between startups of the 
spacewar module. A zero time means run the spacewar process only once and then kill it. Bits 0:1 
(600000..0 bits) determine which processor(s) will run this module. If bit (400000,,0 bit) is a one, 
then the module will be run on the PDP-10; if bit 1 (200000..0 bit) is a one, the module will be run 
on the PDP-6. If both bits and 1 are one, then both processors will run this module, with each 



102 Space-war Mode 8.1 



processor starting at the given starting address. If both bits and 1 are zero, then the module will 
be run on the PDP-6 unless the PDP-6 is dead, in which case the module will be run on the 
PDP-10. Bits 2:3 (140000,,0 bits) are used to specify timeout suppression separately for the PDP-10 
process (bit 2--IOOOOO,,0 bit) and the PDP-6 process (bit 3--40000..0 bit). If the timeout-suppression 
bit is off for a process, then that process will time out if it runs for more than half a second during 
a single activation. The remaining bits in AC (bits 4:13--the 37760,,0 bits) are reserved for future 
use. 

Example: To initiate a spacewar process with starting address WAR to run every 17 ticks on the 
PDP-10 without timeout suppression, do the following: 

hOVE AC, [400017,, UAR] 
SPCUGO AC, 



DISMIS [OP-047, ADR=400024] CALLI 400024 

Disms 

The DISMIS UUO is used by spacewar processes to terminate individual activations. This UUO 
causes the process to be stopped until the next time it is supposed to be run, at which time the 
process will be restarted at its starting address. 

This UUO has another (though similar) meaning in the user interrupt system; its meaning there is 
explained on page 110. 



9. User Interrupts 103 

SECTION 9 
USER INTERRUPTS 



The user interrupt system allows a program to take action upon the occurrence of any of various 
special conditions, without the program having to test continuously for these conditions. There are 
two versions of interrupts available-the old style and the new style. The main differences between 
the two are: 1) while you are processing an old style interrupt you can still be interrupted, which 
cnn cause all sorts of trouble, but while you are processing a new style interrupt you cannot receive 
another interrupt until you dismiss the current one; 2) the only interrupts you can receive with the 
old system are processor interrupts such as push-down overflow, illegal memory reference and 
arithmetic overflow. Yon can also enable for clock interrupts with the old system, but only clock 
ticks that occur while you are actually running will be seen by your program. All interrupts are 
possible with the new system; and clock interrupts will happen whether or not you are actuafly 
running at the time. Before going into more differences between the old and new style interrupts, I' 
shall explain the basics of the interrupt system and the features that are the same for both styles. 

A user program indicates that it wants to use the interrupt system by enabling itself for the 
particular interrupts that it is interested in. Interrupt conditions that are not enabled for will be 
handled by the system. For instance, if you get a push-down overflow, and if you are not enabled 
for push-down overflow interrupts, then you will get the system error message PDL OV. If, on the 
other hand, you are enabled for This interrupt, then you will get an interrupt indicating that you 
had a push-down overflow. Some interrupt conditions are ignored by the system unless you are 
enabled for them. 

When an interrupt that you are enabled for does occur, your program is stopped, the program 
counter (PC) and PC flags are saved in JOBTPC in your job data area (see Appendix 4), the 
cause of the interrupt is saved in JOBCNI and your interrupt handler is started at the address 
contained in JOBAPR. 

The PC that you get in JOBTPC generally points to the next instruction that your main process 
would otherwise have executed if the interrupt had not occurred. However, there are certain 
conditions under which the value of this PC is not quite obvious. 

First of all, if you were executing a UUO (and hence your PC was in monitor mode while 
executing some system code for that UUO), then the PC saved in JOBTPC will not be your real 
(monitor mode) PC that you had at the time of the interrupt; instead JOBTPC will contain the 
location of the UUO call in your core image, and the user-mode bit (bit 5--the 10000,,0 bit) in the 
left half of JOBTPC will be of to indicate this condition. 

Secondly, when you receive a processor interrupt (either old or new style) such as illegal memory 
reference, the PC saved in JOBTPC will point to the instruction that caused the interrupt. 
However, if you jump to an illegal location, then the PC returned with the illegal memory reference 
interrupt will point to the illegal location. For instance, on an AOJA 1,777777, the AC will have 
been incremented and the PC changed to 777777 before the ill mem ref occurs, so the PC stored in 
this case would be 777777. 



104 User Interrupts 



Finally, if an interrupt occurs in the middle of an ILDB or an IDPB instruction after the byte 
pointer has been incremented but before the byte has been moved, then JOBTPC will point to the 
byte instruction and the byte-increment suppression flag (bit 4--the 20000,,0 bit), will be on in the 
left half of JOBTPC. Thus the byte pointer will not be incremented again when (and if) the 
instruction is resumed. 

Each condition for which an interrupt can occur is represented by a specific bit. You enable a 
given interrupt by setting to one the bit corresponding to that condition; this can be done with 
various UUOs that will be described in detail later. When you get an interrupt, the bit 
representing the cause of the interrupt is given to you in the word at JOBCN1. For new style 
interrupts this word will have exactly one bit on. With old style interrupts there may be some 
extraneous bits on that do not represent old style interrupts. The word returned in this case is the 
CONI word from the processor, and the extra bits currently set in this word are the 0,,6043 bits. 

The interrupt conditions represented by the different bits are listed below. The bits marked with 
asterisks (*'s) represent the only conditions for which you can receive interrupts under the old style 
interrupt system. You are not allowed to enable a given interrupt condition for both old and new 
style interrupts at the same time. 

Note: The RESET UUO (see page 126) clears all of your interrupt enablings. 
Bits Octal Name Interrupt conditions 

400000,,0 INTSWW Your job is about to be swapped out. 

1 200000..0 INTSWD Your job has just been swapped back in. 

If you enable for both INTSWW and 
INTSWD, then you will receive these two 
interrupts as a pair in the expected order 
every time your job is swapped. 

2 100000,,0 INTSHW Your job is about to be shuffled. 

3 40000,,0 INTSHD Your job has just been shuffled. 

INTTTY Your user-level job would be activated 
by TTY input if it were waiting for it. 
When you are enabled for this interrupt, 
you will be interrupted every time either 
a character or a line is typed in, 
depending on whether you are in 
character mode or line mode. As long as 
you do not ask for more than there is in 
the TTY input buffer, you may read 
from the terminal at interrupt level. 

I0000,,0 INTPTO A PTY job has just gone into a wait 

state waiting for you to send it characters. 



4 20000..0 



9. 



User Interrupts 105 



10 



12 
13 
14 
15 



4000..0 



2000..0 



1000..0 
400..0 

200..0 



11 100,,0 



40,,0 
20..0 
10..0 
4,,0 



16 2,,0 



19 0..200000 



INTMAIL Someone has just sent you a letter (see 
Section 7). You may read the letter at 
interrupt level. 

INTWA1T A UWAIT UUO has just returned from 
finishing the execution of a UUO. You 
cannot enable for this interrupt, which is 
used by the monitor to make the UWAIT 
UUO work (see page 1 10). 

INTPTI A PTY you own has just sent you a 
character (or line). 

INTPAR A parity error has occurred in your core 
image. The address in which bad parity 
was detected is given to you in AC 10. 

INTCLK A clock interrupt has just happened. 
The default interval between clock 
interrupts is a 60th of a second; this 
interval can be changed by the CLKINT 
UUO (see page 110), which also enables 
clock interrupts. This bit is for new style 
clock interrupts only. 

INTINR IMP interrupt from foreign receive side. 
See Section 13.12, specifically page 175, 
for explanations of this and the following 
three interrupt conditions. 

INTINS IMP interrupt from foreign send side. 
INTIMS IMP status change interrupt. 
INTINP IMP input waiting. 

INTTTI [ESCAPE] I has just been typed on the 
display terminal which is attached to this 
job. 

INTQXF Your job is changing queues. Your new 
positive queue number is available from 
accumulator 14; see page 107. Note: 
This interrupt is not guaranteed to be 
generated every time you change queues. 

>'f POV A push-down stack overflow or underflow 
has just occurred. If the instruction 
causing this was a PUSHJ or a POPJ, 



106 User Interrupts 



9. 



22 0..20000 



ILM 



23 0,, 10000 



26 OJOOO 



29 0..100 



32 0..10 



then the PC stored in JOBTPC is the 
one specified by the instruction (PUSHJ) 
or by the stack (POPJ); if the instruction 
is a PUSH or a POP, then the PC will 
have been incremented and will thus 
point to the instruction after the PUSH 
or POP. In any case, the push-down 
pointer will have been given its new 
value and any value being pushed or 
popped will have been moved to its 
indicated destination. For a PUSHJ or a 
PUSH, the value pushed will now be 
occupying the last location in the stack. 
For a POPJ or a POP, the value popped 
will have come from the first location 
before the beginning of the stack. 

An illegal memory reference has just 
occurred; that is, you have just tried to 
reference a memory location outside your 
core image. 

A non-existent memory reference has just 
occurred; that is, you have just tried to 
reference a memory location that 
apparently does not exist. This should 
never really happen; if it does, it 
generally means a memory unit has 
failed. 

The clock has just ticked while you were 
running. This bit is for old style clock 
interrupts only. 



: INTFOV A floating overflow has just occurred. 
The PC saved will point to the word 
after the instruction causing the overflow. 

* INTOV An integer overflow has just occurred. 
The PC saved will point to the word 
after the instruction causing the overflow. 



.:< NXM 



The remaining bits are currently unused. As new interrupts are added they will use the 
lower-numbered available bits. 



9.1 New Style Interrupts 107 

9.1 New Style Interrupts 



The new interrupt system is highly recommended over the old system; thus I will explain the new 
system first. The bit representations of the particular interrupts are the same in both systems 
(except for clock interrupts), but with the new system there are more interrupts which you can 
enable. 

When you receive a new style interrupt, all sorts of things happen. First of all, as usual your PC 
and flags are saved in JOBTPC and the bit representing the cause of the interrupt is stored in 
JOBCNI. Unless you were executing a UUO at the time of the interrupt, the PC word in 
JOBTPC will be perfectly accurate. If, however, you were executing a UUO, then the PC saved in 
JOBTPC is really the address in your core image where the UUO in progress is located; in this 
case, the user-mode bit (bit 5-the 10000..0 bit) in JOBTPC will be off. Thus the user-mode bit in 
JOBTPC will tell you if a UUO was in progress when the interrupt occurred. 

With a new style interrupt, your accumulators are saved. Then, before your interrupt routine is 
started, certain ACs are loaded up with data as listed in the table below. Your user-level ACs are 
saved in locations 20:37 of your core image unless you were executing a UUO at the time of the 
interrupt, in which case your ACs are saved somewhere in the system. 

AC Contents 

1 The current value of the spacewar buttons. See the SPWBUT UUO 
on page 134. 

2 Your current protection-relocation constant. 

3 A warning value. This AC usually contains zero but is set up with -1 
if this is the last interrupt you will get before your job is swapped out 
or shuffled. 

. 4 The number of the processor this interrupt module is running on. 

This number is 1 for the PDP-10 and 2 for the PDP-6. Since 
interrupts are (currently) always run on the PDP-10, this AC will 
always contain 1. 

5 A flag indicating the status of the processor that this interrupt-level 
process is not running on. This flag is zero if that processor is running 
(normal state) and -1 if that processor is dead. 

6 Your job status word. See the JBTSTS UUO on page 90. 

JOBREL for your upper segment, if any. This is the size, minus one, 
of your upper segment, if you have one, and zero if you do not. 

10 The datum for this particular interrupt. Currently, the only interrupt 

with a datum is the parity error interrupt, for which you get here the 
address at which bad parity has been detected. This value can be 



108 User Interrupts 9.1 

invalid if you have some pending interrupts which generate data (e.g., 
if you get several parity errors in a row), in which case this is the last 
datum seen by the system. 

14 Your positive queue number. This tells you which queue your 

user-level process is in. 

After these ACs have been set up, your interrupt routine is run at interrupt level starting at the 
address contained in the right half of JOBAPR. The PC flags for your interrupt-level routine are 
set from the bits in the left half of JOBAPR. (The PC flags are explained in Appendix 3.) For 
example, if bit 6 (the 4000..0 bit) in JOBAPR is on, your interrupt process will be started up in 
IOT-USER mode (see Appendix 3). Your interrupt process is actually started by the system doing 
a JRST !3,<!JOBAPR (see the JRST instruction in the PDP-10 manuals) and you are then allowed 
to run uninterrupted (except for I/O interrupt services) for up to 8 ticks (8/60 of a second). If you 
are still running at interrupt level when that time runs out, you will get the system error message 
I-LEVEL TIMEOUT and your program will be stopped. 

When your interrupt-level routine finishes and wishes to return to the interrupted program, it 
should issue the DISMIS UUO (see page 110). If, however, the interrupt-level routine does not 
wish to return to the user-level program but wants instead to become the user-level program, then it 
should issue the UWAIT UUO and then the DEBREAK UUO. This lets your interrupt-level 
process keep running, but it will no longer be at interrupt level; it will be running at user level. 
Note that neither UWAIT (see page 110) nor DEBREAK (see page 111) causes any change in your 
PC flags. Thus, if you are in IOT-USER mode when you give these UUOs, then you will still be 
in IOT-USER when you return from them! If you UWAIT and DEBREAK and then want to 
return to the interrupted program, you can do so simply by jumping to the interrupted address 
(contained in JOBTPC) by doing a JRST 2,@JOBTPC which will also restore the flags of the 
interrupted process. However, you should probably save JOBTPC somewhere else before 
DEBREAK ing because after you DEBREAK you can receive another interrupt, which would 
clobber the old JOBTPC with a new one. 

To allow users to enable both old and new style interrupts at the same time, a user program can 
indicate a special three word block to be used with new style interrupts in place of the three words 
at JOBCNI, JOBTPC and JOBAPR, respectively. If JOB1NT in your job data area contains a 
non-zero number, that number will be interpreted as the address of this three word block. The 
normal three words in the job data area will continue to be used for old style interrupts (and for 
new style interrupts whenever JOBINT contains zero). 

Now here are the UUOs used with the new style interrupt system. 



9.1 New Style Interrupts 109 

INTENR [OP=047, ADR-400025J CALLI 400025 



HOVE AC, [<interrupt bits to be enabled>] 
1NTENB AC. 

The 1NTENB UUO enables the interrupts that correspond to the bits on (ones) in the AC and 
disables the interrupts corresponding to bits that are zero. This overrides all previous enablings 
(of the new style interrupts). If there is an interrupt pending that you are now enabling, the 
interrupt will be taken immediately. (See page 104 for the interrupt conditions represented by the 
various bits.) 



INTORM tOP=047, ADR-40002G1 CALLI 400026 



MOVE AC, Ubits to be ORed in>] 
INTORn AC, 

The INTORM UUO enables the interrupts corresponding to the bits that are on (ones) in the AC. 
The enablings of other interrupts are unchanged. 



INTACM [OP=047, ADR=400027] CALLI 400027 



MOVE AC,[<bits to be cleared>] 
INTACM AC, 

The INTACM UUO disables the interrupts corresponding to the bits that are on (ones) in the AC. 
The enablings of other interrupts are unchanged. 



INTENS [OP-047, ADR-400030] CALLI 400030 

INTENS AC, 

The INTENS UUO returns your new style interrupt enablings in the AC; bits which are on (ones) 
represent enabled interrupts. 



110 User Interrupts 9.1 

CLKINT [OP-717] 

CLKINT l,<numtaer of ticks between interrupts> 

Thr CLKINT UUO is used to set the interval between clock interrupts. If you enable for clock 
interrupts without using this UUO, you get the default interval of one tick (a 60th of a second); but 
with this UUO you can set the number of ticks per clock interrupt to any number representable in 
18 bits (up to about an hour and twelve minutes). 

This UUO enables for clock interrupts, masks clock interrupts on (see the INTMSK UUO on page 
1 12), and sets the interval (in ticks) between interrupts to the number which is the effective address 
of the UUO. The AC field of this UUO must be a 1, as shown. 



DISMIS [OP=047, ADR=400024] CALLI 400024 

DISMIS 

The DISMIS UUO is used to terminate an interrupt-level process. When you give this UUO at 
interrupt level, the current interrupt is dismissed and your user-level program is continued at the 
point where it was interrupted. This UUO is illegal at user level. (The DISMIS UUO has 
another related meaning when given by a spacewar process; see page 102.) 



UWAIT [OP=047, ADR=400034] CALLI 400034 

UNA IT 

The UWAIT UUO can be used by an interrupt-level process to ensure that the interrupted 
program is not in the middle of executing a UUO. If a UUO was in progress when the interrupt 
occurred, then UWAIT will wait for that UUO to finish. UWAIT also returns with your user-level 
ACs set up (i.e., the ACs that were saved when the interrupt occurred), so you should not expect 
any ACs to be preserved through a UWAIT. 

The mechanism used by UWAIT is the following. If no UUO is in progress, UWAIT sets up your 
user-level ACs and returns immediately. Otherwise, bit 7 (2000,,0 bit) in your interrupt enablings 
is turned on, the address of the instruction after the UWAIT (to which you will want to return 
later) is saved, and your user-level process is resumed, in the middle of some UUO. When that 
UUO finishes execution, the system notes that you are enabled (bit 7) for a UUO-completion 
interrupt; so bit 7 is cleared and your interrupt-level routine is continued at the saved address, with 
your user-level ACs already having been set up. At this point you are once again at interrupt level 
and are subject to its timeout. 

After you have clone a UWAIT, you can terminate your interrupt-level process with either of two 



9.1 New Style Interrupts 111 

UUOs. You can DISM1S and leave interrupt level the normal way with no side effects for having 
done the UWA1T, or you can DEBREAK to make your interrupt-level process into your user-level 
process (see the DEBREAK UUO below for more details). 

If you do a UWAIT and do not return immediately, then while the interrupted UUO is finishing 
other interrupts may occur and you may even do another UWAIT. When the UUO finally 
completes, the interrupt-level routine to regain control will be the last one that did a UWAIT. 

If you are in the middle of a SLEEP UUO (see page 125) when you do a UWAIT, the SLEEP is 
terminated immediately; you do not wait until the time when it would normally have ended. 

The UWAIT UUO is illegal except at interrupt level. 



DEBREAK [OP-847, ADR-488835] CALLI 488035 

DEBREAK 

The DEBREAK UUO is used to turn an interrupt-level process into a user-level process. In order 
to assure that you were not in the middle of a UUO when the interrupt occurred, you should give 
a UWAIT UUO before you DEBREAK. After debreaking, you will no longer be at interrupt 
level. However, you will have the same accumulators that you had before debreaking. DEBREAK 
does not alter the flow of instructions (as DISMIS does); the next instruction executed is the one 
following the DEBREAK, but it will be executed at user level. 

After you do a UWAIT and a DEBREAK, you can return to your interrupted process by jumping 
to the address that was placed in JOBTPC when the interrupt started. Note, however, that as 
soon as the DEBREAK is done, you may receive further interrupts since you are now at user level; 
thus JOBTPC may get clobbered, so you might want to save it before you DEBREAK. See also 
the INT JEN UUO on page 113. 

The DEBREAK UUO is illegal except at interrupt level. 



IWAIT [OP-847, ADR-488848] CALLI 488848 

IUAIT 

The IWAIT UUO causes your job to go into a wait state (INTW) that will be terminated only 
when an interrupt occurs. 



112 User Interrupts 9.1 



IENBW [OP-847, ADR-488845] CALL I 408845 



MOVE AC, ^interrupt bit enablings>] 
IENBU AC, 

The IENBW UUO is used to set your interrupt enabling* and to put your user-level process into 
the interrupt-wait state, both at the same time in order to prevent a race between going into 
interrupt wait and getting an interrupt. This UUO has the same effect (except for timing) that 
would be gotten from doing an INTENB followed by an IWAIT. 



INTGEN tOP-847, ADR-488833] CALLI 488833 



MOVE AC,[<bits to interrupt with>] 
INTGEN AC, 

The INTGEN UUO generates an interrupt for you for each bit on in the AC. This will cause the 
interrupts to take place immediately, but you must be enabled for all of the interrupts you are 
generating or you will get a system error message. 



INTIRQ, [OP-847, ADR-488832] CALLI 488832 

INTIRQ AC, 

The INTIRQ, UUO returns in AC the bits representing the interrupts you currently have pending. 
Usually this will be zero unless you are at interrupt level. This will also be non-zero if between the 
time an interrupt is requested and the time it is serviced it is disabled, which can happen if your 
interrupt-level routine changes the interrupt enablings. Finally, this can be non-zero if you have 
masked off some interrupts (see the INTMSK UUO below). 



INTMSK [OP-720] 

INTMSK l.ADR 
ADR: <interrupt maek> 



The INTMSK UUO is used to set your interrupt mask. In this mask, a 1 means the interrupt is 
masked on, a means it is masked off. Your interrupt mask is initially all Ps. The only interrupts 
you can receive are those that are both enabled and masked on. If an enabled interrupt is masked 
off (with this UUO or with one of the following UUOs), then when that interrupt condition arises, 
the interrupt will remain pending until it is masked back on, at which time it will interrupt 
immediately. (The AC field of the UUO must be a 1, as shown.) 



9.1 New Style Interrupts 113 

IMSKST IOP-721] 

___________________ . - - 

IMSKST l.ADR 
ADR: <bits to be turned on in interrupt mask> 

The IMSKST UUO ORs the contents of location ADR into your interrupt mask (see the 
INTMSK UUO above). Thus this masks on the indicated interrupts. (The AC field of the UUO 
must be a 1, as shown.) 

IMSKCL [OP-722] 

IMSKCL l.ADR 
ADR: <bits to be turned off in interrupt mask> 

The IMSKCL UUO turns off, in your interrupt mask, the bits that are on in location ADR. Thus 
this masks off the indicated interrupts. See the INTMSK UUO above. (The AC field of the UUO 
must be a 1, as shown.) 



INTUUO tOP-723] 

INTUUO < functions ADR 



INTUUO is an interrupt system extended UUO that uses the AC field to determine which of 
several functions is to be executed. The different functions are described separately below. 



INTJEN tOP-723, AC-8J INTUUO 8, 

I NT JEN ADR 



ADR: <interrupts bits to be ORed in> 

<PC word to go to> 

The INTJEN UUO solves an special race condition. Suppose you have done a UWAIT followed 
by a DEBREAK, fooled around in user level for a while, and now wish to enable your interrupts 
again and return to the original user-level process. You presumably have the PC word stored in a 
location somewhere. If you enable your interrupts and then try to jump back to the original 
user-level process, you may get interrupted between the enabling UUO and the jump. The second 
interrupt may want to do the same thing and may in the process overwrite your PC word with a 
new and different PC. This UUO solves this race by setting the interrupt bits at ADR and 
jumping to the PC contained in ADR+1 all in one indivisible operation, so that if another 
interrupt occurs, the PC it gets will be the one specified in ADR + 1. 



IN User Interrupts 9.1 

IMSTW [OP-723, AC-1] INTUUO 1, 

inSTU ADR 

ADR: <mask bi ts> 

1 

The IMSTW UUO sets your interrupt mask (see the INTMSK UUO above) and then puts you 
into interrupt wait. The effective address of the instruction indicates a two word block, the first 
word of which should have the mask bits you want set. The second word of the block must 
contain a 1, as shown. 



IWKMSK tOP=723, AC=2] INTUUO 2, 

IUKMSK ADR 
ADR: <bits for interrupts that should awaken> 



The IWKMSK UUO sets the mask that determines if the main job gets awakened out of IWAIT 
when an interrupt happens. If an interrupt occurs that should not awaken you, then it is processed 
but when it finishes, your main job will not be taken out of interrupt wait. 



INTDMP [OP=723, AC=3) INTUUO 3, 



INTDMP ADR 

<error return - error code in ADR+1> 

ADR: <job name or number> 

cblock of 5 uords for returned informat ion> 

Error codes: 

2 ambiguous job name 

3 non existent job name 

The INTDMP UUO returns 5 words of information about a particular job. The effective address 
of the UUO specifies a six word block; the first word of this block should contain the number or 
sixbit name of the job you want to find out about, where zero means your own job. If the UUO is 
successful, the skip return is taken and words 1 through 5 of the block are filled with the 
information indicated below. If the value in ADR specifies an ambiguous or non-existent job, then 
the error return (no skip) is taken and an error code (see above) is returned in ADR + 1. 



9.1 New Style Interrupts 115 



Word Value 

Unchanged (job name or number). 

1 Interrupt enable bits of specified job. 

2 Interrupt mask. 

3 Zero. 

4 Wakeup mask (interrupt bits which will awaken the job from 
I WAIT; see IWKMSK UUO above). 

5 Number of the queue the job is in. 



INTIPI IOP=723, AC=4] INTUUO 4, 

INTIPI ADR 

<error return - code in ADR+1> 

ADR: <job name or number > 

<bits for interrupts you want generated> 

Error codes: 

1 non existent job number 

ambiguous job name 

3 non existent job name 

4 job not enabled for interrupts specified 

The INTIPI UUO is used to send one or more interrupts to any job on the system. ADR should 
contain the number or sixbit name of the job you want to receive the interrupt(s). The specific 
interrupts you want generated should be indicated by bits on in the word at ADR + 1. The job you 
choose must be enabled for the interrupts you send. If this UUO is successful, the skip return is 
taken; otherwise, the error return (no skip) is taken and an error code is returned in the word at 
ADR + 1. 



IMSKCR tOP=723. AC-51 INTUUO 5, 

inSKCR ADR 
ADR: <bits to be turned off in interrupt mask> 



The IMSKCR UUO turns off, in your interrupt mask, the bits that are on in location ADR. Thus 
this masks off the indicated interrupts. After masking off these interrupts, this UUO returns your 
old mask in the word at ADR. This avoids timing errors in saving and restoring a mask. See the 
INTMSK UUO above. 



116 User Interrupts 9.2 

9.2 Old Style Interrupts 



When you receive an interrupt under the old interrupt system, here is what happens: Your PC and 
flags aie saved in JOBTPC, the CONI word from the processor is stored in JOBCNI (one old 
style interrupt bit will be on in this word indicating the cause of the interrupt), and your PC is 
changed to that in the right half of JOBAPR. Your interrupt routine may run as long as it wants; 
as far as the system is concerned, your interrupt routine is now your main process and no further 
special action will be taken by the system for the interrupt. When your interrupt routine is 
finished, it can do a 

JRST 2.<?JOBTPC 

to return to the interrupted program. This will restore the PC and flags to their states when the 
interrupt occurred. 

Note that since your interrupt routine is not treated at all specially by the system, it can be 
interrupted itself by an interrupt of the same or a different type. If this happens, JOBTPC and 
JOBCNI will be clobbered with the values for the second interrupt; then when processing resumes 
for the first interrupt, the address (in the main program) to which control should return will no 
longer be in JOBTPC. Unless this address was saved by your interrupt handler, the program will 
probably not be able to continue successfully. The new interrupt system avoids this problem by not 
allowing you to be interrupted while you are processing a new style interrupt. 

The processor CONI word stored in JOBCNI with old style interrupts will have some extraneous 
bits on in addition to the bit representing the interrupt. The extra bits currently set in this word 
are the 0,,604? bits. 

Here are a couple of UUOs to enable old style interrupts. 



APRENB [OP=847, ADR=16] CALLI 16 



HOVE AC, ^interrupt bits to be enabled>] 
APRENB AC, 

V 

The APRENB UUO enables your job to receive old style interrupts upon any of the conditions 
represented by the bits in the AC. Only bits 19, 22, 23, 26, 29 and 32 (0,,231110 bits) can be 
enabled by the old interrupt system. See page 105 for the interrupt conditions these bits represent. 



9.2 Old Style Interrupts 117 



SETPOV [OP=047, ADR=32] CALLI 32 



T10VEI AC,<adclress of interrupt routine> 
SETPOV AC, 

The SETPOV UUO is used to enable for old style interrupts on push-down stack overflow and 
underflow. This UUO takes the address in AC and stores it in JOBAPR; thus this should be the 
address of your interrupt handling routine. Then you are enabled for old style push-down 
interrupts, with any previous old style enablings discarded. Thus you cannot use this UUO if you 
want any old style interrupts other than push-down overflow/underflow. 



10. Fast Bands 119 

SECTION 10 
LIBRASCOPE FAST BAND STORAGE 



User programs are allowed to use bands on the Librascope disk for fast secondary storage. 
However, because the system uses Librascope bands for holding swapped out jobs and because 
there are only a limited number of bands, user programs should not depend on this resource too 
heavily. The system may crash if there are not enough bands for swapping. 

Librascope storage is allocated in bands, with each band being =76* =1024 (76K) words long. 
Each band has =2432 sectors (numbered from to 2431); and each sector is 32 words long. 
When reading or writing a fast band, you specify the number of the sector at which the transfer is 
to start and the number of words to be read or written. The number of words should always be a 
multiple of =32; if it isn't, then it will be increased by the system to the next multiple of =32 and 
that many words will be transferred, whether you like it or not. If you read or write past the end 
of sector number =2431, you will actually be reading/writing at the beginning of the band (starting 
over with sector 0). 

When requesting a Librascope fast band (with the UFBGET UUO, page 120) you may specify 
tithtr a logical band number from to 37 by which you can refer to the band that you are given or 
the physical number of a particular hand that you want. A band number is taken as a physical 
band number if it has the 400000 bit on; otherwise, it will be interpreted as a logical band number. 
When you have been assigned a fast band, you can expect it to contain whatever garbage was last 
written on it. 

Each fast band has associated with it a sector offset which indicates where the logical beginning of 
the band (sector 0) is located relative to the physical beginning of the band. The value of this 
offset is generally irrelevant to the user except when he may want to try to reclaim a particular 
band after some sort of catastrophe, such as a system restart. At such a time, the user might want 
to tell the system where on a particular band his data starts. This sector offset can be set to a 
specific value with the UFBGET UUO, and it can be determined (for instance when set by the 
system) for a particular band with the UFBPHY UUO (see page 122). The value of the offset is 
always between and =1215 inclusive. 



120 Fast Bands 10.1 

10.1 Getting and Releasing Fast Bands 

Here are the UUOs used to obtain and release Librascope fast bands. 

UFBGET COP.847, ADR=488810] CALLI 488810 



MOVE AC, Uenable bits and of fset>, ,<band number>] 

UFBGET AC, 

<return if no bands available> 

The UFBGET UUO is used to acquire one Librascope band. The right half of AC should 
contain either the logical band number (from to 37) by which you will refer to the band you get 
or the physical number of a particular band that you want; physical band numbers must have the 
400000 bit on. Bits 1 (200000,,0 bit) and 2 (100000,,0 bit) of AC are write- and read-enabling bits, 
respectively, which, if on, allow other jobs to write and/or read this fast band of yours. Bits 7:17 
(3777..0 bits) of AC should contain the sector offset which you wish this band to have, where zero 
means the system should choose whatever offset it wants (see the above explanation of the offset). 
To get a real offset of zero, turn on bit (400000,,0 bit) in the AC and make bits 7:17 zero. 

If this UUO is successful, it takes the skip return and the physical number of the band assigned to 
you is returned in AC (but without the 400000 bit on). If there are no bands available, or if a 
particular band you have requested is unavailable, the direct (error) return is taken. 



UFBGIV tOP-847, ADR-4888111 CALLI 400811 



flOVEI AC,<band number> 
UFBGIV AC, 

The UFBGIV UUO releases the fast band whose number is in the AC. This number should have 
the 400000 bit on if it is a physical band number; otherwise, it will be interpreted as a logical band 
number. 

The RESET UUO (see page 126) releases all fast bands assigned to you. 



UFBCLR [OP-047, ADR-488812] CALLI 480812 

UFBCLR 

The UFBCLR UUO releases all fast bands assigned to you. 



10.2 Reading and Writing Fast Bands 121 

10.2 Reading and Writing Fast Bands 

The LJUOs used to read and write Librascope fast bands are described below. 

FBREAD COP-706] 



MOVE I AC,<band number > 
FBREAD AC, ADR 
<error return> 

ADR: <no-wait flag (sign bi t)>, , oddress where data is to go> 
cnumber of words to be read> 
<sector address of beginning of transfer> 

The FBREAD UUO causes data to read into your core image from the fast band whose logical or 
physical band number is in the AC. The effective address of the UUO should point to a 
three-word block (as shown above) which contains the following values: 1) the address where the 
data is to be deposited in your core image, 2) the number of words to be read and 3) the number of 
the sector at which reading is to start. If the sign bit (400000,,0 bit) of the first word of this block is 
on, then this UUO will return immediately without waiting for the transfer (although it will wait 
for any previously initiated transfer to finish); if the sign bit is off, the FBREAD UUO will not 
return until the data transfer has been completed. 

If there are no errors during the read (or during the initiation of the read if the no-wait bit is on), 
this UUO will take the skip return. Upon an error (including a request to read a band that you 
are not permitted to read), the direct return will be taken. 



FBWRT [OP-707] 



MOVE I AC, < logical fast band number > 
FBWRT AC, ADR 
<error return> 

ADR: <no-wait flag (sign bi t)>, , oddress of data> 
<number of words> 
<beginning sector number > 

The FBWRT UUO causes data to be written from your core image onto the fast band whose 
logical or physical band number is in AC. The effective address of the UUO should point to a 
three word block (as shown above) which indicates 1) where the data to be written out is located, 
2) the number of words to be written and 3) the number of the sector at which writing is to start. 
If the sign bit (400000..0 bit) of the first word of this block is on, then this UUO will return 
immediately without waiting for the transfer (although it will wait for any previously initiated 
transfer to finish); if the sign bit is off, the FBWRT UUO will not return until the data transfer 
has been completed. 



122 Fasl Bands 10.2 



If this UUO is successful, the skip return will be taken. Upon an error, the direct return will be 
taken. 



10.3 Miscellaneous Fast Band LIUOs 



Here are some special UUOs provided for finding out various information about the status of 
Librascope fast bands. 



UFBPI1Y tOP=047, ADR=400055] CALLI 400055 



MOVE AC, < logics I or physical band number > 
UFBPHY AC, 

The UFPPHY UUO returns the physical band number and offset of the Librascope fast band 
indicated in AC. The offset is returned in AC left; the physical band number is returned in AC 
right (but without the 400000 bit on). Bit 1 (200000..0 bit) in AC will be on if you have write 
access to the band, and bit 2 (100000,,0 bit) will be on if you have read access. Zero will be 
returned in AC if there is no such band. 



UFBSKP tOP=047, ADR=4000S61 CALLI 400056 



UFBSKP 

<transfer in procjress> 

<no transfer in progress> 

The UFBSKP UUO simply skips unless you have a Librascope fast band transfer in progress, in 
which case the direct return is taken. 



FBWAIT [OP=047, ADR=400057] CALLI 400057 

FBUAIT 

The FBWAIT UUO simply waits until any fast band transfer in progress finishes. If you have 
don't have a transfer going on when you call it, it will return immediately. 



10.3 Miscellaneous Fast Band UUOs 123 



LIFBERR [OP=047, ADR=400060] CALLI 400060 



LIFBERR 

<error occurred> 

<no error > 

The UFBERR UUO simply skips unless your last fast band transfer encountered an error; if you 
had an error, then the direct return is taken. 



11. Misc. UUOs 125 

SECTION 11 
MISCELLANEOUS UUOS 



This section describes various UUOs which did not seem to fit in any other sections. These UUOs 
include the common and useful EXIT, SLEEP, RESET and SWAP UUOs; also in this section are 
the UUOSIM and TMPCOR UUOs. 



EXIT [OP=847, ADR=12] CALLI 12 

EXIT <ac>, 



The EXIT UUO is used to cause your program to stop and exit to the monitor. If <ac> is 0, then 
all I/O channels you have open will be closed (as if by the RELEAS UUO with no inhibit bits on; 
see page 29), then a RESET (see the RESET UUO below) will be done and you will not be 
permitted to CONTINUE your program after exiting. If <ac> is 1, then this UUO will not affect 
any of your I/O channels nor will it do a RESET; a subsequent CONTINUE monitor command 
will cause your program to resume execution at the instruction immediately following the "EXIT 1," 
instruction. Other values of <ac> are reserved for future use. 

Both forms of this UUO kill any spacewar modules you have. 

A phantom or detached job giving either form of this UUO will have its I/O channels closed, and 
then the job will be killed. 



SLEEP tOP=847, ADR=31] CALLI 31 



MOVEI AC,<number of seconds to sleep> 
SLEEP AC, 

The SLEEP UUO causes your job to be stopped for the number of seconds specified by the 
contents of the AC, which is interpreted (approximately) modulo =69. If AC contains zero, your 
job will sleep for 1/60 of a second. When the sleep time is up, your program is resumed at the 
instruction immediately after the SLEEP. If you type Control-C or receive an interrupt while you 
are sleeping, the SLEEP is terminated immediately. 



126 Misc. UUOs . 11. 

RESET [OP-047, ADR=0] CALL1 8 

RESET 

The RESET DUO is used to reset 'various conditions pertaining to your job. All monitor 
commands that get a new program into your core image do a RESET first. Also, the "EXIT 0," 
UUO (see above) does a RESET just before exiting. Here is a list of the things that happen when 
a RESET is done: 

All your I/O channels are released without being closed. That is, the result is 
the same as that from doing a RELEAS <channel>,3 for every channel you 
have open. See the RELEAS UUO on page 29. 

The state of program-controllable echoing of typed characters is reset to echo all 
characters. This is done by clearing the NOECHO bit (bit 28-the 0..200 bit) 
and the NOECHB bit (bit 27-the 0..400 bit) in the TTY I/O status word (see 
Section 13.2). See also Section 3.1. 

The special-activation-mode bit (bit ll--the 100..0 bit) is cleared in your line 
characteristics word (see the GETLIN UUO on page 40), and your special 
activation table is reset to the standard special activation table. Also, the 
linefeed-insertion-inhibition bit (bit 16--the 2,,0 bit) is cleared in your line 
characteristics unless you are running on a PTY. 

JOBFF in your job data area is reset from the value in the left half of JOBS A. 
See Appendix 4. 

Your user interrupt enablings (both new and old style) are cleared. See Section 
9. 

Your core image is unlocked from core. See the LOCK and UNLOCK UUOs 
on page 133. 

If you have a simulated upper segment (created by the SETPR2 UUO; see 
page 92), it goes away. Note that this does not affect any real upper segment 
you may have. 

Any spacewar processes you have are killed. See Section 8. 

> 
Any Librascope fast bands you have are released. See Section 10. 

If there is a letter in your mailbox, it is thrown away. See Section 7. 

Any pseudo-teletypes (PTYs) you have are released along with any jobs logged 
in on those PTYs. See Section 3.5. 

Any extra Data Disc channels you have are released. See Section 4.5. 



11. 



Misc. UUOs 127 



SWAP 



If you are on a III or Data Disc display, your display is reset. This means that 
your page printer is normalized and any III display programs running are 
killed. See Section 4. 

If you are on a Data Disc display, your video switch map is reset to the 
permanent map. See Section 4.6. 

If you are on a III or Data Disc display, your audio switch connection is reset to 
the permanent connection. See Section 4.7. 



[OP=047, ADR=400004] CALL I 400004 



MOVE AC, [SAVADR,, GETADR] 
SUAP AC, 

SAVADR: <clevice name in sixbit> 
<f i I e name in si xbi t> 
<file name extension in sixbit> 
<core size in IK blocks>, , <start ing address> 
<pro ject-programmer name> 

GETADR: ode vice name in sixbit> 
<f i I e name in si xbi t> 

<file name extension in sixbi t>, , <tnode bits> 
<core size in IK blocks>, ,<start ing address increment> 
<pro ject-programmer name of file> 
<pro ject-programmer name for new job> 



The SWAP UUO is used to save your core image in a file and/or get or run another core image 
from a file. This UUO can also be used to create a job and to start up a program on that job. 
Tim format of the files used by this UUO is exactly that of the SAVE, GET, RUN and R monitor 
commands. Note that SWAP does not allow saving upper segments; in fact, SWAP kills your 
upper segment, if any, before doing anything else. Also, SWAP does a RESET (see the RESET 
UUO above) before saving or getting a core image. 

If the left half of the AC is non-zero, then your core image will be saved in the file described by 
the block pointed to by the left half of the AC. After that, if the right half of AC is non-zero, then 
the core image contained in the file described by the block pointed to by the right-half of the AC is 
run or set up as either your core image or that of a new job. If both halves of AC contain zero, 
the SWAP UUO is a no-op. 

Now for a few details. 

If the left half of the AC is zero, no core image is saved. If it is non-zero, it should point to a 
five-word block which contains (as shown at SAVADR above) the specifications for the dump file to 
be saved. These specifications include the device name, file name and extension, and 
project-programmer name for the file, the amount of core (in IK blocks) to be saved and the 
starting address for the dump file. If the core size is zero, the amount of core you currently have 



128 Misc. UUOs II. 



will be used. If the starting address is zero, the current starting address of your job. will be used. 
If the starting address is non-zero, it will be copied into the right half of JOBSA in your job data 
area before the core image is saved. If the extension is zero, 'DMP' will be used. If the 
project-programmer name is zero, your current Disk PPN is used (see page 16). 

Next, if the right half of AC is zero, then no new core image is run. If it is non-zero, it should 
point to a block which contains (as shown at GET ADR above) the specifications for the dump file 
to be run. These include the device name, file name and extension, and project-programmer name 
of the dump file, the core size it is to be run in, the starting address increment, some special mode 
bits and, if the dump file is to be run as a new job (independent of the job giving the SWAP 
UUO), the project-programmer name under which that job should be logged in. The starting 
address increment is added to the starting address saved in the dump file to determine where the 
program is to be started. The mode bits are in the right half of the file extension word and have 
the following meanings: 

Bit s Octal Meanings of I's in mode bits of SWAP UUO 

35 0,,1 The dump file will not be started; instead, the message 

JOB SETUP will be typed out and the job will be 
put into monitor mode. 

34 0..2 The right half of GETADR+3 will be taken as an 

absolute starting address rather than as an increment. 

33 0,,4 The program will be started on a new job which will 

be logged in under the project-programmer name at 
GETADR+5; if this PPN is zero, your logged in PPN 
will be used for the new job. If this bit is off, then 
the word at GETADR+5 is ignored. 

32 0,,IO If starting up another job (bit 33 on), the job will be 

started up as a phantom rather than as a normal job 
(see the WAKEME UUO on page 132). This means 
that the JLOG bit in the job status word (see the 
JBTSTS UUO on page 90) for the new job will not 
be turned on; thus that job will go away if it hits any 
sort of error condition (such as a parity error or a 
push-down stack overflow). 

When you start up a new job with this UUO by having bit 33 on in GETADR+2, the job number 
of the new job is returned in the AC specified in the UUO. A zero is returned if no new job could 
be started because there were no job slots left. When a new job is successfully started, its ACs are 
copied from your ACs; but in the AC specified in the SWAP UUO, the new job will get your job 
number instead of its own. Thus the old job is given the number of the new job and the new job 
is given the number of the old one. 

If the ENTER fails on the file specified at SAVADR, or if the LOOKUP fails on the file specified 
at GET ADR, an error message will be typed out and the program stopped. 



11. Misc. UUOs 129 



RUN [OP-047, ADR-35] CALL I 35 



MOVE AC, [<starting address increment>, .GETADR] 
RUN AC, 

GETADR: <device name in sixbit> 
<file name in sixbit> 

<file name extension in sixbi t>, ,<mode bita> 
8 

<pro ject-programmer name of file> 
<core sire in IK blocks> 

The RUN UUO is DEC's version of the SWAP UUO. Except for a slightly different parameter 
format (see RUN UUO calling sequence above), the only differences between SWAP and RUN are 
that with the RUN UUO, no core image can be saved and no phantom job can be started up 
(mode bits 32:33 are ignored). For details, see the SWAP UUO above. 



TMPCOR [OP-047, ADR-44] CALLI 44 



MOVE AC, [<code>,,ADR] 
TMPCOR AC, 
<error return> 

ADR: <f i lename>, ,8 
I QUO BLEN.BUF 

BUF: BLOCK BLEN 

Code Function 

8 Return in AC the number of words of free TMPCOR space. 

1 Read specified file. 

2 Read and delete specified file. 

3 Unite specified file (deleting old version, if any). 

4 Read TMPCOR directory. 

5 Read and clear TMPCOR directory. 

The TMPCOR UUO allows a job to leave several short files in core from the running of one 
program to the next. A RESET will not affect these files, which can be referenced only by the job 
that created them. All of a job's TMPCOR files are deleted when the job is killed. This system of 
temporary storage improves response times by reducing the number of disk operations. A 
TMPCOR file must be written or read all in one dump-mode operation-you cannot pick up 
reading or writing where you left off; however, when reading a temporary file, you do not have to 
read the entire file. The sum of the sires of all the TMPCOR files for a single job is not allowed 
to exceed 400 words. 

Each TMPCOR file has an explicit three-character sixbit file name and an implicit 
project-programmer name (PPN). When you create a temporary file, the file is given your current 
ALIAS (Disk PPN) as its project-programmer name. To reference the file later, either to read, 



130 Misc. UUOs 11. 



delete or overwrite it or to find it in a TMPCOR directory, your ALIAS must be equal to the file's 
PPN (i.e., your ALIAS when the file was written). 

For the TMPCOR UUO, AC left should contain a code that indicates which one of several 
functions is to be performed. AC right should hold the address of a two-word block which 
contains, as indicated above, the name of the file being referenced (if any) and the length (BLEN) 
and location (BUF) of the user buffer area from which or into which data is to written or read. 
When this UUO returns, AC will contain a value that depends on the function executed. This 
UUO skips on successful completion of the function and takes the direct (error) return otherwise. 
Each function is described separately below. 

Code Function 

Get free TMPCOR space. The number of remaining words of 
TMPCOR space available to the job is returned in AC. This function 
always takes the skip return. (The two-word block at ADR is not 
referenced by this function.) 

1 Read file. If the specified file exists, as much of it as possible is read 
into the user's buffer area (at BUF), the length of the file is returned in 
AC and the skip return is taken. If the file does not exist, the number 
of words of free TMPCOR space is returned in AC and the direct 
(error) return is taken. 

2 Read and delete file. This function is the same as function 1 except that 
the file is deleted after it is read. 

3 Write file. If a file already exists with the specified name, it is deleted. 
Next, if there is enough TMPCOR space for the new file (whose size is 
given by BLEN), then the file is written (with the data at BUF), the 
number of remaining free TMPCOR words is returned in AC and the 
skip return is taken. If there is not enough space to write the file 
completely, then the file is not written, the number of remaining free 
TMPCOR words is returned in AC and the direct (error) return is 
taken. 

4 Read directory. The number of different TMPCOR files the job has is 
returned in AC and an entry in the user's buffer area is made for each 
file until either there is no more space or all the files have been listed. 
The entry for a file has the following format: 

<name>, , <size> 

where <name> is the filename and <size> is the file length in words. 
This function always takes the skip return. 

5 Read and clear directory. This function is the same as function 4 
except that after the directory is read, all of the user's TMPCOR files 
are deleted. 



11. Misc. UUOs 131 



ULJOSIM [OP-847, ADR-408186] CALLI 408106 



MOVE I AC, ADR 
UUOS IM AC, 

ADR: <PC saved here for normal UUOs> 

<UUO saved here for normal UUOs> 

<PC to transfer to for normal UUOs> 
ADR+3: <PC saved here for I- level UUOs> 

<UUO saved here for I -level UUOs> 

<PC to transfer to for I-level UUOs> 
ADR+6: <PC saved here for spacewar UUOs> 

<UUO saved here for spacewar UUOs> 

<PC to transfer to for spacewar UUOs> 

The UUOSIM UUO allows a user to have all UUOs trap to certain locations in his core image 
instead of being executed by the system. At the same time the user can still have the system 
execute whatever UUOs the user needs. The UUOSIM UUO passes to the system the address of 
. a 9-word block which consists of three contiguous 3-word blocks, each specifying what the system 
should do when a certain kind of UUO is given. The first 3-word block indicates what should be 
done on UUOs given by the user's main program; the second 3-word block pertains to UUOs 
given at interrupt level; the third block is for UUOs given at spacewar level on the PDF- 10. (Note 
that UUOs can never be executed on the PDP-6.) The address of the 9-word block should be in 
the AC specified in the UUOSIM UUO. After this UUO is executed, subsequent UUOs will cause 
the following action, using the appropriate 3-word block as mentioned above. 

If the second word of the block is non-zero or if the third word is zero, then the UUO is executed 
by the system in the usual manner. Otherwise, the PC at the time the UUO was encountered is 
saved in the first word of the block, the UUO itself is stored in the second word of the block and 
control is transferred to the PC specified in the third word of the block. Note that the PC stored in 
the first word has already been incremented; it points to the instruction immediately following the 
UUO. Note also that the UUO stored in the second word has already had the effective address 
calculation carried out; the effective address is in the address field and the indirect and index fields 
will be zero. The prior test for the second word being non-zero has the effect of disabling user 
handling of UUOs issued by the user's UUO handler itself. 

To undo the above effect of the UUOSIM UUO, give the UUOSIM UUO with zero in the 
specified AC and with ADR+1 (from the original UUOSIM given) containing a non-zero value so 
that this UUO will not simply be handed back to you. The RESET UUO (see page 126) will also 
disable further special user handling of system UUOs (but again you must force the system to 
handle the RESET itself). 



132 Misc. UUOs 11. 



WAKEME COP=047, ADR=400061] CALL I 400861 



MOVE I AC, ADR 
UAKEME AC, 
<error return> 

ADR: <phantom's jobname in sixbit> 
<phantom's PPN in sixbit> 
<data> 

data < means never start this job 

data - means start this job now if it is not already running 
data > means start this job at the time specified by <data>, 
where <data> <date>, , <t ime in minutes> 

The WAKEME UUO is used to start up, or prevent from starting up, any of the system phantom 
jobs. A phantom is a job started by the system to do some system-related work but which runs as a 
user job. Phantom jobs are defined by the fact that they run with the JLOG bit off in the job 
status word (see the JBTSTS UUO on page 90) and are not logged in under the 
project-programmer name 100,100. The JLOG bit being off means that the job will go away if it 
hits an error (such as a parity error or illegal memory reference). Also, if you type a monitor 
command to a job with the JLOG bit off, the job will go away immediately. 

For this UUO, AC should contain the address of a three word block. The first two words of this 
block should have, in sixbit, the name of the phantom to be started up and the 
project-programmer name where that phantom lives. The third word of the block should contain a 
code indicating what the system should do about the phantom. A negative code indicates that the 
phantom should never get started up, a zero code means that the phantom should be started now 
unless it is already running, and a positive code represents a date (left half) and time (right half) 
when the phantom should be started up. The date is in system date format (see the DATE UUO 
on page 85) and the time is in minutes after midnight. 

If there is no phantom with the jobname and PPN given, the error return is taken. Otherwise, the 
skip return is taken. 

N.B. You should not use this UUO unless you are the person responsible for the phantom you are 
referencing or unless you are absolutely sure that what you are doing is okay. 



11. Misc. UUOs 133 



JOBRD [OP-047, ADR-400050] CALL I 400050 

MOVE I AC, ADR 

JOBRD AC, 

<error return - code in ADR+1> 

ADR: <job name or number> 

-<uiord count>, , oddress of data in his core image> 
oddress in your core image where data is to go> 

Error codes: 1 non-existent job number (job number - 0) 

2 ambiguous job name 

3 non-existent job name (or job number > 77) 

4 address out of bounds (either in your 
core image or in his) 

5 job not logged in 

6 block too large (more than IK) 

The JOBRD UUO allows you to read a block of data out of the core image of another job. The 
data is BLTed from his core image to yours. AC should contain the address of a three word block, 
the first word of which should contain either the sixbit name or the number of the job whose data 
you wish to copy. The left half of the second word should contain the negated count of the 
number of words to be read; the right half of the second word should contain the address of the 
block in the other job that you want to copy. The third word should contain the address in your 
core image where you want the data to be put. The maximum sire block that can be read using 
this UUO is IK (-1024 words). 

If this UUO fails for any reason, the direct (error) return is taken and a code indicating the cause 
of failure is placed in ADR+1. A list of the possible error conditions and their codes is given 
above. If this UUO succeeds in transferring the data, the skip return is taken. 



LOCK tOP-047, ADR-400076] CALL1 400076 

LOCK AC, 

The LOCK UUO is used to lock your job in core so that you can be sure that you will not be 
either swapped out or shuffled in core. Upon return from this UUO, you will have been locked in 
core and AC will contain your job's protection-relocation constant. Your protection constant (in the 
left half of AC) is the highest address in your core image and always ends in 1777. The relocation 
constant (in the right half of AC) is the value that is added to each memory address you reference, 
in order to get the real memory address of the desired word in your core image. 

Jobs with upper segments are not allowed to lock themselves in core. 

To undo the effect of the LOCK UUO, you can use the UNLOCK UUO (see below) or the 
RESET UUO (see page 126). Any system-detected error condition will also cause an UNLOCK to 



134 Misc. UUOs 11. 



be done, as will any attempt to change your core size with the CORE UUO (see page 87). The 
LOCK UUO itself will first do an UNLOCK before locking you in. 

The LOCK UUO should be used only when really necessary. When users are locked in core, there 
is less core available for normal users who are being swapped in and out; and when there are or 
have recently been two or more users locked in core, there is the possibility of having a hole in core 
that cannot be used (except for other locked jobs). A job that must remain locked in core for some 
time should give the LOCK UUO over again whenever there is a chance to do so because this 
causes the job first to be unlocked, then shuffled to fill any hole and finally locked again. 



UNLOCK [OP=047, ADR=400077] CALL I 480877 

UNLOCK 

The UNLOCK UUO is used to unlock your job from core after you have used the LOCK UUO 
(see above) to lock it. Many other things also cause an UNLOCK to be done. These are listed 
under the LOCK UUO above. 



SETDDT [OP=047, ADR=2] CALL1 2 



MOVEI AC.oddress of DDT or RAID> 
SETDDT AC, 

The SETDDT UUO is used to tell the system the starting address of DDT or RAID in your core 
image. This address is saved in JOBDDT in your job data area (see Appendix 4); however, you 
are not allowed to change this value directly-you must use this UUO instead. The DDT monitor 
command starts your program at the address contained in JOBDDT if that address is non-zero. 



SPWBUT [OP-047, ADR-400000] CALLI 400000 

SPUBUT AC, 

The SPWBUT UUO returns in the AC the value of the spacewar buttons. Each spacewar button 
controls one bit in this value. The bit is a one if the circuit represented by that bit is open and a 
zero if the circuit is closed. Only bits 22:26 and 28:35 (the 0..37377 bits) are currently wired up. If 
the buttons are unplugged, the wired-up bits will all be on (value of 0..37377). 

The regular spacewar buttons only utilize the low-order 8 bits (bits 28:35-the 0..377 bits). At the 
time of this writing, these buttons use normally-closed switches (bit values of zero) except that the 
switch for bit 34 (the 0,,2 bit) is normally open (bit value of one). This means that with the 
buttons plugged in and not depressed, the value of the spacewar buttons is 0,,37002. No claim is 



11. Misc. UUOs 135 



made, however, that new buttons will not replace those that are described in this paragraph. To be 
sure what kind of switches are in the buttons, find and examine the buttons yourself. 



EIOTM [OP-847, ADR-408885] CALL I 488085 

EIOTN 

The EIOTM UUO puts you into IOT-USER mode, in which opcodes from 700 up are executed as 
machine I/O instructions rather than as UUOs. This mode is described further in Appendix 3. 



12. Obsolete UUOs 137 

SECTION 12 
OBSOLETE OR OTHERWISE USELESS UUOS 



This section documents some UUOs that still work but which, for various reasons, are obsolete. 
Mentioned at the end of this section are some other UUOs that are ever more obsolete in that they 
do not work. In general, there are better ways to do the things all of these UUOs do, but the 
documentation is included for completeness and for the benefit of people trying to decode rusty old 
programs which use these UUOs. Users are to be discouraged from using these in any new pieces 
of code. 



12.1 Old UUOs 
Here are some UUOs that still work although they are generally unnecessary. 

INTIIP [OP-047, ADR-400031] CALLI 488831 

INTIIP AC, 

The INTIIP UUO is designed to be given by a process running at interrupt level. It returns in 
AC the bit representing the source of the current interrupt. This is a copy of the value of 
JOBCNI at the time your interrupt-level routine is started up. Thus it is much more efficient to do 
a MOVE AC.JOBCNI and the results are the same. If you give this UUO when you are not at 
interrupt level, then zero is returned in AC. 

USKIP [OP-047, ADR-400041] CALLI 408041 



USKIP 

<return if no UUO in progress> 

The USKIP UUO can be used by an interrupt-level process to determine if the interrupted 
program was in the middle of executing a UUO. USKIP will skip if there was a UUO in progress 
at the time the interrupt occurred and will take the direct return if no UUO was being executed. 
Thus this UUO will tell you whether a UWAIT will return immediately. The same information 
can be obtained by examining the user-mode bit (bit 5--the 10000..0 bit) in JOBTPC; the 
user-mode bit will be on unless a UUO was in progress. 

The USKIP UUO is illegal except at interrupt level. 



138 Obsolete UUOs 12.1 

LIOTM [OP-047, ADR-400006] CALL I 400006 

LIOTM 

The LIOTM UUO gets you out of IOT-USER mode, thus making opcodes over 700 into UUOs 
again. However, this function can be achieved without doing a UUO at all. For instance, the 
instruction 

JRST 2. [.+!] 
will also get you out of IOT-USER mode. See the writeup of IOT-USER mode in Appendix 3. 

RUNMSK [OP-847, ADR-400046] CALLI 400846 



NOVEI AC, <processor enable bits> 
RUNMSK AC, 

The RUNMSK UUO is intended to allow you to select which processor (the PDP-10 or the 
PDP-6) should run your job. However, the PDP-6 is not capable of running jobs; thus this UUO 
is useless. 



DDTIN [OP-047, ADR-1] CALLI 1 



MOVE I AC, ADR 
DDTIN AC, 

ADR: <21 word block for returned characters> 

The DDTIN UUO is used to read in all characters that have been typed on the terminal attached 
to your job. This UUO does not wait for any special activation character; it just reads whatever is 
in the TTY input buffer and returns those characters in the block pointed to by the contents of 
AC. This block should be at least 21 words long in order to hold all the characters being read; at 
most =84 characters will be read. The characters are returned as an ASCIZ string at ADR (7 bits 
per character, 5 characters per word, with a null (zero) byte after the last character read). 

If the TTY input buffer is empty, this UUO will not return until a character is typed. Thus at 
least one character is returned each time this UUO is given. 

TTYUUO (see Section 3.3) provides generally more convenient ways of reading characters from 
the terminal. 



12.1 Old UUOs 139 



DDTOUT [OP=047, ADR-3] CALLI 3 



MOVE I AC, ADR 
DDTOUT AC, 

ADR: <ASCIZ string to be typed out> 

The DDTOUT UUO types out an ASCIZ string on the terminal. AC should contain the address 
of the first word of the string. The string is terminated by the first null (zero) byte. The OUTSTR 
UUO (see page 39) is the recommended way of typing out strings although this UUO still works. 



CETCIIR [OP-047, ADR-6] CALLI 6 



MOVE AC, [<device name in sixbit, or channel numbeo] 
GETCHR AC, 

The GETCHR UUO does exactly the same thing as the DEVCHR UUO; see page 33. 



SETNAM [OP-047, ADR-400002] CALLI 400002 

MOVE AC, toixbit job name>] 
SETNAM AC, 

The SETNAM UUO is used to change your job name to that given in the AC. Any job name is 
legal. This UUO does exactly the same thing as the SETNAM UUO which is CALLI 43. 



SEGSIZ [OP-047, ADR-400022] CALLI 400022 

SEGSIZ AC, 

The SEGSIZ UUO returns in AC the size of your upper segment. The size returned is the 
protection constant of your segment, i.e., the number of words in it minus one. If you have no 
upper segment attached, zero is returned. 

This segment size can be found out more easily by looking at JOBHRL in the job data area (see 
Appendix 4). 



MO Obsolete UUOs 12.2 

12.2 Privileged UUOs 

The UUOs listed below are privileged UUOs designed for use only by the LOGIN and 
LOGOUT programs. 

LOGIN [OP=047, ADR=15] CALLI 15 

LOGOUT [OP-047, ADR = 17] CALLI 17 



12.3 Useless UUOs 

Each of the following unimplemented UUOs is either illegal or a no-op. 

DDTGT tOP-047, ADR-5] CALLI 5 

DUTRL [OP=047, ADR=7] CALLI 7 

TRPSET [OP=CH7, ADR-25] CALLI 25 

TRPJEN [OP=047, ADR=26] CALLI 26 

GETSEG [OP=047, ADR=40] CALLI 40 

CETTAB [OP=047,ADR=41] CALLI 41 

SPY [OP=047, ADR=42] CALLI 42 

GDPTIM [OP=047, ADR -400065] CALLI 400065 

XPARMS [OP-047, ADR=400103] CALLI 400103 

[OP=042] 

[OP=044] 

[OP-045] 

[OP-046] 

[OP=052] 

[OP-053] 

[OP=054] 

[OP=700] 



13. I/O Devices 141 

SECTION 13 
INDIVIDUAL DEVICE DESCRIPTIONS 



This section reveals the idiosyncrasies of each of the various I/O devices and of the system in- 
handling these devices. Each device is described in a separate subsection. For features common to 
all (or most) of these devices, consult Section 2. For the common bits in the device I/O status word, 
see specifically Section 2.6. 



13.1 The Disk 



Disk storage is organized by files. Each file is allocated one or more disk tracks depending on the 
size of the file. Each track is 2.25K words long and consists of =18 records of -128 (200 octal) 
words each. All disk activity is in terms of whole records. In buffered mode, this means that 
exactly 200 words of data are transferred for each buffer, regardless of the actual buffer size; thus 
using a non-standard size buffer for disk I/O should not be attempted. In dump mode an output 
command to write a number of words that is not a multiple of 200 will cause the last record written 
by the command to be filled with zeroes. These zeroes will not be included in the word count for 
the file if and only if they are part of the last record in the file. 

Warning: With a dump mode output command indicating an odd number of words, the low order 
4 bits (the 0,,17 bits) of the last word will be written out as zero regardless of their actual values. 
Thus to ensure that a dump mode output does not lose any data, you should make sure either that 
there are an even number of words in the transfer or that the last 4 bits of the last word do not 
hold any significant data (for instance you can add a zero word after the last normal data word). 

In buffered mode, disk I/O is optimized to account for track boundaries. On output, this means 
that filled buffers will not actually get written out until there is only one empty buffer left or until 
enough buffers have been filled to finish out a whole track. On input, as much of a whole track as 
will fit into your buffers is transferred all at one time. 

Each file belongs to some project-programmer name (PPN). The directory of all files of a particular 
PPN exists as a file 1) whose name is given by the sixbit PPN word (project right-justified in the 
left half, programmer name right- justified in the right half), 2) whose extension is .UFD and 
3) whose own PPN is [1,1]. Thus the file FOOBAZ.UFDQ, 1] is the directory for the disk area 
[FOO.BAZ]. The directory for the disk area [1,1] is the file " 1 1. UFD [1,1]", which contains 
the names of, and pointers to, all the directory files. 



142 I/O Devices 13.1 



Each directory file consists of a number of 4-word entries, each of which either points to a file or is 
unused. These 4-word entries have the following format: 

<f i I e name> 

<file extension>, , <creat ion cJate> 
<protection, mode, and time/date written> 
<poi nter to f i I e> 

The first three words are exactly the first three words you get back from a successful LOOKUP 
(see page 21). The <file name> of an entry not in use is zero. 



Long Block LOOKUPS, ENTERs and RENAMES 

It the 0..400 bit (bit 27) is on in the device status word when you give a LOOKUP, ENTER or 
RENAME UUO for the disk, then the UUO uses a 6-word block rather than the usual 4-word 
block (see these UUOs starting on page 21). An ENTER using the 6-word block will set the file's 
date and time written directly from the third word of the block rather than from the current time 
and date. 

The fifth word of the block is supposed to hold the date and time the file was last referenced, in the 
same format as the date and time written; however, after setting up this word when the file is 
created, the system never updates it. The sixth word of the block contains the date the file was last 
dumped on magnetic tape for disk backup. The format of this word is as follows: 

Bits Octal Meanings of fields in dump-date word 

4 20000..0 This bit is a one if this dump-date word is invalid. 

24:35 0..7777 This is the date last dumped, in system date format 

(see the DATE UUO on page 85). 

400000,,0 This bit is a one if the file was last dumped on a 

temporary class dump. This bit is zero if the dump 
was of system permanent class. 

9:20 777,,700000 These bits hold the number of the tape on which the 

file was last dumped. 

1:3 340000,,0 These bits hold the number of times this file has been 

dumped in permanent class dumps. 



13.1 The Disk 143 

Record Offset 



In the normal case, the data in a disk file starts in the first record of the first track allocated to the 
file. However, it is sometimes convenient to use the first few records of a file to store special data 
which is associated with the file but which is not really part of the file. To this end, the record 
offset feature was added to the disk system. This feature allows a user to hide any number of 
records at the beginning of a file simply by specifying the physical record number of the first record 
of the normal part of the file. When this is done, any program doing normal disk I/O with this file 
will never see the hidden records; however, any programs that need to access the hidden part can 
do so easily. 

In a disk file, logical record number 1 is the first record of the normal part of the file. The last 
hidden record is logical record number 0, and preceding records are given successive negative 
numbers. Thus, in a file with N hidden records, the first physical record of the file would be logical 

record number -N + l, the remaining hidden records would be numbered, -N+2, -N+3 -1, and 0. 

The first logical record of such a file would be physical record number N+l. 

To access the hidden records (which come before logical record 1), use the USETI and USETO 
UUOs (see Section 2.13) with the appropriate logical record number. Note that in these UUOs the 
effective address is interpreted as a signed twos-complement number which specifies the logical 
record number of interest. 

To set the record offset for a file, a special form of the MTAPE UUO for the disk is used. 
MTAPE for disk has several uses; you indicate the one you want by specifying a function number 
along with the MTAPE UUO. The function number for the set-offset UUO is 21. Another 
MTAPE (function number 20) can be used to retrieve the current value of the record offset. In 
both cases the actual offset number used is the physical record number of the first logical record of 
the file, i.e., the number of hidden records plus one. The get-offset and set-offset UUOs are 
described in detail below in the MTAPE writeup; see MTAPEs with function numbers 20 and 21. 



Disk I/O Status Word Summary 



Bits Octal Name Meaning of a 1 

27 0..400 DMPBIT Use 6-word blocks in LOOKUP, 

ENTER and RENAME. 

28 0..200 GARBIT Suppress error message when disk is full 

or bad retrieval from LOOKUP, 
ENTER or RENAME; take error return 
instead. 



144 I/O Devices 13.1 

MTAPE UUOs for the Disk 



MTAPE tOP=072] 

_____. __________________________ .-. 

MTAPE <channel number>,ADR ; MTAPE form for the DISK 

ADR: SI KBIT /GOOnOD/ 

< function number > 

<other arguments depending on function> 



This form of the MTAPE UUO is used to do special things with the disk. The exact meaning of 
this UUO depends on the function number in ADR + 1. Some of the functions are explained below 
along with descriptions of what the block at ADR should contain when the UUO is called for that 
function. If you need to know about any of the functions not mentioned here, see a systems 
programmer. 

To do any of the following functions, you must have INITed or OPENed the disk on the channel 
indicated by the AC field of the UUO; some of these functions also require that a file be open on 
this channel. Finally, some functions take the skip return on success and the direct return on 
errors; other functions always take the direct return. See the writeups below for details. 



ADR: SIXBIT /GODflOD/ ;GET USET POINTER 


Function for a disk MTAPE gives you the current value of the USET pointer for the file open 
on this channel. This is the value which can be set by a USETI, USETO or UGETF UUO (see 
Section 2.13). The pointer is returned in ADR+1 (where the was). 



ADR: SIXBIT /GODMOD/ ; INCLUDE RECORD IN FILE 

16 ;This function takes skip return on success. 

<record number> 

Function 16 for a disk MTAPE allows you to include an existing record in the word count for a 
file. This is useful if you have managed to write out some data to extend a file but the file was 
never closed (system crash, etc.). The number of the last record you wish added to the file should 
be in ADR +2. If this function is successful, the skip return is taken and the USET pointer for the 
file is left pointing to the indicated record with IODEND (end of file flag) cleared. (If the record 
specified is not beyond the end of the file, the only result will be to have changed the USET pointer 



13.1 The Disk 145 



and to have cleared IODEND, and the skip return will be taken.) If there is no file open on this 
channel, or if the record you specified does not exist, the direct (error) return is taken. 



ADR: SIXBIT /GODtlOD/ ; UPDATE RETRIEVAL 
17 

Function 17 for a disk MTAPE forces all pointers and header information for the file being 
written on this channel to be updated. This is mainly useful when extending a file in Read-Alter 
mode. After this function has been executed, all the data written into the file is included in the 
letneval. So if the system crashes, the word count for the file will be up to date. 



ADR: SIXBIT /GODMOD/ ;GET RECORD OFFSET 
20 

<record number returned here> 
<physi ca I file length returned here> 

Function 20 for a disk MTAPE returns the physical record number of the first logical record of the 
file open on this channel. This record number is returned at ADR+2; the physical length of the file, 
including any hidden records, is returned at ADR+3. See the section above on the record offset 
feature. 



ADR: SIXBIT /GODMOD/ ;SET RECORD OFFSET 
21 
<physical record number of first logical record> 

Function 21 for a disk MTAPE is used to set the record offset for the file open on this channel. 
The physical record number of the record which is henceforth to be considered the first logical 
record of the file should be in the specified at ADR+2. If this function succeeds, the skip return is 
taken. If there is no file open on this channel, or if some other error occurs, then the direct (error) 
return is taken. See ttte section above on the disk file record offset feature. 



MG I/O Devices 



13.2 



13.2 Terminals 



Here are the meanings of some of the bits in the TTY I/O status word. 

Bits Octal Name Meanings of 1's in TTY 1/0 status word 



400..0 



26 0..1000 



27 0,,400 



28 



0..200 



TPMON The terminal is in monitor mode. This 
bit is usually turned off when your job is 
running, but you can make it stay on by 
giving a CSTART or CCONTINUE 
monitor command. When this bit is on, 
your program will not be able to get any 
input frorri the terminal because all the 
characters will be going to the monitor's 
command decoder. 

1OSUPR Control-O ([ESCAPE] O on displays) 
has been typed. When this bit is on, 
nothing your program outputs to the 
terminal will be typed out. You can clear 
this bit by doing any TTY input 
operation or by re-initializing the TTY 
with an 1NIT or an OPEN. On 
teletypes, a second control-O will clear 
this bit as will [BREAK] O on displays. 

NOECHB Characters typed to the program running 
on this terminal will not have any control 
bits (CONTROL or META). echoed. 
Control bits are always echoed w.hen the 
TTY is in monitor mode (TPMON bit 
on--see above). The NOECHB bit can 
be turned on and off only by the IN1T 
and SETSTS UUOs, except that a 
RESET (see page 126) will clear this bit, 
thus turning echoing of control bits back 
on. 

NOECHO Characters typed to the program running 
on this terminal will not be echoed to the 
terminal by the monitor; see Section 3.1. 
This bit can only be turned on by UUO. 
A RESET (see page 126 will clear this 
bit, thus turning echoing back on. 



13.3 The Line Printer 147 



13.3 The Line Printer 



The line- printer (LPT) has its own character set which differs slightly from the system ascii 
character set (see Appendix 7). Because of this, the system normally does character conversion to 
insure that what you get is what you want. 

In addition, there are several extra characters on the line printer that have no ascii representation. 
To get one of these characters on the line printer, you send a 177 character followed by the 
appropriate code from the table below. 

Code Character 

000 Center dot. (A period moved up to center it.) 

011 Gamma. 

012 Small delta. 
01?. Integral sign. 

OH Plus-or-minus sign. 

015 Circle-plus sign. 

020 Skip to top of double form. 

021 Space down 1 line; write over page boundary. 

022 Space down 3 lines. 

023 Space down to next 1/2 page boundary. 

024 Space down to next 1/6 page boundary. 
177 Backslash. 

Line printer paper has 66 lines/page but the LPT usually skips to the top of form after -54 lines. 
This automatic page ejection can be overridden by use of the "177&'21 character in place of 
linefeeds. 

If you initialize the line printer with the 100 bit (bit 32) on in the mode (I/O status word), then the 
conversion from system ascii to line printer codes is inhibited. In this mode, you get the following- 
differences in characters: 

Code Mode Character Mode 100 Character 

030 (underline) - (left arrow) 

032 ~ (tilde) T (up arrow) 

100 e (at sign) ' (right quote) 

134 \ (backslash) } (close brace) 

136 T (up arrow) circumflex 

137 *- (left arrow) - (right arrow) 
140 ' (left quote) @ (at sign) 

174 | (vertical bar) \ (backslash) 

176 } (close brace) | (vertical bar) 

Finally, under normal circumstances, if the line printer runs out of paper, gets jammed, or suffers 
some other physical ailment, you will get a system error message from which point you can 
CONTINUE after correcting the situation. If, however, you initialize the line printer with the 200 



148 I/O Devices 13.3 



bit (bit 31) on in the mode (I/O status word), then when the LPT is ill an error bit will be turned 
on in the LPT status word and the error return will be taken by any OUTPUT UUO you try; no 
error message will be printed. 



LPT I/O Status Word Summary 



Bits Octal Name Meaning of a 1 

28 0,,200 ' HNGTRP No error message on hung device (see 

above). 

29 0..100 LPTNCC No character conversion (see above). 



13.4 



The XGP 149 



13.4 The XCP 



The Xerox Graphics Printer (XGP) provides a means of making a hardcopy listing of virtually 
any drawing that can be expressed as a one-bit raster. The XGP accepts as data a bit array 
describing rach scan line that is printed. Each scan line is approximately 1700 bits; scan lines are 
spaced at about 200 per inch along the paper. A picture is built by sending successive scan lines to 
the XGP. (The number of bits per scan line and the number of scan lines per inch are adjustable 
on the XGP and hence are not necessarily constants.) 

There are presently two distinct modes of operating the XGP: video mode and character mode. 



Video Mode 



In video mode, ?6-bit words are interpreted as video data. Words are grouped together into 
portions of a scan line by the use of a Group Command Word (GCW). The GCW precedes the 
data portion of the group and specifies how many words of video data are to be found in this 
group. Also the GCW allows the video data to be positioned anywhere along the scan line. The 
exact format of the GCW is given below. 



Bits Octal 
400000..0 



1:11 377700..0 



12:23 77,,770000 



24:29 0..7700 



Name Values of fields in GCW 

MARK If this bit is a 1, then after the data is 
sent the paper will be marked for cutting. 
Paper cutting is not exact so a MARK 
should be preceded and followed by 
several blank lines. 

LNSKIP The paper will be advanced by LNSKIP 
blank lines before printing. LNSKIP = 1 
is used for normal, single spacing. 
LNSKIP = prevents any advance to the 
next scan line and prints on the same line 
as the last group. 

COLSKP The column register in the XGP 
interface will be set to COLSKP before 
the data is transmitted. This means that 
the first data bit in this group will appear 
in this column. 

unused This field has no meaning currently. It 
should be set to zero to avoid confusion 
in case some meaning is attached to it in 
the future. 



150 I/O Devices 13.4 



30:35 0..77 DWCNT DWCNT words following the GCW will 

be transmitted to the XGP as video data 
(for each bit, means white, 1 black). 
The word following those DWCNT 
words is then taken to be another GCW. 
If DWCNT = then there are no data 
words in this group and the next word is 
another GCW. 

Modes 17 and 1 17 are used for video data. These modes accept the format that is described above. 

In mode 17, the effective address of the OUTPUT UUO points to a standard dump mode 
command list. The command list specifies the data to send to the XGP. Each OUTPUT will wait 
until the entire command list is processed before returning to the user. The paper will be cut at the 
completion of each command list. 

Mode 1 17 is like mode 17 except that the OUTPUT UUO returns to the user while data is being 
sent to the XGP. In this mode the user can overlap the input of one data block with the output of 
another. Three data blocks are needed in this mode: one being emptied by the XGP, another 
pending, and another being filled by the user program. The first two OUTPUT UUOs will return 
immediately (having established the current and pending output blocks). After the user fills his 
third block and gives an OUTPUT UUO he will be forced to wait until the current block is empty 
(at which time the pending block becomes current and the block specified in this OUTPUT will 
become the new pending block). When the third OUTPUT returns, the first block will be free to 
use. In video mode the XGP requires up to 10,000 words of data per second. Care should be 
exercised in programming to always have data ready for the XGP. 

Another requirement of mode 117 is that the command lists that point to the three data blocks 
must be disjoint. The actual requirement is that the command list for each block must be valid 
while the block is being output. In particular, don't use the same physical location in your program 
for more than one command list. 

In mode 117 you must do a CLOSE UUO after the last OUTPUT to force the transmission of all 
buffers to the XGP. It is possible that a user program may not be able to supply data fast enough 
in mode 117. In this event, the paper will be cut wherever the data runs out. A status bit, (bit 
25--the 0..2000 bit, IOTEND), is provided which warns the program that this has occurred. This 
bit is set only in mode 1 17 when the data runs out and no CLOSE has been done. 



Character Mode 



In character mode, the XGP can be used to print text using one or more fonts and to draw vectors. 
Modes and 13 are the character modes for the XGP. In these modes, each 36-bit word is 
interpreted as five 7-bit bytes. There is no fixed mapping between byte values and particular 
graphic symbols. The graphic symbol for any byte is defined by the current font in use. Certain 
byte values have special meanings consistent with ascii, and one byte value, octal 177, is used as an 
escape which gives the bytes that follow a special meaning. 



13.4 The XGP 151 



Character mode permits vectors and multiple active text lines. The 7-bit bytes taken from the 
user's buffer are interpreted as follows: 

Byte Value Usual meaning Escape significance 






Null byte is ignored 


Normal 


1 


Normal 


XGP ESCAPE 1 


2 


Norma 1 


XGP ESCAPE 2 


3 


Normal 


XGP ESCAPE 3 


4 


Normal 


XGP ESCAPE 4 


5:18 


Norma 1 


Reserved 


11 


TAB 


Norma 1 


12 


LF 


Normal 


13 


Normal 


Reserved 


14 


FF 


Normal 


15 


CR 


Normal 


1G:37 


Normal 


Reserved 


40:176 


Normal 


Normal 


177 


ESCAPE 


Normal 



Normal means that the definition of this byte in the current font will be printed. If this byte is 
undefined in the current font, it will be ignored. 

ESCAPE means that the next byte will have an alternate meaning selected from the column Escape 

significance. 

TAB produces a column select to the first column which is at least the width of a blank to the right 
of the current column position, and some multiple of 8 blank widths to the right of the left margin. 

LF activates the current text line. The current text will be queued to be printed. The default 
Y-position of text will be advanced by the number of scan lines it takes to draw this line, plus the 
number of scan lines specified by the interline space argument to the margin set function of the 
XGP MTAPE DUO (see page 154). This default Y-position will be used for the next text line 
(unless changed by a vector command or ESCAPE 3). 

FF, like LF, activates the text. In addition, FF causes a page eject after the current text line is 
printed. FF also sets the default Y-position to the first line below the top of page margin on the 
new page. 

CR causes a column select to the current left margin to be generated. 

XGP ESCAPE 1 ('177&'OOI) causes the next 7-bit byte to be read as a special operation code. The 
following codes are implemented: 

Code XGP ESCAPE I meaning 

0:17 Font select. The code, to 17, is taken as the font identification 
number of the font to be used. 

20:37 Reserved for future use. 



152 I/O Devices 13.4 



40 Column select. The next 14 bits (2 bytes) are taken modulo =4096 as 
the X-position to print at next. (The intention is to allow 
arbitrary-width spaces for text justification.) 

41 Underscore. The next 7-bit byte is taken in two's complement as the 
relative number of the scan line on which the underscore is to occur, 
where zero represents the baseline of the text, negative values represent 
lines above the baseline and positive values lines below it. The next 
14 bits (2 bytes) are taken modulo 4096 as the length of the 
underscore. (If the underscore command is the first thing on a line, the 
baseline will be set to the baseline of the current font.) 

42 Line space. This does a linefeed and then takes the next byte as the 
number of blank scan lines to insert. 

43 Base-line adjust. The next 7 bits are taken in two's complement as the 
base-line adjustment to the current font. The adjustment sticks until 
reset by another adjust command or a font select. The intention is to 
allow a font to be used for subscripts and superscripts. (Increment 
baseline for superscript, decrement for subscript. Values 0:77 are 
increments; 100:177 are decrements: 100 means -100, 177 means -1.) 

44 Print the paper page number. The paper page number is set to 1 by a 
form feed. It is incremented each time the paper is cut. The decimal 
value of this count is printed. 

45 Accept heading text. The next byte is a count of bytes to follow. 
Those bytes will be read into the heading line. When that count is 
exhausted, the heading line will be printed. When a linefeed or line 
space command is given that would cause text to be printed below the 
current text area, a form feed is inserted by the XGP and if a heading 
is defined, it will be printed. 

46 Start underline. Set the left end of an underline. See the stop 
underline command below. 

47 Stop underline. The next byte is the scan line on which to write the 
underline (same as in XGP Underscore, 41 above). The extent of the 
underscore is defined by this command and the start underline 
command. If this command is not preceded by a start underline 
command, the results will be unpredictable. No underline will happen 
until this command is given. Beware of column selects. 

XGP ESCAPE 2 ('177&'002) causes the next 7-bit byte to be taken as a twos-complement column 
increment. Values 0:77 are positive increments; 100:177 are negative increments: 100 means -100, 
177 means -1. 

XGP ESCAPE 3 ('177&'003) causes the next 2 bytes to be taken as the scan line number on which 
to start this text line. Scan line is the first scan line on the page (immediately following the cut). 



13.4 



The XCP 153 



The topmost scan line of the present text line will be placed on the scan line indicated in this 
command. If there is no current text line, the next text line will be put there. 

XGP ESCAPE 4 C177&'004). This escape is used to specify a vector. It is followed by -11 bytes 
describing the vector: 

2 bytes of Y0 Scan line number of first line of vector. 

2 bytes of X0 Column position of left edge of first line of the 

vector, 

3 bytes of DX Delta X. 1 bit of sign; 11 bits of integer; 9 bits 

of fraction. 
2 bytes of N The number of scan lines on which this vector is 

visible. 
2 bytes of U The column width of each scan line. 

The XGP service must be presented with vectors sorted by ascending values of YO. If the vectors 
are not sorted, the output will be wrong. 

The escape significances of codes 5 through 10, 13, and 16 through 37 are not defined at the 
present time but are reserved for future use. 



XCP I/O Status Word Summary 



Bits Octal 

18 0..400000 

19 0..200000 



20 0,, 100000 

25 0..2000 



Name Meaning of a J 

IOIMPM Illegal mode, PDP-6 not responding, or 
XGP not responding. 

IODERR PDP-6 detected error: XGP reporting 
something wrong (out of paper, etc.), 
buffered mode data miss, or line too 
complex. 

IODTER Font Compiler lossage. 

IOTEND Data ran out before CLOSE given in 
mode '117. 



154 I/O Devices 13.4 

XCP MTAPE UUO 



The MTAPE UUO is used to provide extended control and status reporting of the XGP. 
MTAPE is not synchronized with the data stream except that certain MTAPEs imply CLOSE 
before their operation. 



MTAPE [OP=072] 

MTAPE <channel number >, ADR 



ADR: <function number> 

<other data depending on function number> 



An MTAPE which specifies a channel on which the XGP is open is interpreted as follows. The 
effective address of the MTAPE (ADR) points to a word containing a function number which 
determines the meaning of the UUO. The data at ADR + 1 and following depends on the function 
selected. 

Function Meaning 

Return error status. 
ADR + 1/ Major error code. 
ADR+2,3,4/ Error data (see below). 

1 Font compile and select. 
ADR+1/ Font file name in sixbit. 
ADR+2/ Font file name extension. 
ADR+3/ PPN of font file. 

ADR+4/ Font identification number: 0:17. 

Note: This function will skip if there is no error. 

The font named will be read by the font 
compiler. It will be assigned the font 
identification number that is supplied. The 
identification number is used only by font select 
commands. 

2 Read margins. 

ADR + 1/ Top of page margin. 
ADR+2/ Page body size. 
ADR+3/ Bottom of page margin. 
ADR+4/ Left side margin. 
ADR+5/ Right side margin. 
ADR+6/ Minimum interline space. 



13.4 The XCP 155 

3 Set margins. 

ADR + 1/ Top of page margin; must be < 37777. 

ADR+2/ Page body size; must be 37777. 

ADR+?/ Bottom of page margin; must be < 37777. 

ADR+4/ Left side margin; must be < 3777. 

ADR+5/ Right side margin; must be < 7777 and > left margin. 

ADR+6/ Minimum interline space; must be < 3777. 

If the bottom of page margin is zero, there will 
not be any paper cuts. If the page body size is 
zero, there will be no paper cuts except that 
when a FF (formfeed) is encountered, the blank 
space specified by the bottom of page margin 
will be put out and then a cut will be made. 

4 Get status. 

ADR + 1/ The I/O device status word for the XGP. 
ADR+2/ -I if there is a data transfer in progress, 
otherwise. 

5 . Pseudo close. Hardly different from CLOSE UUO. 

6 Set node counts. 

ADR + 1/ Number of text nodes (default is -16). 
ADR+2/ Number of vector nodes (default is -100). 

If either node count is zero, the default value is 
used for that count. 

The number of nodes needed for text increases 
with the complexity of the text (number of font 
switches, etc.). The number of nodes needed 
for vectors is related to the number and size of 
the vectors. Generally the default numbers of 
nodes is sufficient, and when it is not, there may 
not be enough time for the PDP-6 to do the 
output correctly, even if the number of nodes is 
increased. 

Here are the meanings of the error codes returned from MTAPE function 0. 
Major Error Meaning 

No error. 

1 Font Compiler lossage: no job slots. 

Font Compiler lossage: no initial response. 
Font Compiler lossage: no intermediate response. 



156 I/O Devices 13.4 



4 Font Compiler lossage: illegal response. 
ADR +2 contains the FC response: 

Ready. 

1 Allocation made. 

2 Compilation done. 

3 Font compiler error. 

ADR*? contains the error type: 

Illegal command. 

ADR+4 contains the rejected command 

1 Not enough core. 

2 LOOKUP Failure. 

ADR+4 contains the LOOKUP error code. 

3 File error -- unexpected EOF. 

4 File error -- character redefined. 

5 Disk error. 

6 Logical font number too large. 

7 File error -- other illegal format. 

5 Interrupt-level data missed in buffered mode. 

6 XGP hung timeout. 

7 Illegal mode. 

10 Line too complex. The line compiler ran out of room while 
compiling a text line. 

1 1 Out of order. YO of a vector or text line is smaller than the 
last item (either vector or text) that was queued. That is, 
the input was not properly y-sorted. 

12 XGPSER missed. Somehow, the system has failed to start a 
vector or text node at the right place. Possibly there are too 
many vectors. 

13 Page too long. You started a vector below the bottom of a 
page. 

14 Illegal vector parameters. A vector you specified will go off 
the page. 



13.4 The XGP 157 

XGPUUO UUO 



XGPUUO is of interest only to the Font Compiler. This UUO is a no-op for everyone except the 
Font Compiler. 



XGPUUO [OP=947, ADR-40887S] CALLI 488075 



MOVE AC, [CSB,, NSB] 
XGPUUO AC, 

CSB and NSB are the addresses of 20 word blocks. CSB is the Current Status Block. The Font 
compiler reports it's state to the system by the data it puts in the CSB before giving this UUO. 
NSB is the New Status Block. The system issues commands to the Font Compiler by the data it 
stores in the NSB when returning to the Font Compiler from this UUO. This UUO will not 
return until the system has something for the Font Compiler to do. 

Word of the status block is the opcode. All subsequent words are operands. 

Opcode Meaning to FC from system Meaning to system from PC 

Go away now. No-op (ready). 
(System is finished with FC.) 

1 Allocate. Allocation made. 
(Word 1 has size (Word 1 has location 
to allocate.) of allocation.) 

Compile. Finished compiling. 

(File name, ext, PPN (Word 1 has location 

are in words 1, 2, 3; of base table.) 

word 4 contains the 
logical font number, 0:17.) 



158 I/O Devices 13.4 



3 Lock in cote. Compiler error. 

(System wants to (Word 1 contains 

send data to XGP.) error code; see below.) 

Error codes (in word 1 of block): 

Illegal command. Word 2 has the rejected opcode. 

1 Not enough core. 

2 LOOKUP failure -- font file was not found. 

Word 2 has the LOOKUP error code. 

3 File error -- unexpected EOF. 

4 File error -- redundant character. 

5 Disk error. 

6 Logical font number too big. 

7 File error -- other illegal format. 



13.5 



Dectapes 159 



13.5 Dectapes 



A dectape consists of a sequence of 1102 200-word blocks (numbered from to 1101) which can be 
allocated to dectape files. There several formats that have been used for allocating blocks to files. 
The format in use at Stanford is called old dectape format (or sometimes PDP-6 format). 
Stanford's system is capable of reading/writing only the old dectape file format. However, the user 
can read and/or write almost any block on a tape (block cannot be written because of the 
hardware) and can thus simulate any format desired (see the UDSD bit below). 



Dectape I/O Status Word Summary 



Bits Octal 
21 0,,40000 

29 0..100 



Name Meaning of a 1 

IOBKTL Dectape block number out of bounds. 

UDSD The system should treat the tape as if it 
had no directory. In this mode, the user 
can read and/or write blocks on the tape 
in any format he desires. The USETI 
and USETO UUOs (see Section 2.13) 
can be used to select which block will be 
read next and which block will be written 
next. The UGETF UUO (see page 31) 
will return a word whose left half 
contains the number of the next block to 
be read and whose right half contains the 
number of the next block to be written. 



Old Dectape Format 



In the old format (still standard at Stanford) block is not used, block 1 is the directory which 
contains names of and pointers to all the files on the tape, and blocks 2 through 1101 are available 
for data. 

Word of the directory contains: 
<LBU>,,5 

where <LBU> is the number of the last block in use on the tape. When you do a UGETF UUO 
(see page 31) this number gets incremented by one and the result is returned as the number of the 
block you may use. The "5" points to the word within the directory block where the file entries 
begin. 



IfiO I/O Devices 13.5 



Words H of the directory are not used at all. Words 5:174 are grouped in 4-word entries, one for 
each file on the tape. Thus a tape can hold a maximum of =30 files in the old format. The four 
words for each file contain exactly the information you get back from a LOOKUP, namely: 

<f i I c name> 

<extensi on>, , <number of first block of file> 

<date file nr i tten> 

<i-ihatever was in 4th word of ENTER block when file was created> 

A zero entry, marks the end of the directory. 

For files written in buffered mode, each block contains (at most) 177 words of data, with the first 
word of each block containing 

<BN>,,<UC> 

where <BN> is the number of the next block in the file, or zero if none, and <WC> is the count of 
data words in this block. 

Files written in dump mode have 200 words of data in each block and have no block-to-block 
pointers ur word counts. Such files are always written on consecutive blocks of the tape. When a 
user writes a dectape file in dump mode, no information is stored with the file to indicate how long- 
it is. Thus the user should include this information either in the data itself or possibly in the 
fourth word of the filename block when the ENTER is done. 



UTPCLR tOP=047, ADR=13] CALLI 13 

UTPCLR <channel number>, 



The UTPCLR UUO causes the directory of the dectape initialized on the channel indicated to be 
cleared. This means that the free block pointer is set to point to block number 2 and all file entries 
in the directory are zeroed. The tape can then be reused as if it were a new tape. This UUO is a 
no-op for all devices but dectapes. 



l.l.fi 



Magnetic Tapes 161 



13.6 Magnetic Tapes 



Dnta on magnetic tapes is written in files with each file being terminated with an end-of-file mark. 
The logical end of tape is indicated by two consecutive end-of-file marks with no intervening data. 

(The mag tape is not a directory device. No filenames are associated with mag tape files, and the 
LOOKUP, ENTER and RENAME UUOs are no-ops with mag tapes.) 



on mag tapes can be written in any of the standard modes. One of these is provided 
rsprcially for mag tapes: mode IB-dump record mode. This mode causes data to be transferred in 
200-word records, whereas normal dump mode (mode 17) transmits data in one large record. 



Magnetic Tape I/O Status Word Summary 



Bits Octal 

24 0..4000 

25 G.,2000 



26 O..IOOO 

27:28 0,,600 



29 



0..100 



Name Meaning of a 1 

IOBOT The tape is at load point. 

IOTEND The physical end of the tape has been 
reached. If you reach the end of the tape 
while reading or writing, the IOIMPM 
error bit will also be turned on. 

IOPAR The tape is being written or read in even 
parity, which is non-standard. 

These two bits indicate the tape density: 
and 2 mean 556 bits per inch, 1 means 
200 bpi, and 3 means 800 bpi. Although 
800 bpi is the most efficient, 556 bpi is 
more reliable; 200 bpi is relatively 
inefficient. 

IONRCK No re-reading is to be done. Re-reading 
is usually done on both output and input 
when an error is detected. After =10 tries 
the system gives up and sets an error bit. 



MJ2 I/O Devices 13.6 

MTAPE UUO for Magnetic Tapes 
The following UUO is provided for doing all the special things necessary with mag tapes. 

MTAPE [OP=072] 

Pit APE <channe I number >, <funct ion number > 

If there is n mag tape open on the channel indicated by the AC field of an MTAPE UUO, then 
the above form of MTAPE is assumed. The effect of the MTAPE then depends on the function 
number appearing in the address field. The function numbers and their meanings are given below. 

Function Meaning 

Wait for any operation going on to complete. 

1 Rewind the tape. 

? Write an end-of-file mark on the tape. 

6 Advance the tape one record. 

7 Backspace the tape one record. 

10 Advance the tape to the logical end of tape. Logical end of tape 
is signified by two consecutive end-of-file marks. The tape is left 
positioned after the second mark by this operation. 

1 1 Rewind the tape. 

13 Write three inches- of blank tape. The purpose of this is to cause 

a bad spot on the tape to be ignored. Perfectly blank tape looks 
like an end-of-record mark to the controller and is ignored. The 
monitor automatically writes blank tape over bad spots on the 
tape. 

16 Advance the tape one file. The tape is positioned after the 
end-of-file mark that terminates the file. 

17 Backspace the tape one file. The tape is positioned before the 
end-of-file mark at the end of the previous file. 



13.7 Paper Tape Puncli/Plotter 163 

13.7 Paper Tape Punch/Plotter 

The paper tape punch and the plotter are considered the same device by the system; this device has 
the sixbit name FTP. There is a switch on the PDP-6 that determines whether data output to the 
PTP actually goes to the punch or to the plotter. This switch is normally kept in the plotter 
position. 

There are several different modes in which the PTP can be operated. Normally, only one of these 
(mode 10) is used with the plotter. Each mode and its meaning with the PTP are described below. 

Modes Meaning 

0,1 Character modes. Seven bit characters are punched with the 

eighth hole as an even parity bit. A delete (ascii 177) is punched 
after every carriage return, vertical tab and horizontal tab, and 30 
frames of blank tape are fed after every form feed. 

10,110 Image binary modes. The right-most eight bits (bits 2S:35--the 
0..377 bits) of each word are punched directly as the eight bits on a 
frame of paper tape. This is the mode used with the plotter 
because the bits are sent exactly as they appear in your buffer. 

13 Binary mode. Every word in your buffer is punched on 6 paper 
tape frames with 6 bits in each frame. The seventh hole is never 
punched and the eighth hole always is. 

14 Checksum mode. This mode is the same as mode 13 except that 
before each buffer is punched, the checksum of that buffer and its 
data word count are punched. These two numbers appear in the 
left and right halves respectively of the first word (6 frames) 
punched. After the data words have been punched, 30 frames of 
blank tape are fed and then a zero word is punched (a zero word is 
6 frames each with only the eighth hole punched). 

100,101 No-conversion modes. These are buffered character modes in 
which 7-bit characters are extracted from your buffer and punched 
in the first seven holes of each frame on the paper tape. The 
eighth hole is always punched and nothing special is done for any 
characters. 

113,114 No-eighth-hole modes. These modes are the same as mode 13 
except that the eighth hole is never punched. 



164 I/O Devices 13.8 

13.8 Paper Tape Reader 



The paper tape reader (PTR) has four distinct modes, which are very similar in operation to the 
first four modes of the paper tape punch. Each mode and its meaning is explained below. See also 
Section 1?.7 on the paper tape punch. 

Modes Meaning 

0,1 Character modes. From each frame on the paper tape a 7-bit byte 

is taken, with the eighth hole ignored. These 7-bit bytes are 
packed 5 to a word in your input buffer. Nulls (ascii 0) and deletes 
(ascii 177) on the tape are ignored. 

10 Image mode. Each frame on the paper tape is returned to you 

exactly as it appears on the tape, with each 8-bit frame placed in 
the low order bits (bits 28:35--the 0,,377 bits) of a single buffer 
word. 

13 Binary mode. Only those tape frames with the eighth hole 
punched are looked at in this mode. The seventh hole of each 
frame is ignored completely and the first 6 holes of each frame with 
the eighth hole punched are returned packed 6 frames to a buffer 
word. 

14 Checksum mode. This mode is the same as mode 13 except that 
the tape is assumed to contain a checksum and word count at the 
front of each buffer of data. The checksum is checked on input to 
insure accuracy of the transfers. 



13.9 User Disk Pack 165 

13.9 User Disk Pack 



A user with a large quantity of data that he needs to have available on high-speed storage can 
make use of a User Disk Pack (UDP). The UDP (physical name UDPO) can only be read/written 
in dump mode. A disk pack has -7600 tracks, numbered to -7599; the last track (number -7599) 
is used to hold a password. Each track consists of -19 records, numbered to -18; record is 40 
words long and each of records 1 to =18 is 200 words long. 

Unlike most other devices that can operate in dump mode, the UDP accepts not a list of dump 
mode commands but only a single dump mode command for each input or output operation. A 
UDP dump mode command consists of two words, the first of which is the same as a normal dump 
mode command and the second of which contains the UDP location where the transfer is to start. 
Thus a UDP dump mode command looks like this: 

-<word count>, , <in-core location of data>-l 
<record number>, ,<track number> 

where <track number> should be in the range from through -7598 and indicates on which track 
of the pack the transfer is to start and <record number> should be in the range from through 
=18 and indicates at which record within the specified track the transfer is to start. To effect a 
UDP data transfer, an INPUT or OUTPUT UUO is given with the effective address pointing to 
the dump mode command. 

Warning: When an output indicates that only part of a record is to be written, the remainder of 
the record is written with zeroes. Also, as with the disk, if an odd number of words are written out, 
the low order 4 bits (bits 0,,17) of the last word are lost and are written as zero. 

Before any data can be written onto a UDP, the program desiring to do the output must do an 
ENTER UUO to check the UDP password. The RENAME UUO is used to change a UDP 
password. Data can be read from a UDP without first giving the password. 

If a disk error occurs during a RENAME or ENTER UUO, then unless bit 28 (the 0,,200 bit) is on 
in the I/O status word, an error message (BAD RETRIEVAL) will be typed out and the program 
stopped. If bit 28 is on when bad retrieval is detected, the error return is taken and an error code 
of 10 is returned in the right half of the word after the password. 



ENTER tOP-077] 



ENTER <channel number >, ADR 
<error return> 

ADR: <password> 

<returned error code> 

An ENTER must be done to check the password before any data can be written on a UDP. The 
word at location ADR is compared against the password written on the UDP, if any. If there is no 



166 I/O Devices 13.9 



password on the UDP, if the UDP password is zero, or if the word at ADR matches the UDP 
password, then write permission is granted to the program and the skip return is taken from the 
ENTER. Otherwise write permission is rejected and the direct error return is taken with an error 
code of 2 (protection violation) returned in the right half of ADR + 1. 



RENAME tOP=055] 



RENAME <channel number >, ADR 
<error return> 

ADR: <new passuord> 

<returned error code> 

The RENAME UUO is used to change the password for a UDP. An ENTER must have been 
done to acquire write permission for the UDP. The password specified in location ADR replaces 
the old UDP password. A zero password means an ENTER (see above) will always succeed. If the 
change of password is successful, the skip return is taken. If no ENTER has been done, then an 
error message will be printed out and the program stopped. 



UDP I/O Status Word Summary 

Bit s Octal Name Meaning of a 1 

28 0..200 GARBIT Suppress error message on bad retrieval 

from ENTER or RENAME; instead take 
error return with code 10. 

The following I/O UUOs are illegal with the UDP: LOOKUP, USETO, USETI, UGETF and 
MTAPE. 



13.10 AD/DA Converter 167 

13.10 AD/DA Converter 



The Anatog-to-Digital/Digital-to-Analog Converter, hereinafter referred to as the AD (its physical 
name), nppiates only in clump mode. The only legal modes for the AD are 16 and 17. Mode 17 is 
the normal mode. In mode 16 each time a transfer is requested, it will not be started until bit 28 
(0..200 bit) of the spacewar buttons is on (see the SPWBUT UUO on page 134). 

Note that output from the AD operates only the 4-channel sound system. Input can come from 
various sources; see the explanation of the input channel number below. Data from or to the AD 
is in 12-bit bytes packed three to a word. 

Normally, an INPUT or OUTPUT will not return until the transfer is finished; however, if bit 29 
(O..IOO bit) is on in the AD status word, the UUO will return immediately so that you may overlap 
computation with the transfer, for instance if you are trying to keep transfers going continuously. 
To wait for the last transfer to finish, use the WAIT UUO (see page 27). 

The AD does not take standard dump mode command lists. Each INPUT or OUTPUT UUO 
should point to a 5-word block which should contain the following information: 

-<word count>,,<address of data block>-l 

<136 CONO bits> 

<AD CONO bits> 

<CONI bits from 136 returned here after transfer> 

<CONI bits from AD returned here after transfer 

The 136 is an interface for the AD. The CONO bits to the 136 interface should be 4250 for input 
and 3650 for output (unless you know about the 136 in detail). 

Here is an explanation of the AD CONO bits. 

Bits Octal Meanings of AD CONO bits 

18:23 0..770000 This is the AD multiplex input channel number. If 

auto-indexing is used, this is the beginning channel 
number. You can' find a list of the channel numbers 
and what devices they correspond to by looking at 
SAILON 21, Addendum 1.1, entitled AID Converter 
Multiplexer Patch Panel and Channel Assignments, 
by Edward Panofsky. The channel number is not 
pertinent for output. 

24 0..4000 Reset bit. This bit should be 1 for output, for 

input. 

25 0..2000 Input: auto-indexing. If this bit is a one, then when a 

sample has been transmitted, the multiplex channel 
number (see bits 18:23 above) will be incremented by 
one before the next sample is transmitted. 



1(58 I/O Devices 13.10 



26 0,,1000 Input: complement low-order bit of channel number 

after each sample. With this bit on, if you start out 
with either channel 16 or 17, for example, then 
samples will alternate between these two channels. 
With input, if both this bit and bit 25 are set, a 
logical conflict exists and nothing will happen. 

25:26 0,,3000 Output: number of channels of sound. In this field, a 

means 1 channel, 1 means 2 channels, 2 means 
nothing, and 3 means 4 channels. Samples are sent 
alternately to the number of channels indicated. 

30:32 0..70 Clock speed. The meanings of the different values 

possible for this field are: 0-free run, l--20KHz, 
2--25KHZ, 3--IOKHZ, 4--50KHi, and 5~100KHz. 
Free run means that as soon as one conversion is 
done another one is begun; the actual speed under 
this condition can be somewhat irregular and is 
probably somewhere between 100KHz and 200KHz. 
The 100KHz speed (5) is not very reliable. 

The system does no error checking for you so you must do your own with the bits returned in 
words 3 and 4 of the block. Of these bits, the only one that is really important is the 136 
data-missed bit, bit 23 (0,, 10000 bit) in word 3. If this bit is on, then a sample was lost in the 
transfer and you should do the transfer again. 

If you are running in continuous mode, (bit 29 set in status word), then the CONI words for the 
136 and the AD will not be returned unless- the device catches up with you. This is one way of 
testing for errors in continuous mode transfers; if you get the CONI words back, then either there 
was some data error (causing the device to finish early) or you did not supply/accept data as fast as 
the device could go. 

. , ...* 

Here is a sample input block to transfer 100 words to an address called ADR from channel 10 with 
a clock rate of 20KHz. 

I QUO 180, ADR 

4258 

108818 

8 



i 

Here is a similar output block. 

IOUD 180, ADR 

3650 

184810 







13.10 AD/DA Converter 169 

AD I/O Status Word Summary 

* 

Bits Octal Meaning of a 1 

29 Q.,100 Continuous mode. An INPUT or OUTPUT UUO 

will return without waiting for its transfer to 
complete. However, it will wait for any previous 
transfer still in progress (whether input or output) to 
finish before the UUO returns. Thus you cannot be 
doing both input and output simultaneously. 



170 I/O Devices 



13.11 



13.11 TV Cameras 



For reading the TV cameras, it is recommended that you use already existing routines rather than 
write your own. However, for those who are stubborn enough to want to do it themselves, here is 
an explanation of how to read the cameras. 

To read a television camera, you first INIT or OPEN device TV in mode 17 and then do dump 
mode inputs. The TV does not take standard dump mode command lists. The effective address of 
an INPUT UUO for the TV should point to a 4-word block that contains the following 
information: 

-<word count>,,<address of first word> 

<TV camera CONO bits> 

<TV camera DATAO word> 

<CONI bits from 167 returned here upon completion> 

Thus the first word of this block contains the negative of the number of words of data to be input 
and the address of the first word of the block where this data is to go. (Note that this is not 
standard IOVVD format!) The second word contains (in the right half) the CONO bits for the 
TV. These bits have the following meanings: 



Bits Octal 
18:20 0,,700000 



21:23 0..700000 



Name Meanings of TV camera CONO bits 

BCLIP The bottom converter clip level. Each 
sample is a 4-bit number representing the 
intensity at a given point. The =16 levels 
are taken from the voltage range specified 
by BCLIP and TCL1P (see below); thus 
you can control the camera's exposure 
setting from your program. A voltage of 
1.0 is put out at a very bright spot and a 
voltage of is put out at a completely 
dark spot. BCLIP indicates the voltage 
which is to represent a sample of zero. 
Only voltages above this value will 
produce non-zero samples. See the table 
below for the voltage levels indicated by 

the various possible values for BCLIP. 

. 

TCLIP The top clip level. This value 
determines; the voltage which is to 
represent the maximum sample value of 
17. All higher voltages will also produce 
a sample of 17. See BCLIP above and 
the table below showing voltage levels 
corresponding to the possible values of 
TCLIP and BCLIP. 



13.11 



TV Cameras 171 



Value BCLIP TCL1P 






.875 


1.000 


1 


.750 


.875 


2 


.625 


.750 


3 


.500 


.625 


4 


.375 


.500 


5 


.250 


.375 


6 


.125 


.250 


7 


.000 


.125 



24:26 0..7000 



CAMERA The camera number. There are eight 
possible camera numbers, but not all of 
them are wired in permanently. The cart 
camera is number 0, the Cohu camera is 
number 1, the Sierra camera is number 2 
and the Kintel camera is number 3. 

VRESOL The vertical resolution divided by two, 
minus one. A zero here gets you every 
other line, a one every fourth line, etc. 

This field must contain a 1. 

Horizontal 1/2-sample offset. If this bit is 
a one, the samples within each line will 
be taken from positions approximately 
1/2 sample width to the right of the usual 
positions. By doing two transfers, one 
with this bit off and one with it on, you 
can essentially double the horizontal 
resolution. 



Now here are the meanings for the bits in the DATAO word (third word of block pointed to by 
the INPUT UUO). 



27:29 0..700 

30:34 0..76 
35 0,,1 



Bits Octal 
0:8 777,,0 



Name Meaning of TV camera DATAO word 

YDISP The Y-coordinate displacement. Here 
is the top of the screen; the bottom is 
about 400. This is the Y-coordinate of 
the top line that you will receive. Since 
you can receive at most every other line 
(see VRESOL above), to get an entire 
picture you can read the picture twice, 
first with YDISP set to for the even 
numbered lines and then with YDISP set 
to 1 for the odd numbered lines. 



172 I/O Devices 13.11 

9:17 777,,0 XDISP The X-coordinate displacement. Here 

is the left side of the picture; the right 
side is approximately 515. 

18:26 0..777000 WWIDTH The width of the picture in words. Each 

word returned will contain 9 4-bit 
samples. WWIDTH specifies the number 
of words returned for each line. Thus 
you will get 9*WWIDTH samples per 
line. The range for this field is from to 
44. 

The data you get from an INPUT is packed 9 4-bit samples to a word. The first sample is from 
the upper left hand corner of the picture specified by the X and Y displacements, horizontal width 
and word count. Successive samples are from points just to the right of previous points until the 
end of a line, after which the next sample is from the leftmost point on the next line (the exact line 
depending on the vertical resolution). 

When the transfer is finished, the CONI bits from the IOP (the 167 data channel) are returned in 
the fourth word of the block pointed to by the INPUT UUO. Also, if an error occurred during 
the transfer and bit 29 (0,,100 bit) was on in the TV's device status word, then the address within 
your core image where the transfer was terminated is returned to you in the left half of the CONI 
word (fourth word of block). The important bits in this fourth word are explained below: 

Bits Octal Meanings of 1's in 167 CONI word 

30 0..40 DATA MISSED. A word (9 samples) was missed by 

the memory and the transfer was terminated. You 
cannot be sure that you have a complete picture; thus 
you should do the transfer again. 

31 0..20 NON-EX MEM. The camera referenced a 

non-existent memory location. This should never 
happen! 

32 0..10 JOB DONE. If the transfer has been completed 

successfully, then this bit will be on. If this bit is not 
on, then the camera is hung and not responding; for 
instance, the camera's power might be off or your 
specifications might have been illegal somehow. 



TV I/O Status Word Summary 



Bits Octal Meaning of a I 

29 0,,100 Return data address at time of error in left half of 

CONI word. 



13.12 The IMP 173 

13.12 The IMP 



The IMP is the interface between the system and the ARPA network. To do anything over the 
network, it is necessary to use the IMP. Before explaining usage of the IMP, I will define some 
network terms. However, these definitions do not describe all of the network protocol. Anyone 
writing a program that utilizes the network should first read the network documents in order to 
gain some understanding of the protocol involved. 

SOCKET; Any connection between two hosts involves two sockets, a send socket on one end and a 
receive socket on the other end. In a normal interaction, there will be two connections so that data 
can flow both ways; thus four socket numbers are involved: a local send socket number, a local 
receive socket number, a foreign send socket number, and a foreign receive socket numbers. These 
numbers are internal connection indices and are used to keep different interactions separate. Of 
these four socket numbers, each receive socket number must be even and each send socket number 
must be the odd number which is one greater than the receive socket number at the same end. A 
socket number is 32 bits long. 

RFC-Request For Connection: To establish a connection, the originating host sends an RFC to 
the destination host with a local socket number and a foreign socket number as arguments. The 
destination host can complete the connection by returning an RFC with the same socket numbers, 
or can refuse the connection by returning a close code. Normally two connections are made for full 
duplex. 

LINK: Once a connection is established, an 8-bit link number is assigned such that the 8-bit host 
number concatenated with the 8-bit link number is unique at both ends of the connection. During 
the lifetime of the connection, the link number is used to identity the connection to the IMP 
network. The IMP itself is programmed in such a way that only one message may be in transit on 
a particular link at a time. The IMP signals the sending host that the message has arrived by 
returning a RFNM (request for new message) with that link number as an argument. All of this is 
invisible to the user. 

ALLOCATION: The host to host protocol defines a kind of flow control on a higher level than the 
RFNM control. This is the allocation system. When a connection is first established, the receiving 
host sends a control message telling the sending host how many bits and messages can conveniently 
be buffered. The sending host must then not send more than that many bits or messages without 
waiting for more allocation from the__receiving host. Although much of this is unseen to the user, 
the user has control over how much allocation the system will give the remote host. For data and 
file transfer purposes, it is convenient to increase the allocation over the system default amount. 

BYTE SIZE: Associated with each connection is a byte size that specifies the type of data to move 
on that connection. The send side indicates in its RFC what the byte size of the connection is to 
be; the receive side of the connection has no choice in the matter. Stanford allows byte sizes of 1,2, 
3, 4, 6, 8, 9, 12, 16, 18, 32, and 36 bits. Most other hosts allow only 8, 32, and 36 bits. The 
standard TELNET connection is 8 bits with the rightmost 7 bits of each byte being an ascii 
character unless the high-order bit (200 bit) is on, in which case the character is a command to the 
receiving TELNET. A byte size is established for the life of a connection and may not be changed 
until the connection is broken. When you do IMP input (output), the data received (sent) is packed 
(unpacked) into (from) your buffers effectively with IDPB (1LDB) instructions using the connection 



17'1 I/O Devices 13.12 



byte size. Thus in buffered mode, after you have INITed the IMP, you should change your buffer 
header's byte pointer byte size to the connection byte size. In dump mode, you should unpack 
(pack) the data with ILDBs (IDPBs) using the connection byte size. 



IMP I/O 



The IMP is similar to any other sharable I/O device in that it may be initialized with an INIT 
and released with a RELEAS, but it is different in that one must first open a connection before one 
may exchange data. Connections are opened and closed separately for the receive side and the 
send side, even though the I/O channel number is the same. One may open and close connections 
libcrnlly without having to do more than one INIT. The INPUT and OUTPUT UUOs are used 
to read data from, and to send data over, the connection. The CLOSE UUO may be used to close 
one or both of the send and receive connections (the close-inhibit bits determine which sides are 
closed). To open a connection or to get one of several special functions, the user does an MTAPE 
UUO with the effective address pointing to a variable length table whose first word is a code 
number. This number determines the function of the UUO. These functions will be explained 
below, but first here are explanations of some bits relevant to the IMP. 

The status of a connection is contained in several places. The actual connection status is in a status 
word, one for each connection. If you have both a receive and a send connection, then you will 
have two status words. MTAPE 2 gives you these status words. The bits are decoded as follows: 

Bits Octal Name Meaning of a 1 

1 200000,,0 RFCS RFC sent. 

2 I00000,,0 RFCR RFC received. 

3 40000..0 CLSS Close sent. 

4 20000,,0 CLSR Close received. 

11 100..0 1NTINR Interrupt by receiver. 

12 40,,0 INTINS Interrupt by sender. 

The normal state of an open connection is 300000 in the left half, possibly with other bits on that 
are not mentioned above (some bits are used internally by the system). When a connection is closed 
or closing, CLSS or CLSR will be on. No more data may be transmitted or received over the 
connection at this point. The foreign host may send us interrupts. He can send an interrupt from 
receiver or an interrupt from sender. These can be received as user interrupts or can be tested for 
explicitly by MTAPE 14. Interrupts can be sent using MTAPE 11; interrupts generated by this 
UUO will not appear in the connection status words for the user generating them. 

More status bits occur in the I/O status word, which can be gotten with a GETSTS UUO, or 
examined with a STATZ or STATO UUO, or cleared with a SETSTS UUO. These bits are as 
follows: 



13.12 



The IMP 175 



Bits Octal 
25 0..2000 



26 0..1000 



27 0..400 



28 0..200 



Name Meanings of 1's in IMP HO status word 

HDEAD Host or destination IMP dead. This 
means that the last message sent stayed in 
the IMP network for a certain length of 
time without being eaten by the 
destination. In this case, the IMP flushes 
the message and sends us back a host 
dead message. 

CTROV Foreign host goofed and sent us more 
bits than we allocated him. The system 
closes the connection when this happens. 

RSET Foreign host sent us a reset, which asks 
us to clear all our tables of references to 
this host. The connection is closed. 
Some sites (including CMU and 
Harvard) will, as standard procedure, 
send a reset the first time we connect to 
them after their system has come up. In 
this case, trying again will succeed. In 
the more normal case, RSET means the 
host has just crashed and been brought 
up again. 

TMO Timeout occurred. Your job was in a 

wait state and timed out (see MTAPE 
17). 



User interrupts can be taken on a number of conditions. These are described below. See Section 9 
to find out how to enable and receive interrupts. 

Name Interrupt condition 

INTINR Interrupt from foreign receive side. 

INTINS Interrupt from foreign send side. 

INTIMS Status change. One or more of 'the bits 
CLSS, CLSR, RFCS, RFCR has 

changed. 

INTINP Some new input has arrived. The next 
INPUT UUO will not wait. The 
INTINP interrupt is generated every 
time a regular data message is received 



Bits 


Octal 


11 


100..0 


12 


40..0 


13 


20..0 



14 



IO..O 



176 I/O Devices 13.12 



by the system. One can test for data 
received and waiting in the system with 
an MTAPE 10 UUO. 



IMP MTAPEs 

Now on to the MTAPEs themselves. 

MTAPE [OP-8721 

flTAPE <channel number*, ADR 



ADR: < function number > 

<other data depending on function number> 



This is the general form of the IMP MTAPE UUOs. The function number specified at ADR 
determines the meaning of the UUO. What is expected and/or returned in the words following 
ADR is also dependent on the function number. The various functions are explained below. 

Some of these functions may go into a wait state. They will be awakened either because of their 
normal wakeup condition, or some special condition. Some of the special conditions that may occur 
are specified by the bits in the right half of the I/O status word. For instance, if you are waiting 
for input and a reset arrives, the job is awakened and RSET is set. An I/O error bit (one of 
1OBKTL, IODTER, IODERR, IOIMPM or IODEND) will be set if the wakeup was due to a 
special condition, so the normal IN and OUT UUOs will skip if the wakeup was not due to the 
normal wakeup condition. 

In any operation which expects the status word to be returned in word 1 (CONNECT, LISTEN, 
etc), an error code may be returned instead in the rightmost 6-bits. These errors are as follows: 

Code Name Meaning 

1 SIU Socket in use. There is already a connection on the 

specified local socket number. 

2 CCS Can't change socket numbers. This means a foreign socket 

number has already been set and an RFC received for this 
local socket number. You can't change the socket number 
because the foreign host already knows what it is. 

3 SYS Horrible system error. Can't happen. 

4 NLA No link available. System IMP capacity exceeded. 



13.12 Tlie IMP I 77 

5 1LB Illegal byte size. 

6 IDD IMP dead. 

Here are the various IMP MTAPE functions available. 



ADR: ! CONNECT 

ADR+1: <status bits returned here> 

ADR+2: <local socket number, 32 bits, r ight- just i f ied> 

ADR+3: <wait flag: non-zero for wait for connect ion> 

ADR+4: <byte size if sending, else byte size returned here> 

ADR+5: <foreign socket number> 

ADR+6: <host number, 8 bits, right- just i f ied> 

An RFC is sent to the host whose number is in word 6 with the local socket number taken from 
word 2 and the foreign socket number taken from word 5. If word 3 is non-zero, the user program 
goes into RFC wait until timed out (see MTAPE 17) or until an RFC with matching socket 
numbers and host number arrives. If a matching RFC has already arrived from the foreign host, 
this UUO wi|l not wait, but will complete the connection immediately. If you wish to open a 
receive connection, the local socket number must be even and the foreign socket number odd. To 
open a send connection, the local socket number must be odd and the foreign socket number even. 

If you are opening a receive connection (local socket number is even), and either the wait flag (word 
3) is on or a matching RFC was already waiting, then the connection byte size is returned in word 
4. If you are opening a send connection (local socket number odd), you must specify the connection 
byte size in word 4. 



ADR: 1 ;LISTEN 

ADR+1: <status bits returned here> 

ADR+2: < I oca I socket number> 

ADR+3: <wait flag: non-zero for wait> 

ADR+4: <byte size if sending, else byte size returned here> 

ADR+5: <foreicjn socket number returned here> 

ADR+6: <host number returned here> 

This function is used to listen for an RFC from a foreign host to a specific socket number here and 
to connect to that foreign host automatically when the RFC is received. If word 3 is non-zero, this 
UUO will wait for the connection to be made. 

When an RFC for the specified socket arrives from a foreign host, a connection is made. If the 
local socket number is even (receive side), and either the wait flag (word 3) is on or the RFC was 



178 I/O Devices 13.12 



already waiting for you, then the connection byte size is returned in word 4. If the local socket 
number is odd (send side), you must specify the byte size in word 4. The foreign socket number to 
which you get connected is returned in word 5; a -1 is returned if no connection has been made 
(wait flag off). The foreign host number is returned in word 6. 



ADR: 2 ;GET STATUS 

ADR+1: <status bits for local send side returned here> 

ADR+2: <status bits for local receive side returned here> 

This function returns the status bits for both the send side and the receive side of a connection. 
These bits are explained on page 174. If the connection is not open, zero is stored. If a reset has 
been received, both CLSS and CLSR will be on. 



ADR: 3 i TERMINATE CONNECTION 

ADR+1: <status bits returned here> 

ADR+2: < I oca I socket number> 

ADR+3: <Uait flag: non-zero to wait for close> 

This sends a close to the foreign host for the socket specified in word 2. If word 3 is non-zero, the 
job is placed in CLS wait until a return close is received, or the CLS timeout occurs (signified by 
TMO being on in the I/O status word). 



ADR: 4 jUAIT FOR CONNECTION COMPLETION 

ADR+1: <status bits returned here> 
ADR+2: <socket number> 

This is meaningful only if a CONNECT or LISTEN was given without waiting (word 3 = 0). In 
this case, the job is put into RFC wait until an RFC arrives or a timeout occurs. 



ADR: 5 ;DUMP MONITOR TABLES 

ADR+1: <numher of words of tables desired> 
ADR+2: odd^ess of place to put tables> 

This clumps the monitor tables into your core image. The format of these tables is much too 
lengthy to be discussed here, but is sort of described in IMPDDB[S,SYS] pages 6 and 7. The part 
that is dumped is after the label SYSTBS. 



13.12 The IMP l79 



APR: 6 jUAKEUP HA IN PROCESS 

This function is valid only when given at interrupt level. This will wake up the main process if it 
is in any wait state due to the IMP. It also sets TMO in the I/O status bits. 



ADR: 7 sGET SOCKET NUhBERS AND HOST-LINK NUMBERS 

ADR-i-1: <host-link number for send side> 

ADR-i-2: < I oca I send socket> 

ADR+3: <foreign receive socket> 

ADR+4: <host-link number for receive side> 

ADR+5: < I oca I receive socket> 

ADR+6: <foreign send socket> 

This function returns the above socket numbers and host-link numbers. A host-link number is a 
16 bit right-justified quantity. The first 8 bits are the host number and the last 8 bits are the link 
tiumber. 



ADR: 10 ; SKIP IF ANY INPUT PRESENT 

This function skips if there is input waiting that has not yet been 
transferred to the user's buffers. Otherwise the direct return is taken. 



ADR: 11 ;SEND INTERRUPT 

ADR+1 : <status bits returned here> 
ADR+2: < I oca I socket number> 

This function sends an interrupt by receiver (INR) if the socket number is even (receive side) and 
an interrupt by sender (INS) if the socket number is odd (send side). 



ADR: 12 i RESURRECT IMP IF DOUN 

This is a privileged UUO and is applicable only if the IMP system is down, in which case it 
attempts to bring it up. 



180 I/O Devices 13.12 



ADR: 13 ; BLESS HOST 

ADR+1: <host number> 

If a destination JMP returns a host dead message, a bit is set in the system and no further transfers 
are permitted to that host. This UUO clears that bit' and sends a null message to the host to see if 
he is still dead. 



ADR: 14 ;TEST AND CLEAR INTERRUPTS 

ADR+1: <-l returned here if any send side interrupts> 

AOR+2: <-l returned here if any receive side interrupts> 

This UUO tells you if you have received either an interrupt by foreign sender or an interrupt by 
foreign receiver. It also clears the interrupt condition. For each of the two types of interrupts, a 
minus one is returned if the corresponding interrupt has been received, and a zero is returned if no 
interrupt has been received. When one of these interrupts arrives, the corresponding bit (INTINS 
or 1NTINR) is set in the status word for that connection, and if you are enabled for that interrupt 
condition, a user interrupt is generated. 



ADR: 15 ; ALLOCATE 

ADR+1: <type code: for as specified, 1 for system max, 

2 for min, and 3 for system default values> 
ADR+2: <number of bits of allocation (for type = 0)> 
ADR+3: <number of messages of allocation (for type = 0)> 

This changes the allocation we have given the foreign host. If this UUO is not given, the system 
detank value is used, which is fairly small. The system maximum is 102-1 words, and the system 
minimum is 2 words. The default value is about =50 words. We allocate in two dimensions. We 
allocate both the number of bits and the number of messages he may send. Since free storage 
blocks are about =50 words long, the system maximum number of messages is 1024/50. If the 
function code (word 1) is 0, the new allocation is taken from words 2 and 3, clipped to fit within the 
system maximum and minimum, and set accordingly. Notice that if the connection is not yet open, 
this does not actually cause the allocation to happen, just sets the values that will be given. 
Allocation does not actually occur until the first IN (INPUT) UUO is given, or an MTAPE 10 is 
given. Do not expect any input interrupts until one of these UUOs has been given! If we do not 
allocate him anything, nothing will happen! 



I3.|2 The IMP 181 



ADR: 
ADR-i-1 
ADR4?: 
ADR+3 
ADRi-4 
ADR+B 
AUR+6 
ADR+7 
ADR+J 


i 
01 


1G 
< number 
<number 
<number 
cnumber 
<numher 
<number 
<number 
<number 


jGET ALLOCATIONS 
of bits ue have allocated him> 
of messages we have allocated him> 
of bits he has lef t> 
of messages he has left> 
of bits in free storage> 
of messages in free storage> 
of bits he has allocated us> 
of messages he has allocated us> 



Function 16 returns the above allocation values. 



ADR: 17 ;SET TinEOUTS 

ADR-t-1: <uord of 6-bit bytes: number of 2-second units 

for timeouts on CLS, RFNM, ALLOC, RFC, INP; 

means never timeout.> 

A job can enter a wait state waiting for any one of five different kinds of messages to arrive over 
the network: CLS (a return close of a connection), RFNM (a request for new message, indicating 
that the last message sent reached its destination), ALLOC (an allocation from a foreign receive 
socket, needed so that we can send some data), RFC (a request for connection, necessary to complete 
a connection), or INP (input data from a foreign host). In each of these cases, a timeout may be set. 
IMP MTAPE function 17 takes 6-bit fields from word 1 for five timeout values: CLS timeout is in 
bits 0:5 (770000..0 bits), RFNM in bits 6:11 (7700..0 bits), ALLOC in bits 12:17 (77..0 bits), RFC in 
bits 18:23 (0,,770000 bits), and INP in bits 24:29 (0,,7700 bits). The value in each field is the 
number of 2-second units of timeout duration. The maximum timeout duration is thus -126 (2*63) 
seconds. Zero in any field means never time out waiting for that condition (i.e., wait forever for 
that condition). Bits 30:35 (0,,77 bits) are not currently used. 

When a RFNM, ALLOC or INP timeout occurs, one or more I/O status error bits are set (which 
will cause an IN or OUT UUO to take the error return). When an RFC or CLS timeout occurs, 
the UUO in progress just goes on as if it had never tried to wait. When any of the five timeouts 
occurs, the timeout bit (TMO) is set in the connection status word. 

Note that we can go into CLS wait inside a CONNECT or LISTEN if the local socket has a 
half-closed connection associated with it. For this reason, it is always good to wait at least a few 
seconds for the return CLS. 

The system default timeout values are 6 seconds for CLS, 40 seconds for RFNM, and no timeout 
for ALLOC, RFC, and INP. 



182 I/O Devices 13.12 



ADR: 20 ;GET TIMEOUTS *: -. 

ADR-i-1: <current timeout word returned here> 



Function 20 returns the current timeout word as defined above in function 17. 



M. 



Examples 183 



SECTION 14 
EXAMPLES 



This section presents some examples of usage of UUOs. There are example programs that do file 
I/O, run display programs and use interrupts. All of the examples are written in FAIL; note the 
comments appearing alongside the code. 



14.1 Example of General I/O 



Here is a program that copies a text file called FOO into a new file called GARPLY.TMP (copying 
is done character by character). 



CHR-1 
P-17 

1C 8 
OO*- 1 

IOTEST: 



TITLE EXAMPLE OF GENERAL I/O 

; AC to hold character being copied into new fi 
;AC for pushdown pointer 



[channel number used for input 
;channel number used for output 



RESET 
MOVE 

INIT 
SIXBIT 
IBUF 
HALT 



P, UOUD LPDL.PDL] 



;Good thing to start with. 
;Set up pushdown pointer. 



1C, 8 
/DSK/ 



{Initial ize device DSK 

! i n mode 8 wi th input 

; header at IBUF. 

{Impossible error: can 



on channe I 
buffer 



1C 



t INIT the DSK. 



SETZN INAME+3 



LOOKUP 
JRST 



IC.INArlE 
NOLOOK 



INIT DC, 8 
SIXBIT /DSK/ 
OBUF..8 
HALT * 



SETZM 


ONAME+3 


SETZM 


ONAME+2 


ENTER 
JRST 


OC.ONAME 
NOENTR 



;Clear the PPN word of LOOKUP blockuse 
; current DISK PPN (ALIAS) for old file. 
; This word is clobbered by LOOKUPS. 
[Open file FOO for reading. 
[LOOKUP failed find out why. 

[Initialize device DSK on channel OC 
! in mode with output buffer 
; header at OBUF. 
[HALT on fai I ure. 

[Clear the PPN word of ENTER block use 
; current DISK PPN (ALIAS) for new file. 
[Set protection to 800, use current 
; date/ time for date/ time file written. 
[Open file GARPLY.TMP for output. 
[ENTER failed find out why. 



18-1 Ex n tuples 



14.1 



LOOP: 



riGNF : 



PUSHJ P, GETCH 

JRST DONE 

PUSHJ P.PUTCH 

JRST LOOP 



RELEAS 
RELEAS 
EXIT 



OC, 
1C, 



NOLfiCIK: OUTS1R [ASCIZ / 

LOOKUP FAILED /] 

HRRZ CHR.INAME+1 

CAILE CHR.ERRMAX 

MOVE I CHR.ERRMAX 

OUTSTR @ERROR(CHR) 
HALT 



NOENTR: OUTSTR 
ENTER FAILED -- 
HRRZ 
CAILE 
MOVE I 
OUTSTR 
HALT 

GETCH: SOSG 
IN 
JRST 



[ASCIZ / 

/] 

CHR.ONAME+1 

CHR.ERRMAX 

CHR.ERRMAX 

ERROR(CHR) 



;Get a character from input file. 
sEnd-of-file return from GETCH. 
;Put character into output file. 
;Loop unt i I EOF. 

{Close output file and release DSK. 
.Close input file and release DSK. 
{Return to monitor level. 



;Get LOOKUP error code. 

;Make sure error code is reasonable. 

[Unreasonable code. 

;Type appropriate error message. 



;Get ENTER error code. 

{Make sure error code is reasonable. 

{Unreasonab I e code. 

jType appropriate error message. 



STATZ 1C, 28888 

POPJ P, 

OUTSTR [ASCIZ / 
INPUT FILE ERROR. 
/] 

HALT 



IBUF+2 {Decrement character count for input buffer. 
1C, ;No more in current buffer. Read some more. 
GETCH1 ;Go get a character out of input buffer. 

;IN failed. Have we hit end of file? 
;Yes. Take direct return. 



GETCH I 
PUTCH: 

OUTPUT 
/] 


: ILDB CHR.IBUF+1 
AOS (P) 
POPJ P, 

SOSG OBUF+2 ; D 
OUT OC, ;fl 
JRST PUTCH1 ;G 
OUTSTR [ASCIZ / 
FILE ERROR. 
;OI 
HALT . |H, 



PIJTCH1: IDPB 
POPJ 



OBUF : 
IBUF: 
I NAME : 

OIMAHE: 



BLOCK 

BLOCK 

SIXBIT 

BLOCK 

SIXBIT 

SIXBIT 

BLOCK 



:No. Type error message. 
{HALT on some input error. 

;Get a character out of input buffer. 
;Take skip return from GETCH with 
; new character. 

{Decrement character count for output buffer. 
No room. Do output and get fresh buffer. 
Go put character into output buffer. 



;OUT UUO failed type error message. 
;HALT on any output error. 

CHR.OBUF+1 ;Put character into output buffer. 
P. {Return from PUTCH. 

3 {Output buffer header 

3 {Input buffer header 

/FOO/ {Block used for LOOKUP: file name of FOO. 

3 ; No extension, space for date and PPN words. 

/GARPLY/! Block used for ENTER: file name of GARPLY, 

/IMP/ ; extension of TMP. 

2 j Space for date word and PPN word. 



14.1 Example of General I/O 185 



LPDL<-*-10 ;Length of pushdown list 

PDL: BLOCK LPDL ;Block for pushdown list 

ERROR: tASCIZ /NO SUCH FILE. 
/] 

[ASCIZ /ILLEGAL PPN. 

/] 

[ASCIZ /PROTECTION FAILURE. 

/] 

[ASCIZ /FILE BUSY. 
/] 
ERRflAX*-*-. -ERROR 

[ASCIZ /HOORRIIBBLEL ERRO RNBR 87. 
/] i impossible error 

END IOTEST ;Encl of program, starting address. 



14.2 Example of Display Programming 

Here is a simple program to display some (fixed) text on either a III or a Data Disc. This program 
also positions the page printer at the bottom of the screen and draws a vector across the screen just 
above the page printer. 

TITLE DISPLAY PROGRAMMING EXAMPLE 

A-l 

L--2 ;AC used to hold TTY line characteristics 

DDDLIN'-*-20000 ;Data Disc bit in line characteristics. 
I I lLIN---400000 ;III bit in line characteristics. 

; Data-Disc macros and definitions 

; Command iiord alternating commands and parameters: 

DEFINE CW(C1,B1,C2,B2,C3,B3) < 

<BYTE (8)<B1>,<B2>.<B3> (3) <C1>, <C2>, <C3 !4 
> 

; Command names for DD command bytes 

EXCT--0 -Execute 

FNCN-- 1 ALPHBG*--6 ALPHA*-- 46 jFunction, usual value bytes 

CHNL<-*-2 {Channel select 

C:OLM--3 ; Column select 

HILIN4 ;Set high 5 bits of line address 

LOLIN-- 5 ;Set low 4 bits of line address 

DISPLA: RESET ;A good practice is to start with a RESET. 

SETO L, ;Get TTY's line characteristics to find out 

GETLIN L ; if TTY is a III or a Data Disc. 

AOJE L, FINISH ;Jump if job is detached (no TTY). 

TLNN L.DDDLINI1IIL1N 

JRST NOTDPY ;Jump if TTY is not a display. 



186 Examples 14.2 



PPSEL 1 ;Select new piece of paper, and 

DPYPOS -500 ; position near bottom of screen with 
DPYSIZ 3002 ; 3 glitches and 2 lines per glitch. 

JUMPL L.DOIII i Jump if III (sign bit is IIILIN) 

DDUPG HCU FNCN, 17, CHNL.0, FNCN, ALPHA0]*2] 
;Erase DD screen first. 

MOVE A . [CU FNCN , ALPHA , CHNL , . FNCN , ALPHA] 

jDD command word to do channel select 
; and set up function register for text. 

NOVEfl A.DPPROG ;Put into display program. 

SKIPA A, [CU COLn,2,HILIN,2,LOLIN,4] 

jDD command word to do column/line selects. 
GDI I I: HOVE A, [BYTE (11) <-777>,640 (3)2,3 (2)1,2 (4)6] 

;III long vector word to draw an invisible 
! absolute vector to the upper left corner 
! of the screen, and select brightness 
; of 2, size of 3. 

riQVEf1 A.DPPROG+1 ; Store in display program. 

UPGIOT l.DPHEAD sRun display program (on piece of 

5 glass number 1 if III). 

JUtlPL L.DOIII2 ;Junip if III. 

UPGIOT DDDHDR ;Draw line across DD screen. 

JRST FINISH 

DOIII2: UPGIOT 2.IIIHDR ;Draw vector on III, using POG # 2. 

FINISH: EXIT 1, ;Done. Don't do normal EXIT which 

; would RESET the display. 
EXIT ;In case user types CONTINUE. 

NOTDPY: OUTSTR [ASCIZ / 
This program only works on displays./] 
EXIT 



14.2 Example of Display Programming 187 



DPHEAD: 208000, .DPPROG ;Double-f ield mode bi t, .address of disp prog 

DPI EN ; Length of display program 


DPPROG+1 ;Address of low order line select in DO prog 

UPPROG: BLOCK 2 ;Space for command and position words. 

ASCID /This is the text to be displayed on the first line. 
And this is the text for the second line. 

Note: The ASCID statement turns on the low order bit in each word 
generated, thus causing such words to be taken as text words when 
th<?M appear in a display program for either III or DO. 

Note: For DO, the last line of text must have a CRLF at its end, or 
the display program must end with an execute; otherwise the last line 
of text will not be displayed. 

(his is the last text line that N'I I I be displayed. 
/ 

;For DO, a HALT (zero) must end the program, or the 

: system will zero the last word of the program. 

; Zero also stops (but is unnecessary in) a III prog. 

DPLEN--. -DPPROG ; Length of display program. 

DDDHOR: DODVEC ;Address of DO display program to draw line. 
LDDVEC ;Length of display program. 

DDDVEC: CU FNCN,27,CHNL,0.FNCN,27 ;Graphics mode, own channel. 

CU COLM,1,HILIN,27,LOLIN,8 ;Column 1, Line B68 (2*270). 
REPEAT =13, < 

BYTE (8)377,377,377,377 (4)2 graphics word, all bits on. 

> ;Draw a horizontal line =52 graphics bytes long. 

CU EXCT,0,FNCN,27,FNCN,27 ;Execute to write out line. 

;End of DD program to draw a line. 
LDDVEC .-DDDVEC 



IIIHnR: IIIVEC -.Address of III display program to draw vector. 
LIIVEC jLength of display program. 

IIIVEC: 3 ;AII III programs must start with unused word. 

BYTE (ll)<-777>,<-400> (3)2,3 (2)1,2 (4)6 

;Draw invisible absolute vector to left margin near bottom. 

BYTE (11) 1777,8 (3)2,3 (2)0,0 (4)6 

;0rai.i visible relative vector to right margin. 
LI I VEC-*-. -IIIVEC ;Length of program to draw III vector. 

END DISPLA 



188 Examples 



14.3 



14.3 Example of Using Interrupts 



Here is a sample program that enables interrupts on the typing of ESC I and on the receiving of a 
letter through the inter- job mail system (see Section 7). 



TITLE INTERRUPT EXAMPLE 



A-l 

INT(1AIL< 
1NTTTI~ 



-4080 



INTSAH: RESET 



HOVE I 
MOVEM 



SETZM 

novsi 

INTENB 



; Interrupt bit for letter received. 
{Interrupt bit for ESC I typed 

;A good beginning. 
{Note that RESET clears all interrupt enablings. 

A.INTRPT ;Set up address of routine to 
A.JOBAPRt ; handle interrupts. 
;The symbol JOBAPR is EXTERNed by the t. 

ESCIFG ; Initial ize ESC I flag. 

A, INTMA1LIINTTTI; Interrupt bits we want to enable. 

A, {Enable interrupts for these bits. 



<here is main program> 



EXIT 



INTRPT: MOVS 
CAIN 
JRST 
CAIN 
SETOM 



DISMIS 



A.JOBCNIt 
A.INTMAIL 
DOMAIL 
A.1NTTTI 
ESCIFG 


;Get bit wh i 
;Did we get 

;Yes. Go pr 
;Did user tyj 
;Set flag to 
5 that ESC I 
{Dismiss the 



DOMAIL: 



LETTER 



SRCV 

DISMIS 

flOVE A, LETTER 
CAME A, CODE 
DISMIS 



<process letter here> 



DISMIS 

LETTER: BLOCK -32 
CODE: SIXBIT /INTSAM/ 



ESCIFG: 

END INTSAM 



{Occasionally the main program will 
; test ESCIFG and 'clear it and take 
j appropriate action if it is set. 
{End of main program. 



is cause of interrupt, 
a letter? 
>cess it. 

>e ESC I? (He must have.) 
tell user-level process 
has been typed, 
interrupt. 



{Skip and read letter if one there. 
;No letter (can't happen). Go home. 
;Get first word of letter. 
;See if letter has right format. 
jUrong format. Someone unknown 
{ has sent us a letter ignore it. 

{Interrupt-level process must not 
; go into wait state or take more 
; than 8 ticks (8/60s sec) to finish. 
{Dismiss the interrupt. 

{Block for holding received letter. 
{Some special code to ensure we 
process only reasonable letters. 

{Flag indicating if ESC I was typed. 



Appendix 1 189 



APPENDIX 1 
HI DISPLAY PROCESSOR 



The III display processor is itself a small computer. The instructions that it executes form the 
display In order for a user to use the display processor, he must compile display instructions into 
his program and ask the system to give these instructions to the display processor. See Section 4.1 
and Section 4.4 for details on getting the system to run your display program. This appendix 
explains the instructions that can be executed by the III display processor. 



TSS Instruction 

T es t, set, and skip Opcode 12 

JF" 7|8 15|16 23 1 24 38 1 31 |32 35 | 

RESET SET TEST | unused | I 1810 
I I I I I I I 

A skip condition is generated if at least one of the eight flags is on and the corresponding bit in the 
TEST field is on. If the exclusive or of the skip condition and bit 31 is true, the next instruction is 
skipped. The flags are then set or reset according to the set and reset field. If both set and reset 
bits are on, the corresponding flag is complemented. The flags are as follows: 

Bits Octal Flag meaning 

0,8,16 401002,,0 Control bit. This bit may be set, reset, and tested but 

has no other meaning to the processor. 

1,9,17 200-1 01..0 Light pen flag. The bit is set if the light pen is seen. 

2.10.18 1 00200..400000 Edge overflow flag. This bit is set if the beam is ever 

positioned off the screen by any means. 

3.11.19 40100..200000 Wrap-around flag. This bit is set if overflow occurs 

in incremental .vector mode. 

4.12.20 200-10,,100000 Not running mask. If this bit is on, the processor will 

interrupt if a halt is executed. This bit cannot be set 
or reset by this instruction. 

5.13.21 10020,,40000 Light pen mask. If this bit is on, the processor will 

interrupt if the light pen flag comes on. 



190 III Display Processor 



6.14.22 4010..20000 Edge overflow mask. If this bit is on, the processor 

will interrupt if the edge overflow flag comes on. 

7.15.23 2004,, 10000 Wrap-around mask. If this bit is on, the processor 

will interrupt if the wrap-around flag comes on. 



LVW Instruction 



Long vector uorcl Opcode 86 

IT" 18|11 21|22 24|25 27|28| 29 |30 31|32 3B| 

X Y BRT SIZE M T I 0110 



The long vector word draws one vector with mode, type and brightness as specified by the M, T, 
and P.RT fields respectively. A in the BRT field indicates no change in brightness. 1 is the 
dimmest intensity and 7 the brightest. The brightness affects all vectors and characters until reset 
by another long vector word. 

Mode indicates relative mode and 1 indicates absolute mode. In absolute mode, the new position 
is given by the X and Y components relative to the center of the screen. In relative mode the 
components are added to the current position to give the new position. 

Type Meaning 

Visible. 

1 End point. 

2 Invisible. 

3 Undefined, currently end point. 

A visible vector is drawn from the current position to the new position; the invisible vector moves 
the beam to the new position without displaying; the end point vector moves the beam to the new 
position and then displays a point. 

The size field sets the character size. The selected size is used for all characters until reset by 
another long vector word with a non-zero character size field. The sizes are: 

Size Chars per line Lines per screen 

no change no change 

1 128 (smallest chars) 64 

2 85 42 

3 73 36 

4 64 32 

5 42 21 

6 32 16 

7 21 (largest chars) 10 



Appendix 1 191 



SVW Instruction 



Short vector uord Opcode 82 

J0 EF|7~ 13|14 iBlTB 22 1 23 29|38 31|32 35 1 

dXl dYl Tl | dX2 | dY2 Tl 8818 

I _ I _ I _ I _ I _ I _ I _ I 



The short vector word always draws two vectors in relative mode. The type of each vector is 
specified by the corresponding T field (see the long vector word above). The high order bits of the 
dX and dY fields are extended left to give 1 1-bit quantities. 



CHR Instruction 

Character word Opcode 1 

JF~ 6|7 13|14 20 1 21 27|28 34 1 35 f 

j character j character j character j character j character j 

1 234 51 
I I I I I I I 

The character word displays the five characters in order from left to right with automatic spacing. 
All characters are displayed as printed on the line printer with the following exceptions: 

Code IH character . 

Oil None. 

013 Integral sign. 

014 Plus-or-minus sign. 
177 Backslash. 

JMP Instruction 

Jump Opcode 28 

W 17|18 38131 ~ 

A unused 10888 

I I I 

The processor jumps to location A and continues executing. 



192 III Display Processor 

HLT Instruction 

Hal t Opcode 88 

J0~~ 17|18 38|31 ~357 

unused unused 88808 

I I I I 

The processor stops with its MA pointing to the location following the HALT. The not running 
flag is turned on. 

JMS Instruction 

Jump to subroutine and save Opcode 84 

W~ 17|18 31)32 ~3Tf 

A unused 0100 

I I I I 

The JMS instruction is not allowed in user III programs, but its description is included here for 
completeness. 

The following word of information is written into location A: 

J8~ 17)18 22)23 30)31 ~3T 

MA CPC | unused 10008 
I I I I I 

where CPC is the contents of the CPC buffer register. This register is loaded whenever the 
processor discovers an interrupt condition while processing a character word or short vector word. 
It is set to the number of the character being displayed (0-4) or the number of the vector of the 
short vector word (0-1). It is reset by a CONO 430, with the clear flags bit on. 

The following information is written in location A+l: 

T0~ 18)11 21)22 24)25 27J28 sTf 

X Y BRT SIZE FLAGS 
I I I I I I 



Appendix 1 193 



Here are the meanings of the flag bits (see also the TSS instruction above). 

Bits Octal Meaning 

28 0,,200 Control bit. 

29 0,,100 Light pen flag. 

30 0,,40 Edge overflow flag. 

31 0,,20 Wrap around flag. 

32 0,,10 Wrap around mask. 

33 0,,4 Light pen mask. 

34 0,,2 Edge overflow mask. 

35 0,,1 This bit is always 1. 

After storing the above words at A and A+l, the program continues executing at A+2. 

Note that the word stored in A is in the form of a jump instruction. This permits the subroutine 
to return by jumping to A. 



JSR Instruction 

Jump to subroutine Opcode 24 

T0 17|18 30J31 35T 

A unused 18189 
I I I I 

The JSR instruction saves a PC word into location A and then executes code from location A+l. 
The PC word is in the same format as the word stored in location A by the JMS instruction. The 
word is a jump instruction so that the subroutine return can be simply a jump to A. 

SAVE Instruction 

Save Opcode 64 

TF~ 17|18 29 1 38 ~~35T 

A unused | 118188 
I I I _l 

The save instruction saves a position word in location A. This word is in the same format as the 
word put into A+l by the JMS instruction and is in the correct format to be used by the REST 
instruction below. 



194 III Display Processor 

REST Instruction 

Restore Opcode 14 

T0~~ 17|18 ~~29| 3T~j 31 |32 35 

B I unused | P | F 1109 | 



The contents of location B are assumed to be in the format of the word stored in location A+l by a 
JMS or the word stored in location A by a SAVE. If bit 30 is a 1, the X and Y position registers 
and the size and brightness registers are reloaded from the corresponding fields of this word. If bit 
31 is a 1, the flags are restored. 



SEL Instruction 



Select (displays) Opcode 10 

__ __ 23|24 31|32 357 

SET RESET unused | 1088 | 

I I I I I 

If any of bits 0:11 (777700,,0 bits) are on, the corresponding displays are selected. If any of bits 
12:23 (77,,770000 bits) are on, the corresponding displays are deselected. If both the select and 
deselect bits are on for a given display, the state of selection of that display will be complemented. 
Note that we have only 6 III displays at Stanford; only bits 0:5 (770000,,0 bits) and 12:17 (77..0 bits) 
are relevant in the SET and RESET fields. 



Appendix 2 195 



APPENDIX 2 
DATA DISC DISPLAY SYSTEM 



The Data Disc display system uses a =6<l-track disc rotating at =60 r.p.s. to store TV images. The 
rrrmnnls u<-rd with this system are standard television monitors. Each picture on the disc uses one 
cnnnni't, which is two disc tracks The tracks are switched alternately every 60th of a second-one 
track for each field of the standard television raster. Characters and graphics are sent to a one-line 
l.nilfi'i and then commanded to be written. Characters must be written twice; once for each field. 

There is nn interface that takes display instructions from main memory and sends data to the Data 
Disc. The display instructions are used to change the pictures stored on the disc. A user can have 
his own display programs executed by the Data Disc interface by using the UUOs explained in 
.section }/}; see also Section 12. This appendix describes the display instructions, how they are 
handled by the interface and then effects on Data Disc pictures. 



The Data Disc system itself operates in two modes: text and graphics. In text mode, each byte sent 
to the Data Disc is interpreted as a character and will be displayed in the current column on the 
current line; each column position is one character wide (6 bits wide in single width character 
mode, 12 bits wide in double width character mode). Characters must be written on the disk twice, 
oner tor each track of the given channel. In graphics mode, each byte is interpreted as eight bits to 
be written on the disk exactly as sent. The bits are written on the current line at the current 
column position. Each column position in graphics mode is 8 bits wide. 

Normally, in both graphics and text modes data is sent to the Data Disc line buffer and is not 
written onto the disc until an execute is received by the Data Disc system. It is possible, however, 
to write directly onto the disc without use of the line buffer. See the Write Directly command in 
the command word description below. 



Now here are the display instructions which the interface will accept. 



Text Word 



Text uord Opcode 1 

|8~ 6|7 13|14 28|21 27|28 34 1 35 1 
chrl I chr2 | chr3 j chr4 j chrS j 1 | 



196 Data Disc Display System 

A text word causes the interface to send five bytes to the disc's line buffer. Tabs (Oil) and 
backspaces (177) are ignored unless preceded by a backspace, in which case a special character is 
sent to the line buffer (e.g., a small "tb" will be printed for 177&011). Nulls are always ignored. 
Carriage return and linefeed are specially processed to do the right thing: If any characters have 
been transmitted to the line buffer since the last execute command (see command word below), an 
execute is generated. (Execute causes the line buffer to be written onto the disc.) Carriage return 
then causes a select to column 2, and linefeed increments the line address by 14. (If you are 
displaying double-height text, then each line should be ended with a carriage return and two 
linefeeds in order for subsequent lines to be positioned properly.) Both carriage return and 
linefeed print special characters instead of the above functions when preceded by a 177. Note: The 
Data Disc must be in text mode for the bytes sent to it to be written onto the disc as text. In 
graphics mode, these same bytes will be written as graphic bits. 



Graphics Word 

Graphics word Opcode 02 

|8~~ 7|8 15|16 23|24 31|32 35 | 

byte 1 byte 2 byte 3 byte 4 j 02 | 

I I I I I I 

I I I I I I I I I I I I I 

A graphics word causes the interface to send 4 8-bit bytes directly to the disc's line buffer with no 
modification. Note: The Data Disc must be in graphics mode for the bytes sent to it to be written 
onto the disc as graphics bits. In text mode, these same bytes will be written as characters. 



Halt Instruction 

Hal t Opcodes 0, 40, 60 

|8~~ 29|30 ~~35| 

unused X0 

I I I 

I I I I I I I I I I I I I 

A halt stops the interface, terminating the display program. 



Appendix 2 197 



Jump Instruction 



Jump 


Opcode 20 


10 

1 
I 


17|18 29|30 35 | 
jump address unused | 20 
1 II 


1 1 


1 1 I 1 1 1 I 1 1 1 1 



A jump word causes the interface to take subsequent display instructions starting at the address 
contained in the left half of the jump word. 



No Operation 



No-op 


Opcodes 06,16,26,36,46 


56,66,76, 12,32,52,72 




10 
1 
1 


unused 


29 


30 35| 
XX 
1 



I I I I I I I I I I I I 

Opcodes ending in 6 or 12 have no function. The interface ignores them and proceeds. 

Warning: Opcodes ending in 10 (10, 30, 50, 70), previously advertised as no-ops, are not no-ops at 
all; they are actually command words, although their use as such is not recommended because the 
10 bit is part of the third command code (op 3 in the command word below). 



Command Word 



Command word 



Opcode 4 



7|8 15 | 16 23 | 2426 | 2729 | 3032 | 3335 | 
data 1 data 2 j data 3 |op l|op 2|op 3| 4 | 



I 



I I I I 



I I 



A command word causes the interface to send the Data Disc three commands, as indicated above 
by "op 1," "op 2" and "op 3." Sent with each command is an 8-bit data byte. The commands 
possible are as follows: 



198 Data Disc Display System 



Command Name 

Execute 

1 Function code 



Channel select 



Meaning 

Write the line buffer onto the disc at the 
position previously specified. The data byte 
is irrelevant for this command. 

Load the function code register with the 
given data byte. The meanings of the bits 
in the function code register are explained 
below. 

Select the channel specified in the data byte 
for writing. If the erase bit is on and the 
graphics mode bit is set, the channel 
selected is erased to the background selected 
by the dark/light bit. Only the first channel 
select in a DD display program has any 
effect. 

The data byte is loaded into the column 
register and the line buffer address register. 
This sets the X-position of your output. 
Column is illegal and will hang the 
controller. Column -85 is the last column to 
be displayed with normal size characters; 
characters sent for columns =86 through 
128 are flushed, over =128, you wrap 
around. A column select greater than =85 
will also hang the controller. The last 
graphics column is =64 and columns greater 
than that will hang the controller. 



High order line address The data byte is loaded into the high order 

5 bits of the line address. 



Column select 



Low order line address 



Write directly 



The data byte is loaded into the low order 4 
bits of the line address. Line range is from 
to 737 (octal). Line addresses between 740 
and 777 cause execute commands to be 
ignored. Line addresses above 777 wrap 
around. 

Data is written directly on the disc at the 
location previously set up; the line buffer is 
not used. The column address is 
automatically incremented. Executes are not 
necessary. 



Appendix 2 199 



Line buffer address 



Data is loaded into the line buffer address 
only. This allows some of the line buffer 
contents to be changed and the rest 
retained. The first character displayed will 
be the one specified by the column address, 
and the last character will be the last one 
sent after this command. 



The 8-bit function code register, which is loaded by command 1 above, has the following format: 

Bi t# 8 1 3 4 5 6 7 



1 

unused (unused 
1 


s i ng 1 e 
height 


nospace 
(add) 


2 wide 
(erase) 


dark | write 
back I enable 

1 


graphic 
mode 


1 
8 


1 
unused (unused 
1 


double 
height 


space 
(rep) 


1 wide 


I ight | display 
back | direct 

1 


text 
mode 


rise | 


LSB 



Bits 



Octal 



040 



020 



020 



Meaning 

Single height/double height. (Text mode only.) 
This bit determines what height displayed characters 
will have. Single height characters are 12 lines tall; 
10 lines above the "base" line and 2 lines below. The 
top line of the character prints on the line addressed. 
This bit has no effect in graphics mode. If you are 
displaying double-height text, then each line should 
be ended with a carriage return and two linefeeds in 
order for subsequent lines to be positioned properly. 

Space/nospace. (Text mode only.) 

When this bit is on, each character written is 

substituted on top of the character previously written; 

when this bit is off, the remainder of the line is 

erased. 

Additive/replacement. (Graphics mode only.) 
When this bit is on, only 1 bits are written, ORed 
with the bits already written; when this bit is off, I's 
and O's are written over previous data. 
CAUTION: When replacing, the bits at the 
beginning and end of the line segment you are 
writing should be the same as the previous data or 
bit lossage may occur., 



200 Data Disc Display System 



4 010 Double width/single width. (Text mode only.) 

This bit determines what width displayed characters 
will have. With this bit on, characters are 5 bits wide 
with a bit on the end (total 6 bits); when this bit is 
off, characters are =10 bits wide with two bits on 
the end. 

CAUTION: When using double width characters, do 
not exceed -43 characters in a line or the controller 
will hang. Double width characters often fail to get 
displayed correctly anyway. 

4 010 Erase. (Graphics mode only.) 

If this bit and the graphics mode bit are on, a 
channel select will cause the screen to be erased to the 
background indicated by the dark/light bit below. 

5 004 Dark/light. 

When this bit is on, an erase causes the screen to go 
dark and characters and graphic 1 bits are displayed 
as light. When this bit is off, an erase makes the 
background light and characters and graphic 1 bits 
are displayed as dark. 

6 002 Write/display directly. 

When this bit is on, operations go to the disc (normal 
mode). When off, data is displayed once on the 
selected channel and then goes away and previous 
data remains on the disc. 

7 001 Text/graphics mode. 

When this bit is on, you are in graphics mode; when 
it is off, you are in text mode. 



Appendix 3 201 



APPENDIX 3 
GENERAL INFORMATION ABOUT THE PDP-10 



The PDP-10 is a 36-bit word, single address machine. Normal instructions (excluding I/O 
instructions) take the following form. 

Bits Octal Meanings of fields in an instruction word 

0:8 777000..0 Instruction code. 

9:12 740..0 Accumulator. 

13 20,,0 Indirect bit. 

14:17 17,,0 . Index register if non-zero. 

18:35 0..777777 Memory address. 

For I/O instructions, the following format is used: 

Bits Octal Meanings of fields in I/O instructions 

0:2 700000..0 This field holds a 7 in all I/O instructions. 

3:9 77400..0 Code of I/O device. 

10:12 340..0 I/O instruction code. 

13:35 37,,777777 Same as in normal instructions. 

Machine I/O instructions are generally privileged in that only the monitor is allowed to issue such 
instructions. The opcodes corresponding to these instructions trap to the monitor, which normally 
interprets them as UUOs. However, the user is permitted to give machine I/O instructions when 
he is in IOT-USER mode, which is described below. 



For every instruction, an effective address calculation is carried out in the following manner using 
bits 13:35 of the instruction. If the index register field (bits 14:17) is non-zero, the contents of the 
specified index register are added to the memory address found in bits 18:35 of the instruction. 
Then if the indirect bit (bit 13) is 0, this result is the effective address for the instruction. If the 
indirect bit is 1, then another word is picked up from the location specified by the result so far. 
Then the effective address calculation starts over using bits 13:35 of this new word. This process 
continues until the indirect bit in some word used in this calculation is 0; the address (including 
any indexing) specified by that word is then the effective address of the instruction. 



202 PDP-10 Information 



PC Flags 



The PDP-10 has several flags that indicate the state of the program running. These flags are 
commonly called the PC flags because their values are stored in the left half of the PC word stored 
by the PUSHJ, JSR and JSP instructions. The PC itself is stored in the right half of this PC 
word. The bit positions and meanings of the flags are explained below. For further detail, see the 
PDP-10 instruction manuals. 

Note that there are no flags in bits 13:17; these bits are always stored as zero in the PC word so 
that when the PC word is addressed indirectly neither indexing nor further indirecting will take 
place. 



Bits Octal 



400000..0 



Meanings of flags in the PC word 

Overflow. An arithmetic operation has resulted in an 
incorrect result because of some kind of overflow. 



200000..0 Carry 0. An arithmetic operation has caused a carry 

out of bit 0. This does not necessarily indicate an 
overflow condition. 

100000,,0 Carry 1. An arithmetic operation has caused a carry 

out of bit 1. This also does not necessarily indicate 
an overflow condition. 



5 
6 

11 
12 



40000..0 Floating overflow. A floating point instruction has 

resulted in an incorrect result because of some kind of 
overflow or underflow. 

20000..0 Byte-increment suppression. The next ILDB or 

IDPB instruction will be executed without 
incrementing the byte pointer. This flag is set when 
an ILDB or IDPB instruction is interrupted after the 
byte pointer has been incremented but before the byte 
has been moved. This flag can also be set by a user 
program with the "JRST 2," instruction. 

10000..0 User mode. The processor is in user mode. 

4000..0 User in-out. The processor is in IOT-USER mode. 

' This mode is explained below. 

100..0 Floating underflow. The exponent of the result of a 

floating point operation was less than -128 (decimal). 

40..0 No divide. A division operation was not carried out 

because either the divisor was zero or an overflow 
would have resulted. 



Appendix 3 203 



IOT-USER Mode 



On the PDF- 10, usually only the monitor is allowed to use the machine's I/O instructions. In user 
programs, the opcodes (700:777) of these instructions are usually interpreted as UUOs. However, 
there exists a special mode, called IOT-USER mode, in which the opcodes 700:777 are executed not 
as UUOs but as machine I/O instructions. 

A user program can get into IOT-USER mode by giving the EIOTM UUO (see page 135), which 
does nothing but put you into this mode. Also, an interrupt-level process will be started up in 
IOT-USER mode after a new style interrupt if bit 6 (the 4000..0 bit) is on in JOBAPR; see Section 
9. Finally, spacewar processes are always started up in IOT-USER mode; see Section 8. 

The simplest method for getting out of IOT-USER mode, whether at user, spacewar or interrupt 
level, is to execute a 

JRST 2, [.+!) 

This turns off all of the PC flags, except the user-mode flag. See the JRST instruction in the 
PDP-10 manuals and note that DEC calls IOT-USER mode "user in-out". 

In summary, opcodes 700:777 are treated as UUOs unless the program executing such instructions 
is in IOT-USER mode, in which case these opcodes are machine I/O instructions. 



Text Representations 

There are several common representations used for storing text on the PDP-10. These include 
ASCII, ASCIZ, ASCID and SIXBIT. In each of these four representations, characters are stored 
left- justified in a block of one or more words. The octal codes for characters are given in 
Appendix 7. 

ASCII In this representation 7-bit characters are packed 5 to a word with 
the low order bit (bit 35-the 0,,1 bit) always being zero. A word 
count or character count is needed to determine the length of an 
ASCII string. 

ASCIZ This is the same as ASCII except that a null (zero) byte follows the 
last character in the string to mark its end. 

ASCID This is the same as ASCII except that the low order bit of each 
word is always a one. 

SIXBIT This representation packs 6-bit characters 6 to a word. The 
characters representable in SIXBIT are those with ascii 
representations from 40 to 137. 



204 PDP-10 Information 

Assembler Features Relevant to this Manual 



Here is an abbreviated list of PDP-10 assembler features, including those used in the UUO 
wnteups in this manual. 

1. The form "[...]" is a literal whose value is the address at which the code and/or data specified by 
"..." is placed in the program. The code/data can consist of any number of words and can include 
other literals. 

2. The form "A,,B" represents a word whose left half contains the value A and whose right half 
contains the value B. This is equivalent to the form "XWD A,B". 

3. The form "IOWD A,B" is exactly equivalent to the form "-A,,B-r. 

4. The forms "ASCII /.../", "ASCIZ /.../", "ASCID /.../" and "S1XBIT /.../" represent blocks of words 
containing the string "..." in the ASCII, ASCIZ, ASCID and SIXBIT representations respectively. 
See these representations above. 



Appendix 4 205 



APPENDIX 4 
JOB DATA AREA 



The first 140 words of each core image ate reserved for storage of various parameters for that job. 
This block is called the user's Job Data Area. The data here can be examined by the user, and he 
can change some of it directly simply by storing new values in the appropriate words. 

Part of this data, however, is important to the system and is protected from any attempt by the user 
to change it. In particular, the block from JOBHCU to JOBPFI (see table below) is copied into 
the monitor when the job is run so that the user cannot change it. When the job is not running, 
this block is stored back in the user's job data area to conserve space in the system. 

References to locations in the job data area should be by their symbolic names rather than by their 
absolute addresses. It is possible that some of these locations might be moved around, and if that 
happens, programs that refer to these locations symbolically will need only to be reloaded. All of 
the symbols for these words are defined in a system library file; their definitions will automatically 
be retrieved from there by the LOADER if the symbols are declared EXTERNAL. 

The table below explains the names and uses of the locations in the job data area. 
Word Symbol Explanation 
JOBAC The user's accumulators are stored here over UUO calls. 

20 JOBDAC The user's accumulators (whether Exec mode or user mode) 
are stored here when a clock trap occurs. 

40 JOBUUO User UUOs (opcodes 001:037) encountered are stored here 

after the effective address calculation has been done. See 
Section 1.4. 

41 JOB41 The instruction in this location is executed whenever a user 

UUO (opcodes 001:037) is encountered. This instruction is 
often a JSR to the user's UUO-handling routine. See 
Section 1.4. 

43 JOBENB The user's APR trap enablings (old style interrupt 

enablings) are stored here. See Section 9. 

44 JOBREL The job's protection constant is stored here. This is the 

highest address in the user's core image (excluding any 
upper segment). 

45 This is the first of several words used for temporary storage 
by the system. 



206 Job Data Area 



71 JOB1NT 



If this word is non-zero, it specifies the address in the user's 
core image of a block of three words to be used in place of 
JOBCNI, JOBTPC and JOBAPR, respectively, for new 
style interrupts. See Section 9. 



72 JOBHCU (Also know as JOBPRT.) The number of the highest I/O 

channel in use by this job is stored here. This is the first 
location of the block copied into the system when the job is 
run. 

73 JOBPC Your program counter is stored here when your program is 

not running. 

74 JOBDDT If DDT or RAID is present in your core image, its starting- 

address is stored here. When you type the DDT monitor 
command, your program is started at the address specified 
in this word, unless this word contains zero. Also, when 
RAID is present, bits 0:12 (the 777740..0 bits) of this word 
hold the version number of RAID. This is first word 
written into a dump file by the SAVE monitor command. 



75 JOBJDA 



114 JOBPFI 



This is the first word of a 20-word block in which are 
stored the system addresses of the device data blocks 
(DDBs) for the devices you have open on the 20 logical I/O 
channels. The address of the DDB for channel 6, for 
instance, is stored in JOBJDA+6. 

This is the last word of the 20-word block starting at 
JOBJDA and is also the last word of the block (starting at 
JOBHCU) that is copied into the system when you run. 



115 JOBHRL The right half of this word contains the highest address in 

your upper segment (e.g., 401777 for a IK upper), and the 
sign bit (400000,,0 bit) is on if your upper is write protected. 
If you have no upper, this word is zero. 

116 JOBSYM A pointer to your symbol table is placed here. If you have 

no symbols in your core image, this word is zero. 
Otherwise, the left half of this word contains the negative 
of the number of symbols in the table, and the right half 
contains the address of the first word of the table. 



117 JOBUSY 



A pointer to the table of undefined globals encountered is 
placed here by the LOADER. This word has the same 
format as JOBSYM above (i.e., -<word count>,,<table>). If 
there were no undefined globals, the left half of this word 
will contain zero. 



120 JOBSA The right half of this word contains the starting address of 



Appendix 4 207 



your program. The START and CSTART monitor 
commands cause your program to be started at that address 
(unless it is zero). The left half of this word contains the 
address of the first location above your symbol table (or 
program if no symbol table). The RESET UUO (see page 
126) causes this number to be stored in JOBFF (see below). 

121 JOBFF The address of the first free (unused) location in your core 

image is stored here. The words from that address up to 
that in JOBREL are not used. Whenever the system sets 
up an I/O buffer for you, it is put at the address specified 
by JOBFF and JOBFF is then increased to point to the 
first word beyond the buffer. The RESET UUO causes 
JOBFF to be reset to the value stored in the left half of 
JOBS A (see above). 

122 JOBS41 The contents of JOB41 (see above) are stored here just 

before the core image is written into a dump file by a 
SAVE or SSAVE monitor command or by the SWAP 
UUO. JOB41 is restored from this word when the file is 
read by a GET, RUN or R command or by the SWAP 
UUO. 

123 JOBEXM This is a temporary cell used by the EXAMINE and 

DEPOSIT monitor commands. 

124 JOBREN This word contains the address at which the program 

should be started when the REENTER monitor command 
is given. A zero in this word means REENTER will not 
work. 

125 JOBAPR This word should contain the address at which you wish 

your interrupt routine started when an interrupt occurs. 
See Section 9. 

126 JOBCNI When an interrupt occurs, a bit indicating the cause is 

stored here. See Section 9. 

127 JOBTPC When an interrupt occurs, the program counter word is 

stored here before control is given to your interrupt routine. 
See Section 9. 



130 JOBOPC When you start the program with a START, CSTART, 

DDT or REENTER monitor command, the program 
counter word (picked up from JOBPC) is stored here. 

131 JOBCHN This word is used for FORTRAN chaining. 

132 JOBFDV This word is used for temporary storage by the FINISH 

command. 



208 Job Data Area 



133 JOBCOR This word is used for temporary storage by the SAVE and 
GET commands. 



134 HINAME 



135 HILOC 



HO JOBDA 



The name of your upper segment, if any, is stored here just 
before your core image, is written onto a dump file by a 
SAVE or SSAVE monitor command or by the SWAP 
UUO. 

The location within the dump file of your upper segment is 
stored here prior to writing a dump file with the SSAVE 
monitor command. 

This is the first word in your core image that is not part of 
the job data area. 



Appendix 5 209 



APPENDIX 5 
LOCATIONS OF USEFUL POINTERS IN THE MONITOR 



The table below lists the contents of some absolute locations in the monitor. Most of these locations 
contain pointers to system tables that user programs occasionally need to examine. Any word in 
memory may be examined by use of either the PEEK UUO (see page 93) or the SETPR2 UUO 
(see page 92). 

To get the address of a particular job's entry in a job table, add the job number to the base 
address of the table. 

Word Contents Explanation 

210 JBTSTS This is the address of the job table of status words. The 

bits in each entry are explained with the JBTSTS UUO on 
page 90. 

211 PRJPRG This is the address of the job table of project-programmer 

names. 



212 JBTSWP 



213 SPWGO 



214 TTIME 



215 UPTIME 



This is the address of the job table of swapper data. The 
left half (bits 0:l7--the 777777..0 bits) of each entry contains 
the logical band number used to swap this job. Bits 18:26 
(0,,777000 bits) contain the size of the job (in IK blocks) as 
stored on the disk. Bits 27:35 (0..777 bits) contain the size 
of the job (in IK blocks) as it will appear when it is 
swapped in. 

This is the address of the job table of PDP-IO spacewar 
processes. The right half (bits 17:35-0,,777777 bits) of each 
entry contains the user-specified starting address of the 
spacewar process. Bits H:17 (17,,0 bits) contain the number 
of ticks between startups, and bits 10:13 (36,,0 bits) contain 
the number of ticks until the next startup. This word is 
zero for jobs that do not have PDP-10 spacewar processes 
running. See Section 8. 

This is the address of the job table of total run times (in 
ticks). The time for job is the null time (idle time) since 
the last system reload or restart. 

This is the address of a word that contains the length of 
time in ticks since the last system reload or restart. 



216 CORMAX This is the address of a word that contains the largest size 
(in IK blocks) a user program can be and still fit in core. 



210 Monitor Pointers 



217 DEVLST 



This is the address of the header word for the list of all 
device data blocks (DDEs). The left half of the header 
word contains the address of the first DDE. DDEs are 
described in Appendix 6. 



220 TTYTAB This is the address of the table of pointers to TTY DDEs. 
The entry for a TTY in use contains the TTY line number 
in the left half and a pointer to the TTY's DDE in the 
right half. The entry for a TTY not in use is zero. Index 
into this table with the TTY line number. 



221 



222 
223 



BYTE(9)SCNNUM,DPYNUM,DDNUM,PTYNUM These four 
quantities are the numbers of 1) teletype lines, 2) III display 
lines, 3) Data Disc display lines and 4) pseudo-teletype lines, 
respectively. 

JOBN-1 This is the highest possible job number. 

JBTADR This is the address of the job table of protection-relocation 
constants. The left half of each entry contains the job's 
protection, which is the highest location addressable in the 
job (not counting any upper segment). The right half of 
each entry contains the job's relocation, which is the 
physical memory address where the job's core image is 
actually located. When a job is swapped out, its entry in 
this table is zero. 

This is the address of the job table of entries in the job 
queues. The queues are circular with each entry containing 
a forward pointer in the right half and a backward pointer 
in the left half. The pointers are all relative to JBTQj a 
pointer that is positive points to another job's entry in the 
table; a pointer that is negative points to the queue's header 
word, which itself is just another entry in the circular queue 
and which contains both forward and backward pointers. 
The magnitude of a negative pointer indicates the number 
of the queue the entry is in. 



224 JBTQ, 



225 JOBNAM This is the address of the job table of sixbit job names. 

226 JOB This is the address of a word that contains the number of 

the currently running job. 

227 CONFIG This is the address of an ASCIZ string that gives the title 

of the current system. 

230 SP2GO This is the address of the job table of PDP-6 spacewar 
processes. The format of this table is the same as that of 
the SPWGO table; see word 213 above. 



Appendix 5 211 



231 

234 

235 



JOBQUE This is the address of the job table of queue numbers. 
Each entry in this table contains either the queue number 
or the negative of the queue number for the particular job. 



NQUES 



QNAMS 



236 JBTLIN 



237 LETAB 



250 JBTKCJ 



This is the number of different queues. The queues are 
numbered from 1 to this number. 

This is the address of a table of the ASCII names of the 
various queues. Index into this table with the queue's 
number. 

This is the address of the job table of attached terminals. 
The entry in this table will be -1 for a detached job. For 
an attached job the entry will contain the TTY line number 
in the right half and the permanent TTY line 
characteristics in the left half. There may be bits on for 
non-permanent characteristics, but these bits are not kept up 
to date in this word. See LINTAB in word 302 below for 
the current line characteristics; see also the GETLIN UUO 
on page 40. 

This is the address of the table of pointers to the displays' 
line editor headers. The right half of each entry contains a 
pointer to the free storage block for that display. The left 
half holds various flags used by the line editor. When a 
display is not in use, its entry here is zero. Index into this 
table with the number of the display line minus 20. 

This is the address of the job table of kilo-core-jiffies 
(KCJs) used by each job. A jiffie is a tick, i.e., l/60th of a 
second. One KCJ represents a job running for one tick 
with IK of core. 



251 JBTBTM This is the address of the job table of login times. Each 
entry in this table contains the date and time when the 
particular job logged in, with the date (in system date 
format) in the left half and the time (in seconds after 
midnight) in the right half. 

257 SHFWAT This is the address of a word that contains the number of 
the next job to be shuffled in core. 



265 SYSTOP 



This is the address of a word that contains the physical 
address of the first word in memory that can be allocated to 
user programs. 



266 CORTAB This is the address of a table that indicates the usage of 
each IK block of core. The entries in this table are 9-bit 
bytes packed 4 to a word. The entry for a given block 



212 Monitor Pointers 



270 PTYJOB 



contains either 1) the number of the job occupying the 
block, 2) a 101 if the block is part of the system, 3) a 105 if 
the block is part of free storage or 4) a if the block is 
unused. 

This is the address of the table of owners of 
pseudo-teletypes (PTYs). Each entry contains the number 
of the job that owns that PTY. Index into this table with 
the PTY line number minus 121. 



271 JBTPRV This is the address of the job table of privileges. 

272 UCLLEN*1000+UCLDLN,,UCLTAB The right half of this word 

contains UCLTAB which is the address of the CALL 
UUO name table. This table is made up of two parts. The 
first UCLDLN words contain the names of DEC CALLs, 
and the next UCLLEN-UCLDLN words contain the names 
of the special Stanford CALLs (numbers from 400000 up). 
Thus the total length of the table is UCLLEN, which is in 
bits 0:8 (777000,,0 bits) of word 272; the length of the first 
part of the table, UCLDLN, is in bits 9:17 (777..0 bits) of 
word 272. The CALL names within each part are in their 
expected order by CALLI number. 



273 DSKPPN 



274 FTIME 



275 NJOBS 



276 DSKOPS 



277 INITIM 



This, is the address of the job table of Disk PPNs 
(ALIASes). If a job has no ALIAS, its entry in this table is 
zero. Disk PPNs are explained on page 16. 

This is the address of the job table containing each job's 
time last run. Each entry contains the date and time when 
the particular job was last run, with the date (in system date 
format) in the left half and the time (in seconds after 
midnight) in the right half. 

This is the address of the job table that gives the number 
of users for each upper segment. Each entry contains the 
number of jobs attached to the given upper segment. Index 
into this table with the upper segment's job number. 

This is the address of the job table containing the number 
of disk operations each job has done. The entry for job 
is the total number of disk operations since the system was 
reloaded. 

This is the address of a word that contains the date and 
time of the last system reload or 203 restart. The date (in 
system date format) is in the left half and the time (in 
seconds after midnight) is in the right half. 



Appendix 5 213 



300 -DISPL,,COMTAB COMTAB is the address of the table of monitor 
commands names in sixbit, and DISPL is the number of 
commands in that table. 



302 LINTAB 



303 ASTAB 



1 
2 

3 

4 

5 

6:7 

8:9 



This is the address of the table of TTY line characteristics. 
Each entry in this table corresponds to a particular TTY. 
The TTY's line characteristics are in the left half (see the 
GETLIN UUO on page 40 for the meanings of these bits). 
The right half is used to store ESCAPE arguments (for 
TTYs that are displays). Index into this table with the 
TTY line number of interest. 

This is the address of the audio switch connection table. 
There is a word here for each display; index into this table 
with the display's line number minus 20. The data in each 
entry of this table is as follows (for more details about the 
audio switch, see Section 4.7): 



Bits Octal 
400000,,0 



200000..0 
100000..0 

40000..0 
20000..0 

10000..0 

6000,,0 

HOO.,0 



10:13 360..0 
14:17 17,,0 
18:35 0..777777 



Values of fields in ASTAB entry 

One if a UUO is waiting for a 

temporary connection to finish on 

this display. 

One if the current connection is a 

temporary connection. 

One if a page interruption is 

happening at this display. 

One if a delayed beep is pending. 

One if the permanent audio 

channel is not page interruptible. 

One if the permanent channel is 

not beep interruptible. 

Beep disposition for temporary 

channel. 

Page disposition for temporary 

channel. 

Temporary channel number. 

Permanent channel number. 

Remaining duration of temporary 

connection (0 for infinite). 



Appendix 6 215 



APPENDIX 6 
DEVICE DATA BLOCKS (DDES) 



For each device used, there is a Device Data Block (DDE) in the system in which is kept a 
collection of data pertinent to the device. Certain devices (including the disk, the IMP, and TTYs) 
do not have DDEs when they are not in use; other devices' DDEs are permanently built into the 
list. With sharable devices such as the disk, there is a DDE for each user I/O channel with the 
device open. 

All the DDEs are linked together in one big list. The header for this list is located at DEVLST; 
the left half of the word at DEVLST points to the first DDE. (The word DEVLST is pointed to 
by the word at absolute memory address 217; see Appendix 5.) 

The data common to all DDEs is explained below. Other data is device dependent. 
Word Name Contents 

DEVNAM This is the device's physical name in sixbit. 

1 DEVCHR Bits 0:5 (770000,,0 bits) of this word contain the number of 

the job the device belongs to, or zero if the device is 

unused; if this field contains zero and the device is 

ASSIGNed (see the DEVCHR UUO on page 33), then the 

device has been detached from the system (probably for 

maintenance). 

Bits 6:11 (7700,,0 bits) contain the current hung time count 

down in seconds. 

Bits 12:17 (77,,0 bits) contain the hung time in seconds. 

Bits 18:23 (0..770000 bits) contain the unit number for 

multiple unit devices like dectapes and magnetic tapes. 

Bits 24:35 (G.,7777 bits) contain the size in words of the 

buffer this device uses. 

2 DEVIOS This is the device's I/O status word. See Section 2.6. 

3 DEVSER The right half of this word contains the address in the 

system of this device's UUO dispatch table. The left half 
contains the address of the next DDB in the list, or zero if 
this is the last DDB. 

4 DEVMOD This is the word returned by the DEVCHR UUO (see page 

33). 

5 DEVLOG This is the device's logical name in sixbit, if any. 



216 DDBs 



DEVBUF 



11 DEVFIL 



The left half of this word contains the user address of the 
output buffer header, if any. The right half contains the 
user address of the input buffer header, if any. 

For directory devices like the disk and dectapes, this word 
contains the sixbit name of the file that is currently open, or 
zero if no file is open. 



12 DEVEXT For directory devices the left half of this word contains the 
file name extension of the file currently open. 



13 FILPRO 



14 FILPPN 



For disk files this word contains the protection, mode and 
date/time written. For dectape files this word contains the 
date written. See the LOOKUP UUO on page 21. 

For disk files this word contains the project-programmer 
name of the file currently open. 



Appendix 7 217 



APPENDIX 7 
STANFORD CHARACTER SET 



The table below gives the octal codes for characters in the Stanford ascii character set. The octal 
code for a character is three digits and is obtained for a character in the table by adding the label 
of the character's row to the label of the character's column. For example, the ascii code for "G" is 
100+7, or 107. 

To get the sixbit code for a character, find the ascii code and subtract 40. Note that the only 
characters with sixbit representations are those with ascii codes in the range 40:137. 

The abbreviations used for special characters in the table are explained below. 



1 



808 


NUL 


i 


a 


a 


A 


^ 


c 


n 


018 


X 


TAB 


LF 


VT 


FF 


CR 


00 


d 


020 


c 





n 


U 


V 


3 





M 


838 




- 


*v 


ii 


< 


> 


2 


V 


848 


SP 


I 


1! 


# 


S 


% 


& 


t 


050 


( 


1 


* 


+ 


* 


- 


t 


/ 


868 


8 


1 


2 


3 


4 


5 


6 


7 


878 


8 


9 





t 


< 


= 


> 


? 


188 


@ 


A 


B 


C 


D 


E 


F 


G 


110 


H 


I 


J 


K 


L 


M 


N 





120 


P 


Q 


R 


S 


T 


U 


V 


u 


130 


X 


Y 


Z 


t 


\ 


] 


t 


- 


140 


4 


a 


b 


c 


d 


e 


f 


9 


150 


h 


i 


J 


k 


1 


m 


n 





160 


P 


q 


p 


6 


t 


u 


V 


u 


178 


X 


y 


z 


( 


1 


ALT 


) 


BS 



NUL (8) 


s a nut 1 . 


TAB (11) 


is a tab. 


LF (12) 


s a 1 inefeed. 


VT (13) 


s a vert ical tab. 


FF (14) 


s a form feed. 


CR (15) 


s a carriage return. 


SP (48) 


s a space. 



ALT (175) is an a I tmode. 
BS (177) is a backspace. 



APPENDIX 8 
DUOS BY NUMBER 



Appendix 8 219 



UUOs 


CflLLIs 


CRLLIs 


CflLLIs 


Opcode 


Name 


Number 


Name 


Number 


Name 


Number 


Name 


040 


CfiLL 





RESET 


400010 


UFBGET 


466666 


SETPRV 


041 


INIT 


1 


DDTIN 


400811 


UFBGIV 


460667 


DDCHflN 


043 


SPCUHR 


2 


SETOOT 


400012 


UFBCLR 


400070 


VDStlflP 


047 


CRLLI 


3 


OOTOUT 


480013 


JBTSTS 


400071 


DSKPPN 


ose 


OPEN 


4 


OEVCHR 


460814 


TTYI03 


460672 


osKTin 


051 


TTYUUO 


5 


OOTGT 


400015 


CORE2 


466673 


SETCRO 


055 


RENRME 


6 


GETCHR 


400016 


RTTSEG 


460074 


CRLLIT 


856 


IN 


7 


ODTRL 


400017 


DETSEG 


400075 


XGPUUO 


057 


OUT 


10 


MBIT 


400020 


SETPRO 


400076 


LOCK 


060 


SETSTS 


11 


CORE 


408021 


SEGNUM 


400077 


UNLOCK 


061 


STflTO 


12 


EXIT 


408022 


SEGSIZ 


400106 


OflYCNT 


062 


CETSTS 


13 


UTPCLR 


408023 


LINKUP 


460161 


BCCTIM 


063 


STflTZ 


14 


ORTE 


400024 


DISMIS 


488182 


UNPURE 


064 


INBUF 


15 


LOGIN 


400025 


INTENB 


488103 


XPRRMS 


065 


OUTBUF 


16 


RPRENB 


400026 


INTORM 


400104 


OEVNUM 


066 


INPUT 


17 


LOGOUT 


400027 


INTBCM 


400105 


RCTCHR 


067 


OUTPUT 


20 


SWITCH 


400030 


INTENS 


400166 


UUOSIM 


070 


CLOSE 


21 


REflSSI 


400031 


INTIIP 


406167 


PPSPY 


071 


RELEflS 


22 


TIMER 


400832 


INTIRQ 


466110 


BDSMRP 


072 


MTflPE 


23 


nSTIME 


400833 


INTGEN 


480111 


BEEP 


073 


UGETF 


24 


GETPPN 


480834 


UWBIT 






074 


USETI 


25 


TRPSET 


480035 


DEBREP 


MfllL 


UUOs 


075 


USETO 


26 


TRPJEN 


408836 


SETNM2 


Number 


Name 


076 


LOOKUP 


27 


RUNTIM 


480037 


SEGNRM 


8, 


SEND 


077 


ENTER 


30 


PJOB 


488840 


IWBIT 


1, 


URCV 






31 


SLEEP 


400041 


USKIP 


2, 


SRCV 






32 


SETPOV 


488042 


BUFLEN 


3, 


SKPHE 


701 


DPYCLR 


33 


PEEK 


400043 


NBMEIN 


*, 


SKPHIM 


702 


PPIOT 


34 


GETLN 


400044 


SLEVEL 


5, 


SKPSEN 


703 


UPGIOT 


35 


RUN 


400045 


IENBU 






704 


UINBF 


36 


SETUUP 


400046 


RUNMSK 


INTUUO* 


705 


UOUTBF 


37 


REHRP 


400047 


TTYMES 


Number 


Name 


706 


FBRERO 


46 


GETSEG 


406050 


JOBRO 


8, 


INTJEN 


707 


FBURT 


41 


GETTBB 


406051 


DEVUSE 


1, 


1MSTH 


710 


(MIL 


42 


SPY 


406852 


SETPR2 


2, 


IHKMSK 


711 


PTYUUO 


43 


SETNflM 


486853 


GETPR2 


3, 


INTOMP 


712 


POINTS 


44 


THPCOR 


480054 


RLEVEL 


*, 


INTIPI 


713 


UPGMVE 






406855 


UFBPHY 


, 


inSKCR 


714 


upcnvn 


400000 


SPWBUT 


486856 


UFBSKP 






715 


PGIOT 


400001 


CTLV 


468857 


FBWRIT 


PGIOTs 


716 


CHNSTS 


400002 


SETNflM 


480860 


UFBERR 


Number 


Name 


717 


CLKINT 


400003 


SPC11GO 


480061 


UflKEME 


, 8, 


PGSEL 


720 


INTMSK 


400004 


SUflP 


460662 


GETNflM 


1, 


PGflCT 


721 


IttSKST 


400005 


EIOTM 


460863 


SNEBKH 


2, 


PGCLR 


722 


IflSKCL 


400006 


LIOTM 


460664 


SNEBKS 


3, 


DDUPG 


723 


INTUUO 


400007 


PNftME 


466865 


GDPTIM 


4, 


PGINFO 



1, 
2, 
3, 



TTYUUOs 

Number Name 
8, INCHRIJ 
OUTCHR 
INCHRS 
OUTSTR 
INCHUL 
INCHSL 
GETLIN 
SETLIN 
RESCRN 
CLRBFI 
CLRBFO 
INSKIP 
INWRIT 
SETRCT 



5. 
6, 
7, 
18, 
11, 
12, 
13, 
1*. 
15, 
16, 
17, 



TTRERD 
OUTFIV 



1, 
2, 
3, 



PTYUUOs 

Number Name 
8, PTYGET 
PTYREL 
PTIFRE 
PTOCNT 
PTR01S 
PTR01H 
PTHR1S 
PTUR1W 
PTRDS 
PTURS7 
PTURS9 
PTGETL 
PTSETL 
PTLORD 



5, 

6, 

7, 

10, 

11, 

12, 

13, 

1*. 

15, 

16, 



PTJOBX 



PPIOTt 

Number Name 
0, PPSEL 
PPRCT 
OPYPOS 
OPYSI2 
PPREL 
PPINFO 
LEYPOS 
PPHLD 



1, 
2, 
3, 
4, 
5, 
6, 
7, 



INDEX 221 



INDEX 

136 interface 167 

167 data channel 172 

: 4 

= 5 

ACCTIM UUO (CALL1 400101) 86 

ACTCHR UUO (CALLI 400105) 47 

activation table 41, 44 

AD/DA converter 167 

ADSM AP UUO (CALLI 4001 10) 73 

ALIAS command 16 

APRENB UUO (CALLI 16) 116 

ARPA network 173 

ascii character codes 217 

ASCII, ASCID and ASCIZ representations 

203 

ASSIGN command 29 
ATTSEG UUO (CALLI 400016) 80 
audio switch 72 
bad retrieval 25 
BEEP UUO (CALLI 4001 1 1) 76 
bit numbers 5 
bits, groups of 5 
bits, references to 5 
bless host 180 
buffer diagram 12 
buffer header 10 
buffer pointers 1 1 
buffer rings 10 
buffer rings, setting up 19 
buffer sizes, nonstandard 20 
buffer-creating UUOs 19 
buffered mode 8 
buffers 1 1 

BUFLEN UUO (CALLI 400042) 20 
CALL UUO (UUO 040) 3 
CALLI UUO (UUO 047) 3 
CALLIT UUO (CALLI 400074) 91 
cameras, TV 170 
channel number 8 
channel use bits 32 
character mode 40 
character set 217 
CHNSTS UUO (UUO 716) 32 
CLKINT UUO (UUO 717) 110 
clock interrupts 1 10 
CLOSE UUO (UUO 070) 28 
CLRBFI UUO (TTYUUO 11.) 43 
CLRBFO UUO (TTYUUO 12,) 43 



CLSR bit (20000,,0--IMP connection status) 

174 
CLSS bit (40000,,0-IMP connection status) 

174 

CMWB bit (200000,,0-job status) 90 
compute time 86 
CONNECT to socket 177 
CONTROL and MET A keys 38, 52, 54 
control-C by PTYUUO, sending 54 
control-CR, disabling 44 
COPY 15 

CORE UUO (CALLI 11) 87 
CORE2 UUO (CALLI 400015) 79 
creation date 22 
CSTART command 207 
CTLV UUO (CALLI 400001) 47 
CTROV bit (0,,1000-IMP status) 175 
DART 15 

Data Disc channels 68 
Data Disc display system 195 
Data Disc displays 60 
data modes 8 

data switches, POP- 10 console 91 
date format, system 85 
date last dumped 142 
DATE UUO (CALLI 14) 85 
dates and times from UUOs 85 
DAYCNT UUO (CALLI 400100) 85 
DDEs 215 

DDCHAN UUO (CALLI 400067) 68 
DDT 134,206 
DDT command 134,207 
DDTGT UUO (CALLI 5) 140 
DDTIN UUO (CALLI 1) 138 
DDTOUT UUO (CALLI 3) 139 
DDTRL UUO (CALLI 7) 140 
DDUPG UUO (PGIOT 3.) 67 
DEASSIGN command 29 
DEBR E AK UUO (CALLI 400035) 1 1 1 
DEC UUOs 4 
DECIMAL 5 
dectapes 159 
DELETE command 15 
delete-protect bit (200-file protection) 15 
deleting files 23 
detached jobs 40 

DETSEG UUO (CALLI 400017) 80 
DEVCHR UUO (CALLI 4) 33 
device characteristics word 33 
device data blocks 215 



222 INDEX 



device I/O status word see I/O device status 

word 

device names, logical and physical 17 
device unit number, finding 35 
DEVNUM UUO (CALLI 4000104) 35 
DEVUSE UUO (CALLI 400051) 34 
directory files 141 
disk error codes 25 
disk file record offset 143 
disk files 141 
Disk PPN 16 
disk, bad retrieval for 25 
disk, full 25 

DISMiS UUO (CALLI 400024) 102, 110 
display output 59 

display programming, an example 185 
display programs 64 
displays, Data Disc 60 
displays, III 59 
displays, resetting 68 
DMPBIT bit (0,,400-disk status) 143 
DPYCLR UUO (UUO 701) 68 
DPYOUT 65 

DPYPOS UUO (PPIOT 2.) 62 
DPYSIZ UUO (PPIOT 3.) 62 
DSKPPN UUO (CALLI 400071) 16 
DSKTIM UUO (CALLI 400072) 86 
dump date for disk files 142 
dump mode 8, 9 
dump mode command lists 9 
dump-never bit (400--file protection) 15 
echo suppression for terminals 37, 42, 47, 56 
EIOTM UUO (CALLI 400005) 135 
ENTER UUO (UUO 077) 22, 165 
ENTERS, long block 142 
ENTRB bit (0,,20000-channel status) 32 
escape characters by PTYUUO, sending 52 
example of display programming 185 
example of general I/O 183 
example of using interrupts 188 
EXIT UUO (CALLI 12) 125 
extended UUOs 2 
FAIL 2, 3 
fast bands 119 

FBERP bit (0,,4000-job status) 91 
FBINP bit (0,,10000-job status) 91 
FBREAD UUO (UUO 706) 121 
FBWA1T UUO (CALLI 400057) . 122 
FBWRT UUO (UUO 707) 121 
file dumping 15 



file protection bits 15 

file's protection, mode written, and date/time 

written 21 
filenames 14 
filenames, changing 23 
files 14 

files, creating 22 
files, deleting 23 
files, extending 31 
files, opening 21 
files, random access of 29 
files, updating 24 
Font compile and select 154 
Font Compiler 157 
full-character-set mode 41 
GARBIT bit (0,,200-disk status) 143 
GARBIT bit (0..200--UDP status) 166 
GCW 149 

GDPTIM UUO (CALLI 400065) 140 
GETCHR UUO (CALLI 6) 139 
GETLIN UUO (TTYUUO 6,) 40 
GETLN UUO (CALLI 34) 48 
GETNAM UUO (CALLI 400062) 87 
GETPPN UUO (CALLI 24) 87 
GETPR2 UUO (CALLI 400053) 93 
GETSEG UUO (CALLI 40) 140 
GETSTS UUO (UUO 062) 31 
. GETTAB UUO (CALLI 41) 140 
glitch hold count 63, 64 
glitches 62 

Group Command Word 149 
HDEAD bit (0,,2000-IMP status) 175 
hidden records 143 
high segments see upper segments 
HNGTRP bit (0,,200-LPT status) 148 
I/O byte pointer and byte count 10 
I/O channels 7 

I/O device status word 13,31,48 
I/O Devices 141 
I/O status error bits 26 
I/O status testing and setting 31 
I/O UUOs, example sequence of 7 
I/O, an example 183 
I/O, general 7 
I/O, synchronous 14 
I/O, terminating 28 
I/O, transferring data 26 
I/O, TTY 37 

IBUFB bit (0,,200000-channel status) 32 
ICLOSB bit (0,,2000-channel status) 33 



INDEX 223 



IENBW UUO (CALL1 400045) 112 

III display processor 189 

III displays 59 

illegal memory reference 106 

ILM bit (0,,20000-interrupt bits) 106 

IMLACs, sending special commands to 45 

IMP 173 

IMSKCL UUO (UUO 722) 113 

IMSKCR UUO (INTUUO 5,) 115 

1MSKST UUO (UUO 720 113 

JMSTW UUO (INTUUO 1.) 114 

IN UUO (UUO 056) 26 

INBFB bit (0,,400-channel status) 33 

INBUF UUO (UUO 064) 19 

INCHRS UUO (TTYUUO 2.) 39 

INCHRW UUO (TTYUUO 0,) 39 

INCHSL UUO (TTYUUO 5.) 40 

INCHWL UUO (TTYUUO 4.) 40 

information UUOs 85 

INIT UUO (UUO 041) 18 

IN1TB bit (0,,400000-channel status) 32 

initializing a device 17 

INPB bit (0,,10000-chamiel status) 32 

INPUT UUO (UUO 066) 26 

input/output see I/O 

INSKIP UUO (TTYUUO 13,) 43 

1NTACM UUO (CALLI 400027) 109 

1NTCLK bit (200,,0-interrupt bits) 105 

INTDMP UUO (INTUUO 3,) 114 

INTENB UUO (CALLI 400025) 109 

INTENS UUO (CALLI 400030) 109 

interrupt level 108 

interrupt mask 112, 115 

interrupt-wait wakeup mask 1 14 

interrupts pending 112 

interrupts, an example 188 

interrupts, generating 112, 115 

interrupts, new style 107 

interrupts, old style 1 16 

interrupts, user 103 

INTFOV bit (0,,1 CO-interrupt bits) 106 

INTGEN UUO (CALLI 400033) 1 12 

INTIIP UUO (CALLI 400031) 137 

INTIMS bit (20,,0-interrupt bits) 105, 175 

INTINP bit (10,,0-interrupt bits) 105, 175 

1NTINR bit (100,,0--IMP connection status) 

174 

INTINR bit (100,,0-interrupt bits) 105, 175 
INTINS bit (40,,0-IMP connection status) 174 
INTINS bit (40,,0-interrupt bits) 105, 175 



INTIPI UUO (INTUUO 4.) 115 
INTIRQ, UUO (CALLI 400032) 1 12 
INTJEN UUO (INTUUO 0,) 113 
INTMA1L bit (4000,,0-interrupt bits) 105 
INTMSK UUO (UUO 720) 1 12 
INTORM UUO (CALLI 400026) 109 
INTOV bit (0,,10-interrupt bits) 106 
INTPAR bit (400,,0-interrupt bits) 105 
INTPTI bit (1000,,0-interrupt bits) 105 
INTPTO bit (10000,,0-interrupt bits) 104 
INTQXF bit (2,,0-interrupt bits) 105 
introduction 1 

INTSHD bit (40000,,0-interrupt bits) 104 
INTSHW bit (100000,,0-interrupt bits) 104 
INTSWD bit (200000,,0-interrupt bits) .104 
INTSWW bit (400000,,0-interrupt bits) 104 
INTTTI bit (4,,0-interrupt bits) 105 
1NTTTY bit (20000,,0-interrupt bits) 104 
INTUUO UUO (UUO 723) 113 
INTWAIT bit (2000,,0-interrupt bits) 105 
INWAIT UUO (TTYUUO 14.) 44 
IOACT bit (0..10000--I/O status) 13 
IOBKTL bit (0..40000--I/O status) 13, 26, 159 
IOBOT bit (0..4000--I/O status) 161 
IOCON bit (0..40--I/O status) 13 
IODEND bit (0,,20000--I/O status) 1 3, 26 
IODERR bit (0,,200000-I/O status) 13, 26, 

153 
IODTER bit (0,,100000~I/O status) 13, 26, 

153 
IOIMPM bit (0..400000-I/O status) 13, 26, 

153 

IONRCK bit (0..100--I/O status) 161 
IOP 172 

IOPAR bit (0,,1000"I/O status) 161 
IOSUPR bit (0,,1000-TTY I/O status) 146 
IOT UUOs 4 

IOT-USER mode 2,135,203 
IOTEND bit (0..2000--I/O status) 153, 161 
IOWC bit (0..20--I/0 status) 11,14 
IOWD 9, 204 

1WAIT UUO (CALLI 400040) 1 1 1 
IWKMSK UUO (INTUUO 2,) 1 14 
J ACCT bit ( 1 00000,,0-job status) 90 
JBTSTS UUO (CALLI 400013) 90 
JERR bit (20000,,0--job status) 90 
JLOCK bit (0,, 100000- job status) 91 
JLOG bit (10000,,0- job status) 90 
JNA bit (40000,,0-job status) 90 
job data area 205 



224 INDEX 



job information 86 

job name 87, 88, 89 

job number 87 

job status word 90 

job using a device 34 

JOBAPR 103, 108, 116,207 

JOBCNI 103,104,107,116,137,207 

JOBDDT 134,206 

JOBENB 205 

JOBFF 19, 126,207 

JOBHCU 206 

JOBHRL 77, 206 

JOBINT 108, 206 

JOBJDA 206 

JOBOPC 207 

JOBPC 206 

JOBRD UUO (CALLI 400050) 133 

JOBREL 19,77,205 

JOBREN 207 

jobs waiting for a device, number of 34 

JOBSA 126, 128, 206 

JOBTPC 103, 107, 111, 116,207 

JSEG bit (1000,,0-job status) 90 

JWP bit (1,,0-job status) 91 

letters, =32 word 95 

LEYPOS UUO (PPIOT 6,) 63 

LF insertion after CRs 37, 42 

Librascope fast band storage 1 19 

line characteristics 40, 42 

line characteristics, PTY 54 

line editor Y-position 63 

line hold count 63, 64 

line mode 40 

line number, finding TTY 40 

Line Printer 147 

LINKUP UUO (CALLI 400023) 78 

LIOTM UUO (CALLI 400006) 138 

LISTEN for connect to socket 177 

LOCK UUO (CALLI 400076) 133 

logical device name 17 

LOGIN UUO (CALLI 15) 140 

LOGOUT UUO (CALLI 17) 140 

LOOKB bit (0,,40000-channel status) 32 

LOOKUP UUO (UUO 076) 21 

LOOKUPS, long block 142 

lower segments see upper segments 

LPT 147 

LPTNCC bit (0,,100-LPT status) 148 

MACRO 3 

magnetic tapes 9, 161 



mail system, inter- job 95 

mail system, inter- job, an example 188 

MAIL UUO (UUO 710) 95 

mail, receiving 96 

mail, sending 95 

mailboxes, peeking at 97 

microswitch keyboard bits 45 

misc. UUOs 125 

modes, I/O data 8 

monitor calls 1 

monitor commands, rescanning 43 

monitor pointers 209 

monitor, peeking at the 89 

MSTIME UUO (CALLI 23) 86 

MTAPE UUO (UUO 072) 144, 154, 162, 176 

MTAPE UUO for magnetic tapes 162 

MTAPE UUO for the disk 144 

MTAPE UUO for the IMP 176 

MTAPE UUO for the XGP 154 

NAMEIN UUO (CALLI 400043) 89 

network, ARPA 173 

NOECHB bit (0,,400-TTY I/O status) 146 

NOECHO bit (0,,200-TTY I/O status) 146 

non-existent memory reference 106 

NXM bit (0,,10000-interrupt bits) 106 

OBUFB bit (0,,100000--channel status) 32 

OCLOSB bit (0,,1000-channel status) 33 

OCTAL 5 

OPEN UUO (UUO 050) 18 

OUT UUO (UUO 057) 27 

OUTBFB bit (0,,200-channel status) 33 

OUTBUF UUO (UUO 065) 19 

OUTCHR UUO (TTYUUO 1.) 39 

OUTFIV UUO (TTYUUO 17.) 45 

OUTPB bit (0,,4000-channel status) 33 

OUTPUT UUO (UUO 067) 27 

OUTSTR UUO (TTYUUO 3.) 39 

overflow, arithmetic 106 

page printer 61, 62 

paper tape 163, 164 

parity error 105, 107 

PC flags 202 

POP- 10 information 201 

PEEK UUO (CALLI 33) 93 

PGACT UUO (PGIOT 1.) 66 

PGCLR UUO (PGIOT 2.) 66 

PGINFO UUO (PGIOT 4,) 67 

PGIOT UUO (UUO 715) 66 

PGSEL UUO (PGIOT 0.) 66 

phantom jobs 132 



INDEX 225 



physical device name 17, 35 

physical name of attached terminal 48 

pieces of glass 59, 66, 67 

pieces of paper 61 

PJOB UUO (CALLI 30) 87 

plotter 163 

PN AM E UUO (CALLI 400007) 35 

POINTS UUO (UUO 712) 82 

POV bit (0,,200000-interrupt bits) 105 

PPACT UUO (PPIOT 1.) 61 

PPHLD UUO (PPIOT 7.) 64 

PPINFO UUO (PPIOT 5.) 62 

PPIOT UUO (UUO 702) 61 

PPN word of zero 16 

PPR EL UUO (PPIOT 4,) 62 

PPSEL UUO (PPIOT 0,) 61 

PPSPY UUO (CALLI 400107) 64 

privileges 88 

project-programmer name 14, 16, 87 

protection constant of a job 205 

protection key for disk files 15 

pseudo-teletypes 48 

PTGETL UUO (PTYUUO 13.) 54 

PTIFRE UUO (PTYUUO2,) 51 

PTJOBX UUO (PTYUUO 16.) 56 

PTLOAD UUO (PTYUUO 15.) 55 

PTOCNT UUO (PTYUUO 3.) 51 

PTP 163 

PTR 164 

PTRD IS UUO (PTYUUO 4.) 51 

PTRD1W UUO (PTYUUO 5.) 52 

PTRDS UUO (PTYUUO 10.) 53 

PTSETL UUO (PTYUUO 14,) 54 

PTWR IS UUO (PTYUUO 6.) 52 

PTWR1W UUO (PTYUUO 7.) '53 

PTWRS7 UUO (PTYUUO 11.) 53 

PTWRS9 UUO (PTYUUO 12.) 54 

PTY echoing 49 

PTY line characteristics 54 

PTY line characteristics, initial 48 

PTY line numbers 48 

PTYGET UUO (PTYUUO 0,) 50 

PTYREL UUO (PTYUUO I,) 50 

PTYs 48 

PTYUUO UUO (UUO 711) 49 

PTYUUOs to physical TTYs 49 

PTYWAKE 41,52 

push-down stack overflow 105, 117 

RAID 134,206 

random access to files 29 



re-edited line, activation character of 47, 63 

re-edited line, number of characters in 44 

re-editing lines with PTLOAD 55 

Read-Alter (RA) mode 24 

reading data 26 

REASSI UUO (CALLI 21) 29 

record offset feature 143, 145 

REENTER command 207 

RELEAS UUO (UUO 071) 29 

REMAP UUO (CALLI 37) 79 

RENAME UUO (UUO 055) 23, 166 

RENAMES, long block 142 

RESCAN UUO (TTYUUO 10.) 43 

RESET UUO (CALLI 0) 126 

RFCR bit (100000,,0-IMP connection status) 

174 
RFCS bit (200000,,0-fMP connection status) 

174 

RLEVEL UUO (CALLI 400054) 89 
RSET bit (0,,400-IMP status) 175 
RUN bit (400000,,0-job status) 90 
RUN UUO (CALLI 35) 129 
RUNMSK UUO (CALLI 400046) 138 
RUNTIM UUO (CALLI 27) 86 
second segments see upper segments 
SEGNAM UUO (CALLI 400037) 82 
SEGNUM UUO (CALLI 400021) 83 
SEGSIZ UUO (CALLI 400022) 139 
SEND UUO (MAIL 0,) 95 
service level 89 

SET ACT UUO (TTYUUO 15.) 44 
SETCRD UUO (CALLI 400073) 88 
SETDDT UUO (CALLI 2) 134 
SETLIN UUO (TTYUUO 7.) 42 
SETNAM UUO (CALLI 400002) 139 
SETNAM UUO (CALLI 43) 88 
SETNM2 UUO (CALLI 400036) 82 
SETPOV UUO (CALLI 32) 117 
SETPR2 UUO (CALLI 400052) 92 
SETPRO UUO (CALLI 400020) 81 
SETPRV UUO (CALLI 400066) 88 
SETSTS UUO (UUO 060) 31 
SETUWP UUO (CALLI 36) 81 
SHF bit (4000,,0--job status) 90 
simulating UUOs 131 
sixbit character codes 217 
SIXBIT representation 203 
SKPHIM UUO (MAIL 4.) 97 
SKPME UUO (MAIL 3,) 97 
SKPSEN UUO (MAIL 5,) 96 



226 INDEX 



SLEEP UUO(CALLI 31) 125 

SLEVEL UUO (CALLI 400044) 89 

SNEAKS UUO (CALLI 400064) 47 

SNEAKW UUO (CALLI 400063) 47 

sound sources 72 

sound system, 4-channel 167 

spacewar buttons 100, 134 

spacewar level, executing UUOs at 100 

spacewar mode 99 

spacewar modules, killing 101 

SPCWAR UUO (UUO 043) 101 

SPCWGO UUO (CALLI 400003) 101 

special activation mode 41, 44 

SPWBUT UUO (CALLI 400000) 134 

SPY UUO (CALLI 42) 140 

SRCV UUO (MAIL 2.) 97 

SSAVE command 77 

Stanford UUOs 4 

START command 207 

STATO UUO (UUO 061) 32 

status word, I/O device set I/O device status 

word 

STATZ UUO (UUO 063) 32 
SWAP UUO (CALLI 400004) 127 
SWITCH UUO (CALLI 20) 91 
SWP bit (2000,,0-job status) 90 
SYSDEV bit (0,,100-channel status) 33 
system date format 85 
terminal, physical name of attached 48 
terminals 146 

terminals, sending messages to 46 
terminology in this manual 4 
TIMER UUO (CALLI 22) 85 
TMO bit (0,,200-IMP status) 175 
TMPCOR UUO (CALLI 44) 129 
TPMON bit (400,,0--TTY I/O status) 146 
TRPJEN UUO (CALLI 26) 140 
TRPSET UUO (CALLI 25) 140 
TTCALL 38 

TTREAD UUO (TTYUUO 16.) 45 
TTY echoing 37, 47 
TTY I/O 37 

TTY I/O status word 48, 146 
TTY input buffer, peeking at 47 
TTY input buffers, clearing 43 
TTY input, LF insertion 37 
TTY line characteristics 40 
TTY line number, finding 40 
TTY output buffer, clearing 43 
TTY UUOs, miscellaneous 46 



TTY ECHO and TTY NO ECHO 42 

TTY FILL and TTY NO FILL 41 

TTY FULL and TTY NO FULL 42 

TTY TAB and TTY NO TAB 42 

TTYIOS UUO (CALLI 4000 14) 48 

TTYMES UUO (CALLI 400047) 46 

TTYUUO UUO (UUO 051) 38 

TV cameras 170 

UDP 165 

UDSD bit (OJOO--I/O status) 159 

UFBCLR UUO (CALLI 400012) 120 

UFBERR UUO (CALLI 400060) 123 

UFBGET UUO (CALLI 400010) 120 

UFBGIV UUO (CALLI 40001 1) 120 

UFBPHY UUO (CALLI 400055) 122 

UFBSKP UUO (CALLI 400056) 122 

UGETF UUO (UUO 073) 31 

UINBF UUO (UUO 704) 20 

understanding this manual 4 

unit number of a device 35 

UNLOCK UUO (CALLI 400077) 134 

UNPURE UUO (CALLI 400102) 81 

unused opcodes 2 

UOUTBF UUO (UUO 705) 20 

UPGIOT UUO (UUO 703) 65 

UPGMVE UUO (UUO 713) 68 

UPGMVM UUO (UUO 714) 67. 

upper segments 77 

upper segments, making and killing 77 

upper segments, protection keys of 77, 81 

upper segments, simulated 92 

upper segments, status of 81 

upper segments, write protecting 77, 81 

User Disk Pack 165 

user interrupt system see interrupts, user 

user level 108 

user UUOs 3 

USET pointer 144 

USETI UUO (UUO 074) 30 

USETO UUO (UUO 075) 30 

USKIP UUO (CALLI 400041) 137 

UTPCLR UUO (CALLI 13) 160 

UUO mnemonics 2, 91 

UUO trapping 3 

UUOs 1 

UUOs at spacewar level 100 

UUOs by name see back cover 

UUOs by number 219 

UUOs, extended 2 

UUOs, obsolete 137 



INDEX 227 



UUOs, simulating 131 

UUOs, user-defined 3 

UUOSIM UUO (CALLI 400106) 131 

U W AIT UUO (CALLI 400034) 1 10 

VDSMAP UUO (CALLI 400070) 70 

video switch 70 

WAIT UUO (CALLI 10) 27 

WAKEME UUO (CALLI 400061) 132 

word count computation 14 

WRCV UUO (MAIL 1.) 96 

writing data 27 

XGP (Xerox Graphics Printer) 149 

XGP character mode 150 

XGP escapes 150 

XGP video mode 149 

XGPUUO UUO (CALLI 400075) 157 

XPARMS UUO (CALLI 400103) 140 

Y-position of line editor 63 

zero PPN 16 






Name. . . 


uuo 


Page 


Name. . . 


UUO..... 


.Page 


Name. . . 


UUO 


Page 


Name. . . 


UUO 


Page 


RCCTin 


CflLLl 480181 


86 


IENBU 


CRLLI 408845 


112 


PGINFO 


PGIOT 4, 


67 


SETSTS 


868 


31 


PCTCHR 


CRLLI 400105 


47 


IMSKCL 


722 


113 


PGIOT 


715 


66 


SETUUP 


CRLLI 36 


81 


RDSflflP 


CRLLI 480118 


73 


IrtSKCR 


INTUUO 5, 


115 


PGSEL 


PGIOT 8, 


66 


SKPHin 


MRIL 4, 


97 


RPRENB 


CflLLl 16 


116 


IrtSKST 


721 


113 


PJOB 


CRLLI 30 


87 


SKPME 


nRIL 3, 


97 


RTTSEG 


CRLLI 488816 


80 


IMSTM 


INTUUO 1, 


114 


PNfltlE 


CflLLl 408007 


35 


SKPSEN 


MRIL 5, 


96 


BEEP 


CRLLI 488111 


76 


IN 


056 


26 


POINTS 


712 


82 


SLEEP 


CRLLI 31 


125 


BUFLEN 


CRLLI 488842 


28 


INBUF 


064 


19 


PPRCT 


PPIOT 1, 


61 


SLEVEL 


CRLLI 480844 


89 


CRLL 


040 


3 


INCHRS 


TTYUUO 2, 


39 


PPHLO 


PPIOT 7, 


64 


SNERKS 


CRLLI 406064 


47 


CRLLI 


847 


3 


INCHRU 


TTYUUO 8, 


39 


PPINFO 


PPIOT 5, 


62 


SNERMJ 


CflLLl 400063 


47 


CRLLIT 


CflLLl 488874 


91 


INCHSL 


TTYUUO 5, 


48 


PPIOT 


782 


ei 


SPCURR 


043 


101 


CHNSTS 


716 


32 


INCHI-IL 


TTYUUO 4, 


48 


PPREL 


PPIOT 4, 


62 


SPCIIGO 


CRLLI 400603 


181 


CLKINT 


717 


110 


INIT 


841 


18 


PPSEL 


PPIOT 8, 


61 


SPUBUT 


CflLLl 480800 


134 


CLOSE 


878 


28 


INPUT 


866 


26 


PPSPY 


CRLLI 488107 


64 


SPY 


CRLLI 42 


140 


CLRBFI 


TTYUUO 11, 


43 


INSKIP 


TTYUUO 13, 


. 43 


PTGETL 


PTYUUO 13, 


54 


SRCV 


riRIL 2, 


97 


CLRBFO 


TTYUUO 12, 


43 


INTRCH 


CRLLI 480827 


189 


PTIFRE 


PTYUUO 2, 


51 


STRTO 


061 


32 


CORE 


CRLLI 11 


87 


INTDflP 


INTUUO 3, 


114 


PTJOBX 


PTYUUO IB, 


56 


STRTZ 


063 


32 


CORE2 


CflLLI 488015 


79 


INTENB 


CflLLl 400025 


189 


PTLOflO 


PTYUUO 15, 


55 


SURP 


CflLLl 480004 


127 


CTLV 


CflLLl 488081 


47 


INTENS 


CflLLl 400030 


189 


PTOCNT 


PTYUUO 3, 


51 


SWITCH 


CflLLl 28 


91 


ORTE 


CflLLl 14 


85 


INTGEN 


CflLLl 400033 


112 


PTRD1S 


PTYUUO 4, 


51 


TIMER 


CflLLl 22 


85 


DRYCNT 


CRLLI 488188 


85 


INTIIP 


CflLLl 400831 


137 


PTR01H 


PTYUUO 5, 


52 


TMPCOR 


CRLLI 44 


129 


DDCHRN 


CRLLI 488867 


68 


INTIPI 


INTUUO 4, 


115 


PTRDS 


PTYUUO 18, 


53 


TRPJEN 


CflLLl 26 


140 


DDTGT 


CRLLI 5 


140 


INTIRQ 


CflLLl 488832 


112 


PTSETL 


PTYUUO 14, 


54 


TRPSET 


CflLLl 25 


148 


DD7IN 


CflLLl 1 


138 


INTJEN 


INTUUO 8, 


113 


PTHR1S 


PTYUUO 6, 


52 


TTREflO 


TTYUUO 16, 


45 


DOTOUT 


CflLLl 3 


139 


INTHSK 


728 


112 


PTUR1U 


PTYUUO 7, . 


53 


TTYIOS 


CRLLI 480814 


48 


ODTRL 


CRLLI 7 


140 


INTORH 


CflLLl 400826 


189 


PTURS7 


PTYUUO 11, 


53 


TTYHES 


CRLLI 460047 


46 


DDUPG 


PGIOT 3, 


67 


INTUUO 


723 


113 


PTURS9 


PTYUUO 12, 


54 


TTYUUO 


051 


38 


DEBRERK 


CflLLl 488035 


111 


INURIT 


TTYUUO 14, 


44 


PTYGET 


PTYUUO 0, 


58 


UFBCLR 


CflLLl 400812 


128 


OETSEC 


CflLLl 480617 


80 


JUfllT 


CRLLI 488648 


111 


PTYREL 


PTYUUO 1, 


58 


UFBERR 


CRLLI 400860 


123 


OEVCHR 


CRLLI 4 


33 


iiJKnsr. 


INTUUO 2, 


114 


PTYUUO 


711 


49 


UFBGET 


CRLLI 400018 


126 


OEVNUI1 


CflLLl 4880184 


35 


JBTSTS 


CRLLI 480013 


90 


REflSSI 


CflLLl 21 


29 


UFBGIV 


CRLLI 400011 


120 


DEVUSE 


CflLLl 488051 


34 


JOBRD 


CflLLl 468058 


133 


RELERS 


871 


29 


UFBPHY 


CRLLI 400055 


122 


D1SMIS 


CfilLI 488024 


182 


LEYPOS 


PPIOT 6, 


63 


REMRP 


CflLLl 37 


79 


UFBSKP 


CRLLI 400056 


122 


oisnis 


CflLLl 400024 


118 


LINKUP 


CRLLI 488023 


78 


RENRHE 


855 


23 


UGETF 


073 


31 


DPYCLR 


781 


68 


L10TM 


CRLLI 408866 


138 


RENRME 


855 


166 


UINBF 


784 


20 


OPYPOS 


PPIOT 2, 


62 


LOCK 


CRLLI 488676 


133 


RESCRN 


TTYUUO 10, 


43 


UNLOCK 


CRLLI 400077 


134 


DPYSIZ 


PPIOT 3, 


62 


LOGIN 


CRLLI 15 


146 


RESET 


CflLLl 8 ' 


126 


UNPURE 


CRLLI 400102 


81 


OSKPPN 


CflLLl 488071 


16 


LOGOUT 


CflLLl 17 


148 


RLEVEL 


CflLLl 400054 


89 


UOUTBF 


785 


26 


OSKTIH 


CflLLl 480072 


86 


LOOKUP 


876 


21 


RUN 


CflLLl 35 


129 


UPGIOT 


703 


65 


EIOTtl 


CflLLl 400005 


135 


tlRIL 


718 


95 


RUNflSK 


CflLLl 486646 


138 


UPGMVE 


713 


68 


ENTER 


077 


22 


HSTIHE 


CRLLI 23 


86 


RUNTin 


CRLLI 27 


86 


upcnvn 


714 


67 


ENTER 


077 


165 


IITflPE 


872 


144 


SEGNflM 


CflLLl 488837 


82 


USETI 


074 


38 


EXIT 


CflLLl 12 


125 


MTflPE 


872 


154 


SEGNUn 


CRLLI 408821 


83 


USETO 


075 


30 


FBREflD 


786 


121 


flTRPE 


872 


162 


SEGSIZ 


CRLLI 408822 


139 


USKIP 


CRLLI 408041 


137 


FBUflIT 


CflLLl 480057 


122 


HTRPE 


872 


176 


SEND 


nRIL 0, 


95 


UTPCLR 


CRLLI 13 


160 


FBURT 


707 


121 


NflHEIN 


CRLLI 488843 


89 


SETflCT 


TTYUUO 15, 


44 


uuosin 


CRLLI 406186 


131 


GOPTIM 


CRLLI 400065 


140 


OPEN 


858 


18 


SETCRO 


CRLLI 400873 


88 


UUflIT 


CRLLI 460034 


110 


GETCHR 


CflLLl 6 


139 


OUT 


857 


27 


SETDOT 


CflLLl 2 


134 


VOSflflP 


CRLLI 400070 


78 


GETLIN 


TTYUUO 6, 


40 


OUTBUF 


865 


19 


SETLIN 


TTYUUO 7, 


42 


WRIT 


CflLLl 10 


27 


GETLN 


CflLLl 34 


48 


OUTCHR 


TTYUUO 1, 


39 


SETNflfl 


CRLLI 43 


88 


URKEflE 


CflLLl 400061 


132 


GETNRH 


CflLLl 400062 


87 


OUTFIV 


TTYUUO 17, 


45 


SETNfifl 


CflLLl 480882 


139 


HRCV 


HRIL 1, 


96 


GETPPN 


CRLLI 24 


87 


OUTPUT 


867 


27 


SETNM2 


CflLLl 486836 


82 


XGPUUO 


CflLLl 480075 


157 


GETPR2 


CRLLI 400053 


93 


OUTSTR 


TTYUUO 3, 


39 


SETPOV 


CflLLl 32 


117 


XPflRMS 


CflLLl 400103 


146 


GETSEG 


CRLLI 48 


140 


PEEK 


CRLLI 33 


93 


SETPR2 


CflLLl 486852 


92 








GETSTS 


062 


31 


PGflCT 


PGIOT 1, 


66 


SETPRO 


CflLLl 466828 


81 








GETTRB 


CRLLI 41 


140 


PGCLR 


PGIOT 2, 


66 


SETPRV 


CRLLI 488866 


88