1 puan yazan GN⁺ 2023-10-09 | 1 yorum | WhatsApp'ta paylaş
  • 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’ta make.exe dahil
    • Windows’ta make.bat, Mac/Linux’ta make ile derlenir; varsayılan çıktı 5-compiled-rom-images klasöründeki elite-pal.NES
    • variant=ntsc ile elite-ntsc.NES oluşturulabilir
  • 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
  • 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

 
GN⁺ 2023-10-09
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.asm iç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.

    • Muhtemelen anılar birbirine karışmış. Piyasaya çıkan NES’in hiçbir revizyonunda donanım zamanlayıcısı yoktu.
      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.
    • BEAM Software’den (Melbourne House) Andrew Davie’den de benzer bir hikâye duymuştum. Kendisi Super Glove Ball’ı geliştirmişti; Nintendo’nun neredeyse hiç anlamlı dokümantasyon sağlamadığını, bu yüzden kare hızı hesaplama gibi kısımlarda çeşitli hack’ler kullanmak zorunda kaldıklarını söylemişti.
      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.

    • Elite Dangerous’tan gerçekten keyif aldım. Konsol desteği kesildikten sonra oynamadım ama tekrara düşen işler ve yüzeysel içeriğe rağmen arkadaşlarımla gemi kullanarak geçirdiğim zamanı özlüyorum.
      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ı.
    • Açık betadan beri Elite: Dangerous’ı uzun süre oynadım. Güzel bir oyun ve ses tasarımı harika.
      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/

    • Ian Bell ve web sitesi kesinlikle anılmaya değer. BBC Micro sürümünün özgün kaynak kodunu bulabileceğiniz yer orası ve o özgün diskler, NES projesi dâhil tüm Elite açıklama/yorumlama çalışmalarımın temelini oluşturuyor
      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ş

    • Orijinal alıntı şöyle: “Teknik olarak yayımladığım en büyük başarı, ekran dâhil BBC kaset sürümü ‘Elite’i 32K RAM’e sığdırmak ve karakter eşlemeli ekran ile tek bir NES kontrolcüsü kullanan Nintendo Entertainment System ‘Elite’ uyarlamasıdır. NES, yayımlanmış uyarlamalar arasında favorimdir ve biz başarana kadar teknik olarak mümkün olduğu düşünülmüyordu.”
      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
    • Ama köle ve uyuşturucu ticaretini çıkarmışlar ya :)
    • Arch Elite kesinlikle zirve
    • Yakın tarihli Oric Atmos hayran yapımı sürüm de oldukça iyi: https://www.youtube.com/watch?v=kC1cJGLGlxo
  • Her bank’ın başında böyle bir bank değiştirme shim’i olmasını seviyorum
    SEI / INC $C006 / JMP BEGIN
    Yer 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ızca NOP ile de flush yapılabilecek gibi duruyor
    Bu yüzden benim 2 baytlık optimizasyonum şöyle: SEI / INC $FFFD ; komut vektöründeki C0’ı bunun yerine kullan / NOP

    • JMP’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ıyor
      Bir 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

    • 6502 kullanılan dönemde her şey kafada tutulmazdı; traktör beslemeli nokta vuruşlu yazıcı kâğıdı yığınlarında saklanırdı. Genelde kurşun kalemle yazılmış bir sürü not ve düzeltme de olurdu
    • Modern dönemde 8 bit cihazlar için biraz gömülü geliştirme yaptım; 80’lerde bunu yapan mühendislere gerçekten saygı duyuyorum.
      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/...
    • O zamanlar biz daha iyi bizlerdik. Ciddi konuşursak, belli bir ölçeği olan projelerde neredeyse mutlaka çok miktarda kodun kâğıda yazılması ya da çıktısının alınması gerekiyordu. Gerçekten çok kâğıt lazımdı
    • Bu kod son derece iyi düzenlenmiş ve iyi belgelenmiş. Orijinal kodun belgeleme düzeyi nasıldı bilmiyorum ama çıktılarda el yazısı notlar gibi pek çok şey olduğunu tahmin ediyorum.
      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
    • Modern bir mühendis olarak bunu neden kafada tutmak gerektiğini pek anlamıyorum
  • Ö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

    • Bunun nedeni Braben’ın telif hakkı konularında zorlayıcı davranmasıydı. Bell ise aksine iyi biriydi ve bizzat yazdığı kısımların çoğunu yayımladı
    • Bu yayımlanmanın geçmişi onlarca yıl öncesine kadar uzanıyor.
      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ı