Updates: FSC-0025

                                                Pittsburgh, PA
                                                1 May 1989

                          A   V   A   T   A   R

        Advanced Video Attribute Terminal Assembler and Recreator

                           George A. Stanislav

                            Fidonet 1:129/39.0


            This FSC is being distributed to members of the FidoNet
            community in order to solicit their reactions to the
            proposals contained in it.  While the issues discussed may
            not be directly relevant to FidoNet standards,  they may be
            interesting to implementers.  Distribution of this document
            is unlimited.

   Revised on 25 November 1989


Avatar, level 0 - The Avatar protocol as presented at Fidocon '88 and
        described in AVATAR0.C, dated 23 August 1989, plus extensions
        defined in this document.

AVT/0   -  An abbreviation for Avatar, level 0, suggested by Joaquim

Current attribute - Video attribute defined by the last ^V^A, ^V^L, ^V^M or ^L
        AVT/0 command whichever happened last. In AVT/0, ^L sets the value
        of current attribute to 3, ^V^L, ^V^M and ^V^A to an explicit value.
        In addition, ^V^B turns blink on.

                            Extending AVT/0

It has become clear some of the Avatar commands originally reserved for
AVT/1 would be very useful in AVT/0. I was hesitant to add them for one
simple reason: Any addition on level 0 will break all existing Avatar
emulating software.

However, at present there are only three programs I know of that have
implemented Avatar emulation: My own TinyTerm, Joaquim Homrighausen's
FrontDoor and Jason Galanter's Jterm.

Both Joaquim and Jason have assured me they would put the new commands in
their programs, thus nothing will be broken. With that assurance in mind,
I feel confident no chaos will result from adding these new commands.

                New Commands (brief definitions)

        <^V><^I>  -  Turn insert mode ON. It stays on until any other AVT/0
                     command except <^Y> and <^V><^Y> is encountered after
                     which it is turned off;

        <^V><^J><numlines><upper><left><lower><right> - scroll area up;

        <^V><^K><numlines><upper><left><lower><right> - scroll area down;

        <^V><^L><attr><lines><columns>  - clear area, set attribute;

        <^V><^M><attr><char><lines><columns>  - initialize area, set attribute;

        <^V><^N>        -  delete character, scroll rest of line left;

        <^V><^Y><numchars><char>[...]<count>  -  repeat pattern.

                      Detailed Description

Insert mode: Insert mode controls the way characters are printed on the
        screen. Insert mode is always assumed OFF unless explicitly set ON
        by the ^V^I command after which it stays on until another AVT/0
        command except for ^Y or ^V^Y is encountered. Then it reverses back
        to off.

        Whenever insert mode is OFF, characters are printed on the screen
        like this:

        1. Print character at current cursor position using current attribute,
           overwriting whatever was previously displayed at current cursor

        2. Move cursor to next position, usually one character to the right.
           At end of the line, move the cursor to next line (possibly
           scrolling the display or current window if in AVT/1).

        Whenever insert mode is ON, characters are printed on the screen
        as follows:

        1. Starting at current cursor position and going all the way to the
           second last character on current line, scroll the text one
           character to the right;

        2. Discard the character previously at the end of the line, do NOT
           move it at the beginning of the next line;

        3. Print character at current cursor position using current attribute;

        4. Move cursor to next position, precisely as in par. 2 of insert
           mode off.

If ^Y or ^V^Y are encountered, the string of characters they compress is
first expanded, then treated as an ordinary stream of characters printed
according to the above rules.

Any other AVT/0 command turns insert mode back off. Please note that in
either case the cursor is moved to its next position in an identical manner.
The mere fact the cursor is moved to next line, or even scrolls the screen
a line up, does NOT turn insert mode off. Only an AVT/0 except as mentioned
above can change insert mode on or off.

If control characters are a part of the text stream, they are interpreted
indentically in insert mode on and off as follows:

        Carriage return  -  move cursor at the beginning of the same line;

        Line feed        -  move cursor one line down (scroll screen or
                            window [in AVT/1] if necessary), do not change
                            cursor column;
        Back space       -  move cursor one position to the left. Do NOT
                            overwrite the character at that position.
                            Do nothing if already at the leftmost position;

        Tab              -  move cursor to next tab position without
                            overwriting anything. Tab positions are
                            multiples of 8. Do nothing if already at the
                            rightmost position.

A space is treated as a character, not as a control character.

Scrolling an area (^V^J and ^V^K): The area defined by its upper, left, lower
        and right coordinates is scrolled up <^V^J) or down (^V^K) by
        <numlines> lines filling the gap with blank spaces using current
        attribute. If the value of <numlines> is zero or exceeds the actual
        number of lines within the scrolled area, the area is filled with
        blanks using current attribute.

        These two commands do NOT change the position of the cursor, nor
        do they define the scrolled area as the default window.

        The coordinates are relative to the upper left corner of the screen
        (or current window in AVT/1). The coordinates of upper left corner
        are 1,1. If a coordinate contains 0, it is to be changed to 1.

Initializing an area (^V^M): This command contains several steps:

        1. Set current attribute to <attr>;

        2. Starting at current cursor position (inclusively), ending
           at current cursor position plus number of <lines> and <columns>,
           print <char> at all position inside the defined area. Do not
           move the cursor. If the number of columns or lines exceeds whatever
           is available to the right and below current cursor position,
           truncate the dimensions to fit within the limits of the screen
           (or current window in AVT/1).

Clearing an area (^V^L): This is a shortcut version of the ^V^M command.
        The character to be used to initialize the area of the screen is
        assumed to be a blank space. In other words, it sets current
        attribute and clears an area of the screen starting at current
        cursor position (which remains unchanged).

Please note that the usual 7-bit restriction applies to ^V^L  That means
that the attribute byte should be anded with 7f hex before applying. If
blinking is desired, ^V^B should be used next.

On the other hand, requiring to ignore the high bit in ^V^M would make it
impossible to fill the area of the screen with a blinking pattern (something
I have seen used very creatively by Chris Gaal of PittNet). Therefore, if
bit 7 of attr is set in ^V^M, current attribute is set to <attr> AND 7f hex
and blink is turned on before filling the area with a character.
Deleting a character (^V^N): Starting at the column one character to the right
        of current cursor position all the way to end of the line, scroll
        the text one character position to the left. This effectively
        deletes the character at current cursor position. Print a blank space
        using current attribute at the rightmost end of the line to fill the
        gap. Do not change current cursor position. If the cursor is at the
        end of the line, simply overwrite the last character with a blank
        space using current attribute.

Repeat pattern: This is an extension of the ^Y command which allows a group
        of characters to form a repetititious pattern. <numchars> determines
        the number of characters in the pattern, <count> the number of times
        the pattern is to be printed out. The pattern may contain AVT/0 codes.

For example, <^V><^Y><#3>ABC<#4> expands to "ABCABCABCABC".

                        Scrolling Philosophy

An important philosophical question has not been answered yet: When scrolling
the contents of an area (in the scrolling commands ^V^J and ^V^J, in insert
mode ON and in deleting characters ^V^N) should only the text be scrolled
and the attribute of the scrolled areas remain where they are or should the
attributes move as well.

A case can be made for either approach. Obviously, the gaps created by
scrolling are filled with current attribute, therefore, it seems more logical
to scroll the attributes along with the text (else there would be no need
to fill the gaps). Thus we follow a consistent principle of video attributes
belonging to a character (be it a blank, a digit, or a true character), not
to a location. Whenever a character is scrolled to a different location, it
takes its attribute along.