Mehr als ein proof of concept denn als ernst gemeintes Projekt, habe ich versucht Vice in der aktuellen Version 3.6.1 auf dem ältesten mir zur Verfügung stehenden Raspberry Pi zu installieren.
Ziel ist es eine funktionierende C=64 Emulation inkl. Sound (HDMI) und Joystick Support (SpeedLink Competition Pro USB) zu haben die hoffentlich problemlos meine alten Lieblingsspiele ausführen kann. Natürlich kann ich all das erheblich einfacher haben, zB mit einem moderneren Raspberry Pi Modell und einem aktuellen RetroPi Image, aber wo bleibt da der Spaß?!
Hardware/OS
Zum Einsatz kommt ein Raspberry Pi Model B Rev 2, ausgestattet mit einer 4GB XDHC SD Karte und einem moderaten Overclocking auf 900MHz. Das ganze verbaut im Original Case welches um einen kleinen Lüfter erweitert wurde. Auf der SD Karte installiert wurde mit dem Raspbery Pi Imager das aktuelle Raspberry Pi OS Lite (32-bit) vom 04.04.2022, basierend auf Debian 11 (Bullseye).
Zunächst brauchte es ein bisschen Housekeeping, und die Installation der für die Übersetzung von Vice notwendigen Tools/Libraries.
:~/ $ sudo apt-get update
:~/ $ sudo apt-get dist-upgrade
:~/ $ sudo apt-get install flex byacc dos2unix xa65 libsdl1.2-dev libsdl-image1.2-dev
Anmerkung/Spoiler: später in diesem Artikel hat der Raspberry Pi zu wenig (Swap-)Speicher um die Übersetzung von Vice abzuschließen. Wer meine Schritte nachvollziehen mag erhöht am besten schon hier den verfügbaren Swapspace (siehe weiter unten).
Nun konnte ich den Quellcode herunterladen, auspacken und den Build konfigurieren. Ziel hier war eine ohne X11 lauffähige, möglichst schlanke und performante Version zu erstellen. Ob mir das gelungen ist muss sich erst später zeigen.
:~/ $ wget https://sourceforge.net/projects/vice-emu/files/releases/vice-3.6.1.tar.gz
:~/ $ tar xvzf vice-3.6.1.tar.gz
:~/ $ cd vice-3.6.1
:~/vice-3.6.1 $ ./configure --enable-sdlui --without-pulse --with-fastsid --without-resid --disable-arch --disable-pdf-docs
Zusammenfassung am Ende von Configure (nach ca. 5 Minuten):
----------------------------------------------------------------------
configure summary:
Platform canonical : armv6l-unknown-linux-gnueabihf
Architecture : Unix
GUI : SDL1
Multithreaded UI : no
OpenMP : yes
SCREEN/UI
---------
Hardware scaling support : yes
SOUND
-----
FastSID support : yes (--with/without-fastsid)
ReSID support : no (--with/without-resid)
New 8580 filter support : yes (--enable/disable-new8580filter)
PortAudio sound input support: no (--enable/disable-portaudio)
OSS sound support : no (--with/without-oss)
ALSA sound support : yes (--with/without-alsa)
Pulseaudio sound support : no (--with/without-pulse)
SDL sound support : yes (--with/without-sdlsound)
NetBSD/Solaris sound support : no
MIDI support : no (--enable/disable-midi)
Catweasel MK3 support : no (--enable/disable-catweasel)
HardSID support : no (--enable/disable-hardsid)
ParSID support : no (--enable/disable-parsid)
SSI2001 support : no (--enable/disable-ssi2001)
direct I/O access support : no
lpt port access : no
PCI utils support : no
MP3 encoding support : no (--enable/disable-lame)
MP3 decoding support : no (--with/without-mpg123)
FLAC en/de-coding support : no (--with/without-flac)
Vorbis en/de-coding support : no (--with/without-vorbis)
SCREENSHOTS
-----------
GIF encoding support : no (--with/without-gif)
JPEG encoding support: no (--with/without-jpeg)
PNG encoding support : yes (--with/without-png)
VIDEO RECORDING
---------------
FFMPEG support : no (--enable-external-ffmpeg)
FFMPEG swscale support : no
INPUT
-----
Mouse support : yes
Lightpen support : yes
Linux style joystick support: no
BSD style joystick support : no
USB joystick support : no
MODEM/NETWORK
-------------
RS232 device support : yes (--enable/disable-rs232)
Network support : yes
RS232 network support : yes
IPv6 network support : yes (--enable/disable-ipv6)
Network capture/injection support: no (--enable/disable-ethernet)
libcurl support : no (--with/without-libcurl)
DRIVE
-----
Real device (OpenCBM support) : yes (--enable/disable-realdevice)
X64 image support : no (--enable/disable--x64-image)
LIBS
----
Dynamic linking support : yes
POSIX 1003.1e capabilities support: no
zlib support : yes (--with/without-zlib)
libieee1284 support : no
DOCUMENTATION
-------------
Generate Info/text: yes
Generate PDF : no (install texinfo)
Generate HTML : yes
MISC
----
65xx CPU history support : no (--enable/disable-cpuhistory)
Debug support : no (--enable/disable-debug)
Threading debug support : no (--enable/disable-debug-threads
Build old x64 emulator : no (--enable/--disable-x64)
Install XDG .desktop files : no
icotool for Windows found : no
User CPPFLAGS:
VICE_CPPFLAGS: -I$(top_srcdir)/src/systemheaderoverride -DNDEBUG
User CFLAGS: -g -O3 -W -Wall -Wextra -Wformat -Wformat-signedness -Wshadow -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wuninitialized -Wunreachable-code -Werror=implicit-function-declaration -Wfatal-errors -Wdiscarded-qualifiers -Wno-sign-compare -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wno-unused-parameter -fopenmp -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
VICE CFLAGS: -g -O3 -W -Wall -Wextra -Wformat -Wformat-signedness -Wshadow -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wuninitialized -Wunreachable-code -Werror=implicit-function-declaration -Wfatal-errors -Wdiscarded-qualifiers -Wno-sign-compare -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wno-unused-parameter -fopenmp
User CXXFLAGS: -g -O3 -Wall -Wformat -Wshadow -Wpointer-arith -Wuninitialized -Wunreachable-code -Wno-unused-parameter -Wfatal-errors -fopenmp -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
VICE CXXFLAGS: -g -O3 -Wall -Wformat -Wshadow -Wpointer-arith -Wuninitialized -Wunreachable-code -Wno-unused-parameter -Wfatal-errors -fopenmp
VTE_CXXFLAGS: -Wno-address-of-packed-member -Wno-char-subscripts -Wno-format-signedness -Wno-c99-designator -Wno-shorten-64-to-32 -Wno-nonnull-compare
MONITOR_CFLAGS: -Wno-unused-label -Wno-unreachable-code -Wno-misleading-indentation
User LDFLAGS:
VICE LDFLAGS: -fopenmp
----------------------------------------------------------------------
Also weiter zum eigentlichen Build:
:~/vice-3.6.1 $ make
Abgesehen von ein Paar Warnings lief der Prozess zunächst für fast 2 Stunden langsam aber problemlos, wurde dann aber jäh unterbrochen:
cc: fatal error: Killed signal terminated program cc1
compilation terminated.
make[3]: *** [Makefile:543: scpu64cpu.o] Error 1
make[3]: Leaving directory '/home/pi/vice-3.6.1/src/scpu64'
make[2]: *** [Makefile:1901: all-recursive] Error 1
make[2]: Leaving directory '/home/pi/vice-3.6.1/src'
make[1]: *** [Makefile:1666: all] Error 2
make[1]: Leaving directory '/home/pi/vice-3.6.1/src'
make: *** [Makefile:516: all-recursive] Error 1
Ich hatte zwar die meiste Zeit in einem separaten Terminal mit htop einen Blick auf die Systemauslastung, war aber just in diesem Moment nicht am Platz. Daher wusste ich zunächst nicht was genau passiert war.
Meine Vermutung ging aber sofort hin zum doch sehr begrenzten Speicher dieses Raspberry Pi Modells, zudem ist der Swapspace bei Raspberry OS mit 100MB per Default sehr eng bemessen.
Es folgte also ein kurzes Intermezzo um den Swapspace auf 512MB zu erhöhen:
:~/vice-3.6.1 $ sudo dphys-swapfile swapoff
:~/vice-3.6.1 $ sudo sed 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=512/' /etc/dphys-swapfile
:~/vice-3.6.1 $ sudo dphys-swapfile setup
want /var/swap=512MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 512MBytes
:~/vice-3.6.1 $ sudo dphys-swapfile swapon
Anschließend konnte der Prozess an der fraglichen Stelle wieder aufgenommen werden:
:~/vice-3.6.1 $ make
Nach insgesamt etwa 3,5 Stunden war die Kompilierung dann endlich erfolgreich abgeschlossen, abschließend folgte noch die Installation:
:~/vice-3.6.1 $ sudo make install
Und nun? Soweit erfolgreich, oder? Also wurde der x64sc erstmalig gestartet:
:~/vice-3.6.1 $ x64sc -sdlbitdepth 8
An irgendeinem Punkt überschreitet Vice offenbar die Hardwarekapazitäten des kleinen Pi. Der Start gelang zwar insofern als das SDL offenbar initialisiert wurde, aber nie einer Anzeige irgendwelcher Elemente kam. Genauer: der Bildschirm blieb einfach dauerhaft schwarz.
dmesg an der SSH Konsole liess übles erahnen, die Details wollte ich mir aber erst später anschauen, denn ich war nach der Zeit nun einfach zu müde.
Der x64sc Prozess liess sich jedenfalls auch nicht mehr beenden, nicht für „Geld und gute Worte“, und auch nicht mit einem SIGTERM. Ein beherztes SIGKILL funktionierte natürlich, jedoch bliebt die Anzeige weiter in ihrem undefinierten Zustand.
Nun, das war der erste Versuch… mit etwas über 4,5 Stunden wahrlich kein Schnellschuss, aber ein Anfang.
There’s more to come…