
Nintendo's idea of implementing support for NES, SNES and N64 games in their new console,
the Wii, is in my opinion one of their greatest ideas. As soon as I learned that
it would be possible to use Gamecube controllers to play those games, I started
thinking about designing an Snes/Nes controllers to Gamecube adapter which would
be compatible with the Wii.
Update!: Since the
Wii U and new Wii models are built
without gamecube ports, I have
created a
new project that works via the Wiimote, making it possible
to continue enjoying the classics with proper controllers.
As soon as I got access to a Wii (I still dont have mine), I started
testing my code which I had prepared in advance. I started by doing the NES and SNES
adapter. Later, since a friend kept insisting that I should also design a N64 to Gamecube/Wii
adapter, I implemented such an adapter.
Because of the complexity of the Gamecube's controller protocol, it's not possible to build a
simple conversion circuit without using programmable components. For this project,
I used an atmel Atmega8 microcontroller. Maybe it's a little overkill, but using this
chip allowed me to use my
Multiuse tiny 1 PCB.
Given the small size of this circuit, it's possible to fit it inside an original controller.
Here are a few example of what can be done with this circuit:
(for more pictures, visit the
pictures section)
Up
SNES Buttons
SNES mode
|
| SNES | Gamecube |
| Start | Start |
| Select | Z |
| DPAD | DPAD |
| Y,X,B,A,L,R | Y,X,B,A,L,R |
| L+R+Select+left | Cstick to the right |
|
NES mode 1
|
| SNES | Gamecube |
| Start | Start |
| Select | Z |
| DPAD | DPAD |
| Y,B | B,A |
| Y+B+Select+left | Cstick to the right |
| Y+B+Select+up | L+R |
|
NES mode 2
|
| SNES | Gamecube |
| Start | Start |
| Select | Z |
| DPAD | DPAD |
| Y,B | A,B |
| Y+B+Select+left | Cstick to the right |
| Y+B+Select+up | L+R |
Enabling a mapping:
- SNES mode: Default mapping.
- NES mode 1: Hold START at power up.
- NES mode 2: Hold START, Y and B at power up.
Up
NES Buttons
|
NES mode 1
|
| SNES | Gamecube |
| Start | Start |
| Select | Z |
| DPAD | DPAD |
| A,B | A,B |
| A+B+Select+left | Cstick to the right |
| A+B+Select+up | L+R |
|
NES mode 2
|
| SNES | Gamecube |
| Start | Start |
| Select | Z |
| DPAD | DPAD |
| A,B | B,A |
| A+B+Select+left | Cstick to the right |
| A+B+Select+up | L+R |
Enabling a mapping:
- NES mode 1: Default mode.
- NES mode 2: Hold A and B down when connecting the adapter.
Up
N64 Buttons
N64 version:
The adapter supports many different mappings, which are appropriate for a wide
range of Wii virtual console and Gamecube games. Here's a file containing a
table of the different mappings supported:
n64_mapping_table1.4.pdf
Up
Schematic
Here is a picture of the schematic. Click for bigger version:
| Nes/Snes version: | N64 version: |
 |
 |
