Nintendo 64 Controller FAQ V0.1 Written By $up3rDud3 All Copyrights and Trademarks belong to their perspective owners. This work was done via reverse engineering the controller itself. No information was obtained via outside channels. All work was done on a N64 controller with no prior knowledge of its working. The hope was to interface the controller with a common pc game interface. It was deduced that it is a serial type interface, and the other two wires were Power and ground. So 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 _____ / \ <- Round Part is Top / \ | | | O O O | |_______| 1 2 3 1 - GND 2 - DATA - 3.3V Logic Level 3 - VCC - 3.3V 1.0 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). A two is the stop bit 1us low (0V) and 2us high (3.3V). For the read status command, the following must be sent to the controller. 0000 0001 2 : 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 : 2 : _______ _____ _____ _____ _____ _____ _____ _____ _________ _______ | | | | | | | | | | | | | | | | | | | |_________| |_________| |_________| |_________| |_________| |_________| |_________| |_____| |_____| | :------4us------:------4us------:------4us------:------4us------:------4us------:------4us------:------4us------:------4us------:-----3us-----: :---3us---;-1us-:---3us---;-1us-:---3us---;-1us-:---3us---;-1us-:---3us---;-1us-:---3us---;-1us-:---3us---;-1us-:-1us-;---3us---:-1us-;--2us--: Once this command is sent the controller responds with the representation stated above for a zero and an one. 1.1 Bit assignments The 32 bits following the read command 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 1.2 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. 1.3 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. 1.4 Memory Pack Commands ??????