NES Elite - Kode sumber Elite untuk NES yang terdokumentasi
(github.com/markmoxon)- 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
makedi Mac/Linux; build Python hanya diuji pada 3.x, danmake.exedisertakan untuk Windows- Di Windows build menggunakan
make.bat, di Mac/Linux menggunakanmake, dan output default adalahelite-pal.NESdi folder5-compiled-rom-images variant=ntscdapat digunakan untuk membuatelite-ntsc.NES
- Di Windows build menggunakan
- 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.pymembandingkan checksum dan ukuran file dari file hasil build dengan file acuan yang diekstrak dari source asli secara berdampingan
- Contoh utamanya adalah
- 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
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.asmada 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 nyataPada 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
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
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
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/
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
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
Saya suka bahwa ada shim pergantian bank seperti ini di awal tiap bank
SEI/INC $C006/JMP BEGINPenjelasannya membahas detail bahwa ini dilakukan untuk menghemat ruang, tetapi di mata saya satu-satunya alasan
JMPdiperlukan adalah karena pipeline instruksi, dan sepertinyaNOPsaja sudah bisa melakukan flushJadi optimisasi 2-byte versi saya begini:
SEI/INC $FFFD ; menggunakan C0 di dalam vektor instruksi sebagai gantinya/NOPJMPdiperlukan adalah karena pipeline instruksi” memang benar, tetapi juga bermakna bagi manusia. Eksekusi dimulai dari bank 7, jadi ia melompat ke bank 7Sebagai 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
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/...
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
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
Pihak Braben tampaknya sedang membuat Elite 4/Elite: Dangerous, jadi mungkin tidak ingin melemahkan hak ciptanya
Semua source code seharusnya didokumentasikan sampai sejauh ini