1 poin oleh GN⁺ 2023-10-09 | 1 komentar | Bagikan ke WhatsApp
  • Kode sumber Elite untuk NES oleh Ian Bell dan David Braben, dengan dokumentasi di setiap baris dan penjelasan untuk sebagian besar bagiannya, direkonstruksi secara manual dari disassembly biner game asli
  • Dapat menghasilkan iNES ROM image yang sepenuhnya berfungsi dari source di komputer modern, lalu dimuat di NES asli atau emulator
  • Varian yang didukung adalah PAL variant milik Imagineer dan varian NTSC dari situs pribadi Ian Bell, dengan build default adalah varian PAL
  • Cara menelusuri source adalah melihatnya dalam format yang mudah dibaca manusia di elite.bbcelite.com atau membuka source beranotasi di IDE, dan isi situs web serta file source adalah sama
  • Persyaratan build adalah BeebAsm, Python, dan make di Mac/Linux; build Python hanya diuji pada 3.x, dan make.exe disertakan untuk Windows
    • Di Windows build menggunakan make.bat, di Mac/Linux menggunakan make, dan output default adalah elite-pal.NES di folder 5-compiled-rom-images
    • variant=ntsc dapat digunakan untuk membuat elite-ntsc.NES
  • Opsi build mengatur pemilihan varian, penggunaan commander uji yang mendekati nilai maksimum, melewati pencocokan biner asli, menonaktifkan verifikasi crc32, dan lainnya
    • Contoh utamanya adalah make variant=ntsc commander=max match=no verify=no
    • crc32.py membandingkan checksum dan ukuran file dari file hasil build dengan file acuan yang diekstrak dari source asli secara berdampingan
  • Varian PAL dan NTSC berbeda dalam jumlah siklus NMI handler, heading Imagineer/Nintendo di Start screen, waktu tunggu auto-play combat demo, algoritme checksum save slot, nomor versi internal, hidden copyright message, scroll text, konstanta y-coordinate, dan lainnya
  • Varian NTSC tidak berjalan di perangkat NTSC asli, melainkan emulasi NTSC dengan timing NMI yang diubah agar cocok dengan mode NTSC di beberapa emulator
  • Tidak ada file lisensi, sehingga hukum hak cipta default berlaku dan hanya mengizinkan membaca serta fork; reproduksi, distribusi, dan pembuatan karya turunan tidak diizinkan

