Mengapa menulis game Game Boy Advance dengan Zig
-
Daya tarik Game Boy Advance
Game Boy Advance memiliki CPU yang modern (ARM 32-bit, banyak register), tetapi menggunakan renderer lama berbasis tile. Ini mirip dengan cara yang digunakan NES pada era 80-an. Sebagai salah satu sistem berbasis tile terakhir dari Nintendo, perangkat ini menawarkan berbagai fitur seperti transformasi afin, transparansi, dan efek sprite. -
Alasan memilih bahasa Zig
Awalnya proyek Game Boy Advance dimulai dengan C++, tetapi game lengkap pertama ditulis dengan Zig. Meski Zig masih dalam versi beta dan merupakan bahasa yang dibuat 15 tahun setelah Game Boy Advance dirilis, Zig tetap menyediakan fitur yang cocok untuk pemrograman embedded.
Toolchain
-
Linux dan devKitPro
Saat menggunakan Linux, ada kesulitan dalam manajemen paket, dan ketika membuat adegan 3D untuk Nintendo DS, perlu menggunakan devKitPro. Ini mencakup toolchain GCC, library, dan alat pengembangan. Ada kerepotan karena harus memasangnya melalui package manager ArchLinux. -
Kelebihan Zig
Zig memudahkan cross-compilation dan tidak perlu menyiapkan package manager yang rumit. Sistem build Zig menjalankan fungsibuilddalam filebuild.ziguntuk memproses build. Ini menyederhanakan proses build dan mengurangi error.
Packed Structs
- Pentingnya packed struct
Game Boy Advance mengendalikan hardware melalui register tanpa pemanggilan API tingkat tinggi. Packed struct di Zig mengoptimalkan layout memori sehingga kontrol hardware menjadi lebih mudah. Ini adalah fitur yang sangat berguna untuk pemrograman Game Boy Advance.
Comptime
- Eksekusi kode saat compile time
Zig menyediakan kemampuan untuk mengeksekusi kode saat compile time. Ini memungkinkan data dikompresi pada saat compile time tanpa perlu mengompresinya saat runtime. Fitur ini di Zig membuat kompresi data menjadi lebih mudah.
Pustaka standar
- Pustaka standar Zig yang fleksibel
Pustaka standar Zig mendukung generic, dan fungsi alokasi memori dapat menerima allocator sebagai argumen. Ini memungkinkan penggunaan metode alokasi memori kustom. Pustaka standar Zig tetap fleksibel digunakan bahkan di lingkungan dengan keterbatasan hardware.
Masalah
-
Inline assembly
Zig mendukung inline assembly, tetapi hanya satu output yang dimungkinkan. Ini menjadi masalah ketika fungsi BIOS pada GBA perlu mengeluarkan beberapa nilai. -
Kode Thumb/kode ARM
CPU Game Boy Advance mendukung mode ARM dan mode Thumb. Di Zig, mode ARM dan Thumb tidak bisa ditentukan secara eksplisit. -
Memori yang aneh
Memori video Game Boy Advance tidak bisa ditulis dalam satuan 8-bit, dan ini dapat menyebabkan grafis menjadi berantakan. Zig mengoptimalkan penyalinan memori dengan menggunakanmemcpy, tetapi ini bisa berbenturan dengan "memori aneh" milik GBA.
1 komentar
Opini Hacker News
volatiledi dokumentasi Zig tidak menyelesaikan masalah, disarankan untuk melaporkan bug ke compilermemcpy. Diperkirakan optimisasi ini hanya akan dilakukan di user space, dan diharapkan opsi-nostdlibdapat menangani hal ini secara otomatis