Kisah port yang mustahil: Bagaimana Quake di-porting ke Game Boy Advance

Memindahkan Quake ke Game Boy Advance tampaknya mustahil, tetapi Randy Linden berhasil melakukannya. Begini caranya.

Game Boy Advance adalah konsol permainan genggam yang dibuat oleh Nintendo. Ini dirilis di Jepang pada tahun 2001 dan menjadi penerus Game Boy Color. Itu memiliki ARM7TDMI yang memiliki clock 16,78 MHz, RAM kerja internal 32kb, RAM eksternal 256kb, dan VRAM 96kb. Ini bukan mesin yang paling kuat, tetapi ada banyak permainan untuk perangkat genggam yang banyak disimpan dalam memori indah. Salah satu game yang belum pernah dirilis untuk perangkat ini adalah port prototipe Quake, game yang dikembangkan oleh id Software yang membantu mendefinisikan genre first-person shooter yang kita kenal sekarang.

Quake adalah game yang sangat mendetail dengan soundtrack fantastis dan gameplay adiktif, dan sama seperti DOOM, game ini telah di-porting ke hampir semua perangkat yang dapat Anda bayangkan. Portnya ke Game Boy Advance sangat luar biasa karena tidak mendukung grafis 3D, dan Nintendo secara khusus memasarkan perangkat genggam ini sebagai pengalaman bermain dua dimensi. Namun hal itu tidak menghentikan Randy Linden untuk mengembangkan pelabuhannya sendiri.

Foto port Quake yang diputar di Analogue Pocket digunakan dengan izin dari Modern Vintage Gamer

Jika Anda belum familiar dengan Linden, dia terkenal sebagai pengembang kedua bleem! (emulator PlayStation) dan port SNES dari DOOM, sebuah pencapaian yang pernah dikatakan oleh John Romero, salah satu pendiri id Software, dalam sebuah wawancara dengan berita gubuk menurutnya itu tidak mungkin. Kemahiran pengembangan Linden membuktikan bahwa jika ada orang yang mampu mewujudkan Quake di Game Boy Advance, mungkin orang itu adalah dia.

Pelabuhan ini terungkap berkat rilis Linden sendiri melalui proyek Hutan Ilusi. Forest of Illusion adalah proyek yang bertujuan untuk melestarikan sejarah game Nintendo, dan Linden mengulurkan tangan untuk mendistribusikan salinan port Quake yang dia temukan pada kartu flash 256MB miliknya milik.

Kami ingin mengucapkan terima kasih kepada Randy Linden karena telah mendedikasikan waktunya untuk menjawab pertanyaan kami dan memastikan keakuratan teknis artikel ini. Kami juga ingin mengucapkan terima kasih Pemain Game Vintage Modern karena mengizinkan kami menggunakan potongan gambar apa pun dari videonya yang diperlukan. Port ini tidak memiliki hubungan resmi dengan id Software atau ZeniMax dan dikembangkan sebagai proyek solo oleh Linden.

Pelabuhan Game Boy Advance Quake

Secara teknis, sungguh menakjubkan bahwa Quake bahkan bisa mencapai level seperti di Game Boy Advance. Ini berjalan pada frame rate yang baik dan mempertahankan pencahayaan dan palet warna yang benar dari game Quake asli. Semuanya 3D, termasuk senjata dan monster. Game di Game Boy Advance mencapai grafik 3D biasanya melalui sprite, tapi inilah kenyataannya. Itu tidak menggunakan ray casting seperti yang dilakukan game 3D lainnya di perangkat genggam, dan bahkan mencapai poin efek pencahayaan pada objek yang telah dirender sebelumnya melalui trik pengubahan palet untuk mencapai ilusi dinamis Petir.

Untuk lebih jelasnya, port ini bukanlah permainan penuh, dan ini adalah prototipe yang ingin dibawa Linden ke id Software setelah selesai dibuat untuk dirilis. Namun, popularitas Game Boy Advance mulai berkurang, dan sebaliknya, mesin kustom yang ditulis oleh Linden kemudian menjadi mesin dari game lain yang sepenuhnya dikembangkan oleh Linden -- Cyboid. Linden memberi tahu kita bahwa "sebagian besar kode" masih merupakan kode ARM asli dari versi Game Boy Advance. Jika Anda ingin mencoba Cyboid, versi lama tersedia di Google Play Store, tetapi APK resminya sekarang didistribusikan di Toko Aplikasi Amazon karena gim ini memiliki banyak kode 32-bit tingkat rendah.

