WAITS: Editors

Today we'll look at the text editors available on WAITS. There are two classes of editor: traditional teletype editors like SOS or TECO, and display editors like TV or E. Although the latter class is not fully working on emulation yet, it's interesting to get an idea of how they operated as they represent an early example of interactive editing.

/images/waits/sos-and-tv.png The SOS (left) and TV (right) editors. Source: Rupert Lane. License: CC0.

SOS

SOS - Son of Stopgap - was developed at Stanford and is a basic line orientated editor that can be run from any terminal type.

You can invoke it with CREATE file and it will create a file, start SOS and let you enter text immediately, or EDIT file to edit an existing file. The * prompt allows you to enter single letter commands: in the above we see P to print the file and E to exit. Each line has a line number prepended to it and you can give line numbers as arguments to commands, eg P 100,200.

The version we saw on TOPS-10 is similar to what we have running on WAITS, so see my earlier post for more information. There are a couple of differences:

  • files are always saved with line numbers; there is no equivalent of the ES command
  • on display terminals only, the Z command will allow you to edit a line with the standard line editing commands like Control-Space to move the cursor forwards and Control-Backspace to move it back. See the blog entry on terminals for more details.

Finally, on the console, SOS will represent non-standard characters that are in the Stanford ASCII character set by preceding each with the escape character ?, for example alpha α is shown as ?". This includes lower case letters, eg lower case a is ?A. A plain question mark is ??. See the SOS manual section 1.4 for details.

TECO

TECO - Text Editor and Corrector - is DEC's powerful but somewhat cryptic character orientated editor. Operating this is the same as on TOPS-10, so see my post there for more details. Type MAKE file to create a file and start editing it, type TECO file to edit an existing file.

The TV display editor

A display editor allows full use of the screen and keyboard of a display terminal like the III or DD, so you can navigate around the file and make changes quickly. This is similar in concept to editors you use today like Emacs or Vim, but the execution, and especially the keystrokes used, are quite different. The WAITS display editors predate the above editors and the IBM PC so there was no convention for it to follow.

Stanford created the TV editor initially in the late 1960s, and then rewrote it as the E editor; the functionality is much the same.

However, at present neither editor works completely on simh. E will crash after a few commands, and both E and TV don't properly display the arrow that shows what line you are on, so it's hard to make changes to a file. Neither editor works on the saildart.otg emulator.

But to give a taste of how these worked, I'll show how to create, view, navigate and edit files using TV.

Creating a file

First let's create a new text file. Log on to the III terminal using L 1,REG. Create a new file with CTV, eg CTV new.txt. The screen will clear and will either display a directory or a blank screen; in either case press Control-P to move to the start of the file. You can now type in text directly, pressing Return at the end of each line. Press Control-E to save and exit.

/images/waits/tv-new-file.png Creating a new file with the TV editor. Source: Rupert Lane. License: CC0.

Navigating in an existing file

As an example of editing a larger file, make a copy of the monitor manual by typing at the monitor's . prompt COPY MON ← MONCOM.BH[S,DOC] (The left arrow can be produced by pressing your left cursor key).

Then open the file with TV mon. You will first see the directory page, which has a one line summary of each subsequent page in the file. Each page can be up to a few hundred lines long, and when stored on disk each page is separated by a form feed. This method is used to reduce the amount of text that needs to be kept in memory.

Try moving forward a page by typing Control-P; move back with Control-minus Control-P.

Let's say we want to look at section 1.3, Introduction to the Terminal. The directory shows this is on page 12, so you can type Control-1 Control-2 Control-P to give a prefix of 12 to the Control-P command. Your screen will now look something like this.

/images/waits/iii-navigation.png Navigation using the TV editor. Source: Rupert Lane. License: CC0.

The top shows the page number and a line of asterisks denoting the top of the page. The bottom shows a line of dashes, denoting there is more text in this page. Press F5 (FORM) to scroll the window down; press F6 (VT) several times to scroll back up. You will see the commands you are typing being echoed at the bottom of the screen. Control-T moves back by a page, Control-B forwards.

You can move forwards a line with Return and back a line with Backspace; however, as mentioned above, the arrow showing what line you are on is not working so it's a bit confusing.

Editing a line

