You are on page 1of 24

-----------------------------------------------------------------

| SWITCHABLE CONVERSION BETWEEN ROBOTRON, JOUST, AND STARGATE |


-----------------------------------------------------------------
COPYRIGHT 1994
REVISION NUMBER: 1.0 (first public release)
REVISION DATE: 24 May 1994
CREATED BY: Doug Jefferys

STANDARD DISCLAIMER:
--------------------
The author hereby grants permission to reproduce and distribute this
document for personal use, subject to the condition that the document
(along with any copyright and disclaimer notices) is not modified in
any way. The opinions expressed within this document are those of the
author only and not necessarily those of the author's employer. This
document is provided for informational purposes only. Although the
author has made every effort to provide accurate information, he cannot
guarantee the accuracy or usefulness of any of the information contained
herein due to the complexity of the issues involved. The author takes
no responsibility for anything arising as a result of anyone using the
information provided in this document, and the reader hereby absolves
the author of any and all liability arising from any activities
resulting from the use of any information contained herein.

GENERAL OVERVIEW:
-----------------
Okay, so there's been a lot of talk among us collectors about what
can and cannot be done with Williams games. The theory has been
discussed; now it's time for some application.
What we want to do is get three Williams games to play within the
same cabinet. What we don't want to do is hunt for any new hardware.
We look at the Williams games out there, and note that Robotron and
Joust use common parts, except for the ROMs. We note that Stargate's
ROMs will also work in a Robotron or Joust cabinet. Sadly, we note
that we can't run Robotron or Joust off a Stargate setup, but, as they
say, life is hard.
Swapping control panels isn't too bad, but we're really sick and tired
of swapping all 12 program ROMs (and the sound ROM) every time we want
to switch games. Wouldn't it be nice if all we had to do was use a
ZIF (Zero-Insertion-Force) socket and a single chip? It'd be cleaner,
easier, safer, and infinitely more convenient. Heck, it'd even be
quicker than swapping ROM boards. All in all, a real win.
At the end of this project, you'll have a funny-looking adaptor with
a ZIF socket that you can plug into your sound board, and a small
daughterboard (also with a ZIF socket) plugged onto your ROM board.
You'll have a few pairs of chips which you wan swap in and out of the
sockets to swap games, and as a bonus, you'll have a pile of spare
ROMs you can use for hacking.
As with my previous conversions, sections labeled "Tech Note" are
primarily for people who want to know *WHY* the hack works, and how
it was designed. If you're only interested in building the unit,
you can skim over these sections.

INGREDIENTS:
------------
1 - Working Joust or Robotron machine.
1 - Set of controls for whichever two (Joust/Robotron/Stargate) games
you don't have yet. How you obtain or create these is up to you.
3 - 27512 EPROMs at 450ns or faster
3 - 2732 EPROMs at 450ns or faster
1 - 7404 hex inverter chip
1 - 74133 single 13-input NAND chip (no, that's not a typo :-)
1 - 28-pin ZIF (Zero-Insertion Force) socket
1 - 24-pin ZIF (Zero-Insertion Force) socket
1 - 16-pin socket
1 - 14-pin socket
1 - 28-pin socket
3 - 24-pin sockets
1 - 4-pin .100" male strip header
5 - 12-pin .100" male strip headers
1 - 12-pin .100" female MTA plug
1 - 4-pin .100" female MTA plug
1 - chunk of blank breadboard, .100" spacing, about 2.5 inches square
You will also need an EPROM programmer (or a friend who has one),
binary dumps of Robotron, Joust, and Stargate ROMs, a wire-wrapping
tool and a soldering iron.

WHAT THIS HACK IS:


------------------
It's a way of getting a Joust or Robotron machine to play Joust,
Robotron, and Stargate.
You'll be able to switch between any of the three games in about
a minute, by switching two EPROMs and (possibly) an adaptor.

WHAT THIS HACK ISN'T:


---------------------
This hack will *NOT* work on most Stargate machines. Stargate's CPU
board requires an upgrade before it will run the newer games, and its
ROM board is also incompatible. Sorry, folks, but them's the breaks.
There *are* ways around this, but...
...the cheapest upgrade path from Stargate is to get a Robotron or a
Joust ROM board and to upgrade the Stargate CPU board, but...
...unfortunately, CPU board upgrades are beyond the scope of this hack.
I'm working on a supplementary document that will describe some of the
various Williams boards out there, as well as their upgrade paths. If
you've got spare CPU boards lying around, but none of them are from
Joust or Robotron, try a Sinistar or Bubbles CPU. These should work.
Last but not least, this hack is not for those of you who want to keep
your high score information or game settings stored between playing
sessions. Due to differences in the software, switching games will
erase your CMOS RAM settings. Sorry, but there's no easy way around
this one. (I suppose you could wire up a whole bank of CMOS RAM chips
and manually select a specific chip when you switched games, but such
an extension would be far beyond the scope of this project...)

DETAILED INSTRUCTIONS:
----------------------
0) Read all of these instructions before you begin.
Steps 1) through 4) can be done at your desk in about half an hour.
Steps 5) and 6) are the toughest and will take a fair bit of
patience and care with the soldering iron; the EPROM socket
adaptors can be a real pain to build. Take your time and don't
be afraid to take breaks.
Steps 7) and 8) are a little less tedious, but should still be done
with care, as you'll be soldering directly to the circuit board in
step 8). Again, take your time and take some breaks.
Steps 9) and 10) are a nice wind-down and can be done in another
half-hour or so. The frustration level here will depend on your
luck in getting connectors that co-operate with your wire and tools,
but even the most persnickety combination of equipment shouldn't
take you more than an hour.

1) Create the program ROM data files:

