A downloadable project

Pokémon Pinball is a game for the Game Boy Color that was released in 1999. It's notable for coming in a cartridge format that Nintendo called the "Game Boy Rumble Pak," meaning it's a Game Boy cartridge with a vibrator motor built in.

The inside of a Pokémon Pinball cartridge

Image taken from Louis Zezeran's blog, Honkey Kong Country

Something I've wanted to do for a long time is make something like the Rez trance vibrator but for Pokémon Pinball, on a real Game Boy, and without altering/damaging an original cartridge. This required both a ROM hack and a custom link cable peripheral. The 666ames Made Quick Game Jam was just the motivation I needed to actually do it!

Here is a YouTube video showing the game driving a bullet vibrator at the end of the link cable. Further down the page, there's also a video without a sex toy in it if that's more your thing.

Simplified block diagram of the system being described.

Simplified block diagram of the system being described

This isn't a very Game-Jammy submission, if you ask me, but it does keep with the Game Jam Tradition of being a bit slapdash and poorly documented (but, hopefully, in an endearing way??). If you are at all interested, please leave questions or comments! If any part of the project does not make sense, the fault is entirely mine; please let me know which parts interest you and which parts I can try to clarify.

Part 1: Putting the ROM on a cartridge

The ROM hack is available here as a patch in .ips format. Use a patching tool like Lunar IPS to apply the patch to the ROM Pokemon Pinball (U) [C][!].gb with hash sha1: 9402014d14969432142abfde728c6f1a10ee4dac. To play this ROM hack on an actual Game Boy, I got a cheap repro cart from AliExpress (it was sold as Pokémon Battle Factory and had a Charizard on the cover) and overwrote it using a GBxCart RW v1.4 Pro. I had never done this before; I had this blog post by JinGen Lim to guide me on what to buy.

Part 2: Sending data from cartridge to microcontroller

That one-millisecond pulse of data being sent over the link cable won't drive your vibrator directly. First it has to be read by a microcontroller of some variety (well, you could do it with analog parts....but that's a different project entirely).

The downloadable .ino files are badly-documented example projects for a "normal" Arduino or for an ATtiny85 running ATTinyCore. Each project listens for an 8 kHz clock signal from the Game Boy and one byte of data, which it then uses to do some type of motor control.

Screenshot from a video of the Arduino peripheral

Here is a Twitter tweet showing the Arduino version in action. Sorry it is on Twitter, if I upload it to YouTube the site forces me to turn it into a Short and I think I hate that??

Here is a YouTube video of the ATtiny85 driving a 5V motor.


Wiring diagram showing link cable connections to Arduino for the sketch included in the project.

Wiring diagram showing link cable connections to Arduino for the sketch included in the project.

Wiring diagram showing link cable connections to ATtiny85 for the sketch included in the project.

Wiring diagram showing link cable connections to ATtiny85 for the sketch included in the project.

Part 3: Actuating a rumble device (or whatever) from the microcontroller

The microcontroller has received a byte from the cartridge, now what? It depends on the nature of the device you want to control. In the example Arduino sketch, no device is controlled, it just sends a message to the Serial Monitor with the details of the signal received. In the example ATtiny85 sketch, the microcontroller puts out a PWM signal to drive a high-side P-channel MOSFET switch. If I had a larger device to drive (like, say, a Hitachi Magic Wand), I'd need some different control circuitry. So, this part is still uncertain and open to suggestions!

You can maybe see in the video I made a custom PCB that the link cable plugs into. It's not very good, I think it would be a hindrance if I shared the design files here. If you want to make a PCB please talk to me directly, it is one of my favorite things to discuss <3

Download

Download
.ips patch file for game ROM 64 kB
Download
Arduino sketch for reading data off link cable 2.4 kB
Download
ATtiny85 (ATtinyCore Arduino) sketch for reading data off link cable 5.5 kB

Install instructions

The .ips file can be applied to a game ROM using a patching tool like Lunar IPS. Look for the ROM Pokemon Pinball (U) [C][!].gb with hash sha1: 9402014d14969432142abfde728c6f1a10ee4dac.

The .ino file marked "ATtiny85" is meant for an ATtiny85 running ATTinyCore.

The .ino file marked "Arduino" is meant for any of the more basic Arduinos, like the Nano and Uno.

Comments

Log in with itch.io to leave a comment.

This is so cool! I always skim past the communication section of the programming manual, nor do I know much of anything reguarding ROM hacking and patching. How did you isolate the vibrate signal? 

Thank you!! The documentation is pretty sad at the moment, but I'd love to talk about it! I do have a little info about the ROM hack in the readme here: https://github.com/heyspacebuck/pokepinball-romhack

Essentially: the game writes to registers 0xD803 and 0xD804 whenever a rumble needs to begin. I took the disassembled code from the Pokemon Reverse Engineering Team and, any time I saw writes to 0xD803/0xD804, I added two extra steps:

  1. load a byte of data into 0xFF01, the serial-port data register
  2. write 0x81 to 0xFF02; the serial-port control register

Writing 0x81 to the control register initiates the data transfer on the link cable, which takes about a millisecond. I don't know how to send more than one byte, yet x3 But this is sufficient for my peripheral for now! Lemme know if you have any other ideas that might be fun to set up, I'm excited to try making some ROMs from scratch soon!

Ah, I see! As for other ideas, it might be fun to explore inputting imformatiom from the outside world. I think there was already a GB fish finder of all things but what if things like temperature, sound and light sensors could dictate what happens in the game world?