Nintendo 64 Controller Pinout
This work was done via reverse engineering the controller itself.
The Nintendo 64 controller has 3 pins: the middle one is a serial type interface, the other two wires are power and ground.
Once you take the thing apart, you see the main controller wire going to a plug on the main board.
These three wires are color coded as follows
- Red - 3.3V
- Black - Ground
- White - Data : 3.3V Logic Level
Looking at the connector end that goes into the N64 we see:
- GND
- DATA - 3.3V Logic Level
- VCC - 3.3V
Reading the controllers position and button information
For reading position information from controller, the data stream requires a 41 bit command sequence. To understand the sequence we must define the bit stream characteristics.
- Each bit is 4us in length (except 2)
- A zero is represented as 3us low (0V) and 1us high (3.3V)
- A one is represented as 1us low (0V) and 3us high (3.3V)
For the read status command 7 zeros and 2 ones must be sent to the controller.
The way the transmitter should be implemented is using tristate logic. For a zero tie the input of a tristate buffer low and use the tristate control pin as the data input.
The Nintendo controller has a 3.3V pull up on the line so if you put the buffer in tristate the data line will go to 3.3V (high). If you put the buffer in drive mode the line will go to 0V (low). This also allows you to go directly to read mode in your logic once you send the last command bit.
For reading the controller, once the last bit goes to the high state, approximately 2us later the controller starts sending the requested data back to you, so make sure your receiver is ready.
Bit assignments
The 32 bits following the start bit are translated as follows
bits 0 - 15 : button values -
|
-> Zero = Not Pressed
|
-> One = Pressed
bits 16 - 31 : analog stick position
bit 0 - A
1 - B
2 - Z
3 - START
4 - DIGITAL PAD UP
5 - DIGITAL PAD DOWN
6 - DIGITAL PAD LEFT
7 - DIGITAL PAD RIGHT
8 - START+L+R : All pressed at the same time
9 - ? No combination seems to use this bit
10 - L
11 - R
12 - C UP
13 - C DOWN
14 - C LEFT
15 - C RIGHT
bit 16 -> 23 - X axis reading, 2's compliment
-128 = full left
0 = center
+128 = full right
bit 24 -> 31 - Y axis reading, 2's compliment
+128 = full top
0 = center
-128 = full bottom
Timing Information
The total position command takes 166us to execute, and the program I ran on the N64 polled the controller every 16.667ms or a frequency of 60Hz.
Rumble Pack Commands
It appears as if the rumble pack commands are more difficult to decode when your trying to play while hitting stop on the oscilloscope. So as far as I can tell until I get the controller hooked up to a PC this is the format for the rumble pack commands. Use the same data format for sending a 0 and a 1 bit.
0000-0011-1100-0000-0001-1011-(Send string of zeros the length of intensity required)-(6us pulse)-0000-0000
This is probably wrong, but oh well.