1.1) Read the Robotron, Joust, and Stargate ROMs and store the data
on disk. When reading ROMs, make sure your programmer is set
to the correct chip type (2732 or 2532). As long as you get
the data in, the rest doesn't matter.
Due to the multiplicity of ROM sets out there, I can't guarantee
that every ROM set will work with this hack. I can, however,
guarantee that "Solid Blue" ROMs will work for Robotron, and that
the "Solid Red" ROMs will work for Joust. I don't know about
which sets of Stargate ROMs will work, as I only had one set
(which had been burned by a third party) to work from.
As an added note, the "Solid Red" Joust ROMs are an older version
of the program. The "Pterodactyl Trick" will work on these ROMs.

1.2) Create a dummy file of hex $FFs, 4096 bytes long.


Call this file "blank.fff".

1.3) Create the program ROMs, using 27512s. The contents of the three
games will be mapped onto each ROM as follows:
$0000-$0FFF = ROM 1
$1000-$1FFF = ROM 2
$2000-$1FFF = ROM 3
$3000-$1FFF = ROM 4
$4000-$1FFF = ROM 5
$5000-$1FFF = ROM 6
$6000-$1FFF = ROM 7
$7000-$1FFF = ROM 8
$8000-$1FFF = ROM 9
$9000-$CFFF = BLANK
$D000-$DFFF = ROM 10
$E000-$EFFF = ROM 11
$F000-$FFFF = ROM 12
Executing the following scripts will create the required files:
cat joust.01 > joust.512
cat joust.02 >> joust.512
cat joust.03 >> joust.512
cat joust.04 >> joust.512
cat joust.05 >> joust.512
cat joust.06 >> joust.512
cat joust.07 >> joust.512
cat joust.08 >> joust.512
cat joust.09 >> joust.512
cat blank.fff >> joust.512
cat blank.fff >> joust.512
cat blank.fff >> joust.512
cat blank.fff >> joust.512
cat joust.10 >> joust.512
cat joust.11 >> joust.512
cat joust.12 >> joust.512
cat robotron.01 > robotron.512
cat robotron.02 >> robotron.512
cat robotron.03 >> robotron.512
cat robotron.04 >> robotron.512
cat robotron.05 >> robotron.512
cat robotron.06 >> robotron.512
cat robotron.07 >> robotron.512
cat robotron.08 >> robotron.512
cat robotron.09 >> robotron.512
cat blank.fff >> robotron.512
cat blank.fff >> robotron.512
cat blank.fff >> robotron.512
cat blank.fff >> robotron.512
cat robotron.10 >> robotron.512
cat robotron.11 >> robotron.512
cat robotron.12 >> robotron.512
cat stargate.01 > stargate.512
cat stargate.02 >> stargate.512
cat stargate.03 >> stargate.512
cat stargate.04 >> stargate.512
cat stargate.05 >> stargate.512
cat stargate.06 >> stargate.512
cat stargate.07 >> stargate.512
cat stargate.08 >> stargate.512
cat stargate.09 >> stargate.512
cat blank.fff >> stargate.512
cat blank.fff >> stargate.512
cat blank.fff >> stargate.512
cat blank.fff >> stargate.512
cat stargate.10 >> stargate.512
cat stargate.11 >> stargate.512
cat stargate.12 >> stargate.512
Tech Note: The address space between $9000 and $CFFF is used
by the machine for I/O and other goodies, so you
can't use it for your own hacks. Sorry...

1.4) If your sound board uses 2532s (as it probably does), and you only
have 2732s to program for the missing games, you'll have to wire
up an adaptor later. You should, however, still read in the data.
This will give you the ".snd" files needed for the sound ROMs.
Note that Stargate actually uses 2K for its sound data, not 4K
like Robotron and Joust. Read in its data and save it to disk
as "stargate.raw".
NOTE: If you have a 4K data file for Stargate, examine it more
closely. You may find that only the first half of the file
contains data and that the second half is composed solely of
$FFs. If this is the case, you'll have to split off the first
2K of the file to create "stargate.raw". To create the 4K
"stargate.snd" file which will be used in this hack, you'll want
to have two copies of this data, one after the other. Execute
the following script to create "stargate.snd":
cat stargate.raw > stargate.snd
cat stargate.raw >> stargate.snd
You may now discard the "stargate.raw" file.
Tech Note: We're saving ourselves a lot of trouble; re-strapping
a sound board is a real pain. See the discussion on
the various strapping options in step 4) for more
details.

2) Fry up the ROMs:

2.1) Burn a 27512 with the contents of "joust.512", another with the
contents of "robotron.512", and a third with the contents of
"stargate.512".
Tech Note: My EPROM programmer won't conveniently handle
anything larger than a 27512. Thus, I'm going
with the "switchable chip" design, rather than
trying to consolidate all three games on one
larger chip. If you've read through this file
and grok how this version of the hack works,
then you should be able to figure out how to
extend it appropriately. Have fun!

2.2) Burn a 2732 with the contents of "joust.snd", another with


the contents of "robotron.snd", and a third with the contents
of "stargate.snd".