CyboidPengembang: R dan R Digital, LLC.

Harga: Gratis.

3.3.

Unduh

Linden juga membagikan kepada kami video kodenya yang berjalan di iPod Video, yang merupakan salah satu versi paling awal dari Cyboid. Itu dibuat dengan kode mesin yang sama yang digunakan untuk port Quake-nya ke Game Boy Advance.

Port Quake Game Boy Advance tidak berisi aset resmi game apa pun, seperti halnya Linden menghubungi id Software atau ZeniMax tentang mendistribusikan versi E1M1 yang berisi Quake resmi aktiva.

Game yang saat ini didistribusikan juga merupakan versi debug. Menahan tombol R saat boot-up akan membawa pemain langsung ke peta kedua permainan, dan menahan tombol kiri pada D-pad akan membawa mereka ke peta ketiga. Pertukaran peta juga dapat diakses ketika pemain mati, dan monster tidak akan menyerang pemain sampai pemain menembaknya terlebih dahulu.

Sedangkan untuk musik, demonya menggunakan file .S3M publik dan mixer suara menangani musik stereo dan efek suara.

Batasan teknis

Ada sejumlah batasan dalam Game Boy Advance yang membuat port ini sulit. Beberapa kendala terbesarnya adalah kecepatan clock yang rendah, kurangnya kemampuan grafis 3D pada perangkat genggam, dan kurangnya floating-point unit (FPU). Masih banyak masalah lain yang sedang terjadi, tetapi ini adalah titik-titik permasalahan tertentu yang menurut Linden saya anggap sebagai masalah. Sebelum kita membahasnya, penting untuk memahami tata letak Game Boy Advance.

Tangkapan layar digunakan dengan izin dari Modern Vintage Gamer

Game Boy Advance memiliki tiga set RAM -- satu adalah RAM kerja internal (IWRAM), satu lagi adalah RAM kerja eksternal (EWRAM), dan yang ketiga adalah RAM video (VRAM). IWRAM 32kb digunakan untuk menyimpan instruksi ARM untuk eksekusi cepat, sedangkan EWRAM 256kb optimal untuk menyimpan instruksi hanya jempol dan potongan data yang lebih kecil. Sebagai Catatan Rodrigo Copetti, EWRAM dapat diakses hingga enam kali lebih lambat dibandingkan IWRAM. Mayoritas memori dalam bentuk EWRAM hanya dapat diakses melalui bus 16-bit, meskipun Game Boy Advance dipasarkan sebagai perangkat genggam 32-bit. IWRAM dapat diakses melalui bus 32-bit. VRAM di Game Boy Advance hadir dengan ukuran 96kb, dan meskipun fungsi utamanya untuk menyimpan data grafis, VRAM ini ditemukan di peta memori CPU dan juga dapat digunakan sebagai penyimpanan memori normal.

Instruksi jempol adalah bagian dari instruksi ARM 32-bit, dan merupakan sekumpulan instruksi yang dikodekan ke dalam kata-kata 16-bit. Mereka memiliki semua manfaat dari instruksi 32-bit tanpa memakan banyak ruang, menjadikannya efisien untuk pengembangan yang optimal. Ini berarti bahwa meskipun EWRAM lebih lambat untuk diakses, instruksi Thumb yang efisien sering kali masih bisa berakhir sama cepatnya dengan instruksi ARM yang disimpan. di IWRAM, meskipun kelemahan dari instruksi Thumb adalah terkadang tidak ada instruksi Thumb yang setara dengan instruksi ARM yang Anda inginkan menjalankan. EWRAM digunakan untuk menyimpan keluaran logika transformasi matematika 3D yang pada dasarnya merupakan daftar tepi poligon yang kemudian ditelusuri garis pindaian demi garis pindaian dengan kode rasterisasi.

Seperti yang dikatakan Linden kepada saya, bagian paling rumit dan sulit dari keseluruhan port adalah penyaji scanline. Ini terdiri dari lebih dari 10.000 baris kode perakitan ARM yang sangat optimal yang dirancang untuk menggambar sekumpulan piksel ke VRAM. Penyaji scanline menggunakan sebagian besar IWRAM 32kb. Tepi yang paling dekat dengan kamera aktif dan dirender, dan pada dasarnya ini adalah pohon Binary Space Partitioning (BSP) yang besar. VRAM digunakan untuk menyimpan hasil keluaran transformasi poligonal ke dalam tabel tepi karena IWRAM tidak mencukupi, namun VRAM pada Game Boy Advance masih lebih cepat dibandingkan EWRAM. Grafiknya juga disimpan dan ditampilkan di sini.

Dia menghabiskan banyak waktu untuk fokus pada pengoptimalan untuk memastikan bahwa hal itu dapat memperoleh waktu eksekusi secepat mungkin. Tiga hal yang dilakukannya untuk mempercepat waktu eksekusi tersebut antara lain sebagai berikut:

  • Memodifikasi sendiri kode sebelum dieksekusi, sehingga diperlukan lebih sedikit instruksi
  • Menggunakan serangkaian tabel pencarian untuk hal-hal seperti timbal balik, sinus, kosinus, tangen, dll.
  • Mengalihkan "mode" CPU untuk mendapatkan akses ke register tambahan (seperti "variabel") tanpa harus menyimpan dan memulihkan nilai register.

Mengalihkan mode CPU untuk mendapatkan register tambahan adalah manuver yang sangat cerdas yang memungkinkan akses cepat ke nilai-nilai yang dekat dengan CPU sehingga nilai-nilai tersebut dapat diambil dalam satu siklus clock. Seperti yang dikatakan Linden kepada saya, dimungkinkan untuk mengganti register dan mengambil nilai dalam satu siklus clock, dibandingkan dengan menyimpan nilai dalam RAM Game Boy Advance, yang membutuhkan waktu lebih lama. CPUnya sendiri adalah prosesor 16,78 MHz, artinya mampu menyelesaikan 1.6780000 siklus per detik. Kedengarannya banyak, tetapi ketika Anda perlu menghitung dan menggambar setiap piksel di layar, jumlah tersebut akan bertambah dengan cepat dan menjadi penting untuk mengurangi operasi sebanyak yang Anda bisa.

Di atas adalah daftar register umum chipset ARM7TDMI yang ada di dalam Game Boy Advance. Biasanya, pengembang hanya akan mengakses register dalam mode "Sistem dan Pengguna" dan menggunakan variabel normal di luar mode tersebut. Namun, ia memanfaatkan register di ketujuh mode chipset, dan bagian terbaiknya adalah itu peralihan mode masih mempertahankan nilai dalam register mode lainnya, sehingga ia dapat beralih di antara keduanya mereka.

Lucunya, Linden juga menyebutkan bagaimana metode perpindahan banknya menemukan bug di emulator Nanoboy Advance. Ternyata, emulator tersebut tidak mendukung penggunaan mode CPU lainnya untuk menyimpan register dan peralihan, dan demo Quake-nya adalah game pertama yang diketahui benar-benar melakukannya.

Linden berbagi foto dengan kami dari beberapa catatan yang dia buat dan menjelaskan bagaimana dia mengoptimalkan perhitungan floating-pointnya tanpa adanya FPU yang tepat.

Gambar di atas adalah gambar yang dibagikan Linden kepada kami dari catatannya, dan yang paling menarik adalah "berbagai jumlah instruksi siklus ARM". Dia menemukan cara untuk mengoptimalkan siklus perhitungan sehingga dia bisa mengurangi jumlah siklus jam untuk perhitungan. Seperti yang dia jelaskan kepada saya, angka 8-bit dapat dikalikan dalam satu siklus clock, angka 16-bit dalam dua siklus clock, angka 32-bit dalam tiga siklus clock, dan angka 64-bit dalam empat siklus clock. .

