Xref: math.fu-berlin.de comp.graphics:21993 comp.os.linux:36195 alt.bbs:12219
Newsgroups: comp.graphics,comp.os.linux,alt.bbs
Path: gilly!math.fu-berlin.de!news.dfn.de!darwin.sura.net!haven.umd.edu!uunet!nwnexus!mpdillon
From: mpdillon@halcyon.com (Michael Dillon)
Subject: NAPLPS technical specs
Message-ID: <1993Apr11.075908.2829@nwnexus.WA.COM>
Sender: sso@nwnexus.WA.COM (System Security Officer)
Organization: The 23:00 News and Mail Service +1 206 382 MAIL (382-6245)
Date: Sun, 11 Apr 1993 07:59:08 GMT
Lines: 34

The following 6 messages contain an article which describes the NAPLPS
protocol for on-line graphics in complete technical detail given the
limitations of ASCII. This document is based on the official CSA/ANSI/ISO
specifications documents but attempts to use more normal terminology
and clearer examples.

NAPLPS is a graphics protocol meant to be used over point-to-point links
like modems and is designed to be efficient enough to be useable at
2400 bps. Currently it is used by Videotex services and Prodigy but more
and more BBSes are using it as well. There is not yet any freeware
source code available for a NAPLPS terminal server so I wrote this
document to help interested programmers get started.

X-windows is not normally used over modems because of the overhead in 
the protocol. I suspect that the NAPLPS technology could be used to 
improve X throughput in an environment where the terminal server
runs on a UNIX host and transmits NAPLPS over a modem link instead of
using a frame buffer on that host. This should provide good performance
as long as bitmaps are not required to be transmitted, so it will not
work for any X-client but it should extend the range of usefullness of X.

I have started a NAPLPS area on SIMTEL20 and over the next month or
so, a variety of MS-DOS shareware supporting NAPLPS will appear there
including 3 shareware terminal programs, 1 shareware drawing program,
1 shareware BBS, and several utilities for image format conversions.
I just checked wuarchive last night and it is in mirrors/msdos/nalps.
Hopefully the spelling will soon be corrected to naplps. This document
will also be going to SIMTEL20.

Copyright 1993 by Memra Software Inc.
All Rights Reserved
This is the March 1993 release of this document.

written by Michael Dillon
           C-4 Powerhouse, RR #2
           Armstrong, B.C.   V0E 1B0
           CANADA

     BBS: 1-604-546-2705 - this has NAPLPS shareware and art
 Fidonet: 1:353/350
Internet: mpdillon@halcyon.halcyon.com
     CIS: >INTERNET:mpdillon@halcyon.halcyon.com

you can mail me questions and errata which will be
answered/fixed in the next release of this document.

------------------------------------------------------------
DISCLAIMER
This document is NOT the NAPLPS standard. The standard is
defined in an ANSI/CSA document which can be purchased from
one of those organizations. If you are creating commercial
products based on NAPLPS, then you should buy those
documents. This document is intended to clarify the
standards document and present the information using a
clearer terminology than in the standard. If there is any
conflict between this document and the standard, then follow
the standard and let me know so I can correct this document.
I take no responsibility whatsoever for any errors,
omissions or opinions in this document. It is NOT intended
as a guideline for creating commercial products, it is only
intended as an educational document for those who are unable
to obtain the standard or unwilling to decipher its
terminology.
------------------------------------------------------------

     This is a specification for the on-line graphics format
known as NAPLPS.  These specs are based on the ANSI/CSA
standards document that defines NAPLPS which is available
from ANSI (American National Standards Institute) as
document # X3.110-1983. They have offices in many American
cities and their head office is in New York. The identical
document is available from the CSA (Canadian Standards
Association) as document # T500-1983 and supplement # 1-
1991. Note that the supplement (which clarifies
proportionally spaced text among other things) is not
available from ANSI. I have also gleaned information from a
4-part series of articles published in Byte magazine in
February, March, April and May of 1983. There are a total of
55 pages in the 4 articles. I have also used the MGE editor
and PP3 terminal program from Microstar to experiment and
figure out the details of the coding scheme. As far as I
know, PP3 is the only shareware NAPLPS terminal program that
fully implements the NAPLPS spec including DRCS (redefinable
fonts) and bitmaps.
     My knowledge of NAPLPS comes from many sources. I first
read about Telidon in 1979 or 1980. I was able to use
Telidon demo systems several times including one short
layover at Vancouver International airport in 1982 when I
spent 3 hours playing with a public Telidon terminal. It
would have been a boring 3 hours without that system. I also
have the official CSA specs. I have used the MGE editor and
used it to create test images to poke around in with DEBUG.
I have some Japanese utilities to print out a text version
of NAPLPS codes and reassemble into NAPLPS from the text
specs. I have the BYTE articles. I have used the PP3
terminal program and CTLINK and Turmodem. And I have a
collection of images from Japanese ham radio operators and
Montreal schoolchildren and from various NAPLPS services.
     You should note that this spec is NOT the definitive
spec. I am writing it for electronic distribution in order
to encourage more people to produce software that supports
NAPLPS graphics. I hope that some of you will use it to
create NAPLPS utilities, write NAPLPS doors for BBSes, add
NAPLPS support to your terminal programs or BBS software,
etc. At the end of this document is a resource list with
phone numbers and Fidonet addresses where you can get more
info and samples of NAPLPS art.

Overview

NAPLPS
NAPLPS (North American Presentation Layer Protocol Syntax)
is a communications protocol that extends ASCII to allow for
the EFFICIENT transmission of picture and text information
over telecommunications channels such as modems. It does not
contain the commonly used ANSI protocol but it does include
similar capabilities and it could be used simultaneously
with ANSI although most NAPLPS terminal programs do not
currently support ANSI.
     A NAPLPS image is transmitted in a manner that is
independent of the resolution and color capabilities of the
receiving display. There are NAPLPS terminal programs
available for Amiga, Macintosh and PC's with CGA, Herc
monochrome, EGA, VGA and other display resolutions.
     This is accomplished by sending instructions to the
terminal program that tell it how to draw the required
pictures and text. Even bitmap pictures are transmitted in a
scalable fashion.

OSI
The OSI (Open Systems Interconnect) model of data
communications divides up the various aspects of an
electronic conversation into 7 layers. NAPLPS is a protocol
to be used at level 6 which is the presentation layer. Such
things as error-control are handled at lower layers and user
interaction is handled at level 7 (Application Layer).

     APPLICATION - this is the interface provided by the
                   actual application program or BBS system.
     PRESENTATION - this layer encodes, transmits and
                    decodes data in such a way as to
                    preserve its meaning. Examples are
                    ASCII, ANSI, NAPLPS
     SESSION - this layer establishes and maintains a
               communications session. This is the process
               of logging in and presenting a password.
     TRANSPORT - This layer provides a virtual circuit
                 from terminal to host. Data could travel
                 across several different networks in lower
                 layers.
     NETWORK - This is the layer where routing, switching,
               bridging and gating occur.
     DATA LINK - This layer handles flow control, error
                 detection and correction.
     PHYSICAL - This is the layer where you find cables
                carrying electrical or optical signals



Telidon
NAPLPS is an extension of the experimental Telidon system
that was used in Canada in the late 1970's and early 1980's.
For more info, look up a book called Gutenberg Two. It also
includes mosaic bitmap capabilities from early European
Teletext systems.

The Basics
     NAPLPS uses the 128 7-bit ASCII codes in such a way as
to be 100% compatible with any system which transmits pure
ASCII. It adds additional functions by making use of the 128
high-ASCII codes which are used on PC's for graphics
characters. This means that NAPLPS terminal programs can't
display high-ASCII unless the high-ASCII symbols are defined
as a downloadable character set and font selection codes are
transmitted prior to use of high-ASCII. In this, it is much
like Microsoft Windows which also does not use high-ASCII
for much the same reasons.
     The additional capabilities include color mapping, 24-
bit color spec, line, box, circle, arc, polyline, polygon,
spline curve, bitmaps, downloadable fonts, macros, input
fields, line patterns, fill patterns, etc. All this is
accomplished in very compact manner so that reasonably
complex NAPLPS images are usually around 5 K bytes. The most
complex image I have seen is 22 K bytes and contains a
detailed picture of a mountain range, some trees, a horse
with a native rider wearing a Hudsons Bay jacket. This spec
is efficient enough to make it reasonable at 2400 bps if
complex images are limited to Art Galleries. At 9600 bps and
above, performance is not an issue.

ISO (International Standards Organization)
     NAPLPS was designed to fit in with and be compatible
with other coding schemes that are ISO standards such as 7-
bit ASCII and the various Latin based alphabetical character
sets.  For more info, read up on MS-Windows character sets
or HP Laserjet character sets as these are also designed for
ISO compatibility.
     There is currently a modification to the spec to
include JPEG compressed bitmaps in the standard but that has
not yet been approved by ANSI or ISO. I will include that
info in this document as soon as I know more.

General Architecture

 Character Codes
     All NAPLPS info can be transmitted using either 7-bit
or eight bit codes. This allows NAPLPS to be transmitted
over links that require a parity bit. When 7-bit codes are
used, then the extended codes are selected by shifting the
extended codes into the 7-bit ASCII code table. This is
similar to a keyboard shifting between upper and lower case
letters. They are different symbols, but shifting (and Ctrl
and Alt) allows the same key to be used.
     In fact there are several different code sets that can
be shifted in. The Primary code set is 7-bit ASCII. Then
there is the PDI (Picture Description Instruction) set, the
Supplementary set which contains accented characters and
other symbols, the Mosaic set which supports the old
Teletext bitmap format, the Macro set which invokes
predefined macros, and the DRCS or Dynamically Redefinable
Character Set which is used for non-Latin languages such as
Russian, Thai, Inuktitut. When using 8-bit codes, things are
simplified somewhat since two of these code tables are
accessible without shifting.
     Whenever the numeric value of a character code is given
in this document, it will be in hexadecimal.

Coordinates
     All pictures are drawn and positioned using Cartesian
(X,Y) coordinates within the Unit Screen. This is the upper
right quadrant of the Cartesian plane between (0,0) and
(1,1)
              |-------|(1,1)
              |       |
              |       |
              |       |
--------------|--------------- X axis
              |
              |
              |
              |
            Y axis
It is possible to specify 3 dimensional (X,Y,Z) coordinates
but at the current time, Z coordinates are to be ignored.
     On most video displays the aspect ratio is 4:3,
therefore drawings should be restricted to a Y coordinate
between 0 and .75. Anything extending beyond either the unit
screen or the actual display screen should be clipped. So,
the physical display screen extends from (0,0) in the lower
left hand corner to (1,.75) in the upper right hand corner.
NAPLPS terminal programs must always ensure that the entire
display is visible to the user. In resizable windowing
environments (MAC, Amiga, Windows) this means that when the
display window is resized the terminal program should
maintain the 4:3 aspect ratio and scale the current image.
     These coordinates are specified as binary fractions.
For instance, if 8 bits of precision are available, then the
binary number .10000000 is equal to 1/2. This is just
another way of saying that the binary number 10000000 (128
decimal) is 1/2 way between 0 and the maximum representation
in 8 bits namely 11111111 (255 decimal). If the precision is
widened to 16 bits then zeroes are added on the right so
that .1000 0000 0000 0000 still means 1/2 even though it now
represents the number 16,384 in the range of 0 to 32,768.

Stream of Data
     The NAPLPS codes are a stream of data coming into the
terminal program and should be acted on in sequence. Each
graphical object is drawn on top of those already visible.
Composite pictures and alphabetic characters can be created
by superimposing multiple characters and/or images.
     The specification is very flexible as far as PDI
operands is concerned. If the NAPLPS stream does not supply
the number of bits of precision that the receiving terminal
expects (less than defined DOMAIN), it simply pads the
binary fractions with zeroes on the right. This has the
effect of drawing the pictures with shorter operands using a
coarser grid. If there is more precision than the terminal
program is capable of using (defined DOMAIN is more precise
than the current display), it truncates the rightmost bits
of the binary fractions which has the effect of rounding the
more precise drawing specs to the grid size that the display
driver is capable of using.
     On the other hand, if the NAPLPS stream contains more
operands than would be expected with the currently defined
DOMAIN, then the drawing operation is repeated in some form,
i.e. lines become polylines, rectangles become bar charts,
arcs become spline curves.

Code Sets

Overview
     A sequence of NAPLPS codes is initiated by the 3
character sequence ESC 25 41 and is terminated by the
sequence ESC 25 40. Outside of this bracketing, all NAPLPS
terminal programs will support ASCII codes. Other support
such as VT100 and ANSI escape sequences is out of the scope
of the NAPLPS standard.
     The 128 possible 7-bit codes are divided into 32
character C-sets and 96 character G-sets. The two C-sets are
codes that perform control operations. C0 is the familiar
ASCII set of control characters, and C1 is a set of codes
that do cursor positioning, macro defining, etc.
     There are two types of G-sets, 94 character and 96
character. A 94 character G-set is really just a 96
character G-set in which the codes 20 and 7F are used for
<space> and <del>. The <space> code is therefore available
in both the ASCII and supplementary character sets. The
<del> code is treated as a null, i.e. discarded. G-sets are
selected in a two stage fashion. There are 6 possible G-
sets, but only 4 G-sets are current. The current G-sets are
named G0, G1, G2 and G3. In the default state, G0 is the
primary character set (ASCII), G1 is the PDI set, G2 has the
supplementary characters, and G3 the mosaics.

Shift and Escape Codes
     Five of the normal ASCII control characters are used in
code sequences that shift G-sets and C-sets in and out of
the active state. They are ESC (1B), SI (0F), SO (0E), SS2
(19) and SS3 (1D) or ESCAPE, SHIFT-IN, SHIFT-OUT, SINGLE-
SHIFT 2 and SINGLE SHIFT 3. The single shift codes are used
to temporarily escape the immediately following character.
     The normal control character set is always available.
The C1 set is accessed by setting the bit 8 if operating
over an 8-bit link, or by ESCaping the code and setting bit
7 on a 7-bit link. For instance, DEF MACRO is 80 when eight
bits are used, but it is ESC 40 when 7-bits are used. This
means that on an eight-bit link, the C1 set ranges from 80
through 9F, but on a seven-bit link it ranges from 40
through 5F. There are two sequences for activating the
control sets. C0 is activated by ESC 21 4B and C1 is
activated by ESC 22 46. These are somewhat redundant as
there are only two control sets at present.
     G-sets are a bit more complex. Firstly, there are two
positions in the code table that can hold a G-set, the lower
128 positions or G-left (GL) and the upper 128 positions or
G-right (GR). In a 7-bit environment, GL is the only active
G-set. If the 256 possible codes are arranged as 16 columns
of 16 rows, then the C and G sets are laid out as follows
with 2 columns (32 chars) for the C-sets and 6 columns (96
chars) for the G-sets.

       C0  GL          C1  GR
       --- ----------- --- ---------
       | | | | | | | | | | | | | | |

     By default GL contains G0 (ASCII) and GR contains G1
(PDI). G2 is the supplementary characters and G3 defaults to
the mosaics. You can activate G0 - G3 by selecting them into
the GL area as follows:
      0F (SI) selects G0
      0E (SO) selects G1
      ESC 6E selects G2
      ESC 6F selects G3
This works in both 7-bit and 8-bit mode. A single character
from G2 or G3 can also be selected by using SS2 or SS3, e.g.
      19 selects the 1 following char from G2
      1D selects the 1 following char from G3

In 8-bit mode, you can activate GR as follows:
      ESC 7E selects G1 (also ESC 6B)
      ESC 7D selects G2 (also ESC 6C)
      ESC 7C selects G3 (also ESC 6D)
The 6B, 6C, and 6D codes should be supported by terminal
programs for backward compatibility, but should not be used
in new image coding. ASCII codes cannot be selected into GR.
     While the G0-G3 sets have 4 default settings, the
actual G-sets in each of them can also be selected by a code
sequence. For the 94 character sets (ASCII and
supplementary) the code sequence is:
      ESC 28 42 selects ASCII into G0
      ESC 28 7C selects supplementary into G0
The code 28 could be one of:
      28 represents G0
      29 represents G1
      2A represents G2
      2B represents G3
If you are selecting one of the 96 character G-sets, use the
following sequence:
      ESC 2D 57 selects PDI's into G1
      ESC 2D 7D selects mosaics into G1
      ESC 2D 20 7A selects the macros into G1
      ESC 2D 20 7B selects the DRCS into G1
The code  2D could be one of:
      2D represents G1
      2E represents G2
      2F represents G3
If you are writing a terminal program you should also
support some older code sequences for backwards
compatibility. For 96 character G-sets the codes 29, 2A and
2B should be accepted as well as 2D, 2E and 2F. In addition
the single byte code 7A should be accepted as equivalent to
20 7A for macros and 7B should be accepted as equivalent to
20 7B for DRCS.
     If an unknown terminating code is received for a
sequence, then the entire sequence should be discarded.
     If a given G0, G1, G2 or G3 set is currently invoked
into either GL or GR, then the new contents of that set take
effect immediately. For instance, if you have invoked the
default G2 (supplementary) into GL via ESC 6E and you then
designate the macro set as the new contents of G2 via the
sequence ESC 2E 20 7A then it is NOT necessary to re-invoke
G2 by another ESC 6E.

G-Sets
     The 94 symbols of the primary character set are
identical to ASCII. The actual font used is implementation
dependent but it must be scalable. There is no guarantee
that a font is legible at all resolutions. The cursor is
automatically advanced when a character from this set is
displayed, according to the current TEXT settings. Note that
characters that are overprinted do NOT wipe out the image of
the original character as in most text mode displays. Both
characters remain visible.
     The 94 symbols of the supplementary character set are
not ASCII and therefore must be described in this document.
Again, these are scalable and the font used is
implementation dependent. The codes from 21 through 3F and
from 51 through 7E are displayed in the same way as ASCII,
namely, the cursor is advanced after they are displayed. The
codes from 41 through 4F are non-spacing accent character
used to create composite characters. Normally, a composite
character is formed by first displaying the non-spacing
accent, and the letter. The best way to see these is to get
MGE and display them at a reasonably large size to see
details on some of the weird ones. They are also displayed
in the standard documents and in the 1st article in the
February 1983 issue of BYTE.

     Supplementary Character Set
     ---------------------------
     21 upside down exclamation as in Spanish
     22 cents symbol
     23 British pound symbol
     24 dollar sign ASCII 24
     25 Japanese yen symbol
     26 number sign ASCII 23
     27 subsection symbol PC code 15
     28 generic currency symbol like X with o in middle
     29 left single quote
     2A left double quote
     2B left guillemot like << PC code AE
     2C left arrow like <- PC code 1B
     2D up arrow PC code 18
     2E right arrow like -> PC code 1A
     2F down arrow PC code 19

     30 degree symbol PC code F8
     31 plus or minus PC code F1
     32 superscript 2 PC code FD
     33 superscript 3
     34 times symbol like x
     35 greek mu PC code E6
     36 paragraph mark PC code 14
     37 centered dot PC code F9
     38 division PC code F6
     39 right single quote
     3A right double quote
     3B right guillemot like >> PC code AF
     3C looks like 1/4
     3D looks like 1/2
     3E looks like 3/4
     3F upside down question mark as in Spanish

     The following 16 codes are non-spacing accents
     40 vector overbar (a right-pointing vector arrow
                        just above the top of capitals)
     41 grave accent
     42 acute accent
     43 circumflex accent
     44 tilde
     45 macron or overbar
     46 breve like a ) laying on its side with points up
     47 dot positioned over a letter
     48 diaresis or umlaut
     49 overprinting slash /
     4A small ring or circle positioned over a letter
     4B cedille as in French garcon
     4C underscore
     4D double acute accent
     4E ogonek (mirror image of cedille)
     4F caron (little v above a letter)

     50 em dash
     51 superscript 1
     52 registered trademark R in a circle
     53 copyright C in a circle
     54 TM superscripted
     55 musical eighth note PC code 0D
     56 horizontal box drawing line PC code C4
     57 vertical box drawing line PC code B3
     58 / from bottom left to upper right of char field
     59 \ from top left to bottom right of char field
     5A filled triangle below code 58
     5B filled triangle below code 59
     5C looks like 1/8
     5D looks like 3/8
     5E looks like 5/8
     5F looks like 7/8

     60 greek Omega PC code EA
     61 AE ligature
     62 Icelandic eth D with - through the vertical
     63 feminine ordinal PC code A6
     64 H with horizontal stroke at 3/4 height
     65 crossbar box drawing character PC code C5
     66 IJ ligature
     67 L with a dot centered vertically and horizontally
     68 L with a short / through the vertical
     69 O with a /
     6A OE ligature
     6B masculine ordinal PC code A7
     6C Icelandic thorn like P with extended vertical
     6D T with short horizontal stroke
     6E Lappish capital eng looks like nj
     6F looks like 'n

     70 greek kappa
     71 small ae ligature
     72 small 62
     73 mirror image of 6 with stroke
     74 small 64
     75 i with no dot
     76 small 66
     77 small 67
     78 small 68
     79 small 69
     7A small 6A
     7B German esset similar too greek beta but not same
     7C small 6C
     7D small 6D
     7E small 6E