3) Okay, you've got your chips. Now we have to figure out when to
read data from the chips, and from what addresses we should do
the reading.
[Editor's Note: This whole section is basically an extended tech
note, but it's probably worth reading, just to
get a feel for what we're trying to accomplish
with all of this...]
Or not. Most of this has already been figured out for us by the
gang at Williams. The 74154 on the ROM board takes the four high
bits of a 16-bit address and turns it into sixteen separate signals.
Twelve of those signals are the !CS signals for the old ROMs, and
the other four can be ignored, as they don't have anything to do
with this hack.
(So, what can we use that's already on the board?)
Well, for starters, the 2732 (or 2532) sockets on the ROM board
are directly connected to the data bus, and are also connected to
the lower 12 bits of the address bus. If we construct our adaptor
wisely, that's a *big* pile of signals we won't have to worry about
on the 27512.
(Yeah, but what about...)
...the upper 4 bits of the address bus? According to the game's
schematics, these are sitting on the inputs of the aforementioned
74154. All we have to do is connect them to the high 4 bits of
the 27512's address pins, and voila -- our 27512 can be used to
access the entire ROM address space.
Okay, so when do we turn it on? Simple. We read from the 27512
by pulling its !CS pin low whenever we want to read. We *want*
to read whenever any of the *original* twelve !CS pins on the ROM
board is pulled low by the 74154. Confused yet?
(Yes!)
Okay, look at it this way. If all twelve !CS pins on the ROM board
are high, then all chips are deselected. Don't read anything. The
!CS on the 27512 should remain high.
If any of the twelve !CS pins on the ROM board are low (and by
definition, only one of them can be low at any given time), then
the game must be trying to read from a ROM chip, so !CS on the
27512 should be low.
If we call the !CS on the 27512 "!CS512", and the !CS signals to
the original ROMs "!CS1" through "!CS12", we see that:
(!CS512) == (!CS1) && (!CS2) && ... && (!CS 11) && (!CS12)
So, where do we get a 12-input AND gate? We could make one out
of a whole mess of 4-input AND gates, but there's an easier way,
namely the 74LS133. This chip is a 13-input NAND gate. A truly
odd duck in the TTL world, but downright invaluable in this
situation. Get the NAND of all 12 inputs (and a surplus "1"),
invert it to get the AND of the inputs, and you're done. Since
all the logic is done on one chip, and since the order isn't
important, the wiring will be a cinch!

4) Verify strapping of boards:


You could start building right now, except for the fact that you
wouldn't necessarily be building on the right platform. Williams
boards have many jumpers and pads which can be cut or inserted in
order to change their configuration.
This is good from a design standpoint, as one can use the same board
in a variety of applications. Indeed, this hack owes its existence
to the flexibility designed into the Williams hardware.
Alas, it makes documenting such hacks a nightmare. Some of you
will have ROM boards strapped for 2532s, others with 2732s. The
same goes for the sound boards. Other strapping options, used for
specific games, may also be present. Due to the wide variety of
strapping variations out there (and the lack of documentation),
it is generally difficult to tell anyone how to turn an arbitrary
board set into a set which can be used in this hack.
Having said that, we can still simplify the problem and save
ourselves some work in the process:

4.1) ROM board:


This hack depends on having a ROM board which is strapped
for 2732s. Before we go any further, we need to make sure
that this is the case.
The easy way to tell is to look at the chips on the board.
If they're 2732s, all is well and you can go to the next
step.
If they're 2532s, you'll have to change the strapping to
accept 2732s before you can continue. This is a very simple
modification which can be done in less than ten minutes.
According to the schematics, there are four jumpers on the
ROM board, labeled W1 through W4. Here are their approximate
locations:
W1: to the immediate left of ROM 5
W2: to the immediate left of W1
W3: to the immediate left of ROM 6
W4: to the immediate left of W3
If your board contained 2732s, W1 and W3 will be connected.
If it used 2532s, W2 and W4 will be connected.
When the boards come from the factory, the pairs of jumper
pads will be connected by a (usually red) zero-ohm resistor.
(These look just like ordinary resistors, except they've got
very simple markings -- a single black line) To change the
strapping of your board, you can either desolder the jumpers
and move them to their new homes, or just cut them off and use
a piece of insulated wire to connect the pads.
NOTE: If you decide to cut them off and replace them with
wires, make sure the wires are insulated; the jumpers carry
real signals; these are *not* ground wires!
So, if your board contained 2532s, you'd desolder W2 and W4,
and place the jumpers across the immediately adjacent pads
at W1 and W3.

4.2) Sound board:


At this point, your ROM board should be strapped for 2732s.
We now concern ourselves with the strapping of the sound board.
The sound board can be strapped in *dozens* of configurations.
For simplicity's sake, we shall assume that you started with one
that was strapped for use in Robotron or Joust. This means that,
in all probability, it was strapped for 2532s; rather than fool
around with trying to modify the strapping for 2732s, I decided
to merely build an adaptor into the project, the construction of
which is described later.
The hacking we did in step 1.4) with the Stargate sound ROM data
comes in handy here. Because the original Stargate sound board
was strapped for a 2516 (or 2716), and because some of the other
jumpers on the ROM board are strapped differently, we would have
had to swap a lot of jumpers every time we wanted to use the game.
Rather than go through all this trouble, we embedded the strapping
work in the 2732 EPROM itself, saving us untold headaches in the
process.
So, strapping doesn't matter here. If the board came from Joust
or Robotron, it's strapped for either game, and is strapped for
2532s. The adaptor will let us use our 2732s, and the work we
did in step 1.4) will let us use Stargate sound ROMs in the same
board without any further work.

5) Build the program board:

5.1) Start by building the adaptor to allow you to plug the big EPROM
into one of the 2732 sockets on the ROM board. This will allow
us to use the address and data lines already present on the board,
thereby saving us some wiring work.
Tech Note: Here are the pinouts for a 2732 and a 27512. We want
to build something that will let us plug the 27512
into the game's existing 2732 socket.
__ __
A15| U |+5V
__ __ A12| |A14
A7| U |+5V A7| |A13
A6| |A8 A6| |A8
A5| |A9 A5| |A9
A4| |A11 A4| 2 |A11
A3| 2 |!CS A3| 7 |!CS
A2| 7 |A10 A2| 5 |A10
A1| 3 |!CE A1| 1 |!CE
A0| 2 |D7 A0| 2 |D7
D0| |D6 D0| |D6
D1| |D5 D1| |D5
D2| |D4 D2| |D4
GND|_____|D3 GND|_____|D3
Note the similarities between these pinouts. We can
ignore the !CS signal on the 2732, as we're creating
our own from the other logic, and we'll have to move
the +5V line. The rest of the pins can go straight
through to the chip; no wiring required.
We'll use strip headers for those "straight through"
connections, cutting off any lines we don't need, and
bending any lines we'd like to reroute away from the
chip, again simplifying the wiring job ahead.

