3270 Graphics

Greg Price January 2008

Contents

Controlling the Pixels
Raster Graphics versus Vector Graphics
Loading Programmed Symbols
Sample Application
Vector Graphics
Further Resources

Controlling the Pixels

Previously we looked at the 3270 Extended Data Stream, and discussed how applications should verify the availability of 3270 extended facilities before attempting to use them. Coding examples of how to issue a Read Partition (Query) and parse the Query Reply were given. The discussion concluded with a look at the nature of input and output data, and how 3270 orders can be used in a data stream to specify the location and attributes of displayed text, and how the symbols used to render the text can be fetched from one of a number of character sets.

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:

  1. Programmable Symbol Sets - introduced with the 3279-S3G (6 RWS - 3 single and 3 triple plane), and retained by later terminal models (2 RWS - single plane only).
  2. Native Vector Graphics - introduced with the 3179G and also used by the 3192G and 3472G.
  3. 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 3279 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-S3G 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-S3G 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-S3G terminal 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.


Sample Application

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.

Display output by sample program

There are several points to note about the application:
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.


Vector Graphics

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.

Vector graphics bitmap display output

               ...
               ...
         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
*
               ...
               ...


Further Resources


Software tools used in creating the graphics source code include: