Remember how the Nintendo GameBoy series lacked a reset button, but you could do a soft reset by holding B + A + Select + Start? Sadly, none of Nintendo’s home consoles had this feature, but it wasn’t really needed, provided that you had a physical reset button on the console itself. So I added this feature to my NES. Why?
I’m a really lazy person. I like to automate stuff as much as I can with my electronics skills to avoid unnecessary efforts. I have a wall-mounted TV, so one of my favorite things to do is lying down on my bed and play some classic NES games. I think that the American NES was designed with the couch potato in mind, since the controller cables are really really long, especially when compared to its Japanese counterpart.
I own lots of Famicom multicarts which I play on my NES with a converter. I’ve got some really good multicarts with a respectable number of unique games, saving me the hassle of repeatedly shuffling through cartridges when I want to play several games, all I need to do is push the Reset button and choose another game from the menu.
But wait, I have to get up from my comfortable position and go all the way to push the Reset button on the console, then back! That kind of negates the purpose of the multicart in the first place. There’s no easy way to return to the menu screen other than resetting the console. I’ve seen some mods where people physically extend their system’s reset button using wire and a toggle pushbutton, and also modified controllers with reset buttons on them. I don’t like any of these approaches because I like to preserve my system’s original aesthetics and also because I want a solution that works independently of the controller used. I was thinking how could I extend the reset function in a non-invasive way, when I recalled the GameBoy series using B + A + Select + Start as a soft reset sequence. Eureka! an idea was born.
Now it’s just a matter of implementing the idea electronically into the NES. The Nintendo Entertainment System uses a synchronous serial protocol to transfer information between the controllers and the system. Every television frame, the system reads out the state of each of the controller’s buttons in a sequential fashion, this data is broadcast over one wire, and two additional wires are used for synchronization between controller and console. Inside the NES, the decoding of the controller data is done inside the CPU.
The idea is to decode the serial data from the controller to extract the individual button presses corresponding to the A, B, Start and Select buttons, using that information to detect when they’ve been pressed together, and when that happens, send a reset signal to the console.
The “brain” of the NES controller is the 4021, which is a parallel in, serial out shift register IC. I’m using the 74HC595 serial in, parallel out shift register IC to decode the serial data from the 4021 back into individual button presses. Interfacing it is as simple as piggybacking the controller data lines directly from the NES motherboard. Here’s the pinout:
- Serial data
I soldered wires directly to these points to feed my 74HC595. On pins 4, 5, 6 and 7 of the ’595 you’ll find the status information for the Start, Select, B and A buttons respectively. These are active low, which means that you get a logic 1 if the button’s not pressed, and a logic 0 if the button’s pressed.
We want the console to reset when the A, B, Start and Select buttons are pressed simultaneously, so we must find a way to detect this condition. We need to detect when A AND B AND Select AND Start are pushed, therefore we need AND gates. I’m using a 74LS22 which is a dual 4-input NAND gate with open collector outputs. Since the button signals are active low, we have to invert them using a 7404 hex inverter IC to get a logic 1 when we press a button. We then take the inverted button signals and feed them into the inputs of the NAND gate. When all four buttons are pushed (1 1 1 1), the condition is satisfied and the NAND gate outputs a zero, otherwise it outputs a one. Why the inverted logic? Because the NES’ Reset line is active low, too. You can find the Reset signal on pin 9 of the lockout chip (also called CIC).
The idea is pretty simple: Decode the status from the A, B, Select and Start buttons from the controller’s data stream, invert them, NAND them together and use the resulting signal to drive the Reset line low when all four buttons have been pressed.
However, when I tested my contraption the NES got stuck in an infinite reset loop, just like if I held down the Reset button permanently. I eventually traced this to the fact that during a system reset, the NES stops updating the controller status and therefore the controller signals get frozen in their last known-good state, which in this case is B, A, Select and Start pressed. In other words, once the four buttons have been pressed and the reset line is driven low, the buttons are electrically “held down”, which in turn keeps the reset condition true, and since as long as reset is true the buttons will be frozen, it stays on reset indefinitely.
The simplest way to solve this is to generate a short pulse and use that to drive the reset line: the pulse must be long enough to reliably reset the system and short enough to allow the controller status to update and therefore break the infinite loop. I built a monostable timer with a period of about 100 milliseconds using the ubiquitous 555 timer IC. It might not be the most elegant or space-saving solution, but it works. If you can think of a better, simpler solution, leave a comment ;-).
After adding the monostable timer, success! I’m able to reset my NES remotely just like a GameBoy! Here’s the working schematic:
Here are some pictures of the testing and building process:
After making sure it works, I built the circuit on a small piece of stripboard. I barely managed to fit everything on it, hence my build quality leaves a lot to be desired. I could’ve designed a printed circuit board for it, but I didn’t want to bother for such a small project.
Even if the project turned out to be slightly more complicated than I initially thought, I’m still amazed about how simple it was to add remote reset functionality to my NES. Four simple chips, six wires, easy as installing a modchip, no drilling holes into your classic console, and best of all, I can finally lie down and play NES without having to get up just to push the Reset button to switch games! If you can build circuits from schematics, you can have it too!
Video of my Ultimate Couch Potato NES in action!