5.2) Start by putting the 12-pin strip headers into both boards,
as shown below. Note that you want the longer pins of the
strip header to stick out of the top side of the boards, and
the shorter pins to be on the bottom.
Viewed from the top, the boards should look like this:
LEGEND:
-------
. = empty hole on breadboard
* = a pin from a 12-pin male strip header
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
The view from the side should look like this:
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin
=========================================== < breadboard
* * * * * * * * * * * * < plastic surrounding pins
| | | | | | | | | | | | < pin
| | | | | | | | | | | | < pin

5.3) Cut off pin 20 (!CS) of the strip header; it won't be used
by anything in the circuit.

5.4) Bend pin 24 at a right angle. It will eventually supply the


circuit with its +5V power.
When you have completed the preceding two steps, the board
should look something like this when viewed from the top...
LEGEND:
-------
. = empty hole on breadboard
* = a pin from a 12-pin male strip header
x = a *cut* pin from the strip header
- = a *bent* pin from the strip header
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . * . . . . . --- . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . x . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . * . . . . . * . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
...and something like this when viewed from the side:
LEGEND:
-------
= = breadboard material
* = the plastic that surrounds the row of pins in the strip header
| = uncut pins
x = the stub of the cut pin
. = the end of a bent pin, pointing towards the viewer.
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
PIN 15 | | | | | | | x | | | . PIN 24 < pin (also bent/cut pins)
===========================================
* * * * * * * * * * * *
| | | | | | | | | | | |
| | | | | | | | | | | |

5.5) Using a soldering iron, tin the leads of the tops of the strip
header pins and the pins of a 28-pin socket. This will make
step 5.6) infinitely easier to perform, and make the final
product considerably more reliable.

5.6) Place the 28-pin socket on *top* of the strip header pins and
solder all connecting pins in place. Probably the best way
to start is to solder the four pins on the corners of the chip
first. This will hold things in place solidly enough to do the
rest of the soldering job. When you're done, finish up by
reflowing the solder on the four corner pins you started with.
When you are done, you should have something that looks like this:
LEGEND:
-------
# = body of 28-pin socket
! = pins from 28-pin socket
= = breadboard material
* = the plastic that surrounds the row of pins in the strip header
| = uncut pins from the strip header
x = the stub of the cut pin
. = the end of a bent pin, pointing towards the viewer.
########################### < 28-pin socket body
########################### < 28-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! ! ! PIN 28 < pins from 28-pin socket
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
PIN 15 | | | | | | | x | | | . PIN 24
===========================================
* * * * * * * * * * * *
| | | | | | | | | | | |
| | | | | | | | | | | |

5.7) You're almost done. Now you want to wire up the last few pins to
complete the adaptor, specifically +5V line.
Going back to our side view, connect a thin wire to pin 28 of the
adaptor. Run it down to the bent pin 24 to supply +5V to the chip.
###########################
###########################
! ! ! ! ! ! ! ! ! ! ! ! ! !
| | | | | | | | | | ' PIN 28 < +5V to the 27512
| | | | | | | | | | /
| | | | | | | | | | /
| | | | | | | | | | /
| | | | | | | | | | ,
PIN 15 | | | | | | | x | | | . PIN 24 < +5V from the 2732
===========================================
* * * * * * * * * * * *
| | | | | | | | | | | |
| | | | | | | | | | | |

5.8) Complete the adaptors by plugging them into the two 24-pin sockets
you obtained earlier, as shown in the diagram below. (Due to the
limitations of ASCII drawings, we have not shown the wiring you
performed during step 5.7) above...)
LEGEND:
-------
# = body of 28- or 24-pin socket
! = pins from 28- or 24-pin socket
= = breadboard material
* = the plastic that surrounds the row of pins in the strip header
| = uncut pins from the strip header
x = the stub of the cut pin
. = the end of a bent pin, pointing towards the viewer.
###########################
###########################
! ! ! ! ! ! ! ! ! ! ! ! ! !
| | | | | | | | | | '
| | | | | | | | | | /
| | | | | | | | | | /
| | | | | | | | | | /
| | | | | | | | | | ,
PIN 15 | | | | | | | x | | | .
===========================================
* * * * * * * * * * * *
| | | | | | | | | | | |
####################### < 24-pin socket body
####################### < 24-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket

5.9) Cram the 24-pin ZIF socket into the top socket of the daughterboard.
You could have done this whole hack using the ZIF socket *as*
the top socket of the daughterboard, but ZIF sockets are expensive,
and there's no point in wasting a ZIF socket if you make a mistake.
Also, the pins on some models of ZIF sockets move fractionally
when chips are inserted and extracted. As the solder joints on
the adaptor are already of fairly marginal quality, we want to
reduce the risk of cracking over the long term.
At any rate, test-fit the completed board by plugging it into
one of the 24-pin sockets on the main board. It should insert
smoothly and seat firmly. Lay the partially-constructed board
aside and proceed to the next step:
6) Create the adaptor for the sound board:
Tech Note: Here are the pinouts for a 2532 and 2732. We want to
build something that will let us plug the 2732 into the
sound board's existing 2532 socket.
__ __ __ __
A7| U |+5V A7| U |+5V
A6| |A8 A6| |A8
A5| |A9 A5| |A9
A4| |A11 A4| |+5V
A3| 2 |!CS A3| 2 |!CS
A2| 7 |A10 A2| 5 |A10
A1| 3 |!CE A1| 3 |A11
A0| 2 |D7 A0| 2 |D7
D0| |D6 D0| |D6
D1| |D5 D1| |D5
D2| |D4 D2| |D4
GND|_____|D3 GND|_____|D3
Note the similarities between these pinouts. All
we have to do is move A11 over to the proper pin,
and bring a GND signal to the 2732's !CE pin (as
the chip should always be enabled).
Just as before, we'll use strip headers for the
"straight through" connections, cutting off any
lines we don't need, and bending any lines we'd
like to reroute away from the chip before rerouting
them.