The PDI set

Overview
     This is the heart of NAPLPS, the graphical drawing
primitives. There are eight environment codes (RESET,
DOMAIN, TEXT, TEXTURE, SET COLOR, WAIT, SELECT COLOR and
BLINK) which set the graphics environment and 6 different
object types (POINT, LINE, ARC, RECTANGLE, POLYGON,
INCREMENTALS). Each type of object has 4 different forms in
which it can be drawn. These codes take up the first 32
positions in the PDI set. The other 64 positions are used to
encode parameters and co-ordinates for these primitives. The
PDI set is not really a character set, but a set of function
calls with parameters.
     A PDI (Picture Description Instruction) begins with a
code selecting one of the primitives. These codes can all be
distinguished by the fact that bit 7 is equal to zero. This
code is then followed by one or more codes containing
parameter data. The PDI is terminated whenever a code that
is not data is encountered, i.e. another PDI or any code
outside of the PDI's G-set. The exceptions are the control
codes 00 through 06, and 10 through 17 which do not affect
the OSI presentation layer and are therefore ignored if
encountered. Also, macro invocation does not terminate a PDI
so macros can be used to provide all or some of the
parameter codes. In certain cases, invalid data will require
that the PDI and all data bytes up to the termination of the
PDI are to be discarded with no action taken.
     There are 4 types of parameters. Fixed format
parameters are specific to the PDI which uses them.
Bitstrings are also specific to a PDI which uses them but
they are encoded in bits 6 through 1 of a string of
characters. Single value operands take up from 1 to 4 bytes
of data depending on the current DOMAIN setting. They are
unsigned integers of 6, 12, 18, or 24 bits with the most
significant bits being received first. Multi-value operands
are from 1 to eight bytes of data depending on the current
DOMAIN setting. These are primarily used for Cartesian
coordinates but can also encode color information. The
coordinates are signed integers encoded as follows:

           X     Y               X   Y   Z
     8 7|6 5 4|3 2 1|       8 7|6 5|4 3|2 1|
    -----------------      -----------------
    |?|1|S| | |S| | |      |?|1|S| |S| |S| |
    -----------------      -----------------
    |?|1| | | | | | |      |?|1| | | | | | |
    -----------------      -----------------
        . . .                  . . .
    -----------------      -----------------
    |?|1| | | | | | |      |?|1| | | | | | |
    -----------------      -----------------

In the normal 2 dimensional case, the first byte contains
the sign bit and the 2 most significant data bits. Second
and subsequent bytes contain 3 data bits. Therefore these
coordinates can range from 3 bit to 24 bit signed integers.
These integers are fractions of the unit screen. For
example, if the DOMAIN setting specified 3 bytes for multi-
value operands then the unit screen would range from 0 (000
000 000) to 256 (011 111 111) units in width. Negative
coordinates would be clipped as they are not on the screen.
They are also used to specify relative coordinates from the
current drawing point.
     When a multivalue operand is used to represent a color,
it is coded as follows:
         G R B G R B
     8 7|6 5 4|3 2 1|
    -----------------
    |?|1| | | | | | |
    -----------------
    |?|1| | | | | | |
    -----------------
        . . .
    -----------------
    |?|1| | | | | | |
    -----------------
The color value is decoded by concatenating the bits for
each of the Green, Red and Blue values. This color value is
again treated as a binary fraction so that with DOMAIN
settings for 3 bytes the range of color values would be from
0% (00 00 00) to 100% (11 11 11).
     There are two special colors: nominal white is the
palette entry 011...11 and has a color value of all ones;
nominal black is palette entry 0 and has a color value of
all zeroes. Note that this places the color white in the
middle of the palette.
     Whenever the required number of data bytes are not
received, the receiving system should pad the data with zero
bits to the correct length. This gives transmitting systems
an opportunity to make transmission more efficient by not
transmitting the trailing zero bits on data operands. Zero
bits would look like this (1 000 000) in 7 bit form. On the
other hand, if more data bytes are received than required,
the receiving system should assume that the current PDI is
to be repeated with a new set of data bytes unless otherwise
specified for a particular PDI.

The PDI primitives are as follows:
      20 RESET - selective reset
      21 DOMAIN - sets graphical environment
      22 TEXT - sets default text attributes
      23 TEXTURE - sets line and fill patterns

      24 POINT SET ABS
      25 POINT SET REL
      26 POINT ABS
      27 POINT REL

Lines and Polylines
      28 LINE ABS
      29 LINE REL
      2A SET & LINE ABS
      2B SET & LINE REL

Arcs, Circles, Splines
      2C ARC OUTLINED
      2D ARC FILLED
      2E SET & ARC OUTLINED
      2F SET & ARC FILLED

Rectangles and histograms
      30 RECT OUTLINED
      31 RECT FILLED
      32 SET & RECT OUTLINED
      33 SET & RECT FILLED

Polygons

      34 POLY OUTLINED - polyline
      35 POLY FILLED - polgon
      36 SET & POLY OUTLINED - polyline
      37 SET & POLY FILLED - polygon

      38 FIELD - define bitmap field or input field
      39 INCREMENTAL POINT - color bitmap
      3A INCREMENTAL LINE - scribble
      3B INCREMENTAL POLY FILLED - filled scribble

      3C SET COLOR - specify an RGB color
      3D WAIT - timed pause
      3E SELECT COLOR - set color mode
      3F BLINK - palette animation




Default graphics environment
     The following setting are the default upon starting the
program or immediately after receiving an NSR (non-selective
Reset).
     - GL contains the G0 set
     - in 8-bit mode, GR contains the G1 set
     - G0 contains the ASCII set
     - G1 contains the PDI set
     - G2 contains the supplementary set
     - G3 contains the mosaic set
     - drawing color is nominal white
     - color mode is 0
     - single value operands are 1 byte
     - multi-value operands are 3 bytes
     - multi-value co-ordinates are 2 dimensional with Z=0
     - logical pel is 0 wide and 0 high with origin
       point at the lower left. This makes the logical
       pel size equivalent to 1 physical pixel.
     - text rotation is 0 degrees (horizontal)
     - character path moves to the right
     - intercharacter spacing is 1
     - interrow spacing is 1
     - cursor and drawing point move together
     - cursor style is underscore and is invisible
     - character field is 1/40 wide and 5/128 high
     - line texture is solid
     - no outlines are drawn on filled objects
     - fill pattern is solid
     - fill pattern mask is 1/40 wide and 5/128 high
     - the active field corresponds to the unit screen
     - underlining is off
     - word wrap is off
     - scrolling is off
     - reverse video is off
     
The following conditions are found at startup but are NOT
created by receipt of an NSR:
     - palette is in default condition (see SET COLOR PDI)
          1/2 evenly spaced grey scale
          1/2 evenly spaced hues
     - blinking is off
     - no macros are defined
     - no DRCS characters are defined (all <spaces>)
     - no programmable fill masks are defined
     - no unprotected fields are defined
     
     

RESET - 20
     This PDI can selectively reset parts of the graphics
environment their default values. It is followed by two
fixed format bytes which specify what is to be reset. The
resets are to be performed in the following order:
     DOMAIN - If bit 1 of the first byte is 1, the domain
              parameters are reset.
     COLOR - specified by bits 3 and 2 of the first byte
                0 0 nothing
                0 1 set color mode 0, reset to default
                    palette and set drawing color to white
                1 0 set color mode and reset to default
                    palette. If current color mode is 0
                    then treat same as 1 1
                1 1 set color mode 1, reset to default
                    palette and set drawing color to white
     SCREEN - specified by bits 6, 5 and 4 of the first byte
                 0 0 0 nothing
                 0 0 1 clear screen to nominal black
                 0 1 0 clear screen to current drawing color
                 0 1 1 set border to nominal black
                 1 0 0 set border to current drawing color
                 1 0 1 clear screen/border to drawing color
                 1 1 0 clear screen to drawing color and set
                       border to nominal black
                 1 1 1 clear screen/border to nominal black
              Note that most modern video displays do not
              allow manipulation of the border or overscan.
     TEXT - If bit 1 of the second byte is 1, then the
            cursor is sent home to the top left of the
            display area and all text parameters from the
            TEXT PDI, the C1 set and the active field are
            reset to their defaults.
     BLINK - If bit 2 of the second byte is 1 then all blink
             processes are terminated.
     FIELDS - If bit 3 of the second byte is 1 then all
              unprotected fields are changed to protected
              and all field definitions except the active
              field are lost. The display is not changed. If
              the terminal program has any internal data
              structures for editing and transmitting field
              contents, they should be cleared as well.
     TEXTURE - If bit 4 of the second byte is 1 then all
               line texture and pattern fill attributes are
               set to the default. The four programmable
               pattern masks are not changed.
     MACRO - If bit 5 of the second byte is 1 all macros are
             cleared including transmit macros.
     DRCS - If bit 6 of the second byte is 1 then all DRCS
            characters are cleared by setting all DRCS
            characters to be equivalent to the <space>
            character.
If one or more of the data bytes are missing, then the RESET
will proceed as if it had been received with all zero bits.
If extra bytes are received, they will be discarded.

DOMAIN - 21
     This command sets the precision of single and multi-
value parameter data, the number of Cartesian coordinates
and the logical pel size. The first parameter is fixed
format and that is followed by a multi-value operand to set
the logical pel size.
     If bit 6 is 0, then X,Y coordinates are transmitted, if
1 then X,Y,Z coordinates are transmitted. The default
setting is X,Y. If 3-dimensional X,Y,Z is selected, then the
Z coordinates should be ignored at the present time.
     The length of a multi-value operand is encoded in bits
5, 4 and 3 as follows:
         0 0 0   1 byte
         0 0 1   2 bytes
         0 1 0   3 bytes (the default)
         0 1 1   4 bytes
         1 0 0   5 bytes
         1 0 1   6 bytes
         1 1 0   7 bytes
         1 1 1   8 bytes

     The length of a single value operand is encoded in bits
2 and 1 as follows
         0 0    1 byte (the default)
         0 1    2 bytes
         1 0    3 bytes
         1 1    4 bytes
     The multi-value data following the fixed format byte is
used to define the width and height of the logical pel which
is the basic brush used in all the drawing operations. The
logical pel will always be at least 1 real pixel in size,
but may be larger. The width and height of the logical pel
must be rounded UP to the nearest real pixel size. For
instance, if the unit coordinates map to 1.3 real pixels in
width, then the logical pel should be 2 pixels wide. The
default size is 0,0 which makes the logical pel 1 physical
pixel in both width and height. The logical pel cannot
become invisible.
     Unlike many graphical environments that draw pictures
with a logical brush, the logical pel is NOT centered on the
current drawing point. Instead the current drawing point is
located as follows:
           +,- ------- -,-
               |     |
               |     |
           +,+ ------- -,+
For instance, if the width is .01 and the height is -.01
then the upper left corner of the logical pel is always
aligned with the drawing point. To see this graphically,
draw a circle in MGE with a larger pel size. Then copy it
and use "Edit To" to change the copy to a smaller pel size
and a contrasting color.
     The data bytes defining the logical pel are interpreted
according to the multi-value operand settings in the fixed
format byte immediately preceding them. Any additional data
bytes after the logical pel size are to be ignored. If there
are no data bytes after the fixed format byte, then the
logical pel size is unchanged.

TEXT - 22
     This command sets up the current parameters which
affect how text is displayed. This includes ASCII,
supplementaries, DRCS characters and mosaics. The parameters
are two fixed format bytes followed by a multi-value
character field size.
     Bits 6 and 5 of the first byte determine how far to
move the cursor after displaying a character or after a
<space>, <backspace> or <tab> character. The cursor is
always moved parallel to the character path and the distance
is a multiple of the height or width of the character field,
depending on which one is parallel to the character path.
This intercharacter spacing is defined as follows:
       0 0   1 (the default)
       0 1   5/4  i.e. 1.25
       1 0   3/2  i.e. 1.5
       1 1   proportional spacing
When the intercharacter spacing is 1, the following
character field touches the previous one, but in 5/4 and 3/2
spacing there is a gap. This would be visible in color mode
2 if the current background color contrasted with the
underlying image. Proportional spacing is defined later in
this document.
     Bits 4 and 3 of the first byte define the character
path as follows:
       0 0   Right (the default)
       0 1   Left
       1 0   Up
       1 1   Down
After a character is displayed, the cursor moves in the
direction specified by the character path. This is
independent of the character rotation setting.
     Bits 2 and 1 of the first byte define the character
field rotation as follows:
       0 0   0 degrees (the default)
       0 1   90 degrees
       1 0   180 degrees
       1 1   360 degrees
The character field rotates about it's origin which is the
lower left hand corner regardless of the sign of the
character field dimensions. The rotation affects all 4
character G-sets as well as the cursor and the underline
produced in underline mode.
     Bits 6 and 5 of the second byte define the cursor style
as follows:
       0 0  Underscore (the default)
       0 1  Block
       1 0  Cross-hair
       1 1  Custom
The underscore is the full width of the character field at
the bottom of the field. The block cursor fills the entire
character field. The cross-hair is a vertical line and a
horizontal line that intersect at the center of the
character field. The custom cursor shape is implementation
dependent. When the underscore and block cursors are used,
the current drawing point aligns itself with the lower left
hand corner. When the cross-hair and custom cursors are
used, it aligns itself with the center of the character
field.
     Bits 4 and 3 of the second byte define how the
graphical drawing point is related to the text cursor as
follows:
     0 0  Move together (the default)
     0 1  Cursor leads
     1 0  Drawing point leads
     1 1  Move independently.
When the cursor and the drawing point move together, then
every text character displayed causes the drawing point to
be repositioned, and every graphical drawing primitive
causes the text cursor to be repositioned. The actual
alignment between cursor and drawing point is determined by
the cursor type. If the cursor leads, then the drawing point
follows it, but it does NOT follow the drawing point. If the
drawing point leads, then the cursor follows it bit it does
NOT follow the cursor. Whenever the cursor is repositioned
in such a way that part of the character field would fall
outside the unit screen, it is automatically repositioned so
that the entire character field is within the unit screen.
     Bits 2 and 1 of the second byte define the interrow
spacing as follows:
      0 0  1 (the default)
      0 1  5/4 i.e. 1.25
      1 0  3/2 i.e. 1.5
      1 1  2
These are interpreted as multiples of the character field
height or width, whichever is perpendicular to the character
path. Whenever <linefeed> or <vertical tab> is executed, the
new line position is calculated according to this spacing.
Note that the default single spacing causes the character
fields of the two rows to meet exactly, whereas 5/4, 3/2 and
double spacing leave a gap. Whenever a text character is
displayed, if the subsequent cursor movement would cause
part of the character field to be outside the unit screen or
outside the active field, then an automatic <carriage
return> <linefeed> is executed. If, by chance, a <carriage
return> <linefeed> is received right after that, then it is
ignored so that only one line positioning takes place.
     The character field dimensions are defined by the
multivalue operands following the two fixed format bytes. If
the width of the character field is negative, then the
characters are mirrored around the vertical center axis of
the character field. If the height is negative, then they
are mirrored around the horizontal center axis of the
character field. If no data bytes are received, then the
character field dimensions are not changed. The default
width of the character field is 1/40 of the unit screen and
the default height is 5/128 of the unit screen. This is like
saying that by default, the unit screen is 40 chars by 25
lines (although only 3/4 of the lines are visible, i.e. 19
lines).

TEXTURE - 23
     This command sets the line textures, fill patterns and
the outlining of filled areas. It is a fixed format byte
followed by a multi-value operand.
     Bits 6, 5 and 4 define the fill pattern as follows:
       0 0 0  Solid (the default)
       0 0 1  Vertical hatching
       0 1 0  Horizontal hatching
       0 1 1  Vertical and horizontal cross-hatching
       1 0 0  programmable mask A
       1 0 1  programmable mask B
       1 1 0  programmable mask C
       1 1 1  programmable mask D
The hatching lines are one logical pel wide (or high) and
are spaced one logical pel apart. The hatching patterns
should maintain registration from one object to the next if
the pel size for those objects is the same. Even when the
logical pel size is (0,0), the solid fill is still drawn.
The programmable fill masks are defined with the DEF TEXTURE
command. By default, they cause no fill in color modes 0 and
1, and a background color fill in color mode 2.
     Bit 3 defines whether or not to draw the outline of
filled objects. If it is 1 then filled objects are outlined
with a solid line (independent of the line texture) using
the current pel size. In color modes 0 and 1, the outline is
black; in color mode 2, the background color is used. The
default is 0 for no outline.
     Bits 2 and 1 define the line texture as follows:
       0 0  Solid (the default)
       0 1  Dotted
       1 0  Dashed
       1 1  Dot-Dash
This sets the texture of lines drawn by the LINE, ARC,
RECTANGLE, POLYGON, and INCREMENTAL LINE PDI's. The size of
a dot and the gap size is equal to the logical pel size. In
horizontal lines the dashes are 3 logical pels wide, in
vertical lines they are 3 logical pels high. In angled lines
the visual effect of dots and dashes should be consistent
with that of the specified horizontal and vertical lines.
All end points of lines and arcs and all vertices should be
drawn regardless of the line texture. When the pel width is
0, all non-vertical lines are solid. When the pel height is
0, all non-horizontal lines are solid.
     The multi-value operand following the fixed format byte
defines the mask size used in pattern fills for the
programmable masks A, B, C and D. The pattern is scaled to
the mask size, then tiled over the object with reference to
the screen origin to maintain registration. In color mode 2
both the foreground and background colors are used to draw
the pattern fill. The default mask size is 1/40 wide and
5/128 high. Negative mask sizes mirror the pattern the same
way text characters are mirrored. If there is no multi-value
operand, then the mask size is unchanged.

SET COLOR - 3C
     This command is used to modify the color palette and is
subject to the color mode set by SELECT COLOR. In color mode
0, drawing colors are explicitly specified as RGB triples
and the palette is modified implicitly. In color modes 1 and
2, the color is specified as a palette entry. For example,
when displaying text in color mode 0, the drawing color is
specified directly and only affects the foreground pixels in
the text character. In color mode 1, the color is selected
from the palette and also is used to draw only the
foreground pixels. In color mode 2, both foreground and
background colors are chosen from the palette and both
foreground and background pixels are drawn in the
appropriate colors.
     In order to use a color in modes 1 and 2, you must
first specify the color to be placed in the palette using
SET COLOR, and then you must select the palette entry to use
with SELECT COLOR. Any changes to the palette are
immediately reflected on the display. When a color is
specified directly in mode 0, the palette is checked. If the
color is already there, then the drawing color is set to the
lowest palette entry with that same color. If it is not
already there, mode 0 looks for the lowest palette entry
that has not been used by SET COLOR or SELECT COLOR since
the last RESET that has reset the palette. The palette
entries for nominal black and nominal white are not used.
Once an unused entry is found, it is defined and the drawing
color is set to use that palette entry. If there are no
available palette entries, then the drawing color is set in
an implementation dependent manner.
     In mode 0 the multi-value operand specifies the actual
RGB color value where bits 6 through 1 of each data byte
represent GRBGRB. For instance, to set the value of the
green portion concatenate bits 6 and 3 from each byte as
follows 6363..., for Red use bits 5 and 2 5252... and for
blue use bits 4 and 1 4141... The drawing color is in effect
until another SET COLOR command changes it or it is reset by
a RESET or NSR. The default drawing color is white.
     In modes 1 and 2, the SET COLOR command puts colors
into the palette. The palette entry used is the one which is
the current drawing color. It can be changed by using SELECT
COLOR. Whenever the data bytes specify more bits than the
palette can handle, the least significant bits are
discarded. If the palette entry can handle more bits than
the data bytes provide, then trailing zero bytes are added.
If there are additional data bytes after the multi-value
operand size, then an implicit SET COLOR command is assumed
with a new palette entry. The new palette entry is
determined as follows:
          Take the palette entry number, change the most
          significant zero to a one, then change all ones to
          the left of it to zeroes. For example, 010100
          would be incremented to 110100 which would be
          incremented to 001100. This palette entry
          determination does not affect the current drawing
          color. The incrementing stops when a palette entry
          of all ones is reached. This algorithm allows an
          image to be viewed on a device with more palette
          entries than are specified in the image. Carefully
          placing similar colors in adjacent palette entries
          will also allow the image to be viewed reasonably
          on a device with fewer palette entries than the
          original image.
If there are no multi-value data bytes, then the transparent
color is used. If transparency is not implemented, then the
transparent color is shown as black.
     The default palette is determined by the following
