
This Week With My Coleco ADAM  9611.18

by Richard F. Drushel (drushel@apk.net)


I.  How to Reproduce ADAM Video Colors.

    Some weeks back I described some crude methods to export PowerPaint
10K binary image files to other image formats, including greyscale TIFF.
I also mentioned that I thought it would be rather simple to adapt these
quick-and-dirty programs to be more general purpose, and also to allow
exporting of the PowerPaint files in color.  Believe it or not, I've spent
about 2 weeks working on this "simple" adaptation.

    The ADAM's video display processor (VDP), the Texas Instruments TMS9928,
supports 15 distinct colors, plus a "transparent" color which can allow
background elements to be visible through foreground elements which are
on top of them (such as sprites).  These colors are manipulated by the
programmer according to a color number or index (0-15).  A PowerPaint 10K
binary file is basically a dump of the VDP memory, part of which is a table
of foreground and background colors, all specified by these numbers 0-15.

    Unfortunately, this is a hardware-dependent representation of the
colors.  A PC or Mac video system can't just load in these color numbers
as-is and magically reproduce the colors you see on an ADAM.  There must
be some translation of the VDP color numbers to a data format which can
specify the exact colors to use, regardless of what kind of display system
is used to reproduce the image.

    There are several color systems in use, which allow colored images to
be translated to different display media.  A broad division in color systems
is between those used for print media (newspapers, magazines) and those
used for electronic displays (televisions, monitors).  Print media mix
colored inks or paints to achieve a "rainbow palette", but electronic
displays mix colored lights.

    The most common color system used for electronic displays is called
RGB color, named because it specifies colors as combinations of Red, Green,
and Blue light.  Look with a magnifying glass at the picture tube of a
color television, and you will see individual red, green, and blue elements;
at a certain distance from the screen, the individual elements merge,
producing an effect in your eyes as if there were spots of unique colors,
rather than separate red, green, and blue dots.  Each RGB "triplet" thus
represents one picture element, or pixel, on the screen.  The picture
tube of a color television actually has 3 electron guns inside, one for
each primary color, and a television broadcast contains information to
vary the intensities of each electron gun for each pixel on the screen.

    You might imagine that a simple color image file might consist of
nothing but a rectangular array of RGB triplets, one for each pixel in
the image.  That's basically the internal structure of a full-color
TIFF file:  3 bytes per pixel, one byte each for the R, G, and B values,
ranging 0-255.  Thus, if I could determine what the RGB values for
each of the 15 VDP colors were, I could use these values to convert a
PowerPaint 10K binary image file into a color TIFF file.  But how do
you find out the RGB values for the VDP colors?

    There are several possibilities:

(1) hook an ADAM up to a video frame grabber, grab some colored screens,
save them as RGB TIFF files, and then look at the RGB triplets with
a binary editor (like Norton Utilities).  The frame grabber hardware
samples the analog video signals and digitizes them.  One disadvantage
of this is that noise in the analog signal will cause variations in
the digitized values for a supposedly constant color; you'd have to
average the values over large areas to get a representative sample.
A more serious concern is that the composite video output of the ADAM
is likely to be out-of-specification compared to ideal NTSC specifications
(e.g., tint is off, brightness and contrast are too high or low), and
thus all the color values so obtained would be systematically off.  In
the absence of any other methods, though, this would be my first choice.

(2) try to match the colors by eye using an RGB color editor.  Many
graphics programs (such as Canvas for Macintosh and Windows) have a
utility to create custom colors by specifying arbitrary RGB triplets.
You could set up your ADAM next to your Mac and fiddle with the RGB
controls until you had reasonable matches to the colors on the ADAM
monitor.  If you have good eyes, this is also feasible.

(3) use the RGB triplets that the COLEMDOS.EXE ColecoVision emulator uses
(never mind how Marat Fayzullin (fms@freeflight.com) determined them).  I
probably would have done this right away, except that I don't think his
colors match the ColecoVision colors very well.  In the absence of data
to the contrary, I'd say that Marat made some quick-and-dirty guesses,
and that his eye isn't very good :-)  The way to get the emulator color
assignments is to enable the screen capture mode, grab some game screens
as Windows BMP files, then convert them into RGB TIFFs and look at the
RGB triplets thus obtained.

