VirtualBoy controller to USB adapter


So you want to play with a Virtual Boy emulator on your PC, depriving yourself the pleasure of adopting an unpleasant posture and of getting a headache? At least, don't go so far as to deny yourself the privilege of holding the real controller in your hands! (Ok, I admit I never really tried a real Virtual Boy. Maybe it's not that bad...)

Anyway, in order to use a Virtual boy controller on a PC, I designed an adapter. The schematics, wiring and source code are on this page.


Here are a few pictures demonstrating how this project can be implemented.

1. Building an adapter

If you have the small circuit board with the controller connector salvaged from an (hopefully broken) console, you can build an adapter:

December 2020: Someone recently asked about the diode and resistor visible in the pictures above. It has been a while, and this build was for a customer, but if I recall correctly, this was a hack to use the power switch to select mappings. The trick was to short the battery contacts inside the battery enclosure (using fake batteries), and then wire the battery wire (pin 6) to PC0 on the PCB. The diode and resistor were there for safety in case someone ever connected a controller with actual batteries. The diode is to make sure you can only pull PC0 towards ground and not inject voltage into the board, and the resistor to limit current in case of reverse-inserted batteries.

2. Converting a controller (with internal circuit)

If you don't have the console-side connector, a permanent controller conversion can be made by building an/or installing the circuit internally:

3. Converting a controller (with external circuit)

The circuit can also be built/installed externally, in-line with the original cable. Make sure to protect it with an enclosure!


Axes 1 and 2 Left D-Pad Left D-Pad
Axes 3 and 4 Right D-Pad
Button 1 A A
Button 2 B B
Button 3 Start Start
Button 4 Select Select
Button 5 R R
Button 6 L L
Button 7 Right-D-pad Up
Button 8 Right-D-Pad right
Button 9 Right-D-Pad down
Button 10 Right-D-Pad left
How to use mappings:

1: If the START button is held when powering-up the adapter (eg: by connecting the USB cable), the alternate mapping will be enabled.

2: The mapping can be changed "live" by connecting PB1 or PC0 to GND through a jumper or switch.

Schematics and wiring

Here is the schematic and annotated pictures of the connectors:


Cable side pinout

Cable side pinout

Console side pinout

Console side pinout

Here is a table mapping pin numbers to colors and functions:
2+5vBlue5 volt from console to controller.
6VbatRedBattery voltage


Version v1.1
February 22, 2014 (Saturday)
Version 1.1:
  • Alternate mapping can be enabled at run-time by grounding PORTC0 or PORTB1.
  • Updates for compilation with recent GCC
  • Updated USB VID/PID
virtualboy_usb-1.1.tar.gz (91.7 KB)
virtualboy_usb-1.1.hex (7.3 KB)
This project is also available on GitHub!
To request features, report issues or contribute, you may send me an email or use the GitHub repository:
Using the .hex files
The Atmega8a has to be programmed using the .hex file. The "fuse bytes" for this project are high_byte=0xc9, low_byte=0x9f.

For more information about the tools required to program an AVR microcontroller, please visit my AVR programming page.

Source Code (.tar.gz files):
Unless indicated otherwise, the source code is published under the GPL license. Please consult the included LICENSE file for more information. The project compiles using the included makefiles using avr-gcc under Linux.

User pictures

I like seeing how others build my projects. If you build an adapter, please send me pictures and I'll add them here.


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