1992'deki Gibi Derleyelim (2014)
(fabiensanglard.net)- 1992 tarihli Wolfenstein 3D özgün kaynak kodu modern sistemlerle doğrudan uyumlu değil, ancak DosBox ve Borland C++ 3.1 ortamı yeniden oluşturulursa tekrar derlenebiliyor
- Gereken bileşenler Wolfenstein 3D kaynak kodu, DosBox, Borland C++ 3.1 ve çalıştırma için shareware varlıkları olarak özetleniyor
- Derleme sürecinde Borland C++ proje ayarlarının yanı sıra
PATH,SIGNON.OBJ,GAMEPAL.OBJyollarını elle düzeltmek gerekiyor - İlk çalıştırmada grafiklerin bozulmasının nedeni, motora derlenmiş grafik indeksleri ile varlık dosyalarının iç konumlarının birbirinden sapmış olması
- Yeniden oluşturulmuş VGA varlıkları kopyalanıp DosBox’ın aspect correction özelliği açıldığında, 1992’deki CRT ekran oranına yakın bir biçimde çalıştırılabiliyor
1992 derleme ortamını yeniden oluşturma
- Wolfenstein 3D’nin 1992 tarihli özgün kaynak kodunu, aradan 20 yıldan fazla geçmiş modern sistemlerde olduğu gibi kullanmak zor; ancak dönemin araçları ve çalışma ortamı eşleştirilirse derlenebiliyor
- Gereken bileşenler şu dört şey
- Wolfenstein 3D kaynak kodu
- DosBox
- Borland C++ 3.1
- Wolfenstein 3D shareware varlıkları
DOS sürücüsü gibi kullanılacak dizini hazırlama
- Yerelde DOS sürücüsü gibi kullanılacak 2 dizin oluşturulur
system/csystem/a
system/aiçine Borland C++ 3.1 sıkıştırılmış dosyası alınırsystem/ciçine Wolfenstein 3D kaynak kodu ve VGA dosyaları alınır- Arşivler açıldıktan sonra dosya yerleşimi şöyle düzenlenir
system/a:BCPP31.zipsystem/c:wolfsrc.zip,vgafiles.zip
DosBox’ta derleyici ve kaynak kodu kurma
- DosBox çalıştırıldıktan sonra yerel klasörler DOS sürücüsü olarak bağlanır
~/system/c,C:olarak bağlanır~/system/a,A:olarak bağlanır
A:\BCPP31içindeinstallçalıştırılarak Borland C++ 3.1 kurulur- Varsayılan ayarlar korunur ve kurulum başlatılır
- Microsoft Windows klasörünün bulunamadığına dair uyarı gerekli olmadığından Enter ile geçilir
C:\içinde Wolfenstein 3D kaynak kurulum programı çalıştırılır ve varsayılan yol\WOLFSRCkullanılır
Borland C++ projesini derleme
C:\BORLANDC\BIN\BC.EXEile Borland C++ 3.1 çalıştırılır..\..\WOLFSRC\WOLF3D.PRJprojesi açılır ve dizinler şöyle ayarlanırInclude Directories: C:\BORLANDC\INCLUDELibrary Directories: C:\BORLANDC\LIBOutput Directories: OBJSource Directories: C:\WOLFSRC
- İlk derlemede
Cannot find executable TASMhatası oluşur- Borland C++ kapatılır,
PATH=C:\BORLANDC\BINayarlanır ve yeniden çalıştırılır
- Borland C++ kapatılır,
- Sonraki derlemede bağlama aşamasında
Unable to find OBJ filehatası oluşurSIGNON.OBJveGAMEPAL.OBJ, projede yanlış biçimdeC:\SOURCE\WOLF\yolu olarak belirtilmiştir- İki öğe projeden silinir ve
WOLFSRC\OBJ\SIGNON.OBJ,WOLFSRC\OBJ\GAMEPAL.OBJolarak yeniden eklenir
- Ardından
Compile -> Build Allçalıştırıldığında derleme başarılı olur
Çalıştırma varlıkları ve grafik bozulmasının nedeni
- Derlenmiş çalıştırılabilir dosyayı çalıştırmak için Wolfenstein 3D shareware veya tam sürüm varlıkları gerekir
- Shareware kurulumundan sonra derlenmiş
.EXEoyun klasörüne kopyalanıp çalıştırıldığında ekran garip görünür - Bunun nedeni grafik dosyalarını oluşturan üretim hattı ile motorun varlıklara erişim biçimidir
- Adrian Carmack ve Kevin Cloud grafik dosyalarını oluşturduktan sonra bunları IGRABed aracıyla paketledi
- Çıktı,
VGAHEAD.WL1,VGAGRAPH.WL1,VGADICT.WL1adlı 3 dosya veGRE.H,GRE.EQUadlı 2 dosyadan oluşur
VGAHEAD.WL1,VGAGRAPH.WL1içindeki veri konumlarını gösteren bir indekstirVGAGRAPH.WL1içinde Huffman sıkıştırmalı veriler saklanırVGADICT.WL1içinde sıkıştırma açma için Huffman sözlüğü bulunur
GRE.HveGRE.EQU, motorun varlıklara adlarıyla erişmesini sağlayan dosyalardır- Örneğin
L_GUYPICgibi mantıksal bir ad gerçek indeks değeriyle ilişkilendirilir - Motor, görüntü indeksleri hard-coded olacak şekilde derlenir
- Örneğin
- Wolfenstein 3D shareware yayımlandıktan sonra varlıklar ve kod tabanı Spears of Destiny ile birlikte değiştiği için, yeni derlenen oyunun indeksleri mevcut varlık dosyalarının konumlarıyla uyuşmaz hâle geldi
VGA varlıklarını değiştirme ve ekran oranı düzeltmesi
- Çözüm, kaynak kodda yer alan
.H,.EQUindeksleriyle uyumlu olacak şekilde yeniden oluşturulmuş VGA varlıklarını oyun klasörüne kopyalamaktır - Shareware varlıkları kullanılıyorsa dosya uzantıları
.WL6yerine.WL1olacak şekilde değiştirilerek kopyalanmalıdırVGADICT.WL6→VGADICT.WL1VGAGRAPH.WL6→VGAGRAPH.WL1VGAHEAD.WL6→VGAHEAD.WL1
- Değişimden sonra
WOLF3D.EXEyeniden çalıştırıldığında oyun normal biçimde çalışır - DosBox’ın varsayılan ekranı, insanların 1992’de gördüğü özgün ekrandan farklıdır
- VGA framebuffer 320x200’dür
- CRT monitörler 4:3 ekran oranına sahip olduğundan çıktı dikey olarak uzamış görünürdü
- DosBox ayarlarında
[render]altındakiaspect=false,aspect=trueolarak değiştirilirse ekran oranı düzeltmesi uygulanır - Ekran oranı düzeltmesi de uygulandığında Wolfenstein 3D, dönemin CRT görüntüleme biçimine yakın bir görünümle çalışır
1 yorum
Hacker News yorumları
Yazının sonunda adı geçen Wolfenstein 3D kitabını şiddetle tavsiye ederim. Teknik bir içerik olmasına rağmen kuru ya da sıkıcı değil; duvar dokusu ölçekleme için açılmış 64 fonksiyon, sprite’ları “yana doğru” saklama yöntemi, tuhaf ekran kartlarıyla uğraşma, baştan oyun gibi görünsün diye grafik modunu hack’leme gibi eski usul optimizasyonlardan bolca bahsediyor
Henüz çıkmamış gibi görünüyor, doğru mu?
Retro sistemlerin güzel yanı, araçları bir araya getirdiğinizde yeniden derleyebilmeniz. Yakın zamanda eğlencesine eski Uplink oyununu tekrar derledim; gereken tek şey Visual Studio 6.0’dı ve geliştirme arşivinde derleme için gerekli tüm bağımlılıklar vardı
Bağımlılıkları ayarlamak yaklaşık bir saat sürdü ama sonunda başardım ve oyun da düzgün çalıştı. Küçük bir hatayı da düzelttim, oraya buraya ufak iyileştirmeler ekledim. Günümüz yazılımlarına dokunmayı düşününce gerçekten delilik
thirdparty/klasörüne vendor edilir, kullanılan toolchain de sabitlenirdi; bu yüzden kurulum her zaman yeniden üretilebilirdiProgramlamayı Borland Turbo C++ ile öğrendim. O günleri özlememin nedenlerinden biri, karmaşık görünen işleri çok kolay yapabilmesiydi. Geometrik şekil fonksiyonunu çağırmanız yeterliydi, ekrana çizim yapardı; bir şekil çizdikten sonra biraz farklı bir şekil için
xorfonksiyonunu çağırınca animasyon bile yapabiliyordunuzArkadaşlarımla bu tekniklerle Final Fantasy benzeri bir oyun yaptık; elle hazırlanmış sprite’lar, ekran bazlı haritalar, kenara gidince bitişik haritaya geçilen bir dünya ve her adımda doğal sayı 1 gelirse savaşa girilen bir yapı bile vardı. Zahmetliydi ama lise öğrencileri için gerçekten eğlenceliydi; bugünkü gibi daha baştan SFML, ActiveX, OpenGL öğrenmek yerine sadece
circleçağırabilmek büyük farktıconio.hve Borland’ın BGIgraphics.hdosyaları aklıma geldi. Bugün SDL bir ölçüde o rolü üstleniyor ama o kadar basit değilBurada yıllar içinde birkaç kez adı geçtiğini görünce birkaç ay önce nihayet Masters of Doom’u okudum; harika bir kitaptı. O dönemde yaptıkları oyunlar oynanış olarak zaten inanılmaz ilgi çekiciydi ama geriye dönüp bakınca, elinde az imkân olan birkaç genç geliştiricinin neler yapabildiği daha da büyük ilham veriyor
DOS’un metin tabanlı UI’ını gerçekten özlüyorum. 1997 civarına kadar kullanmaya devam ettiğim güvenilir PS/2’im aklıma geliyor
C sürücüsüne kurmak mı, ne lüks! Sabit diskim yoktu; A ve B sürücüleri arasında sürekli disket değiştirirdim, derleyici de sürekli değiştirilmiş parçalarını isterdi. Yine de keyif alırdık. Bugünün çocukları böyle hikâyeler anlatsan inanmaz
Borland C++ gerçekten çok iyiydi. C++ derleyicisi, standart kütüphane ve debugger içeren IDE yaklaşık 5 MB’a sığıyordu; sarı yazılar ve mavi arka plandan oluşan o sıcacık Borland renk paleti de vardı
Borland’ın MS-DOS IDE’leri tatlı hatıralar
Bu yıl Advent of Code’un birkaç gününde kullandım ama nostalji çabuk geçti. Modern ortamlara alışmışken IDE’nin kısıtları ve Pascal’ın uzun uzun yazma gerektirmesi günlük kullanım için pek “eğlenceli” değildi. Yine de anılar kesinlikle tatlı
Özellikle tek başına Alt tuşunu, Alt+harf kombinasyonlarını ve Ctrl+Shift+sol/sağ ok tuşlarını algılayamıyorlar
İlgili yazı: Let’s compile like it’s 1992 (2014) - https://news.ycombinator.com/item?id=13750097 - Şubat 2017, 80 yorum
Arşivi açarken sorun yaşadım.
wolfsrc.zipiçin End-of-central-directory signature not found hatası verdi; dosyanın zip olmayabileceği ya da çok diske bölünmüş bir arşivin parçası olabileceği yazıyorducurl -O [http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsr...](<http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip>)kullanınca HTML dosyası indirildi$ file wolfsrc.zipsonucu dawolfsrc.zip: HTML document text, ASCII textidi. Buna karşılıkwgetdosyayı düzgün indirdi ve sorunsuz açabildim