5-5  TERMINALS AND PRINTERS 
 ***************************

 The term 'terminal' is often used to refer to a display device with a 
 video screen, but terminals are really a certain class of peripherial 
 devices, including in addition to video terminals also printers 
 (sometimes called hardcopy terminals), plotters, etc. 

 Terminal is a short for 'terminal equipment' - everything connected 
 to a computer, which is not intermediary communication equipment
 (e.g. a modem).

 Video terminals and printers are very similar devices from the point 
 of view of the operating system, both work with characters, and are
 characterized by: 

    Serial transmission speed    (Baud rate, typical 9600)
    Flow-control mechanism       (software: XON/XOFF, hardware: )
    Control character screening  (e.g. NUL (ASCII 0) ignored)
    Line width                   (typical 80,132 characters)
    Automatic line wrapping      (when enabled)

 Both device types get their input in the form of consecutive binary 
 numbers, usually 7-8 bits long each (sent big-endian at least in DEC), 
 and a deeper similarity is the way both devices generate characters 
 from these numbers.

 The device keeps a CHARACTER-SET (one or more), this is a kind of
 'graphic lookup table' that translates the binary numbers sent on the
 transmission line to graphic symbols that can be displayed or printed.

 If we can make the device to 'switch' the current character set, the 
 same input will generate different output.

 Older systems used 7-bits long binary numbers, and so could encode 
 only 128 different characters (0-127), newer systems use 8-bits codes, 
 and so can represent 256 characters (0-255).

 The first 128 codes have standard interpretation called ASCII (American 
 Standard Code for Information Interchange). IBM mainframes have their 
 own interpretation for these codes called EBCDIC. See ASCII and EBCDIC 
 tables in appendix B.

 The following topics may be relevant only to VTxxx terminals or
 compatibles.


 National replacement sets
 -------------------------
 When using the limited 7-bit character set, it's convenient to change
 the definition of some ASCII codes. 

 In the pound using countries (England), a pound sign is needed, and 
 may be implemented by redefining the '#' sign.

 In other countries, using larger alphabets, other signs like: 
 commercial at, square brackets, backslash, caret, underscore etc,
 may be 'appropriated' to implement the necessary letters.


 The higher codes
 ----------------
 The codes 128-255 have several possible interpretations or character
 sets, like:

    ISO Latin Alphabet Nr. 1
    ISO Latin Alphabet Nr. 2
    ISO Latin Alphabet Nr. 5
    ISO Latin - Cyrillic
    ISO Latin - Greek
    ISO Latin - Hebrew


 Compose sequences
 -----------------
 Standard keyboards can't generate all the lower (0-127) codes, and
 the full 8-bit character sets are hopeless.

 The standard way to extend the ability of keyboards, is adding 
 'modifier keys', like the 'shift' and 'control' keys. 

 Some keyboards has a 'compose character' key, special sequences of 
 key presses that start with 'compose' generate the higher characters.
 See your terminal documentation for instructions and more details.


 Control characters, escape and control sequences
 ------------------------------------------------
 The codes 0-31 (C0 band) and 128-159 (C1 band) are reserved for 
 controlling the terminal, they perform functions like tabbing,
 carriage return, etc.

 Terminals can do a lot of useful things if sent the appropriate
 escape sequence - a sequence of regular characters prefixed by the
 'escape' (ASCII no. 27) code, for example:

    'escape' [ 1 3 ; 1 2 H         Put cursor in line 13, column 12
    'escape' [ 2 J                 Clear screen

 An extra 'space' character was added after each character to make
 the sequence more readable. 

 You can easily generate an escape sequence in FORTRAN:

      WRITE(*,*) CHAR(27), '[2J'

 This statement will clear the screen on any ANSI compatible video 
 terminal (e.g. VT100, xterm windows etc). 

 A small table of useful ANSI escape sequences:

    Property          Switch ON        Switch OFF     Whole page
    ===============   ==============   ============   ==============
    REVERSE VIDEO
    BLINKING
    UNDERLINING

    Action
    ================   
    CLEAR SCREEN
    POSITION CURSOR
    STOP RECEPTION
    RESUME RECEPTION


 Soft character sets
 -------------------
 Some terminals have the ability to download a character-set from the
 host computer, the downloaded character-set has to be defined pixel
 by pixel and that information is sent to the terminal embedded in a 
 special escape sequence.

 This feature is useful if you need to display characters your terminal
 can't display.


 Optimizing terminal output for speed
 ------------------------------------
 Scrolling is a very very slow operation, when updating the screen 
 place the cursor at the upper left corner before you start writing, 
 on an ANSI terminal you can use:

      WRITE (*,*) CHAR(27), '[1;1H'

 If you don't write full lines you may want to erase the screen before
 you place the cursor:

      WRITE (*,*) CHAR(27), '[2J', CHAR(27), '[1;1H'

 Moving the cursor, and in general using escape sequences is slower
 than using control characters like the  and  your program
 sends to the terminal to start new lines.


 Characters that are ignored by terminals
 ----------------------------------------
 An important example is the character NUL (ASCII 0). At least on VTnnn 
 compatible terminals (and probably others) this character is ignored. 

 That means that if the compiler initializes character strings to NUL 
 (e.g. DEC FORTRAN, Sun) writing an unassigned string to the string 
 produces no visible output (except starting a new line). 

 When writing a partly assigned string, only the assigned part
 will appear, a bit confusing to the uninitiated.


 Terminals and terminal drivers
 ------------------------------
 ...Blocking I/O...


Return to contents page