Famicom controller to NES adapter

Why do that?

Why? Simply to use famicom (the Japanese NES) controllers that were unfortunately not sold here. It's not fair that we did not get the chance to enjoy or hate additional options.

Here are two pictures of Japanese controller. The Hudson pad (left) and the Joyball (right)






Wiring

An adapter is easily built by wiring a DB15 Male connector to a cable salvaged from a NES controller. Note that the color below is that of the standard NES controllers. Third party controller may use a different code.


DB15 pinNES colorFunction
1 Brown GND
12 Orange Latch
13 Yellow Data
14 Red Clock
15 White +5 volt


Wiring

Wiring

Wiring

Wiring

Wiring

Wiring

Result

Result



This adapter works perfectly with the Hudson Pad, and most like does with several other controller models.

However, it does not work well with the Joyball. Details in below.


Joyball problems

The symptom was that only the A button and Right direction seemed to work. Very interesting since those correspond to the first (A) and last (Right) bits that are transmitted. Indeed, the transmission order is the following: A,B,Select,Start,Up,Down,Left,Right.

By looking at the signals with an oscilloscope, I noticed the DATA line would behave strangely. For instance, when A was being held, B would then work, and if B was also held down, Select would then work, and so on.

So I thought this was probably a problem with the clock signal, as if a part of the Joyball had trouble following. As if the timing was violated. I looked inside the controller and there was a single IC, but not the usual 4021 shift register. I think they probably made a custom chip to also implement the turbo feature. I failed to find information on the chip (M60001-0103p with a Mitsubishi logo) so I cannot say if the timing is appropriate or not.

At this point, had I had a Famicom console available, I would have compared the timings. But I don't have a Famicom so I decided to experiment and programmed an AVR microcontroller to stretch the clock pulses transmitted by the NES from 0.5μs to 2μs. I wired the circuit between the NES and the controller.

Success! I turned on the NES and with the 2μs clock pulses, everything was working well. Well almost, since it did not take long for me to understand why a Japanese had told me the Joyball sucked and that if you had it as a kid, friends might have made fun of you! For after winning against the controller imcompatiblity with the NES, I became a looser at Burgertime… All this work only to discover it wasn't worth it! Ok, you may make fun of me now ;)

Top trace: Signal from the NES.<br>Bottom trace: Signal from my MCU.

Top trace: Signal from the NES.
Bottom trace: Signal from my MCU.

Testing

Testing



For reference, here is the simple code I used to stretch the clock.
1 #include 
2 #include 
3 
4 int main(void)
5 {
6     // In: PORTB5
7     // PORTB all pullup
8     DDRB = 0x00;
9     PORTB = 0xFF;
10 
11     // Out: PORTC, ANY
12     DDRC = 0xFF;
13     PORTC = 0x00;
14 
15     // PORTD unused, input + pull
16     PORTD = 0xFF;
17     DDRD = 0x00;
18 
19     while(1)
20     {
21         // Wait for falling edge
22         while (PINB & (1<<PINB5));
23 
24         PORTC = 0x00;
25         _delay_us(2);
26         PORTC = 0xff;
27     }
28 }



References

The following documents were useful:


Disclaimer

I cannot be held responsible for any damages that could occur to you or your equipment while following the procedures present on this page. Also, I GIVE ABSOLUTELY NO WARRANTY on the correctness and usability of the informations on this page. Please note, however, that the procedures above have worked in my case without any damages or problems.

Now you cannot say that I did not warn you :)