algorithm:
     N = number of bits in a palette entry number
         i.e. 4 bits for 16 color VGA, 8 bits for 256 color
     2 ^ n = the number of palette entries, i.e. 2^4 = 16
     M = number of bits in the colour values, e.g. 24 bit
     M >= 3 * (N - 1) This is a required relationship
     
     The first half of the palette stores a uniformly spaced
     greyscale where R = G = B. If M = 3 * (N - 1) then
     there should be exactly (2^N)/2 grey levels including
     black and white.
     The second half of the palette stores a full rang of
     hues spaced equally around the perimeter of the hue
     circle with Blue at 0 degrees, Red at 120 degrees and
     Green at 240 degrees. The algorithm for mixing colors
     to obtain a desired hue is:
     h = desired hue
     ang(h) = the angle of h
     P1 = the closest primary to h
     ang (P1) = the angle of P1
     P2 = the second closest primary to h
     ang(P2) = the angle of P2
     P3 = the farthest primary from h
     Then the color values to give h will be:
     P1 = 100% (all one bits)
     P2 = |ang(h) - ang(P1)|
          ------------------
               60 degrees
     P3 = 0%

WAIT - 3D
     This command produces a timed pause. If the terminal
program has not yet finished displaying previously received
PDI's, then the pause interval is not started until the
drawing is completed. The byte following the WAIT PDI is a
fixed format byte containing 1011100 in bits 7 through 1. If
any other byte follows the WAIT PDI, then the entire
sequence is discarded.
     The 3rd and subsequent bytes specify wait intervals in
bytes 6 through 1. There can be any number of wait intervals
specified to add up to the required pause time. A wait
interval of zero is anywhere between 0 and .1 seconds long.

SELECT COLOR - 3E
     This command sets the color mode. For modes 1 and 2 it
selects the palette entry to use for the foreground or
drawing color. For mode 2 it also sets the palette entry for
the background color. It can have 0, 1 or 2 single value
operands. Any additional data bytes are discarded.
     If there are no data bytes, then color mode 0 is set.
If there are data bytes for 1 single value operand, mode 1
is set and if there are data bytes for 2 single value
operands, mode 2 is set. The most significant bits of the
single value operands are used to determine the palette
entry to use. If the single value operand has less bits than
palette entry numbers, then trailing 0 bits are added.
     The first single value specifies the drawing color. The
second single value (if available) specifies the background
color. If both operands specify the same palette entry, then
the drawing color is NOT changed, only the background color.
The background color is used to fill the character field in
which characters are displayed. It also draws the outlines
of filled objects, the spaces in line textures and the
backgrounds in all pattern fills.

BLINK - 3F
     This command is used to set up palette animation by
creating a blink process. This process runs on a 1/10th of a
second timer and periodically modifies palette entries. The
palette entry to be changed is the blink-from color and the
new contents of the blink-from color come from the palette
entry specified by the blink-to color. The time interval
that each of the two colors is visible is definable. The ON
interval is when the blink-to color is visible and the OFF
interval is when the blink-from color is visible.
     A starting delay can be specified to synchronize
multiple blink processes. The starting delay is ignored if
there are currently no blink processes active. The delay is
relative to the beginning of the ON interval of the most
recently defined blink process. A start delay of 0 causes
the ON interval of the new blink process to start at the
same time as the ON interval of the previously defined blink
process.
     When the ON or OFF intervals, for more than one blink
process, end simultaneously, they are processed starting
with the first defined blink process. This means that the
second and subsequent blink processes use the color map
resulting from the first blink process. Some complex side
effects can be created this way.
     The first set of data bytes following BLINK are a
single value operand defining the blink-to color as a
palette entry. The same rules apply as for SELECT COLOR. The
blink-from color is defined to be the current drawing color
and therefore is not explicitly included in the BLINK PDI.
     Following the single value operand are 3 fixed format
bytes defining the ON interval, OFF interval and START DELAY
for the blink processes. Each interval is defined in 10ths
of a second and, of course, only bits 6 through 1 are used.
This means the minimum interval is .1 seconds and the
maximum interval is 6.3 seconds. If the START DELAY is not
transmitted then it is assumed to be 0. A start delay is
ignored if there are no currently active blink processes. If
either the ON interval or the OFF interval are zero, then
any currently active blink process for the specified blink-
from and blink-to colors is terminated. There can be only
one blink process at a time for a given pair of colors. If a
blink PDI is issued with no data bytes following it then all
blink processes using the current drawing color as the blink-
from color will be terminated. When all blink processes for
a given blink-from color are terminated, then the original
blink-from color will be restored.
     If there are additional data bytes after the start
delay byte, then another blink command is started
implicitly. This new blink command will automatically
increment the palette entry number to use as the blink-from
color using the same algorithm as SET COLOR uses for
incrementing palette indexes. This incrementing does not
affect the drawing color.
     The number of blink processes simultaneously active is
implementation dependent but should be at least 16.

POINT SET ABS - 24
     This PDI sets the current drawing point to the
coordinates specified in last one of the following multi-
value operands. No point is drawn.

POINT SET REL - 25
     This PDI sets the drawing point to the current drawing
point plus the displacement specified in the following multi-
value operand. This operation may be repeated for multiple
multi-value operands. No point is drawn.

POINT ABS - 26
     This PDI sets the drawing point to the coordinates
specified in the following multi-value operand and draws a
logical pel at that point in the current drawing color.
Multiple points may be specified by transmitting more
coordinate pairs.

POINT REL - 27
     This PDI sets the drawing point to the current drawing
point plus a displacement specified in the following multi-
value operand and draws a logical pel at that point in the
current drawing color. Multiple points may be specified by
transmitting more X,Y displacements.

LINE ABS - 28
     This PDI draws a line in the current color from the
current drawing point to the end point specified in the
following multi-value operand. If more than one operand is
transmitted, lines will be drawn until there are no more
data bytes. The current drawing point is set to the last end
point. The thickness of the line is determined by the
logical pel size since the logical pel is used as a brush to
draw the line as in the example below.
     _
    /\/\
   / /\ \
  / /  \ \
 / /    \ \
|_/      \_|

LINE REL - 29
     This PDI draws a line in the current color from the
current drawing point to a point specified by the X,Y
displacement in the following multi-value operand. If more
than one operand is transmitted, lines will be drawn until
there are no more displacements. The current drawing point
is set to the last end point.

SET & LINE ABS - 2A
     This PDI is similar to LINE ABS except that the first
multivalue operand after the PDI is used to set the current
drawing point before drawing commences.

SET & LINE REL - 2B
     This PDI is similar to LINE REL except that the first
multivalue operand after the PDI is used to set the current
drawing point before drawing commences.

Arc Drawing
     The ARC PDI's are used to draw circles, circle segments
and curvilinear splines. Arcs are drawn from a start point,
through an intermediate point to an end point. The start and
end points are the same point, then the intermediate point
defines the diameter of a circle and a circle is drawn. If
more than 3 points are specified, then a curvilinear spline
is drawn. The minimal acceptable implementation according to
the standard is a straight line connecting all the end
points, but in this day and age a B-spline should be used. B-
splines are used in TrueType font outlines and can readily
be drawn using CAD programs, so B-spline support would be
useful for converting display typefaces and CAD drawings to
NAPLPS format. The maximum number of points in a spline is
implementation dependent but should be at least 256.
     If the 3 points specified for an arc are collinear,
then a line is drawn from the start point to the end point.
If the end point is omitted, it is assumed to be the same as
the start point and a circle is drawn. After drawing the
arc, the current drawing point is set to the end point.
     If an arc is filled, then the area between the arc and
the chord specified by the start and end points is filled
with the current colors and current fill pattern. The line
width of the chord is affected by the logical pel size, but
if the arc is outlined, the chord is NOT outlined.
     There is a good reason why the chord is filled rather
that the pie segment and why only the circular portion of
the arc is outlined and not the chord. Firstly, a pie
segment is easily composed of a filled arc and a triangle
which have the chord line in common. It is possible to
construct curved objects more efficiently by drawing several
end-to-end filled arcs and an interior polygon which
connects the chords of those arcs (see cloud in the BYTE
sample). If this object is to be outlined, you would not
want the chord lines to be visible but you would want the
curved portions to be visible. The alternative is to draw a
polygon with many short line segments to approximate the
curves but that takes many more bytes and is less efficient.
Remember, most of the world still runs on 2400 bps modems.
Well designed NAPLPS images can be transmitted quite
reasonably at that speed.

ARC OUTLINED - 2C
     This PDI draws an unfilled arc in the current drawing
color. The start point is the current drawing point. Only
the intermediate and end points are specified in the
following multi-value operands.

ARC FILLED - 2D
     This PDI is the same as ARC OUTLINED except that the
start and end points are joined by a chord in the current
drawing color and the arc is filled with the current color
and fill pattern. If the TEXTURE settings specified that
outlines should be drawn, only the curved part of the arc is
drawn in the background color.

SET & ARC OUTLINED - 2E
     This PDI is the same as ARC OUTLINED except that the
first multi-value operand sets the current drawing point.

SET & ARC FILLED - 2F
     This PDI is the same as ARC FILLED except that the
first multi-value operand sets the current drawing point.

Rectangle Drawing
     The rectangle commands draw rectangles of a specified
width and height. After the rectangle is drawn the endpoint
is displaced from the starting point by the width only. This
facilitates drawing bar charts along a baseline. If
additional data bytes follow a rectangle command, they are
interpreted as additional width and height specifications
for additional rectangles.

RECT OUTLINED - 30
     This PDI draws an unfilled rectangle in the current
drawing color starting at the current drawing point.

RECT FILLED - 31
     This PDI draws a filled rectangle starting at the
current drawing point. The fill is done with the current
drawing color and fill pattern.

SET & RECT OUTLINED - 32
     This PDI is the same as RECT OUTLINED except that the
current drawing point is set by the first multi-value
operand.

SET & RECT FILLED - 33
     This PDI is the same as RECT FILLED except that the
current drawing point is set by the first multi-value
operand.

Polygon Drawing
     The polygon command is used to draw filled and unfilled
polygons. The polygon is defined as a series of
displacements from a starting point. The last point in a
polygon is implicitly the same as the starting point to
ensure that it is closed. The drawing point is unchanged
after drawing a polygon.
     The number of vertices allowed in a polygon is
implementation dependent but should be at least 256.

POLY OUTLINED - 34
     This PDI draws a polygon starting at the current
drawing point.

POLY FILLED - 35
     This PDI draws a filled polygon starting at the current
drawing point.

SET & POLY OUTLINED - 36
     This PDI is the same as POLY OUTLINED except that it
sets the current drawing point first.

SET & POLY FILLED- 37
     This PDI is the same as POLY FILLED except that it sets
the current drawing point first.

 FIELD - 38
     This PDI defines the active field position and
dimensions. The active field is used for displaying and
scrolling columnar or wordwrapped text, for setting up
unprotected input fields and for displaying bitmapped
images. If there is already an active field, it will be
replaced by this new active field.
     The first parameter after the PDI is the origin of the
field in absolute coordinates. The second multi-value
operand, gives the width and height of the field. If the
width or height are negative, then the origin point of the
field will not be in the lower left corner. This is handled
the same way as the logical pel size under the DOMAIN PDI.
The current drawing point is set to the field origin point.
If there are no multivalue operands after the FIELD PDI,
then the active field is set to the default setting of the
full unit screen with the origin at (0,0). If there is only
one multi-value operand, then it is used as the field
dimensions and the current drawing point will be used as the
origin point.

INCREMENTAL POINT - 39
     This PDI displays a color bitmap within the active
field. Each pixel specified in the bitmap is drawn by one
logical pel using the color specified in the bitmap. In
color mode 0, the colors are explicitly specified as RGB
values. In modes 1 and 2, they are palette entries. The
color settings or selections caused by the incremental point
command have exactly the same effect on the graphics
environment as a SET COLOR (mode 0) or SELECT COLOR (mode 1
& 2) command including side effects dealing with palette
entries.
     The active field is important as it bounds the bitmap
and determines the number of pixels or pels per line in the
bitmap. Pels are displayed starting at the current drawing
point. After drawing the pel, the drawing point is displaced
in the X direction by an amount equal to the width of the
logical pel. Positive widths move right, and negative ones
move left. At this point, if the new position of the logical
pel causes it to overlap the active field boundaries, then
two things happen. First, any remaining bits in the current
data byte are discarded. Then, if there are any more data
bytes, the drawing point is repositioned at the boundary
opposite the overlapping one (like a carriage return). If it
is possible to displace the logical pel in the Y direction
without overlapping the field boundary, then this is done,
otherwise, the Y position is unchanged but the entire field
contents are scrolled in the opposite direction. Positive
pel heights move up but scroll down, negative heights
reverse the directions. After the repositioning is
completed, the next pel is drawn.
     Once the last pel has been drawn, the current drawing
point is set back to the field origin.
     The first byte following the INCREMENTAL POINT PDI is a
fixed format parameter that describes the number of bits per
pixel that are used to specify the pixel color or the
palette entry. This number ranges from 1 to 48. If it is 0
or if it is greater than 48, then the entire PDI is
discarded. The following data bytes are a bitstring
consisting of bits 6 through 1 of each data byte. In color
mode 0 the number of bits equal to the packing count are
arranged GRBGRBG...BGRB. These are to be extracted and
interpreted as RGB colors in the same way as the multi-value
color operands used by SET COLOR. Note that if the packing
count is not a multiple of 3, then there will not be the
same number of bits for each of the three primary colors.
For instance, with a packing count of 5, the bit string
would be GRBGRGRBGRGRBGR...
              ^    ^  note that Blue is not specified
     In modes 1 and 2, the bitstring consists of palette
indexes concatenated together.
     In some cases it will be necessary to rescale either
the logical pel dimensions and the active field dimensions
in order to ensure that both of them are integer multiples
or integer fractions of the physical pixel dimensions. If
this scaling is done, then the original unscaled values for
both the active field and the logical pel are restored after
the INCREMENTAL POINT PDI has completed. This scaling must
ensure that the resulting bitmap image is guaranteed to lie
within the ORIGINAL active field and that skewing of the
image does not occur. This means that the new dimensions
must display the same number of pels per line as the
original ones. It also means that the rescaled bitmap will
be smaller than the actual specified field size.
     If any portion of the logical pel for the initial
drawing point lies outside the active field, then the entire
PDI is discarded. If either width or height of the current
logical pel is equal to zero, then for the duration of the
INCREMENTAL POINT PDI, it is set to the smallest value
possible within the current DOMAIN.

INCREMENTAL LINE - 3A
     This PDI defines a scribble which is an efficient
representation for certain types of polylines such as a
signature. The line segments in the scribble are drawn with
the current color and line texture.
     The first operand is a multi-value operand which
specifies the step-size as separate x and y displacements
referred to as dx and dy. Following this, the data bytes
define a bitstring consisting of a series of 2 bit opcodes
as follows:
       00  makes the following opcode one of:
                    00   toggle the draw flag
                    01   reverse the sign of dx
                    10   reverse the sign of dy
                    11   reverse the sign of dx and dy
       01  move the drawing point dx in the x direction
       10  move the drawing point dy in the y direction
       11  move the drawing point dx in the x direction
           and dy in the y direction
If the draw flag is on, each of the move instructions causes
a line segment to be drawn from the current point to the new
point. When the INCREMENTAL LINE starts, the draw flag is on
unless it is turned off explicitly. The current drawing
point is set to the last point in the scribble.

INCREMENTAL POLY FILLED - 3B
     This PDI is almost identical to the INCREMENTAL LINE,
except as follows:
     1. The scribble is filled with the current colors and
        fill pattern.
     2. the draw flag is always on
     3. If an opcode to turn off the draw flag is
        encountered, it is skipped.
     4. The final drawing point is implicitly the same
        as the starting point to ensure closure.
     5. the maximum number of nodes allowed is the same
        as for the polygon PDI's.

The Mosaic set

Overview
     This G-set consists of 65 2x3 block mosaic characters
and 31 <space> characters. The mosaic range from 20 to 3F
and from 60 to 7F and a special one at 5F. The bit pattern
of the character code determines the bit pattern of the
mosaic character:

          7 6 5 4 3 2 1
         ---------------
         | |1| | | | | |   data byte
         ---------------

    -----
    |1|2|
    -----    2 x 3
    |3|4|    Mosaic cell
    -----
    |5|7|
    -----
One bits in the data byte cause the corresponding mosaic
cell to be visible. If you want to see what they look like,
use MGE or get a copy of the official standards document or
look in the February 1983 issue of BYTE magazine.
     Mosaic characters are normally displayed in contiguous
mode so as to create the effect of a monochrome bitmap.
However, when text underline mode is on, they are displayed
as separated with no actual underscore. In contiguous mode,
the mosaic cell size is determined by dividing the character
field into six equal rectangles. In separated mode, the
character field size is reduced in width by the width of a
logical pel and reduced in height by the height of a logical
pel before subdividing into six equal rectangular parts. The
scaled down mosaic characters are left and bottom justified
within the character field. If either dimension of the
logical pel is greater than the corresponding character
field dimension, then the mosaics are invisible in separated
mode.
     Mosaic code 20 is not subject to underlining and
mosaics are never proportionally spaced. The mosaic
displayed by code 5F is the same as 7F

The Macro Set

Overview
     This set contains 96 codes which can be used to define
and invoke macro. A macro is simply a stream of NAPLPS bytes
that are captured by the terminal program and assigned to a
code in the macro set. They may be buffered in RAM or on
disk as desired by the implementor. Once the macro is
defined, it can be recalled by invoking the macro set and
transmitting the single byte code for the macro. Macros can
also be recalled within the definition of another macro, so
it is necessary for the terminal program to beware of
infinite macro loops.
     There are three control codes which define a macro (DEF
MACRO, DEFP MACRO, and DEFT MACRO). Any of these macros may
be linked to a user input such as a function key or mouse
click so that it may be activated or transmitted by the
user.
     Macro expansion can occur in odd places, such as in the
middle of a PDI's data bytes, so be careful.

Dynamically Redefinable Character Set

Overview
     This G-set is a character set that may be defined and
redefined by the host system transmitting the NAPLPS codes.
This could be used simply for a different looking font, or
it could be used to enable use of NAPLPS with a non-Latin
based language such as Russian, Thai or Inuktitut. The 96
codes in the DRCS are treated as <space> until they are
explicitly defined by a DEF DRCS control command. When these
codes are displayed they are subject to the same features
and limitations as alphanumeric text.

Character Field Layout
     When defining characters for a DRCS, one should take
certain factors into consideration when planning the
character field layout. Remember, that the entire character
shape must lie 100% within the character field including
descenders and accents. The characters should be designed
with a baseline that is offset far enough from the bottom of
the character field to leave room for descenders and the
underline which is drawn at the bottom of the character
field. Approximately 20% of the character field height is a
good starting point. Similarly, the maximum character height
should be offset below the top of the character field to
leave enough room for accents to be placed on the
characters. Approximately 10% of the character field height
is a good starting point. In addition, a small allowance
should be made on the left and right of the character field
to provide an intercharacter spacing. If it is not possible
to leave space on both sides, then put the space on the
right of the character. Of course, there may be times when
some or all of these rules may be broken, but they should be
understood first, and then only broken for a reason.

C-Sets

C0 Control Set
     These are the normal ASCII control characters. Note
that this specification defines what happens when the codes
are received in the NAPLPS data stream. This is not
necessarily the same behavior as when these codes are
received from the keyboard, and in fact, it is up to the
implementor to decide how to handle keystrokes. Keystrokes
are not part of the NAPLPS spec.
     Any specifications that deal with what to do with the
character field and cursor position and the active field,
when the active field boundaries are crossed, only take
place if the character field in it's original position is
wholly within the active field. If it is not wholly within
the active field, then the same processing takes place, but
with reference to the entire display area.

Backspace - 08
     This code moves the cursor a parallel to the character
path but in a direction opposite from the normal character
advance and by a displacement equal to the normal character
advance. If the new cursor position is wholly or partially
outside of the active field or the display area, then the
cursor is moved to the opposite edge of the field and a
<vertical tab> is executed.

Tab - 09
     This moves the cursor in an opposite direction but in a
similar manner to <backspace>.

Line Feed - 0A
     This moves the cursor perpendicular to the character
path and by a displacement equal to the interrow spacing. If
the new character field position is wholly or partially
outside of the active field, then one of two things happens.
If scroll mode is active, the character field stays at its
old position and the active field is scrolled in a direction
opposite to the intended cursor movement. If scroll mode is
off, then the character field is positioned at the opposite
boundary of the active field.

Cursor Position - 1C
     The two bytes following this control code represent a
row and column address to which the cursor is positioned.
The row address is decoded by taking bits 7 through 1 of the
first byte and subtracting 32. The column address is
obtained from the second byte in the same way. This gives a
range from 0 through 95 inclusive. If either of the 2 bytes
following the 1C is from the C0 or C1 sets, then the entire
sequence is discarded. NOTE that row 0, column 0 is in the
lower left corner of the display screen (Cartesian
coordinates).

Vertical Tab - 0B
     This moves the cursor in an opposite direction but in a
similar manner to <linefeed>.

