Tutorial 2: Monku R1 / R2 - ODROID-C1+ / C2 Retro Gaming Console Build Part 2: Software
-
Author: Brian A. Ree
Part 1 of this tutorial which details the hardware configuration can be found here.
Part 3 of this tutorial which details the hardware configuration can be found here.
Sections
0: Tools Needed
- A computer with an SD card reader or a USB port if you have an SD card to USB adapter.
- An SD card, recommended 64GB or greater.
- Mac SD card image writing software. I use balenaEtcher, it is free and works great.
- Window SD card image writing software. I use Win32 Disk Imager, it is free and works well but can be a bit finicky with very large drives.
- An internet connection. If you're reading this you already have this tool, lol.
1: Parts Needed
- 64GB Micro SD Card x2: $15.99 link
- SD Card Reader x1: $11.00 link
- Linux Friendly Gamepad x1: $17.00 link
Since we included the SD cards in the hardware cost we won't count them here. That means the total cost for this part, assuming you have access to a computer
of some kind is $0.00 to $28.00 and you can probably find a cheaper SD card reader but I like that this one because it has both Micro SD and SD card support in different slots that both work at the same time.
Also game controllers you might already have one you might now but I listed the one I use and a link for a good price on it.
Sounds great to me let's move on to the next part.
2: Introduction and Tutorial Goals
Hello and welcome to our thrid ODROID device tutorial. This review will show you in detail how to configure your
Monku Retro 1 (ODROID-C1+) or Monku Retro 2 (ODROID-C2) video game console's OS and apps. There will be a few steps involved
but I'll outline everything in detail including every command you have to run. If you don't intend to use your device as a retro gaming console
it makes a great set top Linux box, you can skip the sections on retroarch and antimicro and even the optimization section can probably be ignored.
So at the end of this tutorial you'll have a killer retro gaming console of your own making.
Well those are our goals, let's jump in and get going. I'll reiterate the features of this device below, these are the same bullet points that are on the hardware
section.
ALERT: If at any time you are prompted for a login when working with the terminal use the password, odroid.
R1 / C1+ Features:
- ODROID Goodness!
- Custom Software Control Button
- Custom Hardware Reset
- Support for Atari 2600, Atari 7800, ColecoVision, MSX-1, MSX-2, NES, GameBoy, GameBoy Color, Sega SG-1000, Sega Mark III, and Sega Master System configured and ready to go.
- Retroarch with XBM, custom scripts to monitor the software button, start retroarch, maintain antimicro.
- Configured for low memory usage and for use with included controller.
- Every ROM tested to see if it loads and properly associated with its emulator.
- Full linux desktop environment when not in game kiosk mode via antimicro.
R1 / C1+ Software Button Functions:
- 02 Second Hold: Software reset
- 04 Second Hold: Software shutdown
- 06 Second Hold: Turn off game kiosk mode.
- 08 Second Hold: Change to 1024x768x32bpp resolution and reboot.
- 10 Second Hold: Change to 720px32bpp resolution and reboot.
R2 / C2 Features:
- ODROID Goodness!
- Custom Software Control Button
- Custom Hardware Reset
- Support for Atari 2600, Atari 7800, Atari Lynx, ColecoVision, MSX-1, MSX-2, NES, GameBoy, GameBoy Color, Virtual Boy, SNES, GameBoy Advance, WonderSwan Pocket/Color, NEO GEO Pocket/Color, Sega SG-1000, Sega Mark 3, Sega Master System, Sega Genesis, Sega GameGear, NEC Turbo Graphics 16, and NEC Super Graphics emulators configured and ready to go.
- Retroarch with XBM, custom scripts to monitor the software button, start retroarch, maintain antimicro.
- Configured for low memory usage and for use with included controller.
- Full linux desktop environment when not in game kiosk mode via antimicro.
R2 / C2 Software Button Functions:
- 02 Second Hold: Software reset
- 04 Second Hold: Software shutdown
- 06 Second Hold: Turn off game kiosk mode.
- 08 Second Hold: Set video to auto for VGA mode, possibly alter retroarch.cfg for USB audio if present.
- 10 Second Hold: Set video mode to 720p, alter retroarch.cfg for HDMI audio.
3: Base 16.04 MATE Image and Writing to an SD Card
I spent an inordinate amount of time testing the operating systems images available for the C1+ and C2 and I've found that
Ubuntu 16.04 LTS is the best all around image in terms of efficiency, availability of packages, support, etc. Laka was great but
I had a ton of trouble with audio. Ubuntu 18.04 LTS was solid too but it definitely used more resources and I didn't find as many
emulators as easily with it so I decided on 16.04 LTS.
Boot up your Mac or Windows box. Linux users can pretty much follow the Mac instructions I won't provide specific
Linux examples though. Open up your browser and go to the ODROID WIKI page https://wiki.odroid.com/start.
If you have a C1+ or C2 go to that section. The images below detail the links for each device.
Select your device, then select the os_images, and finally select ubuntu. A page will load on the right-hand pane. Scroll it down
until you see the list of mirror sites. I like to use the South Korean mirror, just seems to work the best. Here are the direct links to the OS
images for each device.
I'm providing a little bit more information than is necessary I could have just posted the direct download link but I wanted
you to see what options there are out there. For the C1+ I used https://dn.odroid.com/S805/Ubuntu/ubuntu-16.04.2-mate-odroid-c1-20170220.img.xz
as my base image. If you cannot unzip a .xz file try using 7 - Zip. It is free and works well on Windows. I didn't have an issue on my Mac it could
handle .xz files just fine.
For the C2 I used https://dn.odroid.com/S905/Ubuntu/ubuntu64-16.04.2lts-mate-odroid-c2-20170301.img.xz
as my base image. I recommend being on a wired internet connection if you can, WiFi will be a bit slower.
Let the images download. You can verify them with the checksum if you want, the file just below the OS image,
but I'm not going to cover that here. Now on a Windows box, you're going to want to unzip the image file so that you have a full
uncompressed copy of it. Both files will use up about 6GB of hard drive space. You can delete the uncompressed file once you are done with it
to save space. On a Mac I recommend doing the same, if you have trouble unzipping the image I would recommend getting The Unarchiver.
It's free and works great. By far the best solution for unzipping hundreds of ROMs at once believe me.
You will have to navigate to the uncompressed image on the Mac as well.
ALERT: Double check your drive letters!!!
DOUBLE ALERT: Triple check your drive letters!!!
You don't want to inadvertantly ruin one of your drives or USB keys or whatever you might have plugged into your computer.
Let the image writer do its job. This can take a few minutes, go grab a coffee, or a beer if its 10AM.
ALERT: The OS images are not interchangeable you must use the C1+ base image for your C1+ device
and the C2 base image for your C2 device. One thing to note is ignore any prompts to format the SD card from either OSX or Windows.
When you're done you should see a drive called "boot" where the original blank SD card was.
Eject it properly and pop it into your your C1+ or C2, whichever you are working with.
If you're working with an ODROID-C1+ and you are planning to work on a computer display it may not be able to handle the default HDMI output.
It is a good idea to change the video output before we proceed. In that case put the SD card back in your computer and open the boot partition.
Find the boot.ini file and make a copy of it called boot.ini.orig.old.
Edit the original boot.ini file and make sure that the only uncommented output mode
is setenv m "1024x768p60hz", next scroll down a little further until you see the video signal section and make sure that
only setenv vout "vga" is uncommented. Make sure you use a text editor that is correct for the job, Pluma, nano, vi
on Linux and OSX, you could also try the native OSX text editor. On Windows Word Pad should do the trick. I've also found that Atom
works well on my Mac.
If your hardware is ok you should see a blue light when the SD card is plugged in and the device is turned on.
You should see a login prompt after a few seconds, C1+ times are a bit slower.
If not you may have a problem with either the SD card or the hardware. I've worked with at least 6 of these things and soldered
them ... poorly ... and they've all booted up no problem. The username and password for your device is odroid.
Write it down somewhere in case you forget, just kidding, lol.
If you don't see anything but a blank screen, or you see a login prompt
but after logging in see nothing but a blank screen then restore the original boot.ini, if you are working with a C1+, and prepare to
work in front of the TV. Double check your boot.ini is reset back to the original and see if you can get to the MATE desktop using this approach.
ALERT: This device isn't being configured as a secure Linux box. Although you can do that if you want we won't cover it here.
4: Software Updates, Partition Sizes, and More
First thing is first let's get rid of that pesky login prompt. If your device has USB trouble on boot up just power cycle it.
I would say though to use the software control buttons once things are all setup and never use the hardware power button unless you are
turning it back on again. For the remainder of the tutorial we expect that you'll have a keyboard and mouse hooked up to the device.
If you go to the following menu location Applications -> System Tools -> MATE Terminal it will open up a terminal window for you.
We're going to run a series of commands at the terminal now. I'm going to list them below. Some do take a while to run but you may have to sit
near the screen in case you're prompted by an install. It stinks coming back to a process you thought would finish by itself and see a dialog popped up asking for your input, ugh!
What we are doing here is setting up auto login, updating Ubuntu, and installing some packages. Let's get to it!
Type this command or copy and paste it into the terminal window.
sudo nano /usr/share/lightdm/lightdm.conf.d/60-lightdm-gtk-greeter.conf
You'll be prompted for the password, use odroid.
You will see some text like this in the file.
[Seat:*]
greeter-session=lightdm-gtk-greeter
You're going to add a line at the bottom, autologin-user=odroid, and then save and close the file. Press
Crtl+O then hit enter to save the file. Press Ctrl+X then press enter to exit the editor.
You won't be prompted to login on the next reboot.
Next up we'll be running updates on the OS packages and installing a few things. This part takes a little while but
for the most part it runs by itself. Enter in and run each of these commands in the order shown below from the terminal window.
sudo apt-get update -y
If you get a boot.ini prompt for this command just hit enter. This command takes a little while.
sudo apt-get upgrade -y
sudo apt-get install git -y
sudo apt-get install gparted -y
sudo apt-get install make -y
sudo apt-get install cmake -y
sudo apt-get autoremove -y
Now that all of that is done running the system is starting to shape up a bit. The next thing we want to do is turn off
any swap space the OS is using. The conventional wisdom is that swap partitions will degrade the SD card which I think are rated for
some number of read/write operations before they begin to fail. So far I've been disabling them without a noticeable performance hit.
Run the following command at the terminal.
swapon -s
If you see output similar to the following you have zram enabled. Follow the steps below to turn it off and remove it.
odroid@odroid64:~$ swapon -s
Filename Type Size Used Priority
/dev/zram0 partition 219824 2080 5
/dev/zram1 partition 219824 2076 5
/dev/zram2 partition 219824 2076 5
/dev/zram3 partition 219824 2076 5
Ok so we want to disable these to make sure our SD card lasts as long as it can.
Whatever performance increase, or decrease, they cause hasn't been noticeable by me but I don't want the extra read/write
operations. So let's run the following command. The C1+ I beleive does not have a swap partition by default, I will double check this.
sudo apt-get remove --purge zram-config -y
If you notice a standard swap partition listed follow the following steps to remove standard swap partitions.
swapoff -a
This will immediately disable swap on the system. Next remove any swap entries from /etc/fstab by editing the file as root and commenting out any
swap partition entries.
Reboot the system. If, for some reason, the swap partition is still there open gparted, System -> Administration -> GParted.
Locate the partition in the list of active partitions and unmount, then delete the partition.
Next up we're going to run a MATE software update by navigating to System -> Administration -> Software Update
in the menu system.
ALERT: If you are asked to perform a partial update then sckip this step we'll run with the packages we have installed.
I've noticed that in some cases the packages can get a little wonky. I would only proceed with an update if no Partial Update
dialog pops up.
If it is not a partial update prompt, click the Update button, wait a little while it slowly turns into a progress bar dialog and perform
the updates. At the end of the process you will be prompted to restart the system. Hit Restart.
Nice, notice the no-login prompt when the system started up. Looking more and more like a retro gaming console by the minute.
Ok last thing we're going to do is resize the main partition to use all the available space. If you go to System -> Administration -> GParted
in the menu system you should see something like what's depicted below. Notice that there is something like 50GB of unused space. If you have little
to no unused space but still have room on the SD card you need to resize your root partition.
I'll give you a quick rundown of the process.
ALERT: You may not need to do this but you should double check anyway.
The best way to work with an ext4 file system is on our C1+ or C2.
Use the second SD card that comes with the recommended purchase listed on the hardware build.
Write the base OS image onto the SD like we did above and install gparted, also like we did above. You don't have to run all the updates and stuff
just make sure gparted is installed. Use the SD to USB adapter listed above to mount the SD card that we want to resize partitions for onto the
OS. You should see a little drive icon appear, we'll call this SD-USB for SD to USB.
Fire up the bare bones Ubuntu SD card if you haven't already. Start gparted from the menu
System -> Administration -> GParted and select the SD-USB card attached not the root file system running Ubuntu.
Select the root file system on the SD-USB card. Right click on it and go to the resize option if you get an error you may need to unmount this partition
and then try to resize it. You can visually resize the partition now by dragging the arrow all the way to the right or by setting the fields contained
in the form to have 0 free space following. Bam! We're done with this section.
5: Retroarch and Antimicro Installation
Alright now we're getting somewhere. Let's get retroarch and antimicro installed so we can begin the configuration process.
To install retroarch we need to open a terminal, Applications -> System Tools -> MATE Terminal.
sudo add-apt-repository ppa:libretro/stable && sudo apt-get update -y && sudo apt-get install retroarch* libretro-* -y
Try the command above on the C1+ and C2, hit enter if prompted, and Y if prompted. If it fails don't worry.
I noticed it fails on the C2 but I'm not sure about the C1+ no worries though the *'s in the package lists are the culprit.
It's pulling down some packages that have dependency issues and that is then halting the whole command. If it failed try running this command instead.
sudo apt-get install retroarch retroarch-assets retroarch-dbg libretro-beetle-lynx libretro-genesisplusgx libretro-handy libretro-4do libretro-bsnes-mercury-performance libretro-bsnes-mercury-accuracy libretro-bsnes-performance libretro-beetle-wswan libretro-dinothawr libretro-beetle-ngp libretro-bsnes-balanced libretro-gambatte libretro-fbalpha2012 libretro-fba libretro-beetle-psx libretro-vba-next libretro-gw libretro-mupen64plus libretro-beetle-sgx libretro-2048 libretro-tyrquake libretro-beetle-pcfx libretro-prosystem libretro-bsnes-accuracy libretro-parallel-n64 libretro-picodrive libretro-mame libretro-nestopia libretro-mednafen-psx libretro-core-info libretro-gpsp libretro-mess libretro-beetle-pce-fast libretro-mgba libretro-fbalpha2012-neogeo libretro-fba-neogeo libretro-beetle-vb libretro-tgbdual libretro-fba-cps1 libretro-fba-cps2 libretro-fmsx libretro-stella libretro-yabause libretro-mess2014 libretro-mess2016 libretro-desmume libretro-beetle-bsnes libretro-glupen64 libretro-catsfc libretro-quicknes libretro-bsnes-mercury-balanced libretro-vbam libretro-bluemsx libretro-fceumm libretro-nxengine libretro-snes9x-next libretro-mame2014 libretro-mame2016 libretro-fbalpha2012-cps1 libretro-fbalpha2012-cps2 libretro-fbalpha2012-cps3 libretro-fbalpha libretro-snes9x libretro-prboom libretro-beetle-gba -y
Ok if one of these packages fail, remove it from the list and try again. The command above is the exact command I use on my C2's.
After that's done let's do a little updating and cleaning.
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get autoremove -y
Now you shold have this menu option available after the commands are done running, Applications -> Games -> Retroarch.
Click on it and you should see something similar to what's depicted below.
Alright, are you getting excited? I know I am, we're almost there. Ok so don't mess with retroarch now, we'll come back to it.
Next we have to get antimicro installed so we can control everything with a gamepad when retroarch isn't running. Alrighty let's do it.
Go to this URL, https://github.com/AntiMicro/antimicro/releases and download the latest release as a zip file. You should see it below
the Windows EXE entries. Once it is done downloading open the odroid home folder. There is a link on the desktop for it.
Create a new folder called install_zips as depicted below.
Now go to the downloads folder and copy the antimicro zip file from there and paste into the install_zips
folder. Right click on it and select Extract Here. Wait for it to uncompress.
Now open up a terminal,
Applications -> System Tools -> MATE Terminal, and run the following commands. If your antimicro folder,
after decompressing the original zip archive, has a different name use that name in the change directory command below.
cd install_zips/antimicro-2.23/
sudo apt-get install libsdl2-dev -y
sudo apt-get install qttools5-dev -y
sudo apt-get install qttools5-dev-tools -y
sudo apt-get install libxtst-dev -y
Once all those packages are installed we can compile antimicro without any errors. So let's compile and install. Run the following commands.
cmake .
sudo make
sudo make install
You should see something like the following during this process.
Once that's done let's test antimicro, run antimicro at the terminal. If everything is ok you should see something like what is
depicted below.
Plug in a game controller that is supported by Linux. Hardkernel has the best price I've seen so if you pickup some ODROID-GOs or other
hardware grab one of these GameSir Wired Controllers.
Ok fire up retroarch, Applications -> Games -> RetroArch, you should see large yellow text flash across the bottom of the screen, look closely.
I've had some versions of the controller act a bit weird
but I've been working with about 5 of them and for the most part I've had no problems.
Ok close retroarch. Now type into the terminal window the antimicro command.
You should see something similar to what's depicted below if the controller is detected properly.
Ok that wraps us this section of the tutorial. Next up we're going to configure antimicro, and retroarch.
Let's hop to it!
6: Retroarch and Antimicro Configuration
Let's get antimicro configured so we can start controlling the desktop environment with the gamepad. Open up a terminal, I'll
not list the menu path for it from this point forward. Type antimicro in the terminal and wait for the app to launch.
Connect your linux supported controller and make sure that antimicro recognizes it. If it doesn't you'll need to try another controller.
Click the Controller Mapping button on the bottom left hand corner of the UI. This is where you tell antimicro about the base functionality of
your controller. If you don't have a button for a specific position in the list, for instance Linux seems to ignore the blue central button on the
GameSir controllers, use your mouse to click down to the next viable option. Match up the buttons on the gamepad with the controller graphic's green button indicator.
ALERT: Some buttons like triggers fire multiple time and you'll have to use the mouse to back up the position of the mapping and fix the double entry.
Click save when you are done and return to the main antimicro UI.
You will see a new mapping on the main antimicro UI that contains buttons for all the new mappings you just made. What we are going to do
here is setup mouse support so that you can control the desktop environment from the gamepad when retroarch isn't running.
We'll use the left thumbstick for fine, slower, mouse control and the right thumbstick for faster mouse control.
The A and B buttons will server as the left and right mouse buttons.
Right click on the left thumb stick area and select mouse normal from the option list.
Click on the left thumb stick buttons again and find the Mouse Settings button at the bottom of the window.
The image above shows the button we're looking for. In the mouse settings window set the Horizontal Speed and
Vertical Speed to 10 for the left thumbstick as depicted below.
Do the same thing for the right thumbstick except now set the Horizontal Speed and
Vertical Speed to 30 as depicted below.
Now let's map the mouse buttons, close all dialogs and get back to the main antimicro UI. Find the A button in the button list below
the thumbstick and dpad listing. Click on it then click on the Mouse tab. Select the left mouse button. Do the same thing for the B button
except choose the right mouse button for that mapping. Below is a screen shot depicting the left mouse button mapping in action.
Take it for a spin while the main antimicro UI is open. You should see the mouse move around the screen as the button
listings in the antimicro UI turn blue to indicate they are active. See how it feels, adjust the speeds on the mouse controls
as you see fit.
When you're all set go back to the antimicro main UI and click the Save As button at the top right hand side of the screen.
Save the controller configuration as game_sir_wired.xml or whatever you want to name your controller in the odroid home directory as
shown below. I'll provide a copy of my XML file here if you are using a GameSir controller you can just use it and save some time.
If you are using an Easy SMX controller use this file.
Click on Options -> Settings in the antimicro menu and make sure only Close To Tray and Launch In Tray
are checked. This will ensure antimicro lives in the app tray and doesn't clutter up our screen. We have one more setting to adjust and then
we'll be done with antimicro and on to retroarch!
While still on the antimicro setting window click on the Auto Profile option on the left. This will determine what profile
will automatically be associated with the attached gamepad. You kind of only get one mapping. It would be cool it if had different options
for different hardware but as far as I can tell you're setting it up for the controller you have. Click the Active checkbox at the top of the
window. Then select the Defualt, and only, row in the table. Click the Edit button and browse to the controller mapping XML file you saved
just a few steps back. Click Ok then quit out of antimicro, if it appears in the system try click the controller icon in the system tray and quit the app.
Nice! We are done with the antimicro configuration!!
Next up let's whip retroarch into shape. Fire up retroarch from the menu system,
I'll not list the menu path for it from this point forward. First let's get the gamepad working in retroarch.
In retroarch you can use the keyboard arrow keys, enter, and backspace to navigate the menu system without the gamepad.
Make sure you have a mouse, keyboard, and game controller connected to your ODROID.
Use the arrows on the keyboard to navigate right to the Settings section, then move down to the Input section
as shown below.
Adjust the settings on this screen as you see below. I usually set the max number of controllers to 4 since there are 4 USB ports.
And I like the "L1 + R1 + Start + Select" Menu Toggle Gamepad Combo setting, let's face it if you're accidentally hitting this
combination during game play something aint right. Leave the remaining settings and scroll down to the User 1 Binds.
You'll have to setup each user input in this way it's not too bad only takes a minute. Tip: Map the A and B buttons by name not position
if you are using a GameSir controller that way the colors green and red map to positive/select, negative/back button usage. It's just what I
like to do you can map em anyway you like! Or you can set the Menu Swap OK & Cancel Buttons, whatever works.
Wow we are really moving along now. The next step takes a little while but requires very little work on your part.
You just have to click on a few things and wait for them to complete. Navigate back to the Main Menu which is the first
section retroarch starts on. Make sure your are connected to the internet.
Scroll down to the Content Updater and open that section.
I usually run each option in order. Try the Core Updater option first.
Tip: You may have to start retroarch from the terminal like so sudo retroarch when updating core files.
If you run retroarch with a -v for verbose output and you see an error message during the Core Update
command's execution then you should close retroarch and relaunch it with the sudo command.
Next go to the Thumbnails Updater, this part can take a while, and select each system you plan to load ROMs
from one at a time. Resist the urge to click a bunch in a row. I've done that and it can crash the app at the worst
and at the least it slows down each individual process as they are all competing for resources. Best to let one blast
through then move on. Tip: There are some one-off games you can get thumbnails for here like DOOM Demo, Cave Story, and Dinothawr.
You'll be able to load those games from the Content Downloader.
Next up you'll want to back out of the Thumbnail Updater section with the backspace key.
Scroll down to the Content Downloader and download any special content you want from the listing.
Tip: If you see a screen that has no options wait a minute back out and go into that section again it just didn't finish downloading
the index of available options. I usually don't install the one-off games but this is the spot for it. Most of the content I think
you can safely ignore but I'll leave that up to you. Run the following list of other updates one at a time, basically everything
remaining on the list.
Update Core Info Files
Update Assets
Update Joypad Profiles
Update Cheats
Update Databases
Update Overlays
Update GLSL Shaders
Update Slang Shaders
Close retroarch when the update steps are complete. Hang on we're almost there, I actually don't know if I'm telling you that or If I'm telling my self that at this point.
Next up let's load some ROMs. I own a copy of Contra for the NES and I have a version of it in ROM form. Open the odroid home folder
using the link on the desktop. Right click in the folder and create a new directory, name it ROMS. Open the ROMS folder and
create a new folder and name it NES. Obviously you would substitute the NES folder for whatever system you intend to load ROMs for.
Not every single system is supported and some emulators have little caveats like bios files that need to be copied in etc. Many of the older
systems are well supported and straight forward. The C1+ can probably handle SNES and Genesis but I just like to use it for 8bit games. The C2
certainly has enough power for 16bit systems and I like to use it for 8bit, 16bit, and all of the handheld systems.
Once you have all your ROMs placed in the ROMS folder in their own separate folders for each system, this is the best way to do it,
we can start telling retroarch about the files. Fire up retroarch and scroll to the right until you see the Scan Directory option.
Navigate to the ROMS folder, you should see it in the list. Then select one system at a time for scanning. Scanning large ROM sets can
take a while. Again resist the urge to start multiple scans things will go smoother if you let an operation complete before starting a new one.
In this case we only have one ROM, Contra, so it will complete the scan instantly.
Back out of the Scan Directory section and you should now see a little NES controller on the section listing. Scroll to it and
now you should see Contra, or whatever ROMS you were trying to load. Load up a game by selecting it and then selecting a target emulator.
Your game should load up just fine in almost all cases.
Retroarch won't recognize every single rom for every single system. Also you may want to try different emulators
on troublesome ROMs. That's more advanced stuff and I'll cover that in the next tutorial where we wrap everything
up and put a nice bow on it. Congrats you built the hardware and now you configured the software and you can play some games.
Take your time loading up ROMs I'll write up the last little bit in tutorial 3 where we really make your game console pop!
Part 1 of this tutorial which details the hardware configuration can be found here.
Part 3 of this tutorial which details the hardware configuration can be found here.