FSC-0037 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 Information 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 Definitions 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 Homrighausen. 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 position; 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.