Clear Screen - 0C
     This moves the cursor to the upper left character
position on the display and clears the screen. In color
modes 0 and 1, the screen is cleared to nominal black, in
mode 2 it is cleared to the background color.

Carriage Return - 0D
     This moves the to the first character position in the
active field that is on the character path.

Home - 1E
     This moves the cursor to the upper left character
position on the display.

Shift-Out - 0E
     This invokes the G1 set into the GL which makes it
available as ASCII codes 20 through 7F.

Shift-In - 0F
     This invokes the G0 set into the GL which makes it
available as ASCII codes 20 through 7F.

Single-Shift-2 - 19
     This invokes the G2 set into the GL which makes it
available as ASCII codes 20 through 7F. This shift only
affects the byte immediately following the 19 code after
which the GL is restored to its former contents.

Single-Shift-3 - 1D
     This invokes the G3 set into the GL which makes it
available as ASCII codes 20 through 7F. This shift only
affects the byte immediately following the 19 code after
which the GL is restored to its former contents.

Escape - 1B
     This code is used to start various escape sequences
which are documented elsewhere.

Transmission Control
     The codes SOH(01), STX(02), ETX(03), EOT(04), ENQ(05),
ACK(06), DLE(10), NAK(15), SYN(16), and ETB(17) are reserved
for use at other layers of the OSI model. If they do make it
through to the presentation layer, then they are ignored and
have no effect whatsoever. In the OSI model, these codes
would be used in lower layers to implement error-free
transmission of data packets with some type of network
handshaking protocol.

Device Control
     The codes DC1(11), DC2(12), DC3(13), and DC4(14) are
also reserved for use of other layers of the OSI model. They
are ignored if they appear in the NAPLPS data stream.

Null - 00
     This code is used at other layers of the OSI model. It
is ignored if encountered in the NAPLPS data stream.

Bell - 07
     This code is used to beep or make some other audible
sound which is implementation dependent.

Cancel - 18
     This code is used to terminate the processing of all
currently executing macros. Execution resumes at the next
code following the terminated macro call. The CAN code is
not queued, it has an immediate effect even if there are
other NAPLPS codes in a buffer which have not yet been
processed.

Service Delimiter - 1A
     This code is discarded if encountered in the NAPLPS
data stream. It is intended to act as a delimiter for the
transmission of unprotected field contents back to the host
system. The full format is as follows:
     NSR - begins the transmission
     DOMAIN - only required if the domain settings are
              different from the default.
     FIELD - marks the beginning of the field contents. The
             field coordinates are used to identify the
             field.
     TEXT - only required if the text size is different
            from the default
     POINT SET - only if required to locate the first
                 character position in the field.
     SELECT COLOR - only when the text color changes. If
                    mode 0, then use SET COLOR.
     Character codes including code set changes to use
     supplementary, mosaics, DRCS. May also include control
     codes for cursor positioning and repeat codes.
     END - marks the end of each field.
     The sequence between FIELD and END is repeated for
     each unprotected field being transmitted.
     POINT SET - tell the host where the current drawing
                 point is.
     Service Delimiter - marks the end of transmission

     This facility is akin to a dialog box. The host uses
NAPLPS to draw the screen and define unprotected fields. The
host can also transmit text into the unprotected fields and
the terminal program should store that text and allow the
user to edit it. Then upon receiving some keystroke or mouse
click, the terminal program will transmit the edited
contents of all unprotected fields back to the host. The
only characters guaranteed to be transmitted are those in
the ASCII, supplementary, mosaic and DRCS sets. This
facility is modeled upon that provided by block-mode
terminals.
     If the terminal program allows arbitrary NAPLPS
sequences to be entered into unprotected fields, then that
facility can be used to implement graphical e-mail. The user
uses a mouse to draw images in the unprotected field along
with any text they type. The entire sequence of NAPLPS codes
required to redraw the same image on another person's screen
is recorded and transmitted back to the host system when the
user requests the fields to be sent by pressing a key or
clicking somewhere. If the user has a pen input device such
as a graphics tablet, they could even create handwritten
messages using the NAPLPS scribble PDI (INCREMENTAL LINE).
     Unprotected fields which have NOT been changed, need
not be transmitted back to the host. If no fields are
changed and the transmission is initiated, then the minimum
transmission consists of the NSR, DOMAIN, POINT SET, and
Service Delimiter. Users can only edit unprotected fields
when the text cursor is on (visible).

NSR - 1F
     Non-Selective Reset is used to reset most of the
environment settings to their default state as follows:
     The G0, G1, G2, G3, C0 and C1 sets are reset to have
their default initial contents and the GL and GR are also
reset to their initial state.
     The DOMAIN parameters are set to the default as
specified earlier in this document.
     Any text settings from the TEXT PDI or from the C1 set
are reset to the default. In addition the active field is
set to the default of the unit screen.
     Any TEXTURE parameters are set to the default, but the
programmable fill patterns are NO cleared.
     The color mode is set to mode 0 and the current drawing
color is set to nominal white, however the color palette is
NOT cleared
     If the two bytes immediately after 1F are between 40
and 7F, then the cursor is repositioned. The row number is
taken from bits 6 through 1 of the first byte, the column
address is from bits 6 through 1 of the second byte. Row 0,
column 0 is the upper left corner of the display. The actual
character position is constrained to be within the display
area even if the row column address extends beyond this
area.
     NOTE: cursor positioning by the NSR code is NOT THE
SAME as cursor positioning via the CURSOR POSITION code 1C.
They use a different origin, and the NSR positioning takes
place AFTER the text parameters are reset to the default.
Because of this it is usually NOT POSSIBLE for NSR character
positioning to register properly with that of code 1C.

C1 Control Set
     These are additional control codes which are used for
NAPLPS specific operations. There is a bit of complexity
involving the use of the C1 set in 7-bit mode. Because of
the need to ensure that the normal ASCII control characters
are still available (some are used outside of NAPLPS), it is
not possible to replace the C0 set with the C1 set.
Therefore, in 7 bit mode, the C1 set is placed in the middle
of the GL area from 40 through 5F and a C1 code is invoked
by preceding it with an ESC (1B) code. This means that the
GL area can still be used as normal for PDI's, ASCII text or
whatever, since C1 codes must be escaped. In 8 bit mode,
there is no conflict as the C1 set is always available at
the beginning of the upper 128 character codes from 80
through 9F. There is no shifting or escaping required in 8
bit mode.
     In this section, the eight bit codes are given for the
C1 set. They can be converted to 7 bit codes by swapping
bits 8 and 7.

DEF MACRO - 80
     This code is used to begin macro definition. The byte
following the DEF MACRO must be between 20 and 7F. It is the
macro number which is being defined or replaced. If the
second byte is not within this range, then the two bytes are
discarded and decoding begins with the next byte.
     All characters after the macro number are recorded but
not executed up to the macro termination. The termination is
indicated by receipt of another DEF MACRO or one of DEFP
MACRO, DEFT MACRO, DEF DRCS, DEF TEXTURE, or END. The
terminating control character is NOT stored and neither is
the preceding ESC which is transmitted on a 7-bit link.
     If a macro reference is encountered during macro
definition, then the reference is stored as is. It is NOT
expanded at definition time. If the macro definition is
null, i.e. no definition bytes before the terminator, then
any existing macro with that number is deleted. All macros
are deleted by the RESET PDI.
     It is NOT necessary to have the macro G-set currently
invoked in order to define a macro.
     These macros (and DEFP macros) may be associated with a
keystroke or mouse click to be initiated by the user, but if
so, they are only available to be activated when the cursor
is on. Because the execution of these macros could place the
terminal program in an undetermined state, it is the
responsibility of the host system to restore the state of
the terminal program to a known state after the cursor is
turned off. The terminal program must ensure that any such
macro is executed to completion without being interleaved
with any incoming NAPLPS codes.

DEFP MACRO - 81
     This command is the same as DEF MACRO except that the
stream of characters making up the macro definition are
executed as well as recorded. If a DEFP MACRO contains a
reference to the macro number that is being recorded, then
that reference should be treated as an undefined macro. This
also applies to nested references, i.e. while defining macro
1 with the DEFP MACRO, a reference to macro 2 is
encountered. Upon expanding macro 2 a reference to macro 1
is encountered. Because the definition of macro 1 is not yet
complete, macro 1 is treated as an undefined macro.

DEFT MACRO - 82
     This command defines a transmit macro. This is a string
of bytes which is intended to be transmitted back to the
host computer. The data bytes in a DEFT MACRO are not
executed and are not necessarily NAPLPS data. They are only
useful if the terminal program provides some means of
causing the macro to be transmitted back to the host when a
function key or mouse click event occurs. This is similar to
defining a programmable function key except that the NAPLPS
spec doesn't deal directly with the keys. It would be up to
the terminal program to allow the user to associate a given
macro with a given key combination. The transmit macros must
always be available to the user for transmission, even when
the cursor is off.
     The transmit macros use the same pool of 96 macro
numbers as do other macros. There is only 1 macro set.
     Macros linked to keystrokes should be defined starting
with code 20 and macros that are not linked should be
defined in reverse order starting with code 7F. The terminal
program should provide at least 8 macros associated to
keystrokes. In my opinion, 12 is a better number for PC's as
there are 12 function keys available. In fact, the cluster
of INS,DEL,HOME,END,PGUP,PGDN and the 4 arrow keys should
also be associated with transmit macros.


DEF DRCS - 83
     This command is used to define a DRCS character shape
in a manner similar to macro definition. If the byte
following DEF DRCS is between 20 and 7F it is used as the
code for the DRCS character to define or redefine. If the
code is not within the range then the DEF DRCS code and the
incorrect code are discarded.
     Next comes a stream of NAPLPS data which is used to
define the shape of the DRCS character. This stream is
terminated by one of END, DEF MACRO, DEFP MACRO, DEFT MACRO,
DEF TEXTURE, or another DEF DRCS. The standard states that
the NAPLPS stream defining the character should be executed
as it is received, but is NOT displayed on the screen. It is
instead used to modify an in-memory bitmap which is used
later to display the DRCS character. It should also be
possible to store the NAPLPS stream as is done with macros,
and execute the stream at the time the DRCS character is to
be displayed. This would provide far better scalability of
the characters. You could also convert the NAPLPS stream
into a scalable format that is native to the graphical
environment you are using. This would allow somewhat faster
display when the DRCS is used. Note that you can use macros
and other DRCS characters as part of the definition
sequence.
     All NAPLPS code received during DRCS definition will
have its usual effect on the state of the terminal program,
except that any drawing operations do NOT affect the display
area. However, things like palette changes WILL still be
visible as they are part of the global state. All these
state changes will remain in effect after DRCS definition is
finished.
     When rendering the NAPLPS code into the in-memory
bitmap, the aspect ratio of the bitmap will be the same as
the character field dimensions in effect at the time the DEF
DRCS was received. The lower left corner of the bitmap will
correspond to the lower left corner of the unit screen. The
larger of the X and Y dimensions of the bitmap will be
considered to be equal to 1 unit (the full extent of the
unit screen in that dimension). Any changes to the character
field dimensions within a DRCS definition will not affect
this sizing but will effect the next DEF DRCS command. The
in-memory bitmap is a monochrome bitmap that is initially
all black. All drawing commands will be drawn in white on
the bitmap unless they are drawn with a nominal black color.
The actual resolution of this bitmap is implementation
independent. Although the standard does not suggest this, I
would think that on today's computer equipment, this
rendering should be delayed until the DRCS characters are
actually used, at which point the bitmap size should be
equal to the current character field size, and bitmap
characters should be cached for reuse.
     Once the DRCS definition is completed, the unit screen
once again corresponds to the physical screen and the
current drawing point is set to (0,0).
     If the DRCS definition is terminated by another DEF
DRCS command, then the character code to be defined is NOT
transmitted. It is calculated by incrementing the previous
character code and wrapping around so that 7F increments to
20. If a DEF DRCS command is terminated with no character
definition, then the character definition for that code is
reset to the default <space> character. The entire DRCS can
be cleared with the RESET PDI.
     When a DRCS character is displayed, the rendered bitmap
is scaled to the current character filed dimensions and the
white portions of the bitmap are to be displayed in the
current drawing color. In color mode 2, the black portions
of the bitmap will also be displayed but in the current
background color. DRCS characters are subject to all the
attributes of text just as the ASCII set and supplementary
set.
     I have gone a little further than the standard in
suggesting that the scaled bitmap method of displaying DRCS
characters is really not appropriate on today's computer
equipment. Since the ordinary text character shapes for the
ASCII and supplementary sets are not specified, most systems
will provide fully scalable fonts for those characters. If
the DRCS characters are not also handled in an equivalent
scalable manner, then they will not look very good.

DEF TEXTURE - 84
     This defines or redefines one of the four programmable
pattern fills. The pattern mask A, B, C, or D is selected by
the byte following the DEF TEXTURE which must be one of 41,
42, 43 or 44. If the code is not one of these four, then the
2 bytes are discarded.
     Next comes a stream of NAPLPS data which defines the
pattern mask in the same way as the DEF DRCS except that the
mask size defined in the TEXTURE PDI is used instead of the
character field size. The command is terminated by END, DEF
MACRO, DEFP MACRO, DEFT MACRO, DEF DRCS, or another DEF
TEXTURE.
     If the INCREMENTAL POINT command is used in defining
the pattern, then be aware that the active field may be
rescaled as specified under the INCREMENTAL POINT PDI. This
rescaling will cause the actual area drawn by INCREMENTAL
POINT to be smaller than that specified.
     If there is no data after the mask number, then the
specified mask is reset to its default state. At the end of
the DEF TEXTURE command, the unit screen is set back to the
physical display and the current drawing point is set back
to (0,0).
     While the standard assumes that these pattern masks
will be stored as bitmaps and scaled as needed, I think it
would be useful to record them in the same scalealble manner
as I have suggested for the DRCS characters.

END - 85
     This command terminates a DEF MACRO, DEFP MACRO, DEFT
MACRO, DEF DRCS or DEF TEXTURE. It is also used in
transmitting protected field data back to the host system.

UNPROTECT - 9F
     This command turns the current active field into an
unprotected field. This makes the field area available for
the user to enter and edit data for transmission back to the
host system. The actual methods/keystrokes for entering and
editing data is implementation dependent. The default state
of the unit screen is protected, so no entry of data may
occur until an UNPROTECT is issued. If the UNPROTECT command
is received when the active field overlaps an already
unprotected field, then the unprotected field is changed to
protected before the active field is unprotected. This
ensures that unprotected fields never overlap. Changes in
the protection status do not affect the visible display.
     The number of unprotected fields that may be defined is
implementation dependent but should be at least 40.
     If the host transmits data into an unprotected field
that data will be recorded by the terminal program and will
be made available for the user to edit. Editing can only
take place if the unprotected field is also the active
field. The user can transmit the edited data back to the
host system by an implementation dependent keystroke or
mouse click. Details of the transmission format are defined
under "Service Delimiter" in the C0 set. When more than one
unprotected field is transmitted, they are transmitted from
left to right, top to bottom, using the field origin
coordinates to determine which is leftmost or topmost. The
transmission of data is to be handled independently of the
receiving of data, including any state changes made by the
user to text colors, character set, etc.
     It is allowed to have other methods of user input that
are independent of the unprotected fields and that do not
affect the state of unprotected fields.

PROTECT - 90
     This command causes any unprotected fields that overlap
the active field to be changed to a protected state. The
RESET PDI can be used to protect all unprotected fields.

REPEAT - 86
     This command gets a repeat count from bits 6 through 1
of the byte following the REPEAT code and repeats the byte
preceding the REPEAT code, by that number of times. This
code can only be used to repeat <space> characters and any
spacing characters from the ASCII, supplementary, DRCS or
mosaic sets. This means that the non-spacing accents in the
supplementary set cannot be repeated. If the preceding
character is not one of those allowed, then the REPEAT code
and the count byte are discarded. If bits 7 through 1 of the
repeat count fall outside the range from 40 through 7F, then
the REPEAT code is discarded and the count byte is
interpreted as a normal NAPLPS code.

REPEAT TO EOL - 87
     This command repeats the preceding byte as many times
as is required to reach the end of the current character
path if it is one of the allowed characters as for REPEAT.
Otherwise, the REPEAT TO EOL is discarded. If the character
field position lies wholly within the active field when this
command is received, then the character path will be
considered to end when it reaches (but does not pass) the
active field boundary.

REVERSE VIDEO - 88
     This causes any following text from the ASCII,
supplementary, DRCS and mosaic sets to be drawn reversed. In
color modes 0 and 1, the pixels of the character shape are
not draw, only the background pixels are drawn using the
current drawing color. In color mode 2, the foreground and
background colors used are swapped. This will require
special handling to ensure that composite characters are
displayed correctly. Composite characters are composed of a
non-spacing accent followed by another character from the
ASCII set. The composite character codes must always be
transmitted in that order, accent first, then ASCII
character.

NORMAL VIDEO - 89
     This terminates reverse video mode and returns to the
default.

Text Sizes
     Text sizes can be set by the following commands or by
the TEXT PDI. The following commands effect only the
character field dimensions. All other text attributes remain
constant. The screen sizes quoted assume the default
rotation and character path is in effect.

SMALL TEXT - 8A
     This sets the dimensions of the character field to 1/80
in the X dimension and 5/128 in the Y dimension. This
corresponds to an 80 by 19 screen when accounting for the
fact that only 3/4 of the Y dimension is visible.

MEDIUM TEXT - 8B
     This sets the dimensions of the character field to 1/32
in the X dimension and 3/64 in the Y dimension. This
corresponds to a 32 by 15 screen when accounting for the
fact that only 3/4 of the Y dimension is visible.

NORMAL TEXT - 8C
     This sets the dimensions of the character field to 1/40
in the X dimension and 5/128 in the Y dimension. This
corresponds to a 40 by 19 screen when accounting for the
fact that only 3/4 of the Y dimension is visible.

DOUBLE HEIGHT - 8D
     This sets the dimensions of the character field to 1/40
in the X dimension and 5/64 in the Y dimension. This
corresponds to a 40 by 9 screen when accounting for the fact
that only 3/4 of the Y dimension is visible.

DOUBLE SIZE - 8F
     This sets the dimensions of the character field to 1/20
in the X dimension and 5/64 in the Y dimension. This
corresponds to a 20 by 9 screen when accounting for the fact
that only 3/4 of the Y dimension is visible.

WORD WRAP ON - 95
     Any text received after this code is word wrapped when
the line reaches the end of the character path. If the text
is being displayed in the active field, then word wrapping
takes place when the character path meets the active field
boundary. If a <space> character is the last character on
the line and the <space> character does not fit, then it is
simply discarded. A word is defined as a string of
characters between <space> characters. If one of the
following list of special characters is embedded within the
word (i.e. not at the beginning or end) then the word may be
broken AFTER the special character in order to fill the line
as much as possible.
      ! " $ % ( ) [ ] < > { } ^ * + - / , . : ; = ? _ ~

     A word is also terminated when a mosaic character is
encountered or when any C set character (except SI, SO, SS2
, SS3) is encountered. If the word fills the line with no
spaces or special characters, then it is broken at the end
of the line anyway.

WORD WRAP OFF - 96
     This turns off word wrap and text now breaks between
characters. This is the default.

SCROLL ON - 97
     This turns on scroll mode. In this mode any <linefeed>
or <vertical tab> that would otherwise cause the character
field to move partially or wholly outside the display area,
triggers scrolling. The display scrolls in a direction
opposite to the direction of the <linefeed> or <vertical
tab> and only scrolls far enough so that the current
position of the character field is now wholly within the
display area. If the cursor movement command takes place
within the active field, then only the area within the
active field is scrolled. The blank area that scrolls into
view is nominal black in color modes 0 and 1, or the
background color in color mode 2.
     Any buffering of data that is scrolled off the display
is implementation dependent.

SCROLL OFF - 98
     This command turns off scrolling mode. If the text
cursor is advanced beyond the bounds of the display area (or
active field) by a <linefeed> or <vertical tab> then it
simply wraps to the opposite boundary.