Comments and explainations:
The microcontroller is powered with 5 volts for three reasons:
- Snes and Nes controllers work at 5 volts. This means that
it's better to use 5 volts for a logic 1 when driving the controller's
CLock and Latch pins. (As I dont have the official controller specifications,
I cannot know for sure what is the voltage threshold for a logic 1.
- The data signal from the controller is at 5 volts when high. To prevent
exposing the microcontroller input to voltages higher than it's own, it
would have been necessary to use a voltage divider which would have required
two additional resistors.
- If I had powered the MCU with only 3.3 volts, I would have had to use
an ATmega8L which cannot run at clock rates above 8 mhz.
On the gamecube side, the data signal is held at 3.43 volts via a pullup resistor
inside the Gamecube. When someone (gamecube or controller) wishes to set the signal
to 0, it just has to pull the signal to ground. Otherwise, it just leave-it as-is.
I acheive this by playing with the Atmega8 pin direction. To send a 0, I configure
it as output-low. Otherwise, I configure it as input-no_pullup. Activating the
internal pullup or sending a 1 in output mode must not be done since this would
put 5 volts on the data line. Who knows if this could damage the console port? (In fact,
I have a cheap wireless controller which drives the bus with 5 volts! Nothing seems
to have been damaged though...)
The N64 version uses the same technique to control the controller's data line. The only
difference is that we have to provide the 3.43 volts pullup resistor. (From the controller's
point of view, we're the console!)
FAQ:
Q: Why did'nt you use the Wiimote accessory connector instead of doing a Gamecube adapter?
A: I considered it, but I decided that using the Gamecube ports was better. Here
are a few reasons:
- NES and SNES controllers use 5 volts. If I remember correctly,
there is no 5 volts in the Wiimote connector. This means that I would
need to build a step-up switching voltage regulator. Higher cost,
Higher complexity.
- NES and SNES controllers were designed to be wired controllers. This
means that they probably did not have low power consumption in mind
when the designed it. But I did not take the time to very that because
of point #1
- The Connector is proprietary. Gamecube connectors are too, but they
can be easily obtained from extension cables, which are cheap and easy
to find. At the time, I failed to find wiimote extension cables
- NES/SNES (and other consoles) emulators on Wii are (or were, I have
not checked recently) in fact Gamecube based. Since Gamecube games
only support Gamecube accessory, implementing the adapter via the
Wiimote would be useless.
- I'm not a big fan of wireless things. Besides, the NES/SNES
controller cables never bothered me.
Up
Printed circuit board (PCB)
As I said in the overview, I used my
Multiuse tiny1 PCB. Refer to the Multiuse
tiny1 page for more information. If you dont feel like building it yourself, I sell
fully assembled PCBs with the MCU pre-programmed in my
online shop.
Here are pictures and wiring diagrams:
When using the Multiuse tiny1 PCB for this project, only the
following components are needed. Suggested
Digikey
part numbers are included:
| Reference | Description | Comments | Digikey part # |
| C1 | 10uf capacitor | 1uf is enough too. And smaller
value capacitors are slimmer. | 490-1835-1-ND |
| C2,C3 | 18pf capacitor | Change as appropriate
for crystal. | 311-1102-1-ND |
| Y1 | 16mhz crystal | Suggested part number is for
a surface mount crystal. Can be easily
soldered on the thru-hole footprint. |
644-1037-1-ND |
| R3,R5,R6 | 0 ohms resistor | You can do a solder
bridge instead. | N/A |
| U2 | Atmega8 microcontroller |
It is important that you use the family supporting a 16 mhz speed.
The Atmega8L-* family does not go above 8mhz. |
ATMEGA8-16AU-ND |
Up
Firmware
The atmega88 (or atmega8 for older releases) must be programmed with one of these firmwares:
| Controller type | Version | File | Target MCU | Comments |
| Nes/Snes | 1.3 | snes2wii-1.3.hex | Atmega8 |
Changes in this version:
- Added a feature to swap the NES A and B buttons. Hold A and B at power up to use it.
|
| Nintendo 64 | 1.6 | n64_to_wii-1.6.hex | Atmega88 |
- First release for Atmega88 (replaces discontinued Atmega8)
- Support for the Rumble Pack (since 1.5)
|
| Nes/Snes | 1.1 | snes2wii-1.1.hex | Atmega8 |
Changes in this version:
- NES mode can be forced on by holding the Start button at power-up. Without
this, in my opinion, NES games are almost unplayable with an SNES controller.
- Implemented button combinations which can affect how unaccessible
Gamecube buttons and sticks are reported. eg: Sending L+R pressed with
a NES controller, and sending "CStick towards the right". Mostly useful to
summon some emulator's menu while playing.
- Implemented new Gamecube commands for better compatibility, eg: GCLinux.
|
| Nes and Snes | 1.0 | snes2wii-1.0.hex | Atmega8 |
This was the first version. Nes or Snes mode selected with jumper. |
| Nintendo 64 | 1.4 | n64_to_wii-1.4.hex | Atmega8 |
New in this version:
- Added 4 new button mappings, accessible by holding a C button for each
mapping. These are reported to be useful for Super Smash bros Melee and Brawl.
- Created a single page PDF documenting the supported mappings
.
|
| Nintendo 64 | 1.3 | n64_to_wii-1.3.hex | Atmega8 |
New in this version:
- It is now possible to disable the feature where the L and Z buttons are swapped by holding
the 'L' button down when plugging the adapter in the console.
- If the R button is held down when plugging the adapter into the console, the N64 C-left and C-right buttons are mapped
to the Gamecube Y and X buttons. This makes it possible to play the virtual console game Sin and Punishment.
- The joystick sensitivity can be increased by holding the Dpad right button when plugging the adapter into the console.
- The joystick sensitivity can be decreased by holding the Dpad left button when plugging the adapter into the console.
|
| Nintendo 64 | 1.2 | n64_to_wii-1.2.hex | Atmega8 |
Version 1.1 for N64 had a reliability bug which caused some controllers to randomly reset and
recalibrate during play. This is fixed in version 1.2. It is recommended that you upgrade even
if version 1.1 is working for you.
|
For this project, the appropriate fuse values are:
- ATMEGA88 builds: high byte = 0xd9, low byte = 0xdf, extended byte = 0x07
- ATMEGA8 builds: high byte = 0xc9, low byte = 0x9f
For details about how to program an AVR,
visit my
AVR programming page.
Up
Source code
For those who are interested, here is the source code. It is released
under the
GPL license:
Nes and Snes version 1.3:
snes2wii-1.3.tar.gz
Nes and Snes version 1.1:
snes2wii-1.1.tar.gz
Nes and Snes version 1.0:
snes2wii-1.0.tar.gz
Nintendo 64 version 1.2:
n64_to_wii-1.2.tar.gz
Nintendo 64 version 1.3:
n64_to_wii-1.3.tar.gz
Nintendo 64 version 1.4:
n64_to_wii-1.4.tar.gz
Nintendo 64 version 1.6:
n64_to_wii-1.6.tar.gz
I coded the project in avr-as (gnu) assembler. A makefile is
included. Why I used assembly language? Mostly for speed and timing control. The
smallest time unit in the gamecube controller protocol is of 1us, which
corresponds to only 16 cpu cycles at 16 mhz. Not much time to waste at that speed.
Because I used assembly, many optimisations tricks were possible.
Up
Pictures
Converting a
NES controller: (Beware: Clone controllers use different colors)
Converting an
SNES controller: (Beware: Clone controllers use different colors)
Nintendo 64 version:
Pictures taken during the development and debugging:
Pictures taken during tests, when it was finally working:
The prototype:
Up
User pictures
I like to see how others build my projects. It also makes good assembly examples.
Please send me your pictures and I'll add them here.
Andrew Jalics has posted pictures of the NES to Wii box he build using my PCB on his
web site.:
Declan Williams, from Autralia, built the Nes/Snes and N64 versions. He used pre-programmed
chips from my store and created his own PCBs. He also built his own SNES style connector (
details visible on his
4nes4snes pictures):
June 5, 2009:
Andrew Kay sent me the following pictures of the adapter he has built:
Up
Links
This document clearly explains the low level communication of the gamecube controllers:
Nintendo Gamecube Controller Protocol
This document contains a section (#9) with information on the
bit significations of the controller replies to various commands:
Yet Another Gamecube Documentation
This page contains documentation about the snes controller 'protocol':
Sci.Electronics FAQ: Super Nintendo Entertainment System: pinouts & protocol
Up
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 :)
Up