Zerk Zone

Pages for the Creations of Ryan Armstrong

Sega Genesis Arcade Stick

Posted on February 15th, 2016 @ 10:25 am by Zerker

When I was working on the USB/SNES Arcade Stick, I had originally intended it to be compatible with both the SNES and the Sega Genesis. That was the main reason I used a DA15 port; it allowed me to provide separate pins for both consoles. However, the Arduino appeared to draw too much power from the Sega Genesis on the controller port, so that idea was shelved.

I still wanted a Custom Arcade stick for the Genesis, however, so a new project was born. Due to the problem with the Arduino, I would either need to find a new microprocessor that would function as intended OR… do the project without a microprocessor at all.

First some background. As many are aware, there are two models of the Sega Genesis controller: the classic 3 button controller, and the 6-button controller. The 6-button controller has a complicated detection scheme that essentially requires a microprocessor to detect. The 3-button controller however, is… a multiplexer and some pull-up resistors.
Genesis Circuit BackSega Genesis Front
Also refer to this reference for the exact pinout and button assignment.

So I decided to make one. My main purpose is for arcade-style action games, not fighting games, so 3-buttons is not a problem for me. Here are the parts I selected for this particular project:

Buttons, Port and Joystick are the same as the other Joystick. I drilled holes to mount everything, and inserted it accordingly. I wired up common ground lines connected to one end of each button and the signal wires connected to the other. The Joystick already had 4 signal wires and a ground wire, so each was connected to the corresponding screw terminal. All ground wires go to the same screw terminal, while the signal wires each connect to their own. With 8 signals (up, down, left, right, A, B, C, Start) plus ground, this uses up all 9 screw terminals on my setup.


From then it was just a matter of carefully referring to the pinout listed above compared to the data sheet for the multiplexer and deciding which input is connected to which port on the chip. The select line obviously needs to be connected to the select port as well, and every button/directional input, multiplexed or not, needs a pull-up resistor. The 9th resistor is connected to the select line so it defaults high when it is not used. This will ensure compatibility with the Sega Master System as well.


And here is the result. Feel free to comment if you have any questions or need any details. Because I used the same parts and essentially the same circuit, it is 100% compatible with all Sega Genesis games, compatible systems, or any USB converters.


Comments (2)

Filed under: Hardware |


  1. Hey, I’ve been working on a wireless controller adaptor using an ESP8266.

    I’ve got 2 linked by direct wifi (with auto connect/reconnect), and I’m reading the controller in (the “client” ESP) and sending this to the console ESP (server), and it’s very fast.

    I’m having big issues (mainly due to lack of skills) with “emulating” a 6 button controller on the console server end, I’ve contacted a few people with similar projects to see if anyone can help, but I’ve received no replies. I’m not looking for a handout, I’d like to learn how this stuff works too!

    My backup plan is to hack a real controller, and use the internal chip, but I feel this is cheating a bit, and I’d love to have the arduino driving the console!

    Would you be interested in putting our heads together and working this one out?

    Comment by Wazzo — March 8, 2018 @ 9:38 am

  2. The last time I tried emulating a 6-button joystick I found that an Arduino was drawing too much power from the Genesis controller port and the system wouldn’t boot. It’s possible I screwed something up, but you may need to find a lower-powered micro controller.

    As for the actual protocol, it shouldn’t be too hard to implement. Check out https://segaretro.org/Six_Button_Control_Pad_%28Mega_Drive%29 for more information. You’ll need to always have an idea in your microprocessor as to the state of every button in the controller (ABCXYZ, Start, Mode, and DPad directions). Then each loop, read the state of the select line to decide which values you need to report at a given time (e.g. UDLR + BC, or UP + A/Start for 3-buttons). Count the number of times it changes state, and per the linked web site, report the values of XYZ and Mode after enough transitions. Use an independent timer or count number of processing loops since the last transition change to decide when you should reset the change count back to zero.

    Good luck.

    Comment by Zerker — March 8, 2018 @ 4:36 pm

RSS feed for comments on this post. TrackBack URL

Leave a comment