6.1) Start by putting a couple of 12-pin strip headers into one


of the 24-pin sockets. Cut pin 18 about halfway up, and cut
pin 21 near its base. After you're done your cutting, you
should have something like this:
LEGEND:
-------
# = body of 24-pin socket
! = pins from 24-pin socket
= = breadboard material
* = the plastic that surrounds the row of pins in the strip header
| = uncut pins from the strip header
x = the stub of the cut pin
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | x | | | | |
| | | | | | | | | | |
PIN 13 | | | | | | | | x | | | < top of strip header
* * * * * * * * * * * * < plastic surrounding pins
| | | | | | | | | | | | < bottom of strip header
####################### < 24-pin socket body
####################### < 24-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket

6.2) As in step 5.5), use your soldering iron to tin the leads of
the tops of the strip header pins and the pins of a 24-pin
socket. This will make step 6.3) infinitely easier to perform,
and make the final product considerably more reliable.

6.3) Again, just as in step 5.6), place the 24-pin socket on *top*
of the strip header pins and solder all connecting pins in place.
When you are done, you should have something that looks like this:
LEGEND:
-------
# = body of 24-pin socket
! = pins from 24-pin socket
= = breadboard material
* = the plastic that surrounds the row of pins in the strip header
| = uncut pins from the strip header
x = the stub of the cut pin
####################### < 24-pin socket body
####################### < 24-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | x | | | | |
| | | | | | | | | | |
PIN 13 | | | | | | | | x | | | < top of strip header
* * * * * * * * * * * * < plastic surrounding pins
| | | | | | | | | | | | < bottom of strip header
####################### < 24-pin socket body
####################### < 24-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket

6.4) This is the tricky bit. You want to connect pin 18 of the
*bottom* socket to pin 21 of the *top* socket. You also
want to connect pin 14 of the adaptor to pin 18 of the top
socket.
This step involves some very tricky and delicate placement of
wires, fingers, and a soldering iron. It can be by one person
without burned fingers, but a third set of hands will probably
make things go a little easier. Just be careful and it'll all
work out. (And come to think of it, it was harder to come up
with these ASCII pictures than it was to do the wiring :-)
What you will end up is something like this, when viewed from
the side:
####################### < 24-pin socket body
####################### < 24-pin socket body
~! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket
|~|-|-|-|-' | | | | | |
| | | | | ----' | | |
| | | | | /| | | | |
| | | | | x | | | | |
| | | | | | | | | | |
PIN 13 | | | | | | | | x | | | < top of strip header
* * * * * * * * * * * * < plastic surrounding pins
| | | | | | | | | | | | < bottom of strip header
####################### < 24-pin socket body
####################### < 24-pin socket body
! ! ! ! ! ! ! ! ! ! ! ! < pins from 24-pin socket
Finally, just to exhaust the limitations of ASCII art, here's
an oblique X-ray view, with the body of the top socket cut away
and the body of the bottom socket eliminated.
Connect "A" (on pin 14 == GND) to "A" (pin 18 on the top socket),
and connect "B" (pin 18 on the bottom socket) to "B" (pin 21 on
the top socket).
# # # # # # # # # # # # < pin 1 on top socket
A /|||||||||||||||||||||||
/ ||| / / / / / / / / ||| < |||
/ /|||/ / / / / / / / /||| < ||| = top socket material
/ / ||| / / / / / / / / ||| < |||
/ / /|||/ / / / / / / / |||
* * * ||| * * * * * * * ||| < pin 1 on bottom socket
/ / / /|||/ / / / / / / |||
||| |||
|||||||||||||||||||||||
# # # # # # # # # # # # < pin 24 on top socket
/ / / / / / / / / / / /
/ / / / / A / / B / / /
/ / / / / / / / / /
/ / / / / B / / / / /
/ / / / / / / / / / / /
* * * * * * * * * * * * < pin 24 on bottom socket
/ / / / / / / / / / / /
You now have an adaptor which you can plug into any 2532 socket
and use a 2732 chip. If you're feeling masochistic, you can whip
up a few more of these; you never know when one will come in handy.
Tech Note: No, you can't use these to program 2532s in a burner
configured for 2732s, but you can use it to read 'em,
which is good enough for most purposes.

6.5) Cram the 24-pin ZIF socket into the top socket of your adaptor.
Once you've got the ZIF socket in the adaptor, and have verified
that you can indeed insert/extract chips with zero force, the
assembly is complete. Plug the completed assembly into the
empty 24-pin socket on the sound board which used to hold the
sound ROM.
We will now turn our attention back to our half-constructed
daughterboard...

7) Wrap the daughterboard:


