RIPscrip Graphics Protocol Specification


             ------------------------------------------
              RIPscrip Graphics Protocol Specification

                     "Remote Imaging Protocol"

                      Copyright (c) 1992-1993
                  TeleGrafix Communications, Inc.
                        All Rights Reserved

                          Revision 1.53.00

                           May 12th, 1993
             ------------------------------------------




=====================================================================
==                           INTRODUCTION                          ==
=====================================================================

As system operators of many bulletin board systems, we've often
wished for some form of Graphical User Interface for our boards. Like
most Sysops, we've come across many solutions.  But they all seemed
to fall short in one way or another:  inadequate for THIS system,
incomplete, difficult to implement, too complex, or lacking in
graphics development tools.  In short, we became frustrated.

So, we decided to write our own Graphical Script Language.

RIPscrip stands for "Remote Imaging Protocol Script" language.  This
graphical language is our answer to the graphics needs of the BBS
community and has serious tools for implementation and practical use.

For more information on RIPaint, RIPterm or RIPscrip development
tools, contact:

     TeleGrafix Communications, Inc.
     16458 Bolsa Chica #15
     Huntington Beach, CA  92649

     VOICE: (714) 379-2131
     FAX  : (714) 379-2132
     DATA : (714) 379-2133 (ArenaBBS: The Major BBS...32 lines)





=====================================================================
==                     USE OF RIPscrip LANGUAGE                    ==
=====================================================================

The RIPscrip language is made publicly available and is freely
licensed by TeleGrafix Communications, Inc.  By freely licensed, we
mean that the language can be used in the creation of other products.
It does not mean that RIPscrip is public domain. TeleGrafix maintains
the copyright of the RIPscrip language.

RIPscrip, RIPaint, RIPdraw, and RIPterm are trademarks of TeleGrafix
Communications, Inc.  If you make a product that uses RIPscrip, you
must state in your program's "About Box" and documentation that this
product uses RIPscrip and the trademark statement.  You may not use
RIPterm, RIPaint, RIPdraw, or RIPterm in the name of your product.

If you have any questions regarding these issues, contact TeleGrafix
Communications, Inc. at 714/379-2131.





=====================================================================
==                            DEFINITION                           ==
=====================================================================

RIPscrip is a text based Script language for displaying online
graphics.  The script language conforms to 7-bit ASCII, avoiding the
use of Extended ASCII characters.  This allows transmission over X.25
networks and other carriers that do not support full 8-bit binary
transfers easily.  RIPscrip allows RIPscrip graphical statements to
be mixed with printable ASCII text and [de facto standard]
ANSI/VT-100 directives.  RIPscrip can dynamically determine what is
graphics and what is text and display them appropriately in separate
windows (a graphics window and a text window).  And if you must have
your own proprietary commands, RIPscrip has room for that too.




=====================================================================
==                     HOW DOES RIPscrip WORK?                     ==
=====================================================================

RIPscrip uses a flexible, and very efficient script language for its
graphical statements.  Its efficiency stems from its compactness and
developmental planning.  It is entirely Object Oriented instead of
Raster Oriented for efficient transmission of data and powerful
editing capabilities (using RIPaint for example).  The language is
open ended enough so that literally trillions of different graphics
commands can be implemented as needed.  RIPscrip is not a proprietary
protocol standard and is open to suggestion from the rest of the
world.

Earlier Graphical Script Languages (Avatar and Skypix among others),
utilize special command characters to indicate which graphics command
is to be executed.  This precludes their use on systems that are
limited to ASCII printable text.  Traditional script languages use
English words to accomplish things (eg, "BOX 0,0 100,50").  This kind
of thing is incredibly bulky, especially when you consider that
pictures are usually not simple things, but comprised of hundreds or
thousands of individual graphical operations (eg, line, circles,
fills, text, etc.).  With this in mind, a human-readable script
language was completely inappropriate for the relatively limited
bandwidth of conventional modems.

So, one of our main strategies for this language was to make it as
efficient as possible without going completely binary.  This allows
the immediate installation of the protocol onto any ASCII text-based
host system -- because the language consists entirely of ASCII
printable characters.  We justify the unreadability of the language
by pointing out the limitations of today's modems and phone lines --
the language must be compact.




=====================================================================
==              RIPscrip PROTOCOL - GENERAL STRUCTURE              ==
=====================================================================

This document describes RIPscrip commands up through version 1.53.00 of
the RIPscrip Protocol Specification.

RIPscrip is organized into 10 levels of graphical commands (low Level-0
to high Level-9).  Level-0 commands are the building blocks of RIPscrip.
The basic graphics primitives of the system are all Level-0, including
the commands Line, Rectangle, Circle, Color, Font, etc.  Each level of
RIPscrip gets progressively higher-level in concept.  For example,
Level-1 commands use Mouse Regions, Icons, and Formatted Text Regions.

The basic syntax rules are as follows:

1.  A RIPscrip command line starts at the beginning of a line of text.
    A RIPscrip command line moved to the middle of a line of text is
    treated as literal text. This prevents people inserting mischievous
    things in teleconference messages, or similar pranks.  The only
    exceptions to this rule is stated below under item 6, "continuation
    of long lines", and item 12 "alternate RIPscrip starting sequences".

2.  A RIPscrip command line begins with an exclamation mark (!).

3.  Every RIPscrip command is preceded by the universal RIPscrip
    delimiter, vertical-bar (|)

4.  Individual RIPscrip commands may be combined on the same line
    providing they are separated by the vertical bar delimiter.

5.  RIPscrip commands or command lines may be split across multiple
    lines with a backslash (\) just before each split.  This helps
    RIPscrip commands conform to right margins and escape word wrapping.

          An example:

               !|c02|L02030405|P0901020102010201020102\
               0102010201020102

6.  RIPscrip must allow for normal text to be intermixed with
    RIPscrip commands.  If unrecognized text appears after a RIPscrip
    command, on the same line, the text is ignored (the command is not
    ignored).  A line that does not begin with "!|" is considered raw
    text and is routed to the TTY text window (see "8" below).

7.  RIPscrip makes provisions for a Graphical Window and a Text
    Window.  The Graphical Window is where all RIPscrip graphics appear.
    The Text Window is where raw text appears.  Raw Text includes ANSI
    color and cursor movement codes (a subset of VT-100 terminal
    emulation).