UNDERLINE START - 99
`    This command turns on underline mode. In this mode all
ASCII, supplementary, and DRCS characters and any <space>
character are displayed with a line. This line is drawn from
the character field origin across the entire width of the
character field but it does not go across the gaps created
by 5/4 and 3/2 character spacing. Its thickness is the
height of the logical pel. Mosaic characters are not
underlined, but are instead displayed in separated mode as
defined under the section "The Mosaic Set".
     The underscore is then rotated along with the rest of
the character field if a rotation is specified.

UNDERLINE STOP - 9A
     This terminates underline mode. In this mode, mosaics
are displayed contiguously so as to form a monochrome
bitmap.

FLASH CURSOR - 9B
     This cause the cursor to blink. It also may enable user
input if the active field is in an unprotected field.

STEADY CURSOR - 9C
     This cause the cursor to be displayed with no blinking.
It also may enable user input if the active field is in an
unprotected field.

CURSOR OFF - 9D
     This sets the cursor to its default invisible mode. The
cursor still exists and can be positioned. This may also
disable user input, but that is implementation dependent.

BLINK START - 8E
     This creates a simple blink process using the current
drawing color as the blink-from color and nominal black (the
background color in mode 2) as the blink-to color. The on
and off intervals are implementation dependent and the start
delay is zero. This is intended to provide a facility
similar to the ANSI graphics blinking found on PC's.

BLINK STOP - 9E
     This terminates any blink process using the current
drawing color as the blink-from color.

EDC1, EDC2, EDC3, EDC4 - 91, 92, 93, 94
     These codes are reserved for future use. At the present
time they should be discarded.

Proportional Spacing of Text

Overview
     In order to guarantee the placement of text and the
positioning of line breaks on varying implementations of
NAPLPS at varying display resolutions, it is necessary to
have some guidelines as to how to produce proportionally
spaced text. If a terminal program adheres to these
guidelines, then a host system can place proportionally
spaced text onto the screen in a predictable manner.
     An algorithm is provided which defines how far to move
the cursor if the character field width is parallel to the
character path. If it is not parallel, then proportional
spacing is not possible and the spacing is always based on
the full height of the character field. The spacing for the
widest characters is always equal to the character field
width, while the spacing for other characters is arranged so
that the visible gaps between characters are identical. The
algorithm is arranged so that normal size text will be
spaced identically on both low and high resolution
terminals.

Algorithms
     The following tables classify the ASCII and
supplementary sets into 10 different width classes.
Characters in a given class are spaced according to the same
algorithm over the range of font sizes.

               ASCII Width Classes
               2  3  4  5  6  7
          ------------------------
          0    9  5  9  5  1  5
          1    0  1  5  6  5  5
          2    4  5  5  5  5  5
          3    6  5  5  5  5  5
          4    9  5  5  9  5  2
          5    9  5  5  5  5  5
          6    9  5  5  9  5  9
          7    0  5  8  9  5  9
          8    1  5  5  9  5  9
          9    1  5  2  9  0  5
          A    9  0  5  9  4  5
          B    9  3  5  4  5  5
          C    3  5  5  9  0  0
          D    5  8  9  4  9  5
          E    0  5  5  2  5  9
          F    9  8  9  9  5

               Supplementary Width Classes
               2  3  4  5  6  7
          --------------------------------
          0    9  4  9  5  6  9
          1    0  9  2  1  9  9
          2    9  4  2  9  6  6
          3    5  4  2  9  5  5
          4    9  7  9  9  9  6
          5    9  6  5  6  9  0
          6    9  9  5  9  9  4
          7    6  0  0  9  5  4
          8    9  9  4  9  9  7
          9    1  1  9  9  9  9
          A    6  6  1  9  9  9
          B    8  8  7  9  5  6
          C    9  9  9  9  5  4
          D    7  9  4  9  9  2
          E    9  9  8  9  6  5
          F    7  8  2  9  9

     The width class of an accented character is the maximum
width of the two components. Note that the <space> character
is always in the maximum width class. In proportional mode
<tab> and <backspace> are always considered to be in the
maximum width class (same as <space>) when they are received
from the host system.
     The algorithm that determines the actual width of a
character is based upon the width class and the width of the
current fixed character field. This algorithm is intended to
make the interfont gap between all characters identical, so
when designing your implementation dependent font, you
should take this algorithm into consideration. The algorithm
is structured to ensure that smaller sizes of text appear
spaced identically in both low and high resolution video
displays.

TEXT SIZES up to (but not including) 12/256 wide
------------------------------------------------
     width     0  1  2  3  4  5  6  7  8  9
------------------------------------------------
       6       2  3  4  3  4  5  6  4  5  6
       7       3  4  5  4  5  6  7  5  6  7
       8       2  3  4  4  5  6  7  6  7  8
       9       3  4  5  5  6  7  8  7  8  9
      10       4  5  6  6  7  8  9  8  9 10
      11       3  4  6  6  7  8 10  8 10 11
------------------------------------------------
      12       6  5  4  4  3  2  1  2  1  0

     The above table contains the cursor displacement to be
applied to characters in each width class at various
different character field widths. To determine which row to
use, take the character field width (which is a binary
fraction), multiply by 256 to get a number n.m/256, then
truncate the fractional portion of the number to find n. If
this result is less than 12, then use the corresponding row
in the table and scale the character displacement. For
instance, if the character field width is 15/512, then
multiply by 256 to get 8.5/256. Truncate to 8, therefore use
row 8 in the table. If the width class is 0 then the
character displacement is 2/256 which is the same as 2/8 of
the full displacement.
     If the scaling result is greater than or equal to 12
then the 12 row is first scaled to determine the amount to
adjust the character displacement.
     1. The character field width is truncated to DOMAIN 3
        leaving the 8 most significant bits. Call this n.
     2. Multiply n by 11/13 being careful to avoid overflow.
     3. Subtract 1/256 from the result, then bitwise OR the
        result with 1/256 and again subtract 1/256 from the
        result. Truncate this final result to DOMAIN 3, i.e.
        to 8 bits. This is the scale factor f. This step
        causes the font patterns for the widest character
        class to be scaled to an odd width.
     4. Get the unit spacing number from the 12 row for the
        appropriate width class.
     5. Multiply this unit spacing by f.
     6. Divide the result by 6, then add 1/512 for rounding,
        then truncate to DOMAIN 3 leaving the 8 most
        significant bits. Subtract this result from n to get
        the actual cursor displacement amount.
For example, a character in width class 0 using a character
field with of 12/256.
     1. 12/256 is already an 8-bit value so it is n.
     2. Multiply by 11 and divide by 13 to get a 16 bit
        number = 2599.
     3. Result 2087 scaled down to 8 bits = 8.
     4. Use 6.
     5. 6 * 8 = 48, divide by 6 to get 8, add .5 and round
        down to 8. Subtract 8 from 12 to get a displacement
        of 4/256.
Similarly, if the field width is 24/256, then the
displacement would be 6/256. This is a very tricky part of
the standard to follow and it leaves a lot to be assumed
such as 8 bit numbers being multiplied or divided into a 16
bit register. I hope that I got it right.

Ideas and Implementations

Terminal Programs
     I have come across several terminal programs that
support NAPLPS on the PC and one that supports NAPLPS on
Amiga and Macintosh computers.

PP3 (Personality Plus III)                   SHAREWARE
This is the only terminal program I know that fully supports
all of NAPLPS including bitmaps and DRCS characters. It is
available in English and French versions which use a user
customizable language file so it is easy to provide support
for other languages. Supports CGA, Herc mono, EGA, MCGA,
VGA, ET4000-256, TARGA-16. Basic registration fee is $25
while $40 gets you a printed manual and info on other NAPLPS
products and services.

CTLINK
Hmmm. I seem to have deleted this one. I had some problems
with it (which may have been the modem) but I remember that
it was really oriented as a terminal for commercial videotex
services. I read some comments from Dave Hughes that
indicated it is not a complete implementation, but if you
see it around, why not try it for yourself.

Tam Tam                                      COMMERCIAL
This program is available from MacGregor Inc. in Montreal
for the Amiga and the Macintosh in both English and French
versions. The price was $79-$99 depending on which version
but I have lost my info sheet. Just call directory
assistance to get a hold of them. They do speak English just
fine, so don't be shy.

Drawing Programs
     To date, I know of only one shareware drawing program
that supports NAPLPS. There are other commercial programs
but I don't yet have any info on them. In addition, I have
written a program to convert Windows 3 icons to NAPLPS
format and have a beta version of a program to convert
metafiles created by CorelDraw into NAPLPS format. The Memra
logo in the sample file MEMRA2.NAP was converted from an
original CorelDraw image.

MGE (Microstar Graphics Editor)              SHAREWARE
This is an object oriented drawing (not painting) program
from Microstar Inc. that uses NAPLPS as its file format. It
can draw all the basic objects as well as providing control
over text. It can define macros, fields and blinks. If using
the VGA 16 or 256 color drivers, you can customize the
palette. This is an important feature of NAPLPS. It is not
restricted to the default DOS/Windows 16 color palette. On a
standard VGA you can display any 16 out of the 262,000
shades it is capable of displaying. Notable omissions are
NAPLPS bitmaps and DRCS characters. Microsoft compatible
mouse required (or a graphics tablet that emulates a
Microsoft mouse). This is a good program that is often
criticized because its interface is not 100% the same as
Windows, however if you do PRINT OUT the README.MGE file and
keep it by your side while you draw, you will find that this
program is every bit as effective as CorelDraw and a much
better deal. Supports CGA, Herc mono, EGA, MCGA, VGA, ET4000-
256, TARGA-16. Basic registration fee is $50 while $75 will
get you a printed copy of the manual and info on other
NAPLPS products and services.

Teledraw                                     COMMERCIAL
This program is being developed by Dave Hughes in
conjunction with a team of programmers in Russia. He has
working beta versions and is expected to release the program
by the end of April 1993. This program will provide full
NAPLPS support including the design and use of DRCS
characters such as the Russian characters used in
SAIL.NAP. This program is a combination drawing/terminal
program that will decode NAPLPS images in electronic mail on
the fly and will allow you to draw or edit images and
transmit them in electronic mail messages.

NAPICO                                       SHAREWARE
This program from Memra Software Inc. is intended to enhance
NAPLPS images created with MGE by adding Windows icons to
the image. The icon positions are marked with a small
rectangle and NAPICO takes a list of Windows 3 .ICO files
and inserts the icon bitmap into those marked positions. The
use of SMALL bitmaps like these icons can really enhance a
NAPLPS image. A $10 registration fee is requested from those
who can afford it.

NAPWMF                                       SHAREWARE
This program from Memra Software Inc. converts Windows
metafiles that are created using CorelDraw's File Export
function. It does not necessarily work with metafiles from
other programs, although full .WMF support will be included
in a future version. This makes it possible to add a wide
range of clipart images and True Type fonts to a NAPLPS
image. See the Memra logo in MEMRA2.NAP that was produced by
a beta version of this program. The images produced by
version 1.0 won't be quite as big.

TURSHOW                                      SHAREWARE
This program doesn't fit under either category. It simply
displays the NAPLPS images on your CGA, EGA or VGA screen.

Clip Art libraries
     I would like to see people put together libraries of
non-copyrighted clipart for use by others. Note that this
means the images must be original art, not converted from a
commercial clipart library. As soon as I get NAPWMF
released, I will be creating a library of electrical symbols
for use in drawing circuits.

ANSI compatibility
     It should be possible for a terminal program to
simultaneously support both NAPLPS and the ANSI-BBS protocol
simultaneously. Because of a conflict with the FLASH CURSOR
command, it is not possible to arbitrarily interleave ANSI
and NAPLPS data streams but it should be possible to support
both code systems in a non-interleaved manner. The NAPLPS
spec uses the 3 character sequence ESC 25 41 to indicate
that NAPLPS decoding is to be turned ON and the sequence ESC
25 40 turns OFF the NAPLPS decoding. Outside of this
bracketing, it should be possible to support ANSI escape
sequences. It is fairly straightforward for sysops to ensure
that the ON/OFF sequences are transmitted, especially if
they are using Microstar's SHOWPLP utility.

User Interaction
     Although NAPLPS provides facilities for user
interaction in the form of unprotected fields, the cursor
and transmit macros, it does not require that those
facilities be used when there is an application layer
protocol for handling such things. I would like to suggest
that the general BBS and NAPLPS community should agree on a
standard way for handling such user interactions that would
allow mouse and keyboard support in a non hardware dependent
manner.
     As for mice and other pointing devices, I would like to
suggest that the terminal program transmit a POINT SET ABS
(code 24) PDI to the BBS using the currently set domain co-
ordinates to indicate a mouse click followed by some code to
indicate whether it was a button-down or button-up event and
which button it was. A POINT SET REL could be transmitted to
indicate a mouse move event.
     For keyboard events (key-up and key-down) a form of the
PC scan-codes could be transmitted. These codes are also
used by certain UNIX terminals and similar events are
generated by Macintosh keyboards and X-Windows keyboards so
the only thing about these codes that is specific to the PC
is the actual code numbers.
     There should probably be some indicator code
transmitted to distinguish between transmission of
unprotected fields and transmission of an event. Transmit
macros could, of course, be programmed to emulate either
events or unprotected field transmittal or anything else.
     I would like comments on these ideas, please.

Level 6 vs. Level 7
     It is important to remember that NAPLPS exists at the
presentation layer which is the 6th of the 7 OSI networking
levels. It is intended to be used as the foundation for
interactive on-line real-time graphical applications, which
are at the 7th OSI level. NAPLPS does not do everything and
it is not intended to do everything. I feel that it is
important for BBS operators and users to start discussions
on an overall standard for graphical BBS interchange, and I
would like to see NAPLPS as the foundation for the
presentation layer of that interchange. I would also like to
see any overall standards maintain the OSI division into 6
independent layers.
     It may be appropriate to extend NAPLPS to include
additional G-sets and I know that there is already a JPEG
extension to NAPLPS being prepared for public release. Since
the BBS community is likely to be the major user of NAPLPS
over the next few years, we need to maintain a discussion of
this protocol and its implementations and suggestions for
extensions.

 Resource List

I have put a lot of work into writing this document and
getting it widely distributed (worldwide). If you find it to
be of use and can afford to, I would appreciate receiving
$20 to help me continue to work on NAPLPS support.

Star Valley BBS   1-604-546-2705
     - speeds up to v.32bis
     - NAPLPS art galleries including some bitmaps
     - look in file areas DOS.BBS and ART.NAP
     - downloading available on the 1st call
     - author of NAPICO and NAPWMF utilities
     - Fidonet address 1:353/350
          FREQ NAPLPS - This document
               NAPICO - convert Windows 3 icons to NAPLPS
               NAPWMF - convert CorelDraw images to NAPLPS
               MGESHARE - Microstar Graphics Editor
               PP3SHARE - Personality Plus 3 term program
               SHOWPLP - door to add NAPLPS to your BBS
               TURBOARD - BBS program with built-in NAPLPS

PC Atlanta 1-404-395-6327
     - speeds up to v.32bis/HST
     - home of Turboard BBS software
     - full NAPLPS, ANSI, ASCII support
     - sysop Shawn Rhoads
     - Fidonet address 1:133/904
          FREQ TB114.EXE - latest Turboard ver 1.14

Russell Country BBS   1-406-423-5433
     - v.32bis
     - home of Native American Share-Art
     - sysop Cynthia Denton
     - wonderful online art galleries
     - Fidonet 1:3400/7


Microstar Support BBS   1-614-727-5272
     - speeds up to v.32bis (I can only connect at 9600 bps)
     - samples from many NAPLPS systems
     - interactive NAPLPS game like Tetris
     - the authors of MGE and PP3 and SHOWPLP
     - NAPLPS message area
     - Fidonet 1:163/537

Old Colorado City   1-719-632-2658
     - David Hughes (dave@oldcolo.com) operates an
       Internet/BITNET/Fidonet NAPLPS mailing list
     - about to release Teledraw a combination NAPLPS
       drawing and terminal program

Le Muse   1-514-984-1297
     - 2400 bps
     - an experimental electronic gallery
     - text in French
     - includes a selection of children's art

The Gadget Zone   1-604-946-5815
     - speeds up to v.32bis
     - home of the ONLINE_GRAPHICS echo message area
     - many NAPLPS related files
     - Fidonet address 1:153/951

Harris Technology Associates BBS   1-508-877-7233
     - NAPLPS software for TBBS systems
     - many NAPLPS menus
     - several NAPLPS games
     - illustrated electronic books
     

Hi Res BBS   1-306-782-6820
     - some sample bitmaps converted to NAPLPS with a
       commercial .PCX conversion program
     - full NAPLPS support (running Turboard)
     - sysop Warren Zatwarniski
     - Fidonet 1:140/111

Online Acess magazine
     the Summer 1992 has an article about several on-line
     NAPLPS art galleries. It includes several wonderful
     photos of sample NAPLPS artwork captured from a low-
     resolution 16-color video display

BoardWatch magazine
     The December 1992 issue has an article on NAPLPS
     support by several BBS systems. It includes 6 color
     photos of NAPLPS screens.

Byte magazine
     There was a series of 4 articles (55 pages in total)
     explaining much of the NAPLPS coding system and
     discussing the potential for NAPLPS. These articles
     were in the February, March, April and May 1983 issues.
     In the 2nd article, a small NAPLPS image is decoded and
     explained in detail. To recreate that image, cut out
     the following lines between the dashed ones and place
     in a file named BYTE.SCR. Then type DEBUG <BYTE.SCR
     This will create the image in a file called BYTE.NAP.
     If you are not using a PC, then you will have to find
     some other means of entering the hex codes into a
     document file. Note the picture will display in PP3 but
     is not editable in MGE. If you create BPREF.NAP and
     prepend it to the image by typing:
     COPY BPREF.NAP+BYTE.NAP BEDIT.NAP
     then you will create an editable version of the same
     image which will actually look more like the original
     as far as line thickness and line texture.
---------8X----cut here-------------BYTE.SCR follows---
E 100 E 3C 49 20 50 3C 64 23
E 108 40 37 49 60 40 48 60 40
E 110 48 42 40 46 46 40 60 40
E 118 40 40 46 47 40 6A 60 3C
E 120 52 23 44 24 48 57 44 31
E 128 40 7C 40 25 78 44 60 3C
E 130 40 35 40 61 47 47 66 41
E 138 25 47 55 64 F 48 6F 75
E 140 73 65 E 3C 6D 24 42 68
E 148 47 F 42 49 52 44 53 E
E 150 2F 41 77 50 47 47 64 47
E 158 47 54 2D 40 40 54 40 40
E 160 76 23 40 25 40 49 4A 2D
E 168 47 47 64 47 47 54 2D 40
E 170 40 54 40 40 76 24 52 70
E 178 3C 7F 2D 78 78 66 40 48
E 180 5B 2D 40 48 47 47 47 75
E 188 2D 40 51 49 47 45 44 2D
E 190 7F 6F 5B 78 68 7B 35 40
E 198 41 79 40 48 74 47 56 4D
E 1A0 25 78 62 54 F 43 4C 4F
E 1A8 55 44 E 3C 6D 25 47 44
E 1B0 6A 23 42 29 7F 75 74 25
E 1B8 40 52 62 23 41 29 7F 75
E 1C0 74 23 40 25 40 52 67 29
E 1C8 7F 75 74 25 40 52 60 22
E 1D0 4C F 52 41 49 4E E 22
E 1D8 40 3C 40 24 40 40 40 35
E 1E0 50 46 42 40 51 66 40 50
E 1E8 60 7F 6D 76 77 62 72 24
E 1F0 50 42 44 F 52 4F 41 44
E 1F8 E 22 40 40 40 4A 64 24
E 200 4A 45 47 F 46 69 67 75
E 208 72 65 20 31 E 3C 76 24
E 210 42 7E 78 F 46 69 67 75
E 218 72 65 20 31 0
N byte.nap
RCX
11E
W
Q
---------8X----cut here-------BPREF.SCR follows----
E 100 E 20 7F 4F 21 48 40 40
E 108 49 3E
N bpref.nap
RCX
A
W
Q
------------8X---cut here-----uuencoded----------------------
begin 600 memra2.nap
M&!LB1H4?0$"@_\^AS<#`R<"^X,"\^/___[[DP+S2TM+2ONC`O.CMZ,6^[,"\
MR<G)R;[TP+SAZO'TOOC`O,WHS<&^_,"\^,#`P+[;T+[;T-O0H-#`H\#`TL#`
MOOC`P,"WT>K>Y,#`P.C`P,#PP,#`Z,?'Q_;'Q\?NQ\?'[L?'Q^7'Q\?LQ\?'
MW<?'Q]W'Q\?<Q\?'TL?'Q]C'Q\?0Q\?&S<?'QLSX\.CPQ\?'R<?'Q\O'Q\?:
MQ\?'V\?'Q]7'Q\?EQ\?'WL?'Q^?'Q\?FQ\?'Y\#`P.#`P,#@P,#`VL#`P-G`
MP,#9P,#`TL#`P-G`P,#3P,#`TL#`P-/'Q][/____\____^3____M____W/__
M_^7____=____Y?___]W____/____UOCX^,#X^/C(^/CXR?CX^,KX^/C+^/CX
MT_CX^-SX^/CC^/CX[?CX^.3X^/CE^/CX]?CX^/7X^/CU^/CY\<#`P<+`P,'"
MP,#!TL#`P=G`P,#?P,#!Z,#`P/_`P,#1P,#`T\#`P-C`P,#;P,#`T,#`P-K`
MP,#9P,#`T<#`P.'`P,#AP,#`V+?9XO[?P,#`Z,#`P/#`P,#HP,#`Z,?'Q_;'
MQ\?OQ\?'[L?'Q^W'Q\?>Q\?'W<?'Q^7'Q\?5Q\?'T\?'Q]7'Q\?,Q\?'Q,?'
MP,K'Q\?'Q\?'Q\#`P,C'Q\?'P,#0P,?'Q,3X^,CHP,#!P/___]7____5____
MSO___\_____.^/CXP/CX^-+X^/C2^/CXXOCX^.KX^/CI^/CX]/CX^.KX^/C[
M^/CX\_CX^/+X^/GJ^/CY^\#`P='`P,'AP,#`[L#`P.3`P,#\P,#`\\#`P/K`
MP,#PP,#(P,#`P/#'Q\??Q\?'U\#`P-C'Q\?7Q\?'U\#`P,C`P,#8P,#`T,#`
MP-_`P,#.P,#`Q?CX^.WX^/CK^/CXZOCX^.KX^/CB^/CXZ?CX^.'X^/C8____
MW______X^/CP^/CXZ/____;____W____[_____;____V^/CHP\#`P-W`P,#;
MP,#`U,#`P./`P,#CP,#`Z\#`P.'`P,#JP,#`V,#`P-+`P,#1P,#`T,#`P-#`
MP,#8P,#`T+[;T,#`M]GA_?3`P,#8P,#`V,#`P-#'Q\??Q\?'UL#`P-#'Q\?6
MQ\?'U\?'Q\O'Q\?$Q\?'P_____3____N____[O___^_____F^/CXX/CX^.#X
M^/C@^/CXZOCX^.KX^/CK^/CX^_CX^/K`P,#%P,#`S,#`P,O`P,#:P,#`VL#`
MP-K`P,#AOOC`P,"WT-?PQ\#`P,7`P,#,P,#`S<#`P-7`P,#3P,#`W<#`P-O`
MP,#;P,#`T<#`P-'`P,#)P,#`V<#`P-#`P,#9P,#`T,#`P-C`P,#0P,#`T,?'
MQ]_`P,#0Q\?'W\?'Q]?'Q\?/Q\?'U\?'Q^7'Q\?=Q\?'T\?'Q]7'Q\?3Q\?'
MR\?'Q\3'Q\?+____^\?'Q\3____\____\_____3____T____[?___^7____V
M^/CX^/CX^/#____O____]_CX^.CX^/CP^/CX\/CX^.CX^/CP^/CXZ/CX^/'X
M^/CI^/CX^/CX^/#X^/CR^/CXZ_CX^.OX^/CL^/CX]/CX^/7X^/C\^/CX_*'-
MP,#`V[[;T,#`M]#?P<+'Q\?%Q\?'S<?'Q\W'Q\?&Q\?'SL?'Q\W'Q\?6Q\?'
MSL?'Q]['Q\?7P,#`V,#`P-C`P,#@P,#`T,#`P-'`P,#:P,#`VL#`P,+`P,#3
MP,#`P\#`P,K`P,#"P,#`P\#`P,/`P,##P,#`PL#`P,/X^/CZP,#`P_CX^//`
MP,#!^/CXZOCX^.KX^/CQ^/CX\/CX^.#X^/CP^/CX\/CX^/#____W____]___
M_______W_____O____S____\____^Z'-P,#)P+[XP,#`M]#VYO?`P,##P,#`
MT\#`P,K`P,#"P,#`RL#`P-+`P,#2P,#`T<#`P.+`P,#8P,#`XL#`P.'`P,#(
MP,#`T,#`P,C`P,#8P,#`T,#`P-#`P,#0P,#`T<#`P,G`P,#1P,#`R,#`P-'`
MP,#)P,#`R<#`P,+`P,#"P,#`P_CX^/KX^/CZ^/CX\OCX^.KX^/CQ^/CXZ/CX
M^.'X^/C@____[____^_____N_____O____[____]_____?CX\/#`P,##P,#`
MPL#`P,O`P,#+P,#`TL#`P-/`P,#:P,#`V<#`P-K`P,#9P,#`Z<#`P.#`P,#@
MP,#`V,?'Q]_'Q\?GQ\?'U\?'Q]_'Q\?6Q\?'U\?'Q]W'Q\?%Q\?'S<?'Q\W'
MQ\+'Q\?'Q\?'Q\;'Q\?&Q\?'Q\#`P-#`P,#(P,#`R,#`P,G`P,#(Q\?'P/CX
M^/#____W^/CX\/CX^-GX^/CI^/CXZ_CX^/S____V____[O___^[____O____
M[____^?X^/CH^/CXX/CX^.CX^/CH^/CXZ/CX^/'X^/CQ^/CXZ_CX^/+X^/CR
M^/CX^OCX^/KX^/C[P,#`PL#`P,&WV,[6S\#`R.#'Q\?'__________[____]
M____]?____7____N____]O____?X^/CP______CX^/#____O^/CXZ/CX^.CX
M^/CH^/CXV/CX^.CX^/CI^/CXX?CX^.GX^/CJ^/CX\_CX^//X^/CM^/CX]?CX
M^/?`P,#&P,#`Q<#`P,7`P,#,P,#`U,#`P,S`P,#3P,#`T\#`P-O`P,#:P,#`
MTL#`P-K`P,#2P,#`V<#`P-C`P,#9P,#`V,#`P-C'Q\?7P,#`V,?'Q]?'Q\?7
MQ\?'W\?'Q]?'Q\?5Q\?'U\?'Q\['Q\?6Q\?'UL?'Q]+'Q\?1Q\?'P<?'Q\GX
M^,CHQ\?'RL?'Q\/'Q\?4Q\?'U,?'Q]W'Q\?GQ\?'W\#`P.C`P,#8P,#`T,#`
MP-'`P,#1P,#`T<#`P-+`P,#)P,#`RL#`P,G`P,#*P,#`R+?1TN;$P,#`X,#`
MP-C'Q\?FQ\?'Y\?'Q]W'Q\?=Q\?'UL?'Q]W`P,#TP,#`[,#`P//`P,#RP,#`
M\<#`P/+`P,#XQ\?']L#`P.C'Q\?>Q\?'Y<?'Q]['Q\;XQ\?%X<?'Q,['Q\3'
MP,#`R,?'Q\?'Q\?'P,#(Z,?'Q,[X^,CPP,'#P_CX^.3X^/CB^/CXXOCX^.'_
M___G____Y____^_X^/CP____[?____7____]_____<?'P,?'Q\?'Q\?'S\#`
MP-#'Q\__Q\?$Q_CXR.C`P<+#P,#`P_CX^/SX^/CR^/CXZOCX^/+X^/CI^/CX
MX?CX^.#____G____Y____^7____MQ\?`P<?'Q\?'Q\?/P,#`T<?'S_?'Q\3'
M^/#XX,#`P\+`P,CHP,#`R<#`P,C`P,#!P,'`Q<#`P,'X^/CZ^/CX^/CX\-C`
MP,+'P,#PT,?'Q]'`P,#@P,#`V<#`P-K`P,#BP,#`V<#`P-'`P,#9P,#`V<#`
MP-#`P,#8P,#`V+?9PL[<P,#`X,#`P.#'Q\?>Q\?'Y\?'Q^7'Q\?=Q\?'UL?'
MQ]W`P,#TP,#`[,#`P//`P,#JP,#`^<#`P/+`P,#PQ\?'_L#`P.#'Q\?FQ\?'
MY<?'Q]['Q\;XQ\?%X<?'Q,;'Q\3'P,#`R,?'Q\_'Q\?'P,#(\,?'Q,;X^,CH
MP,'#P_CX^.SX^/CB^/CXXOCX^.'____?____[____^_X^/CP____[?____7_
M___U_____<?'P,?'Q\?'Q\?'S\#`P,C`P,#(Q\?7Q\?'Q,?X^,C@P,'"P\#`
MP,/`P,#$^/CX\OCX^.KX^/CJ^/CX\?CX^.+X^/C8____Y____^?____M____
M]?__^/C'Q\?'Q\?'S\#`P,G`P,CXQ\?$QOCP^.#`P,/"P,#(Z,#`P,G`P,#!
MP,#`R,#!P,7X^/CYP,#`POCX^/CX^/#8P,#"Q\#`\,C'Q\?9P,#`V,#`P.'`
MP,#:P,#`VL#`P-G`P,#9P,#`V<#`P-'`P,#8P,#`V,#`P-"^V]#`P+?1ZO/#
MQ\?'W,?'Q]S'Q\?3Q\?'R?CXT-#`P,#5P,#`UL#`P-[`P,#CP,#`VL#`P-G`
MP,#@P,#`V<#`P-C'Q\?GQ\?'W[[XP,#`M]G:]MS'Q\/&^/CXV/___][____6
M____YO___]W____<____Y/____/___[N___^]<?'QL7'Q\;$P,#8P<?'Q,7X
M\/#0P,##PL#`T,#`P<'`^/CPP,#`P\#`P/#8Q\?$Q\#`P._`P,#<P,#`U,#`
MP-/`P,#2P,#`V\#`P-'`P,#9P,#`T<#`P-'`P,#0P,#`T<#`P.G`P,#8P,#`
MV+?8[NS<P,#!QL#`R/C'Q\;"M]CGX<7`P,#-P,#`S<#`P-/`P,#4P,#`U,#`
MP-K`P,#:P,#`T\#`P.+`P,#AP,#`X<#`P.#`P,#@P,#`V,?'Q]_'Q\?7Q\?'
MWL?'Q]_'Q\?>Q\?'U<?'Q]7'Q\?,Q\?'S,?'Q\OX^/#H^/CX],#`P,/X^/CS
M^/CX\OCX^/'X^/CR^/CXX/CX^.CX^/C8____YO___^W____M____]/____O_
M___Z____^<?'Q\O'Q\?+Q\?'T\?'Q]3'Q\?5Q\?'Y\?'Q]_`P,#@P,#`V,#`
MP-G`P,#9P,#`V\#`P-+`P,#2P,#`Q,#`P-3`P,C8_____/____S____\____
M]?____7____U____[O___^_____O____[_CX^.#X^/C@^/CX\/CX^/#X^/CH
M^/CX\?CX^/#X^/CI^/CXZ?CX^/+X^/CJ^/CX\OCX^/3X^/C[^/CX]/CX^/WX
M^/C]P,#`Q<#`P,+`P,#"P,#`P[?8WMS4P,'`Q\#`R-C'Q\;%P,#`PL#`P,'`
MP,#1P,#`RL#`P-#`P,#+P,#`T,#`P-+`P,#9P,#`V<#`P-C`P,#0P,#`X,?'
MQ^?'Q\??Q\?'W\?'Q]?'Q\?=Q\?'SL?'Q]W'Q\?.Q\?'S,?'Q\7'Q\?#Q\?"
MP?CX\.#`P,7$P,#`P\#`P,3X^/C[^/CX^_CX^//X^/CI^/CXZ?CX^.CX^/CH
M^/CXX/____;X^/CH____]O____?____V_____O____3'Q\?&Q\?'Q<?'Q\7'
MQ\+'M]G8P.['QL/&^/CPV,#!Q,*AS<#`P-N^V]#`P+?8Q_+BP,#8\,#`P,+`
MP,#$^/CX\_CX^/OX^/CS^/CXZ?CX^.CX^/C@^/CX\/CX^/#X^/CX____]___
M__;____W_____O____[____VQ\?'Q<?'Q\:AS<#`R<"^^,#`P+?0_OS$P,'`
MQ\#`R-#'Q\;#P,#`U,#`P-+`P,#2P,#`V\#`P-G`P,#9P,#`Z<#`P.#'Q\;$
M^/CX\/CX^.C____W____]____^_X^/CP__________?____M____]?____S'
MQ\?$Q\?"QZ'-P,#`P+[;T,#`M]#_T>CX^/CP____]_CX^/#____O____[_CX
M^.#____O____]____^_X^/CH____]L?'Q\;'Q\?&Q\?'Q<?'Q\;'Q\?5Q\?'
MYL#`P.#`P,#0P,#`V,#`P-#`P,#0P,#`TL#`P-G`P,#2P,#`R,#`P-+`P,#"
MP,#`PL#`P,*AS<#`R<"^^,#`P+?0[N3<^/CPX/CYZ-_`P,CHQ\?([\#`S_'`
MP,CPQ\?(]\#`S^G`P,C@__[OX?CX\.#X^/;/M]#FY?/`P,;%^/CP^,#`P</`
MP,C(P,#"Q,#`R-C'Q\7$P,#(V,?'QL7X^/#HQ\?"PL?'Q\?'Q\?-P,#`R,?'
MQ\[`P,#(Q\?'S\#`P,C`P,#0P,#`R<#`P-#'Q\;&^/CX\/CX^/#X^/CP^/CX
M^/CX^.#X^/CP^/CXZ?CX^/'X^/CY^/CX\OCX^/FWT.;$U,#`Q\7X^/#PP,#!
MPL#`R-#`P,'$P,#`S<#`P,/`P,#+P,#`TL#`P-'`P,#:P,#`V<#`P-C`P,#(
MP,#`R,?'Q]_`P,#8Q\?&Q?CX^-CX^/CX^/CX\/_________^^/CX^/____W'
MQ\?&Q\?&Q\#`R.#'Q\;&^/CPX,?'P,.WT-?ER?CX\.#`P,##^/CX^_CX^/SX
M^/CZ^/CX\OCX^/+X^/CI^/CXZOCX^/#X^/CH^/CXZ?CX^.CX^/C@____Y_CX
M^.#____E____[O____;'Q\?#_____,?'Q\O'Q\?5Q\?'W<?'Q_?'Q\?FQ\?'
MY\#`P.C'Q\?>P,#`X,?'Q]_`P,#0Q\?'U\?'Q^['Q\?NQ\?'Y<?'Q]7'Q\?=
MQ\?'T\?'Q\W'Q\?"Q\?'P_____O____T____[/____7____F____YO___^__
M___O^/CX\/CX^/#____W^/CX\/CX^.CX^/CP^/CXZ/CX^.#X^/C8^/CXX?CX
M^.#X^/CJ^/CXZ/CX^.KX^/CI^/CXYOCX^.WX^/COP,#!P<#`R.#'Q\?$Q\?'
MS<?'Q\S'Q\?5Q\?'UL?'Q]['Q\?>Q\?'U\?'Q^?'Q\??P,#`V,#`P-C`P,#8
MP,#`V,#`P-G`P,#9P,#`T,#`P-G`P,#2P,#`T<#`P-+`P,#+P,#`R\#`P,/`
MP,#"P,#`POCX^/K`P,#!^/CX^OCX^/'X^/CR^/CX\?CX^/'X^/CI^/CXZ?CX
M^.'X^/CA^/CXX?CX^.CX^/CI^/CXX?CX^.GX^/C@^/CX\_CX^.GX^/CJ^/CX
M\OCX^/+X^/C[^/CX\_CX^/O`P,#$P,#`Q,#`P,S`P,#3P,#`S,#`P-/`P,#3
MP,#`V\#`P-K`P,#1P,#`V,#`P-'`P,#1P,#`V,#`P-#`P,#9P,#`V,#`P.#'
MQ\??P,#`V,#`P.#'Q\?6P,#`V,?'Q]?'Q\?6Q\?'YL?'Q]['Q\?<Q\?'S<?'
MQ]7'Q\?,Q\?'Q;?;Z/SH^/CQW/#8V,#'Q\7`R.#HP/CX\>3`P-C(P,#!Q+?9
MZ_''P,#)[<'%P,3X^.#XQL+'Q,#`R>3'Q\3'P,#(Z+?1P_ODQ\?.X\C@Z,#`
MP,/!\-C8P,?'SNSX^.#XQ\?&P[?3R,W$___VY,;"Q\3`P-C(P<7`Q/__]MS`
MP,/`^/CPX+[;T,#`M]+!]<K`P.OAQ\?`^___U-:WV??!]/CXRO#__O_RQ\?V
MS+[XP,#`M]'NV]'____N____[O___]S____2____T____]S____D____]_CX
MZ?/X^/',^/CQU_CX\NCX^/+Y^/CZPOCX^N/X^/KS^/CY\<#`P<+`P,'!P,#!
MR<#`P,[`P,#.P,#`S<#`P,[`P,'8P,#`W\#`P=C`P,#?P,#`Y\#`P.?`P,#F
MP,#`Y\#`P,'X^/CY^/CXTOCX^,GX^/C0^/CXR?___]?X^/C`^/CXT/CX^,C_
M___O^/CXZ/___^_X^/CH____Y_CX^/#X^/C@____[___]_[___?V___W_O__
M]_3___?]___W_O__]_W___?\___W_?___\7___?]___W_/___\7____#___W
M_/___\S____$___W_/___\O____#____Q?___\3____+____Q,#`P-/`P,#;
MP,#`VL#`P-+`P,#;P,#`VL#`P./`P,#:P,#)T,#`R-?`P,C?P,#(W\#`R-_`
MP,C?P,#(U\#`R-_`P,C>P,#(WL#`R.?`P,CDP,#(YL#`R-W`P,CLP,#(Y,#`
MR,/`P,C"P,#(R<#`R,G`P,C*P,#(P,#`R,C`P,C`P,#`^,#`P/#`P,#PQ\?'
M]\?'Q__'Q\?OQ\?']\?'Q_;'Q\?NQ\?'Y\?'Q^;'Q\?NQ\?'WL?'Q^;'Q\?E
MQ\?'W<?'Q\;'Q\?'Q\?'QL?'Q\;___?Z___W\O__]_G___?Z___W^?___L__
M__[6___^[/___>''Q\7`Q\?%V,?'Q?''Q\;TQ\?&_,?'SL7'Q\[/Q\?.S\?'
MS]C'Q\_9M]'E_\W`P,#)P,#`Y,#`P.S`P,#MP,#`]L#`P.O`P,#CP,#`X<?'
MS];'Q\_&Q\?/U\?'S\['Q\_/Q\?/S\?'S\_`P,C(P,#(T,#`R,C`P,C(P,#(
MR,#`R,G`P,C*P,#(R<#`R,K`P,#9P,#`V<#`P-G`P,#@P,#`VL#`P-G`P,#9
MP,#`V,#`R,/`P,C#P,#(PL#`R,+`P,C#P,#(PL#`R,/`P,#ZP,#(RL#`P/O`
MP,C"P,#(PL#`R,+`P,C#P,#(PL#`R,G`P,#ZP,#`^<#`P/G`P,C"P,#(P,#`
MP/'`P,C"P,#(P,#`P/C`P,#YP,#`^<#`R,#`P,#XP,#`^,#`R,#`P,#XP,#`
M\,?'Q_?`P,#PQ\?']\#`P/#`P,#HP,#`\,?'Q^_'Q\_FP,#(V,?'S^;'Q\_>
MQ\?/WL?'S^7'Q\_?Q\?/WL?'S^7'Q\_>Q\?/WL?'S]W'Q\_?Q\?/WL?'S^7`
MP,C8P,#`R,?'Q\;'Q\?'____]O____?X^/CP____]_CX^.C____O____]_CX
M^.C___?^___W__CX\/CX^/#X^/CP^/CX\/CX^/C"^/CP^?CX^,KX^/C1^/CX
MROCX^,GX^/C*^/CXT?CX^,+X^/C1^/CPZ_CX\.KX^/#J^/CP\?CX\.GX^/#Q
M^/CPZ/CX\/#X^/C(^/CXT/CX^-C____7^/CXT/___\_____7^/CXV/___^__
M___G____Y____^?X^/C@____Y_CX^.#X^/CH___WUO__]\W___?,___WU/__
M]]S___?-___WT___]\O___?=___WT___]]S___?3___WT___]\W___?5___W
MW/___\[X^/C8____S____]?____7____U_CX^,CX^/C0____U_CX^-#X^/C0
M^/CXR/CX^-GX^/C0^/CXR?CX^-'X^/C2^/CXT?CX^-+X^/C2^/CXTOCX^-KX
M^/C3M]K*R,+X^/G\^/CY^_CX^>OX^/GB^/CYXOCX^='X^/G1^/CYR/CX^,_X
M^/#^^/CP]OCX\/WX^/#T^/CPZ_CX\/'X^/#AQ\?$Q\?'S]?'Q\_'Q\?/QL?'
MS\7'Q\?\Q\?'_,?'Q_O'Q\?JQ\?'\<?'Q^K'Q\?JQ\?&W\?'Q]G'Q\;7Q\?&
MS\?'QL^WTOC:T<#`R.#`P,C3P,#(VL#`R-3`P,C-P,#(U<#`R,_`P,#_P,#!
M^,#`P?'`P,'QP,#!X\#`P>+`P,';P,#!R\#`P<OX^.C`___^______C___[W
M____Z/___^C____9____V?___]/____9____R____\O____-____Q?___\?_
M___&___W][?2ZNCRQ\?&Q<?'QM7'Q\;=Q\?&YL?'QN7'Q\;OQ\?&_\?'Q_C'
MQ\_!Q\?/P<?'S\/'Q\_;Q\?/U,?'S];'Q\_5P,#(V,#`P\'X^/C!^/CXPOCX
M^,'X^/#[^/CXR_CX^,WX^/C5^/CXU_CX^-7X^/CG^/CXW_CX^>CX^/GH^/CY
M\?CX^?CX^/GYM]+[WM/___?O___W]___]_7___?T___WZ____\+____"____
MP?___\C___[/___^W____N;___[F___^[?___O7'Q\;$P,#8P,#`P<G`P,')
MP,#!T<#`P-_`P,'9P,#`[L#`P.;`P,#WP,#`]L#`P/7`P,#\P,#`_,#`R,O`
MP,C"P,#(P<#`R,&^],#;T*+`P,#!_>&XR/CMVLC\_^L*#U=I;F1O=W,@<')O
M9W)A;7,-"B`J("H@1V%M97,@*B`J#0I'<F%P:&EC<R!S;V9T=V%R9:'-P,#)
M[:/$OM+0\,"SR_#MPO7(Z,JAS<#`R<"CP+[LP-+0HO#`P,#F];C"RM+ZR.7>
MVPH/365M<F$@4V]F='=A<F4@26YC+B!W87,-"F9O=6YD960@:6X@,3DX-B!B
M>2!-:6-H865L#0I$:6QL;VX@86YD($UA<F=A<F5T($-L87!P:7-O;BX-"E1H
M92!F:7)S="!S:&%R97=A<F4@<')O9W)A;0T*<F5L96%S960@:6X@,3DY,R!W
M87,@82!U=&EL:71Y#0IT;R!A9&0@5VEN9&]W<R!I8V]N<R!T;R!A#0I.05!,
M4%,@9')A=VEN9RZAS<#`P.2^X,#2T+C!S]3<P-+!P;G$P,#`P,#`P,#`P,#`
MP,#`P,#`P,#`P,#`P,CBR.+(XLCBP,#`P,#`P,#`P,#`P,#`XLCBR.+(XL#\
MP,#`P,#`P,#`P,#`P,+`P,#`P,#`__#`P,#`P,#`P,#`P,#`R,'WW??=\/__
MP,#`P,#`P,#`P,#`P,#@Q]S'W?#___S`P,#`P,#`P,#`P,#`PL#=\-WP____
M\,#`P,#`P,#`P,#`P,#(P??!\/_____`P,#`P,#`P,#`P,#`P,#'W?#_____
M_,#`P,#`P,#`P,#`P,#`P,#`_______PP,#`P,#`P,#`P,#`P,#`P/S`____
M_\#`P,#`P,#`P,#`P,#`P,#\Q\/____\P,#`P,#`P,#`P,#`P,#`_,?#____
M_,#`P,#`P,#`P,#`P,#`P/S'P_____S`P,#`P,#`P,#`P,#`P,#\Q\/____\
MP,#`P,#`P,#`P,#`P,#(_,?#_____,#`P,#`P,#`P,#`P,#`S^#'P_____S`
MP,#`P,#`P,#`P,#`PLC\Q\/____\P,#`P,#`P,#`P,#`P.+(X,?#_____,#`
MP,#`P,#`P,#`P,?BR.#'P_____S`P,#`P,#`P,#`P-WXWLC@Q\+/___\P,#`
MP,#`P,#`P_CA]^'XX,G#^/___,#`P,#`P,#`P,#/XL?>Q^#)Y,_C__S`P,#`
MP,#`P,#`P/[(W?C<R>;0_L_\P,#`P,#`P,#`P,##^.'WX,GFT./X_,#`P,#`
MP,#`P,#`P,_BQ]S)YM#BS^#`P,#`P,#`P,#`P,#`_LC<R>;0XLC`P,#`P,#`
MP,#`P,#`P,/XX?#FT.+(P,#`P,#`P,#`P,#`P,#`S^+'PM#BP,#`P,#`P,#`
MP,#`P,#`P,#^R-S`W,#`P,#`P,#`P,#`P,#`P,#`P,CA\,#`P,#`P,#`P,#`
MP,#`P,#`P,#`P,#`P,#`P,"XP=_\Y,#2P<&YQ,#`P,#`P,#`P,#`P,#`P,#`
MP,/PP,#`S\/PP,#`P,#`P,#\S\/P_,_`S\#`_,#`P/S/P_#`P,#`P,#`P,#`
MP,#`P,#`P,#`P,#`_,_#\,#`P,##\,/PP,#`P,#`P,#`P,#`P,#`P,#`P?_`
MP,#`P,#`P,#`P,#`P,#`P,#!]]S'_,#`P,#`P,#`P,#`P,#`P,#`W?#?\-WP
MP,#`P,#`P,#`P,#`P,#`Q]S'P__!\,#`P,#`P,#`P,#`P,#`P,?!\/S/P?#`
MP,#`P,#`P,#`P,#`P,#'W,?#_\'PP,#`P,#`P,#`P,#`WL#`P-WP__#=\,#`
MP,#`P,#`P,#!]\'XP_##__S'W,#`P,#`P,#`P,#`PL?<P,#/P,#!]\+`P,#`
MP,#`P,#`Q]S'WL#`P/___?#BP,#`P,#`P,#`P,?=\-[`P,?`P,#`XL#`P,#`
MP,#`P,'PW?C`P,'PXLCBP.+`P,#`P,#`P,#!]\'XP,#<R-WWW?#=\,#`P,#`
MP,#`P,?@P,#'PL?=]]WPW?#`P,#`P,#`P,#`P,#!\.'WW??=\-WPP,#`P,#`
MP,#\Q]WXP,#!]]WWW,#=\,#`P,#`P,#/P,?=^.#'W??=]]S`W?#`P,#`P,#`
MQ_S`P??=]]WWW?#`P,#`P,#`P,#'W?#?\-S'W??=]\#`P,#`P,#`P,#!]]W_
MP??`P,#`P,#`P,#`P,#`P,#`W??#__S'P,#`P,#`P,#`P,#`P,#`P-WPW,_\
MQ\#`P,#`P,#`P,#`P,#`P,#=]\/__,?`P,#`P,#`P,#`P,#`P,#`P??__\'W
MP,#`P,#`P,#`P,#`P,#`P,#/__#=\,#`P,#`P,#`P,#`P,#`P,#`P,#'W,#`
MP,#`P,#`P,#`P,#`P,#`P__]]\#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`
MP,#`P,#`P,#`P,#`N,'WY-S`TL'!N<3__\'WW??=]]WWW?##\-WWW??=]]WP
MW__\Q]WWW??=]]WP_L_!]]WWW??=\-W___#=]]WWW??<S^+/_,?=]]WWW?#=
M]__PP??=]]WWP_CC___PW??=]]WPW??<P/S'W??=\/[(_??__\'WW??=\-WW
MW,_C\-WWW,_BS]WWW__\Q]WWW?#=]\/XX__!]\/XX_?=]]W___#=]]WPW?#^
MR/___,#"R/WWW??=]___P??=\-S/XL_=___PPL_=]\#'W???_\#'W?##^./W
MW??__\/WW??!\-WWW?##\-WP_LC]]]WWW__\Q]S'P??=]]WP_L_!\.+/W?#=
M]]W___#=\,'WW??<S^+/_,#C]]S'W??=]__PP??=]]WWP_CC___P_??!\-S'
MW??<P/S'W??=\/[(_??_\,'WP??!]]WWW,_C\-WWW,_BS]WWW_#\Q]S`W??=
M]\/XX__!]\/XX_?=]]WP_,#=]]WWW?#^R/___,#"R/WWP??=\,#/P??=]]S/
MXL_=___PPL_=]\'WW?##^/S'W??#^./WW??__\/WW,#`P-WP_LC_\-WP_LC]
M]]WWW__\Q]WWP??=\.+/___`P.+/W??!]]W___#=]\'WW?#C]]___,#C]]S'
MW,?=]__PP??=]]WP_??=___P_??!\-S'W??<P/S'W??=\-WWW??__\'WP??!
M]]WWW,_C\-WWW,#=]]WWW__\Q]S'W??=]\/XX__!]\/PW,#=]]W__,#=]]WW
MW?#^R/___,#"P,'PW??=]\#/P??=]]S/XL_=___PPL#=\,#'W??#^/S'W??#
M^./WW??__\#`W??<Q]WP_LC_\-WP_LC]]\'WW__\P-WWP??<S^+/___`P.+/
MW?#<Q]W___#=]\'WP_CC]]___,#C]]S'W,?=]__PW??=\/[(_??=___P_??!
M]]S'W???\+C)S\S-P-+!P;G$P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`
MP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`
MP,#_____P,#`P,#`P,#`P,#`P,#`P/__XLCBS___P,#`P,#`P,#`P,#`P,_B
MR.#/X,____S`P,#`P,#`P,#`P,#(X,_@S^#/_,_\P,#`P,#`P,#`P,#`R.#/
MX,_@S_S/_,#`P,#`P,#`P,#`P,C@S^#/X,_\S_S`P,#`P,#`P,#`P,+(X,_@
MS^#/__#_\,#`P,#`P,#`P,#"R,/XP,_@P/_P__#`P,#`P,#`P,#`PLC#^,/X
MXL#_\/_PP,#`P,#`P,#`P,+(P_C#^.+`__#_\,#`P,#`P,#`P,#BR,+(P_CB
MP/__P__`P,#`P,#`P,#`XL#^R,/XXL#__\/_P,#`P,#`P,#`P.+`_LC#\.+`
M_,_#_\#`P,#`P,#`P,#BP/[(P,#BP,#/P__`P,#`P,#`P,#`X,_"R.+(XLC_
M_\/_P,#`P,#`P,#`R.#`XLC________\S_S`P,#`P,#`P,CBR/__P,#`P/__
M__#\P,#`P,#`P,#(___`P.+(XL_`P/___,#`P,#`P,#`S\#`XLC`P,#`___`
MP/S`P,#`P,#`P,#BR,#`XLCBR,#`___`P,#`P,#`P,#(X,#BR.+(XLCBR,#/
M_,#`P,#`P,#"R,+(XLCBR.+(XLCBP/_PP,#`P,#`PL#BR.#`_____\#(XLC#
M\,#`P,#`P,#(XLC@P,#`P,#`R.+(X,#`P,#`P,#`P,+(XL#"R.+`PLCBP,#`
MP,#`P,#`P,#`P.+(P,#`P.+(P,#`P,#`P,#`P,#`P,#`R.+(XLC@P,#`P,#`
MP,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`
MP,"XR=_TS<#2P<&YQ,#`_________________________,#`S___________
M_______________PP,#`P,#`P,#`P,#`P,#`P,#`P,__\,#(XLCBP/______
M____PLC@R.+`__#"R.+(XL#_\,#`_____\+(X,CBP/_PPLCBR.+`__#BP/__
M___"R.#(XL#_\,+(XLCBP/_PXL#_____PLC@R.+`__#"R.+(XL#_\.+`____
M_\+(X,CBP/_PPLCBR.+`__#BP/_____"R.#(XL#_\,+(XLCBP/_PP,#_____
MPLC@R.+`__#"R.+(XL#__________\+(X,CBP/_PPLCBR.+`P,#`P,#`P,#`
MP,#(XL#_\,+(XLCBR.+(XLCBR.+(XLCBR.+`__#"R.+(XLCBR.+(XLCBR.+(
MXLCBP/_PPLCBR.+(XLCBR.+(XLCBR.+(XL#_\,+(X__________________^
MR.+`__#"R.+(XLCBR.+(XLCBR.+(X_CBP/_PPLCA^.+(XLCBR.+(XLCBR./X
MXL#_\,+(XLCBR.+(XLCBR.+(XLCC^.+`__#"R.'XXLCBR.+(XLCBR.+(X_CB
MP/_PPLCBR.+(XLCBR.+(XLCBR./XXL#_\,+(X?CBR.+(XLCBR.+(XLCC^.+`
M__#"R.+(XLCBR.+(XLCBR.+(X_CBP/_PPLCA^.+(XLCBR.+(XLCBR./XXL#_
M\,+(XLCBR.+(XLCBR.+(XLCC^.+`__#"R.'XXLCBR.+(XLCBR.+(X_CBP/_P
MPLCBR.+(XLCBR.+(XLCBR./XXL#_\,+(X?CBR.+(XLCBR.+(XLCC^,+`__#"
MR.+(XLCBR.+(XLCBR.+(X_C"P/_PPLCA^.+(XLCBR.+(XLCBR./XXL#\P,+(
MXLCBR.+(XLCBR.+(XLCC^.+`P,#`P,#`P,#`P,#`P,#`P,#`P,#`P,#`ONS`
MTM"XP,_)[\CGZ]T*#U=E(&%R92!A;'-O('=O<FMI;F<@;VX@80T*=71I;&ET
M>2!T;R!C;VYV97)T(%=I;F1O=W,-"FUE=&%F:6QE<R!I;G1O($Y!4$Q04R!D
M<F%W:6YG<PT*<W5C:"!A<R!T:&4@;&]G;R!F;W(@365M<F$N#0I4:&ES(&QO
M9V\@=V%S(&1R87=N(&EN#0I#;W)E;$1R87<L(&5X<&]R=&5D('1O("Y7348-
M"F9O<FUA="!A;F0@8V]N=F5R=&5D('1O#0I.05!,4%,@=VET:"!T:&4@8F5T
M82!T97-T#0IV97)S:6]N(&]F('1H92!U=&EL:71Y+KC`R\3RR./J_`H/06YD
M(&QA<W0L(&)U="!N;W0@;&5A<W0L('=E#0IA<F4@=V]R:VEN9R!O;B!A(%=I
M;F1O=W,-"F=A;64@9F]R(&-H:6QD<F5N('1H870@<VAO=6QD#0IB92!R96QE
M87-E9"!B>2!M:60M07!R:6P@,3DY,RZ^Y,#HP*+PP,#!].NDP,G;_P\@3&]N
19R!L:79E($Y!4$Q04R$:&AH`
`
end
------------8X---cut here--------uuencoded-------------------
begin 600 sail.nap
M#B)`0$!)278A3$!20$`;0R$Y04!`0$!`0$!`0$!P0$!P0$!`0$!`0$!P0$!P
M0$!P0$!P0$!P0$!P0$!P0$!P0$!`0!M%&T,B.4%`0$!`0$!`0$!!?$!#1D!&
M0T!`04!`04!`04!`7T!`04!`04!&0T!#1D!!?$!`0$`;11M#(SE!0$!`0$!`
M0$!`0T9`0T9`3W]`3W]`0T9`0T9`1W]@1W]@06-`06-`0$!`0$!`0$!`&T4;
M0R0Y04!`0$!`0$!P0$!80$!80$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!80$!8
M0$!`0$!`0!M%&T,E.4%`0$!`0$!`0$!`0$!`6$!`6$!`0$!`0$!`0$!`0$!`
M0$!`0$!`6$!`6$!`0$!`0$`;11M#)CE!0$!`0$!`0$!`0%A`0%A`0$!`0$!`
M0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`&T4;0R<Y04!`0$!`0$!`0$!X
M0$%\0$!&0$!&0$!^0$!&0$!&0$%\0$!X0$!`0$!`0$!`0$!`0!M%&T,H.4%`
M0$!`0$!`0$!`1$!`3$!`6$!`6$!`6$!`6$!`6$!`6$!`6$!`6$!`3$!`1$!`
M0$`;11M#*3E!0$!`0$!`0$!`0&!`0'!`0%A`0%A`0%A`0%A`0%A`0%A`0%A`
M0%A`0'!`0&!`0$!`&T4;0RHY04!`0$!`0$!`0$!`0$!`0$-;0$-;0$%^0$!\
M0$!\0$%^0$-;0$-;0$!`0$!`0$!`0!M%&T,K.4%`0$!`0$!`0$!`0$!`0$!`
M6$!`6$!`6$!#?T!#?T!`6$!`6$!`6$!`0$!`0$!`0$`;11M#+#E!0$!`0$!`
M0$!`0WQ`0WY`0T=`0T-`0T=`0WY`0WQ`0T!`0T!`0T!`0WQ`0WQ`0$!`&T4;
M0RTY04!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$=_8$=_8$!`0$!`0$!`0$!`
M0$!`0$!`0!M%&T,N.4%`0$!`0$!`0$!,7T!,7T!,<6!,<6!/<6!/<6!,<6!,
M<6!,7T!,7T!`0$!`0$!`0$`;11M#+SE!0$!`0$!`0$!`3$!`1D!`0T!`06!`
M0'!`0%A`0$Q`0$9`0$-`0$%@0$!P0$!`0$!`&T4;0S`Y04!`0$!`0$!`0$%^
M0$-_0$-#0$-C0$-S0$-[0$-?0$-/0$-'0$-#0$-_0$%^0$!`0!M%&T,Q.4%`
M0$!`0$!`0$!`6$!`6$!`6$!`6$!`6$!`6$!!>$!!>$!`>$!`>$!`6$!`6$!`
M0$`;11M#,CE!0$!`0$!`0$!`0W]`0W]`0T!`0W!`0'Q`0$]`0$-`0$-`0T-`
M0T-`07Y`07Y`0$!`&T4;0S,Y04!`0$!`0$!`0$%^0$%^0$-#0$-#0$!#0$!.
M0$!.0$!#0$-#0$-#0$%^0$%^0$!`0!M%&T,T.4%`0$!`0$!`0$!`1D!`1D!`
M1D!`1D!#?V!#?V!#1D!#1D!#1D!#1D!#1D!#1D!`0$`;11M#-3E!0$!`0$!`
M0$!`0'Y`07]`06-`0$-`0$-`0$-`07]`07Y`06!`06!`07Y`07Y`0$!`&T4;
M0S8Y04!`0$!`0$!`0$!\0$-_0$-#0$-#0$-#0$-_0$-\0$-`0$-`0$-@0$%\
M0$!\0$!`0!M%&T,W.4%`0$!`0$!`0$!!8$!!8$!!8$!!<$!`>$!`7$!`3D!`
M1T!`0T!`0T!!?T!!?T!`0$`;11M#.#E!0$!`0$!`0$!`07Q`0WY`0T9`0T9`
M0T9`0T9`07Q`07Q`0T9`0T9`0WY`07Q`0$!`&T4;0SDY04!`0$!`0$!`0$-^
M0$-^0$!&0$!&0$!&0$-^0$-^0$-&0$-&0$-&0$-^0$-^0$!`0!M%&T,Z.4%`
M0$!`0$!`0$!,6'!,67!&66!'6T!#6T!!?D!!?D!#6T!'6T!&66!,67!,6'!`
M0$`;11M#.SE!0$!`0$!`0$!`1EE@1EE@1EE@1EE@0W]`0W]`1EE@1EE@1EE@
M0$!`0$!`0$!`0$!`&T4;0SPY04!`0$!`0$!`0$%\0$-^0$-&0$-&0$-^0$%\
M0$%`0$%X0$!\0$!&0$!"0$!`0$!`0!M%&T,].4%`0$!`0$!`0$!`0$!`0$!#
M?T!#?T!`0$!`0$!`0$!#?T!#?T!`0$!`0$!`0$!`0$`;11M#/CE!0$!`0$!`
M0$!`1D]@1E]P1EAP1EAP1EAP1WAP1WAP1EAP1EAP1EAP1E]P1D]@0$!`&T4;
M0S\Y04!`0$!`0$!`0$!80$!80$!`0$!`0$!80$!<0$!.0$!&0$%F0$%F0$%^
M0$!\0$!`0!M%&T-`.4%`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`
M0$!`0$!#3$!!9D!!9D!`0$`;11M#03E!0$!`0$!`0%A`0%A`0W]`1W]@1EE@
M1EE@1EE@1EE@1EE@1EE@1W]@0W]`0%A`0%A`&T4;0T(Y04!`0$!`0$!`0$9!
M8$9!8$=!8$=A8$=Q8$9Y8$9=8$9/8$9'8$9#8$9!8$9!8$!`0!M%&T-#.4%`
M0$!`0$!`0$!!?D!#?T!#0T!#0T!#0$!#0$!#0$!#0$!#0T!#0T!#?T!!?D!`
M0$`;11M#1#E!0$!`0$!`0$!`0WQ`0WY`0T9`0T9`0T9`0T9`0WY`0WQ`0TQ`
M0TQ`0WQ`0WA`0$!`&T4;0T4Y04!`0$!`0$!`0$%\0$%^0$!&0$!&0$!^0$%^
M0$%F0$%F0$-F0$-&0$-&0$-&0$!`0!M%&T-&.4%`0$!`0$!`0$!#0T!#0T!#
M0T!#?T!#?T!#0T!#0T!#0T!#0T!#0T!!?D!!?D!`0$`;11M#1SE!0$!`0$!`
M0$!`0T-`0T-`0T-`0T-`0T-`0T-`0T-`0T-`0T-`0T-`0W]`0W]`0$!`&T4;
M0T@Y04!`0$!`0$!`0$-`0$-`0$-`0$-`0$-`0$-^0$-_0$-#0$-#0$-#0$-_
M0$-^0$!`0!M%&T-).4%`0$!`0$!`0$!/?W!/?W!,6'!,6'!,6'!,6'!,6'!,
M6'!,6'!,6'!,6'!,6'!`0$`;11M#2CE!0$!`0$!`0$!`07]`0W]@0T%@0T%@
M0T%@0T%@0T%@0T%@0T%@0T%@0W]@07]`0$!`&T4;0TLY04!`0$!`0$!`0$=C
M0$=C0$%C0$%C0$%C0$%C0$%C0$%C0$%C0$%C0$%_0$!_0$!`0!M%&T-,.4%`
M0$!`0$!`0$!'?V!'?V!!9D!!9D!!9D!!9D!!9D!!9D!!9D!!9D!!?D!`?D!`
M0$`;11M#33E!0$!`0$!`0$!`0WY`0W]`0T-`0T-`0T-`0T-`0W]`0WY`0T!`
M0T!`0T!`0T!`0$!`&T4;0TXY04!`0$!`0$!`0$!80$!80$!80$!80$!80$!8
M0$!80$!80$!80$!80$-_0$-_0$!`0!M%&T-/.4%`0$!`0%A`0%A/?WA/?WA,
M<T!,<T!,<T!,<T!,<T!,<T!,<T!,<T!,<T!,<T!`0$`;11M#4#E!0$!`0$!`
M0$!`0WQ`0W]`0$-`0$-`0$-`0$-`0WY`0WY`0$-`0$-`0W]`0WY`0$!`&T4;
M0U$Y04!`0$!`0$!`0$9#0$9#0$=#0$=C0$=S0$9[0$9?0$9/0$9'0$9#0$9#
M0$9[0$!X0!M%&T-2.4%`0$!`0$!`0$!#0V!#0V!#0V!#3D!#3D!#?$!#?$!#
M3D!#3D!#0V!#0V!#0V!`0$`;11M#4SE!0$!`0$!`0$!`3W%@3WE@3%E@3%E@
M3%E@3%E@3WE@3W%@3$%@3$%@3$%@3$%@0$!`&T4;0U0Y04!`0$!`0$!`0$-^
M0$-^0$-`0$-`0$-`0$-`0$-\0$-\0$-`0$-`0$-^0$-^0$!`0!M%&T-5.4%`
M0$!`0$!`0$!!8$!!8$!!8$!!8$!!8$!!8$!!8$!!8$!!8$!!8$!!?T!!?T!`
M0$`;11M#5CE!0$!`0$!`0$!`3%AP3%AP3%AP3'QP3'QP37YP369P3V=P3T-P
M3T-P3D%P3D%P0$!`&T4;0U<Y04!`0$!!8$!!8$=_8$=_8$9&0$9&0$9&0$9&
M0$9&0$9&0$9&0$9&0$9&0$9&0$!`0!M%&T-8.4%`0$!`0$!`0$!`0T!`0T!`
M0T!`0T!!?T!#?T!#0T!#0T!#0T!#0T!#0T!#0T!`0$`;11M#63E!0$!`0$!`
M0$!`1D%@1D%@1D%@1D%@1D%@1W]@1W]@1D%@1D%@1D%@1D%@1D%@0$!`&T4;
M0UHY04!`0$!`0$!`0$-S0$-S0$!S0$!S0$!S0$%_0$-_0$-#0$-#0$-#0$-_
M0$%_0$!`0!M%&T-;.4%`0$!`0$!`0$!&0T!&0T!#1D!#1D!!?$!!?$!#1D!'
M1T!&0T!`0$!`0$!`0$!`0$`;11M#7#E!0$!`0$!`0$!`0W!`0W!`0T!`0T!`
M0T!`0T!`0T!`0T!`0T!`0T!`0W!`0W!`0$!`&T4;0UTY04!`0$!`0$!`0$!`
M0$%_0$-_0$-`0$-_0$-_0$-#0$-_0$%^0$!`0$%F0$%F0$!`0!M%&T->.4%`
M0$!`0$!`<$!`6$!`6$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`0$!`
M0$`;11M#7SE!0$!`0$!`0$!`1W]@1W]@0$!`0$!`0$!`0$!`0$!`0$!`0$!`
M0$!`0$!`0$!`0$!`&T4;0V`Y04!`0$!`0$!`0$!`0$!_0$!_8$!Q8$!Q8$!_
M8$!_0$-P0$-P0$!`0$!`0$!`0$!`0!M%&T-A.4%`0$!`6$!`6$!`6$!#?T!'
M?V!&66!&66!&66!&66!'?V!#?T!`6$!`0$!`0$!`0$`;11M#8CE!0$!`0$!`
M0$!`0$!`07M`07M`0T]`0T]`0T-`0T-`0T-`0T-`0$!`0$!`0$!`0$!`&T4;
M0V,Y04!`0$!`0$!`0$!`0$%\0$-^0$-&0$-`0$-`0$-&0$-^0$%\0$!`0$!`
M0$!`0$!`0!M%&T-D.4%`0$!`0$!`0$!`0$!!?$!!9D!!9D!!9D!!?$!!9D!!
M9D!!?$!`0$!`0$!`0$!`0$`;11M#93E!0$!`07Y`07]`0$-`0$-`0$-`0']`
M07]`06-`0V-`0T-`0T-`0$!`0$!`0$!`0$!`&T4;0V8Y04!`0$!`0$!`0$!`
M0$%]8$-_8$-#8$-#8$%_8$!#8$!#8$%_0$!`0$!`0$!`0$!`0!M%&T-G.4%`
M0$!`0$!`0$!`0$!!9D!!9D!!9D!!9D!!9D!!9D!!?D!!?D!`0$!`0$!`0$!`
M0$`;11M#:#E!0$!`06!`06!`06!`06!`07Y`07]`06-`06-`06-`07]`07Y`
M0$!`0$!`0$!`0$!`&T4;0VDY04!`0$!`0$!`0$!`0$=_8$=_8$998$998$99
M8$998$998$998$!`0$!`0$!`0$!`0!M%&T-J.4%`0$!`0$!`0$!`0$!!?D!#
M?T!#0T!#0T!#0T!#0T!#?T!!?D!`0$!`0$!`0$!`0$`;11M#:SE!0$!`0$!`
M0$!`0$!`1V9`1V9`069`069`069`069`07Y`0'Y`0$!`0$!`0$!`0$!`&T4;
M0VPY04!`0$!`0$!`0$9!8$=_8$=_8$%F0$%F0$%F0$%F0$%^0$!^0$!`0$!`
M0$!`0$!`0!M%&T-M.4%`0$!`0$!`0$!`0$!`?T!`?V!`<6!`<6!`?V!`?T!`
M<$!`<$!`0$!`0$!`0$!`0$`;11M#;CE!0$!`0$!`0$!`0$!`0%A`0%A`0%A`
M0%A`0%A`0%A`0W]`0W]`0$!`0$!`0$!`0$!`&T4;0V\Y04!`0$!`0$!`0$!`
M<$=_<$=_<$998$998$998$998$998$998$!`0$!`0$!`0$!`0!M%&T-P.4%`
M0$!`0$!`0$!`0$!!?$!`1D!`1D!`1D!`?$!`1D!`1D!!?$!`0$!`0$!`0$!`
M0$`;11M#<3E!0$!`0$!`0$!`0$!`07M`07M`0T]`0T]`0T-`0T-`0T-`0T-`
M0$!`0%A`0$!`0$!`&T4;0W(Y04!`0$!`0$!`0$!`0$%C0$%G0$%F0$%\0$%\
M0$%F0$%G0$%C0$!`0$!`0$!`0$!`0!M%&T-S.4%`0$!`0$!`0$!`0$!'<6!'
M>6!&66!&66!'>6!'<6!&06!&06!`0$!`0$!`0$!`0$`;11M#=#E!0$!`0$!`
M0$!`0$!`0WY`1WY`1D!`1WY`1WY`1D9`1WY`0WQ`0$!`0$!`0$!`0$!`&T4;
M0W4Y04!`0$!`0$!`0$!`0$!P0$!P0$!P0$!P0$!P0$!P0$!_0$!_0$!`0$!`
M0$!`0$!`0!M%&T-V.4%`0$!`0$!`0$!`0$!&06!&06!&06!&66!&66!'?V!'
M9V!'0V!`0$!`0$!`0$!`0$`;11M#=SE!0$!`0$!`0$!`0$%@07]@07]@06-`
M06-`06-`06-`06-`06-`0$!`0$!`0$!`0$!`&T4;0W@Y04!`0$!`0$!`0$!`
M0$!&0$!&0$!&0$%^0$%^0$%F0$%F0$%F0$!`0$!`0$!`0$!`0!M%&T-Y.4%`
M0$!`0$!`0$!`0$!!9D!!9D!!9D!!?D!!?D!!9D!!9D!!9D!`0$!`0$!`0$!`
M0$`;11M#>CE!0$!`0$!`0$!`0$!`069`069`069`0'Y`069`069`07Y`0'Y`
M0$!`0$!`0$!`0$!`&T4.(4Q`0$!)(T!`0$!`/EQ`/EQ`#B%,0$!`22-`0$!`
M0#Y<0!]`0`XA3$!`0$DB0$!`0&91($)"#B%,0$!`22-`0$!`0#Y<0#A"1T!V
M76I&02)`0$!)1$$*#R`@("`@("!!;B!%>&5R8VES92!I;@H-("`@("`@(%!R
M97-E;G1I;F<@0VQA<W-I8PH-("`@("`@(%)U<W-I86X@4&]E=')Y(&EN"@T@
M("`@("`@=&AE(&]R:6=I;F%L+"!O;FQI;F4N"@T*#2`@("`@("!!<G)A;F=E
M9"!B>2`*#2`@("`@("!$+B!(=6=H97,*#2`@("`@("!)+B!+;W-T87)N;W8*
M#0H-("`@("`@(%5S:6YG(%1R;VEK82U496QE9')A=PH-("`@("`@($9R;VT@
M3VQD($-O;&]R861O($-I='D*#2`@("`@("!#;VUM=6YI8V%T:6]N<PH-"@T@
M("`@("`@("`@($UA<F-H+"`Q.3DS"@T.#B%,0$!`22-`0$!`0#Y<0#U<?#U<
M7@PX0D)A0UYP3W\B0$!`06IH"@].;W1E.B!4:&ES(&ES(&$@<W1A;F1A<F0@
M3D%03%!3(&9I;&4L(&UA9&4*#75S:6YG('1H92!$4D-3('1A8FQE(&9U;F-T
M:6]N<R!O9B!.05!,4%,N"@U4:&4@0WER:6QL:6,@4G5S<VEA;B!C:&%R86-T
M97(@9F]N="!I<R`*#7-T;W)E9"!I;B!A($120U,@9FEL92UT86)L92!I;F-L
M=61E9"!A="!T:&4*#6AE860@;V8@=&AI<R!F:6QE+B!)="!W:6QL(&QO860@
M9FER<W0L(&%N9`H-;6%Y('1A:V4@,34@;W(@;6]R92!S96-O;F1S(&%T(#(T
M,#`@8F%U9"X*#0H-5&AE;B!T:&4@16YG;&ES:"!A;F0@4G5S<VEA;B!W:6QL
M(&%P<&5A<BX*#0H-268@>6]U<B!.05!,4%,@5&5R;6EN86P@<')O9W)A;2!D
M;V5S(&YO=`H-<W5P<&]R="!.05!,4%,@<W1A;F1A<F0@1%)#4RP@>6]U('=I
M;&P@;VYL>0H-<V5E('1H92!%;F=L:7-H('1E>'0@86YD(&EL;'5S=')A=&EO
M;G,N"@T./5Q\/5Q\##A"1D!"1V1N9R)`0$!347`*#R`@"@T..$-`0T!7>5UG
M(D!`0%-1<`H;+WL;;R`@("!'9FAE8T`*#0H-#CA"1E-$3TQ>1R)`0$!347`*
M&R][&V\@("!`"@T./5Q4&!LB1AM%'P\.(5%`0$!)0"-`0$!`0$D^?$!`0#=*
M0%5:0']_15%`>'AH6$!_=W)W0$='0T)`1T=4=D!'1VUI0$='9GQ`0$!0<$!`
M2%!X0$!`8'A`0$!92$!'3U9G0$!(<'Q`0$!8;$!`0&!80$!`4$!`1T]V8$!`
M0'A40$!(4%M`0$!P8$!'1V=$0$!(2%=`0$!8:$!`2$A00$!(:U5`0$!26D!X
M>%U/0'AX3$5`>'!C54!X<'%30$!`8W5`0$!Q>T!X>$!H0']O?W-`>'A)>T!P
M<'A@0']_9E%`?W]>?$!_?WUA0']W:D=`/E]P0$`W2FA?1$!'3E-%0$!!3VA`
M/D!`-TIH5V!`0$!`0$`W2FA7;$!`2%IV0#=*<4M-0$='1G!`0$!`4$!X>'AH
M0$='1TQ`0$!`64!X>'I*0#=)=VY30$!`0$!`-TEW;DI`0$!`0$`W27=M7T!'
M1T5U0$='1U)`0$!`44!X>'-Y0#=*<7)20$!`0$!`-TIQ<F!`1T9):4!`0$!(
M0'AY=EY`-TIQ2TU`0$!`<$!'1T=F0$!`0%!`1T='5D!'1T]*0'AX<&)`>'AX
M0D`W26]T2T!`0$!80#=);W5Q0$='3WA`1T='5$!'1T]D0$='7G]`1T=?2T!`
M0$AH0$!`2%A`0$!`5$!X>'!?0'AX<&5`>'AP3$!X>&A]0'AX>'!`?W]^=$!X
M>'%/0'AX:%1`>'AH<T!X>'!00']_?W9`1T=':4!'1T=T0#=);V1U0$='1VM`
M1T=/<T!'1U]!0$='5V-`>'A344!_?W=20#=)=U)O0$='1V1`1T=/8T!'1U]S
M0'AX:7%`>'A@6T`W27=:3T!'1T],0#=)=WEL0$!`2$!`-TEW6G1`0$!`:$!`
M0$!(0#=)=WEZ0$!`6%!`>'AP;$`W26]E14!'1TU40$='1WQ`1T='?4!'1T=Q
M0$!`0&A`1T=74T!`0$A`0$='3UI`1T=?2D!'1U=.0$!`2'M`0$!!6$`W27]A
M7T!'1T9$0']_=T9`>'AY5$`C1#Y;4$!`-TE'65Y`0$!`0$`.#PXA3$!`0$DC
M0$!`0$`^7$`]7%0X04-/259V3&<B0$!`241\"ALO>QMO("`@("`@5EX^7B!+
M=&AV:GEN:F0*#0H-("`@("`@5FIC<F1F7B!(:F-C8GH*#0H-("`@("`@("`@
M("`Q.#,R"@T*#0X]7'(,.$)'0UM?2UI+(D!`0$IZ;@H;+WL;;R`@(`\B5&AE
M(%-A:6PB"@T*#0X]7%0X0D-+259S2V<B0$!`241\"@\@("`@("`@("`@("!B
M>0H-"@T@("`@("!-+EDN($QE<FUO;G1O=@H-"@T@("`@("!-;W-C;W<L(%)U
M<W-I80H-"@T@("`@("`@("`@(#$X,S(*#0H-#CU<7CA`1T%S7W-.8R)`0$!!
M:%,*#R!/<FEG:6YA;"!T<F%N<VQA=&EO;B!B>2!)<FEN82!::&5L97IN;W9A
M+@H-($UO9&EF:65D(&)Y($1A=FED($AU9VAE<RX@3D%03%!3('!R97-E;G1A
M=&EO;@H-($-O<'ER:6=H="P@1&%V:60@2'5G:&5S+"!#;VQO<F%D;R!3<')I
M;F=S+`H-($-O;&]R861O+"`Q.3DS+@H-#CU<?#U<5`P.(4Q`0$!)(T!`0$!`
M/EQ`.$)'='-7=DMC(D!`0$E$?`H;+WL;;RQT:W1T;B!G9FAE8R!J;&)J<FIQ
M"@T..$)-0%M?5F]W(D!`0$%H:`H/02!L;VYE('=H:71E('-A:6P@<VAO=W,@
M9F]R(&%N(&EN<W1A;G0*#0X]7&@X0D)^;5].8TLB0$!`241\"ALO>QMO1"!N
M979F>70@=FIH9B!U:FME/&IV)"T*#0XX0D![<5]5;W<B0$!`06AH"@]7:&5R
M92!G;&5A;7,@=&AE('-E82P@86X@87IU<F4@<W1R96%K+@H-"@T./5QH.$%.
M04-?7FM.(D!`0$%\:0H;+WL;;UAN:B!B;W1N(&IY(&0@8VYH9GET(&QF:W1R
M:G$_"@T..$%+1EI?5D=,(D!`0$%H:PH/5VAA="!L969T(&ET(&EN(&ET<R!H
M;VUE;&%N9"!D:7-T86YT/PH-#CU<:#A!251%7UY#1B)`0$!)1$$*&R][&V]8
M;FH@<F)Y96L@:GD@9"!R:&8N(&AJ;'EJ=C\*#0XX0$]A1%=^3V\B0$!`06AH
M"@]);B!A;&EE;B!L86YD<R!W:&%T(&1O97,@:70@<V5E:S\*#0X]7'P.(4Q`
M0$!)(T!`0$!`/EQ`#B%,0$!`22-`0$!`0#Y<0#U<7@P.(4Q`0$!)(T!`0$!`
M/EQ`.$-(2$A?9G-S(D!`0$E$?`H;+WL;;T)U:&8N;B!D:FMY<RUD=&YT:"!C
M9&)O=&Y>"@T..$)&<4-?;6=1(D!`0$%H:PH/26X@8FEL;&]W<R!P;&%Y+"!T
M:&4@;6%S="!B96YD<RP@8W)E86MI;F<L"@T*#0X]7%0X0DQ(25]6:T,B0$!`
M241\"ALO>QMO0G9X;F8@=7ET8WH@8B!C<FAS9V)N)B8F"@T..$)!?6E?7E]?
M(D!`0$%H:`H/5&AE('=I;F0L(&EM<&%T:65N="P@;6]A;G,@86YD('-I9VAS
M+BXN"@T./5Q4.$%/2DQ?5FM#(D!`0$E$?`H;+WL;;T5D<R$@:GD@8WAF8VYB
M>B!Y="!B;W1N7@H-#CA!35!>5WY/;R)`0$!!:&@*#TET(&ES(&YO="!J;WD@
M=&AA="!I="!I<R!S965K:6YG+`H-#CU<5#A!2UA37TYC2R)`0$!)1'P*&R][
M&V]"('ET(&IN(&-X9F-N8GH@/'0[>6XA+0H-#CA!2%ML5WU/;R)`0$!!:&@*
M#TYO<B!I<R=T(&9R;VT@:&%P<&EN97-S(&ET(&9L:65S+@H-"@T./5Q\#B%,
M0$!`22-`0$!`0#Y<0`XA3$!`0$DC0$!`0$`^7$`]7&@,#B%,0$!`22-`0$!`
M0#Y<0#A"1U9L7VY[:R)`0$!)1'P*&R][&V]#;FAE9B!G:FP@>6)V(&-D=&MT
M<2!K9B=E:&(*#0XX0D5E6U]V3W\B0$!`06AH"@]4:&4@8FQU92!W879E<R!D
M86YC92QT:&5Y(&1A;F-E(&%N9"!T<F5M8FQE"@T./5Q>.$)#9$1?;GMK(D!`
M0$E$?`H;+WL;;UEF;"!Y8G8@:V5X(&-J:WEW9B`G:FMJ;FIQ)0H-#CA"06IO
M7U9O=R)`0$!!:&@*#U1H92!S=6XG<R!B<FEG:'0@<F%Y<R!C87)E<W,@=&AE
M('-E87,L"@T./5Q>.$%':6Q?;GMK(D!`0$E$?`H;+WL;;T8@:GE>('9Z;G0[
M(&9O<B!S=&]R;2!I="!B96=S+"!T:&4@<F5B96P*#0X]7%XX04)2<%]N<T,B
M0$!`241D"ALO>QMO4F9R(#QE;&YJ(&0@/&5H>EL@=&-N;2!G:G)J<0H-#CA`
M1VI+7U5'3R)`0$!!:&@*#T%S(&EF(&EN('-T;W)M(&QU<FME9"!C86QM(&%N
M9"!P96%C92$*#0H-#@XA3$!`0$DC0$!`0$`^7$`.(4Q`0$!)(T!`0$!`/EQ`
B/5QH/GQ`*TAC9'5`4%AP*TAL8'U_?F]&*TAT0$U_?F=J&MS`
`
end
------------8X---cut here------------------------------------
-- 
Michael Dillon                 Internet: mpdillon@halcyon.halcyon.com
C-4 Powerhouse                  Fidonet: 1:353/350
RR #2 Armstrong, BC  V0E 1B0      Voice: +1-604-546-8022
Canada                              BBS: +1-604-546-2705
