Un juego de Game Boy Advance escrito en Zig
(jonot.me)Por qué escribí un juego de Game Boy Advance en Zig
-
El atractivo de la Game Boy Advance
La Game Boy Advance tiene una CPU moderna (ARM de 32 bits, muchos registros), pero usa un renderizador antiguo basado en tiles. Esto es similar a la forma en que funcionaba la NES en los años 80. Como uno de los últimos sistemas de Nintendo basados en tiles, ofrece varias funciones como transformaciones afines, transparencia y efectos de sprites. -
Razón para elegir el lenguaje Zig
Al principio, el proyecto de Game Boy Advance comenzó en C++, pero el primer juego completo fue escrito en Zig. Aunque Zig sigue en beta y es un lenguaje creado 15 años después del lanzamiento de la Game Boy Advance, ofrece funciones adecuadas para la programación embebida.
Toolchain
-
Linux y devKitPro
Al usar Linux, hubo dificultades con la gestión de paquetes, y al crear una escena 3D para Nintendo DS fue necesario usar devKitPro. Este incluye el toolchain de GCC, bibliotecas y herramientas de desarrollo. Tiene la molestia de que debe instalarse a través del gestor de paquetes de ArchLinux. -
Ventajas de Zig
Zig facilita la compilación cruzada y no requiere configurar un gestor de paquetes complejo. El sistema de build de Zig realiza la compilación ejecutando la funciónbuilddel archivobuild.zig. Esto simplifica el proceso de build y reduce errores.
Packed Structs
- Importancia de los packed structs
La Game Boy Advance controla el hardware mediante registros, sin llamadas a APIs de alto nivel. Los packed structs de Zig optimizan el layout de memoria y facilitan el control del hardware. Esta es una función muy útil para programar en Game Boy Advance.
Comptime
- Ejecución de código en tiempo de compilación
Zig ofrece la capacidad de ejecutar código en tiempo de compilación. Esto permite comprimir datos en tiempo de compilación en lugar de hacerlo en runtime. Esta función de Zig facilita la compresión de datos.
Biblioteca estándar
- La biblioteca estándar flexible de Zig
La biblioteca estándar de Zig soporta genéricos, y las funciones de asignación de memoria pueden recibir un allocator como argumento. Esto permite usar métodos personalizados de asignación de memoria. La biblioteca estándar de Zig puede usarse con flexibilidad incluso en entornos con restricciones de hardware.
Problemas
-
Ensamblador inline
Zig soporta ensamblador inline, pero solo permite una salida. Esto se vuelve un problema cuando las funciones del BIOS de la GBA deben devolver varios valores. -
Código Thumb / código ARM
La CPU de la Game Boy Advance soporta modo ARM y modo Thumb. En Zig no es posible especificar explícitamente los modos ARM y Thumb. -
Memoria extraña
La memoria de video de la Game Boy Advance no puede escribirse en unidades de 8 bits, lo que puede hacer que los gráficos se descompongan. Zig optimiza las copias de memoria usandomemcpy, pero esto puede entrar en conflicto con la "memoria extraña" de la GBA.
1 comentarios
Comentarios de Hacker News
volatilesegún la documentación de Zig no lo resuelve, recomiendan reportar un bug al compiladormemcpy. Se esperaba que esta optimización ocurriera solo en espacio de usuario, y también se esperaba que la opción-nostdlibpudiera manejar esto automáticamentepacked structsen C, se proponen bitfields. Se proporciona un ejemplo de código C válido