	CRTSTY is a program that supports various display terminals
not directly supported by ITS.  If you have problems with CRTSTY use
:BUG CRTSTY to report them.

	CRTSTY is a program which attempts to function as an invisible
intermediary between ITS and a "strange" display terminal.  A "strange"
terminal is anything not supported by ITS itself.  To see what support is
available for your terminal, if any, see [see Terminals (INFO;TERMS).]
For a variety of reasons, a terminal might not be suitable for direct ITS
support.  For example, it may have no command corresponding to one that
is required, or may need a non-standard escape sequence, or whatever.
In general these terminals are not numerous enough to justify putting
the support code directly into the system, and so CRTSTY exists.

In the usual case, all that is necessary is to furnish CRTSTY with the
terminal name:
		:CRTSTY <name>
For example, one might say ":CRTSTY FOX" or ":CRTSTY H1500".  The system
will now understand your terminal.  This is not actually what goes on; a
full explanation will be given later.

	There are many options that can be specified while invoking
CRTSTY, so as to better match the particular terminal or user.  For
example, some particular models of a certain terminal may have
unusual features or options, which CRTSTY can take advantage of if it
is told about them, or they may lack some features which CRTSTY assumes
are standard, and CRTSTY must be prevented from using them.

Options are specified on the JCL line just like a terminal ID is,
separated by spaces or commas:

		:CRTSTY <terminal> <option1> <option2>...

Some options may take an argument, which must immediately follow the
option name; for example, ":CRTSTY FOX SPEED 300 NOTAB" has an
option named "SPEED", with an argument of 300, as well as an option
named "NOTAB", with no argument.

The following list of options is organized functionally, although there
is some overlapping; the categories used are:

You can override CRTSTY's default assumptions about terminal parameters
with these options.

SPEED, ISPEED, OSPEED
	Are each followed by a decimal number, indicating the actual
speed of the terminal in bits per second.  This is primarily meant for
terminals connected in such a manner that ITS cannot determine the
speed of their communications line, for example, most terminals
connected through the ARPANET.  The speed should be one of the following:
	110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600.
The input speed is currently unimportant as far as CRTSTY is concerned.
The output speed, however, is used for two things:
  [1]  Padding.  Terminals require a certain amount of time to execute
	their functions; in some cases so much that pad characters must
	be sent.  The number of pads is a function of output speed.
  [2]  Output buffer size.  CRTSTY attempts to buffer one second worth of
	output at a time.  If this buffer is too large, it will take a long
	time to stop any output when the user wants to (by a ^S
	for example).  If this buffer is too small, output will be slowed down
	and come in small bursts, especially when the system is loaded.

BUFFER
	Followed by a decimal number.  Can be used to specifically override
the output buffer size.  See above paragraph for the implications of this.
In general, using this option isn't really recommended.

HEIGHT, PAGEL
	Followed by a decimal number.  This should only be used to specify
the actual number of lines on a terminal's screen, for cases when CRTSTY's
default size is wrong.  Do not use it to force display into an area
smaller than the actual screen size; use a :TCTYP PAGEL N to set that.
It is important that CRTSTY know the actual hardware screen size, even
if ITS is told not to use all of it.

WIDTH, LINEL
	Followed by a decimal number.  The number of columns on the terminals
screen.  Same cautions for HEIGHT hold here; it is OK to use TCTYP to
shorten effective screen width, but CRTSTY must always know the actual
hardware size.
	Note that some terminals may do unexpected things in the last column
of a line.  If the terminal is skipping an extra blank line whenever the
system prints a continued line (one with an ! at the end), you can probably
fix that by giving a :TCTYP to set the line length to one less than the
actual screen width.  Some terminals have "auto-linefeed" switches which
cause a character written in the last column to generate a CRLF; in general
CRTSTY and ITS will provide better support if such switches are turned off.
Send mail to BUG-CRTSTY@MC if any of these problems evidence themselves,
so that permanent fixes can be made.

