2 poin oleh GN⁺ 2025-01-01 | 1 komentar | Bagikan ke WhatsApp

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 fungsi build dalam file build.zig untuk 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 menggunakan memcpy, tetapi ini bisa berbenturan dengan "memori aneh" milik GBA.

1 komentar

 
GN⁺ 2025-01-01
Opini Hacker News
  • Diperlukan cara untuk menentukan metode akses memori bagi rentang alamat tertentu. Jika penggunaan volatile di dokumentasi Zig tidak menyelesaikan masalah, disarankan untuk melaporkan bug ke compiler
  • Alasan mulai menggunakan Linux 5 tahun lalu adalah karena tidak tahu cara menyiapkan Python di Windows. Pada 1997-2015, Windows adalah sistem operasi yang dominan, dan hal ini memperparah kurangnya pengetahuan di kalangan generasi muda. Pada masa awal, akses internet belum umum, dan sistem operasi tanpa lingkungan pemrograman membuat orang kehilangan kesempatan untuk belajar pemrograman
  • Di Game Boy Advance, video memory tidak bisa ditulis dalam satuan 8-bit, dan jika dilakukan begitu grafis akan menjadi kacau. Di emulator hal itu berjalan, tetapi di perangkat keras asli masalahnya ditemukan dan harus diperbaiki. Toolchain GBA untuk bahasa Nim telah dikembangkan
  • Kadang compiler melakukan optimisasi dengan mengganti fungsi penyalinan memori menjadi memcpy. Diperkirakan optimisasi ini hanya akan dilakukan di user space, dan diharapkan opsi -nostdlib dapat menangani hal ini secara otomatis
  • Mengusulkan bitfield sebagai cara menggunakan packed structs di C. Menyediakan contoh kode C yang valid
  • Diperlukan cara untuk menyelesaikan masalah memori di Game Boy Advance. Ingin tahu apakah LLVM mendukung fitur ini, dan menganggap integrasinya ke Zig tidak akan sulit