Lay out rest of parts as shown in the diagrams below, and wrap.
The EPROM sockets will already be present from the adaptor work
you performed in step 5) above. You still have to add the 14-pin
socket for the 7404 hex inverter, the 16-pin socket for the 74133
13-input NAND gate, the 12- and 4-pin connectors which will be
used to connect the hack to the ROM board.
Now it's time to start wrapping!
The wrap lists will be in the form "Xn - Ym", where "X" and "Y"
denote components as depicted in step 5) above, and "n" and "m"
denote pin numbers. Explanatory notes and/or signal names are
shown off to the right of the list.
For example:
E28 - X14 | +5V
means to connect pin 28 of the EPROM to pin 14 of the 7404 and
that the connection carries +5VDC.
Remember that the wrap lists are from the point of view of the
pin numbers on the ICs -- i.e. that the diagrams in this document
depict the boards as seen from the *PARTS* side, not the *WIRING*
side. You will have to mentally flip things around if you want to
use the diagrams to do the wrapping.
This bears repeating, especially for inexperienced wire-wrappers.
Make absolutely sure that if you're connecting something to "the
second pin from the leftmost" on some chip on the diagrams above,
that you actually connect it to the second pin from the RIGHT on
the chip when you're looking at it from below. It's an easy
mistake to make, and it can be very frustrating.
If you've got small labels to stick on the bottom of your board
to prevent this kind of mistake, by all means use 'em.
Okay, you're ready to wrap. Grab your tools and wire, get comfy,
and go to work!
LEGEND:
-------
. = empty hole on breadboard
P = 27512 EPROM
X = 74133 13-input NAND chip
Y = 7404 hex inverter chip
C = 12-pin connector
D = 4-pin connector
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . 1 . . 4 . 1 . . . . . . . . . . 12 .
. . . C C C C . D D D D D D D D D D D D .
. . . . . . . . . . . . . . . . . . .
. 1 . . . . . 28 . . 16 . . . . . . . . . . .
. P . . . . . P . . X X X X X X X X . . . .
. . P . . . . . P . . . . . . . . . . . . . . . .
. . P . . . . . P . . . . . . . . . . . . . . . .
. . P . . . . . P . . . X X X X X X X X . . . .
. . P . . . . . P . . . 1 . . . . . . . . . . .
. . P . . . . . P . . . . . . . . . . . . . .
. . P . . . . . P . . . 14 . . . . . . . . . . .
. . P . . . . . P . . . Y Y Y Y Y Y Y . . . . .
. . P . . . . . P . . . . . . . . . . . . . . . .
. . P . . . . . P . . . . . . . . . . . . . . . .
. . P . . . . . P . . . Y Y Y Y Y Y Y . . . . .
. . P . . . . . P . . . 1 . . . . . . . . . . .
. . P . . . . . P . . . . . . . . . . . . . .
. . P . . . . . P . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
.---------------------.
| POWER / MISCELLANY: |
|-------------------------------------------------------------------.
| P28 - X16 | +5V (better yet, use the P24 bent pin from before) |
| X16 - Y14 | +5V |
| P14 - Y7 | GND |
| Y7 - X7 | GND |
`-------------------------------------------------------------------'
.--------------------------.
| ADDRESS INPUTS (4-PIN): |
|-------------------------------------------------------------------.
| C1 - P2 | A12 |
| C2 - P26 | A13 |
| C3 - P27 | A14 |
| C4 - P1 | A15 |
`-------------------------------------------------------------------'
.------------------------------.
| CHIP SELECT INPUTS (12-PIN): |
|-------------------------------------------------------------------.
| D1 - X2 | !ROM1 |
| D2 - X3 | !ROM2 |
| D3 - X4 | !ROM3 (The order doesn't really matter here; |
| D4 - X15 | !ROM4 all that matters is that all the Dxx |
| D5 - X14 | !ROM5 pins find an input pin on the 74LS133. |
| D6 - X13 | !ROM6 The suggested arrangement here, however, |
| D7 - X12 | !ROM7 is probably the easiest in terms of |
| D8 - X11 | !ROM8 physically laying out and wrapping the |
| D9 - X10 | !ROM9 wires. Draw it out on a piece of graph |
| D10 - X5 | !ROM10 paper to get get the idea) |
| D11 - X6 | !ROM11 |
| D12 - X7 | !ROM12 |
| X16 - X1 | The 13th input to the NAND remains high |
`-------------------------------------------------------------------'
.---------------------.
| CHIP SELECT OUTPUT: |
|-------------------------------------------------------------------.
| X9 - Y9 | CS goes to the 7404 |
| Y8 - P22 | !CS goes to the 27512 |
`-------------------------------------------------------------------'

8) Wire the connectors:


