NES Elite - NES için Elite’in belgelenmiş kaynak kodu
(github.com/markmoxon)- Ian Bell ve David Braben’in NES için Elite kaynak kodu; her satırı belgelenmiş, çoğu açıklanmış ve orijinal oyun ikilisinin disassembly’sinden elle yeniden oluşturulmuş
- Modern bilgisayarlarda kaynaktan tamamen çalışan bir oyun derleyip gerçek NES’te veya emülatörde yüklenebilen bir iNES ROM image oluşturmak mümkün
- Desteklenen varyantlar Imagineer PAL variant ve Ian Bell’in kişisel web sitesindeki NTSC variant; varsayılan derleme PAL variant
- Kaynakta gezinme yöntemi, elite.bbcelite.com üzerinde insan tarafından okunabilir biçimde görüntülemek veya açıklamalı kaynakları IDE’de açmak; web sitesi ile kaynak dosyalarının içeriği aynı
- Derleme gereksinimleri BeebAsm, Python ve Mac/Linux’ta
make; Python derlemesi yalnızca 3.x üzerinde test edilmiş, Windows’tamake.exedahil- Windows’ta
make.bat, Mac/Linux’tamakeile derlenir; varsayılan çıktı5-compiled-rom-imagesklasöründekielite-pal.NES variant=ntscileelite-ntsc.NESoluşturulabilir
- Windows’ta
- Derleme seçenekleri varyant seçimini, maksimuma yakın test commander kullanımını, orijinal ikiliyle eşleşmeyi atlamayı, crc32 doğrulamasını devre dışı bırakmayı vb. kontrol eder
- Temsili örnek:
make variant=ntsc commander=max match=no verify=no crc32.py, oluşturulan dosya ile orijinal kaynaktan çıkarılan referans dosyanın checksum ve dosya boyutunu yan yana karşılaştırır
- Temsili örnek:
- PAL ve NTSC varyantları NMI handler döngü sayısı, Start screen’deki Imagineer/Nintendo heading’i, combat demo auto-play bekleme süresi, save slot checksum algoritması, dahili sürüm numarası, gizli copyright message, scroll text, y-coordinate sabitleri gibi noktalarda farklılık gösterir
- NTSC variant gerçek NTSC donanımında çalışmaz; bazı emülatörlerin NTSC mode’una uyacak şekilde NMI timing’i değiştirilmiş bir NTSC emulation’dır
- Lisans dosyası yoktur; bu nedenle varsayılan telif hakkı yasası geçerlidir ve yalnızca okuma ile fork’a izin verilir, çoğaltma, dağıtım ve türev eser oluşturma izinli değildir
1 yorum
Hacker News yorumları
Uzun zaman önce Frontier’da çalışırken David Braben’dan NES Elite hakkında ilginç bir anekdot duymuştum; hatırladığım kadarıyla başta NES’in donanım zamanlayıcısıyla gerçek zamanı izleyip kare hızı farklı olsa bile fiziğin tutarlı ilerlemesini sağlamışlardı.
Nintendo’nun yayın öncesi kontrolünde, bazı erken NES’lerde o zamanlayıcının düzgün çalışmadığı gerekçesiyle kullanılamaz kararı verildiğini; bunun üzerine Bell/Braben’ın her fonksiyonun ilgili karede kaç saat çevrimi kullandığına dair kendi tahminini tuttuğunu ve kare sonunda bunları toplayarak geçen süreyi tahmin edecek hâle getirdiğini duymuştum.
Ama GitHub’daki kaynak koda bakınca ya yanlış hatırladığımı ya da Braben’ın sözlerini doğru anlamadığımı düşünüyorum.
elite-source-bank-7.asmiçinde “NES’in desteklemediği donanım zamanlayıcısının yerine kullanılabilecek NMI zamanlayıcısını günceller” şeklinde bir yorum var ve maskelenemeyen kesmeleri sayarak gerçek zamana yakın bir saat uyguladıkları anlaşılıyor.Erken NES CPU kalıbında hatalı ve devre dışı bırakılmış programlanabilir aralık zamanlayıcısının kalıntıları vardı: https://www.nesdev.org/wiki/RP2A03_Programmable_Interval_Tim...
Sonraki revizyonlarda tamamen kaldırıldı; yalnızca geliştirme kitleri gibi yerlerde etkinleştirilmiş olması mümkün. Tüketici cihazlarında çalışmayan bir özelliğe dayanıyorduysa Nintendo testinde reddedilmesi gayet doğal olurdu.
Çıkmış konsollarda programlanabilir aralık zamanlayıcısı olsaydı bile, en fazla hassas raster efektleri gibi alt-kare ölçümlerinde işe yarardı. Gerçek zamanı ölçmek için NMI sayımı çok daha mantıklı. NMI her video karesinin başında oluşur ve 60,0988 Hz’de çok kararlıdır; oyun motoru yavaşlayıp kare hızı değişse bile CPU tarafındaki işlem video sinyalinin zamanlamasını etkileyemez.
Bu arada ses donanımı da zamanlayıcı kesmeleri üretebilir ve birçok genişletme çipinde render senkronizasyonu için scanline sayacı bulunur. NES’te zamanı ölçmenin yolu eksik değil.
Bir oyunu Nintendo’ya onaylatmaya çalışırken, Amerikan NES’in belirli bir sürümünde çalışmadığını ya da sistemin aşırı ısınmasına yol açtığını duymuştum. Çıkış takvimi sıkışıktı; sorunu çözmek için Nintendo genel merkezine kadar uçması gerekmişti ve hatırladığım kadarıyla o belirli sürümden piyasada 100 adetten az vardı.
Daha sonra yayımlanmamış bir kitabın notlarını buldum; gerçekte durum biraz farklıymış. Oyun testleri yalnızca oynanışla sınırlı değildi; çalışabileceği tüm NES konsol varyantlarında test edilmesi gerekiyordu. Beam Software’den Andrew Davie, “The Three Stooges”un Washington’daki Nintendo ofisinde test için kullanılan NES’te sorun çıkardığını ve bizzat oraya gittiğini hatırlıyordu.
Oyunun geçebilmesi için farklı çip üreticisi kombinasyonları gibi “yaklaşık 23 makine varyantı” olduğunu söylemişti. Resmî dokümantasyon eksikliği yüzünden sprite verilerini resmî önerideki gibi RAM’e yazmak yerine her 2 saniyede bir doğrudan yazdırdığını; bunun NES’in fazla ısınmasına ve oyun genelinde sprite titremesine neden olduğunu anlatmıştı. Düzeltmeden sonra yayın onayı almıştı; sorunlu NES kombinasyonundan tüm ABD’de yaklaşık 5 tane bulunduğu söylenerek Nintendo’nun test hattından çıkarılmıştı.
Yakın zamanda devam oyunu Elite: Dangerous’a başladım; sorunları yok değil ama oldukça etkileyici bir deneyim.
1984 sürümünden gelen oyun öğelerini görmek tuhaf biçimde duygulandırıcıydı. O dönemin son teknolojisi sayılan 16K bellek eşlemeli ekranda vektör grafikleriyle gördüğüm gemilerin ve özellikle Coriolis istasyonunun 4K/60fps tam 3D render’a dönüşmüş hâlini görmek beklediğimden daha duygusal geldi.
Reklam panoları, bitkiler ve yanaşma ekipmanıyla ayrıntılı bir Coriolis iç mekânını nihayet görmek, açıkçası gözlerimi biraz yaşartacak kadar etkiledi. Şu an zorlukları olsa da bu oyun değerli bir miras ve bir şekilde yaşamaya devam etmesini isterim.
Blue Danube eşliğinde uzay gemisini manuel olarak yanaştırmak her zaman rahatlatıcı bir deneyimdi.
Uzay simülatörleri ve uzay oyunları neden hep bu kadar sorunlu hâle geliyor merak ediyorum. Elite Dangerous hiçbir yere gidemiyormuş gibi görünüyor, Star Citizen sonsuz beta gibi, KSP2 de hayal kırıklığıydı.
9 yıl önce yazdığım düşünceler: https://hypertexthero.com/elite-dangerous-education/
Odyssey genişleme paketi de eğlenceli; umarım bir gün gemi dışı uzay yürüyüşü ve sıfır yerçekimi görevleri eklenir.
Orijinale neredeyse sadık bir C sürümü olan Elite - The New Kind de var: https://github.com/fesh0r/newkind
Christian Pinder tarafından yapılmış: https://www.christianpinder.com/games/
Ian Bell’in Elite ana sayfası da görülmeye değer; orada birden fazla özgün sürüm var: http://www.ianbellelite.com/
1991 NES sürümünün çekirdeği, yani 128K ROM’un yaklaşık %30’u, özünde 1986 BBC Master sürümü; o da 1984’teki orijinal BBC Micro sürümünün geliştirilmiş hâli. Commodore 64 ve Apple II sürümleri de aynı soydan geliyor ve geliştirme BBC Micro üzerinde yapılmış
Bank 0, 1 ve 2’deki kodun çoğu doğrudan özgün BBC sürümünden alınmış, bank 7’de de biraz daha var. Ön tarafa yeni grafik, ses ve kontrolcü rutinleri eklenmiş ama atan kalp hâlâ Beeb sürümü
Elite’in yazarı Ian Bell, NES sürümünün en sevdiği 8 bit Elite sürümü olduğunu söylemiş
Genel olarak ise 32 bit Archimedes portunu en çok sevdiğini söylemiş
Röportajın tamamı http://www.elitehomepage.org/archive/b5081501.htm adresinde
Bunu, en sevdiği sürümün BBC Micro kaset sürümü, en sevdiği uyarlamanın ise NES sürümü olduğu şeklinde yorumluyorum. Gerçi bir BBC fanboy’u olduğum için iyimser yorumluyor da olabilirim
Her bank’ın başında böyle bir bank değiştirme shim’i olmasını seviyorum
SEI/INC $C006/JMP BEGINYer kazanmak için böyle yapıldığı ayrıntılı şekilde açıklanıyor ama bana göre
JMP’nin gerekli olmasının tek nedeni komut hattı ve yalnızcaNOPile de flush yapılabilecek gibi duruyorBu yüzden benim 2 baytlık optimizasyonum şöyle:
SEI/INC $FFFD ; komut vektöründeki C0’ı bunun yerine kullan/NOPJMP’nin gerekli olmasının tek nedeni komut hattı” demek doğru, ama insanlar açısından da anlamlı. Yürütme bank 7’de başladığı için bank 7’ye atlıyorBir yan not olarak Game Boy’da giriş noktası sabit bank olan ROM0’da bulunduğundan, en azından yaygın MBC’lerde baştan böyle bir sorun yok
Karşılaştırma için Objective-C ile yazılmış açık kaynak Elite klonu Oolite’in kaynak kodu var: https://github.com/OoliteProject/oolite
https://oolite.space
https://news.ycombinator.com/item?id=7894145
Bunu 8 yaşındayken C64’te oynamıştım. 30 yıl sonra hâlâ bu kodu anlayamıyorum
Yalnızca bank 0’ın 18.305 satır assembly olması bile inanılmaz; bunu nasıl kafalarında tuttuklarına akıl sır erdiremiyorum
En üst düzey araçlar olsa bile kodu takip etmek için muazzam bir organizasyon ve disiplin gerekmiş olmalı. 80’lerin başındaki Hitachi 6303[0]/Motorola 6800[1] assembler’larını inceledim; insanların bu tür araç kısıtları altında başardıkları şey şaşırtıcı.
Örneğin aşağıdaki iki assembler’da etiketler en fazla 6 karakter olabiliyordu ve alt rutinlere özel yerel etiketler de yoktu. Kendi işimde açıklayıcılık için etiketleri 40 karakterle sınırlamama rağmen böyleydi.
Yine de bu mimarilerin göreli sadeliği, modern sistem gömülü çalışmalarına kıyasla gerçekten ferahlatıcı. Sistemin genel durumunu kabaca kafada tutabilmek kesinlikle bir avantaj.
0: http://www.bitsavers.org/components/hitachi/_dataBooks/U24_H...
1: http://www.bitsavers.org/components/motorola/6800/exorciser/...
Genel olarak assembly programlama da yüksek seviyeli dillerden çok farklı değil. Kodu fonksiyonlar, bloklar vb. halinde organize edersiniz. İç içe geçmiş jump’larla dolu, upuzun bir kod duvarı yazmak ciddi sorunları davet etmek demektir
Özgür yazılım olmaması üzücü. Elite’in yaratıcısı ben olsaydım, oyunun tüm portlarını özgür lisans altında yayımlardım.
Her hâlükârda bugünlerde ucuz bir netbook’ta Oolite oynayabiliyor, devasa eklenti listesi sayesinde aynı ya da daha fazla keyif alabiliyorsunuz
Braben tarafı Elite 4/Elite: Dangerous üzerinde çalıştığı için telif haklarını zayıflatmak istememiş gibi görünüyor
Tüm kaynak kodlar bu düzeyde belgelenmiş olmalı