Sega Saturn Controller to DB-15 Adapter. Microcontroller Based Demultiplexer, Discrete Output

A little over a year ago I posted this topic where I was troubleshooting a Saturn controller demuxer schematic that I found on another forum. While it worked with official Saturn pads, I could not get it to interface properly with my MC Cthulhu. With some help I ended up solving the problem and posting an updated schematic which you can see in that thread. I had hoped to design a Supergun utilizing that controller demuxer which I could use to play my CPS2 PCBs, but the problem that still remained with the design was it’s high parts cost due to being made from all discrete logic. Lots of chips = high BOM for such a simple function so streamlining had to be done. I had hoped to revisit it sooner, but life got in the way and that never really came to fruition.

Yesterday however, I got a wild hair to tinker with an online Arduino simulator, and the first idea that came to mind was to try writing a sketch that would perform the same demultiplexing logic that all of those discrete chips in the other design were being used for. In about an hour I had something vaguely functional so I transitioned to working on a real Arduino in my workshop. Several hours of debugging later I have a seemingly functional piece of hardware here that should be able to perform the same task with a single atmega328p chip instead of 7 discrete ICs and a mile of wire.

I would consider this in to be alpha status currently. I know that both official Saturn pads and MC Cthulhu boards work properly, monitored inputs and outputs on my scope, and everything looks good. The only thing I haven’t done yet is wire the test board to a jamma harness and test for latency on real hardware. I’ll probably hold off on that until after Christmas.

Here is a link to the Github repository for this project. Feel free to play with this, it was written for an Arduino uno or other compatible boards… I plan to make a dedicated pcb for this. Probably as a db15 adapter to start with, and we’ll see what else I want to do after that. Unlike last time, I think I’ll actually have the time to see this simple project through to the end.


It looks great. I am really interested in this. I was looking to build something like this on my own before I found your prototype board on osh park.

How are you sourcing the female Saturn controller connectors?

I source the connectors from controller extension cables like this. It’s not an ideal solution, but I can’t find anything better that’s in current production.

As far as the prototype boards on Oshpark, I have unshared the original v0.1 board. It has an error with one of the vias for the crystal coming into contact with a nearby trace. Don’t know how I missed that. I have a working version of the v0.1 board on the workbench that I had to cut traces and bodge some wires to get working. The current shared version is V0.4 and should be functional at this point. I have not ordered it yet because I need to do a little more work adding some pads for ISP programming the microcontroller, and I need to fix the pin pitch of the Saturn connector pads. They are slightly too close together so the connector alignment isn’t perfect.

The next version of the board that I release will in all likelihood be completely good to go.

Here’s a pic of the currently working, but sort of hacked together v0.1 board.

1 Like

I ordered the boards and come extension cables and I am going to give them a shot. I picked up a cheap programmer and I am going to try and figure it all out. Thanks for your work man.

Did you order the v0.4 board? If so there are a few things to keep in mind when you build them.

If you plan to program the chip once installed on the board, you will need to solder a wire to pin 29 of the Atmega328p for reset because as of that revision I did not provide a pad for reset on the board. the other ISP pins can be found on the db15 connector. MISO, MOSI and SCK are on DB15 pins 2, 10, and 11 respectively. Also the current version of the code on Github needs to be updated to reflect the new pin assignments the current PCB. I’ll definitely have that done before you get your boards from Oshpark.

Looking forward to hearing your feedback once you’ve got one put together.

I will keep you posted as things come in. I am in Canada so it takes a while.

Did you leave some of the db15 pins unconnected or can you reprogram for every pin? I used pin 2, 9 and 10 for the extra 3 buttons in 6 button games. Would it be possible for me to drop those assignments into the code?

Not sure if this applies but a member from, RGB, makes DB15 to Saturn adapters. Wasn’t sure if you’re aware, maybe you guys can share info. His supergun has the ability of reprogramming buttons and turbo. So does his DB15 pass-through for Neo, this makes it super easy to swap B and C for some games for me, like Karnov’s.


1 Like

I use the same pinout as Undamned for his usb decoder.

All of the outputs can be remapped in the code by changing which pin they are defined to. As of the current board revisions I do not have pin 3 or 9 wired to anything because the only other buttons available for them on the Saturn pad are L and R which I didn’t think would be of much use. If people are using 3 and 9 in some DB15 pinouts, I could definitely wire them in a future board.

I’m planning on adding on the fly button remapping to the code at some point, but I haven’t quite settled on how to approach it yet.

I’m aware of his adapter. I wanted to make something that was open source that anyone could build themselves.

1 Like

I did on my board but I am not sure what others are doing. I guess my thought was to make sure all 15 pins are connected so that can be mapped if people choose to.

I see, I’ll add those to my next board revision. I had thought that most people were using a pinout similar to what undamned uses, so I didn’t think they’d be necessary. If you’re not opposed to bodging a couple of extra wires on the board you could connect pins 1 and 32 from the ATMEGA328P to pads 3 and 9 on the db15 connector.

I am new to this stuff so I looked for a standard pin out and couldn’t find it. I can do those bodges when it arrives for sure.

It has been a while since I asked you about this but i finally got my boards, adapters and programmer. I picked up an usbasp but I haven’t been able to get the code to load properly. As I said before I am pretty new to this. I was able to load it using a hex from avrdude but it would not work. The L button on the Saturn controller sometimes works. I don’t have much knowledge about how to troubleshoot this.

I also looked at your code but I didn’t understand the button assignments because they look incorrect when compared to the standard neo geo pinout. I am not using an MC Chthulu but just a straigt neo geo modded arcade stick. I was also reading that there should probably be a .1uf filter cap on the 5v for the avr.

Here is a picture of the v.6 adapters. Any help would be much appreciated.

Sorry, this project has been on the backburner lately so I haven’t updated the code for the newer versions of the board. Some of the pins have been rearranged as of the v.4 pcb and newer. I’ll try to get it updated today, but I can’t make any promises.

If you want you can try changing the pin assignments yourself. If you tone out each pin with a multimeter and compare them with the Saturn controller pinout and the NEOGEO controller pinout it should be pretty easy to get working.

Sounds good I will give it a shot. So the pin assignment numbers correspond with the avr and not the controller right?

The pin assignments correspond with the Arduino specific pinout for the Atmega328p.
This image should help.

Perfect. I will give it a shot.

I tried but failed. I know what pins lead to what controller ports but I am not sure how to alter the code to make it work. Do i need to change more than the first section of code with the pin assignments?

Well it’s been quite a while since I checked in here, but I finally did get around to updating the code for the v0.6 PCB. It’s on my github now. This code has been tested and confirmed fully functional on a v0.6 PCB so you should be able to load it up with no problems.

Sorry it took so long.

1 Like

This looks like an interesting project as I am taking baby steps into consolizing a MVS. I’ve looked into a SNES decoder via a Arduino Mini, and this project should work as well right?

I do have an SNES version of the code for this board on my github. This code should work on an arduino mini also. The SNES code does have a bug with simultanious button presses that I haven’t figured out a solution for yet. It only affects 6 button controls though, so you should be fine for NEO GEO use.