Enables the user to disable the use of various features that CRTSTY might
normally believe a terminal capable of.  Meant for use in case the terminal
is not properly executing the feature for some reason, or use of the feature
is causing lossage (perhaps due to improper implementation in CRTSTY).  Since
these are features that usually can be done in some other (though usually
slower) way, these options might enable successful use of the terminal.

NOABS - Do not use absolute cursor positioning functions.
NOTAB - Do not use hardware Tab.
NOSAIL - VT52 only, do not attempt to do SAIL character translation.

The user can control various random options.

NOBELL - Tells CRTSTY not to send Bells (^G, 007) to the terminal.
	This has no effect on VISBEL.
VISBEL - Send a visible printing sequence in addition to (or instead of, if
	NOBELL is on) all hardware  bells, usually using the standout mode
	of the terminal.
ALARM <# mins> - If this option is given, CRTSTY will send a bell
	whenever terminal output happens after being idle for the specified
	number of minutes.  The idea is that you may want to be alerted
	from your book/desk/dinner by an unsolicited typeout of any form.
	Typein resets the "timer", as does typeout, so echo alone won't feep.
INVERS - "Inverse Video", for HP2640 and HP2546 only.  Reverses the sense of
	the entire screen.  Characters will be black-on-white.
GRAFIX - ADDS980.  Some special graphics hack, ask BYRON@ML about it.

Various options that tell CRTSTY how to set itself up.  Normally
CRTSTY will kill all current jobs the user has, attaches itself as
the user's top level job, opens up a Pseudo-TTY (STY) channel, ^Z's the STY
to get a new HACTRN then logs the user in again.

NOTOP - CRTSTY runs like any other job, under the user's HACTRN; it does not
	:ATTACH itself and become top-level.  ^Z will
	bring the user back to his original HACTRN, stopping the CRTSTY.

NOLOGIN - CRTSTY attaches itself and ^Z's a new HACTRN, but does not log the
	user in automatically as it usually does.

SLAVE - To "slave" a STY; suppresses the ^Z of a new HACTRN, and naturally
	doesn't log the user in either.  Also, logging out will not
	kill the STY or CRTSTY; it can be ^Z'd again manually.  Note that
	if NOTOP is not also given, there is no way to flush the CRTSTY
	short of gunning it down.  This can be useful for semi-permanent
	setups.

NOWARN - Suppress warning messages on startup, such as "interchanged keys"
	messages.  This can be useful when CRTSTY is invoked from a
	DDT INIT file, and the user is sick and tired of seeing the same
	warning again and again.

TPCBS - A temporary debugging switch which turns off CRTSTY's use of
	%TPCBS (intelligent terminal ptcl) so as to produce weird errors
	with SCPOS for the edification of unbelieving ITS TTY hackers.
	Don't use it.

	This node will eventually have a menu pointing at each possible
terminal type that CRTSTY will understand, with each subnode documenting
various relevant features which CRTSTY furnishes for that terminal and
the like.  In the meantime, [see Terminals (INFO;TERMS).]
lists most supported terminals and gives technical information about them,
mostly aimed toward a potential buyer.

For the time being, the VT52 is the only one described here owing to its
usefulness (and complexity for the unknowing crtsty user).
Basically CRTSTY's VT52 implementation turns on the "alternate keypad"
mode in the following ways:
Key			Function
Left blank (blue)	META		These 3 apply to next real char typed;
Center blank (red)	TOP		any combination may be used.  If you
Right blank (black)	CONTROL		make a mistake, then hit the following
Down arrow		Cancel previous keys	which does what it says.
Up arrow		CALL		As opposed to plain Control-Z
Left arrow		BACK-NEXT	(^_ for com-links etc.)
ENTER			CRTSTY-Escape   Tell CRTSTY to do something
Right arrow		BREAK		escape for SUPDUP, TELNET, and PTY
0-9			META-0 to META-9	Very handy as args in EMACS.

Note that Escape (altmode) followed by a capital A, B, C, or D very quickly
has a small but non-zero chance of being interpreted as CALL, Cancel-previous,
BREAK, or BACK-NEXT.  If you don't use CAPS LOCK you'll probably never see
this, but if you do, the solution is (unfortunately) to not type with lightning
speed.