Your daughterboard is now complete; you may now plug it into any
one of the 12 empty 24-pin sockets on the ROM board. Although any
of the sockets will work, it's probably best to choose one near the
center of the board; you'll definitely want to be able to plug the
power connector into the ROM board (I've found that boards just
don't work too well without power :-), and you'll also want an
unobstructed view of the seven-segment diagnostic LED, just in
case you goofed in the wiring. (Trust me, you *WILL* want a good
view of that LED. 'Nuff said :-)
Having said all of that, pick a socket and plug in the daughterboard.
All sixteen pins from the daughterboard's two connectors will be
used by the hack. When you place the wires into the female plugs
for these connectors, keep in mind that they'll all be going to
various locations underneath the ROM board, so be sure they're all
long enough to reach any of the ROM sockets from their starting
point on the daughterboard.
Be careful when soldering the wires to the chips and sockets.
Although the only chip you're likely to damage is the 74154,
anything can (and occasionally will) go wrong.
For this reason, you might want to (carefully) remove the two
40-pin ICs before you begin -- these are pieces of custom hardware
that *CANNOT* be replaced if damaged by stray charge from your
soldering iron. If you're good at removing large chips without
bending the legs, why not spend another minute to make things a
bit safer? (While we're at it, take careful note of the way the
chips are facing before you remove them -- you don't want to put
them in backwards after you're done!)
If you have access to an ESD-safe workstation, this would be an
extremely good time to use it. At the very least, make sure that
both you and the PCB are safely grounded while you're hacking on
the board.

8.1) 4-pin connector:


The .100" female MTA 4-pin connector carries the upper four bits
of the address bus to the 27512. Wires from this connector will
reach underneath the ROM board to the 74154 near the 40-pin ribbon
cable that connects the ROM board to the CPU board.
Label the connector and connect the wires as follows:
1 - A12 -> 23-of-74154
2 - A13 -> 22-of-74154
3 - A14 -> 21-of-74154
4 - A15 -> 20-of-74154
Plug the 4-pin connector into the ROM daughterboard.

8.2) 12-pin connector:


The .100" female MTA 12-pin connector carries the !CS signals from
all twelve ROM sockets to the 74LS133. Wires from this connector
will reach underneath the ROM board to each of the board's ROM
sockets. As an alternative, they can also connect to the 74154.
For ease of wiring, I'd advise sticking them to the individual
ROM sockets; this makes them easy to manipulate and lowers the
risk of shorting pins. If you take them to the 74154, you'll
have 16 wires leading to a single chip, and things can get a
little hairy when soldering that 16th wire :-)
Because everything is being NANDed together, it doesn't matter
which wires go where. The guide below is just that -- a guide.
You're free to hook 'em up in whatever way seems most convenient
to you. Happy hacking!
1 - !CS1 -> 1-of-74154 == 20-of-ROM1
2 - !CS2 -> 2-of-74154 == 20-of-ROM2
3 - !CS3 -> 3-of-74154 == 20-of-ROM3
4 - !CS4 -> 4-of-74154 == 20-of-ROM4
5 - !CS5 -> 5-of-74154 == 20-of-ROM5
6 - !CS6 -> 6-of-74154 == 20-of-ROM6
7 - !CS7 -> 7-of-74154 == 20-of-ROM7
8 - !CS8 -> 8-of-74154 == 20-of-ROM8
9 - !CS9 -> 9-of-74154 == 20-of-ROM9
10 - !CS10 -> 15-of-74154 == 20-of-ROM10
11 - !CS11 -> 16-of-74154 == 20-of-ROM11
12 - !CS12 -> 17-of-74154 == 20-of-ROM12
Plug the 12-pin connector into the ROM daughterboard. If you
removed the 40-pin custom ICs before doing the soldering, put
them back in now. Make absolutely sure that the chips are
plugged in correctly. You do *NOT* want to plug the custom
in backwards. When they're back in, check again, just to be
certain.

9) Control panels - pinouts


Okay, so you can run the three programs on your console, but how
the heck do you actually play the game? It's gonna be mighty
awkward playing Joust without buttons, or Stargate with two 4-way
joysticks, isn't it?
Well, yes and no. You'll have to switch the control panels when
you switch games, and you'll also probably have to construct an
adaptor to go between the game's wiring harness and the small
interface board in order to make the control panel sensible.
You do have a couple of adavantages, though:
Many Williams cabinets were identical; the control panel from one
could be swapped directly into the other. Stargate and Robotron,
for example, share identically-constructed cocktail cabinets; the
control panels can be swapped in about a minute, and that's
including the time to insert the adaptor.
Also, certain control panels can be fashioned directly out of the
originals. Making a Joust panel out of a Robotron panel, for
instance, is easy and practical.
The "switch test" portion of the self-test procedure proved to be
invaluable in generating the following pinouts and testing the
adaptor and control panel I wound up building to support my new
games.

9.1) Robotron interface board pinout


1 - P1 fire left
2 - P2 move up
3 - P2 move down
4 - P2 move left
5 - P2 move right
6 - P2 fire right
7 - P2 fire up
8 - P2 fire down
9 - P2 fire left
10 - GND
11 - P1 move up
12 - P1 move down
13 - P1 move left
14 - P1 move right
15 - 1-player start
16 - 2-player start
17 - P1 fire up
18 - P1 fire down
19 - P1 fire right
20 - GND

9.2) Stargate interface board pinout


1 - P1 move up
2 - P2 fire
3 - P2 thrust
4 - P2 smart bomb
5 - P2 hyperspace
6 - P2 inviso
7 - P2 reverse
8 - P2 move down
9 - P2 move up
10 - GND
11 - P1 fire
12 - P1 thrust
13 - P1 smart bomb
14 - P1 hyperspace
15 - 2-player start
16 - 1-player start
17 - P1 reverse
18 - P1 move down
19 - P1 inviso
20 - GND

9.3) Joust interface board pinout


1 -
2 - P2 move left
3 - P2 move right
4 - P2 flap
5 -
6 -
7 -
8 -
9 -
10 - GND
11 - P1 move left
12 - P1 move right
13 - P1 flap
14 -
15 - 2-player start
16 - 1-player start
17 -
18 -
19 -
20 - GND

10) Control panels - an example


Due to the large number of possible starting configurations
(upright, cocktail, Robotron, Joust, Stargate), I will not attempt
to describe every possible adaptor and control panel mod under the
sun; I'll just describe my own situation (starting from a Robotron
cocktail unit and the pinouts described above) and let you take
things from there.

10.1) Since I already had a Robotron cocktail machine, the Robotron


control panel was the trivial case. It was already there, so
no work was required. Gee, life is tough!

10.2) Stargate was done by creating a completely separate control


panel with lines running directly down to the interface board.
Yes, this was a bit of a cheat; rather than build an adaptor, I
merely bypassed the game's wiring harness and plugged directly
into the interface board. Still, it made the wiring easy, and
I was in a bit of a hurry at the time.
Someday I'll get an original Stargate control panel from a
cocktail machine and build the proper adaptor, but this will
suffice for now.