To get an idea of how editing would work, press Control-Space. A triangular cursor will appear and the line being edited will move down slightly. You can now use the same line editing commands we saw in the blog entry on terminals, eg Control-Space to move forwards a character, Control-Backspace to move back. Typing a normal key will replace what is at the cursor. Press Esc (altmode) to reject your changes; had you wanted to accept them you would type Enter.

/images/waits/tv-edit-line.png Editing text with the TV editor. Source: Rupert Lane. License: CC0.

There's also an issue here which may be a bug in the emulator. In the image I have added text to the end of the second line and the right hand cursor should be below the final t, but instead it is shifted further to the right.

Moving text

The modern metaphor of the clipboard, where text can be moved or copied to another place, is called attach mode on TV. In the sequence of images below, I start with a four line file where the top line should be moved to the bottom.

/images/waits/tv-moving-a-line.png Moving text with the TV editor. Source: Rupert Lane. License: CC0.

  1. With the cursor on the first line, press Control-A to attach the line. You could give a prefix with Control-n to attach n lines.
  2. The line affected will show a bar in the left column.
  3. Press Return 3 times. The attached text will move down with each key press.
  4. Press Control-Alt-E to release the attached text, so it is now in its correct place.

Instead of Control-A at the start which does the equivalent of a cut operation, pressing Control-C will copy the text instead.

Exploring further

That's about how far I got. Looking at the manual, it does seem like it has some advanced capabilities, such as creating version histories and reformatting Lisp code. One thing to note with the manual is that it uses special prefixes to denote modifier keys - for example, instead of using "Control-P" like we would today it says "αP". The key to understand this is early on in the manual:

   α     means hold the "CONTROL" key down while typing a character.
   β     means hold the "META" key down while typing a character.
   αβ    means hold both "CONTROL" and "META" keys down while typing.
   ⊗     means use either α or αβ with the next character.

More information

As of 1974, SOS is documented in SOS.LES and TV in TVED.DCS. See E.ALS for an idea of how much was available in the E editor as of 1989.

Questions, corrections, comments

I welcome any questions or comments, and also especially any corrections if I have got something wrong. Please email me at rupert@timereshared.com and I will add it here and update the main text.


WAITS: The first interactive spell checker

Today we'll look at SPELL, probably the world's first interactive spell checker, which debuted on WAITS in 1971.

/images/waits/waits-spell.png The WAITS spell checker on the III. Source: Rupert Lane. License: CC0.

Origins

The origins of SPELL are in work Les Earnest did at MIT to recognise cursive handwriting in the late 1960s/early 1960s. He put together a dictionary of around 10,000 English words (from ABANDON to ZOOLOGICAL) and wrote a subroutine in assembly to match against handwritten words, producing an output file of words not recognised. Les moved to SAIL in 1965 and took his dictionary with him (pictured below, on paper tape). In 1967 this was used by a grad student to write a program in LISP that would match words in a text file and print out anything it did not recognise.

/images/waits/words-on-paper-tape.png 10,000 words on paper tape. Source: Les Earnest via archive.org. License: CC BY-NC-ND 3.0

Finally, in 1971. Ralph Gorin (the REG whose login we have been using to access our emulated WAITS instance) wrote SPELL, using the same dictionary. This took a text file - and an optional user dictionary - as input, checked the words contained and if it did not recognise a word, offer the user several alternatives such as select a candidate replacement from the dictionary, ignore the word, add to personal dictionary etc. This became popular at SAIL and was also adopted by Tenex and other PDP-10 sites. Later versions could understand text files using document preparation languages like PUB and TeX.

Running SPELL

Type R SPELL to start the program. On display terminals it will present a multi-pane-of-glass view like the above, but it also supports an interactive teletype session with * as the prompt.

