About Site



The PC-8 Computer
Written March 9, 2004


As the graphics operator for the Pirates Television Network in the late 1980s, I wanted to be able to prepare several bar graphs before each telecast. 

To:     Pirates Television Network Announcers
Date:  March 19, 1988

On three or four baseball telecasts late last season, we displayed team-comparison stats with the help of animated bar graphs like the one below.  We feel that this helps the viewers see what the stats mean, so we plan to use these bar graphs on a regular basis this year.

To avoid having any questions arise on the air, here are a few notes about these stats.

The numbers are based on the stats coming into the game.  Sometimes we might be able to update them to include what the teams have done so far in tonight's game, but if we do so, we'll tell you "this is updated" through your headset.

With two exceptions, the #1 ranking goes to the team that has the largest number in the league in the given category, regardless of whether having a large number is good or bad.  For example, the team with the most errors is ranked #1 in errors.  The two exceptions are golf scores and team ERA.  In those two categories only, the team with the smallest number is ranked #1.

One type of team comparison shows won-lost record under special circumstances.  For example, against lefthanded starters the average N.L. team has a 5-6 record, while the Padres are 4-8 (ranked #12) and the Bucs are 5-4 (ranked #2).  For your information, the rankings and the length of the bars are based on the won-lost percentages, which are .454, .333, and .556 in this example.  But we don't show those percentages on the screen; there are enough numbers already with the records themselves.

The numbers were readily available from the printed league stats, but how long should the bars be?

The longest bar that would fit on the TV screen was about 32 characters long.  To make that represent 141 doubles would require one character for 4.4 doubles.  So the other two bars, for 130 doubles and 124 doubles, should be 30 and 28 characters long respectively, like this:

•••••••••••••••••••••••••••••• 130
•••••••••••••••••••••••••••••••• 141
•••••••••••••••••••••••••••• 124

But those three bars are almost the same length.  The graph would reveal that there really wasn't that much difference among the numbers, while as broadcasters we want to make a story out of the stats.  We want to make it seem as though any small differences are significant.  We'd like to ignore the left half of the bars and magnify the right half.

What would it be like if we exaggerated the difference by making the longest bar 32 characters but the shortest just 8 characters, regardless of the numbers they represent?  The middle bar could be made proportional to the other two.  The result would look like this:

•••••••••••••••• 130
•••••••••••••••••••••••••••••••• 141
•••••••• 124

That gives us a definite and obvious difference, but it's perhaps too exaggerated.  I decided that the best compromise would to average the results of these two methods of calculation.

A fair amount of number-crunching would be required to do this, and I didn't have a lot of spare time on the day of a game.  The problem called for a computer! 

I considered bringing my home computer along, a laptop-sized Tandy Model 100, but I discovered that there was a smaller, more portable device available — the Tandy PC-8 Pocket Computer.

Its instruction manual called it "one of the most sophisticated hand-held computers in the world today."  It boasted a four-bit processor and a whopping two kilobytes of RAM.  On February 6, 1988, in preparation for the upcoming baseball season, I purchased one for $59.95 at the Radio Shack at the Monroeville Mall.

Later that year I spent an equal amount for a printer/cassette interface, as shown below.

The computer itself — less than 5½" long, less than half an inch thick, weighing only three ounces — could be tucked into a pocket of my briefcase and sit in a blank area on top of my Chyron keyboard.  (On the display is a boxing timer.  More about that later.  I've used the PC-8 as a backup on boxing telecasts as recently as 2003!)

When I wasn't on the road, the black accessory cradle offered AC power, a thermal adding-machine printer, and an interface for storing programs on an audio cassette recorder.

The PC-8 is completely obsolete now, of course, compared to Palm Pilots and such.  But it could be programmed in BASIC, and I wrote programs to do what I wanted.

To:     Any Substitute Chyron Operators
Date:  March 19, 1988


We present comparative team statistics using bar graphs, so that the viewers can more easily grasp what the stats are telling us.  A typical lower-third panel looks like this:

The panel is also animated.  When you press a key, an autodisplay causes the bars and numbers to reveal.

Making this autodisplay is fairly tricky.  Here's how it's done.



Your raw data comes from the MLB/IBM Notes, the league statistics that are available a few hours before game time.  For each category (doubles in our example), those notes list the totals for each of the twelve teams in the National League.  But you need to figure the league average and the rankings of the two teams playing on tonight's telecast.

You also need the proper lengths for the three bars on the graph.  Here's how I determine appropriate lengths.

Let G be the biggest of the three numbers (141 in our example).  The bar corresponding to G is 32 characters long, because that's the longest that will comfortably fit on the screen.

Let E be the smallest of the three numbers (or 124).  The bar corresponding to E is always between 4 and 20 characters long, the actual formula being 16E/G + 4.  In our example, that formula works out to 18 characters.

Let N be the middle number, or 130.  The bar of middle length is given by the formula 16N/G + 12(N-E)/(G-E) + 4.  In our example, that becomes 23.


The Computer

To make these computations much easier, we use a checkbook-size computer, a Tandy PC-8.  Here's how to run the program.

Turn on the power switch.  Press DEF and N.

The computer asks for VISITORS.  If the visitors have 141 doubles, press 1, 4, 1, and ENTER.

The computer asks for HOMETEAM.  Press 1, 2, 4, and ENTER.

Now the computer asks for numbers for the other ten teams in the league.  Enter these.

Normally these numbers are entered without decimal points.  If the category is batting averages, enter 265, not .265, because the latter would confuse the computer.

But you can use a decimal point for a special purpose:  categorical won-lost records, for example on grass fields or in extra innings.  In that case, enter each record as if wins were dollars and losses were cents.  A 7-5 record would be entered as 7.05, for example.

After all twelve numbers have been entered, the computer will give you three sets of answers like this:

NL AV 1.23.130

(press ENTER to see next set)

V I S  #4.32.141

(press ENTER to see next set)

HOM #8.18.124

(press ENTER to start another calculation)

The numbers between the decimal points are the lengths of the bars.  The numbers on the right go at the end of the bars.  (Of course, if you've been entering "dollars and cents," the numbers on the right will be something like 8.08, which you would type as 8-8 on the screen).  And the rankings are indicated by # signs.


The Frame

Read 2294 from the message disk.  Retype "BUCS" and "PHILS" as necessary.  Change the palette as necessary; yellow should be the visitors' team color (normally 706 for the Pirates), and red should be the home team's color.  Re-record at 2294.


The Autodisplay

Call up the existing autodisplay from 2270.  [An autodisplay is a programmable routine used by the Chyron character generator to play back "keystrokes" very rapidly for animation purposes.  In this case, a bar on the screen is printed out by typing as many as 32 characters, each character being the letter I, shifted to the left so that it's touching its neighbor.]

Now for each set of data, delete parts of the autodisplay and replace them with new numbers.  The parts to be deleted and replaced are underlined in the listing below.  When you're finished, check the operation of the autodisplay.  Then record it at an address between 2270 and 2292.  (It's so long that it will take two addresses.)



set up MGM


move Plaque


read 2294


type heading

HOME  FNT3  D  FNT2  O  U  B  L  E  S

center and shift it


wait for gray bar

TAB  FNT2  GREN  DELY  0000  space

draw it


type NL avg, pause

WHIT  1  3  0  DELY  0030  TAB

type visitors rank


ready for yellow bar

TAB  YELW  space

draw it


type visitors number, pause

WHIT  1  4  1  DELY  TAB

type home rank


ready for red bar

TAB  RED  space

draw it


type home number

WHITE  1  2  4  END

By the next season, I had taught the PC-8 some new tricks.  Because of its very limited memory — only 1,278 bytes for programs and data — I had to delete the feature where it could rank teams' records like 7-5 and 8-8 by calculating the winning percentage.  However, I managed to squeeze in all of the following routines.

Date: February, 1989
Re:    Instructions and PC-8 Basic programs for baseball


Career Earned Run Average

Press DEF = to begin.  Computer asks twice for IP.X (where X is thirds of an inning) and ER.  [One set of numbers refers to the pitcher's career coming into this season, as listed in the press guide; the other set refers to this season.]  It adds the pairs of numbers and gives you the composite ERA.

600:"=": CLEAR
605:FOR I=1 TO 2
620:INPUT "IP.X ";P
If P is 44.1, that means 44 and one-third innings
625:INPUT "ER ";R
630:Q=Q+ INT P+3.3333*(P- INT P)
Q is P converted to decimal form as 44.33333 innings
650:NEXT I
660:USING "####.##"
665:PRINT .005+9X/Q
This is the earned run average, rounded to two decimal places
670:GOTO 600


Updating Batting Average

DEF B to begin.  The display reads 910. 0.0. 000. where 910 is a Chyron address to identify the player, 0.0. means that he's 0 for 0 in tonight's game, and the last number is his updated season batting average.

Use the number keys to give commands as follows.




switch to other team

enter season data





move up on scorecard

increase hits (and AB)

increase outs (and AB)




move down

decrease hits

decrease outs

After you've called 8 to enter season at-bats and hits, the display will show the batting average.  If the player is replaced during the game, call 8 again [to enter the new player's at-bats and hits].

When you're not using the computer, turn off the power.  When you turn the power back on, use DEF Z (instead of DEF B) to resume without erasing your old data.

700:"B": CLEAR :Z=1
705:DIM B(18)
B(Z) is compressed data of the form 2.034, where 34 is at-bats for the season (coming into the game), 2 is at-bats tonight, and Z ranges from 1 to 18 for the eighteen players currently in the game
720:WAIT 12
725:S= INT V:T= INT U
S is hits tonight, T is at-bats tonight
V and U are the season-plus-tonight hits and at-bats
740:IF U=0 THEN LET W=0:GOTO 750
745:W= INT (.5+1000*V/U)
W is the updated batting average
755:PRINT B(0);" ";S;T;" ";W
Now the computer waits for the operator's command to go to a subroutine
765:IF U=0 THEN GOTO 755
This makes V either +1 or -1
775:ON U GOSUB 810,820,830,810,820,830,870,880
780:GOTO 710

812:IF Z=0 THEN LET Z=18
814:IF Z=19 THEN LET Z=1
This changes Z, the player index

This increments tonight's hits by either +1 or -1

830:B(Z)=B(Z)+V: RETURN
And this increments tonight's at-bats

870:Z=Z+9-18*(Z>9): RETURN
This changes Z by 9, which gets us to the other team

880:INPUT "AB ";X
882:INPUT "H ";Y
This stores the season numbers in the A(Z) and B(Z) arrays


National League Rankings

DEF N to begin.  Enter 12 numbers (without decimal points).  Then the computer will give you three answers of the form VIS #3.24.82, where the number between the periods is the length of the bar in the bar graph and the other two numbers should appear before and after the bar, respectively.  Press ENTER to see the next answer, and ENTER again to restart the program.

900:"N": CLEAR
902:DIM T$(2)*7
904:T$(0)="NL AV"
906:T$(1)="VIS #"
908:T$(2)="HOM #"
910:DIM N(5),R(2)
918:IF N(1)>N(2) THEN GOTO 926
Make the rank of the visitors #1, while the hometeam remains #0; the smallest of the three bars is the visitors' stat; and the largest of the three bars is the hometeam's stat
922:IF E=G THEN LET R(1)=0
If both stats entered so far are the same, then the ranks of both teams should be #0
924:GOTO 930
Make the rank of the hometeam #1, while the visitors remain #0; the smallest bar is the hometeam's stat; and the largest bar is the visitors' stat
Z accumulates the sum of all the stats; the average will be Z/12
931:FOR I=0 TO 9
934:INPUT "N.L. TEAM ";D
939:FOR J=1 TO 2
940:IF D>N(J) THEN LET R(J)=R(J)+1
If the stat just entered is greater than the stat of visitor or hometeam, then increment the rank of that team
943:N(0)= INT (Z/12+.5)
This is the league average, rounded to a whole number
946:IF N(0)>G THEN LET G=N(0)
If the league average is greater than the largest bar G, then set the largest bar to the league average
948:IF N(0)<E THEN LET E=N(0)
If the league average is less than the smallest bar E, then set the smallest bar to the league average
950:FOR I=0 TO 2
N(0), N(1), and N(2) are the stats for the three bars
X will range from 1, if N(I)=E, to 4, if N(I)=G
Y is the fraction that N(I) is of the largest bar
This averages X and Y
958:L= INT (X*32+.5)
And L is the number of characters in the bar
960:PRINT T$(I);R(I)+1;L;N(I)
962:NEXT I
964:GOTO 900


I soon found another use for the PC-8 besides baseball.

There are no scoreboards at professional boxing matches.  The sport has stubbornly remained in the 19th century, announcing each round by carrying a numbered card around the ring while refusing to let the fans see the round-by-round judges' scores — or a clock.

It's not as though the timing is complicated.  Unless the referee calls a time-out for an injury or something, the clock runs continuously:  three minutes for Round 1, a one-minute break, three minutes for Round 2, another one-minute break, and so on.

When a bout is televised, we in the television graphics department have to generate our own clock and superimpose it on the screen.  We start it from 3:00 when the bell rings to begin a round, then count down towards zero, when hopefully the bell will ring again.  (Because there's some uncertainty about all this, we remove our unofficial clock from the screen with five seconds left.  If it shows "0:00" at some time other than the end of the round, conspiracy-minded viewers might think that the ringside timekeeper has cheated by sounding the bell early or late.  Or worse, they might think that the TV crew doesn't know how to keep time.)

The PC-8 and I flew to Tokyo in February, 1990, to work the HBO telecast of Mike Tyson's upset loss to Buster Douglas.

Typically, my graphics coordinator starts and stops a stopwatch.  So does someone at ringside.  They tell me when to start and stop the clock on the screen.

But I want to have my own independent time indication, in case my colleagues get distracted.  And a simple stopwatch isn't really good enough.  It can't remind me which round we're in, nor can it warn me how soon the next round will start.

I solved all these problems in 1988 by writing another BASIC program for the handy PC-8, turning it into a "smart" customized stopwatch.

Beginning with 3:00 ROUND 1, it waits for my keystroke.  When the first bell rings, I hit ENTER, and the PC-8 starts counting down.  After 0:00 ROUND 1 it keeps on going; the next second is 3:59 ROUND 2, and it counts down the minute intermission until 3:00 ROUND 2 when the bell should signal the resumption of boxing.

The PC-8 will keep going like this all night with no further intervention from me.  However, its time may need to be corrected occasionally, and there are various buttons for that purpose.  The one that I use most often is B, for bell, which reduces the seconds to zero and holds them there until the bell rings and I release the button.  

October 21, 1988
PC-8 Program for Timing Boxing Matches

Can begin with DEF A
Parameters for start of match: 3 minutes, 0 seconds left in round 1
Manual input if desired
117:GOSUB 145
Waits for ENTER before proceeding
118:WAIT 54
Timing delay
120:D$=" ROUND "
121:GOSUB 145
Prints (to the LCD display) once a second
126:I$= INKEY$
127:IF I$="A" THEN GOTO 100
Press A to restart with new parameters
128:IF I$="Z" THEN LET S=10*INT((S+5)/10)
Hold Z to hack to nearest 10 seconds
129:IF I$="B" THEN LET S=0
Hold B to zero the seconds; when bell rings, release
130:IF I$="H" THEN LET S=S+1
Hold H to halt the count temporarily, adding one second back in each second
131:IF S>-1 THEN GOTO 140
If seconds haven't gone below zero, loop another second; otherwise next minute:
135:IF M>-1 THEN GOTO 140
If minutes haven't gone below zero, loop another second; otherwise next round:
140:GOTO 120
145:F$= STR$ (M)+":"+RIGHT$ ( STR$ (S+100),2)
146:PRINT " ";F$;D$;STR$ (R)

I loved the fact that I could customize this little device to behave in a special way that suited my purposes exactly.  And that, in fact, is the essence of a programmable computer.



Back to Top
More DesignMore Design