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