“Ada dua atau tiga tahap eksekusi [di prosesor ARM]. Katakanlah misalnya saya mengalikan register satu dengan register dua dan memasukkan hasilnya ke dalam register tiga. Jika saya tahu bahwa register dua adalah bilangan 16-bit alih-alih mengatakan kalikan register satu dengan register dua, saya akan membaliknya dan saya akan mengatakan kalikan daftar dua dengan daftar satu karena itu akan menghemat waktu saya siklus."

Dia mengatakan kepada saya bahwa alasan dia melakukan ini adalah untuk memaksimalkan performa Game Boy Sebelumnya, karena siklus jam yang disimpan di sana-sini benar-benar bertambah ketika banyak perhitungan sedang dilakukan dilakukan. Mengenai kode modifikasi diri, saya meminta Linden untuk menjelaskannya.

“Program ini berasal dari [penyimpanan], ia mentransfer sebagian besar program ke dalam RAM internal untuk dieksekusi karena lebih cepat. Setiap akses RAM jauh lebih lambat jadi saya melakukan DMA [Akses Memori Langsung] dari blok besar dari ROM ke RAM, dan kemudian saya mengubah kode program sebenarnya. Misalnya, ARM memiliki kemampuan untuk menggeser operan ke kiri atau ke kanan atau dapat menutupi bit tertentu sebagai bagian dari set instruksi. Instruksi menentukan bit mana yang akan Anda sembunyikan atau berapa banyak bit yang akan Anda geser. Jadi, saya akan membuat kode yang akan mengubah apa yang akan dieksekusi berdasarkan berapa banyak bit yang perlu saya ubah. Contoh lainnya adalah perkalian matriks 3D. Ada banyak perkalian yang terlibat di sana. Saya akan menghasilkan instruksi sebenarnya yang melakukan perkalian ke dalam RAM internal dan kemudian mengeksekusinya sehingga kode tersebut membentuk bagian dari dirinya sendiri saat sedang berjalan."

Kode yang dapat dimodifikasi sendiri memiliki kelemahannya sendiri, khususnya dalam hal debugging. Ini juga menghilangkan kebutuhan akan instruksi cabang, di mana kode akan melompat ke urutan eksekusi lain dan dapat menghilangkan waktu komputasi yang berharga dari thread utama. Linden juga memberi tahu kami bahwa tabel pencarian disejajarkan dengan sempurna di ROM sehingga merupakan kelipatan sempurna dari nilai delapan bit yang digeser ke kiri. Ukuran tabel pencarian sangat besar dan tidak sesuai dengan RAM, dan penyelarasan juga menghindari kebutuhan instruksi pemuatan tambahan untuk mendapatkan alamat dasar tabel.

Secara keseluruhan, prototipe akhir dikembangkan selama hampir dua tahun.

Masa depan pelabuhan Quake Randy Linden

Saya bertanya kepada Linden apa yang akan terjadi dengan masa depan pelabuhan Quake, dan dia mengatakan kepada saya bahwa dia akan melakukan hal itu pertimbangan untuk menanyakan ZeniMax dan id Software tentang merilis versi dengan Quake resmi aktiva. Dia juga mengatakan kepada saya bahwa suatu saat dia akan merilis kode sumbernya, namun saat ini, kode sumber tersebut tidak dapat dibuat karena memerlukan komputer yang lebih lama.

Pengaturan Randy Linden untuk menghubungkan Game Boy Advance ke komputer untuk pengembangan.

Saya bertanya kepada Linden mengapa dia memilih Quake, dan dia mengatakan kepada saya bahwa dia menyukai permainan ini dan dia menyukai tantangan karena ini adalah "proyek yang mustahil", karena hal itu terjadi di belakang port DOOM untuk SNES miliknya. Dia juga menyebutkan bahwa meskipun dia tidak percaya keseluruhan game dapat di-porting karena keterbatasan ruang, sebagian besar game tersebut mungkin berada di mesin yang sama.

Jika Anda tertarik untuk melihat Quake untuk Game Boy Advance, pastikan untuk melihat rilisnya di Forest of Illusion, yang dapat Anda lihat di bawah.


Unduh dari Hutan Ilusi