Gamecube controller to N64 adapter


A common problem with the N64 controllers is the joystick. It wears down and become unusable. However Gamecube controllers don't seem to wear down much and are quite similar to the N64 controllers.

So I've been asked many times if I could design an adapter for using Gamecube controllers on a N64 system. This project is the result.

  • Official wired Gamecube controllers supported (includes the white Japanese controller with extra long cable).
  • Nintendo Wavebird and Intec wireless controllers supported.
  • Should work with any device equivalent.
  • Programmable button mappings to improve gameplay.
  • Low latency polling algorithm (approx. 5ms, less than one frame).
  • Upgradeable firmware
  • LED or Buzzer output for programming feedback.

Partly assembled or complete adapters are available in the store!
Circuit only, assembled and programmed. (Solder your own wires)
Complete adapter (ready to play!)


Here are a few pictures. Send me yours and I'll add them here!
N64 and GC controller

N64 and GC controller



Version 2

Version 2

Version 2 (LED on)

Version 2 (LED on)

Button mapping

In order to improve gameplay, or sometimes simply make it possible, I wrote the firmware to make it possible to define new mappings without too much difficulty (i.e. No changes to the source code). This is done with mapping codes. Due to the high number of possibilities, codes tend to get long quickly. Therefore, four custom mappings can be saved and recalled using the D-pad directions.

Use the tool below to map Gamecube buttons, axis or states to different actions on the N64 side. Do your selection(s) and click "Generate" to output the mapping code. Enter it using the instructions given on the right.

Button or Gamecube stateN64 Action
[0] A
[1] B
[2] Z
[3] Start
[4] L
[5] R
[6] C-stick up (50% threshold)
[7] C-stick down (50% threshold)
[8] C-stick left (50% threshold)
[9] C-stick right (50% threshold)
[10] Dpad-up
[11] Dpad-down
[12] Dpad-left
[13] Dpad-right
[14] Joystick left-right axis
[15] Joystick up-down axis
[16] X
[17] Y
[18] Joystick up (50% threshold)
[19] Joystick down (50% threshold)
[20] Joystick left (50% threshold)
[21] Joystick right (50% threshold)
[22] Analogic L slider (50% threshold)
[23] Analogic R slider (50% threshold)
[24] C-stick left-right axis
[25] C-stick up-down axis
[26] None
[27] Joystick left-right axis (inverted) - v2.3 or newer
[28] Joystick up-down axis (inverted) - v2.3 or newer
[29] C-Stick left-right axis (inverted) - v2.3 or newer
[30] C-Stick up-down axis (inverted) - v2.3 or newer

Mapping code:

Entering a mapping code

1) Place the adapter in mapping management mode.
Activating this mode:
  • During use: Hold the 'start' button down for approximately 8 seconds. Release after hearing a quick succession of 5 beeps coming from the adapter.
  • At startup: Hold the 'start' button when the adapter powers up. (I.e. Press and hold 'start', turn-on the N64 or connect the adapter, release after the 5 beeps.
2) Enter the code
In mapping management mode, simply press the buttons corresponding to the code. After each group ending by an 'L', the adpater will confirm with a single beep.

At the end, when the 'start' button will have been pressed, the adapter will emit 3 beeps to confirm the new mapping becoming active and will return to game mode.

Saving and recalling favorite mappings

1) Place the adapter in mapping management mode.
By holding the start button, as described above.

2A) Saving the current mapping
In mapping management mode, first press R. Then, press one of the D-pad directions. Each "direction" can hold a mapping of your choice. After a few seconds, the adapter will emit 3 beeps to confirm the new mapping is active and will return to game mode.

2B) Loading a mapping
Upon entering mapping management mode, press the D-pad direction associated with the mapping you wish to load. The adapter will the emit 3 consecutive beeps to confirm the new mapping is active and will return to game mode.

2C) Loading the default (built-in) standard 1:1 mapping
Upon entering configuration mode, firs press R, then press START.

3) Toggling the dead-zone feature (since version 1.3)
Starting with version 1.3, the adapter can generate a deadzone. This is required for some gamecube controllers that do not always recenter exactly at 0,0. To do this, enter mapping management mode and press R followed by Z. Wait a few moments for the final beeps. The setting is a global setting stored in the adapter.

