RFC 190
DEC PDP-10-IMLAC communications system
DEC PDP-10 -- IMLAC COMMUNICATION SYSTEM ๐
RFC 190 ๐ Network Working Group, written by P. Deutsch of the Xerox Research Center in Palo Alto, CA (NIC 7135), dated 13 July 1971. The title block doesn't list anything it obsoletes or updates, and it doesn't state a category or status either. ๐ง
This report describes an operational system for communicating textual display information between a main-site computer and a remote-display processor. โจ
The main site machine is a DEC PDP-10 with the BBN paging hardware, which everyone calls TENEX ๐ธ
The remote machine is an IMLAC PDS-1, which we'll just call IMLAC ๐
Here's how the doc is laid out ๐
- Section (1) explains the IMLAC hardware configurations.
- Section (II) covers the display facilities users get.
- Section (III) covers the system calls (JSYS calls) that TENEX's monitor implements to provide those facilities.
- Section (IV) describes the message formats used for communication between TENEX and the IMLAC.
- Section (V) analyzes how responsibility is split between the two machines.
(1) Hardware configurations. ๐ฅ
The standard IMLAC is a 16-bit minicomputer with 4K of 2 microsecond core, a cycle-stealing display, an input keyboard, and an asynchronous serial communication interface. ๐ป
The display is normally programmed to draw characters using very short vectors. ๐ฆ
There are two major display configurations, and which one you have depends on whether or not there's hardware for drawing long vectors. Specs that depend on the configuration are flagged LVH or non-LVH, respectively. ๐
The I/O system normally does not provide interrupts when characters arrive from the serial interface. ๐ญ
Honestly the IMLAC is barely able to keep up with the PDP-10 without this feature, so the team convinced the manufacturer to build it in. ๐
No special hardware is required for the software described here. That said, the character interrupt and the SRI-ARC "mouse" and "keyset" are highly recommended, and the software is designed around using them. ๐ฑ๏ธโจ
(II) Facilities. ๐
Each display console in the system can be in "display mode" or "teletype simulation mode." ๐
In display mode, the info on screen is text strings placed at arbitrary positions on the display face. ๐
In teletype simulation mode, the display shows the last 20-30 lines that would appear on a teletype listing. ๐
A console can switch between these modes under program control without losing any information. Iconic โจ
Regardless of mode, every display has a cursor string that follows the position of the pointing device. ๐
The implemented system mostly uses a "mouse," but one console uses a tablet. ๐ฑ๏ธ
A program can set the cursor string, for example to hint at what kind of object the user is supposed to point at. ๐ง
In display mode, a console's screen is split into rectangular blocks called "display areas." ๐ช
This lets multiple users communicate through one display that's divided into several areas. ๐ซถ
When a user (or program) requests a display area, they specify how many text strings they'll want to display in it. ๐
Each string has its own X-Y location, character size, font (italic, underline, ...), and an arbitrary number of characters. ๐ฆ
Each of these components can be set without disturbing the others. Main character energy ๐
Each string can be manipulated without affecting the others. ๐
(III) JSYS calls. ๐ฅ
(ADA) Assign a display area. ๐ธ
JSYS ada: [440B] allocate a display area
Accepts:
r1:
upper-left-y-cord[10], upper-left-x-cord[10], max-no-
string[11]
r2:
lower-right-y-cord[10], lower-right-x-cord[10], default-c-
size[2], default-n-inc[6], default-font[5]
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
r1: da-id[18]
So ADA allocates a display area when you give it the coordinates of the diagonal, the max number of strings to display, and the default character size, font, and horizontal increment. โจ It hands back an 18-bit da-id, which you should then use to refer to that display area. ๐
(DDA) Deallocate a display area. ๐ง
JSYS dda; [441B] deallocate a display area
Accepts:
r1: da-id
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
DDA deallocates a display area, using the da-id tied to it. Bye bye, area ๐
(STRDA) STRing display: add, delete, or change. ๐
JSYS strda; [442B] Manipulate (move, write, replace, delete) a
string in a display area
Accepts:
r1: string-id[18], da-id[18]
r2: first byte pointer or 0 or -1
r2: second byte pointer or 0
r4: y-cord[10], x-cord[10], font[6], c-size[3], h-inc[7]
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
r1: string-id[18]
STRDA is the big one ๐ญ It writes a new string, replaces one, deletes one, or moves one (optionally replacing it) inside a display area. You can also set the font, character size, and horizontal increment for the string. ๐ฅ
The string can be given as two byte pointers, or as one byte pointer where the string ends with a zero character. ๐งฉ
- If the first byte pointer is zero:
- If a new string is being written, the error code illstr is returned.
- Otherwise the string already exists, so it gets deleted from the display area.
- If the first byte pointer is -1:
- If a new string is being written, the error code illstr is returned.
- Otherwise, the old string gets used.
- If the first character of the string is a zero character, the string to display is null, but the string is not deleted. ๐
The coordinates are relative to the upper left corner of the display area. They're optional unless the string is new or being moved. ๐ If the jsys is affecting an extant string, a zero coordinate means "use the old value." โจ
For the font, c-size, and h-inc fields, a field of all ones means "use the display area default (set in the ada jsys)." A 0 means "use the value that was previously used for the (extant) string." ๐
If the string is new, STRDA returns an 18-bit string identifier. ๐
(SCSR) Set the Cursor StRing. ๐ฆ
JSYS scsr; [450B] display a string (vectors later) as the
cursor
Accepts:
r1: first byte pointer or 0 or -1
r2: second byte pointer or 0
r3: font[5], c-size[2], h-inc[6]
No defaults allowed
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
SCSR sets the cursor string. Vectors will be allowed later too. If the string length is zero or the first byte pointer is 0, nothing gets displayed for the cursor. If the first byte pointer is -1, the old string gets used. If a cursor didn't exist before, an illcon error return is executed. ๐
(SDDA) Suppress the display of an area. ๐
JSYS sdda; [444B] suppress all display in a display area
Accepts:
r1: da-id[18]
r2: 1 or 0
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
The display image is removed from the display area, but it isn't destroyed if r2 = 0. ๐ซง
(RDDA) Restore the display of an area. โญ
JSYS rdda; [446B] restore all display in a display area
Accepts:
r1: da-id[18]
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
RDDA puts the display image back into the display area. Welcome back ๐ฅน
(RDSA) Restore the display of a String. ๐
JSYS rsda; [447B] restore display of a string in a display area
Accepts:
r1: string-id[18], da-id[18]
Returns:
+1: Unsuccessful
r1: error code
+2: Successful
RSDA restores the display image for one given string in the display area. ๐
โญ๏ธ Part 2 picks up with (TSNDA) and keeps going from there! ๐ฆ
(IV) Message formats โจ
okay so messages are sequences of 8-bit characters, but only 7 of those bits actually carry useful info ๐ The high-order (200B) bit should contain even parity on IMLAC input and is set to even parity on IMLAC output.
If the IMLAC receives an odd parity character, it halts at present ๐ญ
The parity bit won't be discussed for the rest of the doc ๐
A message is either a character or a command. Single-character messages from the PDP-10 to the IMLAC are program output meant for the teletype. Commands from the PDP-10 carry display info, and commands from the IMLAC carry characters or other input info. Every command is prefixed by an internal escape character (code 33B) and a character count ๐ฆ
The escape character will henceforth be called ESC. It has the same code as the ASCII escape character, 33B.
Messages sent from TENEX to IMLAC
Characters 40B-177B go to the teletype simulation area ๐ฅ๏ธ Character 12B (line feed) starts a new line in that area.
An ESC means display or control info is coming. Every message beginning with ESC has the number of following characters as its second character.
Some constructs show up in lots of command messages, so here they are:
(da): a display area identifier, a pair of characters holding 12 bits of info.1st: bits (0:5) + 40B2nd: bits (6:11) + 40B
(NSTRS): a string count, a single character between 0 and 177B.(STRID): a string identifier, a single character between 1 and 177B.(RETAIN): the retention flag. If it's non-zero, an existing string gets kept instead of overwritten ๐(CSIZE): a character size, a single character between 0 and 3. The sizes are x1/2, x1, x2, and x3 respectively.(HINC): a horizontal increment, a single character. In the present implementation HINC is ignored, and standard spacing is used instead, like this:
LVH:
0: 3 units
1: 6 units
2: 12 units
3: 18 units
non-LVH:
0: 4.5 units
1: 9 units
2: 18 units
3: 27 units
(FONTS): a font specification, a single character. In the present implementation the font gets stored but doesn't affect the display ๐ธ(outxy): an output X-Y coordinate pair, encoded in four characters:
1st: X,bits(0:5) + 40B
2nd: X,bits(6:11) + 40B
3rd: Y,bits(0:5) + 40B
4th: Y,bits(6:11) + 40B
(inxy): an input X-Y coordinate pair, also four characters. For LVH it's the same as(outxy)above. For non-LVH it's the same too, except each 12-bit coordinate is actually of the form1400B+40B*[v/9]+(v MOD 9), where the real coordinate is0<=v<=719. That means there are actually fewer points on each axis, so it's a little less precise ๐(string): a string, which is just the required number of characters. Control characters get displayed as a distinctive blot ๐
Each display operation has its own message:
01B - ADA (assign display area)
Followed by (da) NSTRS CSIZE HINC FONT.
02B - DDA (delete display area)
Followed by (da).
04B - STRDA (string display)
Followed by (da) STRID RETAIN (xy) FORMAT [CSIZE] [HINC]
[FONT] (string).
Format specifies whether each of CSIZE, HINC, and FONT
is to come from the display area default, the current
value for the string, or the message.
The bits are: 0 0 STF STI STC RDF RDI RDC.
RDF=1 means read the FONT from the message.
RDF=0, STF=1 means use the old value from the
string.
RDF=0, STF=0 means use the display area default.
The pairs RDI-STI and RDC-STC specify HINC and
CSIZE in the same way.
05B - SCSR (set cursor string)
Followed by RETAIN CSIZE HINC FONT (string).
06B - SDDA (suppress display of da)
Followed by (da) KILL.
KILL#0 means delete all strings in this display area.
KILL=0 means retain the strings.
07B - RDDA (restore display of da)
Followed by (da).
10B - SDDA (suppress display of string)
Followed by (da) STRID KILL.
KILL#0 means delete the string.
KILL=0 means retain the string.
11B - RSLA (restore display of string)
Followed by (da) STRID.
12B - TSNDA (turn teletype simulation on)
13B - TSFDA (turn teletype simulation off)
14B - Long input mode
Puts the IMLAC into the mode where it sends coordinate
information in a message with every character.
This is the normal operating mode for the IMLAC.
15B - Short input mode
Puts the IMLAC into the mode where it outputs characters
literally, just like a teletype.
The IMLAC starts out in this mode when turned on.
For STRDA, the FORMAT byte is the one that decides where CSIZE, HINC, and FONT come from. The bits go 0 0 STF STI STC RDF RDI RDC. RDF=1 means FONT comes from the message itself. RDF=0 with STF=1 means the old value from the string gets used. RDF=0 with STF=0 means the display area default gets used. The RDI-STI and RDC-STC pairs handle HINC and CSIZE the same way ๐ง
A run of 10 ESC characters followed by a non-ESC is an emergency. When that happens, the IMLAC reinitializes itself and goes back into short input and teletype simulation modes ๐จ
All other (control) characters are ignored.
Messages sent from IMLAC to TENEX
In short input mode, every character typed on the keyboard is sent literally โจ๏ธ
In long input mode, every message begins with ESC and a count of the characters that follow:
- Codes 40B-177B are keyboard input. The IMLAC does not echo these characters on the display, so no mirror image for you ๐ช
- Codes 00B-37B, except ESC, are typed-in control characters. The present implementation lets the user generate all of these codes from the keyboard ๐ฎ
- ESC may be followed by a keyset-mouse code or a control character.
- Code 00B means an ESC typed on the keyboard.
- Otherwise, a code 40B-77B and a code 100B-107B follow. This type of message gets sent whenever the mouse buttons change, or a character gets typed on the keyset that the IMLAC can't convert into an ordinary character ๐ฑ๏ธ
- The IMLAC converts recognizable keyset chords and mouse changes into characters. For a full discussion of this hardware, see the SRI-ARC documentation.
- The codes 40B-77B are accumulated keyset chords. 40B means no complete chord has been struck yet.
- The codes 100B-107B represent the state of the mouse buttons after a change. A 1-bit means that button is depressed.
- Other codes should not appear.
- All codes are followed by the (inxy) coordinates of the mouse. So that's 7 or 8 characters for every character typed ๐
(V) Division of responsibility โจ
The first criterion in designing this system was to give the PDP-10 enough validity checking that the IMLAC doesn't have to send a response for each command. So the PDP-10 allocates and checks display area identifiers and string numbers. In the present implementation, display areas are numbered system-wide, while strings are numbered from 1 to N within a display area ๐ง
The only errors the PDP-10 can't detect are transmission parity errors and overflow of the IMLAC's memory ๐ฌ
- Parity errors are not corrected at present, but any standard technique could handle them.
- Overflow is, in principle, detectable by the PDP-10, since the space a given display needs is fairly simple to compute. If the IMLAC runs out of space, it deletes lines from the top of the teletype simulation display until only three are left, and only then gives up ๐ซ
A secondary criterion was to keep the number of characters needed to represent a display command small ๐
We found two problem areas, and we expect to expand the IMLAC's capabilities in two areas too โจ
- Echoing was handed off to TENEX, because we wanted to avoid the well-known complications of remote echoing ๐ โโ๏ธ
- Identifying a device as an IMLAC to TENEX gave us a great deal of trouble ๐ฉ We settled on a convention: a TENEX Executive command makes TENEX send the "Long input mode" message. The IMLAC starts out in short input mode.
- The TENEX character input routines can also be set into long or short mode. Their state gets changed by the TSNDA and TSFDA system calls ๐
- In short mode (TSNDA last), short input is passed literally, and only the character is passed from long input.
- In long mode (TSFDA last), short input is padded with all-zero coordinates, and long input is passed literally.
- This arrangement lets TENEX programs that don't use the IMLAC's special features work correctly with either an IMLAC or a teletype. Iconic compatibility ๐
- The user can restore the IMLAC to short mode with another command or with a special key on the IMLAC keyboard.
- Code is ready to let the IMLAC collect entire literal strings, with some internal editing, before sending them to TENEX. We haven't resolved what happens to characters the user types between the typed command that starts literal input and the IMLAC receiving the "collect literal" message ๐ค
With 8K of core, the IMLAC can handle a significant fraction of the command parsing and feedback functions of the SRI-ARC On-Line System (NLS), which is what this whole effort was mainly for ๐ฉท
[This RFC was put into machine readable form for entry] [into the online RFC archives by Lorrie Shiota, 10/01]
๐ฆ where this page comes from
- ietf: rfc190 1971-07
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms