Burn this ROM image onto a 2732 EPROM and replace ZA19 with your newly burnt EPROM. Disconnect the cable running from the coin processor board to the ROM PCB and plug the cable running from the coin door to the coin processor board in it's place. You no longer need the coin processor board.

This ROM image has only been tested with the latest revision of Zookeeper ROMs, the same set as called "Set 1" in MAME.

Use at your own risk.

For the curious, here's how it works:

Zookeeper has two input ports for controls. Port A (0x1400) handles all the player controls. Port B (0x1402) handles the coin and test switches. Taito put a board with a 68705 microcontroller on it between the coin and test switches and Port B as a form of copy protection, to prevent people from putting Zookeeper ROMs on a Qix PCB or another game's PCB. Kram, Electric YoYo and Space Dungeon all use the same PCBs.

If you run Zookeeper without this coin processor board connected, you'll get free credits at power on and when you go into test mode, Slew Up will always be on, effectivly preventing you from changing any settings.

Qix's Port B normally works like this:

1000 0000 = 0x80 = Tilt
0100 0000 = 0x40 = Coin 3
0010 0000 = 0x20 = Coin 2
0001 0000 = 0x10 = Coin 1
0000 1000 = 0x08 = Slew Down 
0000 0100 = 0x04 = Slew Up
0000 0010 = 0x02 = Sub Test
0000 0001 = 0x01 = Adv Test

The 68705 on Zookeeper scrambles the input bits by putting a mask on them:

1101 1011 = 0xDB

So, what actually gets sent to Port B by the 68705 on Zookeeper is this:

0101 1011 = 0x5B = Tilt
1001 1011 = 0x9B = Coin 3
1111 1011 = 0xFB = Coin 2
1100 1011 = 0xCB = Coin 1
1101 0011 = 0xD3 = Slew Down
1101 1111 = 0xDF = Slew Up
1101 1001 = 0xD9 = Sub Test
1101 1010 = 0xDA = Adv Test

Zookeeper's main CPU then takes these bits and EOR's them with the value at location 0x030C to unscramble them into the correct value, then puts that final value at 0x03F8.

If you hook the game up without the coin processor the value from Port B gets EOR'd by the value from location 0x030C into a completely wrong value, which ends up adding free credits and keeping Slew Up on during test mode.

In order to fix this, I modified the code to have it always put 0xFF in 0x030C, then invert the result so it always puts the same value in location 0x03F8 as was sent to the input port. However, this wasn't enough. Some part of the code was still throwing incorrect data at Port B. I guess the 68705 would normally correct the data somewhere. Instead of hunting down all the possible places the code could be doing that, I added some code that filters out any value that doesn't exactly match what would come from one of the inputs. That worked great.

The last thing I had to do was change the checksum for the modified ROM so the game would pass it's self test. The checksum for ZA19 is at location 0xFFEF. Changing this to 0x00 causes the game to not calculate a checksum for ZA19.

Questions and comments can be directed to me at:

tim@arcadecollecting.com