2 puntos por GN⁺ 2025-01-01 | 1 comentarios | Compartir por WhatsApp

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ón build del archivo build.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 usando memcpy, pero esto puede entrar en conflicto con la "memoria extraña" de la GBA.

1 comentarios

 
GN⁺ 2025-01-01
Comentarios de Hacker News
  • Se necesita una forma de especificar cómo se accede a la memoria en ciertos rangos de direcciones. Si usar volatile según la documentación de Zig no lo resuelve, recomiendan reportar un bug al compilador
  • Empezó a usar Linux hace 5 años porque no sabía cómo configurar Python en Windows. Entre 1997 y 2015, Windows fue el sistema operativo dominante, y eso profundizó la falta de conocimientos entre los jóvenes. Al principio, el acceso a internet no era generalizado, y un sistema operativo sin entorno de programación hacía que se perdieran oportunidades de aprender a programar
  • En Game Boy Advance no se puede escribir en la memoria de video en unidades de 8 bits; si se hace, los gráficos se descomponen. En un emulador funcionaba, pero en el hardware real hubo que detectar y corregir el problema. Se desarrolló una toolchain de GBA para el lenguaje Nim
  • A veces el compilador realiza una optimización que reemplaza la función de copia de memoria por memcpy. Se esperaba que esta optimización ocurriera solo en espacio de usuario, y también se esperaba que la opción -nostdlib pudiera manejar esto automáticamente
  • Como forma de usar packed structs en C, se proponen bitfields. Se proporciona un ejemplo de código C válido
  • Se necesita una forma de resolver el problema de memoria del Game Boy Advance. Se preguntan si LLVM soporta esta función y creen que no sería difícil integrarla en Zig