A few years ago I built an Input Display for reading NES, SNES, etc... inputs from my console to put up on my stream. At the time, the only way to do this was using NintendoSpy by cylon13. I figured out what hardware I needed and built one myself, and I was pretty happy with the results.
After that, a lot of people had asked me about how to build it themselves, so I decided to put together a guide on how to do this. Controller Input Display How To v1.2 The guide itself might be a little out of date now, but I think it's still good for people to follow.
In the last year, I discovered another input display that uses the exact same hardware, called InputControl by Omnigamer. I found that this software seemed to be much more accurate as far as reading inputs than NintendoSpy had been. I looked into the firmware for this, and it was using SPI and interrupts to read the controller data instead of manually reading the bit input stream, as NintendoSpy had done.
So anyway, I was bored this morning so I decided to put together some better firmware for my controller input display. I started with the base InputControl Firmware, pared it down to the basics (removed logging and some other unneeded things), and added some additional functions so that it could support NintendoSpy as well. Here is the new Firmware.
The result is a firmware that works with NES and SNES controller inputs, and also works with both NintendoSpy and InputControl. These are set by using #defines in the firmware file and programming the Arduino. So far I've found that using the Auduino's SPI interface, this gives much better performance over the older NintendoSpy firmware.