• chevron_right

    Running Super Nintendo (SNES) games on my OSMC equipped Raspberry Pi media center.

    Roelof Pieter – Thursday, 16 November, 2017 - 19:12 edit

#howto #osmc #snes #games #raspberrypi

Edit: Updated with script to create backup of the save file

I have a Raspberry Pi 2 mediacenter running OSMC. I have spent quite some time in getting the SNES emulator Pisnes to work on it. An "easy" solution to this would be to install Retrosmc. But this installs so much more than needed. When I tried this installing took a few hours on my Raspberry Pi 2. It also makes the whole install much more complex with installing: Retropie, Emulationstation, lots of emulators etc... . Overkill for me. But getting just Pisnes to run wasn't easy (for me). I tried a lot of different combinations of settings but ran in trouble all the time. Pisnes wouldn't start or there was no sound or the buttons of my game controller didn't react (the control-sticks and the d-pad did though. Huh?!). Installing Retrosmc did learn me that it could work. So with new hope I started again and finally got it running.

In the end I managed to get it to work. For this I used some scripts supplied by retrosmc and molded them for my needs. Finally I am able now to start my media center, browse to the game in question and fire it up. It basically works as follows:

  1. I use Advanced Emulator Launcher to start the game. Advanced Emulator Launcher calls the first script.
  2. The first script (pisnes.1.sh) is begins with stopping several services. At least the mediacenter (Kodi) service. And in my case also some services for the web server I am running. This frees up CPU cycles, needed for the emulator.
  3. Then it calls another script (pisnes.watchdog.sh) that keeps checking in the background whether Pisnes ('snes9x' process) is still running. When not (so when I stopped playing) it will start those services again.
  4. After starting the watchdog script it will then launch pisnes in an openvt session. This helps against problems with sound and the controller I believe.
  5. The actual start of pisnes is done through another script: pisnes.2.sh. Combining the first and the second scripts have been fruitless for me, so I'll just keep it this way. This second script starts Pisnes with the requested ROM file, so I can play the game. It also redirects ALSA sound from the 3,5mm-jack output to HDMI output.

I normally use the 3,5mm-jack output to listen to internet radio (Studio Brussel) on my connected stereo through MPD. This can also be done in Kodi alone, but now I don't have to start the TV only to listen to some radio. Just fire up the app on my phone or laptop.

pisnes.1.sh :

This is the script that is first called from Advanced emulator launcher. I am not really sure what everything does exactly or why, but hey: It works. In this and the following scripts I mainly searched and replaced "emulationstation" for "pisnes" in the original scripts. And I cleaned up stuff that didn't seem relevant.

# This scripts starts the pisnes watchdog deamon and
# pisnes itself while stopping KODI mediacenter and some
# other "heavy" services afterwards.
# Script by mcobit, edited by roelofpieter

# clear the virtaul terminal 7 screen
sudo openvt -c 7 -s -f clear

# start the watchdog script
sudo su osmc -c "sh /opt/pisnes/pisnes.watchdog.sh &" &

# start pisnes on virtual terminal 7 and detach it
sudo su osmc -c "nohup openvt -c 7 -f -s /opt/pisnes/pisnes.2.sh $1 >/dev/null 2>&1"

# clear the screen again
sudo openvt -c 7 -s -f clear

# wait a bit to make sure pisnes is running detached from kodi
sleep 0.5

# stop kodi and other "heavy" services to free cpu and input
# devices for pisnes. And mpd because of the sound output
sudo su -c "systemctl stop mediacenter &" &
sudo su -c "systemctl stop nginx &" &
sudo su -c "systemctl stop php5-fpm &" &
sudo su -c "systemctl stop mysql &" &
sudo su -c "systemctl stop mpd &" &


pisnes.watchdog.sh :

This script keeps running in the background and will restart Kodi (and other services in my case) when pisnes is stopped.


# Script by mcobit, edited by roelofpieter

# give pisnes time to start up
sleep 8

# check for pisnes (snes9x) running
while [ true ]; do
    VAR1="$(pgrep snes9x)"

# if pisnes (snes9x) is quit, clear the screen of virtual terminal 7 and show a message
    if [ ! "$VAR1" ]; then
        sudo openvt -c 7 -s -f clear

# restart kodi and other "heavy" services. And mpd...
    sudo su -c "sudo systemctl restart mediacenter &" &
    sudo su -c "sudo systemctl restart mpd &" &
    sudo su -c "sudo systemctl restart mysql &" &
    sudo su -c "sudo systemctl restart php5-fpm &" &
    sudo su -c "sudo systemctl restart nginx &" &

# exit script

# if pisnes is still running, wait 2 seconds and check again (could probably be longer, but doesn't seem to impact performance by much)
    sleep 2


pisnes.2.sh :

And this script will start the actual game. Additionally it will create a backup of the save file. Should I accidentally overwrite it (with a single button press, namely the right "shoulder" button) I always have a copy of the file.


# Redirect the sound to the television
amixer cset numid=3 2

# Make a backup copy of the save file. Pisnes runs as root, hence the savefile location.
fullromfile=$(basename "$1")
sudo cp /root/.snes96_snapshots/$romfile.000  /root/.snes96_snapshots/$romfile.000.$(date  %Y%m%d%H%M%S)

# Start the actual game
sudo /opt/pisnes/snes9x $1

# Redirect the sound back to external output
amixer cset numid=3 1

Advanced emulator launcher

I didn't find the Advanced emulator launcher very intuitive at first. This is how I set it up the basics. First I created a new launcher of the type "ROM launcher (Emulator). Since I installed pisnes and it's roms in /opt/pisnes the launcher application is /opt/pisnes/pisnes.1.sh on the SD card. The roms path is (for me) /opt/pisnes/roms/. The file extension is "smc". I could tell this by looking at the rom files ;-) . Application argument is the default "$ROM$", but I have no idea if this matters. I gave it a name and for platform I obviously choose Nintendo SNES. The scraped artwork goes into /opt/pisnes/roms/artwork. Then I added ROMs by choosing " Add ROMs > Scan for new ROMs". From there on I could select a ROM and launch it.

Phew. And now: Zelda!