(4) use the actual RGB values designed into the VDP.  Fortunately for
me, my trusty "TMS9118/TMS9128/TMS9129 Data Manual" (1984) has a table
which gives the factory specifications for the colors.  I reproduce part
of this table below:


    =======================================================================
    |     |              |          TMS9118          |       TMS9128      |
    |     |              ==================================================
    |     |              |           |               |      |    color    |
    |     |              |           |  chrominance  |      | difference  |
    |     |              |     DC    =================      ===============
    | hex |    color     | luminance |   A'  | phase |   Y  | R-Y  | B-Y  |
    =======================================================================
    |  0  | Transparent  |    0.00   | 0.000 |  ---  | 0.00 | 0.47 | 0.47 |
    |  1  | Black        |    0.00   | 0.000 |  ---  | 0.00 | 0.47 | 0.47 |
    |  2  | Medium Green |    0.53   | 0.267 |  237  | 0.53 | 0.07 | 0.20 |
    |  3  | Light Green  |    0.67   | 0.200 |  235  | 0.67 | 0.17 | 0.27 |
    |  4  | Dark Blue    |    0.40   | 0.300 |  354  | 0.40 | 0.40 | 1.00 |
    |  5  | Light Blue   |    0.53   | 0.267 |  354  | 0.53 | 0.43 | 0.93 |
    |  6  | Dark Red     |    0.47   | 0.233 |  114  | 0.47 | 0.83 | 0.30 |
    |  7  | Cyan         |    0.67   | 0.300 |  295  | 0.73 | 0.00 | 0.70 |
    |  8  | Medium Red   |    0.53   | 0.300 |  114  | 0.53 | 0.93 | 0.27 |
    |  9  | Light Red    |    0.67   | 0.300 |  114  | 0.67 | 0.93 | 0.27 |
    |  A  | Dark Yellow  |    0.73   | 0.233 |  173  | 0.73 | 0.57 | 0.07 |
    |  B  | Light Yellow |    0.80   | 0.167 |  173  | 0.80 | 0.57 | 0.17 |
    |  C  | Dark Green   |    0.46   | 0.233 |  235  | 0.47 | 0.13 | 0.23 |
    |  D  | Magenta      |    0.53   | 0.200 |   53  | 0.53 | 0.73 | 0.67 |
    |  E  | Grey         |    0.80   | 0.000 |  ---  | 0.80 | 0.47 | 0.47 |
    |  F  | White        |    1.00   | 0.000 |  ---  | 1.00 | 0.47 | 0.47 |
    =======================================================================

    A' given as SQR( I^2 + Q^2 ), where I,Q are 33 degrees ahead of R-Y,B-Y


    It's probably not obvious to you how this table is of any help in
obtaining the RGB triplets for each of the VDP colors.  It wasn't obvious
to me, either--so, I decided I needed to learn about the electrical basis
for color television.  To that end, I borrowed two books from my Dad, and
started reading:

    Slurzberg, M., Osterheld, W., and E.N. Voegtlin (1956).  Essentials
        of Television.  New York:  McGraw-Hill.  687 pp.

    Terman, F.E., Helliwell, R.A., Petit, J.M., Watkins, D.A., and W.R.
        Rambo (1955).  Electronic and Radio Engineering.  New York:
        McGraw-Hill.  1078 pp.

While these books are old, they are elegantly written and very clear.  Of
course, some parts are technical and use lots of higher mathematics; but
fortunately, you need only understand simple algebra and trigonometry to
deal with the basics of television transmission.

    I make no claims to be an electrical engineer.  If I have made any
errors in the ensuing discussion, I apologize in advance.

    
II.  Principles of Color Television.
    
    In black-and-white (b&w) television transmission, the greyscale level
for each pixel on the screen is transmitted as a voltage between 0.00 and
1.00 volts; this signal is called "luminance" and symbolized by Y.  A
luminance of 0.00 is black and 1.00 is white.  Color television must transmit
full RGB triplets for each screen pixel, but do it in such a way that (a)
there is a luminance signal for b&w sets, and (b) the color signals aren't
detected by a b&w set.  The color television standard adopted by the NTSC 
in 1953 was a remarkable hack of existing b&w television, to allow b&w sets
to receive color transmissions, and color sets to receive b&w transmissions,
without any interference.

    If b&w backward compatibility weren't an issue, a color television
