2680 lines
119 KiB
Plaintext
2680 lines
119 KiB
Plaintext
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-8022
|
||
- 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---------------------------
|
||
|