Programando para Megadrive con SGDK, vía Docker

Como escribir y ejecutar software para una máquina que tiene 36 años

Sega Megadrive PAL

SGDK es un kit de desarrollo de software de código abierto, que permite compilar código en lenguaje C y ejecutarlo en la consola de 16 bits Sega Megadrive, añade además ciertas librerías que facilitan el uso de gráficos, música, cálculos matemáticos, etc.

¿Y que ofrece una máquina que salió al mercado en 1988? Pues:

CPU Motorola 68000 a 7 Mhz
64Kb de RAM
64Kb de VRAM
64 colores en pantalla de una paleta de 512
2 planos de scroll por hardware

Comparado con consolas actuales son capacidades ridículas (y si lo comparamos con los PCs ya ni hablamos), pero más que suficientes para crear maravillas en dos dimensiones. Solo hay que ver su catálogo para ver lo que puede llegar a hacer esta máquina (trilogía Sonic, Streets of Rage, Gunstar Heroes, Thunderforce...)

Los ficheros de descarga del proyecto SGDK están preparados para ser ejecutados en Windows, para Linux requiere algunos pasos extra. Existe un proyecto llamado Gendev, pero hace años que no se actualiza y ha quedado obsoleto. Un método más rápido y actualizado es usar SGDK en un contenedor el cual ya tiene todo listo para compilar.

Prueba con un Hello World

Este sería el código de un programa de ejemplo, el típico "Hello World":


#include <genesis.h>

int main() {
    // Inicializa la pantalla de vídeo
    VDP_init();

    // Establece el modo de plano de fondo a 320x224 (el modo estándar de Megadrive)
    VDP_setScreenWidth320();

    // Muestra el texto "Hello World" en la pantalla
    // Los parámetros son: plano (BG_A o BG_B), texto, posición X, posición Y
    VDP_drawText("Hello World", 10, 13);

    while(1) {
        // Este bucle mantiene el programa corriendo
        SYS_doVBlankProcess();
    }

    return (0);
}

Guardamos el fichero con nombre main.c en un directorio. Desde ese mismo directorio lanzamos un contenedor que compilará el código y generará un fichero BIN que será el programa (también se le suele llamar ROM) que podremos cargar en la consola:

$ podman run --rm -v $PWD:/m68k --userns=keep-id -t registry.gitlab.com/doragasu/docker-sgdk:v1.90
mkdir -p src/boot
mkdir -p out
(...)
m68k-elf-objcopy -O binary out/rom.out out/rom.bin
java -jar /sgdk/bin/sizebnd.jar out/rom.bin -sizealign 131072 -checksum
m68k-elf-nm  -n out/rom.out > out/symbol.txt

Si no sois personas civilizadas y usáis docker en vez de podman el comando es

$ docker run --rm -v $PWD:/m68k -t registry.gitlab.com/doragasu/docker-sgdk:v1.90

Esto nos deja en la carpeta out un fichero rom.bin. Podemos cargarlo en un emulador (en los repositorios de las distribuciones y Flathub podéis encontrar varios, yo suelo usar Blastem) y ver si funciona:

Sega Megadrive PAL

A partir de aquí podéis encontrar (aparte de su completa documentación) en Internet miles de tutoriales, tanto escritos como en vídeo, de cualquier aspecto en la programación para esta consola. Incluso combinarlo con ASM, si te atreves.

28/02/2024 - Retro