Successfully compiled the full and complete version of MAME 0.171+ on a Raspberry Pi 2.
Why would I want to compile the full version of MAME? Because it’s the latest version and is continually being updated with more accurate emulation of old hardware. A lot of the emulation I want is from the early 1980’s and it successfully emulates games and computers of this era at 100%. Plus it has some really powerful imgtools to work with emulated disks and cassette/cartridge files for computer emulations. Version 0.171 now incorporates BGFX the unified GPU backend which speeds up emulation.
I’m an old programmer who came from programming my CoCo (TRS-80 Color Computer) in BASIC then I learned 6809 Assembly language. I have given learning ‘C’ many tries over the years but I always have problems compiling my code once my programs start getting big. I waste more time fighting with compiling than I do writing my programs in these structured languages, so please don’t think I’m a guru at compiling ‘C’ source code.
With the help of Steve Boswell and his site located here and some good compiling info for the Raspberry Pi here and more specifically SDL2 on a Raspberry Pi here.
The MAME source code compiles on the Raspberry Pi 2 without any modification to the source code. But you have to tweak a line in the MAME makefile, which I describe below (thanks to Steve Boswell). You just have to make sure you have the proper libraries installed on the Pi and you give it enough RAM to compile and you are good to go. It does take a long time to compile, the first “tiny” test build takes 31 minutes. The main MAME compile afterwards took 5 hours and 32 minutes using the make -j4 option which uses all four of the Pi 2 cores. This is on my Pi 2 overclocked @ 1000 Mhz. I did a brand new install of the latest Raspbian build called “Jessie” to a Class 10 – 16 GB microSD card. This version of Raspbian comes with GCC 4.9.
As always update apt:
sudo apt-get update sudo apt-get upgrade
Install the required libraries:
sudo apt-get install libjpeg-dev libtiff-dev libgl1-mesa-dev qt5-default libxinerama-dev sudo apt-get install build-essential libfreeimage-dev libopenal-dev libpango1.0-dev libsndfile-dev libudev-dev libasound-dev libwebp-dev automake
You might already have this, if not it should be added (Doesn’t hurt to add it)
sudo apt-get install libx11-dev Install mercurial hg command (hg seems to be similar to git) and the latest SDL 2.0.4+ under SDL Mercurial. The make -j4 takes about 4 minutes and 37 seconds:
sudo apt-get install mercurial cd hg clone http://hg.libsdl.org/SDL cd SDL ./autogen.sh ./configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --host=armv7l-raspberry-linux-gnueabihf make -j4 sudo make install
Install the latest True Type Font handling of SDL, you can find it on the SDL website:
https://www.libsdl.org/projects/SDL_ttf/
Look for the file SDL2_ttf-2.x.xx.tar.gz at the time of this writing it was
SDL2_ttf-2.0.14.tar.gz so that is what is used in the next section substitute the version you found on the line below
cd wget http://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.14.tar.gz tar zxvf SDL2_ttf-2.0.14.tar.gz cd SDL2_ttf-2.0.14 ./autogen.sh (don't worry about any warning: autoconf input should be named 'configure.ac', not 'configure.in' that's normal) ./configure make -j4 sudo make install
Now the main event – get version 0.171 version of MAME
cd wget https://github.com/mamedev/mame/releases/download/mame0171/mame0171s.zip mkdir mame0171 unzip mame0171s.zip -d mame0171 cd mame0171 unzip mame.zip
use nano and edit the makefile, change the one line with # ARCHOPTS to
ARCHOPTS = -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
Make sure to remove the # at the start of the line. (Lines that start with # are ignored in the makefile)
nano makefile # ARCHOPTS
to
ARCHOPTS = -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
CTRL-X Y Return
Let’s get ready to compile the complete MAME version, as of version 0.162 it also includes the MESS emulator so when you are done you can also use MAME to emulate your favourite old computer. You don’t need a separate MESS command anymore. MAME has MESS built in. First let’s give the Pi all the RAM we can:
sudo raspi-config
Go to Advanced Options then select Memory Split and hit Return and change this value to 16, then OK and Finish, No don’t reboot yet.
sudo nano /etc/dphys-swapfile
Change CONF_SWAPSIZE=100 to CONF_SWAPSIZE=2048, then hit CTRL-X, Y and hit Enter
It is not good for your SD cards lifespan to keep it this way so don’t forget to change it back after you are done. I do show you how to set it back to normal below.
sudo reboot
Once your Pi reboots it’s time to compile the complete version of MAME this includes building the tools to help if we are using the Emulator with disk and files for specific old computers this took 4 hours and 9 minutes:
cd ~/mame make -j4 TARGET=mame
To build the tools for using cassette and floppy images with MAME’s computer emulation do the following (seems like the makefile is broken it should work with make -j4 TOOLS=1):
nano makefile
remove the # symbol on the line
# TOOLS = 1
so it looks like
TOOLS = 1
Ctrl-X, Y , Return
make -j4
After MAME is compiled you must allocate more RAM to the GPU before you can use it otherwise SDL will give an error when you try to run MAME. We set the GPU back to normal in the steps below.
Once the compiling is all done lets switch our memory usage back to normal:
sudo raspi-config
Go to Advanced Options then select Memory Split and hit Return and change this value to 256, then OK and Finish, No don’t reboot yet.
Now lets put the swap space back to normal to extend our SD cards lifespan
sudo nano /etc/dphys-swapfile
Change CONF_SWAPSIZE=2048 to CONF_SWAPSIZE=100, then hit CTRL-X, Y and hit Enter
Now we reboot to take our new changes:
sudo reboot
Once the Pi 2 reboots, there is one last step, for MAME to run the SDL Library has to be configured differently once it is used to compile MAME. Follow this step to get MAME working…
cd SDL ./autogen.sh ./configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl --host=armv7l-raspberry-linux-gnueabihf make -j4 sudo make install
We are now ready to use the full version of MAME. You will have to look elsewhere on the internet to find ROMs – I can’t help you with that other than the free ones from the mamedev.org website under downloads | ROMs. You will have to make a directory called roms in the MAME directory
cd cd mame0171 mkdir roms
Put your .zip or .7z (either will work fine) versions of your ROMs of old games and computers in the ~/mame0171/roms folder and play them with the command:
cd ~/mame0171 ./mame galaxy
I’ll do some speed comparison tests later today with my previous post of version 0.167 and I’ll update this section with the results. Hopefully the BGFX features of 0.171 make a difference…
Game Speed Percentage mame0.167 mame0.171 RPI2 @900Mhz RPI2 @1000Mhz 1942 73.72 80 arkanoid 100 100 armora 47.78 100 asteroid 78.38 99.91 berzerk 100 100 ckong 100 100 defender 99.98 100 galaga 100 need new roms :( joust 100 100 invaders 100 100 mooncrst 90.99 99.79 mpatrol 100 100 phoenix 98.35 99.84 puckman 100 100 robotron 100 100 scramble 69.63 82.04 spacduel 59.08 82.03 starcas 91.43 100
So 1942, Scramble & Space Duel still aren’t 100%. I guess there were new Galaga ROMs found and are used for 0.171.
I found a cool little trick on Stack overflow that makes it easy to time how long some process takes. Useful for timing compiling times and such.
SECONDS=0 # do some work (like compiling some code) duration=$SECONDS echo "$(($duration / 3600)) hours, $((($duration / 60) % 60)) minutes and $(($duration % 60)) seconds elapsed."
So in one line this would be:
SECONDS=0 ; make -j4 ; duration=$SECONDS ; echo "$(($duration / 3600)) hours, $((($duration / 60) % 60)) minutes and $(($duration % 60)) seconds elapsed."
Cheers, Glen
Hi Glen,
I finnaly made to compile 0171 with your great tutorial.
Emulator works, but it seems only in soft mode (set to auto by default) and if I choose something else for video option (opengl or bfgx) emulator crashed with Segmentation fault and Raspberry Pi 2 freeze.
Just for comparision, can you start this computer with ./mame galaxy and tell me what speed you get.
In older version with hwblit scalemode and slight frameskip I acheive near 100% speed, but with 0171, just 62%.
I noticed da this latest version doesnt work with hwblit scalemode at all, even with soft video mode set.
Can you please tell me whats going on here, compile process went flawlessly and I hope to get more speed gain, but nothin happens at least with several computers Im tryin.
Cheers,
Pegaz
Hi Pegaz,
I’m glad this tutorial was helpful to you. I’m just compiling the emulator tools, it seem like the options on the command line aren’t being accepted by the make command unless I’m doing something wrong. I tried to compile the tools with “make -j4 TOOLS=1” but it didn’t do anything. I then edited the makefile and made the same option available and it is now compiling the tools So maybe we can compile it again with NO_X11 and NO_OPENGL selected from the makefile manually… I’ll have to do more testing and I’ll update this post when I do.
I’ll try ./mame galaxy and I’ll tell you what speed I get, but it will have to wait a little while.
Cheers,
Glen
Hi again Pegaz,
I tested ./mame galaxy after rebooting my RPI2 to the console (not the desktop) overclocked at 1000 Mhz and it only ran at 35.77% (no frame skip or any tweaks). Just curious, what computer emulator is this?
I’ll test some other roms and see how they compare to my speeds of the 0.167 compile I did a few months ago.
Afterwards I’ll mess around with the makefile and see if I can compile it with NO_X11 and NO_OPENGL to see if that helps. I’ll update this post with the results.
Cheers,
Glen.
Well, something definitelly isnt good, becouse I have near 100% with same machine in 0170 build with soft rendering.
I tested Steve 0171 binary and get the same result with galaxy about 30% of speed, without overclock.
Is there a way to determine whether this is really bfgx or maybe software renderer is still active?
Every time when I choose OpenGl or bfgx in video options, Rpi2 crashed and freeze, so maybe we still not activate acceleration support.
Can you check this video options in your setup to be sure?
It would be nice to ask Steve to test also, becouse he said that speed is better overal.
He also said that doesnt have experimental Opengl driver installed (https://www.raspberrypi.org/blog/another-new-raspbian-release/) and I still dont get it, how he managed to activate hw acceleration or we are all mistaken.
Btw, galaxy is old eastern Europe computer.
Hi Pegaz,
There are definite speed improvements on some of the games vs 0.167 like Armora. I wonder if it is because it’s a vector graphics based game? Same with Asteroids and Space Duel. They have sped up too. So maybe certain types of graphics are being helped by the BGFX features of 0.171 but it must have slowed down the CPU/motherboard emulation somehow according to your comparisons with 0.170.
I don’t know enough about compiling and the various options that can be selected. I think you should ask Steve to see if he can look into it further.
Another thought, sometimes programmers will add in new features to a program and not optimize it until it is proven that it is working properly. Maybe when they added BGFX they had to tweak other features in MAME to work with BGFX that is causing your slow down… If that is what happened maybe the next release of MAME will be more optimized.
FYI – I download the bleeding edge version of MAME from GIT and tried to compile it but it required GCC 5.1 which isn’t available for RPI. There are some people who have compiled their own GCC 5.1 and one post mentioned that they added multithreading support called click (or something). If it’s possible to compile MAME to use the multiple cores of the RPi2 that would be awesome. One core for the CPU emulation, one Core for other parts of the motherboard. Of course this is just me dreaming right now, but maybe one day. MAME already has a -multithread option. 🙂
I hope Steve can help you figure out why 0.171 is slower for your emulation needs,
Glen
Thanks Glen, thats my toughts exactly.
I think that Mess part in 0171 doesnt have benefit of hardware acceleration, like mame arcade games.
Steve already tried few computers (Atari 800xl and BBC B) and speed is also very slow and unusable.
For now, best bet for me is tryin to compile old versions like 0149, mentioned in Steves blog.
The problem is, that I have problem to compile those old versions, but I will give another try.
I dont want to bother you with this, but if you have time to look at it, I will apprecite it.
Your tweak with scalemode, makes many of my wandered old computers to work and I am very grateful for this.
Cheers,
Pegaz
Glen, I successfully compiled mame 0.171 on my Pi2 using your step by step guide. Thank you! Looks like hardware acceleration is slowly being figured out. Nice!
I just tried this exact same method with the newer 0.172 source code. It compiled ok without error, but took over an hour longer. I still need to transfer some roms over to it and test though. If there are any tips during the process to get a more optimized compile with 0.172, please let us know.
Hi Eric,
I haven’t tried to compile .172 yet and I’m not an expert at compiling, but when I do give it a try I’ll report my findings. I noticed myself that different microSD cards can affect compile time a lot. Are you using the same microSD card? I’m just curious…
Can remember if it’s the same card. The one I use now is a class 4 card, so maybe that’s the slowdown.
Ok, I tested it. While version 0.172 compiles without error. It does not seem to run without error. I get the following error when trying to run any game. So it’s a no go so far. and that first line does show up twice.
pure virtual method called
pure virtual method called
Segmentation fault
Did you give the Pi back it’s GPU memory? Maybe it needs a little more? Just a thought…
Yes tried more memory but it still does not work. I will try to recompile again from scratch, just in case I made a mistake.
Had time to try and compile again, but still no luck. Started with fresh and updated Raspbian image. Followed same exact procedure from 0.171, but getting errors on program execution with 0.172, even though it compiles without error, and it’s above my capability to figure out why it does not work. I also tried binaries from another site, but still same errors on most games. Like you Glen, I’m no expert at compiling either. Thank you for the earlier guide, and please do report your findings when you give 0.172 a go. Thanks!
Awesome. I guess I have a new winter project. (And another, when I get my CoCo 3 set up and try your Space Invaders port 😉
this has been a while but I get hung up on the compile of mame
the errors I get are:
“makefile:1040: recipe for target ‘linux’ failed” when compiling Mame I am running retropie1 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l GNU/Linux
gcc ver
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v –with-pkgversion=’Raspbian 4.9.2-10′ –with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs –enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ –prefix=/usr –program-suffix=-4.9 –enable-shared –enable-linker-build-id –libexecdir=/usr/lib –without-included-gettext –enable-threads=posix –with-gxx-include-dir=/usr/include/c++/4.9 –libdir=/usr/lib –enable-nls –with-sysroot=/ –enable-clocale=gnu –enable-libstdcxx-debug –enable-libstdcxx-time=yes –enable-gnu-unique-object –disable-libitm –disable-libquadmath –enable-plugin –with-system-zlib –disable-browser-plugin –enable-java-awt=gtk –enable-gtk-cairo –with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf/jre –enable-java-home –with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf –with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-armhf –with-arch-directory=arm –with-ecj-jar=/usr/share/java/eclipse-ecj.jar –enable-objc-gc –enable-multiarch –disable-sjlj-exceptions –with-arch=armv6 –with-fpu=vfp –with-float=hard –enable-checking=release –build=arm-linux-gnueabihf –host=arm-linux-gnueabihf –target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.9.2 (Raspbian 4.9.2-10)