Der heutige Beitrag ist aus einem kleinen Projekt entstanden. Ziel ist es, zum Beispiel an einem Notebook und ggf. Videoprojektor im Garten mit Freunden sitzen zu können und die alten Computerspiele aus der Kindheit zu spielen. Einfach nur aus Spaß.

Damit alles angemessen „präsentiert“ werden kann, empfiehlt es sich mit Emulation Station zu befassen.

Siehe hierzu: http://www.emulationstation.org

Damit die Einrichtung nicht für alle Windows basierenden Systeme erneut durchgeführt werden muss, empfiehlt es sich dies als portable Lösung zu realisieren. Hier zusammenfassend meine Lösung.

Als Basis verwende ich einen älteren PC von ca. 2009, mit SSD und aktuellem Windows 10 (64bit). Als Controller verwende ich einen Xbox 360-Controller mit USB-Adapter.

Die Einrichtung ist jedoch nicht ganz trivial und es sind mehrere Aspekte zu beachten. Der zeitliche Aufwand zur Einrichtung, sobald das System verstanden wurde, ist jedoch überschaubar.

Zur Einrichtung von mir verwendete Tools sind:

Download und Vorbereitung EmulationStation

Zu Beginn laden wir für Windows die Variante zip file über folgende Seite:

http://emulationstation.org/#download

emulatorstation_download

herunter und entpacken diese. Den Inhalt speichern wir direkt auf einem USB-Stick im Verzeichnis emulationstation:

emulatorstation_extract

Anschließend starten wir als erstes launch_portable.bat und bekommen folgende Meldung, dir wir mit ENTER wieder schließen:

emulatorstation_firstrun

Im Unterverzeichnis .emulationstation finden wir jetzt zwei Dateien, die uns im späteren Verlauf helfen und benötigt werden:

emulatorstation_firstrun_files

In der es_systems.cfg haben wir jetzt ein Beispiel zur Steuerung und Hinterlegung der Systeme, die wir gerne über Emulatoren etc. nutzen wollen:

emulatorstation_firstrun_es_systems_cfg

Hilfe zur Einrichtung des Systems finden wir auf der Seite von retroarch. Hier sind ein paar sehr gute Beispiele dokumentiert:

https://github.com/HerbFargus/EmulationStation_Windows/wiki/Portable-Emulationstation

Zur vereinfachten Übernahme bereinigen wir zunächst die erstellte es_systems.cfg:

<!– This is the EmulationStation Systems configuration file.
All systems must be contained within the tag.–>

<systemList>

~\.emulationstation\roms

</systemList>

Danach übernehmen wir von retrocharch als Beispiel:

emulatorstation_retroarch_es_systems_cfg_samples

und erhalten somit:

<!-- This is the EmulationStation Systems configuration file.
All systems must be contained within the  tag.--><systemList>

~\.emulationstation\roms

<system>
    <name>snes</name>
    <fullname>Super Nintendo Entertainment System</fullname>
    <path>~\.emulationstation\roms\snes</path>
    <extension>.smc .sfc .SMC .SFC</extension>
    <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "%ROM_RAW%"</command>
    <platform>snes</platform>
    <theme>snes</theme>
</system>

</systemList>

 

Gemäß den Beispielen übernehmen wir in unserem Dateisystem die hier übernommen Strukturen in den Tags path und command. Daher erstellen wir zwei Unterverzeichnisse innerhalb .emulationstation (unbedingt das Verzeichnis mit dem beginnenden Punkt verwenden):

  • roms
  • systems

Im Verzeichnis roms erstellen wir jetzt das Verzeichnis snes und hinterlegen ein von uns bereits besitzendes ROM mit einer der notwendigen Erweiterung wie im Tag extension

smc .sfc .SMC .SFC

aufgeführt. Zum Test von EmulationStation reicht jedoch zunächst eine leere Datei mit einem Namen und entsprechender Erweiterung. Ich verwende hierbei:

Beispiel Textdatei.smc

Zusätzlich benötigen wir mindestens ein passendes System.

Hinweis: Ist das Verzeichnis für die ROMs nicht korrekt, so wird später beim Start von EmulationStation gemeldet, dass kein System gefunden werden konnte, obwohl das System korrekt hinterlegt ist. Für EmulationStation ist ein System erst vorhanden, wenn auch das Verzeichnis für die ROMs korrekt ist. Weitere Hinweise später unter: Hinweise zur Fehlersuche und bekannte Probleme.

Download und Vorbereitung retroarch

Zunächst laden wir die aktuelle stablie Version vom Projekt retroarch herunter:

https://github.com/HerbFargus/EmulationStation_Windows/wiki/Portable-Emulationstation

Wählen HERE direkt nach You can either download the stable version:

emulatorstation_retroarch_download

Dann win-x64 für Windows mit 64bit:

emulatorstation_retroarch_download02.jpg

und anschließend die entsprechende 7z-Datei:

emulatorstation_retroarch_download03

Die 7z-Datei entpacken wir anschließend mit dem zum Beginn des Eintrags aufgeführten Tool 7-zip und verschieben anschließend die Dateien in ein neues Verzeichnis retroarch unterhalb des Verzeichnis systems:

emulatorstation_retroarch_extract

 

Wichtiger Hinweis: Zu empfehlen ist an dieser Stelle, dass die retroarch.cfg gesichert wird. Fehler beim Mapping von Tasten etc. können das weitere Verwenden von retroarch verhindern.

Damit wir anschließend beim Aufruf von EmulationStation auch die benötigten Emulatoren nutzen können, benötigen wir zunächst den jeweiligen Core. Welcher benötigt wird und ggf. welcher der richtige ist, sehen wir anhand der Parameter im command-Tag der es_systems.cfg

%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "%ROM_RAW%"

Zum Download der Cores starten wir daher retroarch über die retroarch.exe

emulatorstation_retroarch_config_cores01

Zur Navigation verwenden wir folgende Tasten auf der Tastatur:

  • Pfeiltasten zur Steuerung in den Menüs
  • x zur Auswahl
  • y zum Wechsel in überliegendes Menü

Bei meinem XBox 360-Controller sind dies B für Auswahl und A für Zurück.

Wir wählen zum Download des hier benötigten Cores Online Updater aus:

emulatorstation_retroarch_config_cores02

Core Updater:

emulatorstation_retroarch_config_cores03

Jetzt suchen wir in der Liste den wahrscheinlich richtigen Core (leider nicht eindeutig erkennbar):

emulatorstation_retroarch_config_cores04

In meinem Beispiel ist es SNES / Super Famicon (Snes9x Next):

emulatorstation_retroarch_config_cores05

Anschließend sehen wir kurz den Download der Datei zum Core:

emulatorstation_retroarch_config_cores06

Zur Prüfung, ob wir den richtigen Core erwischt haben, wechseln wir hier in das Unterverzeichnis cores:

emulatorstation_retroarch_cores01

und vergleichen den Dateinamen mit dem Namen der aufzurufenden Datei zum -L -Argument im command-Tag:

-L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll

Perfekt!

Wichtiger Hinweis: Während meiner Tests hatte sich der Name der dll-Datei geändert. Ggf. ist es auch bei euch der Fall. Unbedingt vergleichen und korrigieren!

 

Erster richtiger Start von EmulationStation

Jetzt starten wir EmulationStation erneut über launch_portable.bat. Wer einen Controller hat, bitte vorab einschalten.

Wenn alles in Ordnung ist (es befindet sich mind. eine entsprechende ROM-Datei mit passender Dateiendung im richtigen roms-Verzeichnis), sehen wir eine der folgenden Meldungen:

emulatorstation_secondrun.jpg

oder

emulatorstation_secondrun_gamepad

Mit einem langen Tastendruck des jeweiligen Controller (auch bei Tastatur) kann die Steuerung eingerichtet werden.

ACHTUNG: Das sich öffnende Menü ist kein Menü. Es wird hier sofort die richtige Taste zur Eingabe verlangt.

In meinem Fall musste ich nach meinem Fehlversuch mit ALT + F4 das Fenster über die Tastatur schließen und habe die Einrichtung der Eingabe über einen erneuten Start erfolgreich durchgeführt.

Wer jetzt einen Fehler gemacht hat, kann entweder im LOG das Mapping einsehen (es_log.txt). Beispiel:

lvl2: Configuring device 0 (XInput Controller #1).
lvl2: Mapping [Button 0] -> Up
lvl2: Mapping [Button 1] -> Down
lvl2: Mapping [Button 2] -> Left
lvl2: Mapping [Button 3] -> Right
lvl2: Mapping [Button 10] -> A
lvl2: Mapping [Button 11] -> B
lvl2: Mapping [Button 4] -> Start
lvl2: Mapping [Button 5] -> Select
lvl2: Mapping [Button 8] -> PageUp
lvl2: Mapping [Button 9] -> PageDown

um mit dieser Info die richtigen Tasten zur Navigation zu nutzen oder verwendet einen anderen Controller oder löscht die Datei es_input.cfg im Verzeichnis .emulationstation

Danach sehen wir:

emulatorstation_secondrun_snes_theme

und nach Auswahl:

emulatorstation_secondrun_snes_gamelist01

Nach dem Aufruf von retroarch müssen wir ggf. einmalig manuell in den Vollbildmodus wechseln. Innerhalb von retroarch kann mit der F1-Taste ins Menü gewechselt werden. Die weiteren F-Tasten haben auch entsprechenden Funktionen. Mit der Taste f kann zwischen Vollbild und Fensteransicht gewechselt werden.

Als Beispiel bei erfolgreichem Aufruf sehen wir:

emulatorstation_retroarch_game01.jpg

Wer jetzt den Emulator beenden möchte, kann dies entweder über das Menü mit F1 machen oder einfach die ESC-Taste kurz drücken.

Jetzt wo wir den Aufruf erfolgreich getestet haben, löschen wir in den ROMs Beispiel Textdatei.smc  und starten erneut EmulationStation. Sofern jetzt weiterhin Beispiel Textdatei zur Auswahl zur Verfügung steht, kann jetzt die Datei gamelist.xml im entsprechend passenden ROM-Verzeichnis unter .emulationstation\gamelists\ löschen.

In meinem Beispiel befindet sich die Datei unter:

  • emulationstation\.emulationstation\gamelists\snes

Der Inhalt ist folgender:

<?xml version="1.0"?>
<gameList>
    <game>
        <path>./Beispiel Textdatei.smc</path>
        <name>Beispiel Textdatei</name>
        <playcount>1</playcount>
        <lastplayed>20170207T202234</lastplayed>
    </game>
    <game>
        <path>./Donkey Kong Country 1.smc</path>
        <name>Donkey Kong Country 1</name>
        <playcount>2</playcount>
        <lastplayed>20170207T202234</lastplayed>
    </game>
</gameList>
 

Hinweise zur Fehlersuche und bekannte Probleme:

  • Verwendung des Logs von EmulationStation
    emulationstation\.emulationstation\es_log.txt
  • ggf. fehlender Pfad zu den ROMs in der es_systems.cfg
    ~\.emulationstation\roms
  • fehlendes Verzeichnis für die ROMs gemäß path-Tag der es_systems.cfg oder fehlende ROM-Datei mit passender Endung.
    Beispiel-Meldung im LOG von EmulationStation bei fehlendem Verzeichnis oder fehlendem ROM:

    lvl1: Error - folder with path ""G:/emulationstation//.emulationstation/roms/snes"" is not a directory!
    lvl2: Parsing XML file "G:/emulationstation//.emulationstation/gamelists/snes/gamelist.xml"...
    lvl1: System "snes" has no games! Ignoring it.
    lvl0: No systems found! Does at least one system have a game present? (check that extensions match!)
  • gelöschte Spiele bleiben gelegentlich in der Liste erhaltenauch. Das LOG es_log.txt gibt uns hier entsprechende Informationen
    lvl2:  Parsing XML file "G:/emulationstation//.emulationstation/gamelists/snes/gamelist.xml"...

    Wie bereits beschrieben einfach die gamelist.xml im entsprechen Verzeichnis .emulationstation\gamelists\<system> passend löschen

  • Ist ein Spiel zur Auswahl verfügbar und wird der Emulator unmittelbar nach Auswahl wieder geschlossen, den Aufruf im LOG prüfen:
    lvl2:         %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Donkey Kong Country 1.smc"

    In meinem Fall war nach einem Update des Core von Retroarch der Name der dll-Datei abweichend. Hier war eine einfach Korrektur in der es_systems.cfg erfolgreich.

Für mögliche Fehler und Probleme ggf. eine Kopie von launch_portable.bat erstellen (Beispiel zu fehlersuche.bat), die erste Zeile belassen, den Pfad aus dem LOG übernehmen und am Ende den Befehl pause einfügen:

Auszug aus dem Log es_log.txt kopieren:

lvl2: %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Beispiel Textdatei.smc"

und in der fehlersuche.bat einfügen:

set HOME=%~dp0
%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\snes9x_next_libretro.dll "G:\emulationstation\\.emulationstation\roms\snes\Beispiel Textdatei.smc"
pause

Alles speichern und testen.

 

Erweiterung EmulationStation und retroarch um weitere Emulatoren

Anschließend können weitere Emulatoren über retroarch eingebunden werden. Ich habe dies für Megadrive, ScummVM und DosBox getestet. Leider sind die Ergebnissen für ScummVM und DosBox über retroarch sehr bescheiden. Anbei mein Versuch. Etwas später zeige ich meine Lösung auf.

Zunächst über retroarch die notwendigen Cores heruntergeladen:

emulatorstation_retroarch_cores02

Im Verzeichnis für die ROMs neue Ordner angelegt und die Spiele gespeichert (bei pc und scummvm jeweilis mit Unterordner pro Spiel):

emulatorstation_retroarch_games02

Anschließend die Beispiele von retroarch für Dosbox:

<system>
 <name>pc</name>
 <fullname>PC (x86)</fullname>
 <path>~\.emulationstation\roms\pc</path>
 <extension>.sh .bat .com .exe .SH .BAT .COM .EXE</extension>
 <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\dosbox_libretro.dll "%ROM_RAW%"</command>
 <platform>pc</platform>
 <theme>pc</theme>
</system>

und ScummVM:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\roms\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>~\.emulationstation\roms\scummvm .bat .BAT %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

und Mega Drive:

<system>
    <name>megadrive</name>
    <fullname>Sega Mega Drive / Genesis</fullname>
    <path>~\.emulationstation\roms\megadrive</path>
    <extension>.smd .bin .gen .md .sg .SMD .BIN .GEN .MD .SG</extension>
    <command>%HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\genesis_plus_gx_libretro.dll "%ROM_RAW%"</command>
    <platform>megadrive</platform>
    <theme>megadrive</theme>
</system>

übernommen.

Beim ersten Versuch mit Mega Drive und Sonic the Hedgehog konnte ich gleich erfolgreich den ersten Level mit zusätzlichem Leben beenden. In retroarch gleich mit der F2-Taste den aktuellen Status im state slot #1 gespeichert.

Mit F6 und F7 kann zwischen den state slots gewechselt werden und mit F4 wird aus dem jeweiligen state slot der gespeicherte Zustand geladen. Geil, so muss es sein!

 

Mittels retroarch und Core für Dosbox funktionierte zwar der Aufruf zu den Spielen. Die Verzeichnisse werden in Dosbox gemappt, aber es passiert dann nichts mehr. Teilweise erschien die Meldung Datenfile nicht gefunden. Da wo ich ins Eingabefenster springen konnte ist mir aufgefallen, dass mit der Leertaste die Geschwindigkeit massiv erhöht wird. Ein Leerzeichen ist dann schnell mal 20 Zeichen lang. Auch alle anderen Funktionen von retroarch blieben erhalten, was sich sehr ungünstig bei Tastatureingaben verhielt. In dieser Form absolut für mich ungeeignet.

 

Bei der Variante mit retrocharch und dem Core für ScummVM ist ein Starten zunächst überhaupt nicht möglich. Nach vielen Tests in der Kommandozeile war mir aufgefallen, dass mit dem Aufruf von retroarch und dem Core für ScummVM durch:

g:\emulationstation\.emulationstation\systems\retroarch\retroarch.exe -L g:\emulationstation\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll

die anschließende Datei als Parameter, ausgelesen und der Inhalt als Aufrufparameter für ScummVM interpretiert wird. Mir ist derzeit keine Quelle bekannt wo das entsprechend beschrieben wird.

 

Ich habe daher zum Test die Datei Monkey Island 2.scummvm mit folgendem Inhalt erstellt:

"--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey Island 2" monkey2

Hinweis: Hier muss bereits das Anführungszeichen vor der Option –path bei Langnamen verwendet werden. Alternativ geht es auch ohne Anführungszeichen, wenn hierzu die Kurznamen für Nicht-8Punkt3-Namen verwendet werden. Zum Ermitteln unter Windows in der Kommandozeile folgendes Beispiel:

emulatorstation_window_short_file_names

Für Monkey Island 2 wäre es dann:

--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey~2 monkey2

Anschließend konnte ich es mit dem Befehl:

g:\emulationstation\.emulationstation\systems\retroarch\retroarch.exe -f -L g:\emulationstation\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "g:\emulationstation\.emulationstation\roms\scummvm\Monkey Island 2.scummvm"

erfolgreich testen.

Damit dies auch direkt unter EmulationStation möglich ist, habe ich den Eintrag für das System zu:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\roms\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>~\.emulationstation\roms\scummvm .scummvm %HOME%\.emulationstation\systems\retroarch\retroarch.exe -L %HOME%\.emulationstation\systems\retroarch\cores\scummvm_libretro.dll "%HOME%\.emulationstation\roms\scummvm\%BASENAME%.scummvm"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

geändert. Im Ergebnis, bei Aufruf über EmulationStation, konnte ich folgenden Test erfolgreich durchführen:

emulatorstation_retroarch_scummvm_monkey_island_2.jpg

Jedoch habe ich auch hier wieder das Problem, dass ich derzeit nicht die Tastatur verwenden kann und ich bis dato keine Möglichkeit finden konnte, die störenden Funktionen zu deaktivieren. Zusätzlich bin ich noch nicht mit dem Menü in EmulationStation für ScummVM-Spiele zufrieden und das viel größere Problem ist die zum Start notwendige Game ID zu hinterlegen. Diese muss zusätzlich zum erfolgreichen Starten übergeben werden. In meinem Test:

--path=g:\emulationstation\.emulationstation\roms\scummvm\Monkey~2 monkey2

war es monkey2

Ein weiteres Problem ist, dass ich derzeit fest Laufwerk G: in Monkey Island 2.scummvm  hinterlegt habe. Dadurch ist die portable Variante nicht mehr gegeben.

Sollte einer meiner Leser eine Lösung für das beschriebene Tastaturproblem haben, bitte melden. Zum Test in retroarch einfach f für den Wechsel zwischen Vollbild und Fenster verwenden.

 

Erweiterung EmulationStation um DosBox und ScummVM (nicht retroarch)

Durch die leider vorliegenden Probleme mit DosBox und ScummVM als Core in retroarch habe ich im Ordner .emulationstation\systems zwei zusätzliche Verzeichnisse

  • dosbox
  • scummvm

erzeugt. Anschließend laden wir die Dateien zu DosBox und ScummVM herunter:

emulatorstation_dosbox_download.jpg

emulatorstation_scummvm_download.jpg

Diese entpacken wir (auch die exe-Datei von DosBox) und verschieben den Inhalt in das jeweilige zuvor erstellte Verzeichnis. Damit sieht es so aus:

emulatorstation_dosbox_files.jpg

emulatorstation_scummvm_files

Zusätzlich war mir in EmulationStation aufgefallen, dass alle Dateien mit den hinterlegten Erweiterungen als Spiel gezählt werden. Bei Dune sind das immerhin:

emulatorstation_problem_pcgames01.jpg

Damit ich nun pro Spiel nur einen Eintrag habe, waren mehrere Dinge notwendig:

  • Verwendung eines Verzeichnis mit einer Datei pro Spiel – Beispiel: Monkey Island 2.game (kann leer sein)
  • Hinterlegung einer start.bat-Datei pro Spiel im Spieleverzeichnis, wo die notwendigen Befehle zum Start jeweils einmalig hinterlegt werden. Wenn sie fehlt, dann landen wir direkt im Verzeichnis und können manuell das Spiel starten.
  • Korrektur des path– und extension-Tags in der sc_systems.cfg
  • Anpassung command-Tag für den neuen Aufruf von DosBox als System in der es_systems.cfg

 

Um in Zukunft einen geringeren Aufwand zu haben, wenn ich Spiele hinzufüge oder lösche, generiere ich die jeweiligen Dateien mit Dateierweiterung .game.

Hierzu erzeuge ich zunächst ein Verzeichnis batch unterhalb .emulationstation und anschließend im Verzeichnis batch einen Ordner pc.

Damit nun zum Start von EmulationStation die Dateien generiert werden, habe ich die bestehende launch_portable.bat von:

@echo off
set HOME=%~dp0
emulationstation.exe

zu:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

cls

emulationstation.exe

angepasst. Nach dem ersten Start erhalten wir, vorausgesetzt wir haben Spiele im Verzeichnis

emulationstation\.emulationstation\roms\pc

gespeichert, die entsprechenden .game-Dateien.

emulatorstation_batch_pc_gamelist

Damit diese jetzt für die Darstellung in EmulationStation genutzt werden können und das bei Auswahl DosBox gestartet wird passen wir den System-Eintrag in der es_systems.cfg wie folgt an:

<system>
    <name>pc</name>
    <fullname>PC (x86)</fullname>
    <path>~\.emulationstation\batch\pc</path>
    <extension>.game</extension>
    <command>%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat" </command>
    <platform>pc</platform>
    <theme>pc</theme>
</system>

Beim Test sehen wir jetzt nur noch die einzelnen Spiele:

emulatorstation_dosbox_solution_reduced_gamelist.jpg

Damit jetzt die jeweiligen Spiele gestartet werden können, erstellen wir im Verzeichnis zum jeweiligen Spiel die start.bat-Datei. Am einfachen Beispiel von Lost Vikings 1 ist der Inhalt:

@echo off
VIKINGS.exe
exit

Hinweis: Durch den abschließenden Befehl exit wird anschließend DosBox beendet.

 

Wenn wir jetzt das Spiel über Emulation Station starten sehen wir (mit ALT+ENTER kann der Vollbildmodus verlassen werden) das Spiel in der DOSBox:

emulatorstation_dosbox_first_run.jpg

 

Erläuterungen und Informationen zur der oben genannten Anpassung in der es_systems.cfg:

<system>
    <name>pc</name>
    <fullname>PC (x86)</fullname>
    <path>~\.emulationstation\batch\pc</path>
    <extension>.game</extension>
    <command>%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat" </command>
    <platform>pc</platform>
    <theme>pc</theme>
</system>

Das Verzeichnis ~\.emulationstation\batch\pc und die extension .game werden verwendet, um die Spiele in EmulationStation im Menü darzustellen. Bei Auswahl wird der Befehl im command-Tag ausgeführt:

%HOME%\.emulationstation\systems\dosbox\dosbox.exe -exit -fullscreen -c "mount c: '%HOME%\.emulationstation\roms\pc\%BASENAME%'" -c "c:" -c "start.bat"

Betrachten wir die einzelnen Elemente zum Aufruf haben wir:

  • %HOME%\.emulationstation\systems\dosbox\dosbox.exe
    dosbox.exe wird gestart
  • -exit
    nach beenden soll dosbox geschlossen werden
  • -fullscreen
    die Darstellung erfolgt sofort im Vollbildmodus
  • -c „mount c: ‚%HOME%\.emulationstation\roms\pc\%BASENAME%'“
    in DosBox wird der Befehl mount c: ‚%HOME%\.emulationstation\roms\pc\%BASENAME%‘ ausgeführt, wobei %BASENAME% als Wert den Spielname, wie im Menü von EmulationStation angezeigt, übernimmt.
  • -c „c:“
    in DosBox wird der Befehl zum Wechsel zu Laufwerk c: ausgeführt
  • -c „start.bat“
    in DosBox wird der Befehl zum Starten der start.bat ausgeführt

 

Erläuterungen und Informationen zur Erweiterung der launch_portable.bat:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo > "%PCGAMESBATCHDIR%\%%D.game"

)

