Another day off, another project.  This one is the 4Gen-USB.  It’s very similar to Raphael Assenat’s 4nes4snes, but for Sega Genesis/Megadrive controllers.  For this one, I’ve chosen to use an ATTiny84A (same micro as 5nes5snes-tiny) and add shift registers for the controller data.  This probably requires some explanation as to why, so I’ll step you through my thought processes:
- To get 4 controllers’ data, you need 6*4 (24) I/O plus a select pin, so 25 total.
- For USB, you need two more.  Now we’re up to 27.
- To keep ISP support, you need to leave the RESET pin alone.  That’s 28.
- The cheapest ATMega that has that much I/O is ATMega8515, which runs about $2.43 @ qty. 25 at Digi-key.
- ATTiny84A costs $0.87 @ qty. 25, but only has 12 I/O pins.
- 24 I/O pins can be handled with just 5 I/O (clock + latch + 3 data) with 3 shift registers
- Having built SNES controllers with 2 shift registers each, I know that they run about 30 cents apiece…
- $0.87 + $0.90 < $2.43… we have a winner!
(I may make an ATMega8515 version also, because the code won’t be much different, and it is easy enough to do…)

Now, admittedly, this board would look downright simple if I had used the ATMega8515.  It has 32 I/O, and I could have just routed all the pins directly.  No fun at all.  Plus it’d end up diagonal, because a 40-pin DIP part won’t fit in Seeed Studio’s 5x5cm limit.  Not ideal.  So I decided to go this route, which is maybe also not ideal, but oh well.  As you can see, the DB9 connectors for the Genesis controllers are solder-cup parts that will sit at the edge of the board.  This is useful, because they will also function as board standoffs, so it can be mounted in some little metal case without much worry of shorting anything.

I may also make this compatible with SMS/Mark III pads if I find an inexpensive enough way to get my hands on one to try, but I wouldn’t hold my breath ;)   I think C64 joysticks used a similar pinout as well, so with some work, they might also function with this adapter.