transmission could contain a separate channel/signal for each color (R,G,B),
which would directly drive the appropriate electron gun in the picture tube.
Color monitors for computers are actually constructed using this principle.
"Analog RGB" monitors have 3 inputs, one for each color gun; modern VGA and
SVGA monitors are variants of this.  The signal inputs can also be digital,
as in CGA and EGA monitors; in this case, discrete color levels are specified
using multiple logic lines for each color input.  Of course, neither direct-
drive RGB nor digital monitors are compatible with b&w television.

    Rather than transmit (R,G,B) as three separate signals, a means was
devised mathematically to encode the information in only one signal, called
"chrominance", and the encoded signal was shoehorned into unused bandwidth
in the existing b&w television signal in such a way that b&w sets couldn't
detect it.  A luminance signal was generated by combining the (R,G,B) signals
in proportions which reflect the sensitivity of the red, green, and blue
photoreceptors of the human eye.  A b&w set receiving a color transmission
uses the luminance to show greyscale pixels, while ignoring the chrominance
signal entirely.  A color set receiving a color transmission mathematically
decomposes the luminance and chrominance signals into the original (R,G,B)
components, and uses those to drive the 3 electron guns in the picture tube.
A color set receiving a b&w transmission has only a luminance signal to
work with (chrominance signal is zero), and the luminance is decomposed
into (R,G,B) values sufficient to make greyscale images.

    The chrominance signal actually has some internal structure of its own.
The initial encoding of the (R,G,B) signals produces Y (luminance) and
two "color difference" signals, R-Y and B-Y.  As their names imply, they
are the difference in voltage levels between Y, R, and B.  If you think
of B-Y and R-Y forming a 2-dimensional coordinate system, any color can be
represented as a point, whose coordinates are (B-Y,R-Y).  Color points
can also be represented in polar coordinate form, as a radius and an angle
of rotation (r,theta).


               R-Y

                ^
                |       r = SQR( (B-Y)^2 + (R-Y)^2 )   ;Pythagorean theorem
                |
  (B-Y,R-Y)     |   theta = ATN( (B-Y) / (R-Y) )       ;definition of tangent
                |
       * - - - -|     B-Y = r * SIN( theta )           ;definition of sine
        \       |
       : \      |     R-Y = r * COS( theta )           ;definition of cosine
          \ r   |  
       :   \   .|.. 
            \ . |  . 
       :     \  |   .theta
              \ |   . 
       :       \|   . 
   <------------+-----------> B-Y
                |
                |
                |
                |
                |
                |
                v


The polar form is more relevant for the electrical implementation of the
chrominance signal, because r can be transmitted as the signal amplitude,
while theta can be transmitted as a phase shift of the carrier wave relative
to an internal standard.

    For reasons which aren't clear to me, however, the color difference
signals R-Y and B-Y are not directly transmitted.  Rather, two additional
signals I and Q are defined, which are the result of rotating the (R-Y,B-Y)
axis 33 degrees counter-clockwise.  This is even harder to represent in
ASCII art, but here goes:


               R-Y

                ^                           Location of saturated
                |                           colors (no white light),
    I           |           Q               relative to (B-Y) axis:
     \     90 degrees      /
      \       ..|..       /                  magenta   61 degrees
       \     .  |  .     /                   red      103 degrees
        \   . ..|.. .   /                    yellow   167 degrees
         \ . .  |  . . /                     green    241 degrees
          \ .   |   . /                      cyan     283 degrees
           \    |    /                       blue     347 degrees
            \   |   /
             \  |  /.
              \ | /  .33 degrees
               \|/   .                      I left out the chrominance
   <------------+-----------> B-Y           vector from the previous
               /|\                          diagram, because it's too
              / | \                         confusing; but if shown, it
             /  |  \                        would be pointing toward
            /   |   \                       about 9 o'clock.
           /    |    \
          /     |     \
         /      v      \


    In the I-Q system, the value of the color or "hue" depends upon the
angle of the chrominance vector, and the magnitude (length) of the
chrominance vector determines the "saturation" of the colors (i.e., how
pure or pastel they appear).  Familiar controls on your color television
set manipulate these parameters directly:  The "tint" control changes
the angle of *all* the chrominance signals (by phase shifting); you can
make the picture purplish or greenish depending upon which direction you
shift the phase.  The "color level" control increases or decreases the
magnitude of *all* the chrominance vectors (by differential amplification);
you can make the picture gaudy-colored or completely b&w.

    If you now refer back to the color table I reproduced from the VDP Data