First it asks if you want a personal directory and any switches to support dictionary maintenance. It will then ask for the input and output files (it can't edit a file in place). Here we'll use a file called blog.in that contains a single sentence "I make mnay mistakes.".

.r spell
Do you want to augment the dictionary? n
Mode switches (zero or more of T,Q,N,U,P,A, or ?):  
Name of the file to check and correct: blog.in
File name for correction output: blog.out
File for exceptions: 
No exception file.

When it detects a spelling mistake it will prompt you for what to do next

working...
Page 1:1
I make mnay mistakes.
mnay
Type S,A,I,R,X,D,W,L or ?

If you've ever run ispell on Unix (or its Emacs interface) the commands will look remarkably similar - a to accept, i to insert into personal directory, r to retype the word by hand etc. In fact ispell traces its origins back to SPELL, starting with a revised version on the PDP-10 and eventually being ported to C and Unix.

On the display terminal you can see a list of candidate words on the right which you can choose from. On teletypes, you need to press s and then use Return to see the options.

*s
Type C,^,<altmode>,<cr> or ?
MANY
*
MAY
*
Those are all the choices.  Type S,A,I,R,X,D,W,L or ?
*s
Type C,^,<altmode>,<cr> or ?
MANY
*c
Finished.

Before it exits it will prompt for some options to continue checking other files or manage core files. But the normal response is e to save the output file and exit.

Type E,S,C,A,D,I, or ? e

EXIT
^C

Source code

The 1974 source code for SPELL is on the WAITS disk as SPELL[S,REG] and the master dictionary in SLOVAR[S,REG] (unfortunately the [S,REG] directory is not accessible on saildart.org). The source file has around 5600 lines, 4700 of which are FAIL assembly source code and the rest is the manual. The header reads.

	TITLE	SPELL	I HAVE YOU UNDER MY SPELL
;		SPELLING CHECK  & CORRECTION.
;		R. E. Gorin 20 February, 1971
;		Revised July 23, 1972 III displays
;		TENEX version 1/12/74 Wiiliam W. Plummer, mod REG 11/19/74
;		Additional features, October 1974, Jerry Wolf, mod REG 11/23/74

Internally the program uses a form of hash coding, where words with the same first two characters and length are stored in a list so candidate replacements can be found quickly.

The program detects four types of mistakes; from the manual:

  1. one wrong letter.
  2. one missing letter.
  3. one extra letter.
  4. two transposed letters.

The executable program is built by assembling the code, starting it and giving it a master dictionary file name. It then builds its hash tables and stops, at which point the core image is saved for future use. This was a common technique for machines of this area. as the resulting core file starts up quickly as the master dictionary read and parse does not need to take place. The downside is that the master dictionary cannot be changed without rebuilding the program.

Further information

SPELL is documented in SPELL.REG[UP,DOC]

Here's a video of Ralph Gorin accepting an award for his work on SPELL at a SAIL reunion in 2009.

See Les Earnest's paper on the first spell checker at archive.org.

Questions, corrections, comments

I welcome any questions or comments, and also especially any corrections if I have got something wrong. Please email me at rupert@timereshared.com and I will add it here and update the main text.


WAITS: Jobs, users and security

Today we'll look at how users and security are handled on WAITS - this is fairly relaxed, allowing free access to resources for people inside the lab, but with protection available if needed. Remote users are more restricted. We also look at jobs, which are similar to processes on modern systems.

/images/waits/waits-remote-logins.png Remote logins to WAITS. You can't log in as an existing user (like JMC) if no password has been set. Trying to create a new user, like JKL, will not work if done remotely. Source: Rupert Lane. License: CC0.

Security and users

In the previous post we talked about PPNs like [1,REG]; here REG is the ID that identifies which user you are.

To create a new user ID, simply choose a 3 letter ID and log in as that. This must be on a device internal to SAIL, ie the console or display terminal, not via the external communication lines that are modelled by a telnet connection on simh.

Here I choose REL as an ID and log on. It asks me if I am sure, as this is a new ID, and if I type Y I am logged in and can run programs or create files.

.l 1,rel
JOB 1    Stanford 6.17/K 08-16-74
Are you sure? y
Friday  26-JUL-74       0945
.

If I log out with an empty directory, it will be removed.

.k
Your empty file directory has been deleted.

But it is recreated the next time I log in.

If you had logged in as 1, FOO, you would get this message when you logged out:

You are not an authorized user. Your files have been deleted.

This turns out to be a simple check in the LOGOUT routine - if your user ID is one of FOO, BAR, BAZ, ABC, 100 it will say you are unauthorised, probably because these are common IDs used for testing.

You will note that no password was asked for at any stage. You can set a password by replacing the . with a % at the login stage, eg L 1%REL. You get the option to only ask for a password if you are logging in remotely so you don't need to supply it when logging in via the console or display terminals.

The password is set at the PPN level on the user file directory entry, so you could have a different password for say 1,REL and 2,REL. According to the UUO (system calls) manual it is stored in plain text, case insensitive with a maximum length of 6 characters.

File protection

Files and directories have a 3 octal digit protection code.

Bit File Directory
400 Don't backup this file Ask for password for remote logins only
200 Delete protect Unused
100 Owner may not overwrite this file Owner may not write files
040 Local users may not change protection of this file Same as for files
020 Local users may not read this file Same as for files
010 Local users may not overwrite this file Same as for files
004 Guest users may not change protection of this file Same as for files
002 Guest users may not read this file Same as for files
001 Guest users may not overwrite this file Same as for files

The default protection is 000, so anyone can do anything.

To set protection on files, you need to use COPY with the /PROTECTION flag to create a new file with the desired level, eg

.copy /protection=006 foo2 ← foo1

would create FOO2 from FOO1 but set protection so guest users can't access it at all.

Directory protections can only be set by logging in with the % delimiter

Jobs

WAITS is quite similar to TOPS-10 here so reading the Jobs on TOPS-10 post will give more details. But in brief:

When you log in to WAITS, it gives you a job number which lasts throughout your session. Some simple commands (like DAYTIME) you type are built into the monitor. Others need to be loaded into memory from core files, which have the extension .DMP on WAITS.

If you have a core file FOO.DMP in your directory you can invoke it with RUN FOO. Common programs are stored in the SYS: area, which is equivalent to [1,2], and programs here can be run using R. RUN can also take a file name and directory, so R LISP is the same as RUN LISP.DMP[1,2].

Some common programs, like COPY, are recognised by the monitor but behind the scenes it will invoke RUN on the right core file.

You can create another job by logging in a second terminal. But you can also DETACH from a job, which will suspend it and log you out, and then log in elsewhere and resume execution using ATTACH. Jobs can also run in the background if they do not need interact with the user's console.

All that is pretty much the same as TOPS-10. WAITS adds some more conveniences. FORK works like DETACH, but rather than logging you out will create a new job as your current ID. KILL can be used to kill a job owned by you.

WAITS replaces TOPS-10's SYSTAT with WHO, along with the "who line" we saw earlier on interactive terminals.

Batch jobs

TOPS-10 had a fairly sophisticated batch processing system, where jobs could be submitted from the terminal or via cards, and queues of jobs could be maintained and run in the background.

WAITS chose instead for a simple facility to run from the terminal, similar to a shell script file on a modern system. The concept is you create a file with a set of commands or data to input to those commands. The end of each line must be denoted by a rather then Return. There are a number of other metacharacters to allow you to enter the special keys on the Stanford keyboard, eg will emit an Altmode key

You run the file with DO and it basically pastes data it into your keyboard buffer as if you'd typed it directly, expanding any metachracters.

There is provision for variables via the question mark and a single letter, eg ?A. The first time this is seen it will prompt for input and store that in variable A; from then on using ?A will expand it to the value you entered.

There is no looping or branching available, however.

As an example, if you have the file foo.do:

hello↔dir [?D,DOC]↔

and type DO FOO.DO it will run the hello command, prompt you for a value for D then do a directory listing of that area under DOC.

More information

See the Monitor Command Manual for more details on these topics.

Questions, corrections, comments

I welcome any questions or comments, and also especially any corrections if I have got something wrong. Please email me at rupert@timereshared.com and I will add it here and update the main text.


WAITS: Files and directories

Today we'll look at how WAITS handles files, the commands to manipulate them, and how the WAITS PPN / directory structure works.

/images/waits/ppn-and-alias.png Logging in and changing directory. Source: Rupert Lane. License: CC0.

Files

Files are named file.ext where file is 1-6 characters long and ext 0-3. The extension is used to identify the type of file, eg HELLO.SAI would be a source code file in SAIL, the lab's version of Algol. One exception is seen in some shared directories, where the file extension is the initials of the person maintaining the file.

Filenames are case insensitive, and each character is stored using 6 bits instead of the usual 7 bit Stanford ASCII. This means that the special characters in Stanford ASCII like or α cannot be used in file names.

The PPN and directories

PPN means project and programmer number. These are both 1-3 alphanumeric characters long, with the programmer number (eg REG) identifying the person and the project number (eg 1) indicating a particular set of work. Programmer numbers can also be shared areas, eg DOC.

This information is given when you log in (eg typing L 1, REG) and also represents an area of the disk, for which is written in square brackets, (eg [1, REG]). By convention, [1, xxx] is like the home directory of user xxx, but the number 1 itself has no special meaning. Users would generally have different project numbers for different tasks, eg REG has [CRF, REG] for working on the CREF program and [DOC, REG] for documentation tasks.

To change directories, eg from [1, REG] to [DOC, REG] you could log out and log back in again with K and then L DOC,REG. But an easier way is to use ALIAS. With one argument this will change your project number, so ALIAS DOC will put you in [DOC, REG], as seen in the screenshot above. When invoked with two comma-separated arguments it will change to that PPN, eg ALIAS 1,BGB. With no arguments it will return to the directory you logged in as.

Typing R ALIAS will show what your current alias is, and what you logged in as.

To create a new directory, you need to log in with that PPN, so to create [FOO, REG] log out with K then log in with L FOO,REG. It will ask you for confirmation and then create an empty directory which you can start adding files to.

When you log out, if your logged in directory has zero files, it will be deleted.

Alphanumeric PPNs are a change from TOPS-10, which only allowed octal numbers. Unlike TOPS-10, there is no concept of sub-directories on WAITS.

File manipulation

There are several commands to manipulate files which share a common code base.

Command Function
COPY Copy files
RENAME Renames files
TYPE Display file on the TTY
LIST Send file to the line printer
DIR Do a directory listing

In general the arguments for these commands takes the form destination ← source. On display terminals you can get the left arrow by pressing the left cursor key; on TTYs, you can use underscore instead.

So COPY bar ← foo would copy foo, creating bar, and RENAME bar ← foo would change the filename foo to be bar.

Each file argument can be fully specified as

dev:file.ext[prj,prg]

dev is by default DSK: and does not need to be specified unless you are working with magnetic tape devices. prj,prg by default is the PPN you are currently logged in or aliased to.

The * wildcard means match all for the field it is specified in, eg *.txt. There is no partial wildcarding like a*.txt.

Some examples:

    RENAME *.BAK ← *.TXT

renames all text files in your current PPN to have an extension BAK.

    COPY X ← A,B,C

concatenates a, b and c to form x

    DIR MYLIST ← *.TXT

lists all files in the current PPN matching *.TXT and writes output to the file MYLIST.

There's also a working copy of PIP, DEC's Peripheral Interchange Program, on disk which you can run with R PIP. See my article in the TOPS-10 series of posts for more details.

Directory structure

The root of all directories is [1,1], also called the Master File Directory. If you do a DIR on this you can see each sub-directory as a file containing the PPN and the extension UFD, for User File Directory.

. dir [1,1]
...
  1REG  UFD    388  26-JUL-74
...
DOCREG  UFD    116  01-JAN-64
...

Some notable areas on the file system. As well as browsing these in WAITS, you can also look at the saildart archive by prepending https://www.saildart.org/ and either the PPN in brackets or the programmer number on its own, eg https://www.saildart.org/[S,DOC] or https://www.saildart.org/DOC .

Area Usage
[1,3] Common programs
[2,2] Mail and plan files
[3,2] Help files accessed the via HELP command
[*,DOC] Documentation
[AIM,DOC] AI Memos
[CSP,DOC] Docs on user programs
[H,DOC] Hardware docs
[P,DOC] Docs about people
[S,DOC] Documentation of system programs
[UP,DOC] Update docs on system programs
[*,LSP] Files relating to Lisp
[*,SYS] Data files for system programs

Further information

The file manipulation commands are documented in COPY.RPH[S,DOC] in WAITS, or at saildart.org here.

We'll look at file protection, and user setup, in the next post.

Questions, corrections, comments

I welcome any questions or comments, and also especially any corrections if I have got something wrong. Please email me at rupert@timereshared.com and I will add it here and update the main text.


WAITS: Terminals and keyboards

To expand on what we saw in the quick tour, let's look further at how you can interact with WAITS using the simh emulator. There are two classes of terminals: teletypes and display terminals.

Teletypes

Teletypes here means the console typewriter (shown below, with John McCarthy helpfully holding the paper) and remote connections, which simh emulates as a telnet connection but on the real system could have come from phone dial up lines or over the Arpanet.

/images/waits/sail-console.jpg Using the console at SAIL. Source: CHM.

These devices support the backspace key, but do not delete characters; instead they print a backslash, then the characters you want deleted, then another backslash when you start typing again. So if I entered ABCDEF but deleted the last three characters and inserted XYZ it would look like:

ABCDEF\FED\XYZ

You can press Control-U to delete the whole line, but TOPS-10's Control-R to reprint the line is not supported.

Pressing Control-C will stop a job; pressing Control-O will keep a job running but suppress any further output.

The console

By default the console will print in upper case, but you can coerce it to print lower case (in most programs) by typing TTY FULL.

The console was not intended for regular users and if you try to log on as one (eg L 1,BGB) it will ask for a password:

.L 1,BGB
JOB 1    STANFORD 6.17/K 08-16-74
THE CTY IS FOR DEBUGGING ONLY,
UNLESS YOU KNOW THE PASSWORD =

Well, we own the system now, so the password to get around this is FEEPER. This is a special password for the console, and if you have a password for the account this would be prompted for next.

Remote access

simh allows remote access via telnet: if using the quickstart this is on port 1974. However, users without a password (which is true for the REG and BGB accounts we have used so far) are not allowed.

$ telnet 0 1974
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.


Connected to the KA-10 simulator DCS device, line 0


TTY2    SYSTEM LOADED ON FRIDAY    26-JUL-74    18:10  
^C
.l 1,reg
JOB 2    Stanford 6.17/K 08-16-74
Remote login prohibited for that account.
You must log in locally and set a password to allow remote logins.
KJOB
.

To set a password, use the console or display terminal to login as your chosen account using % instead of . in the login command, eg L 1%REG. It will prompt you for a password and whether to use this on all logins, or just remote ones.

If you try to login as an unknown user over a remote connection, you get politely redirected to use the NET,GUE guest account

.l 1,foo
JOB 2    Stanford 6.17/K 08-16-74
We prefer that our ARPA NET guests login as "NET,GUE".
Type "Y" to be logged in as "NET,GUE"; anything else to proceed: y
What is your name, please? A tourist
Friday  26-JUL-74       1822
3 jobs logged in. 1 Running.
.

The guest account has no disk directory and cannot run all programs.

Note that the remote access communication speed is quite slow, and I have seen it hang for 10-20 seconds sometimes.

Display terminals

Most users in the lab would have access to a display terminal, which was very unusual for the early 1970s. There were 6 III (Triple-I) vector displays and 58 DD (Data Disc) raster displays in 1973 (not all DDs could be used at the same time, however). simh has good support for the III which we'll go into details below.

/images/waits/iii.png Left: An III display in use at SAIL running an unknown music program. Source: CHM. Right: a simulated III display on simh.

Display terminal keyboards

Display terminals used a special keyboard, the layout of which is recreated below.

/images/waits/stanford-keyboard.png Stanford keyboard layout. Source: keyboard-layout-editor.com

There are a number of modifiers that can be combined with other keys: Shift, Control, Meta and Top. On simh, Meta is mapped to the Alt or Option key. Top is used to select the symbol on the top of most letter and number keys, such as > on the F key. This is mapped to the Windows/Command key on your keyboard (which may be hard to use as some window managers grab these). On your modern keyboard you will have many of these available directly, so for > you can press Shift and dot as normal.

There are also special keys at the side like BREAK and CALL which are used to control the line editor; simh uses the function keys for these. These are not modifiers, ie to type the sequence BREAK e you'd press F3, let go and type E.

The ALT key (also known as ALTMODE) is not a modifier but another special key, and is accessed by pressing Escape on your modern keyboard. The ESC key is another function key not related to the modern Escape key.

Here's a summary of how all these keys are mapped to a modern keyboard when using simh.

Stanford key Modern key
META Alt/Option
TOP Windows/Command
CALL F1
ESC F2
BREAK F3
LINE F4
FORM F5
VT F6
ALT Escape

There does not seem to be a simh mapping for CLEAR, however

The cursor keys will emit the arrow characters like ←.

Not a Stanford key, but a facility provided by simh: pressing F11 will make the window full screen.

The saildart javascript emulator does not use the above keyboard mappings, but does provide a layout with a virtual keyboard you can click keys on.

The line editor

Similar to the facility you are used to in modern shells like bash, the display terminals supported a powerful line editor to help you quickly edit text, using the Control and Meta keys. This works on all text input fields, not just the monitor command line.

If you log on to the III you will see there are two cursors, one at the start of the text field you are typing into, and one at the end. You can move back and forward on the line with Control-Backspace and Control-Space respectively. If you are not at the end of the line, typing a character will replace what's currently behind the second cursor. Typing Meta and a character will insert a character. So typing X with the cursors as shown below would change 'world' to 'xorld'.

/images/waits/two-cursors.png The two cursors. Source: Rupert Lane. License: CC0.

Meta-Backspace will delete the character behind the cursor. Control-D deletes the character in front of the cursor.

Plain Backspace at the end of the line deletes the last character, but if the cursor is not at the end it will act the same as Control-Backspace, ie move the cursor left.

A summary including the other line editing commands. C- means Control. M- means Meta.

C-Space Forwards one character
C-Backspace Back one character
M-ch Insert character ch
M-Backspace Delete char to the left
C-d Delete char to the right
C-Return Recall last command typed
C-Tab Move to end of line
C-FORM (F5) Move to start of line
C-S Search forwards for the next char you type
C-K As above, but search backwards
C-R Repeats the last Control-S or -K search
C-I Toggle insert mode

Finally, you can repeat a command n times by typing Control and the number n, then typing the command.

Controlling the screen

Often commands with lots of output will cause the screen to scroll. To pause the output, press Control-BREAK (ie Control-F3). HOLDING will appear at the top of the screen. Press an editing key like Control-Tab to resume.

You can also make it pause automatically after every n lines by typing ESC n E, ie to pause after every 20 lines press the keys F2 2 0 E. The important thing here is that you must enter this command while a program is running, and it only has effect for the life of that program, ie you can't set it once at the monitor level and have it apply to all programs.

In summary:

Control-BREAK Pause output; press Control-Tab to resume
ESC n E Pause display after n lines
ESC E Turn off pause display

To control the WHO line at the top of the screen:

ESC W Display a who line at the top of the screen
BREAK W Turn off the who line
ESC Q Display your next job in the who line

There are also other controls to adjust the position and pane of glass behaviour which I have not yet found much use for - see section 2 of the Monitor Command Manual, linked below for details.

The Data Disc terminal

/images/waits/waits-simh-dd.png The Data Disc display on simh. Source: Rupert Lane. License: CC0.

The Data DIsc terminal was the more common of the two terminal types at SAIL. It used a modified TV set to display pixel graphics and text; the name came from the controller which used tracks on a hard disk to store pixel data to be sent to the screen. It also had a video switch so you could select video from TV cameras used in lab experiments and even broadcast TV signals. There's a footmote in the Monitor manual that says:

The first edition said, at this point, "Thus, BREAK S at 6pm on a weekday selects Star Trek." However, I understand that we are being spared that this season.

This terminal is not supported on the saildart emulator yet. On simh, it is emulated but has several problems with scrolling (see this issue for details). You can try this out by changing set dd disable to set dd enable in the run.ini file in the quickstart and restarting the emulator.

Further information

You can find out more about the SAIL keyboard, along with pictures, at Xah Lee's site and in an issue created by Lars Brinkhoff on the Github PDP-10 organisation.

This 1975 video shows the Stanford DD display terminals in action.

The Monitor Command Manual section 2 describes the display terminal in more depth.

Questions, corrections, comments

June 2026: Corrected numbers and availability of display terminals, from a comment by Lars Brinkhoff.

I welcome any questions or comments, and also especially any corrections if I have got something wrong. Please email me at rupert@timereshared.com and I will add it here and update the main text.


Next →