cls

emulationstation.exe

Mit:

set HOME=%HOME:~0,-1%

wird das unnötige doppelte \ entfernt, welches ich bei meinen Tests immer gesehen habe. Da ich Probleme unter DosBox befürchtet habe, habe ich dies hierdurch korrigiert.

Mit:

for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

durchsuche ich das Verzeichnis, definiert durch:

set PCGAMESDIR=%HOME%\.emulationstation\roms\pc

auf Unterverzeichnisse und erstelle pro Unterverzeichnis eine Datei mit Verzeichnisname als Name plus .game als Dateiendung im definierten Verzeichnis:

set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

Dadurch wird immer der vorliegende Ordnername vom jeweiligen Spiel der Name in Emulation Station.

Die Zeile:

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"

wird durch das am Anfang stehende REM nicht ausgeführt. Wer möchte, dass sein hinterlegtes Verzeichnis von .game-Dateien immer bereinigt wird, damit gelöschte DOS-Spiele auch in EmulationStation nicht mehr zu sehen sind, kann auf eigene Gefahr das REM entfernen!!!

ScummVM direkt als System in EmulationStation

Bei ScummVM gibt es noch die Besonderheit, dass zum Spielaufruf, neben Verzeichnis auch die game id benötigt wird. Mittels der game id erkennt ScummVM die zu ladenden Dateien. Um die game id zu ermitteln kann scummvm.exe mit der Option -z gestartet werden:

G:\emulationstation\.emulationstation\systems\scummvm>scummvm.exe -z

Als Ergebnis bekommen wir ein recht große Liste:

emulatorstation_scummvm_option_z.jpg

Da jeder nur einmalig die Ordnernamen vergibt, habe ich zur Vereinfachung eine Datei createscummvmbatchfiles.bat  geschrieben, die bei Übergabe eines Namen/Ordnernamen die game id zurückliefert. Diese Datei wurde anschließend im Verzeichnis:

emulationstation\.emulationstation\batch

gespeichert.

Inhalt von createscummvmbatchfiles.bat

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!
set gameid=none

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
 REM echo !line!

 set test=!line:%args%=!

 if NOT "!line!" == "!test!" ( 

 for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )

 )

 )

:output
echo !gameid!

 

Zusätzlich erzeuge ich ein Verzeichnis scummvm unterhalb:

emulationstation\.emulationstation\batch

in welchem später die generierten Startdateien für ScummVM plus Speicherort ScummVM-Spiele und ScummVM-Savegames (Standard wäre innerhalb des Benutzerprofils und somit nicht mehr „portable“) durch folgende Erweiterung der launch_portable.bat gespeichert werden.

:create_scummvm_game_bat
SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

 

Zur Vereinfachung hier das fertige Ergebnis – launch_portable.bat:

@echo off

set HOME=%~dp0
set HOME=%HOME:~0,-1%

:create_pc_gamelist_files
set PCGAMESDIR=%HOME%\.emulationstation\roms\pc
set PCGAMESBATCHDIR=%HOME%\.emulationstation\batch\pc

REM for /f "tokens=*" %%D in ('dir /B "%PCGAMESDIR%"') do del "%PCGAMESBATCHDIR%\%%D.game"
for /f "tokens=*" %%D in ('dir /B /A:D "%PCGAMESDIR%"') do (

echo "%%D" in pc game dir found 
 echo create "%PCGAMESBATCHDIR%\%%D.game" to start
 echo.
 echo. > "%PCGAMESBATCHDIR%\%%D.game"

)

:create_scummvm_game_bat
SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

cls

emulationstation.exe

 

Entsprechende Spieleordner von ScummVM Spielen speichern wir unter:

emulationstation\.emulationstation\roms\pc

 

Anschließend wird die es_systems.cfg für ScummVM angepasst zu:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\batch\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>"%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

 

Bei meinem anschließenden Aufruf von launch_portable.bat wurden im Verzeichnis

emulationstation\.emulationstation\batch\scummvm

mehrere bat-Dateien erzeugt, deren Inhalt jeweils wie folgt (abhängig vom Spiel) ist:

G:\emulationstation\.emulationstation\systems\scummvm\scummvm.exe --savepath="G:\emulationstation\.emulationstation\roms\scummvm\Indiana Jones and the Fate of Atlantis Talkie" -f -p "G:\emulationstation\.emulationstation\roms\scummvm\Indiana Jones and the Fate of Atlantis Talkie" atlantis

In Emulation Station sehen wir anschließend:

emulatorstation_scummvm_list.jpg

Nach Aufruf von, zum Beispiel Monkey Island 2, wird ScummVM mit dem Spiel erfolgreich geöffnet. Beispiel (Menü-Aufruf über F5-Taste):

emulatorstation_scummvm_menu

 

Erläuterungen und Informationen zur der oben genannten Anpassung in der es_systems.cfg:

<system>
    <name>scummvm</name>
    <fullname>ScummVM</fullname>
    <path>~\.emulationstation\batch\scummvm</path>
    <extension>.bat .BAT</extension>
    <command>"%ROM_RAW%"</command>
    <platform>pc</platform>
    <theme>scummvm</theme>
</system>

Das Verzeichnis ~\.emulationstation\batch\scummvm und die extension .bat werden verwendet, um die Spiele in EmulationStation im Menü darzustellen. Bei Auswahl wird durch Verwendung „%ROM_RAW%“ die jeweilige bat-Datei im Verzeichnis ~\.emulationstation\batch\scummvm gestartet, die den gleichen Namen wie im Menü von Emulation Station hat.

 

Erläuterungen und Informationen zur Erweiterung der launch_portable.bat:

SETLOCAL ENABLEDELAYEDEXPANSION

set SCUMMVMGAMESDIR=%HOME%\.emulationstation\roms\scummvm
set SCUMMVMBATCHDIR=%HOME%\.emulationstation\batch\scummvm
set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe
set SCUMMBATCHCREATE=%HOME%\.emulationstation\batch\createscummvmbatchfiles.bat

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"
for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

)

 

Mit:

for /f "tokens=*" %%S in ('dir /B /A:D "%SCUMMVMGAMESDIR%"') do (
 set game=%%S
 set gameid=none
 for /f "tokens=*" %%G in ('"%SCUMMBATCHCREATE%" !game!') do set gameid=%%G

...

)

durchläuft das Skript alle Verzeichnisse unterhalb:

%HOME%\.emulationstation\roms\scummvm

und prüft den jeweiligen Namen über:

%SCUMMBATCHCREATE%" !game!

ob eine game id vorhanden ist. Das Ergebnis wird in gameid gespeichert. Anschließend wird durch:

if not "!gameid!"=="none" (

echo "%%S" with ScummVM game id !gameid! found
 echo create "%SCUMMVMBATCHDIR%\%%S.bat" to start
 echo.
 echo %SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid! > "%SCUMMVMBATCHDIR%\%%S.bat"

)

geprüft, ob gameid abweichend none ist. In diesem Fall wird eine bat-Datei gleich Ordnername vom Spieleverzeichnis im Batch-Verzeichnis gespeichert:

"%SCUMMVMBATCHDIR%\%%S.bat"

Der Inhalt ist hierbei:

%SCUMMVMEXE% --savepath="%SCUMMVMGAMESDIR%\%%S" -f -p "%SCUMMVMGAMESDIR%\%%S" !gameid!
  • %SCUMMVMEXE% entspricht dem Aufruf innerhalb der Batch-Datei der scummvm.exe-Datei
  • –savepath=“%SCUMMVMGAMESDIR%\%%S“ übergibt scummvm.exe die Info, dass die Spielstände im jeweiligen Spiel-Verzeichnis gespeichert werden sollen
  • -f legt Vollbild fest
  • -p „%SCUMMVMGAMESDIR%\%%S“ übergibt scummvm.exe den Pfad wo sich das Spiel befindet
  • !gameid! ist für scummvm.exe notwendig, damit die korrekte Datei zum Ausführen gestartet wird – in dieser Variante wird nirgends eine bat-, cmd- oder exe-Datei zum Start der Spiele übergeben.

 

Die Zeile:

REM for /f "tokens=*" %%S in ('dir /B "%SCUMMVMGAMESDIR%"') do del "%SCUMMVMBATCHDIR%\%%S.bat"

wird durch das am Anfang stehende REM nicht ausgeführt. Wer möchte, dass sein hinterlegtes Verzeichnis von .bat-Dateien immer bereinigt wird, damit gelöschte ScummVM-Spiele auch in EmulationStation nicht mehr zu sehen sind, kann auf eigene Gefahr das REM entfernen!!!

 

Erläuterungen und Informationen zur Erweiterung der createscummvmbatchfiles.bat:

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!
set gameid=none

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
 REM echo !line!

 set test=!line:%args%=!

 if NOT "!line!" == "!test!" ( 

 for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )

 )

 )

:output
echo !gameid!

Durch:

set args=%*
set args=!args:"=!
set args=!args:  = !
set args=!args: Talkie=!

wird der Text zum zunächst übergebene Verzeichnis bereinigt, damit keine Anführungszeichen, doppelte Leerzeichen und ein ungewünschtes Wort “ Talkie“ nicht zum Vergleich verwendet werden. Bei Bedarf unterhalb:

set args=!args: Talkie=!

eine weitere Zeile wie:

set args=!args: lösche mich=!

einfügen.

Mit:

set SCUMMVMEXE=%HOME%\.emulationstation\systems\scummvm\scummvm.exe

for /f "tokens=*" %%S in ('"%SCUMMVMEXE%" -z ') do (
 set line=%%S
 set line=!line::=!
 set line=!line:/= !
...
)

werden alle Zeilen der Ausgabe von scummvm.exe -z durchlaufen und Doppelzeichen gelöscht und Schrägstrich mit Leerzeichen ersetzt:

  • Broken Sword II: The Smoking Mirror (PlayStation/Demo) wird zu Broken Sword II The Smoking Mirror (PlayStation Demo)

Danach wird mittels:

set test=!line:%args%=!

 if NOT "!line!" == "!test!"

geprüft, ob der übergebene Name in der jeweiligen Ausgabe von scummvm.exe -z enthalten ist. In diesem Fall wird die Zeile der Ausgabe von Scummvm.exe um den Teilstring gekürzt und in test zwischengespeichert. Durch die Kürzung ist der anschließenden Vergleich nicht mehr identisch zur Ausgabe von scummvm.exe -z der Zeile.

Anschließend wird durch:

for /f "tokens=1*delims= " %%i in ("!line!") do (
 set gameid=%%i
 goto output
 )
...

:output
echo !gameid!

der Teil bis zum ersten Leerzeichen der aktuellen Zeile zwischengespeichert. Die Schleife wird unterbrochen und es wird nur die erste gefundene game id ausgegeben. Durch diese Abfolge wird bei Übergabe von:

  • Monkey Island – monkey ausgegeben
  • Monkey Island 2 – monkey2 ausgegeben

da die Ausgabe der Reihenfolge:

  • The Secret of Monkey Island
  • Monkey Island 2: LeChuck’s Revenge

entspricht.

 

Quelle für Spiele / Demos und Rechtliches:

Wer auf der Suche nach alten Klassikern ist, der muss beachten, dass die Spiele, auch wenn sie teilweise über 20 Jahre schon alt sind, nicht unbedingt frei und kostenlos verfügbar sind.

Schaut euch hierzu zum Beispiel:

an.

Teilweise ist es auch jetzt noch möglich alte Spieleklassiker zu kaufen. Zum Beispiel über http://www.gog.com (https://www.gog.com/game/kings_quest_4_5_6) oder, wenn auch sehr selten, als Humble Bundle. Teilweise haben Spielehersteller einige der alten Spiele frei zum Download freigegeben.

Ich persönlich bin froh, dass ich meine DOS-Lieblinge über die Jahre gut eingelagert habe. Die gute Spiele-Zeit war jedoch bei mir KC85/3 und C64 mit Boulderdash, Oil Imperium, Prince of Persia und Turrican. Das war vor 27 Jahren.