/ HomePage / Computer / Software / Emulation / Atari 8 Bit / runxl

Atari 600 XL
runxl - ein Script zum komfortablen Starten des Atari800 Emulators unter Linux
1. Einleitung
Wer eine umfangreiche Sammlung an Disketten-Images und Spiele-Files für den Atari800-Emulator besitzt, verliert leicht den Überblick. Es gestaltet sich estrem schwierig ein bestimmtes Spiel zu finden. Der Emulator selbst ist zwar hinreichend komfortabel was die Auswahl des zu ladenden Disk-Images betrifft, jedoch muss man erstmal wissen auf welcher Diskette das gesuchte Spiel zu finden ist.
2. Beschreibung
Aus diesem Grund habe ich runxl entwickelt. Es ist ein bash-Script, das ähnlich dem unix-Befehl locate
rekursiv das Spieleverzeichnis durchsucht und die Fundstellen auflistet. Dann fragt das Script, welches Programm gestartet werden soll und das Script startet Atari800 mit dem entsprechenden Disk-Image, xex- com- oder cas-file. Die Emulatoroptionen zum erfolgreichen Starten werden automatisch anhand des Dateityps ermittelt.
2.1 Indexdateien
Zusätzlich verarbeitet das Script Indexdateien, die in jedem Verzeichnis mit Atari-Spielen liegen können. In den Indexdateien steht neben dem Namen der Disk-Images auch der ausgeschriebene Name der darauf befindlichen Spiele. Dazu können für jedes Spiel individuelle Emulatoroptionen festgelegt werden, z.B. OSA laden, einen 130xe emulieren, mit DOS oder Basic starten oder die 2. Disk des Spieles gleich beim in Laufwerk D2: einlegen. Das macht das Ganze sehr komfortabel. Mann muss nur einmal herumprobieren mit welcher Konfiguration ein Programm zum Laufen zu bekommen ist und meißelt diese Einstellung in die Indexdatei. Der Aufbau der Indexdateien wird weiter unten beschrieben
3. Verwendung
3.1 Installation
Um runxl zu verwenden kopiert man sich den Sourcecode (siehe unten) in ein leeres Textfile namens runxl.
Am Anfang des Scripts muss man den Pfad zum Spieleverzeichnis und zum Image auf eine DOS-Diskette auf die eigenen Bedürfnisse anpassen.
Das script wird dann mit
chmod a+x runxl
als ausfürbar gekennzeichnet. Dann kann man runxl mit
runxl <Spielename>
starten. Wobei der Spielename auch nur ein Teil des Namens sein kann.
stephan@netbook:~/source/runxl$ runxl slot
Nr. Name
--------------------------------------------------------------
1 Colrslot -basic.atr
2 Fruit Machine (Slots) (Yogi Megadisk)
3 Mike's Slot-Machine Version II.xex
4 SLOT.COM
5 SLOTMACH.BAS
6 Slotmach.exe
7 Slot-Machine (19xx) [demo].com
8 Slot-Machine (19xx) [demo].xex
9 Slot Machine [alt].atr
10 Slot Machine.atr
11 Slot-Machine.atr
12 SlotMachine.exe
13 Slot-Machine (v1).xex
14 Slot-Machine (v2).xex
15 SlotMachine.xex
16 Slot Machine (Yogi Megadisk)
17 Slotmach.xex
18 SLOTS2.BAS
19 Slots2 -basic.atr
20 SLOTS.BAS
21 Slots -bas.atr
22 Slots -basic.atr
23 Slot Trivia (b).atr
24 Slot Trivia [nw].atr
Welches Programm starten? [1-24]
Hilfe gibt es mit
runxl -h
runxl v.1.3.9 - Programm zum komfortablen Starten des Atari800-Emulators
Benutzung: runxl [-lhosefbd] [-n number] Suchbegriff
Der Suchbegriff wird zur Suche in den Dateinamen der Atari-Programme verwendet
Ohne weitere Optionen wird eine Liste der auf den Suchbegriff passenden
Programme gezeigt und interaktiv nach der Nummer des zu startenden Programmes
gefragt..
Optionen:
-h Diese Meldung (Hilfe)
-l nur Programme auflisten, nicht nach Startnummer fragen
-n <num> Starte Programm Nr. <num> aus der Ergebnisliste, die mit -l angezeigt wird
-r Starte das erstbeste passende Programm
Emulatoroptionen:
-f Fullscreen
-o alten Atari 800 emulieren
-e emuliere 130XE mit 128 KB
-b Boot mit eigeschaltetem BASIC
-d Boot einer DOS-Diskette, Programmdisk in D2
-s Zeige Emulatorgeschwindigkeit in %
3.2 Indexdateien
Die Indexdateien müssen runxmlindex*.txt
heißen, anstelle des Sterns können beliebige oder gar keine Zeichen stehen. Sie müssen immer in dem Verzeichis liegen wo sich auch Disk-Images oder Atari-Programme befinden.
Der Aufbau ist folgendermaßen:
- 1. Zeile: Name der Spielesammlung in diesem Verzeichnis, wird in den Suchergebnissen in Klammern hinter dem Spielenamen angezeigt
- 2. Zeile: Gemeinsame Emulatoroptionen für alle Programme der Sammlung (globale Optionen)
Die darauffolgenden Zeilen stehen jeweils für ein Spiel:
Image- oder Programmdatei (atr, xex, xfd usw.)|Name des Spiels|Emulatoroptionen nur für dieses Spiel (individuelle Optionen)
Die Emulatoroptionen sind exakt so, wie in der Dokumentation vom atari800 beschrieben. Die Individuellen Optionen werden den globalen Optionen beim Aufruf des Emulators nachgestellt.
In den Emulatoroptionen sind zwei Kürzel zulässig:
{dos}
wird zum Pfad zur DOS-Diskette aufgelöst, dieser ist im runxl
Script angegeben.
{dir}
wird zum aktuellen Directory aufgelöst, damit können zugehörige Disk-Images leicht in D2 usw. geladen werden, ohne den Pfad auf das aktuelle Verzeichnis zu kennen.
Wenn als Name nur ein Minuszeichen angegeben ist, taucht dieses Image in den Suchergebnissen nicht auf, praktisch wenn ein Spiel aus mehreren Disks besteht, mehrere Laufwerke unterstützt und nur die erste Diskette gefunden werden soll. In den Optionen der ersten Disk muss man dann die anderen Disks nachladen (Siehe Beispiel-Indexdatei, Ultima I). Es müssen dabei immer alle Disks (auch die erste) angegeben werden da der Emulator sonst die erste Disk zuletzt lädt.
Ein Beispiel für eine Indexdatei:
Meine Spielesammlung
01A.xfd|Mario Brothers|-atari
01A.xfd|Keystone Kapers|
01A.xfd|Quasimodo|
01A.xfd|Q*Bert|
01A.xfd|Atari Music Composer (DOS)|{dos}
01A.xfd|Rally Speedway|
01A.xfd|Pengo|
01A.xfd|Crossfire|
01A.xfd|Sound in Stereo|-atari -b
01A.xfd|Master of Time Sound|
Ultima1a.xfd|Ultima I|{dir}Ultima1a.xfd {dir}Ultima1b.xfd
Ultima1b.xfd|-|
3.2.1 Erstellen einer Indexdatei
Eine Indexdatei ohne Emlulatoroptionen kann mit dem Script makeindex
(siehe unten) erstellt werden. Das Script wird ohne Parameter aufgerufen und erzeugt den Index im aktuellen Verzeichnis, in dem sich Atari-Programme oder Images befinden müssen.
Die erzeugte Indexdatei muss nun nur noch angepasst werden, zumindest der Name und die globalen Emulatoroptionen.
4.Quellcode
#!/bin/bash
# -----------------------------------------------------------------
# runxl - Skript zum komfortablen Starten des atari800 Emulators
# (cdw) 03.12.2010 Stephan Elsner
# -----------------------------------------------------------------
# TODO:
# 1. Images die in einer Index-Datei vorkommen nicht durch den Dateinamen finden lassen (schwierig)
# 2. Dateinamen die ein single-Quote ' enthalten (kommt bei Rohar-Archiven vor) erzeugen einen fehler im
# output-script. Das muss noch im filenamen gequotet werden.
#
# History:
# 1.4.1 Bugfix bei -r
# 1.4.0 erlaubt {dir} als Kuerzel in den Emu-Opts der Indexdatei. Wird durch aktuellen Pfad ersetzt
# 1.3.10:Hilfetext angepasst
# 1.3.9: erlaubt {dos} als Shortcut in den Emulator-Optionen der Indexdatei, Fix für Atari800 2.2.1
# 1.3.8: Images mit File-Endungen in Grossbuchtaben werden gefunden
# 1.3.7: Erlaubt das Ausblenden von Images ueber die Index-Datei
# 1.3.6: Images, die in einer Index-Datei vorkommen, werden nicht noch zusaetzlich
# durch den Dateinamen gefunden
# 1.3.5: -b und -d Parameter hinzugefuegt
# 1.3.4: Bugfix (Case bei Spielenamen ignorieren)
# 1.3.3: Bugfix (Index-Dateien koennen symlinked sein)
# 1.3.2: Bugfix (Syntax Error)
# 1.3.1: Code cleanup
# 1.3.0: -e Parameter fuer 130XE-Emulation hinzugefuegt
# 1.2.0: unterstuetzt Emulator-Optionen fuer jedes einzelne Programm in den index-Files
# 1.1.0: Unterstuetzt index-Files fuer Multi-File-Disks (z.B.Yogi) mit Loader
# 1.06 : Bugfixes
# 1.05 : Textanpassungen
# 1.04 : Startverhalten geaendert, default jetzt liste + interaktive Auswahl
# -r parameter hinzugefuegt für starten des ersten fundes.
# 1.03 : Bugfix: fehlende quotes in find kommandos
# 1.02 : umbenannt in runxl
# 1.01 : Hilfetext angepasst
# 1.00 : unterstuetzung von cartridge-files rom, bin
# 0.90 : Programmliste wird nach Programmnamen sortiert
# -----------------------------------------------------------------
# Diese Variablen an eigene Beduerfnisse anpassen:
# -----------------------------------------------------------------
# Basisverzeichnis der Atari-Programme OHNE abschliessnden Slash
BASEDIR="/usr/share/atari"
# Feste startoptionen fuer atari800, dynamische Optionen werden diesen hinzugefuegt
STARTOPTIONS="-windowed -audio16"
# Pfad zur bevorzugten DOS-Disk
DOSDISKPATH="/usr/share/atari/XL_Proggies/XL-DISKS_Lars/TURBO.XFD"
# -----------------------------------------------------------------
USAGE="Benutzung: runxl [-lhosr] [-n number] Suchbegriff"
HELP=$( cat << EOF
runxl v.1.4.1 - Programm zum komfortablen Starten des Atari800-Emulators
Benutzung: runxl [-lhosefbd] [-n number] Suchbegriff
Der Suchbegriff wird zur Suche in Dateinamen und Index-Dateien verwendet.
Ohne weitere Optionen wird eine Liste der auf den Suchbegriff passenden
Programme gezeigt und interaktiv nach der Nummer des zu startenden Programmes
gefragt..
Optionen:
-h Diese Meldung (Hilfe)
-l nur Programme auflisten, nicht nach Startnummer fragen
-n <num> Starte Programm Nr. <num> aus der Ergebnisliste, die mit -l angezeigt wird
-r Starte das erstbeste passende Programm
Emulatoroptionen:
-f Fullscreen
-o alten Atari 800 emulieren
-e emuliere 130XE mit 128 KB
-b Boot mit eigeschaltetem BASIC
-d Boot einer DOS-Diskette, Programmdisk in D2
-s Zeige Emulatorgeschwindigkeit in %
EOF
)
# Interne Variablen:
# MODI (interne verwendung)
# 0 = starten des erstbesten Programmes
# 1 = Programme auflisten
# 2 = bestimmtes Programm starten
# 3 = erst auflisten, dann Programmnamen abfragen und starten
MODE=3
# Option zum starten eines bestimmten programmtyps für den Emulator
RUNCMD=""
# zusätzliche optionen für den Emulator
OPTIONS=""
# Verwendet fuer spezielle optionen fuer z.b. Yogi-Disks, wird dynamisch mit dem Pfad zum loader gefüllt
DISKEMUPTS=""
# Funktionen:
# --------------------------------------------------------------------------------
# Numeriertes Auflisten aller Dateien in denen $GAMENAME vorkommt
listprogs()
{
createlist
if [ "$NUMFINDS" -gt "0" ]; then
echo
echo " Nr. Name"
echo "--------------------------------------------------------------"
# Namen herausklauben, numerieren, anzeigen
cat /tmp/atarilist | cut -d '|' -f 2 | nl
echo
rm /tmp/atarilist
else
echo "Kein Programm gefunden."
fi
}
# --------------------------------------------------------------------------------
# Erstelle eine temporaere Liste der gesuchten Programme in /tmp/atarilist
# und ermittle Anzahl der Eintraege (in $NUMFINDS)
# Aufbau der Liste:
# Pfad zum disk-image oder atari-executable|Angezeigter Name|Zusaetzliche Emulator-Optionen
createlist()
{
# Suche files nach Dateinamen und schreibe die Funde in die Datei flist
find $BASEDIR -iname "*$GAMENAME*" -type f | grep "[axcbeAXCBE][teafioxTEAFIOX][rxsdnmeRXSDNME]$" | awk -F"/" '
{
printf("%s|%s|\n",$0,$NF)
}' > /tmp/flist
# Suche in runxmlindex*.text und haenge die Funde an die Ergebnisliste an
# Die erste Zeile von runxmlindex enthaelt den Namen der Disk
# Die zweite Zeile die Zusatzoptionen zum Starten des Emulators die fuer alle indizierten Files gelten.
# Bei den Yogi-Disks ist es das Yogiloader-Image
# Eine Index-Zeile ist folgendermassen aufgebaut:
# Dateiname Disk-Image (ohne Pfad)|Angezeigter Name des Spiels|Emulator-optionen, sowie {dos} als
# Platzhalter für DOS-Disk
# (z.b. wenn das Spiel nicht auf einem XL laeuft, oder ein DOS gebootet werden muss)
# Ist der angezeigte Name - wird das file ausgeblendet, parktisch z.b. bei Multi-Disk Spielen
find -L $BASEDIR -iname "runxlindex*.txt" -type f -exec awk -F"|" '
function basename(path) {
n=split(path,a,"/")
return a[n]
}
function dirname(path) {
if (sub(/\/[^\/]*$/, "", path))
return path
else
return "."
}
BEGIN {
IGNORECASE = 1;
}
{
# Erste Zeile der Indexdatei auswerten (Name der Sammlung)
if (NR == 1) {
# Titel der Disk(s) die durch die aktuelle Datei indiziert sind
diskname=$0;
# Pfad zur Indexdatei ermitteln, ist geleichzeitig Pfad zu den indizierten Disks
mindex = match(FILENAME, "^.*/");
filepath = substr(FILENAME,1,RLENGTH);
}
# Zweite Zeile der Indexdatei (Emulatoroptionen für alle files dieser Sammlung)
if (NR == 2) {
diskopts=$0
gsub("{dos}","'$DOSDISKPATH'", diskopts);
}
}
# Wenn der Spielename in der Beschreibung gefunden
tolower($2) ~ /'$GAMENAME'/ {
if (NR > 2) {
gsub(/[ \t]+$/, "", $2);
# Kuerzel aufloesen
gsub("{dos}","'$DOSDISKPATH'", $3);
gsub("{dir}",dirname(filepath $1) "/", $3);
printf("%s%s|%s (%s)|%s %s\n",filepath,$1,$2,diskname,$3,diskopts);
}
}
# enthaelt die zweite spalte ein Minuszeichen, wird die Zeile zum
# spaeteren Entfernen markiert.
$2 ~ "\-" {
printf("%s%s|**delete**|\n",filepath,$1);
}
' {} \; > /tmp/ilist
# Filtern der Suchergebnisse nach Dateinamen. Es werden nur die Ergebnisse beruecksichtigt, die
# nicht schon durch die Suche in den Indexdateien gefunden wurden
awk -F"|" '
BEGIN {
while ((getline < "/tmp/ilist") > 0)
myarray[$1] = $1
}
{
if (!($1 in myarray))
printf("%s\n",$0)
}' /tmp/flist > /tmp/llist
# Die mit delete gekennzeichneten Zeilen herausfiltern
cat /tmp/llist /tmp/ilist | grep -v '**delete**' > /tmp/alist
# Ergebnisliste alphabetisch sortieren
sort -t '|' -k2 /tmp/alist > /tmp/atarilist
NUMFINDS=$(cat /tmp/atarilist | wc -l)
rm /tmp/alist
rm /tmp/ilist
rm /tmp/flist
rm /tmp/llist
}
# --------------------------------------------------------------------------------
# Auswaehlen des Atari-Programmes Nr. $GAMENUMBER aus der Liste der auf $GAMENAME
# passenden files. Vollstaendiger Pfad befindet sich in $AFILE
findprog()
{
createlist
if ([ "$GAMENUMBER" -le "$NUMFINDS" ] && [ "$GAMENUMBER" -ge "1" ]) then
# Pfad lesen
AFILE=$(cat /tmp/atarilist | head -$GAMENUMBER | tail -1 | cut -d '|' -f1)
# lesen der zusatzoptionen, bei normalen programmen leer, bei yogi-disks pfad zum loader
DISKEMUOPTS=$(cat /tmp/atarilist | head -$GAMENUMBER | tail -1 | cut -d '|' -f3)
else
echo "Programmnummer muss zwischen 1 und $NUMFINDS liegen."
exit
fi
rm /tmp/atarilist
}
# --------------------------------------------------------------------------------
if [ $# -lt 1 ]; then
echo "$USAGE"
exit 1
fi
# Gamename ist immer letztes Argument, in variable überführen
GNAME=${@: -1}
# in lowercase wandeln
GAMENAME=${GNAME,,}
if [ ${GAMENAME:0:1} == "-" -a $GAMENAME != "-h" ]; then
echo "$USAGE"
exit 1
fi
# Parameter auswerten
while getopts n:lhosrefbd OPT; do
case $OPT in
l)
# programme auflisten
if [ $# -lt 2 ]; then
echo "$USAGE"
exit 1
fi
MODE=1
;;
r) # erstes der gefundenen Programme starten
MODE=2
GAMENUMER=1
;;
n)
# Bestimmtes programm aus der Liste starten
MODE=2
GAMENUMBER=$OPTARG
;;
h)
# Help
echo "$HELP"
exit
;;
o)
# o = old Atari 400/800
OPTIONS="$OPTIONS -b"
;;
e)
# e = Atari 130 XE
OPTIONS="$OPTIONS -xe"
;;
s)
# s = show speed
OPTIONS="$OPTIONS -showspeed"
;;
f)
# f = fullscreen
OPTIONS="$OPTIONS -fullscreen"
;;
b)
# b = basic
OPTIONS="$OPTIONS -basic"
;;
d)
# d = DOS
OPTIONS="$OPTIONS $DOSDISKPATH"
;;
\?)
#echo "Falscher Parameter: -$OPT" >&2
exit 1
;;
esac
done
case $MODE in
0) # -r suchen und starten des ersten passenden Programmes
# findfirstprog
;;
1) # -l Auflisten der gefundenen programme
listprogs
exit
;;
2) # -n starten eines bestimmten programmes aus der liste
findprog
;;
3) # ohne parameter: Auflisten der Programme aund Abfragen welches davon gestartet werden soll
listprogs
# Interaktives Abfragen der Spielenummer
if [ "$NUMFINDS" -eq 0 ];
then
exit
fi
echo "Welches Programm starten? [1-$NUMFINDS]"
read GAMENUMBER
# Test ob eingabe numerisch ist, ansonsten Scriptende
if [[ $GAMENUMBER =~ ^[0-9]+$ ]]; then
findprog
else
exit
fi
;;
esac
# Pfad zum Programm ist ermittelt, starten
if [ "$AFILE" != "" ];
then
EXTENSION="`echo ${AFILE: -3}|tr '[:upper:]' '[:lower:]'`"
case $EXTENSION in
xex|com|exe)
RUNCMD="-run"
;;
atr|xfd)
RUNCMD=""
;;
bas|lst)
RUNCMD="-basic -run"
;;
cas)
RUNCMD="-boottape"
;;
rom|bin)
RUNCMD="-cart"
;;
*)
echo "Unbekannter Dateityp: $EXTENSION"
exit
;;
esac
else
echo "$GAMENAME nicht gefunden."
exit
fi
if [ "$MODE" -eq "0" -o "$MODE" -eq "2" ]; then
echo \"`basename "$AFILE"`\" " starten? [J/n]"
read TASTE
fi
if [ "$TASTE" == "n" ]; then
echo "dann eben nicht."
else
# Erzeugen und ausführen des Startscriptes
echo "atari800 $STARTOPTIONS $OPTIONS $DISKEMUOPTS $RUNCMD '$AFILE'" > /tmp/atariscript
chmod +x /tmp/atariscript
/tmp/atariscript
#rm /tmp/atariscript
fi
exit
#!/bin/bash
# Script zum Erstellen einer runxlindex.txt Datei, die nachher angepasst werden MUSS
echo "Name der Sammlung" > runxlindex.txt
echo "<Globale Emulatoroptionen>" >> runxlindex.txt
# Suche files nach Dateinamen und schreibe die Funde in die Datei flist
find -maxdepth 1 -type f | grep "[axcbeAXCBE][teafioxTEAFIOX][rxsdnmeRXSDNME]$" | awk -F"/" '
{
printf("%s|%s|\n",$NF,substr($NF,1,length($NF)-4))
}' >> runxlindex.tmp
sort -t '|' -k2 runxlindex.tmp >> runxlindex.txt
rm runxlindex.tmp
echo "runxlindex.txt erzeugt."