8.  The vertical bar (|) of a RIPscrip command can be followed by a
    level number.  If the 1st character after (|) is a numeric digit
    (1-9), then that's the RIPscrip Command Level.  If the very 1st
    character is NOT a digit 1-9, then it is the command type character
    and the command is a Level-0 command.  If the 1st character is a
    digit 1-9, and the second character is also a digit, then that
    defines a sub-level of a RIPscrip level.  For example:

          !|L     RIPscrip Level-0 Command "L"
         !|1L     RIPscrip Level-1 Command "L"
        !|15L     RIPscrip Level-1, sub-level 5 Command "L"

    Each of the above examples are unique commands not to be confused
    with each other.  You may continue the sub-levels up to a maximum
    level of 9 (e.g., !|123456789<cmd>").

9.  Every RIPscrip command includes a command type character.  In
    Level-0 commands, this character immediately follows the vertical
    bar.  At all other levels, it follows the level digits.  The command
    type character may be any printable non-decimal-digit character.

10. Following the command type character are 0 or more parameters.
    If the command requires a text-string, it is always the LAST
    parameter.  Numeric parameters DO NOT have any delimiters (commas,
    dashes, spaces, etc.).  A variable width numeric parameter may be
    used as the last parameter.  This allows for maximum efficiency.
    Numbers are represented in base-36.  This compacts numbers down to
    roughly 3/5 of their decimal form.  This numbering system,
    technically called "Hexa-Tri-Decimal", has affectionately been dubbed
    "MegaNums".  Unlike Hexadecimal which uses 0-9, A-F, MegaNums take
    advantage of the entire alphabet, using characters 0-9 and A-Z.

11. An exclamation mark (!) or vertical bar (|) character can appear
    in a RIPscrip text parameter by preceding it with a backslash(\).  A
    literal backslash is represented with a double-backslash (\\).

12. A RIPscrip sequence CAN begin in a column other than column #0,
    if the exclamation mark prefix is replaced with a Ctrl-A (Start Of
    Header [SOH]) character, or Ctrl-B (STX) character.  Since 99.9% of
    all BBS' do not allow users to enter most control characters, users
    will be unable to begin RIPscrip sequences in the middle of a command
    line.  Only the host should be able to do this.  This prevents people
    from cluttering  teleconference, or other areas of a host with
    spurious RIPscrip sequences.



ANSI SEQUENCES
--------------
RIPscrip predominantly uses non-ANSI command sequences.  In a couple of
situations though, an ANSI sequence is allowed to perform a specific
function.  There are currently three separate ANSI sequences defined in
the RIPscrip protocol to perform various actions.  They are as follows:

ESC[!     Query RIPscrip version number.  RIPterm will respond with
          RIPSCRIPxxyyzz where xx is equal to the major version
          number (zero padded), yy is equal to the minor version
          number (zero padded), and zz equals the revision code (also
          zero padded).  For v1.53.00, the returned sequence would be
          RIPSCRIP015300.  Another example, v1.23.45 would return
          RIPSCRIP012345.

ESC[0!    Same as ESC [ ! (see above)

ESC[1!    Disables all RIPscrip processing.  Any RIPscrip sequences are
          interpreted as raw text.

ESC[2!    Enabled RIPscrip processing.  Any RIPscrip sequences will be
          parsed and processed.






=====================================================================
==                    RIPscrip COMMAND REFERENCE                   ==
=====================================================================

The remainder of this document details the RIPscrip command set.
Each command has these aspects:

    SYMBOL - the symbolic constant that is referenced in the
             RIPscrip API Library code.  This is  the universal
             name for the command.

     LEVEL - The Command Level.  Sub-levels are represented
             with decimal points (eg, 1.3.5 for Level-1,
             Sub-level 3, Sub-Sub-level 5).  This is for
             discussion purposes only.  The decimal points
             are never part of the actual command.

   COMMAND - The command type character identifying the
             command

 ARGUMENTS - The arguments or parameters for the command.
             Commands that do not require any arguments
             after the command type character are shown
             here as "<none>".  Each argument is shown in
             the order it appears in the command, and is
             represented by a name.  If an argument is
             numeric, it is followed by a width specifier
             indicating how many MegaNum digits the
             argument consists of.  (eg, ":2" means a
             2-digit MegaNum, or a value between 0 and
             1295).  If an argument does not have a width
             specifier, it is by default a text argument,
             and should be the last argument on the line.
             If a command is variable length (see POLYGON),
             then it will appear with ellipses (...)

    FORMAT - This represents the format of the command, with
             the starting "!|", the level digits, the
             command type character, and the argument list,
             with the argument names in angle brackets.
             (These arguments are spaced apart, but these
             spaces never appear in the physical commands.)

   EXAMPLE - An actual example of the RIPscrip command.

DRAW COLOR - If YES, then this command uses or affects the
             current Drawing Color.

LINE PATRN - If YES, then this command uses or affects the
             current Line Style Pattern.

LINE THICK - If YES, then this command uses or affects the
             current Line Style Thickness

FILL COLOR - If YES, then this command uses or affects the
             current Fill Color.

FILL PATRN - If YES, then this command uses or affects the
             current Fill Pattern.

WRITE MODE - If YES, then this command will take advantage
             of the current Write Mode (eg, COPY, or XOR).

FONT SIZES - If YES, then this command uses or affects the
             current Font Size.





RIP_TEXT_WINDOW
---------------
         Function:  Define the size and location of the Text Window
            Level:  0
          Command:  w
        Arguments:  x0:2, y0:2, x1:2, y1:2, wrap:1, size:1
           Format:  !|w <x0> <y0> <x1> <y1> <wrap> <size>
          Example:  !|w00001B0M10
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command specifies the dimensions of the virtual TTY window that will
display all ASCII/ANSI (non-RIPscrip) data coming across the connection.
(x0,y0) defines the upper-left corner of the window in text-based
character- cell coordinates.  (x1,y1) defines the lower-right corner of
the window (inclusive).  There may be two simultaneous windows on the
screen, one for TTY text, and one for the display of RIPscrip graphics (a
viewport), and they may overlap.

Bytes received over the modem are first checked for RIPscrip commands.
All bytes that don't conform to the RIPscrip syntax are treated as
ANSI/ASCII and displayed in the TTY window (if defined). User keystrokes
that are echoed by the BBS would also appear in the text window by this
scheme.

The text window may be made invisible, ignoring all non-RIPscrip bytes,
by setting all RIP_TEXT_WINDOW parameters to zero (0).  The X and Y
parameters ranges vary depending on the setting of the <size> parameter
which governs the font size used for the output text. Valid settings for
the <size> parameter and the ranges for X/Y values are as follows:

        Size   Font Size   X Range  Y Range
        ------------------------------------------
         0     8x8          0-79     0-42
         1     7x8          0-90     0-42
         2     8x14         0-79     0-24
         3     7x14         0-90     0-24
         4     16x14        0-39     0-24

The <wrap> parameter applies to both the horizontal and vertical
dimensions.  If <wrap> is set to 1, then any text that extends beyond the
right margin of the window will wrap to the next line of the window,
scrolling the window up if necessary.  If <wrap> is 0, then any text
going beyond the right margin is truncated and no scrolling is performed;
the cursor remains at the right margin.

NOTE:  If the text window currently being defined is identical to the
       currently defined text window, the cursor will not be relocated
       to the upper-left corner of the window. The only aspect of the
       text window that can be different and still be deemed
       "identical" is the <wrap> parameter.  For the current and new text
       windows to be considered identical, the parameters <x0>, <y0>,
       <x1>, <y1> and <size> must be the same.



RIP_VIEWPORT
------------
         Function:  Define the size and location of the Graphics Window
            Level:  0
          Command:  v
        Arguments:  x0:2, y0:2, x1:2, y1:2
           Format:  !|v <x0> <y0> <x1> <y1>
          Example:  !|v00002E1M
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command defines the (X,Y) pixel boundaries of the RIPscrip graphics
window, which will contain all RIPscrip graphics output. ASCII/ANSI text
will be displayed in the virtual TTY window defined by the
RIP_TEXT_WINDOW command above.  (x0,y0) defines the upper-left corner of
the graphics viewport, and (x1,y1) defines the lower-right corner
(inclusive).  The viewport may be disabled, so RIPscrip graphics commands
are ignored, by setting all parameters to zero (0).

Graphics displayed in the viewport is "truncated" at this rectangular
border, meaning if a circle would normally extend outside one of the
borders, it will be chopped, only displaying the portion of the circle
that is contained inside the viewport boundaries.

Coordinates are specified based on a 640x350 pixel resolution, meaning X
can be anywhere from 0 - 639, and Y can be anywhere from 0 - 349. x0 must
be less than x1 and y0 must be less than y1 unless all parameters are set
to zero, indicating that the graphics window is disabled.



RIP_RESET_WINDOWS
-----------------
         Function:  Clear Graphics & Text Windows and reset to full screen
            Level:  0
          Command:  *
        Arguments:  <none>
           Format:  !|*
          Example:  !|*
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command will set the Text Window to a full 80x43 EGA hi-res text
mode, place the cursor in the upper left corner, clear the screen, and
zoom the Graphics Window to full 640x350 EGA screen.  Both windows are
filled with the current graphics background color.  Also, all Mouse
Regions are deleted and the Clipboard is erased.  A system might use this
function before entering a text only mode that does not support RIP
commands.  This command will also restore the default 16-color RIP
palette (see RIP_SET_PALETTE below).



RIP_ERASE_WINDOW
----------------
         Function:  Clears the Text Window to the current background color
            Level:  0
          Command:  e
        Arguments:  <none>
           Format:  !|e
          Example:  !|e
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This clears the TTY text window to the current graphics background color
and positions the cursor in the upper-left corner of the window.  If the
text window is inactive, then this command is ignored.  If the text and
graphics windows overlap, then this command will clear the overlapping
portion also.



RIP_ERASE_VIEW
--------------
         Function:  Clear Graphics Window to current background color
            Level:  0
          Command:  E
        Arguments:  <none>
           Format:  !|E
          Example:  !|E
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command clears the Graphics Viewport to the current graphics
background color.  If the graphics viewport is not active (if the
boundaries are 0,0,0,0), then this command is ignored.  If the text and
graphics windows overlap, then this command will clear the overlapping
portion also.



RIP_GOTOXY
----------
         Function:  Move text cursor to row & column in Text Window
            Level:  0
          Command:  g
        Arguments:  x:2, y:2
           Format:  !|g <x> <y>
          Example:  !|g0509
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command sets the position of the text cursor in the TTY Text window,
if it is active.  If inactive (if the dimensions are 0,0,0,0), then this
command is ignored.  This command is equivalent to the ANSI/VT-100
command goto x/y, <Esc>[x;yH, except that the coordinates of that ANSI
command are 1-based and the coordinates of this RIPscrip command are
0-based.



RIP_HOME
--------
         Function:  Move cursor to upper-left corner of Text Window
            Level:  0
          Command:  H
        Arguments:  <none>
           Format:  !|H
          Example:  !|H
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command positions the text cursor to the upper-left corner in the
TTY Text Window, if it is active.



RIP_ERASE_EOL
-------------
         Function:  Erase current text line from the cursor to end of line
            Level:  0
          Command:  >
        Arguments:  <none>
           Format:  !|>
          Example:  !|>
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command will erase the current text line in the TTY text window from
the current cursor location (inclusive) to the end of the line. The
erased region is filled with the current graphics background color.  This
differs from the ANSI command ESC[K which clears the area with the
current ANSI background color.



RIP_COLOR
---------
         Function:  Set the current Drawing Color for graphics primitives
            Level:  0
          Command:  c
        Arguments:  color:2
           Format:  !|c <color>
          Example:  !|cA
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command sets the color for drawing lines, circles, arcs, rectangles,
and other graphics primitives, as well as the color for drawing
graphics-text from the RIP_TEXT class of commands (not from ASCII/ANSI
text).  This command does not affect Fill colors or Fill Patterns (see
below).  It does affect the borders of graphic objects, for example the
border of an ellipse drawn with the RIP_FILLED_OVAL command.  (The
interior of the ellipse would be drawn according to the most recent
RIP_FILL_STYLE command.)

This command chooses one of the colors of the 16-color RIP palette
defined by the RIP_SET_PALETTE.  Here is the default 16-color RIP
palette:

     Value   Color
     -------------------------------------------------------
     00      Black (00 is always the background color)
     01      Blue
     02      Green
     03      Cyan
     04      Red
     05      Magenta
     06      Brown
     07      Light Gray
     08      Dark Gray
     09      Light Blue
     0A      Light Green
     0B      Light Cyan
     0C      Light Red
     0D      Light Magenta
     0E      Yellow
     0F      White



RIP_SET_PALETTE
---------------
         Function:  Set 16-color RIP Palette from master 64-color palette
            Level:  0
          Command:  Q
        Arguments:  c1:2, c2:2, ... c16:2
           Format:  !|Q <c1> <c2> ... <c16>
          Example:  !|Q000102030405060708090A0B0C0D0E0F
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command modifies the 16-color RIP palette by choosing from the 64
colors in the master palette.  This allows you to alter the colors in
your RIPscrip graphics scenes.  Once a Set Palette command is processed,
any colors on the screen that had their corresponding palette entries
changed will instantly switch to the new color set. You may obtain color
cycling effects by using this command.  The default 16-color RIP palette
is restored by the RIP_RESET_WINDOWS command.  The default 16-color RIP
palette is:

    16-Color RIP Palette     Master 64-Color EGA
        Color Code           Palette Color Code       Color
    ---------------------------------------------------------------
           00                     0  (00)             Black
           01                     1  (01)             Blue
           02                     2  (02)             Green
           03                     3  (03)             Cyan
           04                     4  (04)             Red
           05                     5  (05)             Magenta
           06                     7  (06)             Brown
           07                     20 (0K)             Light Gray
           08                     56 (1K)             Dark Gray
           09                     57 (1L)             Light Blue
           0A                     58 (1M)             Light Green
           0B                     59 (1N)             Light Cyan
           0C                     60 (1O)             Light Red
           0D                     61 (1P)             Light Magenta
           0E                     62 (1Q)             Yellow
           0F                     63 (1R)             White

Color 00 of the 16-color RIP palette is always the background color
(which is typically Black, or color 00 of the 64-color EGA palette).



RIP_ONE_PALETTE
---------------
         Function:  Set color of 16-color RIP Palette from Master Palette
            Level:  0
          Command:  a
        Arguments:  color:2 value:2
           Format:  !|a <color> <value>
          Example:  !|a051B
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command changes one color in the 16-color palette.  The color number
is sent along with the new color value from the Master Color Palette. The
color <value> must be in the range of 0-63.  Once a Set One Palette
command is processed, any colors on the screen that correspond to the
<color> number will be changed instantly to the new color value.  You may
obtain color cycling effects by using this command.  The default RIP
palette is restored when by RIP_RESET_WINDOWS.

    16-Color RIP Palette     Master 64-Color EGA
        Color Code           Palette Color Code       Color
    ---------------------------------------------------------------
           00                     0  (00)             Black
           01                     1  (01)             Blue
           02                     2  (02)             Green
           03                     3  (03)             Cyan
           04                     4  (04)             Red
           05                     5  (05)             Magenta
           06                     7  (06)             Brown
           07                     20 (0K)             Light Gray
           08                     56 (1K)             Dark Gray
           09                     57 (1L)             Light Blue
           0A                     58 (1M)             Light Green
           0B                     59 (1N)             Light Cyan
           0C                     60 (1O)             Light Red
           0D                     61 (1P)             Light Magenta
           0E                     62 (1Q)             Yellow
           0F                     63 (1R)             White

Color 00 of the 16-color RIP palette is always the background color
(which is typically Black, or color 00 of the 64-color EGA palette).



RIP_WRITE_MODE
--------------
         Function:  Set drawing mode for graphics primitives
            Level:  0
          Command:  W
        Arguments:  mode:2
           Format:  !|W <mode>
          Example:  !|W00
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command sets the current drawing mode for most of the graphics
primitives:

     Mode   Description
     ------------------------------------------
     00     Normal drawing mode (overwrite)
     01     XOR (complimentary) mode

In normal mode, things are drawn in the current drawing color over top of
whatever is in the graphics viewport.  This is the typical mode of
operation in a GUI environment.

In the XOR mode, instead of changing each pixel to the current drawing
color, the pixel is inverted (black changes to white, red to green,
etc.).  Drawing the same item a second time erases it completely.  This
mode is useful for drawing something temporarily, or for animation.  The
Rubber Band mode of most paint programs uses a mode like this.



RIP_MOVE
--------
         Function:  Move the current drawing position to (X,Y)
            Level:  0
          Command:  m
        Arguments:  x:2, y:2
           Format:  !|m <x> <y>
          Example:  !|m0509
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command moves the current graphics drawing cursor to (x,y).  You
could use this to draw text at a certain point, but you'd probably use
RIP_TEXT_XY instead.  This command is primarily provided for future
development which will make use of its ability to relocate the current
drawing position without physically drawing anything.



RIP_TEXT
--------
         Function:  Draw text in current font/color at current location
            Level:  0
          Command:  T
        Arguments:  text-string
           Format:  !|T <text-string>
          Example:  !|Thello world
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  YES

This command displays text at the current location in the graphics
window, as set with the RIP_MOVE command.  The text is also affected by
the most recent settings of these commands:

     Command            Description of Command
     -----------------------------------------------------------------
     RIP_FONT_STYLE     font style (character set, direction, size)
     RIP_WRITE_MODE     drawing mode (normal or XOR)
     RIP_COLOR          drawing color (from the 16-color RIP palette)

The drawing position is placed at the end of the last character drawn.

The current drawing position is set immediately to the right of the drawn
text.  Subsequent Line, Circle or other such commands will not affect
this position.  This provides a means so that you can quickly do another
RIP_TEXT command (presumably in another color) at a later time and have
the text show up immediately after the previous text.



RIP_TEXT_XY
-----------
         Function:  Draw text in current font/color at specific location
            Level:  0
          Command:  @
        Arguments:  x:2, y:2 and text-string
           Format:  !|@ <x> <y> <text-string>
          Example:  !|@0011hello world
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  YES

This command is an efficient combination of RIP_MOVE and RIP_TEXT. The
text is drawn at the specified location according to the same settings as
apply to RIP_TEXT (see above).

The current drawing position is set immediately to the right of the drawn
text.  Subsequent Line, Circle or other such commands will not affect
this position.  This provides a means so that you can quickly do another
RIP_TEXT command (presumably in another color) at a later time and have
the text show up immediately after the previous text.



RIP_FONT_STYLE
--------------
         Function:  Select the current font style, orientation and size
            Level:  0
          Command:  Y
        Arguments:  font:2, direction:2, size:2, res:2
           Format:  !|Y <font> <direction> <size> <res>
          Example:  !|Y01000400
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  YES

This command sets the font, direction and size for RIP_TEXT commands.

     Font   Description of Font
     ---------------------------------------------
     00     Default 8x8 font            Bit-Mapped
     01     Triplex Font                Scalable
     02     Small Font                  Scalable
     03     Sans Serif Font             Scalable
     04     Gothic [Old English] Font   Scalable
     05     Script Font                 Scalable
     06     Simplex Font                Scalable
     07     Triplex Script Font         Scalable
     08     Complex Font                Scalable
     09     European Font               Scalable
     0A     Bold Font                   Scalable

For the Direction parameter, use 00 to indicate horizontal and 01 for
vertical.

For the Size parameter, use 01 for the normal default size, 02 for x2
magnification, 03 for x3 magnification, ... , and 0A for x10
magnification.

NOTE:  The Default font is bit-mapped and looks best when drawn in
       size 1.  In sizes greater than one, the individual pixels are
       enlarged, giving a jagged look.  This may not be the desired
       effect.  The fonts 1 - 4 are smooth scalable vector fonts.



RIP_PIXEL
---------
         Function:  Draws a one pixel using current drawing color
            Level:  0
          Command:  X
        Arguments:  x:2, y:2
           Format:  !|X <x> <y>
          Example:  !|X1122
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command will draw a single pixel in the current drawing color at the
given (x,y) graphics position.  This command is included for
completeness, but in practice it would be extremely inefficient to make
much use of it.



RIP_LINE
--------
         Function:  Draw a line in the current color/line style
            Level:  0
          Command:  L
        Arguments:  x0:2, y0:2, x1:2, y1:2
           Format:  !|L <x0> <y0> <x1> <y1>
          Example:  !|L00010A0E
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command will draw a line in the current drawing color, using the
current line style, pattern and thickness.  The line is drawn from (x0,y0)
to (x1,y1) in the graphics viewport.



RIP_RECTANGLE
-------------
         Function:  Draw a rectangle in current color/line style
            Level:  0
          Command:  R
        Arguments:  x0:2, y0:2, x1:2, y1:2
           Format:  !|R <x0> <y0> <x1> <y1>
          Example:  !|R00010A0E
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command draws a rectangle in the current drawing color, using the
current line style, pattern and thickness.  (x0,y0) and (x1,y1) are any
two opposing corners of the rectangle.  If x0=x1 or y0=y1 then the
command will draw a single vertical or horizontal line.  The rectangle
interior is not filled by RIP_RECTANGLE.



RIP_BAR
-------
         Function:  Draw solid, filled rectangle with fill color/pattern
            Level:  0
          Command:  B
        Arguments:  x0:2, y0:2, x1:2, y1:2
           Format:  !|B <x0> <y0> <x1> <y1>
          Example:  !|B00010A0E
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command fills a rectangular region with the current fill color and
pattern.  No border is drawn.



RIP_CIRCLE
----------
         Function:  Draw a circle in the current color and line thickness
            Level:  0
          Command:  C
        Arguments:  x_center:2, y_center:2, radius:2
           Format:  !|C <x_center> <y_center> <radius>
          Example:  !|C1E180M
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws a circle in the current drawing color and line
thickness.  The <radius> is in pixel units.  This command understands
aspect ratios and will draw a truly circular circle instead of an oblong
circle (ellipse) like on other graphics systems.  The aspect ratio is
currently based on the EGA 640x350 resolution and is understood by both
the GUI designer and the Terminal Program.

NOTE:  This command uses the line thickness setting, but not the line
       patterns.  In other words, you can draw a circle with a thick
       or a thin border, but not a dashed or dotted border.



RIP_OVAL
--------
         Function:  Draw elliptical arc in the current color/line style
            Level:  0
          Command:  O
        Arguments:  x:2, y:2, st_ang:2, end_ang:2, x_rad:2, y_rad:2
           Format:  !|O <x> <y> <st_ang> <end_ang> <x_rad> <y_rad>
          Example:  1E1A18003G150Z
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws an elliptical arc similar to the circular RIP_ARC
command.  The center of the ellipse is (x,y) and the arc is drawn
starting from <st_ang> and proceeding counterclockwise to <end_ang> (see
RIP_ARC above for details).

The X radius is half the full width of the ellipse, the Y radius is half
the full height.  The ellipse is drawn according to the current line
thickness, but the current line pattern has no effect.



RIP_FILLED_OVAL
---------------
         Function:  Draw filled ellipse using current color/fill pattern
            Level:  0
          Command:  o
        Arguments:  x_center:2, y_center:2, x_rad:2, y_rad:2
           Format:  !|o <x_center> <y_center> <x_rad> <y_rad>
          Example:  !|o1G2B0M0G
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws a complete filled ellipse on the screen.  The interior
of the ellipse is drawn using the current fill pattern and fill color.
The outline of the ellipse is drawn using the current drawing color and
line thickness.



RIP_ARC
-------
         Function:  Draw circular arc in current color/line thickness
            Level:  0
          Command:  A
        Arguments:  x:2, y:2, start_ang:2, end_ang:2, radius:2
           Format:  !|A <x> <y> <start_ang> <end_ang> <radius>
          Example:  !|A1E18003G15
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws a circular arc, or a segment of a circle.  Drawing
begins at <start_ang> and terminates at <end_ang>.  The angles are
represented starting at zero for the 3 o'clock position and increasing
counterclockwise through a full circle to 360:

The arc drawing begins at the <start_angle> and continues counter-
clockwise to the <end_angle>.  A full circle will be displayed if
<start_ang>=0 and <end_ang>=360.  This command recognizes aspect ratios
like the circle command does.  It does not take advantage of line
patterns but does comply with line thickness.

If both angles are equal, nothing is drawn.



RIP_OVAL_ARC
------------
         Function:  Draw an elliptical arc
            Level:  0
          Command:  V
        Arguments:  x:2, y:2, st_ang:2, e_ang:2, radx:2 rady:2
           Format:  !|V <x> <y> <st_ang> <e_ang> <radx> <rady>
          Example:  !|V1E18003G151Q
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws an elliptical arc, or a segment of an ellipse. Drawing
begins at <st_ang> and terminates at <e_ang>.  The angles are represented
starting at zero for 3 o'clock position and increasing counterclockwise
through a full ellipse at 360 degrees:

The arc drawing begins at the <st_ang> and continues counterclockwise to
the <e_ang>.  A complete ellipse will be displayed if <st_ang>=0 and
<e_ang>=360.  This command does not utilize "aspect ratios" because of
the nature of an Ellipse.  It does not take advantage of line patterns
but does comply with line thickness.



RIP_PIE_SLICE
-------------
         Function:  Draws a circular pie slice
            Level:  0
          Command:  I
        Arguments:  x:2, y:2, start_ang:2, end_ang:2, radius:2
           Format:  !|I <x> <y> <start_ang> <end_ang> <radius>
          Example:  !|I1E18003G15
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws a "pie slice".  The slice is circular.  It obeys all of
the same commands as the Arc command described above.  The ends of the
arc are connected to the Center-Point of the Arc with two straight
lines.  These two lines converge at the Center-Point.  The interior of
the Slice is filled with the current Fill Color and Pattern.  The
exterior (outline) of the Slice is drawn using the current drawing color
and line thickness.  The Line Pattern feature does not apply to this
command.



RIP_OVAL_PIE_SLICE
------------------
         Function:  Draws an elliptical pie slice
            Level:  0
          Command:  i
        Arguments:  x:2, y:2, st_ang:2, e_ang:2, radx:2 rady:2
           Format:  !|i <x> <y> <st_ang> <e_ang> <radx> <rady>
          Example:  !|i1E18003G151Q
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  YES
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command draws an  "elliptical pie slice".  It obeys all of the same
commands as the Elliptical Arc command described above.  The ends of the
arc are connected to the Center-Point of the Arc with two straight lines.
These two lines converge at the Center-Point.  The interior of the Slice
is filled with the current Fill Color and Pattern.  The exterior
(outline) of the Slice is drawn using the current drawing color and line
thickness.  The Line Pattern feature does not apply to this command.



RIP_BEZIER
----------
         Function:  Draw a bezier curve
            Level:  0
          Command:  Z
        Arguments:  x1:2 y1:2 x2:2 y2:2 x3:2 y3:2 x4:2 y4:2 cnt:2
           Format:  !|Z <x1> <y1> <x2> <y2> <x3> <y3> <x4> <y4> <cnt>
          Example:  !|Z0A0B0C0D0E0F0G0H1G
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command provides customizable curves.  Four control points are used
to create the shape of the curve.  The curves beginning point is at point
(x1,y1) and it ends at (x4,y4).  Points (x2,y2) and (x3,y3) are not
necessarily on the curve, but are used to pull the curve in their
direction.  The diagram below indicates how points 2 and 3 can be
utilized to form the desired curve.  Note that points 2 and 3 are not
actually on the curve, but points 1 and 4 are.

NOTE: Points 2 and 3 are not actually on the curve - points 1 and 4 are.

The last parameter of this command is the <cnt> parameter.  This
determines how many "segments" the curve should be drawn in.  Each
segment is in fact, a straight line.  The more segments you allow, the
smoother the curve may be.  If a curve does not have a significant amount
of "curviness" then a low "count" can improve performance of the curve
drawing.  Bezier Curves use "floating point" math internally for its
processing.  All parameters specified for this command are simple
integers however.



RIP_POLYGON
-----------
         Function:  Draw a polygon in the current color, line style, thickness
            Level:  0
          Command:  P
        Arguments:  npoints:2, x1:2, y1:2, ... xn:2, yn:2
           Format:  !|P <npoints> <x1> <y1> ... <xn> <yn>
          Example:  !|P03010105090905
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command will draw a multi-sided closed polygon.  The polygon is
drawn using the current drawing color, line pattern and thickness. The
<npoints> parameter is between 2 and 512 and indicates how many (x,y)
coordinate pairs will follow, which is also the number of sides of the
polygon.  The polygon interior is not filled by RIP_POLYGON.

The polygon is enclosed by the last vertex between xn,yn and x1,y1. In
other words, you do not have to connect the end to the beginning - it is
automatically done for you.



RIP_FILL_POLYGON
----------------
         Function:  Draw a filled polygon using drawing color & fill settings
            Level:  0
          Command:  p
        Arguments:  npoints:2, x1:2, y1:2, ... xn:2, yn:2
           Format:  !|p <npoints> <x1> <y1> ... <xn> <yn>
          Example:  !|p03010105050909
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  YES
  Uses Font Sizes:  NO

This command is identical to RIP_POLYGON, except that the interior of the
polygon is filled with the current fill color and fill pattern. The actual
outline of the polygon is drawn using the current drawing color, line
pattern and thickness.

NOTE:  You will get unusual effects if the lines of the polygon overlap,
       creating a polygon with internal "gaps".  (The rule is this:
       regions that are "inside" the polygon an even number of times
       due to overlap are NOT filled.)  The interior fill does not utilize
       Write Mode, but the outline of the polygon does.



RIP_FILL
--------
         Function:  Flood fill screen area with the current fill settings
            Level:  0
          Command:  F
        Arguments:  x:2, y:2, border:2
           Format:  !|F <x> <y> <border>
          Example:  !|F25090F
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command performs a "flood fill" emanating from the given <x,y>
point.  The fill "oozes" in all directions up to <border> color, but the
border itself is not changed.  Whatever is inside the border that's not
the border color gets changed to the current fill color and fill
pattern.  If the border color does not completely enclose the <x,y>
point, the fill will continue to the edges of the viewport.



RIP_LINE_STYLE
--------------
         Function:  Defines a line style and thickness
            Level:  0
          Command:  =
        Arguments:  style:2, user_pat:4, thick:2
           Format:  !|= <style> <user_pat> <thick>
          Example:  !|=01000001
  Uses Draw Color:  NO
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command establishes the current line pattern and thickness for many
subsequent graphics primitive commands.  There are four built-in line
styles plus provisions for custom line patterns.

     Style   Description
     --------------------------------------------------------
     00      Normal, Solid Line
     01      Dotted Line
     02      Centered Line
     03      Dashed Line
     04      Custom Defined line (see about <user_pat> below)

     Thick   Description
     -------------------------------
     01      Lines are 1 pixel wide
     03      Lines are 3 pixels wide

If the <style> is set to a value of 4 (custom pattern), then the
<user_pat> parameter is used as a 16-bit representation of the pixels in
the line pattern.  For example:

Repeating Pattern     Binary Coding     Hex     Decimal   MegaNum
-------------------------------------------------------------------
 - - - - - - - -    1010101010101010    AAAA     43690     0XPM
 ----    ----       1111000011110000    F0F0     61680     1BLC

So, the most-significant-bit of <user_pat> is toward the starting point of
the line or border that uses this fill pattern.  If the <style> parameter
is not 4, then the <user_pat> parameter is ignored.



RIP_FILL_STYLE
--------------
         Function:  Set current fill style (predefined) and fill color
            Level:  0
          Command:  S
        Arguments:  pattern:2, color:2
           Format:  !|S <pattern> <color>
          Example:  !|S050F
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command defines the current fill pattern and fill color for use in
subsequent graphics fill operations.  There are twelve (12) predefined
fill patterns.  They are:

    Pattern  Description                 Example       Misc
    -----------------------------------------------------------------
      00     Fill with background color                (color #0)
      01     Solid Fill                                (fill color)
      02     Line Fill                   -----------   (thick lines)
      03     Light Slash Fill            /  /  /  /    (thin lines)
      04     Normal Slash Fill           // // // //   (thick lines)
      05     Normal Backslash Fill       \\ \\ \\ \\   (thick lines)
      06     Light Backslash Fill        \  \  \  \    (thin lines)
      07     Light Hatch Fill            ###########   (thin lines)
      08     Heavy Cross Hatch Fill      XXXXXXXXXXX   (thin lines)
      09     Interleaving Line Fill      +-+-+-+-+-+   (thin lines)
      0A     Widely spaced dot fill      . : . : . :   (pixels only)
      0B     Closely spaced dot fill     :::::::::::   (pixels only)

The <color> parameter is the fill color for subsequent fill commands. The
"active" pixels of the pattern become this color.  The "inactive" pixels
become the current background color (color 00, typically black).  Fill
pattern 00 will set the entire fill area to the background color.  (In
this special case, the fill color doesn't matter.)



RIP_FILL_PATTERN
----------------
         Function:  Set user-definable (custom) fill pattern/color
            Level:  0
          Command:  s
        Arguments:  c1:2 c2:2 c3:2 c4:2 c5:2 c6:2 c7:2 c8:2 color:2
           Format:  !|s <c1> <c2> <c3> <c4> <c5> <c6> <c7> <c8> <color>
          Example:  !|s11223344556677880F
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command allows you to specify a user-defined, custom Fill Pattern.
This pattern supersedes the predefined patterns of RIP_FILL_STYLE.  A
custom fill pattern is an 8x8 pixel array defining which pixels should be
drawn in the current fill color (as set by the <color> parameter here).
The other pixels in the fill area are set to the current background color
(color 00, typically black).

Each of the eight parameters of this command, <c1> through <c8> represent
bit-patterns for a line of the 8x8 pixel array.  Each line is comprised of
8 pixels.  The value of each parameter is the binary representation of
these 8 pixels as follows:

     Bit     7     6    5    4   3   2   1   0
     ----------------------------------------------
     c1     128   64   32   16   8   4   2   1
     c2     128   64   32   16   8   4   2   1
     c3     128   64   32   16   8   4   2   1
     c4     128   64   32   16   8   4   2   1
     c5     128   64   32   16   8   4   2   1
     c6     128   64   32   16   8   4   2   1
     c7     128   64   32   16   8   4   2   1
     c8     128   64   32   16   8   4   2   1

So, c1 is the top, and the most-significant bit is to the left.

NOTE:  The RIP_FILL_STYLE (predefined fill patterns) and this
       RIP_FILL_PATTERN (custom fill patterns) completely override
       each other's effects.



RIP_MOUSE
---------
         Function:  Defines a rectangular hot mouse region
            Level:  1
          Command:  M
        Arguments:  num:2 x0:2 y0:2 x1:2 y1:2 clk:1 clr:1 res:5 text
           Format:  !|1M <num> <x0><y0> <x1><y1> <clk><clr><res> <text>
          Example:  !|1M00001122331100000host command^M
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command ties together three things:

     A region on the screen
     A mouse-click event
     A string of text to be transmitted by the terminal.

This command defines a rectangular region on the screen that functions as
a "hot" mouse area.  If the user clicks the [left] mouse button while
pointing inside the region, then the terminal must transmit the <text>
string to the Host.  The (x0,y0) parameter MUST be the upper-left corner,
and (x1,y1) MUST be the lower-right corner of the region.

The <clk> parameter, if 1, indicates that the region should be visibly
inverted while the mouse button is down.  This offers visual feedback. If
<clk> is 0, the region will not be inverted while clicked.

The <clr> parameter, if 1, will physically zoom the text window to full
screen size and clear the screen.  This is useful if the <text> parameter
instructs the host to enter an area of the System that doesn't support
RIPscrip graphics.

The <text> parameter is a Host command that gets sent when the field is
clicked.  You may use a caret (^) to represent control characters, (e.g.,
^M for carriage return, ^G, ^C, etc.).

NOTE:  You are limited to a maximum of 128 Mouse Regions.  In addition,
       the 5-byte <res> parameter is RESERVED FOR FUTURE USE, and should
       be set to zeros (00000).



RIP_KILL_MOUSE_FIELDS
---------------------
         Function:  Destroys all previously defined hot mouse regions
            Level:  1
          Command:  K
        Arguments:  <none>
           Format:  !|1K
          Example:  !|1K
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command will "forget" all Mouse Regions.  Use it at the beginning of
each Scene, so that one scene's Mouse Regions don't get used in another.



RIP_BEGIN_TEXT
--------------
         Function:  Define a rectangular text region
            Level:  1
          Command:  T
        Arguments:  x1:2, y1:2, x2:2, y2:2, res:2
           Format:  !|1T <x1> <y1> <x2> <y2> <res>
          Example:  !|1T00110011
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command defines a rectangular portion of the graphics viewport that
is to display text, usually a long stream of text.  Following this
command should be a number of RIP_REGION_TEXT commands with the text to
be displayed.  The RIP_END_TEXT terminates this stream of text, something
like this:

RIP_BEGIN_TEXT
     RIP_REGION_TEXT
     RIP_REGION_TEXT
     RIP_REGION_TEXT
     :
     RIP_REGION_TEXT
RIP_END_TEXT

There must be at least one RIP_REGION_TEXT command in between the header
and the footer.  There may be as many as needed.

These commands ignore the current font "direction"; all text is always
displayed horizontally.

NOTE:  The "res" parameter is two bytes wide and is RESERVED for
       future use.



RIP_REGION_TEXT
---------------
         Function:  Display a line of text in the rectangular text region
            Level:  1
          Command:  t
        Arguments:  justify:1 and text-string
           Format:  !|1t <justify> <text-string>
          Example:  !|1t1This is a text line to be justified
  Uses Draw Color:  YES
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  YES
  Uses Font Sizes:  YES

A number of these commands may come sandwiched between the RIP_BEGIN_TEXT
and RIP_END_TEXT commands.  The <text-string> is already word-wrapped in
such a way that it will fit inside the rectangular region based on the
current font, font size, and drawing color.

There are two possible settings for the <justify> parameter:

  Justify   Description
  --------------------------------------------------------------------
    0       Don't right/left justify.  Left-justify only
    1       Perform right/left margin justification of this line of text
            except for the last line of a paragraph and sets of indented
            lines.

If a text line falls off the bottom of the region, it is discarded -- the
rectangular Text Region does not scroll.


RIP_END_TEXT
------------
         Function:  End a rectangular text region
            Level:  1
          Command:  E
        Arguments:  <none>
           Format:  !|1E
          Example:  !|1E
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command indicates the end of a formatted text block.  Only one of
these "end" commands is necessary for each block.



RIP_GET_IMAGE
-------------
         Function:  Copy rectangular screen image to clipboard (as icon)
            Level:  1
          Command:  C
        Arguments:  x0:2, y0:2, x1:2, y1:2, res:1
           Format:  !|1C <x0> <y0> <x1> <y1> <res>
          Example:  !|1C001122330
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command instructs the terminal program to copy the rectangular
region defined by (x0,y0) to (x1,y1) onto an internal Clipboard for
future use.  This combined with the Paste Clipboard command can provide
an extremely powerful and efficient mechanism to avoid baud-rate
bandwidth limitations.  The (x0,y0) parameter MUST specify the upper-left
corner of the region and the (x1,y1) parameter MUST specify the
lower-right corner.  If the indicated coordinates are in anyway invalid,
the command is ignored.  The Clipboard is completely overwritten by this
command (the previous contents are lost).

NOTE:  The <res> parameter is RESERVED FOR FUTURE USE and
       should be set to zero.



RIP_PUT_IMAGE
-------------
         Function:  Pastes the clipboard (icon) contents onto the screen
            Level:  1
          Command:  P
        Arguments:  x:2, y:2, mode:2, res:1
           Format:  !|1P <x> <y> <mode> <res>
          Example:  !|1P0011010
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command takes the contents of the Clipboard (if any) and pastes the
image onto the screen starting at the upper-left corner of the image of
(x,y).  If the right edge of the image would go off-screen, the paste
command is ignored.  The Height and Width of the clipboard image is
recorded on the Clipboard, so this command doesn't need to supply it.

The <mode> parameter defines "how" the image will be pasted on the
screen:

  Mode   Description                                          Logical
  -------------------------------------------------------------------
   00    Paste the image on-screen normally                   (COPY)
   01    Exclusive-OR  image with the one already on screen   (XOR)
   02    Logically OR  image with the one already on screen   (OR)
   03    Logically AND image with the one already on screen   (AND)
   04    Paste the inverse of the image on the screen         (NOT)

NOTE:  The 1-byte <res> parameter is RESERVED FOR FUTURE USE
       and should be set to zero.



RIP_WRITE_ICON
--------------
         Function:  Write contents of the clipboard (icon) to disk
            Level:  1
          Command:  W
        Arguments:  res:1, filename
           Format:  !|1W <res> <filename>
          Example:  !|1W0filename.icn
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command takes the contents of the Clipboard and writes it to a disk
file.  This Icon file can be loaded later with a RIP_LOAD_ICON command
and stamped on the screen.

The command instructs the terminal to store an Icon on the terminal's
disk drive, or on some appropriate storage media.  Path or sub-directory
information is not allowed in the filename portion of the command.  If
the clipboard is nonexistent (i.e., at the beginning of a scene), this
command is ignored.  If an Icon by the same name already exists on disk,
it is overwritten.

NOTE:  The <res> parameter is RESERVED FOR FUTURE USE and
       should be set to zero.



RIP_LOAD_ICON
-------------
         Function:  Loads and displays a disk-based icon to the screen
            Level:  1
          Command:  I
        Arguments:  x:2, y:2, mode:2, clipboard:1, res:2, filename
           Format:  !|1I <x> <y> <mode> <clipboard> <res> <filename>
          Example:  !|1I001101010button.icn
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command instructs the terminal to read an Icon from disk and display
it at the given upper-left (x,y) location.  If the width or height of the
Icon would make it go off the right or left edge of the screen, the Icon
will not be displayed.  The <mode> parameter defines the modes in which
the Icon will be displayed on the screen.  The modes are identical to the
RIP_PUT_IMAGE command, and are as follows:

The .ICN file extension does not need to be included as part of the
filename.  If omitted, it will automatically be appended to the
filename.  If an extension is provided, it will be used verbatim.

  Mode   Description                                         Logical
  ------------------------------------------------------------------
   00    Paste the image on-screen normally                   (COPY)
   01    Exclusive-OR  image with the one already on screen   (XOR)
   02    Logically OR  image with the one already on screen   (OR)
   03    Logically AND image with the one already on screen   (AND)
   04    Paste the inverse of the image on the screen         (NOT)

If the <clipboard> parameter is 1, then the image pasted on screen AND
also copied onto the Clipboard.  If 0, it is simply pasted on the screen.

The <filename> parameter must not contain any sub-directory or path
information and must specify a valid Icon file name.  If the Icon cannot
be located or an error occurs on the disk, then a box should be displayed
on screen indicating that the given Icon File could not be loaded.  This
visual prompt indicates that something is amiss to the end-user.

NOTE:  The 2-byte <res> parameter is RESERVED FOR THE FUTURE
       and unlike many other previously mentioned reserved
       parameters, should be set to "10".



RIP_BUTTON_STYLE
----------------
         Function:  Button style definition
            Level:  1
          Command:  B
        Arguments:  wid:2 hgt:2 orient:2 flags:4 size:2
                    dfore:2 dback:2 bright:2 dark:2 surface:2
                    grp_no:2 flags2:2 uline_col:2 corner_col:2
                    res:6
           Format:  !|1B <wid> <hgt> <orient> <flags>
                    <bevsize> <dfore> <dback> <bright> <dark>
                    <surface> <grp_no> <flags2> <uline_col>
                    <corner_col> <res>
          Example:  !|1B0A0A010274030F080F080700010E07000000
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This RIPscrip command is probably one of the most complex in the entire
protocol.  It defines how subsequent RIP_BUTTON commands will be
interpreted.  The purpose of this command is to define what a  Button is
and how they operate.  Buttons can have many different configurations,
flags, and styles.  With the diversity of modes that the Button can take
on, complexity is a necessary evil.

This command does not actually do anything visibly on the screen.  Simply
put, this creates an internal definition for the Button mode which will
be used with RIP_BUTTON commands after the definition is  created.

Every Button can have an optional text label.  It can appear in several
different locations compared to the Button itself.  This is specified in
the <orient> parameter.  The actual text of the label is not specified
with this command, it is specified when you actually create a Button (see
RIP_BUTTON below).  The value that <orient> can be is as follows:

        Value   Description of Orientation
        -------------------------------------------------
         00     Display label above button
         01     Display label to the left of button
         02     Display label in the center of the button
         03     Display label to the right of button
         04     Display label beneath the button

The <hgt> and <wid> parameters represent the fixed height and width of
the Button (applies only to Plain Buttons).  If both values are greater
than zero, then this will represent the actual size of the Button (its
dimensions are not specified by the RIP_BUTTON command).  If both of
these are set to zero, then the actual RIP_BUTTON command will specify
the size of the particular Button (dynamic sizing).

The <bevsize> parameter is only used if the Bevel flag is specified.
When active, this parameter will determine how many pixels thick the
bevel should be.  This may be any value greater or equal to zero.

There are a large number of flag values that can be combined to achieve a
great many effects.  There are two flag parameters for the
RIP_BUTTON_STYLE command, <flags> and <flags2>.  They are detailed in the
two tables that follow in this Section.  You may combine any of the flags
in the first table together simply by adding the "Value" of each one
together and representing that number as a MegaNum.  See the Section in
this manual for a "Table of MegaNums".

The <dfore> and <dback> parameters are used with the text label.  The
<dfore> parameter is the foreground color for the text.  It is always used
to determine the color of the text label.  The <dback> color is the color
of the dropshadow (if any).  This parameter is only used when you have
specified the "Dropshadow" flag in the <flags> parameter (see below).

The <bright>, <dark> and <surface> parameters are used with Plain Buttons
and with the Special Effects styles (see <flags> below).  These colors
represent the highlighted color, the shadowed color, and the regular
surface color that is used in Special Effects.  Typical color
combinations for these colors might be White, Dark-Gray and Light-Gray
respectively for a "chiseled steel" appearance.  Each of these values can
contain a two-digit value representing any valid color code that may be
used in the RIP_COLOR command.

In addition to the special effects colors, are two additional colors that
can be used, <uline_color> which is used for the color of the underline
(in the text label), and <corner_color> which is used to  display the
colors of corners for things like the Bevel, Recess, etc.

The <grp_no> parameter determines which Button Group subsequent
RIP_BUTTON commands will be associated with.  Button Groups are used to
maintain groups of Buttons for things like Radio Buttons and/or  Checkbox
Buttons.  See the section on the BUTTON COMMAND for more information on
these modes, and what Button Groups can offer.  This value can range
anywhere from 0-Z (i.e., 0-35).  You should not mix Checkbox and Radio
buttons in the same group. -- unpredictable things may happen if you do.

Some <flags> are mutually exclusive.  For example, you can only have one
of the "Plain", "Icon", or "Clipboard" flags chosen at once.  To better
assist you in determining which values can be combined with  each other,
the right-most five columns in the next two tables explain if the
specific flag can be used under a specific condition.  For example, you
cannot choose the "Hot Icon" flag if you are dealing with a Clipboard
Button.  Another example is that you cannot underline the hotkey
character in the label if it is not a Mouse Button.

The following table contains the possible flag values for the <flags>
parameter.  Each of these values may be combined to achieve a "composite"
group of flags.  See the preceding paragraphs for a more detailed
explanation of this method.

Value  Description of Flags Field #1     Icon Clip  Plain Mouse No-Mouse
------------------------------------------------------------------------
    1  Button is a "Clipboard Button"     N     Y     N     Y     Y
    2  Button is "Invertable"             Y     Y     Y     Y     N
    4  Reset screen after button click    Y     Y     Y     Y     N
    8  Display Chisel special effect      Y     Y     Y     Y     Y
   16  Display Recessed special effect    Y     Y     Y     Y     Y
   32  Dropshadow the label (if any)      Y     Y     Y     Y     Y
   64  Auto-stamp image onto Clipboard    Y     Y     Y     Y     Y
  128  Button is an "Icon Button"         Y     N     N     Y     Y
  256  Button is a "Plain Button"         N     N     Y     Y     Y
  512  Display Bevel special effect       Y     Y     Y     Y     Y
 1024  Button is a Mouse Button           Y     Y     Y     Y     N
 2048  Underline hot-key in label         Y     Y     Y     Y     N
 4096  Make Icon Button use Hot Icons     Y     N     N     Y     N
 8192  Adjust vertical centering of label Y     Y     Y     Y     Y
16384  Button belongs to a Radio Group    Y     Y     Y     Y     N
32768  Display Sunken special effect      Y     Y     Y     Y     Y

This array defines which characters have descenders (portions of their
font that go below the baseline).  This information is used in the
vertical centering of button text labels.

char low_char[256] =
{
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
    1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
    0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
};

struct METRIC
{
    unsigned char top;    // Scan lines from TOP OF CELL to top of char
    unsigned char bow;    // Scan lines from TOC to crest of char
    unsigned char base;   // Scan lines from TOC to baseline
    unsigned char drop;   // Scan lines from TOC to lowermost pixel
};

The METRIC structure can be described visually as follows:

                      0 --+----------+----------+
                          |          |          |
                     TOP__|__________|__________|
                          | #        |          |
                          | #        |          |
                          | #        |          |
                     BOW__|_#________|___   _ __|
                          | # ###    |   ### #  |
                          | ##   #   |  #   ##  |
                          | #     #  | #     #  |
                          | #     #  | #     #  |
                          | #     #  | #     #  |
                          | #     #  |  #   ##  |
                    BASE__|_#_____#__|___###_#__|
                          |          |       #  |
                          |          |       #  |
                          |          |       #  |
                          |          |  #   #   |
                    DROP__|__________|___###____|
                          |          |          |
                    END --+----------+----------+
                    
Notice that the topmost scan line of a font cell is not necessarily the
top of the character.  The top field of the structure contains the
vertical offset from the top of the cell for all fonts in that set.


    Default Font (Font 0)               Triplex Font (Font 1)

Size  Top    Bow   Base   Drop     Size   Top   Bow     Base   Drop
------------------------------     --------------------------------
  1    0      2      6      7        1     6     10      18     22
  2    0      4     13     15        2     6     11      20     24
  3    0      6     20     23        3     8     13      23     28
  4    0      8     27     31        4     10    17      31     38
  5    0     10     34     39        5     13    23      41     50
  6    0     12     41     47        6     16    28      51     62
  7    0     14     48     55        7     20    34      62     76
  8    0     16     55     63        8     25    42      77     94
  9    0     18     62     71        9     30    51      93    114
 10    0     20     69     79       10     40    67     124    152


    Small Font (Font 2)                 Sans Serif Font (Font 3)

Size  Top    Bow   Base   Drop     Size   Top   Bow     Base   Drop
------------------------------     --------------------------------
  1    2      3      5      6        1      7    11      19     23
  2    2      4      6      7        2      7    12      21     25
  3    2      3      6      7        3      9    14      24     29
  4    3      5      9     11        4     11    18      32     39
  5    4      7     12     14        5     14    24      42     51
  6    5      9     15     18        6     18    30      53     64
  7    6     10     13     22        7     22    36      64     78
  8    7     12     22     27        8     28    45      80     97
  9    9     15     27     33        9     33    54      96    117
 10   12     20     36     44       10     74   102     158    186



     Gothic Font (Font 4)                Script Font (Font 5)

Size  Top    Bow   Base   Drop     Size   Top   Bow     Base   Drop
------------------------------     --------------------------------
  1    7     11     19     23        1     10    17      22     29
  2    7     12     21     25        2     10    18      24     32
  3    9     14     24     29        3     12    21      27     36
  4   11     18     32     39        4     16    28      37     49
  5   14     24     42     51        5     21    37      49     65
  6   18     30     53     64        6     26    46      61     80
  7   22     36     64     78        7     32    56      74     98
  8   28     45     80     97        8     40    70      92    122
  9   33     54     96    117        9     48    84     111    147
 10   44     72    128    156       10     63   111     147    195



    Simplex Font (Font 6)            Triplex Script Font (Font 7)

Size  Top    Bow   Base   Drop     Size   Top   Bow     Base   Drop
------------------------------     --------------------------------
  1    9     13     21     25        1      5     9      17     21
  2    9     14     23     27        2      5    10      19     23
  3   11     16     26     31        3      7    12      22     27
  4   14     21     35     42        4      9    16      30     37
  5   18     28     46     56        5     12    22      40     49
  6   23     35     58     69        6     15    27      50     61
  7   28     42     70     84        7     19    33      61     75
  8   35     52     87    104        8     24    41      77     93
  9   42     63    105    126        9     29    50      92    113
 10   56     84    140    168       10     39    67     123    151



    Complex Font (Font 8)               European Font (Font 9)

Size  Top    Bow   Base   Drop     Size   Top   Bow     Base   Drop
------------------------------     --------------------------------
  1    8     12     20     24        1      7    14      32     38
  2    8     13     22     26        2      7    15      35     41
  3   10     15     25     30        3      9    18      40     47
  4   13     20     34     41        4     12    24      54     64
  5   17     27     45     54        5     16    32      72     85
  6   22     34     57     68        6     20    40      96    106
  7   27     41     69     83        7     25    49     109    129
  8   34     51     86    103        8     31    61     136    161
  9   41     62    104    125        9     38    74     164    194
 10   54     83    139    167       10     51    99     219    259



     Bold Font (Font 10)

Size  Top    Bow   Base   Drop
------------------------------
  1   11     17     35     39
  2   13     19     39     43
  3   14     22     44     49
  4   19     29     59     66
  5   27     39     79     88
  6   33     49     99    110
  7   39     59    119    133
  8   49     74    149    166
  9   59     89    179    200
 10   79    199    239    267

The Chisel effect draws a dropshadowed line around the inside of the
button.  How far from the borders of the button are determined by this
table:

        Height of Button     X inset     Y inset
        ----------------------------------------
            0 - 11              1          1
           12 - 24              3          2
           25 - 39              4          3
           40 - 74              6          5
           75 - 149             7          5
          150 - 199             8          6
          200 - 249            10          7
          250 - 299            11          8
          300 -                13          9

This table describes the possible flag settings for the <flags2>
parameter:

Value  Description of Flags Field #2         Icon Clip Plain Mouse No-Mouse
---------------------------------------------------------------------------
  1    Button is in a check box group          Y    Y    Y     Y       N
  2    Highlight hotkey character              Y    Y    Y     Y       N
  4    Explode (zoom out when clicked)         Y    Y    Y     Y       N
  8    Left Justify Label (top/center/bottom)  Y    Y    Y     Y       Y
 16    Right Justify Label (top/center/bottom) Y    Y    Y     Y       Y



RIP_BUTTON
----------
         Function:  Define a Mouse Button
            Level:  1
          Command:  U
        Arguments:  x0:2 y0:2 x1:2 y1:2 hotkey:2 flags:1 res:1
                    ...text
           Format:  !|1U <x0> <y0> <x1> <y1> <hotkey> <flags>
                    <res> <text>
          Example:  !|1U010100003200iconfile<>Label<>HostCmd^m
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  YES

This command physically creates a new Button using the previously
described RIP_BUTTON_STYLE command.  You may have at most 128 different
Mouse Buttons (you may have any number of non-Mouse  Buttons).

The <x0> and <y0> parameters for this command designate the upper-left
corner of the Button.  This (X,Y) location may not be the actual
"absolute" corner position of the Button, as it may be adjusted via the
Special Effects functions that are part of the RIP_BUTTON_STYLE command
(see above).

The <x1> and <y1> parameters are only used for Plain Buttons when you
have not specified a specific Height and Width in the RIP_BUTTON_STYLE
command.  These parameters are used in Dynamically Sized Buttons.  If the
Height and Width in the RIP_BUTTON_STYLE are non-zero, then these two
parameters are set to zero.

The (x0,y0) and (x1,y1) parameters will be modified by the following
values for the different special effects:

  Effect Type   X0 Modifier   Y0 Modifier   X1 Modifier   Y1 Modifier
  -------------------------------------------------------------------
  Bevel         -bevel size   -bevel size   +bevel size   +bevel size
  Recess            -2            -2            +2            +2
  Sunken            0             0             0             0
  Chisel            0             0             0             0

The <hotkey> parameter is only used with Mouse Buttons.  It is the ASCII
code for the keystroke that will activate this Button.  It is represented
as a two-digit MegaNum.  If this character exists in the text label, and
the Underline flag is enabled in the RIP_BUTTON_STYLE, then the character
will be underlined in the label.  Control codes are allowable, and a value
of 255 (decimal) corresponds to "any" key.

The <flags> parameter provides several different functions for each
button.  The possible "combinatorial" flags for this parameter are listed
in the following table.  Note that these values may be combined together
(by adding their values) to arrive at the final flag parameter's value.

        Value  Description
        --------------------------------------------------
          1    Draw button as already selected
          2    Button is "default" when <ENTER> is pressed

Using a flag of 1 means that the Button is already "selected".  By
selected, we mean that it is already clicked and should be initially
drawn as clicked.  This is typically used for Radio Buttons and/or Check
Boxes.  This only affects the image.  The Host Command WILL NOT be
automatically sent to the host when a selected Button is drawn.  If this
parameter is set to 0, then the Button will be drawn in normal,
unselected mode.

The <text> parameter for this command is somewhat different than those
found in previously described RIPscrip commands.  All other RIPscrip
commands only have one text parameter.  This command requires  anywhere
from 0-3 text parameters.  The way RIPscrip accomplishes this is by
separating each block in the <text> parameter with the delimiter "<>".
This text parameter delimiter is not needed before the first text block,
but is necessary between the 1st and 2nd blocks, and the 2nd and 3rd
blocks.  Here is an example of a typical text parameter for this command:

     ICONFILE.ICN<>TEXT LABEL<>HOST COMMAND

The actual syntax of this text parameter is as follows:

     [icon-file][[<>text-label][<>host-command]]

The block described as ICONFILE.ICN is actually the Icon Filename that
will be used for the Button if it is an Icon Button.  If it is not an
Icon Button, then this block will read "<>" all by itself (a "null"
block).

The .ICN file extension does not need to be included as part of the
filename.  If omitted, it will automatically be appended to the
filename.  If an extension is provided, it will be used verbatim.

The "TEXT LABEL" block is actually the text that will be used to
descriptively label the Button.  You may also specify a "null" block for
no label (i.e., "<>").

The final block of the <text> parameter is the Host Command.  This block
contains any text that should be sent to the Host after this Button is
clicked.  This may contain any Control Characters, Pick-List definitions,
Text Variables or Template Definitions.  This block might be "segmented"
into multiple Host Command segments.  See the section entitled HOST
COMMANDS in this Manual for additional information on these Host Command
features.

Not all of the blocks in the <text> parameter need to be specified.  Here
are examples of the valid combinations of text blocks:

  Parameter Example         Description of the Text Parameter
  ---------------------------------------------------------------------
  icon<>label<>host_cmd     Specify all three blocks
    <>label<>host_cmd       2 blocks specified; no icon
      icon<>label<>         2 blocks specified; no host command
       icon<>label          2 blocks specified; no host command
      <><>host_cmd          1 block specified; no icon or label
       <>label<>            1 block specified; no icon or host command
        <>label             1 bloc specified; no icon or host command
       icon<><>             1 block specified; no label or host command
        icon<>              1 block specified; no label or host command
         icon               1 block specified; no label or host command
        <><><>              A blank text parameter; all blocks omitted
         <><>               A blank text parameter; all blocks omitted
          <>                A blank text parameter; all blocks omitted

NOTE:  The <res> parameter is reserved for future use by TeleGrafix
       Communications, Inc..  It should be set to 0 for compatibility
       with future releases.



RIP_DEFINE
----------
         Function:  Define a text variable
            Level:  1
          Command:  D
        Arguments:  flags:3 res:2 ...text
           Format:  !|1D <flags> <res> <text>
          Example:  !|1D00700text_var,60:?question?default data
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command is used to create a text variable on the Client system (i.e.,
the Terminal system).  A text variable is more fully covered in the HOST
COMMANDS section.  Simply put, a text variable is a piece of information
assigned to a 1-12 character identifier that can either be saved to a
local database file (static variables), or to memory (dynamic
variables).  Variable Identifiers can be 1-12 characters in length.  You
may use any alphanumeric character and underscores (_) in the
identifier.  An underscore cannot be the first character, nor can the
first character of an identifier be a number.

The <flags> parameter of this command combines three separate values into
one MegaNum flag that determines how the variable definition will
operate.  Here are the possible flag values:

        Value     Description of Flag
        ---------------------------------------
        001     Save Variable to database
        002     Cannot specify a blank response
        004     Non-interactive query

When a variable is flagged as "Save to Database", it becomes a part of
the Client system's actual configuration.  The value is saved
indefinitely until either changed, or manually erased.  You may choose
not to allow the user to enter a blank response.  This basically requires
them to enter some piece of information for the variable.

The last flag determines whether the definition is interactive or not. An
interactive definition will attempt to define the variable.  If it does
exist, it pops the value up on the screen asking the user to confirm if
the value is correct.  If it does not exist, a similar pop-up box will
appear asking the user to enter some data for the given variable.

In a non-interactive situation, the Client system will check to see if
the variable exists.  If it does, then nothing happens (unless a default
response is specified in this command, whereby the Client's variable is
updated with the new information).  If the value is not defined, then
this definition becomes interactive by default, since the user actually
has to enter something anyway.

The <text> parameter for this command is also segmented in nature, much
like the RIP_BUTTON command is.  An example of a segmented <text>
parameter for the RIP_DEFINE command might be as follows:

          FULL_NAME,30:?What is your full name?John Doe

The actual syntax of the Variable Define text parameter is as follows:

  variable-identifier[,field-width]:[?question-text?][default-value]

There are several different segments in this parameter as you can see.
The first section is the variable- identifier.  Immediately after it is
an optional field-width.  If the field width is omitted, it will default
to a value of  60.  You should limit the values of this width from 1-60.

Immediately following the identifier field-width parameter is a colon (:).
The colon indicates that the variable identifier field is completed and
that the remainder of the text parameter is to contain the question
and/or the default response (if any).  If no question or default response
is provided, the text parameter would read  "TEXT_VAR,width:" with no
additional data.

The question-text is specified by a question mark (?) followed by the
actual text of the question, followed by a trailing question mark.  The
basic format of the question segment is as follows:

                    ?this is a question?

The remainder of the text parameter consists of a default-value for the
variable's contents.  It may be omitted if you wish, to make it so that
the user must enter his/her own value instead of some "canned response".

NOTE:  The <res> parameter is reserved for future use by TeleGrafix
       Communications, Inc..  It should be set to 00 for compatibility
       with future releases.



RIP_QUERY
---------
         Function:  Query the contents of a text variable
            Level:  1
          Command:  <escape>
        Arguments:  mode:1 res:3 ...text
           Format:  !|1<escape> <mode> <res> <text>
          Example:  !|1<escape>0000this is a query $COMMAND$^m
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

NOTE:  <escape> is used to indicate the Escape character (ASCII 27 or ESC).

The Query Text Variable RIPscrip command instructs the terminal to
immediately respond with some piece of information, whether statically
stored (i.e., in a database), stored internally in RAM (dynamic
information), or pre-defined Text Variables.

This command is unique in RIPscrip in the fact that the command character
that is used is NOT a printable character.  We use the escape character
(ASCII 27) to introduce this command as a measure of security.  Since the
query command can query the terminal for some critical (potentially
private) information, you would not want a user to be able to query
another user's terminal for something like his address information, or
something that he wouldn't want to otherwise divulge to unauthorized
people.  Since most hosts do not allow the user to enter an escape
character, this character is ideal for this purpose.  Using escape allows
only the Host (under most circumstances) to be in control of any queries.

NOTE:  This command is very flexible in that you can specify control
       characters, pick-list definitions, Text Variables, and Host
       Command template definitions.  See the section entitled HOST
       COMMANDS for a more detailed explanation of these features.

Whether the information is transmitted instantly or not is dependent on
the <mode> parameter.  The <mode> parameter determines when data queries
are processed.  The possible settings for the <mode> parameter are as
follows:


    Mode     Description
    ----------------------------------------------------------------
     0    Process the query command NOW (upon receipt)
     1    Process when mouse clicked in Graphics Window
     2    Process when mouse clicked in Text Window (any text
          variables that return X or Y mouse coordinates return TEXT
          coordinates, not graphics coordinates in this mode.  These
          coordinates are two-digit values instead of the graphical
          values that are four digits).

Note that modes 1-2 do not return the results of the Query instantly.
They query commands are processed when the user clicks the mouse either
in the text window, or in the graphics window respectively. These
"queries after mouse clicks" are only acted upon if the user is clicking
on something other than a Button or a Mouse Field. To disable these two
special "deferred" query modes, issue the same command with the query
string of $OFF$.  This will disable this mode.  Providing a <text>
parameter of anything other than $OFF$ will produce a revised query
command (active).

Basically put, a Query command will be immediately acted upon by the
Terminal program when received.  The Query command's <text> parameter can
contain any number of Host Command "segments", which can instruct the
terminal "how to" send data to the host, and more specifically, what data
to send to the host.

Some examples of query statements might be any of the following:

                        ^m     Send a carriage return to the BBS now!
  My name is $FULL_NAME$^m     Send text "My name is <insert-name-here>"
                               followed by a  carriage return to the BBS.
                               The <insert-name-here> will be replaced
                               with whatever the variable $FULL_NAME$
                               contains.

See the section entitled HOST COMMANDS for a detailed explanation of Host
Commands, and what you can do with the Query command.

NOTE:  The <res> parameter is reserved for future use by TeleGrafix
       Communications, Inc..  It should be set to 000 for compatibility
       with future releases.



RIP_COPY_REGION
---------------
         Function:  Copy screen region up/down
            Level:  1
          Command:  G
        Arguments:  x0:2 y0:2 x1:2 y1:2 res:2 dest_line:2
           Format:  !|1G <x0> <y0> <x1> <y1> <res> <dest_line>
          Example:  !|1G080G140M0005
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command physically "copies" a rectangular region of the graphics
screen up or down.  The <dest_line> parameter is the Y position that is
the destination scan line to receive the region. The Destination of the
copy can overlap the original region, but cannot be on the same line. You
cannot move the image area left or right at all.  This command is
designated for vertical scrolling of graphical data either up or down.

Due to hardware restrictions, the X0 and X1 parameters must be evenly
divisible by eight (8) (e.g., 0, 8, 16, etc.).  If the X0 and X1
parameters are NOT evenly divisible by eight, then the X0 parameter will
be reduced to the next most eight-pixel boundary, and the X1 parameter
will be increased to the next eight-pixel boundary.  For example, if
X0=14, and X1=38, then X0 would be adjusted DOWN to 8, and X1 would be
adjusted UP to 40.  This is to ensure that the desired graphical region
is scrolled.

The original image area is left on the screen (is not cleared).  So if you
wish to perform some kind of scrolling effect, you will have to clear the
original area yourself.

If the destination region would place the image partially off-screen, then
the entire command is ignored!

NOTE:  The <res> parameter is reserved for future development by
       TeleGrafix.



RIP_READ_SCENE
--------------
         Function:  Playback local .RIP file
            Level:  1
          Command:  R
        Arguments:  res:8 filename...
           Format:  !|1R <res> <filename>
          Example:  !|1R00000000testfile.rip
  Uses Draw Color:  YES
Uses Line Pattern:  YES
  Uses Line Thick:  YES
  Uses Fill Color:  YES
Uses Fill Pattern:  YES
  Uses Write Mode:  YES
  Uses Font Sizes:  YES

This command instructs the remote terminal to playback a local .RIP file.
The current execution of RIPscrip commands will be temporarily suspended
and the contents of the designated RIP file will begin executing.
Regardless of whether or not the current RIPscrip code coming across the
modem is in the middle of a line or not, the RIP playback file will be
assumed to start at the beginning of a line.  Therefore, if a
RIP_READ_SCENE command is located in a .RIP file, it must be the very
last command on the line, followed by a carriage return instead of a
command delimiter (|).  This ensures that the loaded .RIP file will begin
executing properly with the correct delimiters found in the correct
places.

The RIP playback file can alter colors, fonts, or whatever.  Once the
playback of the file is complete, the remaining RIPscrip code that was
temporarily suspended will be resume execution.  Any changes that
appeared in the loaded playback file will remain in effect when the
resumed code is processed.  In other words, if you change a color or a
font in the playback file and leave them changed, they will remain in
effect during the resumed execution.

NOTE:  The <res> parameter is reserved for future development by
       TeleGrafix.  It should be set to "00000000" for compatibility with
       future releases.



RIP_FILE_QUERY
--------------
         Function:  Query existing information on a particular file
            Level:  1
          Command:  F
        Arguments:  mode:2 res:4 filename...
           Format:  !|1F <mode> <res> <filename>
          Example:  !|1F010000testfile.icn
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command queries the existence of a particular file, regardless of
type.  It is intended for host systems to determine if a particular Icon
or RIP file exists on the terminal;s hard disk.

There are a variety of ways you can query for filenames.  The <mode>
parameter determines the command's response.  This command instructs the
terminal to send a response to the host immediately upon execution.

The following table is a listing of the possible values for <mode>:

Mode   Description
-----------------------------------------------------------------------
 00    Simply query the existence of the file.  If it exists, a "1" is
       returned.  Otherwise a "0" is returned to the Host (without a
       carriage return).
 01    Same as 0, except a carriage return is added after the response.
 02    Queries the existence of a file.  If it does not exist, a "0" is
       returned to the Host followed by a carriage return.  If it does
       exist, the returned text is a "1." followed by the file size (in
       decimal).  The return sequence is terminated by a carriage
       return.  An example of the returned text could be "1.20345".
 03    Queries extended return information.  If the file does not
       exist, a "0" is returned followed by a carriage return.  If it
       does exist, the text returned to the Host is in the Format:
       1.size.date.time <cr>.  An example of a return statement could
       be "1.20345.01/02/93.03:04:30<cr>"
 04    Queries extended return information.  If the file does not
       exist, a "0" is returned followed by a carriage return.  If it
       does exist, the text returned to the Host is in the Format:
       1.filename.size.date.time <cr>. An example of a return statement
       could be "1.MYFILE.RIP.20345.01/02/93.03:04:30 <cr>".  Note that
       the file extension adds another period into the return text.



RIP_ENTER_BLOCK_MODE
--------------------
         Function:  Enter block transfer mode with host
            Level:  9 (system command)
          Command:  <escape>
        Arguments:  mode:1 proto:1 file_type:2 res:4
                    [filename:2] <>
           Format:  !|9<escape> <proto> <file_type> <res>
                    [filename] <>
          Example:  !|9<escape>00010000ICONFILE.ICN<>
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

NOTE:  <escape> is used to indicate the Escape character (ASCII 27 or ESC).

This command is used to auto-initiate any desired File Transfer Protocol.
The <filename> parameter is optional on downloads, required for uploads,
and if omitted must be replaced with a <> parameter (end of string).

The <mode> parameter is to specify upload or download.  Use "1" for
upload mode, or "0" (zero) for download mode.  A filename is required for
uploads.  If the user has Data Security enabled on the terminal, they are
prompted to OK the upload before it proceeds.  If the user does not
authorize the upload, ten <Ctrl-X>'s (ASCII 24 or CAN) are sent at
one-tenth second intervals.  The <filetype> parameter is ignored for
uploads.

The <proto> parameter is the file transfer protocol specifier. Possible
values, and the protocols they refer to are:

    Value   Protocol            Filename Required?
    ----------------------------------------------
      0     Xmodem (checksum)          Yes
      1     Xmodem (CRC)               Yes
      2     Xmodem-1K                  Yes
      3     Xmodem-1K (G)              Yes
      4     Kermit                     Yes
      5     Ymodem (batch)             No
      6     Ymodem-G                   No
      7     Zmodem (crash recovery)    No

The <file_type> parameter determines what type of files are to be
received during the block transfer.  These are the valid parameters:


    Value   Description of Block Transfer Contents
    ---------------------------------------------------------------
      0     RIP file sequence (display it)
      1     RIP file sequence (store them)
      2     ICN file sequence (store them in proper directories)
      3     HLP file sequence (store it, and auto-load if needed)
      4     COMPOSITE DYNAMIC file sequence (batch protocols only)
      5     ACTIVE DYNAMIC file sequence (batch protocols only)

Whether the <filename> is specified or not, this command must have a "<>"
sequence after the filename (even if there is none).  Here are examples
of how it would look with and without a filename:

With a filename, using X-Modem/CRC:

     !|9<escape>01010000filename.icn<>

Without a filename, using Z-Modem

     !|9<escape>06040000<>

The special <file_type> of 4 & 5 (COMPOSITE DYNAMIC file sequences) is
somewhat different than the non-batch transfer methods.  This allows each
file uploaded to be individually processed based on their file extensions.
If you use extensions other than .RIP or .ICN, then this mode is not
available to you as the necessary files will not be able to be
processed.  Any files that are "downloaded" from the Host in DYNAMIC mode
are placed into the appropriate sub-directories and no further processing
is performed.  .RIP files that are received are "stored" and are not
played back in COMPOSITE DYNAMIC mode.  In ACTIVE DYNAMIC mode, they are
stored and played back simultaneously.

NOTE:  This command must be terminated with a carriage return.  A
       vertical bar (|) command delimiter cannot be used to separate
       this command from a subsequent one on the same line.  In other
       words, this command must be the last command on a line of text.
       The protocol must begin on the very next line.



RIP_NO_MORE
-----------
         Function:  End of RIPscrip Scene
            Level:  0
          Command:  #
        Arguments:  <none>
           Format:  !|#
          Example:  !|#
  Uses Draw Color:  NO
Uses Line Pattern:  NO
  Uses Line Thick:  NO
  Uses Fill Color:  NO
Uses Fill Pattern:  NO
  Uses Write Mode:  NO
  Uses Font Sizes:  NO

This command indicates that RIPscrip commands are complete.  This allows
the terminal program to activate Mouse Regions, or respond to queued up
Mouse Clicks without disturbing the natural flow of the script
transmission.

For noise-immunity, the Host should transmit three or more RIP_NO_MORE
command consecutively to make sure the message gets to the terminal.  The
terminal should also time-out if no data is received for a while, and
assume RIP_NO_MORE.





=====================================================================
==          HOST COMMANDS - A TUTORIAL & REFERENCE SECTION         ==
=====================================================================

With Mouse regions, Buttons and Text Variable Query ability, you can
control the Terminal/Paint programs and how they react with the BBS
in many ways.  To accomplish this, there are several features of
RIPscrip that permit you to do special actions based on different
circumstances.  In effect, an "action language" of sorts.  The
following sections go into the available "action language" features
in more detail.

Among the various abilities are:

     1. Control-Character specification
     2. Pre-defined Text Variables & User-defined text variables
     3. Pop-up pick-lists
     4. A Host Command "Template" system for added intelligence.
     5. Query text variable contents (pre-defined & user variables)




=====================================================================
==                        CONTROL CHARACTERS                       ==
=====================================================================

Not all BBS'es will allow you to use control characters on their
Service.  Regardless of that, the capability to send any Control
Character exists for your Host Commands.  The most commonly used
Control Characters are:

   INDIVIDUAL CONTROL CHARACTERS         SPECIAL KEYSTROKES
   ===========================================================
   ^G ... Beep                           ^[[A ... Up Arrow
   ^L ... Clear Screen (Top of Form)     ^[[B ... Down Arrow
   ^M ... Carriage Return                ^[[C ... Right Arrow
   ^C ... Break (sometimes)              ^[[D ... Left Arrow
   ^H ... Backspace                      ^[[H ... Home Key
   ^[ ... Escape character               ^[[K ... End Key
   ^S ... Pause data transmission        ^[[L ... Control Home
   ^Q ... Resume data transmission

Some hosts use the ^ (caret) for their own purposes.  In these
cases, you can use the ` (backquote) character instead of the
caret.  Some systems allow you to specify the caret symbol as
two carets (^^).  Consult your Host Software documentation to
determine the best method for your needs.

NOTE:  RIPterm uses ^ or ` and a character to represent a control
       character.  IT IS NOT A CONTROL CHARACTER BY ITSELF, IT
       IS TRANSLATED BY RIPterm.  In other words, ^M does not send
       a ^ and then an M, it sends a carriage return (ASCII 13).
       Likewise, RIPscrip commands like Query do not use an ^[, an
       actual escape character (ASCII 27) is used.



=====================================================================
==                          TEXT VARIABLES                         ==
=====================================================================

A special feature of RIPterm allows it to understand what a Text Variable
is.  A text variable is a piece of text that both RIPaint and RIPterm
know something about.  For example, the Text Variable $DATE$ is known to
represent the current Date on your PC.  The host may ask your system what
the values of one or more of these variables are, and if your terminal
knows these particular Text Variables, it will tell the host.

There are three types of Text Variables.

-- Built-In Text Variables that RIPscrip products will ALWAYS
   know about.  These include Text Variables like date and time
   that return a value

-- Another type of built-in Text Variable are Active Text Variables,
   which perform an action, but return nothing to the host.  These
   include turning the status bar on/off, clearing the graphics
   screen, and playing some simple sounds.

-- Then there are also User Text Variables that can contain a variety
   of information depending on what the user entered at the time
   the variable was created.  For example, the host might ask you
   what the contents of the $FULL_NAME$ variable is, and if
   RIPterm doesn't know, it could pop-up a field on the screen and
   ask you about it.  From then on, RIPterm will remember that
   piece of information for the next time it is needed by a host.

You may use either the pre-defined Text Variables, or the User Text
Variables at any place that allows Text Variables.

The following is a reference of all Built-In and Active Text Variables.





The following is a Listing of the Pre-Defined Text Variables:
=============================================================




$RIPVER$ ... RIPscrip version (e.g., "RIPSCRIP015300")
------------------------------------------------------
This Text Variable returns a phrase which will identify a
RIPscrip-compatible software package.  It is designed to be used by a
host to detect what version of RIPscrip graphics your terminal can
support.  When this Text Variable is used, it will respond back with
"RIPSCRIP" followed by the full Version Number (e.g., 01.53.00), without
the periods.

     Example:  $RIPVER$
     Returns:  RIPSCRIP015300


$DATE$ ... Date in short format
-------------------------------
This Text Variable returns the current date. in the format MM/DD/YY.

     Example:  $DATE$
     Returns:  12/19/93



$MONTH$ ... Month Name
----------------------
This Text Variable returns the full name of the current month.  It is not
abbreviated (e.g., "November" instead of "Nov")

     Example:  $MONTH$
     Returns:  December



$MONTHNUM$ ... Month Number
---------------------------
This Text Variable returns the number of the current month.  January=01
and December=12.

     Example:  $MONTHNUM$
     Returns:  12



$DAY$ ... Day of Month Number
-----------------------------
This Text Variable returns the current day of the month.  Possible values
for this Variable are from 01-31.

     Example:  $DAY$
     Returns:  05



$DOY$ ... Day of year
---------------------
This Text Variable returns the number of days so far in the year.  A year
has 365 days (except leap years which have 366).  $DOY$ can return 001 -
366.

     Example:  $DOY$
     Returns:  214



$YEAR$ ... 2 digit year
-----------------------
This Text Variable returns the two-digit number of the current year.

     Example:  $YEAR$
     Returns:  93



$FYEAR$ ... 4 digit year
------------------------
This Text Variable returns the four-digit number of the current year.

     Example:  $FYEAR$
     Returns:  1993



$TIME$ ... Time in standard format
----------------------------------
This Text Variable returns the time in military format (hours from 00 -
23).  The format is hours, minutes, and seconds separated by colons.
HH:MM:SS

     Example:  $TIME$
     Returns:  18:09:33



$HOUR$ ... Hour (format HH) - normal style
------------------------------------------
This Text Variable returns the two digit number of the current hour.
This variable range from 01 - 12.  This does not use military format.

     Example:  $HOUR$
     Returns:  11



$MHOUR$ ... Hour (format HH) - military style
---------------------------------------------
This Text Variable returns a two-digit number of the current hour in
military format.  This variable may range from 00 - 23.

     Example:  $MHOUR$
     Returns:  17



$MIN$ ... Minutes
-----------------
This Text Variable returns the two-digit number representing the current
minutes in the hour.  Possible values for this variable are 00-59.

     Example:  $MIN$
     Returns:  45



$SEC$ ... Seconds
-----------------
This Text Variable returns a two-digit number representing the current
seconds of the minute.  Possible values for this variable are 00-59.

     Example:  $SEC$
     Returns:  59



$AMPM$ ... Returns AM or PM depending on time
---------------------------------------------
This Text Variable returns a two-character value of either "AM" or "PM"
depending on what time it is.

     Example:  $AMPM$
     Returns:  PM



$DATETIME$ ... Date and Time
----------------------------
This Text Variable returns a combination date and time.  The format is
somewhat different than standard time/date notation.  It is:

     DAY-OF-WEEK   MONTH   DAY-OF-MONTH  HH:MM:SS  YEAR

     Example:  $DATETIME$
     Returns:  Sat Dec 19 14:38:50 1993

        NOTE:  This is the standard Unix date/time notation.



$TIMEZONE$ ... Time Zone or "NONE" if unknown
---------------------------------------------
This Text Variable returns a word/phrase that describes the time-zone the
terminal is in.  This may be returned as anything like "PST" for Pacific
Standard Time, "EST" for Eastern Standard Time, etc.  If the time zone is
not set on your PC, this variable will respond with "NONE".

     Example:  $TIMEZONE$
     Returns:  PST



$DOW$ ... Day of week fully spelled out
---------------------------------------
This Text Variable returns the current day of the week.  The name is
fully spelled out.  Possible values are: Sunday, Monday, Tuesday,
Wednesday, Thursday, Friday and Saturday.

     Example:  $DOW$
     Returns:  Saturday



$ADOW$ ... Abbreviated Day of Week
----------------------------------
This Text Variable returns the current day of the week in abbreviated
form.  Possible values are: Sun, Mon, Tue, Wed, Thu, Fri and Sat.

     Example:  $ADOW$
     Returns:  Mon



$WDAY$ ... Day of Week
----------------------
This Text Variable returns a one-digit number representing the day of the
week.  Possible values are 0-6, where 0=Sunday (the first day in the
week).

     Example:  $WDAY$
     Returns:  2

$WOY$ ... Week of current year 00-53; Sunday=1st Day of Week
------------------------------------------------------------
This Text Variable returns a number from 00-53, representing the week in
the year.  Even though there are 52 weeks in a year, a week might not
begin exactly on the first day of the year, so a maximum value for this
variable can be 53 under these circumstances.  For this variable, Sunday
is considered to be the first day of the week.

     Example:  $WOY$
     Returns:  32



$WOYM$ ... Week of current year 00-53; Monday=1st Day of Week
-------------------------------------------------------------
This Text Variable returns a number from 00-53, representing the week in
the current year.  Even though there are 52 weeks in a year, a week might
not begin exactly on the first day of the year, so a maximum value for
this variable can be 53 under these circumstances.  For this variable,
Monday is considered to be the first day of the week.

     Example:  $WOYM$
     Returns:  32



$BEEP$ ... Beep Sound (ala Ctrl-G)
----------------------------------
This Active Text Variable beeps the terminal, producing a Ctrl-G sound.

The C source code to play this sound is:

          sound(1000);   // the Hertz frequency to play
          delay(75);     // millisecond delay
          nosound();     // turn the sound off
          delay(75);     // millisecond delay

     Example:  $BEEP$
     Returns:  nothing



$BLIP$ ... Blipping Sound (like a hitting a barrier)
----------------------------------------------------
This Active Text Variable is like $BEEP$, except the sound is different.
It produces a barrier sound; like you're running into a wall.

The C source code to play this sound is:

          sound(50);     // the Hertz frequency to play
          delay(25);     // millisecond delay
          nosound();     // turn the sound off
          delay(10);

     Example:  $BLIP$
     Returns:  nothing



$MUSIC$ ... Musical (cheerful) sound
------------------------------------
This Active Text Variable produces a cheerful sound, indicating success of
an action.  This sound is used for successful downloads and dialed
connections.

The C source code to play this sound is:

          for ( i = 0  ;  i < 4  ;  i += 1 )
          {
               sound(1300);   delay(10);     // the Hertz frequency to play
               sound(1200);   delay(10);     // millisecond delay
               sound(1100);   delay(10);
               sound(1000);   delay(10);
               sound(900);    delay(10);
               sound(800);    delay(10);
               sound(700);    delay(10);
               sound(850);    delay(10);
               sound(950);    delay(10);
          }
          nosound();                         // turn the sound off

     Example:  $MUSIC$
     Returns:  nothing



$ALARM$ ... Warning!  This sound indicates failure!
---------------------------------------------------
This Active Text Variable produces a warning sound, indicating failure of
an action.  This sound is used for aborted downloads.

The C source code to play this sound is:

          for ( i = 0  ;  i < 3  ;  i += 1 )
          {
               sound(320);  delay(200);     // the Hertz frequency to play
               sound(160);  delay(425);     // millisecond delay
          }
          nosound();                        // turn the sound off

     Example:  $ALARM$
     Returns:  nothing



$PHASER$ ... Fire phasers!
--------------------------
This Active Text Variable produces a sound like firing your energy
weapons in a game.  Now you too blast away with the bset of them.  Trivia
question:  What is phaser stand for?  See $REVPHASERS$ for the answers.

The C source code to play this sound is:

          for ( i = 2500  ;  i >= 50  ;  i -= 20 )
          {
               sound(i);               // the Hertz frequency to play
               delay(2);               // millisecond delay
          }
          nosound();                   // turn the sound off

     Example:  $PHASER$
     Returns:  nothing



$REVPHASER$ ... Fire phasers!
-----------------------------
This Active Text Variable produces a sound like firing your energy
weapons in a game.  Like $PHASER$ makes an ascending tone, $REVPHASER$
makes a descending tone.  Answer to trivia question in $PHASER$: Phaser
stands for PHoton Amplification by Stimulated Emission of Radiation.
Sound familiar?  Laser is Light Amplification by Stimulated Emission of
Radiation, and Maser is Microwave Amplification by Stimulated Emission of
Radiation.

The C source code to play this sound is:

          for ( i = 50  ;  i <= 2500  ;  i += 20 )
          {
               sound(i);               // the Hertz frequency to play
               delay(2);               // millisecond delay
          }
          nosound();                   // turn the sound off

     Example:  $REVPHASER$
     Returns:  nothing



$X$ ... X Mouse location
------------------------
This Text Variable returns the current X coordinate of the mouse pointer.
This can be used interactively (for example, by on-line games) to
determine the location of the mouse pointer.  Only the X value of the
mouse (X,Y) is returned.  The value is 0000-9999 depending on what the
current position is.

     Example:  $X$
     Returns:  0523



$Y$ ... Y Mouse location
------------------------
This Text Variable returns the current Y coordinate of the mouse pointer.
This can be used interactively (for example, by on-line games) to
determine the location of the mouse pointer.  Only the Y value of the
Mouse (X,Y) is returned.  The value is 0000-9999 depending on what the
current position is.

     Example:  $Y$
     Returns:  0244



$XY$ ... X/Y Mouse Location
---------------------------
This Text Variable returns both the X and Y coordinates of the mouse
pointer.  A colon (:) separates the two values.  The X and Y values may
range from 0000-9999.  The format that this value uses is:  XXXX:YYYY

     Example:  $XY$
     Returns:  0297:0321



$XYM$ ... X, Y & button status
------------------------------
This Text Variable returns the X and Y coordinates of the mouse pointer,
and which mouse buttons are pressed (if any).  A colon (:) separates the
three values.  The X and Y values may range from 0000-9999.  LMR stands
for Left/Middle/Right.  If any of these buttons are depressed (clicked),
then the corresponding position will contain a 1.  If a button is NOT
depressed, then it will contain a 0.  The format that this value uses
is:  XXXX:YYYY:LMR

This means that the (X,Y) location of the cursor is (0123,0297), and that
the Left and Middle buttons are depressed, but that the Right Mouse
Button is not depressed.

     Example:  $XYM$
     Returns:  0123:0297:110



$M$ ... Mouse Button Status: LMR
--------------------------------
This Text Variable returns a 3-character code representing the status of
each mouse button.  This variable works with two button and three button
mice.  The format of the code is LMR where L=Left, M=Middle (if any), and
R=Right.  If any button is clicked, the code for that button is "1".  If
the button is not depressed, it is "0".  "100" would mean the left mouse
button is depressed, but none of the others are.

     Example:  $M$
     Returns:  001



$MSTAT$ ... Mouse Status
------------------------
This Text Variable returns a "YES" if there is a mouse installed on the
RIPterm computer.  If no mouse is installed, this variable returns "NO".

     Example:  $MSTAT$
     Returns:  YES



$RESET$ ... Performs RIP_RESET_WINDOWS (Identical to !|*)
---------------------------------------------------------
This Active Text Variable resets and clears the graphics screen, resets
the text window to full screen and clears it, resets the color palette,
deletes all mouse fields, and clears the clipboard.

     Example:  $RESET$
     Returns:  nothing



$SAVEALL$ ... Save all screen attributes
----------------------------------------
This Active Text Variable saves the Text Windows coordinates, save the
contents of the clipboard, saves all mouse fields, and saves the contents
of the entire screen.  It is the same as doing a "$STW$ $SCB$ $SMF$
$SAVE$".

     Example:  $SAVEALL$
     Returns:  nothing



$RESTOREALL$ ... Restore all screen attributes
----------------------------------------------
This Active Text Variable restores the Text Windows coordinates, restores
the contents of the clipboard, restores all mouse fields, and restores
the contents of the screen.  It is equal to "$RTW$ $RCB$ $RMF$
$RESTORE$".

     Example:  $RESTOREALL$
     Returns:  nothing



$EGW$ ... Erase Graphics Window
-------------------------------
This Active Text Variable erases the graphics window (much like a Reset
Windows command does). This command is useful in Host Commands.  When you
click on a Mouse Field, it could erase the graphics window THEN transmit
the remainder of the return string (if any) to the host.

     Example:  $EGW$
     Returns:  nothing



$SAVE$ and $SAVEx$ ... Save graphics screen
-------------------------------------------
The Active Text Variable $SAVE$ saves the contents of the entire graphics
screen to a disk file called RIPTERM.SAV.  No Mouse Fields, Text Window
locations or Clipboard data are saved - just the graphics screen.  The
entire 640x350 region is saved to disk.

If you choose the SAVE0 through SAVE9 variations, the filename that is
saved to files RIPTERM0.SAV through RIPTERM9.SAV, allowing you to have
multiple screens saved simultaneously.

If you wish to save the entire state of the RIPterm system, use
$SAVEALL$.

     Example:  $SAVE7$
     Returns:  nothing



$RESTORE$ and $RESTOREx$ ... Restore graphics screen
----------------------------------------------------
The Active Text Variable $RESTORE$ reads the saved file RIPTERM.SAV in
from disk and restores the graphics as they were originally saved with
the $SAVE$ command.  Only the graphics screen is restored, not the
Clipboard, Mouse Fields or Text Window settings.

If you choose the RESTORE0 through RESTORE9 variations, the filename that
is restored are RIPTERM0.SAV through RIPTERM9.SAV, allowing you to
restore from up to ten different saved files.  A slight difference from
$RESTORE$ is that $RESTORE0$ - $RESTORE9$ delete the file after the
graphics screen is restored.

To restore the entire context of the graphics environment $RESTALL$.

     Example:  $RESTORE3$
     Returns:  nothing



$SMF$ ... Save Mouse Fields
---------------------------
This Active Text Variable saves all defined Mouse Fields and Mouse
Buttons to a temporary file for later retrieval.  This is designed
especially for the graphical designer who wishes to pop-up a dialog box
on the screen with one or more mouse fields, and when finished, to
restore the screen and original mouse fields.  This command is intended
to be used with the Restore Mouse Fields text variable $RMF$.

     Example:  $SMF$
     Returns:  nothing



$RMF$ ... Restore Mouse Fields
------------------------------
This Active Text Variable restores any Mouse Fields saved with $SMF$.
You may have only one set of mouse fields saved at once.  If no mouse
fields were saved, or if the number of fields saved is 0, then no mouse
fields are  active.

NOTE:  You may restore Mouse Fields more than once is you wish. In
       other words, if you do a $SMF$ command, you may execute
       $RMF$ one or more times.

     Example:  $RMF$
     Returns:  nothing



$MKILL$ ... Kill Mouse Fields
-----------------------------
This Active Text Variable deletes all defined Mouse Fields exactly like
RIP_KILL_MOUSE_FIELDS does.  The benefit is when the user clicks on a
Mouse Fields or Button, the Mouse Fields are removed, but the graphics
remain on the screen.  The fields could be subsequently re-defined
quickly and easily without having to re-transmit an identical menu over
again.

     Example:  $MKILL$
     Returns:  nothing



$ETW$ ... Erase Text Window
---------------------------
This Active Text Variable erases the Text Window (like a clear screen
code does).  This command is useful in Host Commands when you click on a
Mouse Field, it could erase the text window THEN transmit the remainder
of the Host Command (if any).

     Example:  $ETW$
     Returns:  nothing



$DTW$ ... Disable Text Window
-----------------------------
This Active Text Variable disables the Text Window (preventing any
received text from showing up on screen).  This command is useful in Host
Commands when you click on a Mouse Field, it would halt any further
output to the text window.

     Example:  $DTW$
     Returns:  nothing



$STW$ ... Save Text Window information
--------------------------------------
This Active Text Variable stores all of the text window settings.  The
window's X/Y dimensions are preserved, as is the current cursor location,
ANSI attributes, cursor ON/OFF status and the vertical scrolling margins.
Even the current System Font is saved (if necessary).

NOTE:  The contents of the Text Window are NOT saved.

     Example:  $STW$
     Returns:  nothing



$RTW$ ... Restore Text Window information
-----------------------------------------
This Active Text Variable restores the Text Window to the settings active
when $STW$ (Save Text Window) was executed. The current cursor location,
ANSI attributes, cursor ON/OFF status, vertical scrolling margins, and
the System Font are restored.

NOTE:  The text contents of the window are not restored.

     Example:  $RTW$
     Returns:  nothing



$TWIN$ ... Text  Window Status
------------------------------
This Text Variable checks to see if a Text Window exists, and returns YES
if there is a Text Window, or returns NO if there is no Text Window or
the Text Window has been disabled (with $DTW$).

     Example:  $TWIN$
     Returns:  YES



$TWFONT$ ... Active Text Font
-----------------------------
This Text Variable returns which of the five Text Window Fonts is active,
or 0 (zero) if there is no Text Window.

          0 ... No Text Window          3 ... 80x25 font
          1 ... 80x43 font              4 ... 91x25 MicroANSI font
          2 ... 91x43 MicroANSI font    5 ... 40x25 font

     Example:  $TWFONT$
     Returns:  1



$TWH$ ... Text Window Height
----------------------------
This Text Variable returns the height of the Text Window, or 0 (zero) if
there is no Text Window.  If a text window exists, the minimum value is 1
and the maximum value is 43.  This may increase in the future.

     Example:  $TWH$
     Returns:  25



$TWW$ ... Text Window Width
---------------------------
This Text Variable returns the width of the Text Window, or 0 (zero) if
there is no Text Window.  If a text window exists, the minimum value is 1
and the maximum value is 91.  This may increase in the future.

     Example:  $TWW$
     Returns:  80



$TWX0$ ... Text Window Upper Left X Coordinate
----------------------------------------------
This Text Variable is the X coordinate of the upper left corner of the
Text Window.  The coordinates given are relative to the upper left of the
screen.  The values are given in cells, which is a block the size of one
character in the currently selected font.  A good analogy is that a cell
is equivalent to a square on a sheet of graph paper.  The cell size may
change depending on the font used, but the relative position for that
font remains constant.  If there is no Text Window, this returns 0
(zero).  However, note that 0 (zero) is also a valid coordinate.  Use
$TWIN$ to determine if there is a Text Window.

     Example:  $TWX0$
     Returns:  0



$TWY0$ ... Text Window Upper Left Y Coordinate
----------------------------------------------
This Text Variable is the Y coordinate of the upper left corner of the
Text Window.  See $TWX0$ for an explanation of the coordinate system.

     Example:  $TWY0$
     Returns:  40



$TWX1$ ... Text Window Lower Right X Coordinate
-----------------------------------------------
This Text Variable is the X coordinate of the lower right corner of the
Text Window.  See $TWX0$ for an explanation of the coordinate system.

     Example:  $TWX1$
     Returns:  80



$TWY1$ ... Text Window Lower Right Y Coordinate
-----------------------------------------------
This Text Variable is the Y coordinate of the lower right corner of the
Text Window.  See $TWX0$ for an explanation of the coordinate system.

     Example:  $TWY1$
     Returns:  43



$CURX$ ... Text Cursor X Coordinate
-----------------------------------
This Text Variable is the X coordinate of the text cursor in the Text
Window, relative to the upper left of the Text Window.  See $TWX0$ for an
explanation of the coordinate system.

     Example:  $CURX$
     Returns:  2



$CURY$ ... Text Cursor Y Coordinate
-----------------------------------
This Text Variable is the Y coordinate of the text cursor in the Text
Window, relative to the upper left of the Text Window.  See $TWX0$ for an
explanation of the coordinate system.

     Example:  $CURY$
     Returns:  5



$CON$ ... Enable the Text Cursor
--------------------------------
This Active Text Variable turns on the text cursor.

     Example:  $CON$
     Returns:  nothing



$COFF$ ... Disable the Text Cursor
----------------------------------
This Active Text Variable turns off the text cursor.  This is
automatically reset when a Reset Windows command is received.

     Example:  $COFF$
     Returns:  nothing



$CURSOR$ ... Text Cursor Status
-------------------------------
This Text Variable returns YES if the Text Cursor is enabled, and NO if
the Text Cursor is disabled.  If there no Text Window, it returns NO.

     Example:  $CURSOR$
     Returns:  YES



$SCB$ ... Save Clipboard
------------------------
This Active Text Variable saves the Clipboard to disk for later retrieval
by a Query or Host Command.  If the clipboard is empty, the temporary
file is deleted so Restore Clipboard knows there shouldn't be a clipboard
active.

     Example:  $SCB$
     Returns:  nothing



$RCB$ ... Restore Clipboard
---------------------------
This Active Text Variable restores the Clipboard from the temporary disk
file called RIPCLIB.BRD.  This file is created by $SCB$ (Save
Clipboard).  Not only are the clipboard contents saved, but so is the
last clipboard location, so Paste Clipboard ($PCB$) restores the
clipboard's contents AND location.

     Example:  $RCB$
     Returns:  nothing



$PCB$ ... Paste Clipboard at last location
------------------------------------------
This Active Text Variable pastes the clipboard at the last location it
was clipped from. This also works with icons.  The last location taken
used is the location the icon was stamped when it was first loaded.  This
text variable is useful if you want to pop up a dialog box (saving the
previous area behind the dialog onto the clipboard), and when the user
clicks on the "OK" button, restoring the screen contents (by using a
$PCB$ in the host command string).

     Example:  $PCB$
     Returns:  nothing



$STATBAR$ ... Status Bar Status
-------------------------------
This Text Variable returns YES if the Status Bar is visible in the
terminal.  If the Status Bar is not visible, then NO is returned.

     Example:  $STATBAR$
     Returns:  YES



$SBARON$ ... Turn ON the Status Bar
-----------------------------------
This Active Text Variable turns ON the Status Bar in the terminal.

     Example:  $SBARON$
     Returns:  nothing



$SBAROFF$ ... Turn OFF the Status Bar
-------------------------------------
This Active Text Variable turns OFF the Status Bar in the terminal.

     Example:  $SBAROFF$
     Returns:  nothing



$VT102ON$ ... Turn VT-102 keyboard mode ON
------------------------------------------
This Active Text Variable enables the VT-102 keystrokes ability.  This
makes the following keystrokes send something to the host:

                  F1 - ESC [ M
                  F2 - ESC [ N
                  F3 - ESC [ O
                  F4 - ESC [ P
                  F5 - ESC [ Q
                  F6 - ESC [ R
                  F7 - ESC [ S
                  F8 - ESC [ T
                  F9 - ESC [ U
                 F10 - ESC [ V
                PGUP - ESC [ I
                PGDN - ESC [ G
                HOME - ESC [ H
                 END - ESC [ F
              INSERT - ESC [ L
           CURSOR UP - ESC [ A
           CURSOR DN - ESC [ B
         CURSOR LEFT - ESC [ C
        CURSOR RIGHT - ESC [ D

This text variable puts the terminal in VT-102 mode automatically, making
it simpler for the user.

     Example:  $VT102ON$
     Returns:  nothing



$VT102OFF$ ... Turn VT-102 keyboard mode OFF
--------------------------------------------
This Active Text Variable disables the VT-102 keystrokes mode, returning
your keyboard to the standard keyboard operation.

     Example:  $VT102OFF$
     Returns:  nothing



$DWAYON$ ... Turn Doorway Mode ON
---------------------------------
This Active Text Variable enables Doorway Mode.  This is intended to be
used by a Host system that wishes to take advantage of the Doorway mode
available in Marshall Dudley's Doorway (tm) software package.

     Example:  $DWAYON$
     Returns:  nothing



$DWAYOFF$ ... Turn Doorway Mode OFF
-----------------------------------
This Active Text Variable disables the Doorway keyboard mode.  This will
return the keyboard to normal operation.

     Example:  $DWAYOFF$
     Returns:  nothing



$HKEYON$ ... Enable Button Hotkeys
----------------------------------
This Active Text Variable turns on use of Button Hotkeys.  When enabled,
if the user presses a key associated with a button, it is selected just
as if it were clicked.  The Scroll Lock light on the keyboard is turned
on.

     Example:  $HKEYON$
     Returns:  nothing



$HKEYOFF$ ... Disable Button Hotkeys
------------------------------------
This Active Text Variable turns off Button Hotkeys.  This should be done
when entering a full-screen editor, or any part of the system where the
user is entering a string of text.  This is to prevent the user from
accidentally selecting a button when typing in text.

     Example:  $HKEYOFF$
     Returns:  nothing



$TABON$ ... Enable TAB key Mouse Field select
---------------------------------------------
This Active Text Variable turns on the use of the TAB key to jump from
one defined Mouse or Button Field to another.

     Example:  $TABON$
     Returns:  nothing



$TABOFF$ ... Disable TAB key Mouse Field select
-----------------------------------------------
This Active Text Variable turns off the use of the TAB key to jump from
one defined Mouse or Button Field to another.  If this command is
received when a field is highlighted, it is deselected.  This should be
done when entering a full-screen editor so that the user can use the TAB
key as a TAB, not a Mouse Field selector.

     Example:  $TABOFF$
     Returns:  nothing



$APP0$ - $APP9$ ... External Application Call
-----------------------------------------------
This Active Text Variable instructs the terminal to execute an external
application.  By recommendation, $APP0$ is the user's text editor.  There
are ten external application slots available, numbered 0 - 9.  These are
defined in the External menu in RIPterm.

     Example:  $APP1$
     Returns:  nothing




=====================================================================
==                 LOCAL RIPscrip FILE PLAYBACK                    ==
=====================================================================


You can re-play a .RIP file that you have locally on your hard disk
from anyplace that allows text variables.  The format of the variable
is somewhat different than user variables, or pre-defined text
variables.  After the initial dollar sign ($), enter the greater-than
symbol (>) followed by the filename (with or without the .RIP
extension), then ending in another dollar sign ($).  Several examples
of this are as follows:

         $>MYFILE.RIP$
         $>FILE1$
         $>FILE1.RIP$$>FILE2.RIP$$>FILE3$

Note in the last example, a file extension other than .RIP was used.
You are not limited to playing back local .RIP files.  In fact, you
can play-back any file you want.  You could load any simple text
file, ANSI picture image, or other such thing.  When loaded, the data
is not sent to the host; it is strictly echoed on your local screen.
If the file is a .RIP file, it will replay any graphics that were in
the file and if any Mouse Regions are defined, it will create those
fields for you as well, thus allowing you to pop-up dialog screens or
other such things that are not built-in to RIPterm normally.

Each "local RIP playback" variable you enter will search for the .RIP
file in the current host's icon directory.  If it cannot find the
file in that directory, it will check the ICONS\ directory.





=====================================================================
==                           POP-UP LISTS                          ==
=====================================================================

Any place that you can use a Text Variable (Queries, Button and Mouse
Field return strings, and Keystroke Macros), you can take advantage of a
unique feature of RIPscrip - Pop-Up Pick Lists.  A Pop-Up Pick List is
simply a list that pops up allowing you to choose from one of several
available values.  Whichever entry in the list you choose will insert
it's associated command in the Host Command returned back to your host.

A list is created by putting the special list instructions inside two sets
of parenthesis like this: (( and )).  The list consists of an optional
question followed by two colons (::), followed by one or more list
entries.  For example, ((Send Email to?::Sysop,Cosysop,Joe)) says to
pop-up a list asking you "Send Email to?", giving you the choices of
"Sysop", "Cosysop", and "Joe".

By default, if you press ESC instead of picking an entry in the list,
then nothing will be inserted into the text of your Command. You can
indicate that the user must pick an entry by putting an asterisk (*) at
the beginning of the question.  For example, ((*Send Mail
to?::Sysop,Joe)).  This would make it so that the user must choose either
Sysop or Joe.

In the previous examples, Sysop and Joe are the text responses that are
inserted into your Host Command.  These commands are also the same things
that are displayed in the listing.  If you want to use something else in
the listing instead of the return text, you can. When you make the list
entry, add an @description to the end of it.  For example:

     ((Send Mail To?::Sysop@Head Honcho,Cosysop,Joe))

...would display a pop-up pick list of Head Honcho, Cosysop, and Joe.

One final feature of Pop-Up Pick Lists allows you to specify a hotkey for
each entry in the list.  For example, if you wanted the first character
of each entry to be highlighted (thus allowing you to select that
character to activate the entry), simply put a tilde (~) or an underline
(_) before and after the keystroke.  For example "_S_ysop" would
highlight the "S" in "Sysop" appearing like this:

                       Sysop

You can highlight more than one character, but only the first one will be
the active hotkey.  If you omit the second tilde or underline, then the
remainder of the description will be highlighted.

NOTE:  If you use a tilde or an underline in the Text Response (not the
       description), then those characters are inserted into your Host
       Command when it is transmitted to the host.  You probably
       don't want to do this.  Recommendation: only use hotkey
       features on list entries where you specify a description!

If you do not specify a question, then the list default to the question:

               Choose one of the following:

You may specify up to twenty entries for any one list.  In RIPterm
version 1.52 and earlier, the total length of a pick list was 256 bytes.
In version 1.53 and later, this limit has been increased to 1024 bytes.

Some characters have special significance in the RIPscrip language. These
characters are ! (exclamation mark, or for you Unix-heads, bang), \
(backslash), and | (vertical bar).  To use these characters in a Text
Response, they must be preceded by a backslash (! becomes \!, \ becomes
\\, and | becomes \|).  RIPaint automatically adds these when creating
Text Responses.  You need to be aware of this only if you are editing
RIPscrip files with a text editor.  The _ (underline) and ~ (tilde)
characters used to indicate the hotkey in a Text Response are not able to
be preceded by a backslash to be used by themselves.  They will be
returned to the host if they exist in a Text Response (not in the
description), however everything after the underline or tilde will be
underlined, and the first character will be considered the hotkey.

  Examples:

     ((Send E-Mail to?::Sysop,Joe,Mike))
     ((*Send E-Mail to?::Sysop@The Head Honcho,Joe,Mike@My Brother))
     ((::Sysop@_T_he Head Honcho,Joe,Mike@My _B_rother))





=====================================================================
==                     HOST COMMAND "TEMPLATES"                    ==
=====================================================================

Often you might want a button on your screen to do one thing in one
situation, but to do something completely different in another situation.
In the past, this required having a separate menu file for each different
function that this Button needs.  This cumbersome method is history with
Command Templates.

Command Templates are probably best described with a brief example. Lets
say that you have a menu screen for reading and writing messages in your
public message forums.  On this menu, you can have buttons for each forum
on your host, and at the same time have buttons for Read, Write, Erase,
Modify, etc.  Now, how can you make the Read/Write/etc.  buttons work
differently for each forum button clicked?

                  Templates!

To further refine our example, lets say that you click on the button for
Forum #1, it should send the command "S FORUM1" to the host to select
that forum.  After that, simply clicking on the Read or Write buttons
will read through the current section.  But, what if you want to
interactively move about on the menu? Make each of the forum selection
buttons define a template.  Each template instructs RIPscrip how to
process the other buttons.

In the example above, the Forum #1 button would define this template:

                S FORUM1 $?$^m

This template will return "S FORUM1" followed by the Host Command for
whichever button is clicked, followed by a carriage return. The special
text variable $?$ is only used in Command Templates, and is used to
indicate "insert the text into the template here".  It references the
text of some other button that was clicked that is stuffing its data INTO
this template.

CHARACTERISTICS OF TEMPLATES
----------------------------
Before you can go about defining templates, you need to know how they
work, interact and how other functions interact with templates.

You are allowed up to 36 different templates, each of which can be
different and active at the same time.  Each template corresponds to a
Button Group (see MOUSE FIELDS AND BUTTONS for more detail).  Templates
can be defined and/or activated in any order.  In other words, you can
have a template #1, 5, 13 and 32, but none of the others defined.
Templates remain defined until re-defined by another template.


DEFINING A TEMPLATE
-------------------
To create a template, when asked for a Host Command, simply type in the
Template similar to the following:

     [5:]S FORUM1 $?$^m

The [5:] at the beginning of the command indicates that you wish to
create template #5 with the following text as the template.  Remember, a
$?$ is considered a "macro" that will insert some text into this template
from another source.  Valid template numbers are 0-9, A-Z.  So, with this
in mind, all of the following template definitions are valid:

     [0:]S FORUM1 $?$^m
     [9:]S FORUM2 $?$^m
     [G:]S FORUM3 $?$^m


USING TEMPLATES
---------------
When you want to make a button "feed its command" into a template, you do
so in a format similar to defining a Template, but with a subtle
difference.  Don't include the colon (:) in the template reference.  An
example of this would be the following:

     [0]HELLO

This says, take the text "HELLO" and feed it into template number 0, and
send the final result to the host.  Note how simple it is to create and
reference templates by either using a colon or omitting it.

If you do not specify a Template reference in the format [#] at the
beginning of your Host Command, it will be considered to be a Normal Host
Command that does not get stuffed into any templates.  For completeness,
you may specify []HELLO to send the word "HELLO" to the host without
going through any templates (a "null" template).  So in other words,
using a [] or using nothing at all is the same thing, don't use any
templates for this host command.


CHAINING TEMPLATE RESPONSES
---------------------------
In the preceding examples we showed how you can feed the Host Command of
one button through a single Template definition.  This is the simplest
case of template processing.  As part of the big picture of templates,
you can chain the input of one template into another template, into
another, so on and so forth and then transmit the result of all composite
template stuffing to the Host as one big command.  After all is said and
done with template processing, the text buffer sent to the host can be
anywhere from 0-4095 characters in length.

To chain one template into another, use a format similar to the
following:

     [0372]HELLO

This feeds the word "HELLO" into template #0, then that result into
template #3, then that result into template #7, then finally the result
will be stuffed into Template #2. The output from Template #2  will then
be transmitted to the host.

You may specify from 0-36 different templates in any one chaining
operations.  You MAY use the same template more than once in the same
chain, like the following:

     [0370]HELLO

Note, that template #0 is used twice, both at the beginning and the end
of the processing.  This feature, potentially dangerous, is provided for
completeness and flexibility.


EMBEDDED TEMPLATES
------------------
You can embed the contents of one template into another template (or into
a Host Command) by using the special Text Variable $?x$ where "x" is the
Template number to insert.  This command functions much like the
insert-text variable $?$ does, but gives you a great deal more power and
flexibility.

If you specify to embed one template inside another, the embedded
template can contain text variables, pick-lists and other such things.
It can even have another embedded template in it as well, but that sub-
embedded template cannot have ANY text variables, or any special
commands, not even control characters!

To sum it up, an embedded template can have anything you want in it,
including other embedded templates.  All text variables in an embedded
template are expanded, as are pick lists, control characters and the
like.  If you have an embedded template INSIDE an embedded template, the
deepest embedded template will have NO text variable processing done on
it (i.e., the text is sent to the host verbatim, exactly as it appears in
the template).

If a template that is referenced is not yet defined, the template embed
command will be skipped (i.e., blank) providing that the embedded
template doesn't refer to a Radio Group. Radio Groups are "dependencies"
in this manner.  Anything that tries to embed a Template from a Radio
Group will not be processed if a template in that area hasn't been
defined yet.  Embedded templates from Check Box Groups can be skipped if
none of the check-boxes are active.


LISTS, VARIABLES AND CONTROL CHARACTERS
---------------------------------------
You may use Text Variables, Pop-Up Pick Lists and Control Characters
anywhere in any template definition or reference.  You are limited such
that, a text variable is translated to its real value when the template
is being processed, not after all templates are processed.  The net
result of this is, you cannot use one template to construct another
template's pick- list, text variables, or the such.

In other words, you cannot nest Text Variable definitions, Pop-Up Pick
Lists , or Control Characters.  You can have these commands in any or all
templates used in a template chain, but they are independent.


TEMPLATE CHAIN EXAMPLES
-----------------------
Below are several examples of different template setups. These are
intended to give you ideas on how templates may be used:

  Example #1:

     [0:]D $?$ Z^m     ... Used to download a file with Zmodem
     [1:]D $?$ X^m     ... Used to download a file with Xmodem

     [0]FILENAME.ZIP   ... Use this with #0 to download Zmodem
     [1]FILENAME.ZIP   ... Use this with #1 to download Xmodem

In this example, template #0 is used for downloading with Zmodem.
Template #1 is for downloading with Xmodem.  Depending on which
FILENAME.ZIP button you click on, you might download it with one protocol
or with another.  It all lies on which template you reference.  The text
transmitted to the host if you clicked on the buttons could be either:

     D FILENAME.ZIP Z^m

          - or -

     D FILENAME.ZIP X^m


  Example #2:

     D $?2$ $?1$^m    ... Make this the "Download Now" button

     [1:]X            ... Radio Button #1   (X-Modem)
     [1:]Y            ... Radio Button #2   (Y-Modem)
     [1:]B            ... Radio Button #3   (Y-Modem Batch)
     [1:]Z            ... Radio Button #4   (Z-Modem)

     [2:]FILENUM1.ZIP ... Radio Button to download file #1
     [2:]FILENUM2.ZIP ... Radio Button to download file #2
     [2:]FILENUM3.ZIP ... Radio Button to download file #3

This example is a bit more involved.  It brings the concept of Radio
Buttons into the picture, which is part of the Button command. A Radio
Button is like having a list of options on your screen, only one of which
can be selected at any
one time.  When using    ЩЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЛ
templates with Radio     К   Protocols            Download which file?  К
Buttons, you can quickly К   ФФФФФФФФФ            ФФФФФФФФФФФФФФФФФФФФ  К
and elegantly define a   К   X X-Modem             ў File #1            К
menu that can do one     К   ў Y-Modem             X File #2            К
thing in one mode, or    К   ў Y-Modem Batch       ў File #3            К
something totally        К   ў Z-Modem                                  К
different in another     К кФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФП К
mode.  An example of     К Г           Begin Download Now!            Г К
the above menu might be  К РФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФй К
as follows:              ШЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭМ

In the preceding example #2, a group of Radio Buttons were used on the
right side of the screen to determine which file should be downloaded.
In that example, there was no ability to specify an arbitrary filename to
download.  You were only allowed to download one of three given files.
What would be perfect, would be to have the ability to pop-up a question
to the user asking what filename they wanted.  The solution is easy,
insert a text-variable that hasn't been defined yet!  To illustrate, the
above example could be modified to accommodate this as follows:

     D $?2$ $?1$^m    ... Make this the "Download Now" button

     [1:]X            ... Radio Button #1   (X-Modem)
     [1:]Y            ... Radio Button #2   (Y-Modem)
     [1:]B            ... Radio Button #3   (Y-Modem Batch)
     [1:]Z            ... Radio Button #4   (Z-Modem)

     [2:]FILENUM1.ZIP ... Radio Button to download file #1
     [2:]FILENUM2.ZIP ... Radio Button to download file #2
     [2:]FILENUM3.ZIP ... Radio Button to download file #3
     [2:]$FILENAME$   ... Radio Button to download ANY file

The screen might appear something like this:

        ЩЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЛ
        К   Protocols            Download which file?  К
        К   ФФФФФФФФФ            ФФФФФФФФФФФФФФФФФФФФ  К
        К   X X-Modem             ў File #1            К
        К   ў Y-Modem             X File #2            К
        К   ў Y-Modem Batch       ў File #3            К
        К   ў Z-Modem         кФФФФФФФФФФФФФФФФФФФФФФП К
        К                     Г    Enter Filename    Г К
        К                     РФФФФФФФФФФФФФФФФФФФФФФй К
        К кФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФП К
        К Г           Begin Download Now!            Г К
        К РФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФй К
        ШЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭМ

NOTE:  To get the radio button graphic show above, an Icon Button
       must be used.  The empty circle is an icon, and the filled in
       circle is a hot icon.  Refer to Section 5.3.7.

Note the addition of the Enter Filename button.  If the user clicked on
that button, it would first try to replace $FILENAME$ with a text
variable.  It will find that such a variable does not exist, and will
then pop-up the following question on the screen:

       ЩЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЛ
       К                 Enter "FILENAME"                 К
       К кФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФП К
       К Г л                                            Г К
       К РФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФФй К
       ШЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭМ

If the user typed in DEMOFILE.TXT, then that filename is inserted where
$FILENAME$ was, resulting in (for example):

     D DEMOFILE.TXT Z^m

This is only an example, your mileage may vary.


MORE ABOUT TEMPLATES
--------------------
When you use the $?$ text variable inside a template definition, you are
not limited to using it only once.  In fact, you can use it as many times
in your template definition as you wish.  This can be useful under many
circumstances where the user might have to enter the same thing twice.





=====================================================================
==                TEXT VARIABLE CREATION, AND QUERY                ==
=====================================================================

As mentioned in preceding sections, Text Variables were described as
either pre-defined variables, or as User Variables.  Pre-defined
variables are variables that RIPscrip products know things about "out of
the box".  They will always know what the variables mean, from the day
you install the software.  User Variables are variables that the user of
RIPscrip products defines, and teach it new things it doesn't already
know.


WHAT ARE USER VARIABLES?
------------------------
A User Variable is a Text Variable that RIPscrip doesn't know exists.
They are custom-defined text variables that contain information that the
terminal user will fill in.  If a variable already contains information,
a host will be automatically told (if told to do so) what that variable
contains without the user having to intervene (i.e., transparent
information exchange).

Examples of Text Variables might be:

     $FULL_NAME$    ... What is your full name?
     $COMPANY_NAME$ ... What company do you work for?
     $AGE$          ... How old are you?
     $DATEOFBIRTH$  ... What is your Date of Birth?
     $PHONENUMBER$  ... What is your Day-time phone number?

User Variables will "keep track" of these responses for you, in the
terminal program database.  You can tell the terminal to store these
values permanently, or they may be active only during the current
session, or they may be defined as temporary where they are not stored
for more than a brief moment.

NOTE:  This ability is configurable so that information exchange can
       be either interactive, or automatic.  Automatic transfer of
       information does NOT prompt the user with the information
       unless the variable has not yet been defined.  If it has not
       been defined, a pop-up question will appear asking the user
       a particular question, thus defining the text variable.

If the exchange is interactive, the data is displayed in a pop-up editor
box, asking you if the information is correct.  If it is, press ENTER and
the retrieved information is sent to the host for you.  If it is not
correct, or it has not been created yet, just type it in and press ENTER
and it will be saved automatically, and sent to the host all at once.


HOW CAN USER VARIABLES BE IMPORTANT?
------------------------------------
Lets take an example.  You are the system operator of a large RIPscrip
host.  As you have read, RIPscrip can take advantage of database-like
ability on the terminal end.  If you can alter your host to ask questions
with RIPscrip Text Variables built in, you can have the terminal calling
your host automatically fill in questionnaires.  Imagine if a user could
sign-up on your host without having to type more than a single keystroke
(i.e., "YES, this information is correct").  With User Text Variables,
you can do this very thing.


CREATING USER VARIABLES
-----------------------
There are two ways of defining User Text Variables in RIPaint.  You can
use either the Define Text Variable command, or you can use Text Variable
Queries, as described in the next section.


DEFINING TEXT VARIABLES
-----------------------
The RIPscrip command Define Text Variable is by definition, an
interactive command with the user.  The RIPscrip command will attempt to
define a User Variable.  This variable is some piece of information that
the system operator deems important.  You may specify a question, a
default response, and how many characters long the response may be.

Once the terminal has received a define command, the terminal pops up an
appropriate question box on the user's screen, asking him the desired
question that should be saved to a particular Text Variable.  If you did
not specify a question, a default question is used (i.e., "Enter <name of
text variable>").

Once the user has entered his response, it is recorded and saved.  How
long it is stored depends on what the host told the terminal.  The host
can tell the terminal "save this on your hard disk forever".  The host
may also tell the terminal "don't save this to disk, but remember this
value until you exit RIPterm".  You also have the option of saying "don't
remember this value at all, just pop up a question, and send the value to
me NOW" - i.e., don't save it at all, just enter it and send it to the
host).


QUERYING TEXT VARIABLES
-----------------------
Now that you know how to define information on the terminal, you need to
know the last method of asking the terminal about text variables.  This
feature is called "Data Query".

Data Query is a generic query command that can ask the terminal one or
more questions, and tell it how to transmit the information back to the
host.  This command is for use in non-button situations where you do not
want to wait until the user clicks on a button to get your data back.

Data Query is a special RIPscrip command that can be used to ask the
contents of one or more Text Variables.


EXAMPLES OF TEXT VARIABLE QUERY
-------------------------------
Lets take a simple example.  You wanted to ask the terminal program some
address information.  You could do this with the following query
(remember, the query also tells the terminal HOW to send the data back to
the host):

     $FULL_NAME$^m$COMPANY$^m$ST_ADDR$^m$CITY$, $STATE$ $ZIP^m

This would query the terminal the contents of 6 text variables, and
format them in a manner similar to any normal address on an envelope.
The results of this query might send the following back to the host :

     Joe Sixpack
     ACME Corporation
     13631 Palindrome Parkway
     Surf City, CA 92649

If a text variable is queried, and it has not been defined yet, a pop-up
question will appear asking the user to fill in the information.