The ENTER key is a key that signals CRTSTY that you want to tell it something.
It saves the bottom line of your screen, and prompts with a "CRTSTY-->"
and waits for a single character.  It understands the following commands on
any terminal:
D -- Dump the screen image into the file .TEMP.;<uname> SCREEN
H -- Send a HELP character to the program
F -- Toggle FEEP mode (the ALARM option in JCL) whereby a BEEP is sent if you
     get output after being idle for both input and output for more than a
     JCL-specified amount of time.

In addition, individual terminals may specify additional operations.

	It is generally a simple matter to add support for a new
terminal to CRTSTY.  This section will attempt to describe certain
minimum requirements the terminal must satisfy in order to be
supportable.  It then gives the procedure for requesting CRTSTY support
for your terminal.

	The first step is to check to see if your terminal is already
supported.  The most up to date information can be gained by typing
:CRTSTY ?, which will cause CRTSTY to list the terminals it knows
about.  However, sometimes the 6 letter names can be difficult to
recognize, therefore one might want to look over the menu in
[see Terminals (INFO;TERMS).]

	In order for a terminal to be usable as an ITS display terminal
it must be able to selectively erase portions of the screen and to move
its cursor to any position on the screen.  While these requirements are
satisfied by most display terminals there are some which do not.  For
example a storage scope terminal (e.g. the Tektronix 4010 series
terminals) cannot selectively erase - only the whole screen can be
cleared.  Some terminals cannot move the cursor anywhere on the screen,
(e.g. the ADM-3) and so do not qualify.  This is not to say that these
terminals are unusable as ITS terminals, but that they cannot be used
as display terminals (e.g. for real-time editing in EMACS).  Use
":TCTYP TEK" for the 4010 series, and ":TCTYP GLASS" for those CRT
terminals which cannot move their cursor. (*Note (INFO;TCTYP)Top.)

	If the terminal satisfies the above two requirements then it is
possible for CRTSTY to support it.  However some terminals which meet
these requirements are painful to use as display terminals because they
lack features which must be simulated.  For example some terminals lack
any easy means of erasing to the end of a line or to the end of the
screen; to simulate these basic erasure commands CRTSTY must erase
character by character to the end of line/screen.  This is often
unbearable, especially at slow speeds.  Such terminals are better used
as "glass teletypes" rather than display terminals.  If you have such a
terminal (e.g. the ADM-3A) we highly recomend that you use it as a glass
TTY instead of trying to use CRTSTY.  If you do use CRTSTY, be content
that it works as well as it does; suggestions for display optimization
on such terminals are given the very lowest priority and will probably
never be done.

	At slow speeds even terminals with the basic erasure commands can
be painful to use as editing terminals unless they have the ability to
insert a new line on the screen (moving subsequent lines down), delete a
line from the screen (moving subsequent lines up), insert a character in a
line, and delete a character from a line.

	If your terminal has all the necessary features (selective erase
and cursor positioning), and is not supported by ITS or CRTSTY, you are
welcome to request CRTSTY support for it.  To do so send a message to
BUG-CRTSTY, that is do
	:BUG CRTSTY
and give a detailed description of the terminal.  If you simply ask for
support without giving a description we will at best ask for the details,
or at worst ignore you.  To support a terminal we need to know the
following things:

(Please do not specify commands in hex, or use obscure ASCII names for
control characters.)

[1] The size of the screen, i.e. the no. of characters per line and
	the no. of lines on the screen.