Manual, you can see where all the entries come from.  The TMS9118 VDP has
an on-chip NTSC color encoder and puts out a direct composite video signal;
thus, its colors are specified as luminance, chrominance, and phase angle
relative to (B-Y).  The TMS9928 VDP puts out luminance and color difference
signals, so its colors are specified in terms of Y, R-Y, and B-Y.

    I will spare you the derivation of the following formulas, but any
interested reader is encouraged to give it a shot:  it's simply 3 simultaneous
linear equations :-)

The first three equations are givens:

    Y = 0.30R + 0.59G + 0.11B   ;RGB-to-greyscale; weighting is based upon
                                ;photosensitivity of the human eye

    I = 0.60R - 0.28G - 0.32B   ;coefficients empirically determined from
                                ;color differences

    Q = 0.21R - 0.52G + 0.31B   ;ditto

What we want, however, is (R,G,B) in terms of (Y,I,Q):

    R = Y + 0.95I + 0.62Q       ;Terman et al. (1955) have a sign error in
                                ;their derivation of this equation; I spent
                                ;a week trying to reconcile data before I
                                ;got fed up and re-derived it myself.

    G = Y - 0.28I - 0.64Q

    B = Y - 1.11I + 1.73Q


III.  Calculating RGB Colors for the TMS9118 VDP.

    Since the ADAM's VDP is a TMS9928, I decided I would calculate the RGB
colors using the tabulated color difference and luminance data.  Unfortunately,
Texas Instruments (a) neglected to include the arithmetic signs of the color
differences, and (b) did not provide unambiguous units for the values.
"Percent of black/white voltage swing" is ambiguous because the total swing
could be anywhere between 0.75 and 1.00 volts, depending upon whether colors
or black/white/grey are being displayed.  (0.00 is black, 1.00 is white,
but no saturated color exceeds 0.75 volts.)  Playing with the values and
guessing at the signs did not give me any consistent results.  If somebody
can help me, please do; but the tabulated color difference values don't match
anything given in my two reference textbooks.

    I then tried to use the TMS9118 color values, even though the Data Manual