4) Set a stored mapping to be active by default (since version 1.5)
In mapping management mode, first press R. Then press L. Then press the D-pad direction corresponding to the mapping you want to be active at power up. To restore the default behaviour (i.e. Standard 1:1 mapping), press START instead of a D-pad direction.

5) Cycling through joystick value conversion modes (since version 2.0)
It is possible to cycle through different types of conversions, in this order:
  1. V2.0 style (default)
  2. Extended mode (V2.1 only, very sensitive)
  3. Old v1.5 style (less sensistive diagonals).
To swich to the next mode, enter configuration mode and press R, followed by B. Wait a few moments and the adapter will confirm the change by blinking twice and returning to game mode. For more information on those modes, have a look at the stick translation section.

6) Reset adapter to factory defaults (since version 2.0)
To erase all stored mappings and restore all settings to their defaut (eg: Dead-zone), enter configuration mode, then press R, followed by X. Wait a few moments and the adapter will confirm the change by blinking twice and returning to game mode.

7) Toggle the built-in controller pak (memory card) (since version 2.3)
To disable (if currently enabled) or enable (if currently disabled) the built-in controller pak, enter configuration mode, then press R, followed by Y. Wait a few moments and the adapter will confirm the change by blinking twice and returning to game mode.


At any moment, it an error occurs (Attempt to load a mapping from a free D-pad direction, error while entering the code, etc), the adapter will produce 4 beeps (one long, 3 short) and will return to game mode.

  • Prior to version 1.3.1, when mapping the main joystick to buttons, the up[18]/down[19] and left[20]/right[21] directions are inverted.
  • Prior to version 1.3.1, there is a bug when entering a new mapping code where the unchanged parts of the previously active mapping remained in effect. The workaround is to disconnect/reconnect the adapter before entering a new mapping. (Note that saving and loading mappings always worked fine)
  • Prior to version 1.2.2, the L/R analog sliders would control the N64 L and R buttons even when set to "[20] None" above. (But they worked as expected when assigned differently). To disable the L/R sliders, use the BBXZBBAL ZBBAL START code. To combine with your custom mapping, simply insert BBXZBBAL ZBBAL before START.

Menu flowchart

The following flowchart provides a good overview of the configuration/mapping management mode described in the above section.
v2.2 menu flowchart

v2.2 menu flowchart

Mapping collection

Here is a table which I hope will become big. Don't hesitate to contact me to share the mappings which you think are useful. If possible, please include details about the games your need the mapping for and comments about your mapping decision.