[2] The commands which should be sent to perform each of the following
	functions:
  a. Move cursor up one line
  b. Move cursor down one line - usually this is LF (^J, 012)
  c. Move cursor back one character position - usually this is BS (^H, 010)
  d. Move cursor forward one character position
  e. Move cursor to "home" position - For our purposes, this better be the
				upper left corner.
  f. Move cursor to beginning of line - usually CR (^M, 015)
  g. Move cursor to arbitrary position on screen ("absolute move")
  h. Erase to end of line - say whether it erases the complete line the
	cursor is on (bad) or just everything to the right of cursor (good).
  i. Erase to end of screen - similarly, will this clobber chars to the
	left of the cursor?  (It shouldn't)
  j. Erase whole screen - does it also move the cursor?  (should home)
  k. Insert line
  l. Delete line
  m. Insert character (or enter/exit insert character mode)
  n. Delete character
  o. Ring bell - usually BEL (^G, 007)
  p. Set tab stops - If tabs are not settable, or defaults are furnished,
	specify tab size (usually this is 8)
  q. Tab - usually HT (^I, 011)
[3] What the terminal does when a character is typed when the cursor
	is on the last column of a line.  Some terminals remain in the
	last column after the character is typed, others automatically
	CRLF.  If there is a choice (e.g. a switch) the former
	(remaining in the last column) is preferred.
[4] What the terminal does if you attempt to move down off the edges of the
	the screen
	a. by LineFeed off bottom
	b. by cursor position command off the bottom
	c. move off the bottom by an auotmatic CRLF off the last line
	d. cursor position off the right, left and top of the screen.
[5] A list of functions which might require padding at some speeds
	and the amount of padding required (this is best expressed as
	the amount of time required to perform the operation, but can
	also be given as the no. of pad characters required at each
	speed).
[6] Also any other features which might be useful.  If in doubt as to
	"usefulness", describe them anyway; who knows?
[7] Any misfeatures which CRTSTY should try to correct for.  For
	example many terminals have poor keyboard layouts which CRTSTY
	can correct for by exchanging certain keys.  The most common
	such switch is done for terminals where RUBOUT can only be typed
	with the SHIFT key down.  RUBOUT and the unshifted character are
	then usually exchanged.  Other common misfeatures include LF
	being ignored or interpreted specially after CR.

It isn't necessary that a terminal be able to do everything listed above
(in fact, much of CRTSTY's benefit comes from simulating those which
the terminal can't do), however, be sure to furnish some answer for
all of the items; otherwise we'll probably have to ask you about it
anyway.

If one simply puts :CRTSTY ... in one's init file, when one logs in, CRTSTY
will be started up, and will log in the user on the CRTSTY's STY.  However,
this second login will also attempt to run CRTSTY and encounter an error unless
precautions are taken to prevent such recursion.

The way to prevent the recursion is as follows:

:DDTSYM TCTYP/
:IF N Q-%TNSFW
(:CRTSTY <the JCL you would use to run it by hand>
)

Note that all 's in the above are ALTMODE's, not Dollar-signs

This should be placed near the beginning of your init before anything real
is done.  The first time through, you won't be on a STY so it will simply
run the CRTSTY, which will flush the DDT that was running the init, so no
further processing will be done on that run of the init.  The second time
through, you will be on a STY, and the :IF conditional will fail and the
part between the ( and the ) will not be done.  It also will not try to
run it if you are on a PTY, or using SUPDUP.

If you wish to have it ask you if you want to run CRTSTY, you can do the
following:

:DDTSYM TCTYP/
:IF N Q-%TNSFW
(:--CRTSTY--IF MORE 0
(:CRTSTY <the JCL you would use to run it by hand>
))

To prevent it from asking if you're on a TV, another layer is necessary:

:DDTSYM TCTYP/
:IF N Q-%TNSFW
(:IF N Q-%TNTV
(:--CRTSTY--IF MORE 0
(:CRTSTY <the JCL you would use to run it by hand>
)))

Another aproach is to only run it if you are on a dialup or coming in from the
net:

:DDTSYM TCTYP/
:IF N -%TNSFW
(:DDTSYM TTYTYP/
:IF N Q&<%TYDIL^_%TYSTY>
(:--CRTSTY--IF MORE 0
:CRTSTY <the JCL you would use to run it by hand>
)))

For more info on DDT see DDT.
For more info on INIT files, and DDT conditionals,
see INITS (DDT).
