3270 Graphics
The default character set of a 3270
terminal uses a read-only set of
symbols to display characters such as upper and lower case letters,
decimal digits, and other characters used to represent monetary
currency, punctuation marks, signs used in arithmetic, and the like. We
will give
this character set an identifier of 0. Most terminals these days
provide support for an alternate text/graphic/APL read-only character
set which we will give an identifier of 1. Some terminals have
character
sets 2, 3, etc., possibly going all the way up to 7. These character
sets are not read-only; in fact they are actually not usable until
loaded with symbol data by an application.
The terminal provides Read/Write
Storage (RWS) for each of the available programmable symbol
sets. The first RWS for a programmable symbol set can be designated
Programmable Storage A (PSA),
while that for the second is called Programmable
Storage
B (PSB), etc. up to Programmable
Storage
F (PSF). Terminals from decades ago which allowed
character input selection by the terminal operator from programmable
symbols sets had keys marked "PSA", "PSB", "PSC", "PSD", "PSE" and
"PSF".
The picture element (or pixel
or pel) patterns that can be
loaded are completely arbitrary. That is,
the application can choose which
pixels of which code points in a programmable symbol set will be 0, and
which will be 1. The number of programmable codes points in a symbol
set
is limited to 190 (code points from x'41' to x'FE', with x'40' being
reserved for a blank). The number of pels in a symbol is dictated by
the display geometry of the 3270 device.
Consider a 3270 screen with 80 columns and 24 lines. If we wanted to
display an H
somewhere on the screen, we would have a choice of 1,920 different
locations. We could choose location 0 which is the top left corner
(first column of the top line or row). We could choose location 80
which is the first column of the second line. We could choose location
1,919 which is the bottom right corner. But what if we wanted to
display it such that the left half was in the area designated by
location 0 and the right half in the area designated by location 1?
Well, we couldn't really do it using the supplied symbols sets, but
could we program one such that we could do this?
We could design two new symbols. The first symbol would have the
left vertical stroke and the left half of horizontal stoke of the H, while the
second could have the right vertical stroke and the right half of the
horizontal stroke of the H. If these
symbols were loaded into code points x'41' and x'42' respectively, then
we could send a data stream which consisted of an SBA order to set the
current buffer address to 0, an SA order to switch to our new symbol
set, and the data bytes x'4142' which would then occupy the first two
character cells of the terminal screen.
We know that a 3270 screen can be considered as a rectangular array
of character cells. In our example the screen was 80 cells wide and 24
cells high (or deep, depending on how you look at it). But at a finer
granularity, the screen display area can also be considered as a
rectangular array of pixels. The vertical spacing of the pixels is
constant throughout the height (depth?) of the screen, and the
horizontal spacing is constant across the width of the screen. Each
character cell is an integral number of pixels wide and an integral
number of pixels high. From this it follows that in our example the
screen width in pixels is a multiple of 80.
Consider a screen filled with unhighlighted blanks. All pixels would
be dark. Now, consider the screen filled with blanks highlighted in
reverse video. All pixels would be illuminated. We would expect that
the screen would be showing a single large rectangle.
[Aside: With at least one particular type of terminal - the plasma
3290 - what we would get would be horizontal lines of reverse video
separated by narrower dark lines. The illuminated area of a display
line would not be contiguous with that of adjacent lines. This is
because the power required to illuminate all pixels is so high for this
terminal that only a certain percentage of pixels is allowed to be
illuminated simultaneously. When less than 100% of pixels can be
simultaneously illuminated the On
Pels Limit self-defining parameter is returned in the Usable
Area Query Reply (QCODE=x'81'). In general, this is probably not a
matter requiring much consideration by a 3270 application designer.]
With the ability to load symbols which can control the illumination
of each pixel of a character cell comes the ability to set the
illumination of every pixel on the screen. Thus, the facility to load
programmable symbols gives us the ability to render arbitrary graphics
under program control. This form of 3270 graphics is called, Character Graphics, or Raster Graphics or Symbol Graphics, or LPS Graphics, or most commonly
Programmed Symbols, and its
advantages
and disadvantages can be compared with those of Vector
Graphics.
Raster Graphics versus Vector Graphics
Consider the problem of drawing a line between two arbitrary points
on the screen.
One way to do this is to write program code which can determine
which pixels should be illuminated to depict this line, then construct
symbols for each character cell that the line passes through, load the
symbols into terminal RWS, and display the corresponding code points at
the correct screen buffer addresses such that the line is displayed.
Raster Graphics gives us the ability to do this.
Another way to do this might be to specify the coordinates of one
point and set this as the current position, specify the current line
type as a solid line, and then request that a line be drawn from the
current position to the coordinates of the second point. Vector
Graphics gives us the ability to do this.
Now suppose the problem was to draw the line such that it is an arc
passing through a third arbitrary point. Or drawing an n-sided polygon and filling the
shape with a pre-defined shading pattern which might be solid color or
might be a cross-hatching or might be a pattern of dots and/or dashes.
With these sorts of problems the task to be performed can be
described to 3270 vector graphics hardware using fewer bytes than it
takes to specify the pixel settings for the whole screen, and the
program code required to make the requests of 3270 vector graphics is
less than that required to calculate which pixels need to be
illuminated.
For these sorts of graphics tasks vector graphics would seem to be
clearly superior, and it is no wonder that 3270 vector graphics has
pretty much displaced 3270 raster graphics, especially when you factor
in that you may not even have to use native 3270 vector graphics but
can use an even more optimized protocol which will handshake with the
PC running the TN3270 client.
The obvious case where raster graphics is superior is where one or
more special symbols need to be displayed in a text or other
character-based display in random character locations. The pixel
contents of the
symbols can be loaded once, and the symbol can be displayed many times
by switching to the relevant symbol set with very little overhead. In
the real world, this sort of graphics requirement for 3270 workstations
seems to be quite infrequent, but nonetheless it is a workload that
character graphics excels at.
But, even though 3270 raster graphics has been largely superseded by
3270 vector graphics, this discussion will persist with raster graphics
for a real world reason that can be summed up in one word: documentation.
The information in this entire discussion about 3270 EDS and 3270
graphics can be almost completely obtained from a single IBM manual: GA23-0059-07 3270 Data Stream Programmer's
Reference. This
manual includes all the necessary details to write programs using LPS
structured fields and character set attributes. It does not contain
documentation about the orders needed to use vector graphics, but
simply refers the reader to the
appropriate graphics product publications.
Since vector graphics terminals were typically Distributed Function Terminals (DFT)
the graphics capabilities were terminal functions and not controller
functions. So, while 3174 manuals may still be available this is of
little help, because the necessary manuals describe the capabilities
of terminals like the 3179-G, the 3192-G and the 3472 InfoWindow®/™ Workstation, and
because all of these products are now
withdrawn the relevant manuals are no longer available.
Still, one could probably do a good job of figuring out the 3270
Vector Graphics data stream with S544-5498-01 Graphics Object Content
Architecture for Advanced Function Presentation Reference, SC33-0868-02
GDDM
Base
Application Programming Reference and a VTAM trace of
vector graphics data stream data generated by GDDM.
So, in effect, there are three different 3270 graphics data stream
protocols which are listed below in chronological order:
- Programmable Symbol Sets - introduced as optional features of the 3278
(monochrome) and 3279 (color) display stations, and the 3287 printer. The
PS-2 feature provided 2 single-plane RWS, while the additional PS-4 feature
provided 4 more RWS, 3 of which were triple-plane on the 3279. The character
cell pixel dimensions were 9 wide and 16 high for the 3278 Models 2 and
3, and 9 wide and 12 high for the 3278 Model 4 and all 3279 models, and
10 wide and 8 high for the 3287 printer.
(See Chapter 6 of GA33-3056-0
IBM 3270 Information Display Station: Color and Programmed Symbols for
full details.)
- Native Vector Graphics - introduced with the 3179G and also used
by the 3192G and 3472G. These terminals also included the equivalent of the
original PS-2 feature for programmed symbol support.
- Advanced Vector Graphics (formerly called DOSLINK and OS2LINK,
and now also called PCLK) - used in conjunction with intelligent
workstation TN3270 sessions.
Now, the application could be made independent of the actual graphics
protocol used by the terminal by letting IBM's Graphical Data Display Manager
(GDDM™) program product
perform the terminal graphics communication.
GDDM can analyze the Query Reply from a terminal and utilize the best
graphics protocol for that terminal. The base component of GDDM is
packaged with z/OS, as it was with its predecessor OS/390 (so that
diagrams from softcopy manuals can be shown on 3270 terminals), so if
you have access to that platform you should be able to run Assembler
and 3GL GDDM applications. If you don't have access to GDDM then you
may want to keep reading.
Loading Programmed
Symbols
The first thing we need to know is the character cell dimensions in
pixels. It turns out that there are only a few fixed formats in common
use. The original 3278 graphics terminal used Format 1, which is a
character cell 9 pixels wide and 16 pixels high (or deep). To provide
the pixel settings for such a character cell 18 bytes are needed, with
the first two bytes providing the pixel values for the left-most
vertical slice, and the remain bytes providing the pixel values for
each remaining horizontal slice from top to bottom. Numbering the bytes
from 0 to H, the pixel arrangement for Format 1 shown below.
0 2 2 2 2 2 2 2
2
0 3 3 3 3 3 3 3
3
0 4 4 4 4
4 4 4 4
0 5 5 5 5
5 5 5 5
0 6 6 6 6
6 6 6 6
0 7 7 7 7
7 7 7 7
0 8 8 8 8
8 8 8 8
0 9 9 9 9
9 9 9 9
1 A A A A
A A A A
1 B B B B
B B B B
1 C C C C
C C C C
1 D D D D
D D D D
1 E E E E
E E E E
1 F F F F
F F F F
1 G G G G
G G G G
1 H H H H
H H H H
Figure 1. Format 1 symbol pixel data byte order.
While the LPS data stream was loading the symbol data into the
terminal's RWS, the 3279 screen would put on a "green lightning" show
during which the normal content of the display was not visible. The
3279 Model 3 with 80 columns and 32 lines has 2,560 character cells. Each
symbol set can provide 190 loadable code points. With 6 RWS we can get
1,140 symbols loaded, so to paint the whole screen all available
programmable symbol sets will have to be used more than once. Typically
over half the screen would be painted before another "lightning" show
would begin. Note that after the screen display is fully updated the
symbols in the top part of the screen still appear as they did when
first written, and are not reinterpreted with the latest version of the
same code point from the same RWS, even though the data needed to
render that symbol as it is, is no longer available.
To improve response time and reduce "green lightning" time, Format 2
was devised. Format 2 cells are the same as Format 1 cells but the LPS
data stream can be compressed by the host application so that the LPS
data stream is reduced in length, thus reducing data transfer time. The
compressed LPS data is uncompressed by the 3270 hardware and loaded as
for Format 1. The details of the compression will not be discussed
here, but at least in the intervening decades network transfer speeds
have increased so the problem should not be as severe as it once was.
In practice the 32-line 3279-3 only shows the top 12 of the 16
horizontal slices of pixels in each character cell. When the terminal
is switched into its primary screen size of 24 lines, only the top
three quarters of the screen display area is used. The 3179-3G, on the
other hand, shows the top 12 of 16 slices in 32-line mode, but shows
all loaded symbol pixels in 24-line mode, which makes the rendering of
pre-coded multi-line graphics somewhat problematic. Fortunately the
problem seems to have reduced with more recent terminals and TN3270
clients. The best that the application can do is to examine the
Character Sets Query Reply (QCODE=x'85') to ensure that the LPS format
type to be used is supported, and examine the Usable Area Query Reply
(QCODE=x'81') to determine the actual character cell size so that
graphic data is not "wasted" in parts of the cell that are not
displayed.
Format 3 cells are nominally 8 pixels wide and 10 pixels high. To load
the pixel values for such a symbol 10 bytes are needed, with each byte
specifying the values for a horizontal slice in order from top to
bottom. Early Attachmate 3270 graphics emulations used this format.
Format 3 can be generalized to support other cell sizes as specified by
the device, and the LPS data stream can load a cell that is smaller
than the cell size provided by the device, but the pixel values for a
horizontal slice must start on a byte boundary. Format 4 provides for
the compression of the LPS data stream for loading symbols into cells
of the Format 3 type.
Format 5 cells are nominally 10 pixels wide and 8 pixels high. To load
the pixel values for such a symbol 10 bytes are needed, with each byte
specifying the values for a vertical slice in order from left to
right. This format is used by 3270 printers.
Format 5 can be generalized to support other cell sizes as specified by
the device, and the LPS data stream can load a cell that is smaller
than the cell size provided by the device, but the pixel values for a
vertical slice must start on a byte boundary. Format 6 provides for
the compression of the LPS data stream for loading symbols into cells
of the Format 5 type.
Format 8 is for vector symbols.
After deciding upon the format to be used in the LPS data stream, the
application must determine several other pieces of information.
Obviously the application must know what the symbol content is, but it
must also know which Read/Write Storages are to be loaded, which code
points will
have the various symbols, and it must decide upon a Local Character Set Identifier
(LCID) for each loaded RWS. The LCID will be used to specify the symbol
set in the SFE and/or SA orders. Each RWS must have its own LCID so
that the terminal can determine the symbol set from which to fetch the
symbol. The LCID for a RWS can be in the x'40' to x'EF' range. Remember
that the default character set has an id of x'00', and the APL/text
character set has an id of x'F1'. An LCID of x'FF' indicates that the
RWS is not associated with any symbol set.
Now enough is known to begin loading and using programmed symbols.
Format 1 symbols will be used in the sample code. When considering
coding style, some might prefer to define the symbol data in binary so
that adjustments to individual pixels can be made directly in the
source code.
DC
B'0000000000000000'
X'41'
DC
B'00000000',B'00000001',B'00000011',B'00000110'
DC
B'00001100',B'00011001',B'00110011',B'00011001'
DC
B'00001100',B'00000110',B'00000011',B'00000001'
DC
B'00000000',B'00000000',B'00000000',B'00000000'
DC
B'0110011100110000'
X'42'
DC
B'00000000',B'00000000',B'10000000',B'11000000'
DC
B'01100000',B'00110000',B'10011000',B'00110000'
DC
B'01100000',B'11000000',B'10000000',B'00000000'
DC
B'00000000',B'00000000',B'00000000',B'00000000'
But to economize on space slightly hexadecimal defines will be used
here.
The next thing to do is to create and send an LPS data stream to load
the application-defined symbols into Programmable Storage A (which is
Symbol Set Storage ID 2) such that the the new symbols will have an
LCID of x'42' and the first code point loaded will be x'41'.
...
...
TPUT
PSAWSF,PSALEN,NOEDIT,WAIT
...
...
PSAWSF
DC
X'F3'
WSF
to
load symbols into PSA.
SYMFIELD
DC AL2(ADDSYMLN) Structured field
length. (single-plane)
DC
X'06414241'
LPS-ID,BASIC+CLR+TYP1,LCID,First-Sym.
DC
X'02'
Read/Write
Storage
ID.
DC
X'0000000103060C1933190C06030100000000'
X'41'
DC
X'6730000080C06030983060C0800000000000'
X'42'
DC
X'000000000000000033190C06030100000000'
X'43'
DC
X'0330000000000000983060C0800000000000'
X'44'
DC
X'0000001F1F101011131110101F1F00000000'
X'45'
DC
X'673000F0F010101090101010F0F000000000'
X'46'
DC
X'0000000000000000131110101F1F00000000'
X'47'
DC
X'033000000000000090101010F0F000000000'
X'48'
DC
X'000000030C081011131110080C0300000000'
X'49'
DC
X'471000806020101090101020608000000000'
X'4A'
DC
X'0000000000000000131110080C0300000000'
X'4B'
DC
X'031000000000000090101020608000000000'
X'4C'
ADDSYMLN
EQU *-SYMFIELD
PSALEN
EQU
*-PSAWSF
After loading these symbols the application is then in a position to
send data streams to the terminal which display these symbols. The
color and highlighting of these symbols can be controlled by SFE and/or
SA orders just as symbols from the read-only character sets can be. But
what if the graphical data to be displayed is a colored image where
more than a single color is present within a single character cell? In
that case, the color information must be encoded into the symbol itself.
The 3279 with both the PS-2 and PS-4 features has three single-plane
RWS (PSA, PSB and PSD) and three triple-plane
RWS (PSC, PSE and PSF). A triple-plane RWS can be loaded and used as if
it were a single-plane RWS, but the purpose of a triple-plane RWS is to
allow the loading of the blue, red and green planes of a triple-plane
symbol separately and independently. When a triple-plane symbol is
shown in the color neutral (color
code
x'F7'
- white for a display and black for a printer) the pixel
color is taken from the symbol color plane data. For example, if a
pixel had a 0 in the red plane and a 1 in the blue and green planes the
pixel would be illuminated as turquoise. With this, applications are
given a mechanism to control the color of every pixel on the screen.
To combine the whole discussion on 3270 Extended Data Stream and 3270
Graphics a sample application will now be described.
The application is to function in both a TSO/VTAM and EXCP environment
under an operating system from the MVS family. The application will
load and
display sample symbols. The whole screen will be protected from update
by the user, but the user can use Program Function Keys 7,8,10 and 11
to move the display to different screen locations, and Program Function
Key 3 can be used to terminate the application. PF keys 13 to 24 are to
be folded (ie. mapped) to PF keys 1 to 12. The application can also be
terminated by an operator STOP command.
Rather than clutter up this page (further) with a thousand line
program, a text file of the program is
available here.
There are several points to note about the application:
- The alternate screen size is used unless it is not 80 columns
wide. This is because 3270 graphics is only defined for 80 column
displays.
- The application tests for the presence of extended 3270
facilities before using them.
- If no usable graphics are detected the program will terminate.
- The application only uses programmed symbol graphics.
- The application parses the Query Reply and sets the VCTR flag if native vector
graphics are supported. The flag is set if a particular QCODE is
detected. This QCODE (x'B4' - Graphic Color) is just one of several
(eg. x'B2' - Line Type) that could have been chosen. Similar code could
be used by native vector graphics applications to verify support.
- The program does not test for the presence of the Distributed
Data Management Query Reply (QCODE=x'95') which indicates support for
PCLK Vector Graphics. Such a test could be done by Advanced Vector
Graphics applications to verify support.
- The top left corner of the screen contains the only field
attribute.
- The remainder of the top line is filled with
- A sample triple-plane symbol if loadable triple-plane symbols
are supported.
- The APL continuous horizontal line character if loadable
triple-plane symbols are not supported.
- Dashes (minus signs) if APL is not supported, though it is hard
to imagine a terminal supporting loadable single-plane symbols but not
APL characters.
- The program can run as a Started Task or as a batch job to drive
a local non-SNA 3270 terminal using EXCP.
In short, the sample application program provides code for verifying
the support
of programmed symbols (single-plane and triple-plane) and native vector
graphics. It also provides a code example of loading both single-plane
and triple-plane symbols. The EXCP support can be easily removed from
the program to make it a pure TSO/VTAM application.
As has been stated, vector graphics has largely taken over from
programmed symbols, which is slightly ironic considering that a major
use for 3270 graphics today is to display diagrams and pictures from
IBM manuals under IBM's BookManager™.
The
images
are rendered as bitmaps which, strictly speaking, do not use
vector graphics as such. Almost all such images are monochrome (black
and white), but one of the best books to look at on a 3270 screen is SC33-0867-01 GDDM Base Application
Programming Guide Version 3 Release 2 where the color output
of GDDM calls can be seen (unlike on the web where they can't be seen,
though they can be seen when using IBM
BookManager
Library
Reader for Windows.).
3270 native vector graphics includes orders to describe the dimensions
and data content of image bitmaps which can be displayed such that the
top left corner of the image is at the current position. The graphics
position coordinates are described by a cartesian system with [0,0]
being at the centre of the display screen. An application can calculate
the display area size and any required coordinates arithmetically using
the screen size in terms of character cells, and the character cell
size in terms of picture elements, as returned in the Usable Area Query
Reply (QCODE=x'81') and the Implicit Partition Query Reply
(QCODE=x'A6').
Bearing in mind that vector graphics should only be sent to a terminal
after vector graphics support by the terminal has been verified, this
discussion of 3270 graphics will now be concluded with sample code
displaying a color
bitmap
image under TSO/VTAM scaled down to 120 by 120 pixels.
...
...
TPUT
BMPWSF,BMPWSFLN,NOEDIT
...
...
*
BITMAP
DISPLAY
TPUT DATA STREAM
BMPWSF DC
X'F3'
WRITE
STRUCTURED
FIELD
DC
AL2(4)
LENGTH
OF
FIRST STRUCTURED FIELD
DC
X'03'
ERASE/RESET
DC
X'00'
IMPLICIT
PARTITION
SIZE - DEFAULT
* EQU
X'80'
ALTERNATE
PARTITION
SIZE
*
BMPSFLD EQU
*
START
OF
STRUCTURED FIELD
DC
AL2(BMPSFLDL) LENGTH OF STRUCTURED
FIELD
DC
X'0F10'
GRAPHIC
PICTURE
DC
X'00'
PARTITION
IDENTIFIER
(PID)
DC
B'11000000' FLAGS -
SPAN : FIRST AND LAST
*
-
MODE
: INTERMEDIATE MODE
DC
X'00'
RESERVED
*
DC
X'70'
BEGIN
SEGMENT
DC
AL1(12)
LENGTH
OF
FOLLOWING PARAMETERS
DC
CL4'ICON'
NAME OF PROCEDURE TO BE CREATED
DC
B'01110100'
VISIBLE NOHILITE
DC
B'01101000' NOPROL NEW
SEG DATA
DC
AL2(SEGLEN) LENGTH OF
PROCEDURE TO BE CREATED
DC
X'00000000' P/S NAME
BMPSEG EQU
*
START
OF
SEGMENT DATA
DC
X'0C',AL1(4) SET MIX (XOR)
DC
X'21',AL1(4) SET CURRENT
POSITION
DC
HL2'-60'
X
CO-ORDINATE
RELATIVE TO CENTRE
DC
HL2'60'
Y
CO-ORDINATE
RELATIVE TO CENTRE
* BLUE PLANE
DC
X'0A',AL1(1) SET COLOR - BLUE
DC
X'91',AL1(6) IMAGE BEGIN,
PARM LENGTH
DC
AL2(0)
RESERVED
DC
AL2(120)
IMAGE
X
DIMENSION PIXEL SIZE
DC
AL2(120)
IMAGE
Y
DIMENSION PIXEL SIZE
*
IMAGE
LINES
HAVE THE FORMAT:
* DC
X'92',AL1(##),XL##'....'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFF7FFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFF9668FFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFF8FFFFBFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFCFFFFFF7FFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFBFFFFFFDFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFEFFFFFFFF7FFFFFFFFFF'
DC
X'920FFFFFFFFFFFBFFFFFFFF9FFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF'
DC
X'920FFFFFFFFFFCFFFFFFFFFFBFFFFFFFFF'
DC
X'920FFFFFFFFFFBFFFFFFFFFFDFFFFFFFFF'
DC
X'920FFFFFFFFFF7FFFFFFFFFFEFFFFFFFFF'
DC
X'920FFFFFFFFFEFFFFFFFFFFFF7FFFFFFFF'
DC
X'920FFFFFFFFFDFFFFFFFFFFFF7FFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFF9FFFFFFFF'
DC
X'920FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFF7FFFFFFFFFFFFEFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF'
DC
X'920FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFDFFFFFFFFFFFFFFBFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFBFFFFFFFFFFFFFFDFFFFFFF'
DC
X'920FFFFFFFFBFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFEFFFFFFF'
DC
X'920FFFFFFFF7FFFFFFFFFFFFFFEFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFF'
DC
X'920FFFFFFFEFFFFFFFFFFFFFFFF7FFFFFF'
DC
X'920FFFFFFFEFFFFFFFFFFFFFFFF7FFFFFF'
DC
X'920FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFF'
DC
X'920FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF'
DC
X'920F00000020000000000000000C000000'
DC
X'920F00000000000000000000000C000000'
DC
X'920F00000000000000000000000C000000'
DC
X'920F00000000000000000000000C000000'
DC
X'920F00000000000000000000001C000000'
DC
X'920F000000000000000000000008000000'
DC
X'920F000000000000000000000018000000'
DC
X'920F000000000000000000000018000000'
DC
X'920F000000000000000000000018000000'
DC
X'920F000000000000000000000018000000'
DC
X'920F000000000000000000000030000000'
DC
X'920F000000000000000000000030000000'
DC
X'920F000000000000000000000060000000'
DC
X'920F000000000000000000000060000000'
DC
X'920F0000000000000000000000E0000000'
DC
X'920F0000000000000000000000C0000000'
DC
X'920F0000000000000000000001C0000000'
DC
X'920F000000000000000000000180000000'
DC
X'920F000000000000000000000300000000'
DC
X'920F000000000000000000000700000000'
DC
X'920F000000000000000000000E00000000'
DC
X'920F000000000000000000000C00000000'
DC
X'920F000000000000000000001800000000'
DC
X'920F000000000400000000003800000000'
DC
X'920F00000000000000000000E000000000'
DC
X'920F00000000000000000000C000000000'
DC
X'920F000000000000000000038000000000'
DC
X'920F0000000000000000000F0000000000'
DC
X'920F0000000000000000003C0000000000'
DC
X'920F000000000000000000F80000000000'
DC
X'920F000000000000000007E00000000000'
DC
X'920F00000000000000007F800000000000'
DC
X'920F000000000000009FF8000000000000'
DC
X'920F000000000000001FC0000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
DC
X'920F000000000000000000000000000000'
*
1800
BYTES
IN PLANE BITMAP
DC
X'93',AL1(2),AL2(0) IMAGE END
* RED PLANE
DC
X'0A',AL1(2) SET COLOR - RED
DC
X'91',AL1(6) IMAGE BEGIN,
PARM LENGTH
DC
AL2(0)
RESERVED
DC
AL2(120)
IMAGE
X
DIMENSION PIXEL SIZE
DC
AL2(120)
IMAGE
Y
DIMENSION PIXEL SIZE
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F0000000000000007FFFFFFFFFFFFFF'
DC
X'920F00000000000000068FFFFFFFFFFFFF'
DC
X'920F000000000000000FFBFFFFFFFFFFFF'
DC
X'920F000000000000000FFF7FFFFFFFFFFF'
DC
X'920F000000000000000FFFDFFFFFFFFFFF'
DC
X'920F000000000000000FFFF7FFFFFFFFFF'
DC
X'920F000000000000000FFFF9FFFFFFFFFF'
DC
X'920F000000000000000FFFFEFFFFFFFFFF'
DC
X'920F000000000000000FFFFFBFFFFFFFFF'
DC
X'920F000000000000000FFFFFDFFFFFFFFF'
DC
X'920F000000000000000FFFFFEFFFFFFFFF'
DC
X'920F000000000000000FFFFFF7FFFFFFFF'
DC
X'920F000000000000000FFFFFF7FFFFFFFF'
DC
X'920F000000000000000FFFFFF9FFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFEFFFFFFFF'
DC
X'920F000000000000000FFFFFFF7FFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFBFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFDFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFEFFFFFFF'
DC
X'920F000000000000000FFFFFFFEFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFF7FFFFFF'
DC
X'920F000000000000000FFFFFFFF7FFFFFF'
DC
X'920F000000000000000FFFFFFFF7FFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFF7FFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920F000000000000000FFFFFFFFFFFFFFF'
DC
X'920FFFFFFFEFFFFFFFF00000000C000000'
DC
X'920FFFFFFFFFFFFFFFF00000000C000000'
DC
X'920FFFFFFFFFFFFFFFF00000000C000000'
DC
X'920FFFFFFFEFFFFFFFF00000000C000000'
DC
X'920FFFFFFFEFFFFFFFF00000001C000000'
DC
X'920FFFFFFFEFFFFFFFF000000008000000'
DC
X'920FFFFFFFFFFFFFFFF000000018000000'
DC
X'920FFFFFFFEFFFFFFFF000000018000000'
DC
X'920FFFFFFFFFFFFFFFF000000018000000'
DC
X'920FFFFFFFF7FFFFFFF000000018000000'
DC
X'920FFFFFFFF7FFFFFFF000000030000000'
DC
X'920FFFFFFFFFFFFFFFF000000030000000'
DC
X'920FFFFFFFFFFFFFFFF000000060000000'
DC
X'920FFFFFFFFBFFFFFFF000000060000000'
DC
X'920FFFFFFFFDFFFFFFF0000000E0000000'
DC
X'920FFFFFFFFFFFFFFFF0000000C0000000'
DC
X'920FFFFFFFFEFFFFFFF0000001C0000000'
DC
X'920FFFFFFFFFFFFFFFF000000180000000'
DC
X'920FFFFFFFFF7FFFFFF000000300000000'
DC
X'920FFFFFFFFFBFFFFFF000000700000000'
DC
X'920FFFFFFFFFDFFFFFF000000E00000000'
DC
X'920FFFFFFFFFEFFFFFF000000C00000000'
DC
X'920FFFFFFFFFFFFFFFF000001800000000'
DC
X'920FFFFFFFFFF7FFFFF000003800000000'
DC
X'920FFFFFFFFFFBFFFFF00000E000000000'
DC
X'920FFFFFFFFFFCFFFFF00000C000000000'
DC
X'920FFFFFFFFFFF7FFFF000038000000000'
DC
X'920FFFFFFFFFFFDFFFF0000F0000000000'
DC
X'920FFFFFFFFFFFEFFFF0003C0000000000'
DC
X'920FFFFFFFFFFFF3FFF000F80000000000'
DC
X'920FFFFFFFFFFFFE7FF007E00000000000'
DC
X'920FFFFFFFFFFFFFDFF07F800000000000'
DC
X'920FFFFFFFFFFFFFF4FFF8000000000000'
DC
X'920FFFFFFFFFFFFFFFFFC0000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
*
1800
BYTES
IN PLANE BITMAP
DC
X'93',AL1(2),AL2(0) IMAGE END
* GREEN PLANE
DC
X'0A',AL1(4) SET COLOR - GREEN
DC
X'91',AL1(6) IMAGE BEGIN,
PARM LENGTH
DC
AL2(0)
RESERVED
DC
AL2(120)
IMAGE
X
DIMENSION PIXEL SIZE
DC
AL2(120)
IMAGE
Y
DIMENSION PIXEL SIZE
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFF96000000000000000'
DC
X'920FFFFFFFFFFFFF8FF000000000000000'
DC
X'920FFFFFFFFFFFFCFFF000000000000000'
DC
X'920FFFFFFFFFFFFBFFF000000000000000'
DC
X'920FFFFFFFFFFFEFFFF000000000000000'
DC
X'920FFFFFFFFFFFBFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFCFFFFF000000000000000'
DC
X'920FFFFFFFFFFBFFFFF000000000000000'
DC
X'920FFFFFFFFFF7FFFFF000000000000000'
DC
X'920FFFFFFFFFEFFFFFF000000000000000'
DC
X'920FFFFFFFFFDFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFBFFFFFF000000000000000'
DC
X'920FFFFFFFFF7FFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFEFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFDFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFBFFFFFFF000000000000000'
DC
X'920FFFFFFFFBFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFF7FFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFEFFFFFFFF000000000000000'
DC
X'920FFFFFFFEFFFFFFFF000000000000000'
DC
X'920FFFFFFFEFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFEFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFDFFFFFFFF000000008000000'
DC
X'920FFFFFFFEFFFFFFFF00000000C000000'
DC
X'920FFFFFFFFFFFFFFFF00000000C000000'
DC
X'920FFFFFFFFFFFFFFFF00000000C000000'
DC
X'920FFFFFFFEFFFFFFFF00000000C000000'
DC
X'920FFFFFFFFFFFFFFFF00000000C000000'
DC
X'920FFFFFFFEFFFFFFFF000000008000000'
DC
X'920FFFFFFFEFFFFFFFF000000018000000'
DC
X'920FFFFFFFFFFFFFFFF000000018000000'
DC
X'920FFFFFFFFFFFFFFFF000000018000000'
DC
X'920FFFFFFFF7FFFFFFF000000018000000'
DC
X'920FFFFFFFFFFFFFFFF000000030000000'
DC
X'920FFFFFFFFFFFFFFFF000000030000000'
DC
X'920FFFFFFFFBFFFFFFF000000020000000'
DC
X'920FFFFFFFFFFFFFFFF000000060000000'
DC
X'920FFFFFFFFDFFFFFFF000000060000000'
DC
X'920FFFFFFFFDFFFFFFF0000000C0000000'
DC
X'920FFFFFFFFFFFFFFFF0000001C0000000'
DC
X'920FFFFFFFFFFFFFFFF000000180000000'
DC
X'920FFFFFFFFF7FFFFFF000000300000000'
DC
X'920FFFFFFFFFBFFFFFF000000700000000'
DC
X'920FFFFFFFFFDFFFFFF000000600000000'
DC
X'920FFFFFFFFFFFFFFFF000000C00000000'
DC
X'920FFFFFFFFFEFFFFFF000001800000000'
DC
X'920FFFFFFFFFF7FFFFF000003800000000'
DC
X'920FFFFFFFFFFBFFFFF000006000000000'
DC
X'920FFFFFFFFFFEFFFFF00000C000000000'
DC
X'920FFFFFFFFFFF7FFFF000038000000000'
DC
X'920FFFFFFFFFFFBFFFF000070000000000'
DC
X'920FFFFFFFFFFFEFFFF0001C0000000000'
DC
X'920FFFFFFFFFFFFBFFF000F80000000000'
DC
X'920FFFFFFFFFFFFEFFF003E00000000000'
DC
X'920FFFFFFFFFFFFF9FF03F000000000000'
DC
X'920FFFFFFFFFFFFFF8FFF8000000000000'
DC
X'920FFFFFFFFFFFFFFFFF80000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
DC
X'920FFFFFFFFFFFFFFFF000000000000000'
*
1800
BYTES
IN PLANE BITMAP
DC
X'93',AL1(2),AL2(0) IMAGE END
*
SEGLEN EQU *-BMPSEG
BMPSFLDL EQU *-BMPSFLD
BMPWSFLN EQU *-BMPWSF
*
...
...
Software tools used in creating the graphics source code include:
- TERMTEST which was used to
develop the loadable symbols and output the symbol source code.
- REVIEW which was used to view
the sample bitmap image and output the image source code.