1 komentar

 
GN⁺ 2023-10-09
Komentar Hacker News
  • Lama dulu saat bekerja di Frontier, saya mendengar anekdot menarik dari David Braben tentang NES Elite. Seingat saya, awalnya mereka melacak waktu nyata dengan timer perangkat keras NES agar fisika berjalan konsisten meski frame rate berbeda-beda
    Dalam pemeriksaan prarilis Nintendo, mereka menyatakan tidak boleh digunakan karena pada sebagian NES awal timer itu tidak berfungsi dengan benar. Saya dengar Bell/Braben lalu membuatnya mempertahankan estimasi sendiri tentang berapa banyak siklus clock yang dipakai tiap fungsi dalam frame tersebut, lalu menjumlahkannya di akhir frame untuk memperkirakan waktu yang berlalu
    Namun setelah melihat source di GitHub, tampaknya ingatan saya salah atau saya tidak memahami ucapan Braben dengan benar. Di elite-source-bank-7.asm ada komentar “memperbarui timer NMI yang dapat digunakan sebagai pengganti timer perangkat keras yang tidak didukung NES”, dan tampaknya mereka menghitung non-maskable interrupt untuk mengimplementasikan semacam jam waktu nyata

    • Mungkin ingatannya tercampur. Tidak ada timer perangkat keras pada revisi NES mana pun yang dirilis
      Pada die CPU NES awal ada bug dan sisa-sisa programmable interval timer yang dinonaktifkan: https://www.nesdev.org/wiki/RP2A03_Programmable_Interval_Tim...
      Pada revisi berikutnya fitur itu sepenuhnya dihapus, dan mungkin saja hanya diaktifkan pada hal-hal seperti development kit. Jika mereka bergantung pada fitur yang tidak berfungsi di perangkat konsumen, wajar saja Nintendo menolaknya dalam pengujian
      Kalaupun konsol rilis memiliki programmable interval timer, itu kemungkinan hanya berguna untuk pengukuran subframe seperti efek raster presisi. Untuk mengukur waktu nyata, penghitungan NMI jauh lebih masuk akal. NMI terjadi pada awal setiap frame video dan sangat stabil pada 60,0988Hz; meski game engine melambat sehingga frame rate berubah, pemrosesan di sisi CPU tidak dapat memengaruhi timing sinyal video
      Sebagai catatan, perangkat keras audio juga dapat membuat interrupt timer, dan banyak chip ekspansi memiliki scanline counter untuk sinkronisasi rendering. Cara mengukur waktu di NES tidak kurang
    • Saya juga pernah mendengar cerita serupa dari Andrew Davie dari BEAM Software (Melbourne House). Ia mengembangkan Super Glove Ball, dan katanya karena Nintendo hampir tidak menyediakan dokumentasi berarti, mereka harus memakai berbagai hack untuk hal-hal seperti perhitungan frame rate
      Saat mencoba mendapat persetujuan Nintendo untuk sebuah game, saya dengar game itu tidak berjalan pada satu versi tertentu NES Amerika atau menyebabkan sistem terlalu panas. Karena jadwal rilis sangat ketat, ia harus terbang ke kantor pusat Nintendo untuk menyelesaikannya, dan seingat saya versi tertentu itu jumlah edarannya kurang dari 100 unit
      Belakangan saya menemukan catatan dari buku yang belum terbit, dan kenyataannya agak berbeda. Pengujian game tidak terbatas pada gameplay saja; game harus diuji pada semua variasi konsol NES yang dapat menjalankannya. Andrew Davie dari Beam Software mengenang bahwa “The Three Stooges” menimbulkan masalah pada NES untuk pengujian di kantor Nintendo, Washington, sehingga ia pergi langsung ke sana
      Ia mengatakan agar game lolos, ada “sekitar 23 variasi mesin” termasuk kombinasi produsen chip yang berbeda, dan karena kurangnya dokumentasi resmi, ia membuat data sprite ditulis langsung setiap 2 detik alih-alih ditulis ke RAM seperti rekomendasi resmi, sehingga NES menjadi terlalu panas dan sprite berkedip di seluruh game. Setelah diperbaiki, game mendapat persetujuan rilis, dan saya dengar kombinasi NES yang bermasalah itu dihapus dari jajaran pengujian Nintendo karena hanya ada sekitar 5 unit di seluruh Amerika Serikat
  • Baru-baru ini saya mulai memainkan sekuel lanjutannya, Elite: Dangerous. Meski tidak tanpa masalah, pengalamannya cukup menakjubkan
    Rasanya aneh sekaligus mengharukan melihat elemen-elemen game yang berlanjut dari versi 1984. Melihat kapal-kapal, dan terutama stasiun Coriolis, yang dulu tampil sebagai grafis vektor pada layar memory-mapped 16K tercanggih saat itu, berubah menjadi rendering 3D penuh 4K/60fps terasa lebih emosional dari yang saya duga
    Akhirnya melihat interior Coriolis yang detail, lengkap dengan papan iklan, tanaman, dan perlengkapan docking, jujur saja sampai membuat mata sedikit berkaca-kaca. Terlepas dari kesulitan yang ada saat ini, game ini adalah warisan yang berharga, dan saya berharap ia terus bertahan dalam bentuk apa pun

    • Saya benar-benar menikmati Elite Dangerous. Setelah dukungan konsol dihentikan saya tidak lagi memainkannya, tetapi meski ada grind dan konten yang dangkal, saya merindukan waktu mengemudikan kapal bersama teman-teman
      Melakukan docking manual pesawat luar angkasa sambil mendengarkan Blue Danube selalu menjadi pengalaman yang menenangkan
      Saya penasaran kenapa simulator luar angkasa dan game luar angkasa selalu berakhir punya begitu banyak masalah. Elite Dangerous terlihat seperti tidak menuju ke mana-mana, Star Citizen seperti beta abadi, dan KSP2 juga mengecewakan
    • Saya sudah lama memainkan Elite: Dangerous sejak open beta. Gamenya indah, dan desain suaranya luar biasa
      Pemikiran yang saya tulis 9 tahun lalu: https://hypertexthero.com/elite-dangerous-education/
      Ekspansi Odyssey juga menyenangkan, dan saya berharap suatu hari nanti aktivitas luar kendaraan berupa spacewalk serta misi tanpa gravitasi akan ditambahkan
  • Ada juga Elite - The New Kind, versi C yang hampir setia pada karya aslinya: https://github.com/fesh0r/newkind
    Dibuat oleh Christian Pinder: https://www.christianpinder.com/games/
    Halaman Elite milik Ian Bell juga layak dilihat; ada beberapa versi orisinal di sana: http://www.ianbellelite.com/

    • Ian Bell dan situs webnya jelas layak disebut. Di sanalah Anda bisa menemukan kode sumber asli versi BBC Micro, dan disk-disk asli itu menjadi dasar dari semua pekerjaan anotasi Elite saya, termasuk proyek NES
      Inti versi NES 1991, yaitu sekitar 30% dari ROM 128K, pada dasarnya adalah versi BBC Master 1986, yang sendiri merupakan pengembangan dari versi BBC Micro asli tahun 1984. Versi Commodore 64 dan Apple II juga berasal dari garis keturunan yang sama, dan pengembangannya pun dilakukan di BBC Micro
      Sebagian besar kode di bank 0, 1, dan 2 diambil langsung dari versi BBC asli, dan masih ada sebagian lagi di bank 7. Rutinitas grafis, suara, dan kontroler baru ditempelkan di bagian depan, tetapi jantung yang berdetak tetaplah versi Beeb
  • Ian Bell, pembuat Elite, mengatakan bahwa versi NES adalah versi Elite 8-bit favoritnya
    Secara keseluruhan, katanya ia paling menyukai port 32-bit Archimedes

    • Kutipan aslinya seperti ini: “Secara teknis, pencapaian terbesar yang pernah saya terbitkan adalah memasukkan ‘Elite’ edisi kaset BBC, termasuk layarnya, ke dalam RAM 32K, dan konversi ‘Elite’ untuk Nintendo Entertainment System yang menggunakan display pemetaan karakter dan satu kontroler NES. NES adalah konversi terbitan favorit saya, dan sebelum kami berhasil melakukannya, hal itu tidak dianggap mungkin secara teknis.”
      Wawancara lengkapnya ada di http://www.elitehomepage.org/archive/b5081501.htm
      Saya menafsirkan ini berarti versi favoritnya adalah edisi kaset BBC Micro, dan konversi favoritnya adalah versi NES. Tapi bisa saja saya menafsirkannya secara optimistis karena saya fanboy BBC
    • Tapi mereka menghapus perdagangan budak dan narkoba, kan :)
    • Arch Elite jelas merupakan puncaknya
    • Versi buatan penggemar untuk Oric Atmos baru-baru ini juga cukup bagus: https://www.youtube.com/watch?v=kC1cJGLGlxo
  • Saya suka bahwa ada shim pergantian bank seperti ini di awal tiap bank
    SEI / INC $C006 / JMP BEGIN
    Penjelasannya membahas detail bahwa ini dilakukan untuk menghemat ruang, tetapi di mata saya satu-satunya alasan JMP diperlukan adalah karena pipeline instruksi, dan sepertinya NOP saja sudah bisa melakukan flush
    Jadi optimisasi 2-byte versi saya begini: SEI / INC $FFFD ; menggunakan C0 di dalam vektor instruksi sebagai gantinya / NOP

    • Pernyataan bahwa “satu-satunya alasan JMP diperlukan adalah karena pipeline instruksi” memang benar, tetapi juga bermakna bagi manusia. Eksekusi dimulai dari bank 7, jadi ia melompat ke bank 7
      Sebagai catatan sampingan, di Game Boy entry point berada di ROM0, bank tetap, jadi setidaknya pada MBC yang umum masalah seperti ini memang tidak ada sejak awal
  • Sebagai pembanding, ada kode sumber Oolite, klon Elite open-source yang ditulis dalam Objective-C: https://github.com/OoliteProject/oolite
    https://oolite.space
    https://news.ycombinator.com/item?id=7894145

  • Saya memainkan ini di C64 saat berumur 8 tahun. Sekarang, 30 tahun kemudian, saya masih tidak memahami kode ini

  • Katanya bank 0 saja berisi 18.305 baris assembly; saya bahkan tak terbayang bagaimana mereka bisa menyimpan semua itu di kepala

    • Pada masa memakai 6502, semuanya bukan disimpan di kepala, melainkan di tumpukan kertas dot matrix tractor-feed. Biasanya juga penuh catatan dan koreksi yang ditulis dengan pensil
    • Saya pernah sedikit melakukan pengembangan embedded untuk perangkat 8-bit di era modern, dan saya benar-benar menaruh hormat kepada para engineer yang melakukan ini pada tahun 80-an
      Bahkan dengan tool kelas atas sekalipun, melacak kode pasti membutuhkan organisasi dan disiplin yang luar biasa. Saya pernah meneliti assembler untuk Hitachi 6303[0]/Motorola 6800[1] dari awal 80-an, dan apa yang berhasil dilakukan orang-orang di tengah keterbatasan tool seperti ini sungguh menakjubkan
      Misalnya, dua assembler di bawah ini hanya mengizinkan label hingga 6 karakter, dan tidak ada label lokal khusus di dalam subrutin. Dalam pekerjaan saya sendiri, demi deskriptivitas, saya membatasi label hingga 40 karakter, tapi tetap saja
      Namun, kesederhanaan relatif arsitektur seperti ini terasa sangat menyegarkan dibanding pekerjaan embedded pada sistem modern. Kemampuan untuk kurang lebih menampung seluruh keadaan sistem di kepala jelas merupakan keunggulan
      0: http://www.bitsavers.org/components/hitachi/_dataBooks/U24_H...
      1: http://www.bitsavers.org/components/motorola/6800/exorciser/...
    • Kita saat itu adalah versi diri kita yang lebih baik. Serius, proyek dengan skala tertentu hampir pasti mengharuskan banyak kode ditulis atau dicetak di atas kertas. Benar-benar butuh banyak kertas
    • Kode ini sangat rapi dan terdokumentasi dengan sangat baik. Saya tidak tahu seperti apa tingkat dokumentasi kode aslinya, tetapi sepertinya pada hasil cetaknya ada banyak catatan tulisan tangan
      Secara umum, pemrograman assembly juga tidak jauh berbeda dari bahasa tingkat tinggi. Kode diorganisasi ke dalam fungsi, blok, dan sebagainya. Menulis satu dinding kode superpanjang dengan lompatan yang saling kusut adalah cara mengundang masalah serius
    • Dari sudut pandang engineer modern, saya kurang paham kenapa ini harus disimpan di kepala
  • Sayang ini bukan perangkat lunak bebas. Kalau saya pencipta Elite, saya akan merilis semua port game dengan lisensi bebas
    Bagaimanapun, sekarang kita bisa memainkan Oolite di netbook murah, dan berkat daftar add-on yang sangat besar, kesenangannya bisa sama atau bahkan lebih besar

    • Itu karena Braben bersikap sulit soal hak cipta. Sebaliknya, Bell adalah orang baik, dan ia merilis sebagian besar yang ia tulis sendiri
    • Sejarah seputar perilisan ini berawal hingga puluhan tahun lalu
      Pihak Braben tampaknya sedang membuat Elite 4/Elite: Dangerous, jadi mungkin tidak ingin melemahkan hak ciptanya
  • Semua source code seharusnya didokumentasikan sampai sejauh ini