Do you really, really want to play homebrew on your original N64 hardware? Is a flash cart just too pedestrian and mainstream for you? Do you posses a GameShark Pro, a 4MB Expansion Pak, and a brain disease that makes you enjoy doing things the hard way? Well, I sure do! And hoo boy, do I have a project for you…
Read on, brave souls, for herein lies the story of how I played a commercial homebrew NES game (legally purchased electronically from Steam) on my N64 via an NES emulator, which I loaded with a GameShark Pro that was interfaced to my Windows 10 PC via a very specific USB-to-Parallel adapter, that was then passed through to a lubuntu virtual machine running via VirtualBox, containing a USB GameShark homebrew loader program.
Doesn’t that sound fun?
This method made the rounds on the web a couple of years ago, but nobody really described how to do it in layman’s terms and the information was a bit scattered. So when I found out about it, it still took some piecing together. Let’s rectify that and make the method as clear as possible. Let’s get started!
The Background
What You’ll Need
- An original N64 with a 4MB Expansion Pak installed
- A GameShark Pro with a functional parallel port
- A USB-to-Parallel adapter based off of a MosChip 7705 bridge
- The ability to run Linux (I prefer lubuntu on VirtualBox for these sorts of projects)
- A copy of gs_libusb
- Your favorite NES ROM (I highly recommend Micro Mages! The Steam version even includes a legal NES ROM that works perfectly for this project.)
The basic goal for this project is that we need to run a Linux application called “gs_libusb” to transfer programs to our GameShark Pro. The tough part is how to get them talking to each other.
The hardest part of making this work might be sourcing the USB-to-Parallel adapter. Any old adapter off of Amazon or eBay or whatever just won’t work. As I mentioned in my post about connecting the GameShark to a PC, it’s only possible to do this with an adapter based off of a MosChip MCS7705 bridge (in fact, gs_libusb is hard-coded to look for it). I don’t know how to identify whether a random cable has this chip, so hunting one down is hard. I did manage to figure out that the USB-1475 manufactured by Cables Unlimited contains this chip and works well. These specific cables don’t seem to be produced anymore and are hard to come by these days. If anyone knows of other cables that contain the right chip, please let me know by leaving a comment.
Next, you’ll need to have the right version of the GameShark Pro. Versions 3.1, 3.2, and 3.3 all came with parallel ports on the back. All versions of 3.1 and 3.2 should work, but only certain versions of 3.3 carts will work. With version 3.3, some contain a working parallel port and some don’t. Usually, GameSharks with a speckled-looking case will work. The folks over at Micro-64 have a good explanation of the difference. (That article also explains how to load homebrew with legacy PC hardware, so check it out if you have an old Windows 98 machine lying around and can’t find the USB-to-Parallel adapter that’s needed for this method.)
Enough rambling, let’s get to it. Here’s the method…
The Method
Step 1: Set up your virtual machine
I won’t go into much depth here about how to set up a virtual machine, I’ll just reiterate that I like lubuntu and Virtual Box for projects like this. Go through the normal setup process for any virtual machine and you’ll be good to go. Here are the important configuration changes you’ll need to make once your install is complete:
- Install the Virtual Box Extension Pack: By default, Virtual Box only supports USB 1.1. Installing the Extension Pack will allow us to configure USB 3.0.
- Set your virtual machine to use USB 3.0: Without this step, you’ll be relegated to USB 1.1 and probably get a lot of very frustrating USB timeout errors when you attempt to load anything to the N64. Once the Extension Pack is installed, edit the USB settings for your virtual machine to set them to USB 3.0 mode. Then, with the USB-to-Parallel adapter plugged into your host machine, add a USB device filter for “MosChip Semiconductor MCS7705 Parallel port adapter [0100].” This is what will allow the virtual machine to see your adapter. Or, alternately, add a blank filter to allow all USB devices to pass through.
- Optional – Install the VirtualBox Guest Additions for Linux: This isn’t strictly necessary, it just makes life easier by allowing you to copy/paste files from Windows to Linux and share a clipboard. Instructions for the install are at the VirtualBox site. I highly recommend doing this, unless you prefer to map network drives to do file sharing between systems.
Step 2: Compile gs_libusb
This is the loader program that will send files to the GameShark Pro, but it’s just provided as source code and needs to be compiled on your system. It’s not too hard, just follow these steps on your Linux machine:
- Install libusb 1.0 dev libraries: libusb is a tool that allows programs to communicate with USB devices. Your system may have the binaries installed already, but we’ll need the libraries to compile our own code with it. To get them, open a terminal prompt and enter the following commands…
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev
- Download and extract the gs_libusb project: Grab the whole project from the Github page (download it as a .zip) and extract it to a reasonable directory somewhere, such as your home directory.
- Compile the code: Open a terminal window in the root gs_libusb-master directory and type the following commands…
sudo make clean
sudo make
Assuming your libusb 1.0 libraries installed correctly, the compile should run quickly, and that’s all there is to this step. You’ll see warnings, but they can be safely ignored.
Step 3: Prepare your N64
Now we need to make sure that the N64 is ready to accept a program we send it. Just do the following…
- Ensure your N64 has a 4MB Expansion Pak installed: This step is absolutely required, this simply won’t work without an Expansion Pak.
- Plug in your GameShark: Use a common game, such as Super Mario 64 or Pilotwings 64, in the top slot. Avoid anything that uses the Expansion Pak memory.
- Plug the USB-to-Parallel adapter into the GameShark: This should be self-explanatory.
- Boot your game: Power on your N64 and choose to start your game. Make sure to turn the Code Generator ON and start the game Without Cheats. Once the game begins, your GameShark is ready and waiting for commands on the parallel port! (I typically use Super Mario 64, loaded up to the Select File screen.)
Step 4: Run the loader
Finally, the real step. With our VM prepared, gs_libusb compiled, and our N64 waiting patiently, let’s send it something to run!
- Plug the USB-to-Parallel adapter into your PC: Be careful here and ensure that the VM actually picks it up and sees it. Run the following command at the terminal to ensure the MCS7705 is listed. If it’s not, check your VM’s USB settings and make sure that your host PC hasn’t “claimed” the device. (Unplug it and plug it back in with the VM running.)
lsusb
- Copy your ROM to the gs_libusb-master/examples directory: Really, you can put the ROM anywhere on your Linux machine, this will just make the next command simpler.
- Execute the loader to run an NES emulator and your ROM: Run the following command from the root gs_libusb-master directory. It will load Neon64 and and whatever ROM you specify in place of YOUR_ROM.bin!
sudo ./gsuploader/gsuploader examples/neon64gs.bin examples/YOUR_ROM.bin
- Let everything load: Here, all you have to do is wait. Your N64 will appear to freeze while the load is happening; that’s okay. Once the load is complete, you should see the Neon64 main screen. Hit any button and play! At any time, you can hit L+R to bring up the main menu.
Step 5: Run other programs
- The examples folder contains a simple demo program that you can run, too. With everything set up and working, just run the following command to load it instead of neon64gs.bin:
sudo ./gsuploader/gsuploader examples/flames.bin
- It’s also possible to build and run your own programs to be compatible with this load method. To do so, you’ll need to install gsdevkit, which will give you a complete GameShark-compatible homebrew toolchain. Go knock yourself out!
Much of the info in this tutorial was gleaned from the relevant GitHub Readme files and the following video. Have a look if you want to see someone walk through running the loader: