Raspberry Pi

RetroPie

I downloaded the RetroPie image and installed onto a 4GB SD card using:

sudo dd bs=1048576 if=RetroPieImage_ver1.9.1.img of=/dev/sdX

or:

zcat /opt/download/retropie-4.1-rpi2_rpi3.img.gz |dd bs=1048576 of=/dev/sdX

Only a few packages are installed by default, so go to RetroPie-Setup and run:

sudo ./retropie_setup.sh

and build the emulators you need. I wanted the Atari800 and advmame packages.

There’s a detailed walkthrough, although the first time I followed the instructions I couldn’t ssh into it. I ended up using the vanilla RetroPie image and worked from that.

sudo raspi-config select option 4 choose locales to build (en.us.UTF-8) select default locale (C.UTF-8)

Firmware

There was a problem with sound latency increasing as time goes on; noticable in Stella. I had read reports that the solution was to update firmware using:

sudo rpi-update
sudo reboot

but it still seems to be a problem for me. Hmmm.

US Wifi Configuration

In /etc/default/crda add:

REGDOMAIN=US

In /etc/wpa_supplicant/wpa_supplicant.conf change the lines to:

#country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="YOUR NEWORK NAME"
    psk="YOUR NEWORK PASSWORD"
}

Spinner

Use the spinner and trackball page on the wiki to find out which mouse and axis is registering the spinner, then change the definition in the advmame-1.4.rc file, like:

input_map[p1_dialx] mouse[0,x] mouse[1,x] mouse[2,x] mouse[3,x]
input_map[p1_paddlex] mouse[0,x] mouse[1,x] mouse[2,x] mouse[3,x]

which will map the X axis of each listed mouse controller to the spinner

Mouse Polling

For trackball and spinner emulation, the default polling rate is apparently slow enough that fast movements can cause emulators to see movement in the opposite direction. The solution is to decrease the polling interval by changing a boot parameter by editing /boot/cmdline.txt and adding usbhid.mousepoll={number in ms} where the number to add is:

1000 hz = 1 ms
500 hz = 2 ms
250 hz = 4 ms
125 hz = 8 ms
100 hz = 10 ms

Another reference: from Arcade Controls Wiki

Audio Issues

From the RetroPie wiki: add the line `disable_audio_dither=1` to /boot/config.txt and use alsamixer to turn up the PCM volume to 100%

On the RPi2, I couldn’t figure out the sound latency issues with MAME4All-Pi, so switched to using AdvMAME 1.2 which is on the RetroPi distribution.

Note

Recently, I did find a blog post with a patch to fix this problem. There was also a modification to the mame.cfg file:

# turn on vsync waiting
vsync=yes
waitvsync=yes
inp=inp

I haven’t tried it since I’m happy with AdvMAME.

Screen Orientation

To change to a vertical screen, edit /boot/config.txt:

display_rotate=3

Other Software

To install RexMenu requires the pygame package:

sudo apt-get install python-pygame

Rexmenu

It doesn’t work correctly when the RetroPie splash screen is shown, so you have to disable the splash screen in the config:

sudo ~/RetroPie-Setup/retropie_setup.sh

and change the menu option Configuration/tools -> 825 splashscreen -> Disable splashscreen

Keyboard Configuration

I-PAC default keys

Function

Normal

Shifted

COIN 1

5

COIN 2

6

START 1

1

START 2

2

ESC

1 RIGHT

R arrow

Tab

1 LEFT

L arrow

Enter

1 UP

U arrow

backquote

1 DOWN

D arrow

P (pause)

1 SW 1

L-ctrl

5 (Coin A)

1 SW 2

L-alt

1 SW 3

space

1 SW 4

L-shift

1 SW 5

Z

1 SW 6

X

1 SW 7

C

1 SW 8

V

1 A

P

1 B

ENTER

START 1

1

START 2

2

Esc

2 RIGHT

G

2 LEFT

D

2 UP

R

2 DOWN

F

2 SW 1

A

2 SW 2

S

2 SW 3

Q

2 SW 4

W

2 SW 5

I

2 SW 6

K

2 SW 7

J

2 SW 8

L

2 A

TAB

2 B

ESC

MAME4ALL / AdvMAME Defaults

Editable through config file or UI

Key

Function

5

Insert Coin

1

Start

Arrows

Move

Ctrl

Action Button 1

Alt

Action Button 2

Space

Action Button 3

Mouse

Analog Control (needed for some games)

P

Pause

ESC

Quit MAME

F2

Service Mode

Tab

MAME Options Menu

F-12

Take a screenshot

Atari800 Defaults

Defaults for function keys appear hardcoded.

Key

Function

F1

Built in user interface

F2

Option key

F3

Select key

F4

Start key

F5

Reset key (“warm reset”)

Shift+F5

Reboot (“cold reset”)

F6

Help key (XL/XE only)

F7

Break key

F8

Enter monitor

F9

Exit emulator

F10

Save screenshot

Stella

Default keys:

Exit emulator

Control + q

Cmd + q

Exit game mode/enter launcher mode

Escape

Escape

Enter/exit options mode

Tab

Tab

Enter/exit command mode

Backslash ()

Backslash ()

Enter/exit debugger

Backquote (`)

Backquote (`)

Select Game

F1

F1

Reset Game

F2

F2

Color TV

F3

F3

Black/White TV

F4

F4

Left Player Difficulty A

F5

F5

Left Player Difficulty B

F6

F6

Right Player Difficulty A

F7

F7

Right Player Difficulty B

F8

F8

Save state to current slot

F9

F9

Change current state slot

F10

F10

Load state from current slot

F11

F11

Save PNG snapshot

F12

F12

Pause/resume emulation

Pause

Setting Up Emulators

MAME4ALL

AdvMAME

Install with sudo ~/RetroPie-Setup/retropie_setup.sh in the Managed packages -> opt -> advmame

Config

Some of my changes to the ~/.advance/advmame-1.4.rc:

display_height 1024
display_magnify 1
display_width 1280

input_map[p1_dialx] mouse[0,x] mouse[1,x] mouse[2,x]
input_map[p1_paddlex] mouse[0,x] mouse[1,x] mouse[2,x]

input_map[ui_select] keyboard[0,enter] or keyboard[0,lcontrol]
tempest/input_setting[p1_dialx] keydelta:20,centerdelta:20,sensitivity:20,reverse:0
sbrkout/input_setting[p1_paddlex] keydelta:10,centerdelta:0,sensitivity:35,reverse:1

Recompiling

  • Screenshots are saved in /opt/retropie/configs/mame-advmame/snap

  • hiscore.dat is included in the retropie distro as /opt/retropie/emulators/advmame/1.2/share/advance/hiscore.dat

  • vector game resolution appears to be hardcoded at 640x480, which is terrible. Changing the code is the only way I’ve found that works:

    $ diff -u advance/osd/frame.c.orig advance/osd/frame.c
    --- advance/osd/frame.c.orig    2016-03-24 19:38:51.397223765 -0700
    +++ advance/osd/frame.c 2016-03-24 19:26:03.331435328 -0700
    @@ -2432,8 +2432,8 @@
                    unsigned game_size_x;
                    unsigned game_size_y;
    
    -               mode_size_x = 640;
    -               mode_size_y = 480;
    +               mode_size_x = 1280;
    +               mode_size_y = 1024;
    
                    log_std(("emu:video: insert vector video modes\n"));
    

I recompiled with:

./configure --enable-expat --enable-sdl --enable-zlib --disable-slang --disable-svaglib --disable-static --enable-alsa --enable-fb --disable-oss --enable-freetype --with-emu=mame
make

Atari800

Install with sudo ~/RetroPie-Setup/retropie_setup.sh in the Managed packages -> opt -> atari800

There’s no standard location for atari 800 OS ROM images AFAICT, so I did:

mkdir /usr/share/games/atari800

and put them there. Then the config file in ~/.atari800.cfg specified those locations:

OS/B_ROM=/usr/share/games/atari800/ATARIOSB.ROM
XL/XE_ROM=/usr/share/games/atari800/ATARIXL.ROM
BASIC_ROM=/usr/share/games/atari800/ATARIBAS.ROM

Stella

Note

RetroPie 3.x doesn’t seem to have the problems listed below.

Stella on the RetroPie 2.x image loses sound syncronization for some reason. I compiled my own version from a tutorial for building RetroArch on the pi and it seems to work fine:

sudo apt-get install libasound2-dev git-core
mkdir ~/src
cd src
git clone  git://github.com/libretro/RetroArch.git
cd RetroArch/
make
mkdir ~/bin
cp retroarch ~/bin
git clone https://github.com/libretro/stella-libretro
cd stella-libretro/
make
cp stella_libretro.so ~/bin
cd ~/bin
./retroarch --features

The default aspect ratio wasn’t correct, so I had to change it using the F1 key to get into the libretro config menu, then specified the 5:4 aspect ratio there.

Keyboard configuration

I want to have the emulators use the same layout, obviously, so the I-PAC will send the correct info regardless of what’s being played.

I-PAC

Keycode

MAME

Atari 800

Atari2600

COIN 1

Coin 1

COIN 2

Shift

START 1

1

Start 1

1

START 2

2

Start 2

2

1 RIGHT

RIGHT

Right

Right

Right

1 LEFT

LEFT

Left

Left

Left

1 UP

UP

Up

Up

Up

1 DOWN

DOWN

Down

Down

Down

1 SW 1

lctrl

Button 1

Fire

Fire

1 SW 2

space

Button 2

Space

1 SW 3

enter

Button 3

1 SW 4

lshift

Button 4

1 SW 5

1 SW 6

1 SW 7

1 SW 8

P

Pause

Pause

1 A

ESC

ESC

ESC

ESC (used as shift key)

1 B

F10

Save Screenshot

Save Screenshot

(shifted)

Tab

Menu

2 RIGHT

G

2 LEFT

D

2 UP

R

2 DOWN

F

2 SW 1

A

2 SW 2

S

2 SW 3

Q

2 SW 4

W

2 SW 5

F2

Option

2 SW 6

F3

Select

Select

2 SW 7

F4

Start

Reset

2 SW 8

F10

Save Screenshot

Snapshot (i.e. screenshot)

(shifted)

F9

Quit

Quit

2 A

2 B

The cabaret has slightly different wiring on the console buttons, so:

I-PAC

Keycode

MAME

Atari 800

Atari2600

1 A

ESC

ESC

ESC

ESC (used as shift key)

2 A

F10

Save Screenshot

Save Screenshot

2 B

P

Pause

Pause

RetroArch

The retroarch config files are stored in /opt/retropie/emulators/retroarch/configs and uses the following specification:

input_player1_a = x
input_player1_b = z
input_player1_y = a
input_player1_x = s
input_player1_start = enter
input_player1_select = rshift
input_player1_l = q
input_player1_r = w
input_player1_left = left
input_player1_right = right
input_player1_up = up
input_player1_down = down

Can also use /opt/retropie/emulators/retroarch/bin/retroarch-joyconfig –timeout 5 >> ~/RetroPie/configs/all/retroarch.cfg to prompt for controls

For some reason, the default input remapping options (in the Retroarch config using the F1 key) the B button is mapped as the primary fire button.

Core input remapping broken? http://blog.petrockblock.com/forums/topic/how-can-i-use-core-specific-button-remapping-for-retroarch-emulators-3-0-beta-2/

EmulationStation

Turning off EmulationStation

EmulationStation is autostarted from the /opt/retropie/configs/all/autostart.sh file.

Old Notes

I don’t use EmulationStation any more, but here’s some notes from when I did.

http://blog.petrockblock.com/forums/topic/updated-python-scraper-for-emulationstation/

game databases:

  • thegamesdb.net

  • archive.vg

Procedure to scrape, but EmulationStation must not be running or the generated metadata file stored in /home/pi/.emulationstation/gamelists/[platform]/gamelist.xml will be overwritten:

sudo apt-get install python-imaging
git clone https://github.com/thadmiller/ES-scraper.git
cd ES-scraper
python scraper.py -pisize -name atari2600 -platform atari2600
  • Removing retropie config menu from emulation station: rename the ~/RetroPie/retropiemenu folder to something else and it won’t show up

  • Change F4 to F9 to exit

F4 appears to be hard-coded as the exit key. The SDL keycode for F4 is defined in input files:

$ grep SDL_SCANCODE_F4 /usr/include/SDL2/*
/usr/include/SDL2/SDL_keycode.h:129:    SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4),
/usr/include/SDL2/SDL_scancode.h:156:    SDL_SCANCODE_F4 = 61,

and SDL_SCANCODE_TO_KEYCODE is defined as (1<<30), so the hex value is:

$ python
Python 2.7.5 (default, Oct 11 2013, 13:42:33)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> hex(1<<30|61)
'0x4000003d'

So, the RPi being little endian, searching for the byte string “3d000040” yields one hit:

$ grep -obUaP "\x3d\x00\x00\x40" /opt/retropie/supplementary/emulationstation/emulationstation

113685:=@

It only occurs once, so we’ll assume that’s the right place. I want to change it to F9, which is SDL_SCANCODE_F9 or 61 (hex 42). So, need to change byte 0x1bc15 to 0x42

UPDATE: Nope, that didn’t work:

./emulationstation: relocation error: ./emulationstation: symbol nfo_injectorISt13runtime_errorEEE5cloneEv, version CXXABI_1.3 not defined in file libstdc++.so.6 with link time reference

UPDATE #2: Six hours later, I compiled emulationstation from source following the instructions, the only change being:

diff --git a/es-core/src/InputManager.cpp b/es-core/src/InputManager.cpp
index 3bd26b8..9827e51 100644
--- a/es-core/src/InputManager.cpp
+++ b/es-core/src/InputManager.cpp
@@ -210,7 +210,7 @@ bool InputManager::parseEvent(const SDL_Event& ev, Window* window)
                if(ev.key.repeat)
                        return false;

-               if(ev.key.keysym.sym == SDLK_F4)
+               if(ev.key.keysym.sym == SDLK_F9)
                {
                        SDL_Event* quit = new SDL_Event();
                        quit->type = SDL_QUIT;

and compiling on the master branch, not the unstable branch as recommended in the instructions.

AdvMAME 1.2

On the RPi2, I couldn’t figure out the sound latency issues, so switch to trying AdvMAME 1.2 which is on the RetroPi distribution.

Screen Blanking

I have been leaving my monitor on 24/7, but this is both wasting energy and shortening the life of the monitor. There doesn’t appear to be any config option to enable a screen saver of any sort in AdvMAME, and most of the other emulators would forceably deactivate the screen savers anyway. It might be automatic in SDL.

I discovered some commands for the RPi that can manage the screen, so I’m attempting to write a python script to turn on screen blanking after some amount of inactivity. This is relatively easy for the moment because all my inputs are based on keyboard encoders, and with a python library it is possible to link into the evdev library to detect input.

tvservice seems pretty flaky. tvservice -o reliably turns the monitor off, into DPMS powersave mode. But tvservice -p; fbset -depth 16 only seems to work the first time.

Tried disabling the console screen blanking by changing /etc/kbd/console to BLANK_TIME=0, but it didn’t seem to matter.

The addition of fbset -depth 8 seems to work a second time, but not the third time as it causes the advmame to lock up. Finally, I found a forum post that described how the framebuffer would get stuck and that changing some setting provided a workable solution, using text acceleration because it was a trivial setting:

  • off: fbset -accel false; tvservice -o

  • on: tvservice -p; fbset -accel true

Monitor Orientation

The pi can boot with the monitor with any side up using the display_rotate command in /boot/config.txt:

  • normal: display_rotate=0

  • 90 degrees ccw: display_rotate=1

  • 180 degrees: display_rotate=2

  • 90 degrees cw: display_rotate=3