says that the colors are slightly different between the two VDPs.  Because
the phase angles were given with reference to the B-Y axis, I had to subtract
33 degrees from all of them in order to get the correct hue.  Using the
trigonometric relations shown above in the R-Y/B-Y graph, I calculated I and
Q values, and then substituted these and the Y values into the equations for
R, G, and B.  In a couple cases, values greater than 1.00 were produced, most
likely due to accumulated roundoff errors; these were truncated at 1.00.  Since
most graphics programs which use RGB values take them either as bytes (0-255)
or as percentages, I converted the RGB values from voltages 0.00-1.00 to the
appropriate units.  The results are tabulated below:


 =========================================================================
 |              |   voltage value   | 8-bit value |  percent max value   |
 |   TMS9918    ==========================================================
 |    color     |    R     G     B  |  R   G   B  |    R      G      B   |
 =========================================================================
 | Transparent  | 0.000 0.000 0.000 |   0   0   0 |   0.00   0.00   0.00 |
 | Black        | 0.000 0.000 0.000 |   0   0   0 |   0.00   0.00   0.00 |
 | Medium Green | 0.276 0.717 0.229 |  71 183  59 |  27.56  71.65  22.86 |
 | Light Green  | 0.484 0.810 0.432 | 124 207 111 |  48.39  80.97  43.24 |
 | Dark Blue    | 0.365 0.304 1.000 |  93  78 255 |  36.52  30.37 100.00 |
 | Light Blue   | 0.499 0.444 1.000 | 128 114 255 |  49.90  44.42 100.00 |
 | Dark Red     | 0.711 0.382 0.278 | 182  98  71 |  71.12  38.22  27.76 |
 | Cyan         | 0.362 0.780 0.928 |  93 200 237 |  36.19  77.99  92.75 |
 | Medium Red   | 0.841 0.417 0.282 | 215 107  72 |  84.06  41.70  28.23 |
 | Light Red    | 0.981 0.557 0.422 | 251 143 108 |  98.06  55.70  42.23 |
 | Dark Yellow  | 0.762 0.802 0.255 | 195 205  65 |  76.16  80.23  25.50 |
 | Light Yellow | 0.823 0.852 0.460 | 211 218 118 |  82.27  85.18  45.95 |
 | Dark Green   | 0.243 0.623 0.183 |  62 159  47 |  24.31  62.27  18.31 |
 | Magenta      | 0.712 0.391 0.779 | 182 100 199 |  71.15  39.06  77.92 |
 | Grey         | 0.800 0.800 0.800 | 204 204 204 |  80.00  80.00  80.00 |
 | White        | 1.000 1.000 1.000 | 255 255 255 | 100.00 100.00 100.00 |
 =========================================================================


 ============================================================================
 | 9118 color   |   Y     Yrgb |   R-Y    B-Y  |    I      Q   |   C    Piq |
 ============================================================================
 | Transparent  | 0.000  0.000 |  0.000  0.000 |  0.000  0.000 | 0.000  --- |
 | Black        | 0.000  0.000 |  0.000  0.000 |  0.000  0.000 | 0.000  --- |
 | Medium Green | 0.530  0.531 | -0.254 -0.301 | -0.109 -0.244 | 0.267  204 |
 | Light Green  | 0.670  0.670 | -0.186 -0.238 | -0.075 -0.185 | 0.200  202 |
 | Dark Blue    | 0.400  0.399 | -0.035  0.600 | -0.189  0.233 | 0.300  321 |
 | Light Blue   | 0.530  0.522 | -0.031  0.470 | -0.168  0.207 | 0.267  321 |
 | Dark Red     | 0.470  0.469 |  0.241 -0.192 |  0.230  0.036 | 0.233   81 |
 | Cyan         | 0.670  0.671 | -0.308  0.258 | -0.297 -0.042 | 0.300  262 |
 | Medium Red   | 0.530  0.529 |  0.311 -0.248 |  0.296  0.047 | 0.300   81 |
 | Light Red    | 0.670  0.669 |  0.311 -0.248 |  0.296  0.047 | 0.300   81 |
 | Dark Yellow  | 0.730  0.730 |  0.032 -0.475 |  0.150 -0.178 | 0.233  140 |
 | Light Yellow | 0.800  0.800 |  0.023 -0.340 |  0.107 -0.128 | 0.167  140 |
 | Dark Green   | 0.460  0.460 | -0.217 -0.277 | -0.087 -0.216 | 0.233  202 |
 | Magenta      | 0.530  0.530 |  0.182  0.249 |  0.068  0.188 | 0.200   20 |
 | Grey         | 0.800  0.800 |  0.000  0.000 |  0.000  0.000 | 0.000  --- |
 | White        | 1.000  1.000 |  0.000  0.000 |  0.000  0.000 | 0.000  --- |
 ============================================================================

 Yrgb is the luminance calculated from the R,G,B voltages, as an internal
 check.  R-Y and B-Y are color differences; note that they look nothing like
 the values provided by Texas Instruments.  C is the magnitude of the
 chrominance vector (given as A' in the Data Manual).  Piq is the phase angle
 with respect to the I-Q axis; this is 33 degrees less than the angles with
 respect to the B-Y axis.  The units of all values (except Piq and where
 otherwise specified) are volts.


    What do the final RGB colors look like?  I've created a sample color
TIFF file, TMS9918.TIF, which you can retrieve by anonymous ftp from
ftp://junior.apk.net/pub/users/drushel.  Take a look at it and let me know
what you think.

    My first impression was that the colors were a little washed-out,
especially the reds.  Staring at an ADAM display on my Commodore 1701
monitor, side-by-side with TMS9918.TIF on my SVGA screen, though, changed
my initial assessment.  I wrote a program to slightly change the phase angle
of the color values (the analog of a "tint" control") to see if there was
any improvement, and (IMHO) there isn't.  (To view the results of this tint
test, look at TINT.TIF in my anonymous ftp directory.)  The color match is
much better than Marat's in COLEMDOS.EXE; you can see his palette in
MARAT.TIF, also available by anonymous ftp.

    One possible reason for the colors tending toward the pastel is that
the TMS9918 is subject to "rainbow" color distortions, due to interference
from its on-chip NTSC composite video encoder circuitry.  Keeping the
color saturation down may minimize these effects.  (Turn the "color level"
control of your television set way up, and watch the color bleeding and
ghosting which results.)


IV.  Converting PowerPaint 10K Binary Files to RGB Color TIFFs.

    After all that trouble to figure out the ADAM color palette, I was ready
to actually write the program to convert PowerPaint 10K binary files to RGB
TIFFs.  The program, 10K2RGB, in QuickBASIC 4.5 source (.BAS) as well as
compiled DOS .EXE, are available by anonymous ftp.  I've also provided two
sample converted PowerPaint pictures:  PPBOOTHD.TIF and PPBOOTAS.TIF.  Let
me know what you think of them.  The former is proof of the origin of one
pirated version of PowerPaint...thanks to Herman Mason (aa337@po.cwru.edu)
for providing this gem.

    As for going back the other way, TIFF images to color PowerPaint 10K
binary files, I'm still working on it.  Right now, the program works pretty
well if the source TIFF is exactly 256x160, but I haven't thought through
all the math yet to make it work if the source TIFF is larger or smaller
than this (though it should be easy--famous last words).  Tune in again in
a few weeks.


V.  My "Mystery Man" Interview.

    Still working on it...a minor glitch occurred when a lab computer
containing one of the interview E-mails crashed, and of course that was
the one message I hadn't backed up yet :-(  Fortunately, this particular
message only had a few points of clarification in it, and I'm working with
my interviewee to regenerate it.  Hang in there, folks...


VI.  The Telegames DINA System.

    I admit it, curiosity got the better of me and I bought one of the
things.  In case you hadn't heard of it before, it's a 3rd-party ColecoVision-
compatible video game system.  It has its own controllers, and can't use
real ColecoVision/ADAM controllers, the Super-Action Controller, or any of
the Expansion modules (Driving Controller, Roller Controller).  I unpacked
it long enough to try it out and make sure it works (no warranty or service
from Telegames!), but I can't do a detailed review until after Christmas--
I got it to give to my kids (as well as for me :-) ).  So, mum's the word
to Christina and Elanor until after 25 December.

    A few quick takes on it, though...the built-in game, Meteoric Shower,
