Zurück zur Indexseite

Space Fight: Spiel in 2 KiB Größe; geschrieben in x86 Assembler

Dieses "Spiel" entstand im November 2004 und wurde in Assembler geschrieben. Die ausführbare Datei ist nur 2 KiB (=2048 Byte) groß und benötigt zur Ausführung kein Betriebssystem, sondern kann direkt im BIOS von einer Diskette gestartet werden. Ziel des Spiels ist es, die von oben nach unten fliegenden gegnerischen Raumschiffe abzuschießen und selbst nicht getroffen zu werden.

Und wieso das Ganze? Nun, sonderlich interessant ist das Spiel mit Sicherheit nicht - hier galt eher: "Der Weg ist das Ziel": Ein Programm, welches ohne Betriebssystem läuft und nur 2 KiB benötigt und damit selbst auf eine altmodische 3,5 Zoll Diskette über 700x passen würde.

Update im November 2016

Etwa 12 Jahre später habe ich den Code noch einmal überarbeitet. Da Disketten inzwischen fast gar nicht mehr vorhanden sind, lässt sich das Spiel nun auch von USB Stick aus starten. Außerdem wurde der BIOS Parameter Block hinzugefügt, dieser ist ein Speicherbereich im Bootsektor, an dem sich vorher Code befand. Leider wird dieser Bereich von einigen BIOSen überschrieben oder manipuliert, um eine vermeintliche Kompatibilität zu erreichen. Um diese zusätzlichen Daten unterzubringen musste natürlich an anderer Seite eingespart werden. Es konnten noch einige Stellen im Code optimiert werden, so dass trotz des zusätzlichen Speicherbedarfs des BIOS Parameter Blocks von etwa 30 Byte über 100 weitere Bytes eingespart wurden. Diese wurden derzeit mit NOPs aufgefüllt, die Datei ist daher immer noch 2048 Byte groß. Die Spielmechanik wurde nicht verändert. Außerdem ist das Spiel gerade auf modernen CPUs energiesparsamer geworden, da der CPU zwischen zwei Frames in einen Schalfmodus überführt wird.

Starten des Spiels

Die Binärdatei ist unter einem Betriebssystem nicht direkt ausführbar. Die ursprüngliche Methode sah vor, das Spiel direkt auf die ersten vier Sektoren einer Diskette zu kopieren, wodurch auch deren Dateisystem zerstört wird. Um die Diskette anschließend wieder zu benutzen musste diese neu formatiert werden. Seit 2016 kann das Spiel mit der gleichen Methode auf einen USB Stick kopiert werden. Unter Linux geht das ganz einfach mit dem Befehl dd. Unter Windows benötigt man ein Tool mit dem man auch ISO Dateien auf einen USB Stick kopieren kann.

dd if=2016-spiel.bin of=device

Der Parameter device ist z.B. durch /dev/fd0 für eine Diskette oder /dev/sd? für einen USB Stick zu ersetzen, wobei das ? für das konkrete Laufwerk steht. ACHTUNG: Mit dem Befehl dd lassen sich sehr schnell Festplatten löschen. Vorher ist auf jeden Fall zu prüfen, ob man das richtige Device ausgewählt hat. Das Device darf außerdem nicht gemountet sein. Theoretisch ist es sogar möglich, dass Spiel von der Festplatte booten zu lassen.

Viel einfacher und ungefährlicher dagegen ist der Test in einem Emulator wie qemu:

qemu-system-x86_64 -fda 2016-spiel.bin

Auch unter Bochs und VirtualBox ist das Spiel lauffähig.

Übersetzen

Das Übersetzen des Quellcodes in die Binärdatei geschieht mit meinem Lieblingsassembler NASM (Netwide Assembler):

nasm -f bin -o 2016-spiel.bin 2016-spiel.asm

Im Gegensatz zu C oder C++ ist x86 ASM nicht standardisiert und die Notation weicht von Assembler zu Assembler teilweise erheblich ab. Ein Übersetzen mit einem anderen Assembler wird deshalb nicht möglich sein.

Download

Bitte beachten: Das Spiel steht unter einer MIT Lizenz, kann also salopp gesprochen von jedermann verwendet, modifiziert und wieder veröffentlicht werden. Ich stelle diese Software so bereit wie sie ist und hafte für keine Schäden! Die Verwendung geschieht auf eigene Gefahr! Die Software selbst sollte keine Schreibversuche auf irgendein Gerät unternehem, beim hantieren mit Tools wie dd lassen sich jedoch schnell durch kleine Unachtsamkeiten Festplatten oder andere Datenträger überschreiben. Nicht umsonst wird dd für manche als Abkürzung für "disk destroyer" verstanden. Ich empfehle daher zunächst den Betrieb in einem Emulator wie qemu.

Version 2016 (fehlerbereinigt, optimiert und auch für USB Sticks geeignet)

Version 2004 (nur für Disketten)

Zum Code

Das Programm läuft auf einem PC, ohne auf ein Betriebssystem wie Windows oder Linux angewiesen zu sein. Das BIOS lädt von der Diskette oder USB Stick automatisch den ersten Sektor (die ersten 512 Byte) und prüft, ob die letzten zwei Bytes der Signatur 0xAA55 entsprechen. Ist dies der Fall, so wird der Inhalt des Sektors ausgeführt.

Innerhalb dieses Bootsektors werden die restlichen 3 Sektoren nachgeladen und der Grafikmodus mit 320x200 Pixeln und 256 Farben gestartet. Die Bilder und die Schrift befinden sich in einem leicht komprimierten Format in der Datei vor und werden daher zunächst entpackt. Anschließend wird das Spiel gestartet.

Das gesamte Programm arbeitet im alten 16 Bit Real Modus, der selbst von den modernsten Intel und AMD Prozessoren noch unterstützt wird. In der 2016er Variante dieses Spiels wurde außerdem ein HLT Befehl eingeführt, der nach jedem Zeichenvorgang des Bildschirms den Prozessor bis zum nächsten Bild ruhen lässt, um Energie zu sparen. In der 2004er Version lief der Prozessor die gesamte Zeit auf Volllast.

Minimalanforderung ist ein 80186er CPU, etwa 256 KiB Ram, VGA Grafik mit 320x200 Pixel, 256 Farben, Diskettenlaufwerk
Ein solcher Computer dürfte etwa Mitte bis Ende der 1980er modern gewesen sein.


Impressum | Datenschutzerklärung | [*]: externer Link | thilo.ackermann@gmail.com