R START Generic Basic mapping. Buttons of the same name are equivalent.
XZBBL BAAZXL ZXL START Mario Kart 64 Z for drifting, items X or Y. I think using Z for drifting feels better than the 'R' slider (Z needs less finger motion to activate).
BAAZBXL ZXAL START Starwars - Shadow of the empire Y and X buttons mapped to C-Up and C-Left. Use to throw the harpoon (easier than reaching for the C-stick)
[...] BBXZBBAL ZBBAL START * For version 1.2.1 (and older). Unmap the L and R analog sliders for real. (They were still mapped to N64 digital L and R when set to "[20] None" above. If you have a custom mapping, simply insert the BBXZBBAL and ZBBAL words before your final START button press.
XZBBL BBZXL ZBAAL ZBABL ZBAXL ZBAYL YXZBBAL ZBBAL BAXZBXL ZBYL ZXAL ZXBL BXAZYXL ZYYL START Goldeneye 007 N64 In the game set control style to 1.2 Solitaire. Now you are able to play Goldeneye with a Halo/Call of Duty controller style.
BAZXAL ZXBL BYZBBAL ZBBAL ZBBAL BAAZBYL ZXL BBXZXAL ZXBL start Earthworm Jim 3D Camera control with L/R, weapons on X/Y
XZBBL BAZXL ZXL XXZBAL BAAZBXL ZXAL START Super Smash Bros. 64 This code maps X and Y to jump, Z to grab, R and L to shield, and up on the Dpad to taunt (matches melee/brawl/smash4 gc controller mappings)
XZBBL BAZBBL BXZAL ZAL ZAL ZAL ZBAL ZBAL ZBAL ZBAL BAAZBYL BAAZBYL ZBYL BBXZXLZXL START Super Smash Bros 64 I tried to replicate future Super Smash Bros control mapping while improving upon them and adding features similar to them.
  • L short press and R short press uses shield then when you press either of them fully in you can grab your opponent.
  • Y and X Are used for jumping.
  • A is hit and B is special.
  • C stick any direction is A which is hit since there's no way to do two buttons at once which was featured in all future Super Smash Bros games but not this one because this game never featured second stick controls.
  • Z is Grab.
(Submitted by Benjamin Wilkinson)
  • Y/X is Jump
  • C-Stick will perform Smash Attacks and Aerials
  • Z is grab
  • R/L is Shield (Shield will engage on half press like Melee)
  • Dpad-Up is taunt
(Submitted by Tyler)
BZAL ZBXL BAZXL BXZBL ZBL ZBL XXZBAAL ZBABL ZBAXL ZBAYL BAAZBYL ZXALZBAAL ZBABL ZBAXL ZBAYLZXL ZBBL START Lylat Wars I built this configuration so the controls aren't difficult to use or are hard to remember.
  • C stick has inverted left right controls.
  • Y is boost, X is slow
  • B & A are shoot
  • Z is FPS mode
  • The d pad uses the bomb no matter what direction you press you can press it up down left or right.
  • L and R triggers only require a short press down and not a full press down and it feels quite good in my opinion. Much quicker than the default settings to do what the game calls a barrel roll.
(Submitted by Benjamin Wilkinson)
XZBBL BAZXL ZXL XXZBAAL ZBABL ZBAXL ZBAYL BAAZAL ZXL BBXZXL ZXL START Super Mario 64 I designed this for all situations in Super Mario 64.Mario can croutch with a short press of either trigger.Z is close up or far away camera. C stick is used to adjust camera angle.A & X are jumping.B is hitting and Y is also crouching and is good for long jumping.The d pad can be used like the stick and can be used for even more sneaky slow walking.
(Submitted by Benjamin Wilkinson)
BZBYL ZXBL BAZXL BXZB BAL ZBBAL ZBBAL ZBBAL ZBAAL ZBABL ZBAXL ZBAYL BAAZBXL ZBL ZBAAL ZBABL ZBAXL ZBAYL ZXL ZBBL START F Zero X You'll have to put in the adapter first then input the code.Press the reset button on the N64 so it recognises the controller when it restarts. I gave it controls very similar to F Zero GX.
  • Short Press L lean right
  • Short Press R lean right
  • Z camera distance
  • X behind camera
  • Y boost
  • D pad can be used as a stick for people who prefer the d pad
(Submitted by Benjamin Wilkinson)
  • Short Press R to drift
  • Short Press L to use Item
  • Y & X are item
  • C stick up and right is music on/off
  • C stick left and down are speed,metre,map and postion.
  • Z is camera distance
  • D pad works as a second stick for people who prefer the d pad
(Submitted by Benjamin Wilkinson)
  • Short Press L drift
  • Short Press R drift
  • A forward
  • B brake
  • Y & X item
  • Z camera distance
  • C stick any direction left right up down speed/metre/map
  • D pad works as a stick for people who prefer the D Pad
(Submitted by Benjamin Wilkinson)
XZXAL BAZXL BYZBXL ZXL ZXL ZBXL ZBYL ZXAL ZXBL BAAZBYL ZXBL ZBAAL ZBABL ZBAXL ZBAYL ZBBL ZXL START Ocarina of Time I had an idea to combine the shield and target functions into the shoulder buttons since they both hold two buttons each and can be useful in many situations in Ocarina of Time. I gave many options to choose what way you want to bring up an item.
  • L short press shield
  • L long press z target
  • R short press z target
  • R long press shield
  • A is roll
  • B is sword swipe
  • C stick left and right is z target
  • C stick up/down is first person mode.
  • Z is left item I use the slingshot
  • Y is right item I use deku nut
  • X is bottom item I use bomb
  • D pad is also used to choose items or first person mode so see what suits you.
(Submitted by Benjamin Wilkinson)

Using memory cards

I am asked once in a while how one can use a memory card with this adapter to save your game. Well you can just install the memory card in a spare controller which you connect to another port.

While this works well for many games, for instance with Turok 2 : Seeds of evil, there are complications with others, such as Mario Kart 64 which wants the memory card in port 1. The adapter must then be connected to port 2, but the game does not let you play alone with controller 2 (the adapter). However Mario Kart 64 only uses the memory card only for ghost data in time trial, and I think this is a loss one can probably live with.

Anyway, for a lot of good games with memory built into the cartridge, this is of course a non-issue.


First of all, here is the schematic:

Selecting the MCU
I decided I would use an Atmel MCU, if possible the Atmega8 (or the new Atmega8a). Why?

  • First of all, I have a lot of experience with the AVR architecture.
  • Next, I'm able to use code from my other projects such as the N64 and Gamecube to USB adapters. Especially the assembler communication code. Using a different MCU architecture would mean a rewrite.
  • Finally, since I use a lot of Atmega8 in my project, I save by buying greater quantities.
Power supply strategy
I think using power from the N64 controller port is the most convenient solution. Unfortunately, only 3.3 volt is available on the N64 ports and the Gamecube controllers expect 5 volt AND 3.3 volt. Also, using an Atmega8 at 16mhz requires 4 volt.

It was therefore necessary to obtain 5 volt from the N64 3.3 volt source. I decided to do it with a charge pump, the LTC3200ES6-5 from Linear Technology because of its small size, low external component count, and regulated output. (It does not simply 'double' the voltage unlike some others).

The LTC3200ES6-5 is probably difficult to use if not mounted on a PCB. An alternative that would probably be suitable is the VBSD1-S3.3-S5-SIP module from Cui. The datasheet recommends a 4.7uF low ESR capacitor at the input and a miminum 20mA load is specified. I would recommend installing a 220ohm resistor load to make sure. Read the datasheet for details.

You are also free to use an external 5 volt power source instead. For instance, this could be a regulated 5v wall-wart or USB port.

About the "rumble" fonction
At the moment, it is not supported. My reasoning for not supporting it is the following: When Nintendo decided to start selling the 'rumble pack', it did not use the 3.3 volt from the Console. It used it's own batteries. The leads me to think that the current a N64 can supply is limited and probably too low for reliable operation if driving motors.

Of course, the power requirements of a N64 'rumble pack' may be different from the requirements of a Gamecube controller motor. I will look closely into this later by taking measurements and looking at the N64 internal circuitry (Fuses? etc).

So for the moment, I did not bother to write the code needed to forward the motor control requests because my adapter uses the N64 ports 3.3 volt supply. But if you use an external power source or a wiresless controller supporting rumble, I don't see a problem implementing the rumble funcion.

I recall reading a few times that the 5 volt supplied to a Gamecube controller is only for the motor. But there are controllers that need it to work normally (yes, not only rumble). That's why even though the rumble function is never activated, I am still supply 5 volt to the Gamecube controller.

Firmware update

Option 1: Special N64 ROM

V2 adapters (Atmega168 + LED) can be updated using a special ROM on a N64 console, but this requires a reprogrammable N64 cartridge. Otherwise, as always, the normal AVR programming tools must be used.

ROM: gc2n64_manager-1.1.v64 (Contains version 2.1 and 2.0)
ROM: gc2n64_manager-1.0.v64 (Contains version 2.0 only)

Option 2: 3rd generation N64 to USB adapter

Firmware updates can also be performed through a raphnet 3rd generation Gamecube/N64 controller to USB adapter. Use the Manage GC to N64 adapter option from the Tools menu in the Adapter management tool.
Tools -> Manage Gc to N64 adapter

Tools -> Manage Gc to N64 adapter

Firmware (for V2, Atmega168 + LED)

Note: Files here are for new (v2) adapters built using a Atmega168 and a LED indicator.
The software for this project is distributed as source code and ready to flash .hex files.

The fuse bytes must be configured appropriately for the MCU to run at the correct speed. For this project, the values are: high_byte=0xdc, low_byte=0xd7, extended_byte=0x01.

Setting the lock bits to protect the bootloader against modifications is also a good idea: lock: 0x2F

For details about how to program an AVR, visit my AVR programming page.

Now, here are the files:
RSS feed for this table
Version v2.1
April 9, 2017 (Sunday)
  • Add a new conversion mode for Joystick values: Extended (where Gamecube values are forwarded to the N64 without transformations)
  • Fix erratic button mashing behaviour in Shadows of the empire
  • Set lock bits to protect bootloader from erasure
gc_to_n64-2.1.tar.gz (196.8 KB)
gc_to_n64-2.1.hex (21.5 KB)
Show previous releases...
Version v2.0
October 14, 2015 (Wednesday)
First release for adapter version 2:
  • Now built for Atmega168 by default. Old makefile for Atmega8 is still available.
  • Add a bootloader (Atmega168 only) for software updates.
  • Improved joystick value conversion (the old behaviour is available via a menu option).
  • Add a reset to factory defaults function.
  • Add mapping load/save through the N64 interface support
  • Add visual buzzer (simple LED) support. (default for Atmega168)
gc_to_n64-2.0.tar.gz (71.5 KB)
gc_to_n64-2.0.hex (21 KB)

Firmware (for V1, Atmega8 + Buzzer)

Note: Files here are for old adapters (v1) built using an Atmega8 and a speaker/buzzer.
The software for this project is distributed as source code and ready to flash .hex files.

The fuse bytes must be configured appropriately for the MCU to run at the correct speed. For this project, the values are: high_byte=0xc9 low_byte=0x1f

For details about how to program an AVR, visit my AVR programming page.

Now, here are the files:
Version v1.5.1
March 15, 2015 (Sunday)
New fuse values to enable brown out detector. Fixes the issue of random loss of mappings at startup.
gc_to_n64-1.5.1.tar.gz (34.8 KB)
gc_to_n64-1.5.1.hex (17 KB)
Show previous releases...
Version v1.5
February 7, 2015 (Saturday)
  • Add a feature to select the default mapping at startup.
  • Minor updates for compilation with recent toolchain.
gc_to_n64-1.5.tar.gz (34.5 KB)
gc_to_n64-1.5.hex (16.8 KB)
Version v1.4
May 19, 2013 (Sunday)
Bug fixes and improvements:
  • Fixed the ED64 menu freeze bug
  • Improved the Wavebird neutral position
  • Tighter timing in the N64 interrupt handler. This appears to fix F-Zero X. (Never seen a game picky and buggy* like that..)
* Disconnect even a standard controller and say goodbye to your race. Connecting the controller back does not work. Right, no reason to do that. But if the controller fails to answer only one poll request, it's game over...
gc_to_n64-1.4.tar.gz (34.7 KB)
gc_to_n64-1.4.hex (17.9 KB)
Version v1.3.1
April 28, 2013 (Sunday)
Bug fixes:
  • Fixed a bug when mapping the main joystick to buttons. The up[18]/down[19] and left[20]/right[21] directions were inverted.
  • Fixed a bug when entering a new mapping code where the unchanged parts of the previously active mapping remained in effect.
gc_to_n64-1.3.1.tar.gz (33.8 KB)
gc_to_n64-1.3.1.hex (17.8 KB)
Version v1.3
March 20, 2013 (Wednesday)
New feature:
  • Added a joystick deadzone feature (default OFF).
To enable the deadzone, or disable it if previously enabled, hold START until you hear the 5 beeps, fully press and release R, then press Z and wait a few seconds for the final beep. The setting is stored in the adapter, no need to repeat after each power up.
gc_to_n64-1.3.tar.gz (33.6 KB)
gc_to_n64-1.3.hex (17.7 KB)
Version v1.2.2
February 12, 2013 (Tuesday)
Bug fixes and maintenance:
  • The analog L and R sliders are now unmapped by default
  • Beep on read errors (when disconnecting controller).
  • Beep once at powerup.
gc_to_n64-1.2.2.tar.gz (33.2 KB)
gc_to_n64-1.2.2.hex (17.4 KB)
Version v1.2.1
July 31, 2012 (Tuesday)
Bug fixes and maintenance:
  • Auto-calibration is now done each time a new controller is connected, which means controllers can be swapped at runtime.
  • The above makes the Wavebird work properly again (was broken in v1.1!)
  • At powerup, the adapter waits for a Gamecube controller.
  • A newer version of the Gamecube communication code (ported from my N64/Gamecube to USB project) is now in place.
gc_to_n64-1.2.1.tar.gz (32.5 KB)
gc_to_n64-1.2.1.hex (17.4 KB)
Version v1.1
February 2012
Compatibility fixes:
  • Auto-calibration of the gamecube joystick at powerup fixes compatiblity issues with controllers that are not perfectly centered.
  • Better conversion from Gamecube axis values to N64 values. This fixes issues with some game/controllers where, for instance, the character would not run at full speed.
gc_to_n64-1.1.tar.gz (30 KB)
gc_to_n64-1.1.hex (17.7 KB)
Version v1.0
August 2011
First release:
  • Official wired Gamecube controllers supported (includes the white Japanese controller with extra long cable).
  • Nintendo Wavebird and Intec wireless controllers supported.
  • Should work with any device equivalent.
  • Programmable button mappings to improve gameplay.
  • Low latency polling algorithm (approx. 5ms, less than one frame).
  • Buzzer output for programming feedback.
gc_to_n64-1.0.tar.gz (31.4 KB)
gc_to_n64-1.0.hex (15.9 KB)


In order to facilitate the assembly of adapters, I designed a small printed circuit board. This PCB is sold in my online store. Perfect for building custom adapters in the casing of your choice, or maybe even building it right into a N64 console? (I don't know if there's enough space though).

The circuit can be (re)programmed by soldering wires or installing an adequate connector on the back side.

Stick translation

A few facts about standard N64 controllers:

  • The N64 stick generates two numerical axis values: One for the X axis and one for the Y axis.
  • The values are transmitted to the console using 8 bits and are signed. This imposes a -128 to +127 theoretical limit on transmitted values.
  • In practise, the typical range observed is more or less from -80 to +80.
  • On worn down controllers, this range gets a bit narrower.
  • The stick physically moves inside an octogonal recess with stretched corners. Unlike gamecube controllers, this is not a regular octogon.

Standard controller curves

Here are graphical representations of the maximum values from two N64 controllers in excellent condition. The grid in the background covers -80 to +80 values.
Official controller 1

Official controller 1

Official controller 2

Official controller 2

  • The two controllers slightly exceed the ±80 range vertically.
  • The diagonal maximum values are lower than for horizontal and vertical deflections. This is as expected for a stick constrained to move within an octogon.

Hori mini N64 curve

Hori mini N64 curve

Hori mini N64 curve (Gamecube style stick)

A few facts about the Hori mini:
  • The stick generates values ranging from -100 to +100
  • The stick moves inside an irregular octogon, yet it seems a bit more regular than for the standard controller.
The image one the right shows the maximum values obtained on a Hori mini N64 controller. The following observations can be made:
  • The Hori controller covers a larger range than the standard N64 controller.
  • The designer clearly adjusted the scale to get ±80 in the diagonals.
  • The diagonal values are higher than with regular controllers.
  • Vertically and horizontally, the values largely exceed the ±80 range observed on standard controllers.
Those differences may have an impact on the game. For instance, the maximum running speed one can reach may be higher than when a standard controller is used.

The Gamecube to N64 adapter

The adapter receives values from the Gamecube controller and applies a transformation for the N64 console. Here are the default resulting profile for different adapter versions:
Version 1.5

Version 1.5

Version 2.0

Version 2.0

Many users reported that the in-game character would not reach his top running speed in diagonal. This is why I stretched the profile corners in version 2.0. But the version 1.5 profile is still available using the built-in menu (Read the instructions in the mapping section).

Here is the resulting profile if the adapter does not apply a transformation on the Gamecube stick values and just forwards them to the N64. This mode is available since firmware 2.1 and is know as extended mode.
Gamecube (Adapter v2.1 Extended mode)

Gamecube (Adapter v2.1 Extended mode)


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 :)