10.3) Joust was the interesting case; I had two joysticks and plenty
of space on the Robotron panel, so I modified it to support Joust
directly by adding two buttons and fiddling with the internal
wiring. No swapping of panels required, just the insertion and
removal of an adaptor.
Yes, I cringed as the drill bit worked its way through the
original panel, but once the new buttons were installed, they
blended in nicely with the original panel. If I didn't know
better, I'd say they'd been installed at the factory myself.
I then added a piece of wire connecting the right stick's "UP"
switch to the right button, and another piece of wire connecting
the left stick's "UP" switch to the left button. Two more pieces
of wire to ground the buttons completed the circuit.
When playing Robotron, there would thus be two ways to move or
fire upwards; either by pressing up on the joystick or by pressing
the newly-installed "FLAP" button. Since buttons are not normally
used in Robotron, this mod is completely unobtrusive to the player
when in Robotron mode.
When in Joust mode, there would be two ways to flap; either by
pressing the "FLAP" button or by moving up on the joystick. It's
possible, while moving side to side, to activate this switch by
accident, but I've found it to be a relatively minor problem. If
you find it to be a pain, try arranging the wiring so that pulling
"DOWN" on the stick activates "FLAP" instead -- you might find it
more to your liking.
I then constructed an adaptor to connect the Player 1 control panel
harness to the game's interface board as follows, using the pinouts
described above in section 9).

10.4) Assuming you did the same thing that I did (namely adding a couple
of buttons to the Robotron control panel as duplicates of the "UP"
joystick directions), your adaptor should look like this:
Robotron Harness Connect to Interface Board
(Pin # and meaning) (Pin # and meaning for Joust)
1 (P1 fire left) ----> 2 (P2 move left)
2 (P2 move up)
3 (P2 move down)
4 (P2 move left)
5 (P2 move right)
6 (P2 fire right)
7 (P2 fire up)
8 (P2 fire down)
9 (P2 fire left)
10 (GND) -------------> 10 (GND)
11 (P1 move up) ------> 13 (P1 flap)
12 (P1 move down)
13 (P1 move left) ----> 11 (P1 move left)
14 (P1 move right) ---> 12 (P1 move right)
15 (1-player start) --> 16 (2-player start)
16 (2-player start) --> 15 (1-player start)
17 (P1 fire up) ------> 4 (P2 flap)
18 (P1 fire down)
19 (P1 fire right) ---> 3 (P2 move right)
20 (GND) -------------> 20 (GND)

11) Usage instructions:


Congratulations! If you've made it this far, you should now be
able to switch between Robotron, Joust, and Stargate, simply by
swapping two EPROMs and any associated control panel adaptors.
Assuming you started with a Robotron cabinet, plug the Robotron
27512 into the ROM daughterboard, and the Robotron 2732 into the
adaptor on the sound board.
Check everything over, power the game up, and pray :-)
Run through the self-test. Everything should work perfectly; the
game shouldn't know it's been hacked with.
Power down, count ten seconds, and try with the other two sets of
ROMs and control panels. Although the high scores, audit information
and difficulty settings will be reset between games, everything else
should work normally.
TROUBLESHOOTING:
----------------
Safety Check:
- Check *EVERYTHING* for shorts, etc... before plugging it in. Go over
it and look for little bits of solder that went to the wrong place,
strands of wire, *anything* that could cause trouble. If you've got
a multimeter with a continuity checker, use it. The five minutes you
spend now may save you hours of debugging later.
- Solder is brittle and can crack easily, and you've made some fairly
precarious joints when constructing the EPROM adaptors. Be careful
when operating the ZIF sockets and swapping chips, and try not to
wiggle things around too much.
Another error-prone part of the hack lies in the wiring under the ROM
board where you soldered some wires to the !CS pins of the empty ROM
sockets. Poor solder joints or broken-off wires should show up as
individual ROM failures during the game's self-test procedure and be
highlighted on the ROM board's LED display.
- When switching between games, wait at least 10-20 seconds before
switching chips. The power supply can still supply enough power
to damage your chips if you yank 'em out too early. Yes, you could
always burn yourself another set, but why take the chance?
Changing the control panel adaptor before changing chips is a good
way to make this habit automatic -- by the time you've changed the
panel adaptor, it'll be safe to swap the EPROMs.

Reality Check:
- Are you running off a Joust or Robotron CPU board? A Sinistar
or Bubbles CPU board will also work, but a Stargate CPU board
will *NOT* work unless it's been upgraded to at least the Joust
or Robotron level. ("WHAT THIS HACK ISN'T")
- Is your ROM board strapped for 2732s? (Step 4.1)
- Is your sound board strapped for 2532s? (Step 4.2)

Sound Check:
- If you get no sound when playing Stargate, verify that both halves
of the 2732 contain the same data; you should have two exact copies
of Stargate's 2K sound ROM in this chip.

Control Panel Check:


- Use the self-test mode's "switch test" to make sure your control
panel configurations play the way you want. Once you get used to
it, you'll be able to develop and your adaptors "on the fly"; this
can be an excellent timesaver.
Game Check:
- When you're all done, test all three games. If some games work, but
you get inexplicable RAM errors or weird graphics with other games,
check the wiring of the program ROM hack, paying particular detail to
the 74LS133 and its associated inputs. The '133 decides whether or
not to read from the 27512 EPROM; some of the games use the address
and data busses for "other stuff" when the ROM is expected to be
inactive. If the '133 is activating the 27512 at these times, you'll
get bus contention and see all sorts of strange behavior.
Due to differences in the programs and original architectures, all
three games can function differently under these circumstances.
Robotron, for instance, will run perfectly, even if the 27512 is
permanently activated. Joust will run, but the sprites will leave
cute little trails of green pixels, and Stargate will fail, believing
it has a bad RAM.

You might also like