Kompilieren wie 1992 (2014)
(fabiensanglard.net)- Der originale Wolfenstein-3D-Quellcode von 1992 passt nicht direkt auf moderne Systeme, lässt sich aber erneut kompilieren, wenn man die Umgebung mit DosBox und Borland C++ 3.1 nachbildet
- Die benötigten Komponenten sind der Wolfenstein-3D-Quellcode, DosBox, Borland C++ 3.1 und die Shareware-Assets zum Ausführen
- Beim Build-Prozess müssen nicht nur die Projekteinstellungen von Borland C++ gesetzt, sondern auch die Pfade für
PATH,SIGNON.OBJundGAMEPAL.OBJmanuell korrigiert werden - Der Grund für die Grafikfehler beim ersten Start ist, dass der im Engine-Code einkompilierte Grafikindex nicht mit den Positionen innerhalb der Asset-Dateien übereinstimmt
- Wenn man die neu erzeugten VGA-Assets kopiert und in DosBox die aspect correction aktiviert, lässt sich das Spiel in einer Form starten, die dem CRT-Seitenverhältnis von 1992 nahekommt
Die Build-Umgebung von 1992 nachbilden
- Der originale Wolfenstein-3D-Quellcode von 1992 ist auf modernen Systemen mehr als 20 Jahre später nicht mehr ohne Weiteres nutzbar, kann aber kompiliert werden, wenn man die damaligen Werkzeuge und die Laufzeitumgebung passend einrichtet
- Benötigt werden diese vier Dinge
- Wolfenstein-3D-Quellcode
- DosBox
- Borland C++ 3.1
- Wolfenstein-3D-Shareware-Assets
Verzeichnisse vorbereiten, die wie DOS-Laufwerke genutzt werden
- Lokal werden zwei Verzeichnisse angelegt, die wie DOS-Laufwerke verwendet werden
system/csystem/a
- In
system/akommt das Archiv von Borland C++ 3.1 - In
system/ckommen der Wolfenstein-3D-Quellcode und die VGA-Dateien - Nach dem Entpacken ist die Dateistruktur wie folgt
system/a:BCPP31.zipsystem/c:wolfsrc.zip,vgafiles.zip
Compiler und Quellcode in DosBox installieren
- Nach dem Start von DosBox werden lokale Ordner als DOS-Laufwerke gemountet
~/system/cwird alsC:gemountet~/system/awird alsA:gemountet
- In
A:\BCPP31wirdinstallausgeführt, um Borland C++ 3.1 zu installieren- Die Standardeinstellungen bleiben unverändert und die Installation wird gestartet
- Die Warnung, dass kein Microsoft-Windows-Ordner gefunden werden kann, ist hier nicht relevant und wird mit Enter übersprungen
- Unter
C:\wird das Installationsprogramm für den Wolfenstein-3D-Quellcode ausgeführt, mit dem Standardpfad\WOLFSRC
Das Borland-C++-Projekt bauen
- Borland C++ 3.1 wird über
C:\BORLANDC\BIN\BC.EXEgestartet - Das Projekt
..\..\WOLFSRC\WOLF3D.PRJwird geöffnet und die Verzeichnisse werden wie folgt gesetztInclude Directories: C:\BORLANDC\INCLUDELibrary Directories: C:\BORLANDC\LIBOutput Directories: OBJSource Directories: C:\WOLFSRC
- Beim ersten Build tritt der Fehler
Cannot find executable TASMauf- Borland C++ wird beendet,
PATH=C:\BORLANDC\BINgesetzt und das Programm anschließend erneut gestartet
- Borland C++ wird beendet,
- Beim nächsten Build tritt in der Link-Phase der Fehler
Unable to find OBJ fileaufSIGNON.OBJundGAMEPAL.OBJsind im Projekt fälschlich auf den PfadC:\SOURCE\WOLF\gesetzt- Die beiden Einträge werden aus dem Projekt entfernt und anschließend als
WOLFSRC\OBJ\SIGNON.OBJbzw.WOLFSRC\OBJ\GAMEPAL.OBJerneut hinzugefügt
- Danach verläuft
Compile -> Build Allerfolgreich
Laufzeit-Assets und Ursache der Grafikfehler
- Um die kompilierte ausführbare Datei zu starten, werden die Shareware-Assets oder die Vollversions-Assets von Wolfenstein 3D benötigt
- Nach der Installation der Shareware wird die kompilierte
.EXEin den Spielordner kopiert und gestartet, doch die Anzeige ist fehlerhaft - Der Grund liegt in der Produktions-Pipeline der Grafikdateien und in der Art, wie die Engine auf Assets zugreift
- Adrian Carmack und Kevin Cloud erstellten die Grafikdateien und bündelten sie anschließend mit dem Tool IGRABed
- Das Ergebnis besteht aus den drei Dateien
VGAHEAD.WL1,VGAGRAPH.WL1,VGADICT.WL1sowie den beiden DateienGRE.HundGRE.EQU
VGAHEAD.WL1ist ein Index, der auf die Datenpositionen innerhalb vonVGAGRAPH.WL1verweist- In
VGAGRAPH.WL1liegen Huffman-komprimierte Daten VGADICT.WL1enthält das Huffman-Wörterbuch zum Dekomprimieren
- In
GRE.HundGRE.EQUsind Dateien, über die die Engine per Namen auf Assets zugreifen kann- Ein logischer Name wie
L_GUYPICwird dabei mit einem tatsächlichen Indexwert verknüpft - Die Engine wird mit hartkodierten Bildindizes gebaut
- Ein logischer Name wie
- Nach der Veröffentlichung der Wolfenstein-3D-Shareware veränderten sich Assets und Codebasis zusammen mit Spears of Destiny, sodass die Indizes des neu kompilierten Spiels nicht mehr zu den Positionen in den vorhandenen Asset-Dateien passten
VGA-Assets austauschen und Seitenverhältnis korrigieren
- Die Lösung besteht darin, die neu erzeugten VGA-Assets, die zu den im Quellcode enthaltenen
.H- und.EQU-Indizes passen, in den Spielordner zu kopieren - Wenn Shareware-Assets verwendet werden, müssen die Dateierweiterungen beim Kopieren von
.WL6in.WL1geändert werdenVGADICT.WL6→VGADICT.WL1VGAGRAPH.WL6→VGAGRAPH.WL1VGAHEAD.WL6→VGAHEAD.WL1
- Nach dem Austausch funktioniert das Spiel wieder korrekt, wenn
WOLF3D.EXEerneut gestartet wird - Die Standardanzeige von DosBox entspricht nicht dem Bild, das Menschen 1992 ursprünglich gesehen haben
- Der VGA-Framebuffer ist 320x200
- CRT-Monitore hatten ein 4:3-Seitenverhältnis, wodurch das Bild bei der Ausgabe vertikal gestreckt wirkte
- In der DosBox-Konfiguration kann unter
[render]aspect=falseaufaspect=truegeändert werden, um die Seitenverhältnis-Korrektur zu aktivieren - Mit dieser Korrektur läuft Wolfenstein 3D in einer Darstellung, die der damaligen CRT-Ausgabe sehr nahekommt
1 Kommentare
Meinungen auf Hacker News
Ich kann das am Ende des Artikels erwähnte Wolfenstein-3D-Buch sehr empfehlen. Obwohl es technisch ist, ist es weder trocken noch langweilig, und es enthält viele Old-School-Optimierungen: 64 ausgerollte Funktionen zum Skalieren von Wandtexturen, die Art, Sprites „seitlich“ zu speichern, der Umgang mit seltsamen Grafikkarten und wie man Grafikmodi hackte, damit es überhaupt wie ein Spiel aussah
Es sieht so aus, als sei es noch nicht erschienen, stimmt das?
Das Gute an Retro-Systemen ist, dass man sie wieder bauen kann, sobald man nur die Tools zusammenträgt. Ich habe kürzlich zum Spaß das alte Spiel Uplink neu kompiliert; alles, was ich brauchte, war Visual Studio 6.0, und im Entwicklungsarchiv waren alle zum Build nötigen Abhängigkeiten enthalten
Es dauerte etwa eine Stunde, die Abhängigkeiten passend einzurichten, aber am Ende hat es geklappt, und das Spiel läuft gut. Ich habe auch ein paar kleine Bugs behoben und hier und da kleine Verbesserungen eingebaut. Wenn ich daran denke, das mit heutiger Software zu tun, wirkt das völlig wahnsinnig
thirdparty/-Ordner vendored, und die verwendete Toolchain war ebenfalls festgelegt, sodass das Setup immer reproduzierbar warIch habe mit Borland Turbo C++ programmieren gelernt. Einer der Gründe, warum ich diese Zeit vermisse, ist, dass man Dinge, die kompliziert wirkten, so einfach erledigen konnte. Man rief einfach Funktionen für geometrische Formen auf, und schon wurden sie auf den Bildschirm gezeichnet; nachdem man eine Form gezeichnet hatte, konnte man durch Aufruf der Funktion
xorauf eine leicht andere Form sogar Animationen erzeugenMit Freunden habe ich mit diesen Techniken ein Final-Fantasy-ähnliches Spiel gebaut, mit handgemachten Sprites, kartenweisen Screens, einer Welt, in der man am Rand zur benachbarten Karte wechselte, und Kämpfen, die starteten, wenn bei jedem Schritt die natürliche Zahl 1 herauskam. Es war umständlich, aber für einen Schüler unglaublich spaßig; und entscheidend war, dass man nicht wie heute gleich zu Beginn SFML, ActiveX oder OpenGL lernen musste, sondern einfach
circleaufrufen konnteconio.hund Borlands BGI-graphics.h. Heute übernimmt SDL in gewissem Maße diese Rolle, ist aber nicht ganz so simpelNachdem es hier über die Jahre mehrfach erwähnt wurde, habe ich vor ein paar Monaten endlich Masters of Doom gelesen, und es war ein großartiges Buch. Die Spiele, die sie damals bauten, waren schon als Spielerlebnis unglaublich spannend; rückblickend ist aber noch inspirierender, was ein paar junge Entwickler mit wenig Mitteln erschaffen konnten
Ich vermisse die textbasierten UIs von DOS wirklich. Ich denke an meinen zuverlässigen PS/2, den ich bis etwa 1997 weiterbenutzte
Installation auf Laufwerk C, was für ein Luxus! Ich hatte keine Festplatte, also habe ich ständig Disketten zwischen Laufwerk A und B gewechselt, und der Compiler verlangte immer wieder nach ausgetauschten Teilen. Trotzdem hatten wir Spaß. Die Kinder von heute glauben einem solche Geschichten nicht, selbst wenn man sie ihnen immer wieder erzählt
Borland C++ war wirklich hervorragend. Eine IDE mit C++-Compiler, Standardbibliothek und Debugger passte in etwa 5 MB, inklusive der gemütlichen Borland-Farbpalette mit gelber Schrift auf blauem Hintergrund
Borlands MS-DOS-IDEs sind süße Erinnerungen
Ich habe es dieses Jahr für ein paar Tage Advent of Code benutzt, aber die Nostalgie verflog schnell. Wenn man an moderne Umgebungen gewöhnt ist, sind die Einschränkungen der IDE und die Weitschweifigkeit von Pascal nicht wirklich „spaßig“ für den täglichen Gebrauch. Trotzdem sind die Erinnerungen definitiv süß
Insbesondere erkennen sie einzelne Alt-Tastendrücke, Alt+Buchstaben-Kombinationen und Ctrl+Shift+Links/Rechts nicht
Verwandter Artikel: Let’s compile like it’s 1992 (2014) - https://news.ycombinator.com/item?id=13750097 - Februar 2017, 80 Kommentare
Ich hatte Probleme beim Öffnen des Archivs. Bei
wolfsrc.zipkam der Fehler End-of-central-directory signature not found, und es hieß, es sei keine Zip-Datei oder könne Teil eines über mehrere Datenträger verteilten Archivs seincurl -O [http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsr...](<http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip>)eine HTML-Datei heruntergeladenAuch das Ergebnis von
$ file wolfsrc.zipwarwolfsrc.zip: HTML document text, ASCII text.wgetdagegen lud die Datei korrekt herunter, und sie ließ sich problemlos entpacken