There are 2 other files named sedcb.mem in the archive. Click here to see a list.
HOW TO ADAPT A TERMINAL TO THE SED SCREEN EDITOR
BY A CHRISTOPHER HALL
ADAPTING SED TO A TERMINAL
This is a step-by-step description of how to build the tables
for SED, for your terminal. The Installation manual, SED.MEM,
contains essentially the same information, but explains why things
work the way they do.
First, look at SED.DIR and see if your terminal is one of the
ones for which there already is a terminal file. If so, just
compile and load SED with that file, and you're in business. If
your terminal is a VT100 the terminal file is SEDV10.MAC, so the
loading sequence would be:
Beware of using a terminal file that was written for a terminal
which is similar to, but not the same as, your own. Terminals are
sickeningly different, and it's likely that the file will not quite
be right. However, if you keep this cavaet in mind, you can use an
existing terminal file as a starting point.
If your terminal is not on the list in SED.DIR you will need to
write a terminal file to support it. That file contains two tables,
one of which describes the terminal's functions to SED, and the
other tells which control characters and sequences invoke which
editor commands. The file also contains two subroutines which move
the cursor and maybe other routines to do terminal-dependent things,
like special stuff on entry to and exit from SED.
The materials you will need to build this file are the file
SEDX.MAC, which serves as the framework to build upon, and the
terminal manual which describes which character sequences move the
cursor, clear the screen, and do the other terminal functions.
Also, you can use the program SEDECO (as in SED ECHO) to make the
terminal echo back the characters that are output by its special
keys, or to see how the terminal behaves when certain sequences are
typed in. See the program itself, SEDECO.MAC, for information on
how to run it.
You can also use the other terminal files, SED???.MAC, as
examples of how your file might look.
THE TERMINAL OUTPUT TABLE
After the initial stuff in SEDX.MAC is the terminal output
table. It contains the sequences which SED must send to the
terminal in order to get things to happen. The bare table looks
OTABLE: BYTE (7) 0 ;CURSOR UP
BYTE (7) 0 ; DOWN
BYTE (7) 0 ; RIGHT
BYTE (7) 0 ; LEFT
BYTE (7) 0 ; HOME
BYTE (7) 0 ;CLEAR TO END OF PAGE
BYTE (7) 0 ;CLEAR TO END OF LINE
BYTE (7) 0 ;ROLL UP AND CLEAR LINE
BYTE (7) 0 ;ROLL DOWN AND CLEAR LINE
BYTE (7) 0 ;PROTECT ON (CPOPJ IF NONE)
BYTE (7) 0 ;PROTECT OFF (CPOPJ IF NONE)
BYTE (7) 0 ;INSERT LINE (0 IF NONE)
BYTE (7) 0 ;INSERT SPACE (0 IF NONE)
BYTE (7) 0 ;DELETE LINE (0 IF NONE)
BYTE (7) 0 ;DELETE SPACE (0 IF NONE)
BYTE (7) 0 ;MOVE TO BOTTOM
BYTE (7) 0 ;HOME AND CLEAR ENTIRE PAGE
CPOPJ ;ROUTINE TO POSITION TO CHARACTER
CPOPJ ;ROUTINE TO POSITION TO START OF LINE
^D24 ;LINES PER PAGE
^D80 ;CHARACTERS PER LINE
0 ;TERMINAL-DEPENDENT FLAGS
CPOPJ ;ROUTINE TO CALL ON ENTRY
CPOPJ ;ROUTINE TO CALL ON EXIT
0,,0 ;NUMBER OF NULLS TO OUTPUT,,NULL CHARACTER
ITABLE ;ADDRESS OF INPUT CHARACTER TABLE
0 ;MARK TO DISPLAY ON ENTER (OMIT IF MRK NOT SET)
There's not much there, since filling it in is what this
cookbook is all about.
First, look in the terminal manual to find which character
sequences move the cursor up, down, right, left, and home (the upper
left corner). Put each sequence is the appropriate slot of the
If the sequence is five characters or less, put the sequence
itself in the table. For example if CURSOR-UP were "ESCAPE A" the
first word of the table should contain
OTABLE: BYTE (7) 33,"A"
If the character sequence is longer than 5 characters, use the
OTABLE: 37777,,[BYTE (7) 33,"A","B","C","D","E","F"]
If the sequence depended on something variable, like, say, the
current cursor position, you would need to write a subroutine to
handle the operation. Then put the label of the routine in the
appropriate slot of the table, thusly:
Usually the cursor positioning sequences are short enough to go
under the first format, except that CURSOR-HOME might need to be
done by absolute positioning (in which case just put in the sequence
to position to (0,0) or (1,1)).
CLEAR TO END OF PAGE
The next table entry is the sequence which clears the screen
from the cursor position to the end of the page. Note: this is not
the sequence to clear the entire screen. Not all terminals have
this. If yours does, enter the sequence in the table in one of the
formats described above. If your terminal can't clear to end of
screen, put a zero in the table position. The zero tells SED to
find some other way of clearing, and nothing else is required from
CLEAR TO END OF LINE
Next comes the sequence which clears from the cursor position
to the end of the line. Set this up as above. If your terminal
can't do it put a zero in the table (which tells SED to simulate the
clear by outputting spaces. Hope your baud rate is high).
ROLL SCREEN UP AND CLEAR LINE
This is the sequence which will cause the terminal to move
every line on the screen up one, make the top line disappear, and
clear out the bottom line. You can assume that the cursor is at the
bottom left of the screen when this sequence is output.
For most terminals, this operation is done by outputting a
linefeed (Octal 12). Some terminals can do it other ways, too, but
if linefeed works use it. Put the linefeed or the sequence in the
table in the usual way.
Beware: on some terminals the bottom line is not cleared, but
is actually the old top line wrapped around. If this happens, you
will need to put in the sequence to clear to end of line after the
sequence to roll. If that's more than 5 characters use the long
format described in the cursor movement section.
If your terminal can't roll up (and some can't), put a zero in
the table. Then if SED wants to roll it will rewrite the screen.
ROLL SCREEN DOWN AND CLEAR LINE
This is similar to the above, except movement is in the
opposite direction. You can assume that the cursor is home which
this sequence is output. Handle this the same way as the ROLL UP
sequence. Put in a zero if you ain't got it.
A lot more terminals can roll up than can roll down, so it's
common to see a zero here and a sequence in the table position
above. Then SED will roll up but rewrite the screen if it has to
roll down, which is the best it can do under the circumstances.
TURN HIGHLIGHTING ON AND OFF
Highlighting is anything which makes some characters on the
screen stand out from the rest. Reverse video, blinking, and half
brightness are the most common examples. Not many terminals can
highlight, so I'll take the negative case first.
If all you can get are normal vanilla characters, put a zero in
each of these two table positions. Then write down two things to do
later: set the MRK flag when you come to the flag word, and define
a mark in the last word of the terminal table. Both of these will
be taken up below.
If your terminal can highlight, it usually works like this:
you output a sequence, then all characters output are highlighted
(sometimes the characters have to be on the same line; they will
be), then you output another sequence to make all following
characters normal again.
Put the sequences which turn on and turn off highlighting in
the two table positions. The choice of what kind of highlighting is
done is up to you.
INSERT AND DELETE LINES AND SPACES
The next four functions, INSERT-LINE, INSERT-SPACE,
DELETE-LINE, and DELETE-SPACE, are found only on fairly
sophisticated terminals, but save SED a lot of work when they exist.
If they don't exist put zeros in the table positions (and it's quite
permissable to have zeros in some positions and sequences in
INSERT-LINE puts a blank line where the cursor is, moves the
rest of the screen down one line, and the bottom line goes off the
screen. DELETE-LINE removes the line where the cursor is and moves
everything beneath up a line. The new bottom line is blank.
INSERT-SPACE puts a space where the cursor is and moves the
rest of the line one space to the right. Characters which go off
the right of the screen must go away, not wrap around to the next
line. DELETE-SPACE removes the character (not necessarily a space)
at the cursor and moves the rest of the line one space to the left.
The new rightmost character on the line is a space.
If your terminal has any of these, enter the appropriate
sequence or subroutine label in the table.
Terminals work in wondrous ways. The VT100, for example,
cannot do any of these things, but it can limit it's scrolling
region. It turns out that that capability can be used to simulate a
hardware INSERT- and DELETE-LINES. See the file SEDV10.MAC to see
how it's done. The moral is that there's more than one way to skin
a cat; be creative.
MOVE TO THE BOTTOM OF THE SCREEN
The next function is something which terminals usually can't do
in one operation, but which SED finds useful. You can move to the
bottom left of the screen in a number of ways: move HOME and UP
(the cursor does not stick to the margins of the screen), or
absolute cursor positioning are examples.
However you choose to reach the bottom of the screen, put that
sequence in the table. You must have something in this table
position, a short or long character sequence or a subroutine label.
Not a zero.
HOME AND CLEAR ENTIRE PAGE
Almost every terminal can clear its entire screen. That
sequence goes here. Sometimes the cursor is moved HOME which the
clear occurs, sometimes it is left wherever it is. In that latter
case, you will have to include the sequence to move the cursor home
before or after the clear.
This table position can't contain a zero either.
CURSOR POSITIONING ROUTINES
The next two table positions contain the addresses of
subroutines which move the cursor to absolute positions on the
screen. The first routine moves to the row contained in accumulator
RW and the column contained in CM. The second moved the cursor to
the start of the row contained in AC T4.
The subroutines themselves reside in the terminal file you are
writing. Unfortunately there are nearly as many cursor movement
algorithms as there are terminals, so I can't help you much here.
Find out from your handy terminal manual how to move the cursor
around, and write the routines.
The file SED.POS contains sample cursor movement subroutines,
ones which are used in the existing SED???.MAC terminal files. If
your algorithm is included among them, just copy the routine into
your terminal file. Otherwise you're on your own, but you can use
the routines in SED.POS as guides.
LINES PER PAGE AND CHARACTERS PER LINE
The next two table positions contain values: the number of
lines on the screen and the number of characters per line.
There are a number of flags which alter SED'S performance.
Most deal with terminal characteristics, and must be set in the
right way for SED to work right.
The flags are:
LSD LINEFEED AND CURSOR DOWN ARE THE SAME CHARACTER
TBS HARDWARE TABS EXIST (AND ARE PRE-SET)
WRP LONG LINES WRAP AROUND TO NEXT LINE OF SCREEN
MRK NO PROTECTED FIELDS; THUS, MARK NEEDED ON ENTER
NEL DON'T BOTHER RE-WRITING LAST LINE OF SCREEN
SLW SLOW TERMINAL: WRITE ERROR MSGS ON BOTTOM LINE
NLP SEND NULLS AFTER ABSOLUTE CURSOR POSITIONING
NPG DON'T SET TTY NO PAGE (^S AND ^Q REMAIN XOFF AND XON)
(LSD) LINEFEED is normally a command which clears out the line
to which the cursor moves. If it and CURSOR-DOWN are
indistinguishable (both code 012, say), then the LINEFEED command is
disabled, and just the CURSOR-DOWN remains.
(TBS) If hardware tabs do not exist they must be simulated
using CURSOR-RIGHT's. Beware: a lot of terminals have hardware
tabs, but they must be set up by someone. If SED expects tabs but
they are not set up it will go bananas, so don't set the TBS flag
for these terminals (or enable the tabs in a terminal-specific entry
(WRP) Lines too long for the screen will either lock on the
right margin or wrap around to the next line, depending on the
terminal. The editor display routine needs to know which will
occur, or else long lines will not display properly. Note: some
terminals, such as the VT100 (in wrap mode) will wrap before the
81st character is typed, rather than after the 80th. Do not set the
WRP flag for those terminals and they will work o.k.
(MRK) A protected field is one which SED wants to highlight.
For example, when you type ENTER SED will highlight the character at
the cursor position (by making it reverse video, for example). It's
useful to mark that cursor location, so if the terminal does not
have any highlighting features, the MRK flag indicates that a
certain mark should be put at the cursor location when ENTER is
typed. The character code for that mark is contained in the last
word of this table (if MRK is not set that mark word can be
(NEL) Make SED not care about keeping the bottom line of the
screen up to date. If your terminal is slow and has enough lines on
the screen that it can afford to give one away, then some re-write
time can be saved by setting the NEL flag.
(SLW) Causes error messages to be written on the bottom line of
the screen. The remainder of the screen is not affected (normally
the whole screen is erased and re-done). If your terminal is slow
you can save a lot of rewriting by setting the SLW flag.
(NLP) If your terminal needs to idle a while after positioning
the cursor, set the NLP flag, and set the NUL word of the table to
the number of nulls to send and the character to use.
(NPG) Some terminals that run at 9600 baud (and others) will
send CONTROL-S (XOFF) to the computer to tell it to stop
transmitting and CONTROL-Q (XON) to tell the computer to resume.
SED cannot tell XOFF and XON from DELETE-SPACES and ROLL-BACK-PAGES,
so if the terminal persists in sending XON's and XOFF's set the NPG
flag and don't use CONTROL-S and CONTROL-Q as editor commands.
ENTRY AND EXIT ROUTINES
If your terminal needs to be initialized (TABS set up, for
example), write a subroutine in SEDX.MAC to do whatever is necessary
and put its address in the appropriate table position. That routine
will be called just before SED reads in the file to be edited.
Similarly for a routine to do things on exiting from SED, in the
next table position. That routine is called just before exiting.
If nothing special needs to be done put a CPOPJ in these
NUMBER AND TYPE OF NULLS TO OUTPUT
There are a number of situations where SED needs to delay and
let the terminal finish what it is doing. The most reliable delay
tactic is to send some nulls to the terminal. A null is any
character which causes no action from the terminal. 000 is the
classic null, but beware: some terminals or communication lines
ignore 000's, and the desired delay does not occur. Suggestions:
RUBOUT (177) or CONTROL-F (006). Anyway, the situations which need
a delay are set up in the terminal characteristics flags, described
elsewhere, and the number of nulls to output for each delay and the
null character are defined in the NUL word of the terminal output
table. If no delay is ever required (the "usual" case) set the NUL
word to 0 and don't set any of the NL? characteristics flags.
ADDRESS OF THE TERMINAL INPUT TABLE
The terminal input table tells which sequence of characters
coming from the terminal invoke which commands. The next section of
this manual describes how to write the input table.
Enter the address of the input table in this position.
MARK TO DISPLAY ON ENTER
If you do not have the MRK flag set, skip this. You don't even
need to include this word in the table, and it will be ignored if it
If you have MRK set (usually because your terminal cannot
highlight characters), put in this table position the single
character which you would like to be displayed as a place marker in
your file. Any character will do, but a little experimentation may
be needed to decide on one which is easy to locate on the screen.
THE TERMINAL INPUT TABLE
This section is not yet complete. I have included this cookbook on
the distribution tape because I figure it will do some good even
though it isn't done yet.
Please refer to the installation manual, SED.MEM, for the rest
of the installation instructions.
The terminal input table tells what you type at the terminal to
invoke which commands. Building this table takes a little more work
than building the output table, because you can set up the editor
commands on the keyboard just about any way you want.
ARRANGING THE COMMANDS
The first step is to find out what things on your terminal
keyboard can be used to invoke commands. Control characters should
be used for most of the commands, as they are the easiest to type.
Any special keys can also be used as commands; look in your
terminal manual to find out what sequences of characters those keys
There are 40 commands. If you don't have enough control
characters and special keys to take care of them all you can set up
the remainder as control sequences (a control character followed by
one or more characters). For example, you might define the <WINDOW>
command as ESCAPE W, <MARK> as ESCAPE M, and <LINE> as ESCAPE L.
The SED user would be expected to type those two-character sequences
in order to invoke those commands (so set up the less frequently
used commands this way).
Note that if you use a control character as the start of a
sequence it cannot also be used by itself to invoke a command. If
CONTROL-A L is <SLIDE-LEFT>, then CONTROL-A alone cannot be a
When you have a list of the available control characters and
sequences, link them up with ther editor commands. Use the
worksheet on the next page, if you like.
WORKSHEET (PAGE 1)
WHICH COMMANDS ARE INVOKED BY WHICH TERMINAL SEQUENCES
COMMAND NORMAL YOUR COMMAND NORMAL YOUR
CODE AND NAME SEQUENCE SEQUENCE CODE AND NAME SEQUENCE SEQUENCE
21 ROLL-BACK-PAGES ^Q ______ 3 ABORT ^C ______
27 ROLL-BACK-LINES ^W ______ 26 PICK ^V ______
5 SEARCH-BACKWARD ^E ______ 2 SET-FILE ^B ______
22 SEARCH-FORWARD ^R ______ 16 SWITCH ^N ______
24 ROLL-FORWARD-LINES ^T ______ 15 CARRIAGE-RETURN ^M ______
31 ROLL-FORWARD-PAGES ^Y ______ 36 CURSOR-UP ______
25 BACKTAB ^U ______ 34 CURSOR-DOWN ______
11 TAB ^I ______ 10 CURSOR-LEFT ______
17 ENTER-CONTROL-CHAR ^O ______ 35 CURSOR-RIGHT ______
20 PERCENT-GOTO ^P ______ 37 CURSOR-HOME ______
1 INSERT-SPACES ^A ______ 33 ENTER-PARAMETER ______
23 DELETE-SPACES ^S ______ 0 RESET RUBOUT ______
4 INSERT-LINES ^D ______
16 DELETE-LINES ^F ______
7 PUT ^G ______
50 ERASE-LINE ^J ______
13 SLIDE-LEFT ^K ______
14 SLIDE-RIGHT ^L ______
32 EXIT ^Z ______
30 EXECUTE ^X ______
WORKSHEET (PAGE 2)
WHICH COMMANDS ARE INVOKED BY WHICH TERMINAL SEQUENCES
COMMAND NORMAL YOUR COMMAND NORMAL YOUR
CODE AND NAME SEQUENCE SEQUENCE CODE AND NAME SEQUENCE SEQUENCE
40 RECALL ______
41 INSERT-MODE ______
42 DELETE-CHARACTER ______
43 REAL-TAB ______
44 MARK ______
46 CASE ______
47 WINDOW ______
50 ERASE-LINE ______
52 UP-TAB ______
53 DOWN-TAB ______
54 RE-WRITE ______
55 SAVE-FILE ______
56 HELP ______
57 BEGIN-LINE ______
60 END-LINE ______
61 ERASE-WORD ______
62 PUSH (TOPS-20 ONLY) ______
If the "normal" sequences given above seem a little chaotic it
is because the commands are arranged on the keyboard so that similar
commands are nearby. The name of the key has nothing to do with the
nature of the command invoked. Most SED users agree that this
system is better than having commands linked to keys which are
mnemonic but which are located far apart (like CONTROL-F and
CONTROL-B for <SEARCH-FORWARD> and <SEARCH-BACKWARD>, for example).
The general layout is:
! Q W ! E R ! T Y ! U I ! O ! P !
! ! !ENTR!PERC!
! ROLLS AND SEARCHES ! TABS !CCH !GOTO!
! A S ! D F ! G ! H ! J ! K L !
! ! !CUR !ERAS! !
! INSERT/DELETE !PUT !LEFT!LINE! SLIDES !
! Z ! X ! C ! V ! B ! N ! M !
! ! ! ! !SET ! !RE- !
Also, the RESET command is invoked by the RUBOUT (DELETE) key.
Most terminals have special keys with arrows on them which can
be used for the cursor movement commands. The terminal manual will
tell you what sequences they send. If there is no key for
<CURSOR-HOME>, locate it near the arrow keys.
SETTING UP THE TABLE
Now it's time to introduce you to the terminal input table
itself. In SEDX.MAC the table looks like:
IVT52: EXP 40, 1, 2, 3, 4, 5, 6, 7
The 5th slot in the table, for example, tells what happens when
the user types a CONTROL-E (which has Octal code 5); the 34th slot
tells what happens to a CONTROL-\ (which might be invoked by a
special or cursor movement key); and so forth.
The "0" that's hanging above the table (slot -1, actually) is
used by the RUBOUT (or DELETE) key.
If a control character invokes a command directly the
corresponding slot in the table contains the code for that command.
If CONTROL-B invokes the <SET-FILE> command then slot 2 of the table
contains 2. If CONTROL-B invoked <SEARCH-FORWARD> then slot 2 would
Things get more complicated when it comes to control sequences.
Whoever set up the table above made ESCAPE (slot 33) be the start of
a number of control sequences (in fact, this example is based on a
VT52 terminal, where ESCAPE is the first character sent out by all
the cursor movement and special keys). Slot 33 contains not a value
but a pointer. The right half of the pointer is the address of a
subtable (described below) and the left half is the negative length
of the subtable.
Every SUBTABLE HERE
WHAT KINDS OF BEASTS CAN LIVE IN THE TERMINAL INPUT TABLE
DESCRIPTION EXAMPLE WHATZIT
code 16 code of the command invoked
-count,,address -4,,SUBTAB subtable pointer for sequences which
begin with this control character
-big,,address -100,,SUBTAB ditto, if subtable ends with a zero
BEASTS LIVING IN SUBTABLES
code,,character 37,,"H" code of command whose invoking sequence
ends with the given character
address,,character SSUBTB,,"O" sub-subtable pointer for given character
code,,0 24,,0 command code which will match on anything
0 0 optional table-ending word