is pretty good, a sort of Space Invaders game.  The console is tiny and
exudes cheapness.  The DINA System nameplate is a sticker covering the true
name--something in Chinese characters.  Instead of the COLECOVISION boot
screen, it's in Chinese.  I did a quick exploratory operation inside the
console and found a 4 mHz Z80, a TMS9928 VDP, a 32K ROM for Meteoric Shower
(soldered in, but I'll fix that eventually), and an 8K ROM for the OS-7
operating system (also soldered in).  I'm really anxious to dump those
ROMs, especially the OS-7 ROM, to see if it's new software, or just the
old with the pattern generators for COLECOVISION replaced with the Chinese
characters.  I'm also curious if Meteoric Shower is playable on a real
ColecoVision/ADAM.  The last item of interest is a second cartridge slot,
for a 2x22-pin edgecard, plus some kind of contact switch activated when
the cartridge would have been inserted.  The minimal instructions with the
unit say only "It was designed for a cartridge never marketed in North
America, and you can only damage your unit if you try to plug anything into
it."

    Whew...this is a long article.  Time to get it out.


    See you again next week!

    *Rich*


;Summary of files available for anonymous ftp
;ftp://junior.apk.net/pub/users/drushel
;Please let me know if you're looking at these!

tms9118.tif     ;RGB TIFF of VDP color palette
tint.tif        ;RGB TIFF of phase angle experiments with VDP color palette
marat.tif       ;RGB TIFF of Marat Fayzullin's ColecoVision emulator palette
10k2rgb.bas     ;QuickBASIC 4.5 source code, PowerPaint-to-RGB-TIFF utility
10k2rgb.exe     ;compiled MS-DOS executable, PowerPaint-to-RGB-TIFF utility
ppboothd.tif    ;RGB TIFF of PowerPaint 10K binary file
ppbootas.tif    ;RGB TIFF of PowerPaint 10K binary file

--

Richard F. Drushel, Ph.D.            | "Aplysia californica" is your taxonomic
Department of Biology, Slug Division | nomenclature.  /  A slug, by any other
Case Western Reserve University      | name, is still a slug by nature.
Cleveland, Ohio  44106-7080  U.S.A.  |     -- apologies to Data, "Ode to Spot"

