Recursos e información sobre programación de juegos en DOS
Con motivo del reciente anuncio de la segunda edición del concurso de videojuegos para DOS (C:\DOS\CONTEST) vamos a aprovechar para intentar recopilar en este artículo información diversa que sirva a modo de punto de partida a la hora de desarrollar un videojuego completo para MS-DOS.
Existen diversos lenguajes a utilizar así como herramientas, tanto modernas como de la época, que pueden ayudarte tanto en la programación como en la creación de los recursos gráficos, sonoros, etc..
Sin mas dilación, ¡vamos a ello!
Compiladores
Lo primero que necesitarás es un compilador para poder programar tu juego en un lenguaje concreto y generar el ejecutable .EXE que se podrá ejecutar bajo DOS.
Compiladores que generen ejecutables DOS te los vas a encontrar mayoritariamente en lenguaje C, aunque veremos que hay algunas excepciones.
En algunos casos, el compilador dispone de versión cross-compile, esto es, que permite compilar el código en una máquina distinta de la maquina destino del ejecutable. Esto te permite desarrollar y compilar en una máquina con un sistema operativo moderno y el código generado será compatible con DOS.
Veamos unos cuantos compiladores:
DJGPP

Es un compilador de 32 bits en modo protegido. Se salta la limitación de 640KB de memoria utilizando un extensor de memoria (DOS4GW). Este compilador fue un port para sistemas DOS de las utilidades GNU GCC de Unix, con lo que si estás familiarizado con su uso, te será muy cómodo el trabajar con el compilador, linker, etc…
La pagina oficial de djgpp es https://www.delorie.com/djgpp/ pero en ocasiones está caída. Podemos encontrarlo también en: https://github.com/leegibsonhoward/djgpp
Existe una versión cross-compile en este repositorio: https://github.com/andrewwutw/build-djgpp que te permite generar código DOS pero compilando desde Windows, Linux o Mac. Esto te permite usar herramientas modernas como vscode.
Watcom

Es un compilador que puede producir código, tanto modo real de 640K, como 32 bits en modo protegido.
Su sintaxis puede diferir un poco del estándar ANSI C.
La version comercial https://winworldpc.com/product/watcom-c-c/110b
Versión libre de openWatcom: https://github.com/open-watcom/open-watcom-v2
Borland C

Compilador de Borland para lenguaje C. Utilizado frecuentemente en la época DOS con la librería gráfica integrada GDI.
Pues obtenerlo en: https://winworldpc.com/product/borland-c/20
Turbo Pascal

Este compilador ya no trabaja sobre C si no con el lenguaje Pascal. Permite desarrollar tanto en modo texto como crearte tus rutinas gráficas en modo 13h. Genera ejecutables para DOS.
https://turbopascal-wdb.sourceforge.io/doku.php
Div Games Studio:

Conocido framework español de desarrollo de juegos, de lenguaje propio, que incluye todas las herramientas para el desarrollo de recursos, tanto gráficos como sonoros.
Puedes obtener el framework original para DOS que salió en su momento (https://archive.org/details/div-games-studio-2) o utilizar el fork moderno que se ha realizado (https://github.com/DIVGAMES/DIV-Games-Studio)
Librerías
A la hora de desarrollar el juego, puedes optar por programar todas las rutinas gráficas o de sonido a mano, o bien utilizar alguna de las librerías desarrolladas para tal efecto. Destacamos algunas:
Allegro 4.2.3
Esta librería en su versión 4.2.3 soporta DOS y tiene funciones para dibujar en pantalla, controlar interrupciones, sonido MIDI y samples, además de un montón de características.
Se puede utilizar tanto en DJGPP como en Watcom.
https://github.com/liballeg/allegro5/releases/tag/v4-2-3-1
Jordi, del grupo de telegram del MSDOS Club, ha preparado un repositorio con un contenedor docker con todo lo necesario para compilar con DJGPP sin tener que configurar el entorno (https://github.com/jsmolina/allegro-tutorial)
Little Game Engine
Librería para Borland C optimizada para ordenadores lentos ((8088/8086/286)) que soporta los modos gráficos CGA/TANDY/EGA/VGA. También implementa sonido y físicas simples.
https://github.com/mills32/Little-Game-Engine-for-VGA-EGA

Herramientas de diseño
Gráficos
A la hora de realizar los gráficos, es importante tener en cuenta los formatos compatibles de la era DOS. El formato BMP y PCX son los mas comunes y lo normal es que la paleta de colores sea de formato indexado de 256 colores.
Cualquier software que utilice estos formatos y pueda guardarlos con esa profundidad de color, serán válidos
–Aseprite/Libresprite: https://www.aseprite.org/

–Gimp: https://www.gimp.org/

Tiled
No tanto como editor gráfico si no como editor de niveles, te permite crear tus mapeados y exportarlos en formato binario para leer los mapas en tu juego. (https://www.mapeditor.org/)

Música
La mayoría de formatos de música de la época eran los formatos MIDI y MOD.
- Formato MIDI
La música en formato MIDI se basa en guardar una representación númerica de las notas y su duración y el número de instrumento elegido. Es por esto que la lista de instrumentos es fija y su tipo de sonido depende del chip sintetizador de la tarjeta de sonido. En el caso de la época DOS era muy común las tarjetas Sound Blaster, con su chip Yamaha, y las Adlib.
Es posible componer música en formato MIDI con herramientas modernas y mediante un sintetizador software emular el sonido de esas tarjetas para tener una escucha mas real de como se oirá en el juego.
–Reaper https://www.reaper.fm/

Para conseguir el sonido de Sound Blaster, o compatibles, en Reaper, se puede utilizar un plugin VSTi que permite cargar archivos SoundFont en una pista MIDI. Estos archivos soundfont son bancos de sonidos MIDI que pueden emular el sonido de tarjetas de la época o bien tener un sonido mas orquestral. Pero lo que nos interesa para el juego es el sonido retro.
En Reaper puedes utilizar cualquier VSTi que reproduzca SoundFont, como por ejemplo BassMidi VSTi ( https://www.kvraudio.com/product/bassmidi-vsti-by-falcosoft ) y puedes descargar un SoundFont que emula la Sound Blaster como por ejemplo este: https://github.com/Mindwerks/opl3-soundfont
Bosca Ceoil
Bosca Ceoil es una utilidad creada por Terry Cavanagh pensada para quien no tiene tantas nociones de música. Permite crear canciones de una manera mas visual y «videojueguil» y el resultado puede exportarse en MIDI para incorporarlo en nuestro juego.

- Formato MOD
El formato MOD tambien es una representación númerica de las notas pero en este caso el sonido de los instrumentos está dentro del propio archivo provocando que siempre se oirá de la misma manera independientemente del equipo en el que reproduzca. Para componer MODs, se utilizan los trackers como por ejemplo Schism Tracker (https://schismtracker.org/) que es una versión moderna del mítico Impulse Tracker
Efectos de sonido
Para tu juego también necesitarás efectos de sonido. Esto es, samples de audio digital (normalmente de corta duración) para la reproducción de efectos especiales, disparos, pasos, etc…
En la época de MS-DOS, los formatos usuales para los efectos de sonidos son los WAV y los PCM. Es importante tener en cuenta la frecuencia de muestreo y los bits de conversión ya que, los archivos de audio pueden ocupar bastante y puede ser necesario bajarles la calidad para que ocupen menos en memoria. Un formato equilibrado entre calidad y tamaño podría ser 22Khz a 8 bits.
A pesar de que la mayoría puedes obtenerlos desde páginas de recursos libres (tales como: https://opengameart.org/ o similares), puede ser necesario recortar, amplificar o tratar de alguna manera esos audios para poder usarlos en tu juego. Es por esto que es importante tener algún software de tratamiento de audio.
Puedes utilizar, además de Reaper comentando anteriormente, programas como Audacity (https://www.audacityteam.org/)

Testear el juego
Para poder ir probando y depurando el juego necesitarás, si o si, poder ejecutarlo. Para ello puedes optar por varias vías: utilizar un emulador de DOS o bien probarlo en máquina real.
En el caso de utilizar emulador tienes varias opciones tales como Dosbox (https://www.dosbox.com/), Dosbox-X (https://dosbox-x.com/) o todas sus variantes. O bien PCEM (https://pcem-emulator.co.uk/) o 86box (https://86box.net/) para emular una maquina compatible con DOS de una manera mas «real» aunque siga siendo emulación.
Con la alternativa de probarlo en maquina real te aseguras el funcionamiento correcto del juego con el engorro de tener que montarte el sistema. Puedes dejar esta prueba para cuando el juego esté acabado e ir probando las multiples iteraciones del desarrollo en emulación.
Depuración
Durante el desarrollo, se te presentarán múltiples bugs y dificultades en el código que pueden requerir depurar el juego en ejecución para ver el valor de ciertas variables o el comportamiento del código.
Una solución muy utilizada es utilizar información en pantalla para imprimir los valores de las variables que necesites visualizar. Esto lo puedes contener en unas directivas de depuración en el compilador para que la compilación final no tenga este código de depuración.
Para depurar cambios de estado o de variables que es posible verlas a simple vista, se puede recurrir a escribir en un archivo de log de trazas para poder ver la secuencia que queremos depurar.
Algunos emuladores, como el Dosbox-X, tienen un depurador que permite ver el contenido de la memoria. De esta manera puedes obviar el crearte herramientas de depuración propias y usar el depurador integrado.
Recursos y enlaces de interés
Tras toda esta introducción, recopilamos algunos enlaces de interés sobre el desarrollo DOS donde puedes encontrar información diversa.
- David Brackeen – 256-Color VGA Programming in C – Serie de tutoriales para aprender a crear rutinas gráficas para DOS
- 640k Really is Enough for Anyone by Robert W. Oliver II – Pequeño articulo sobre programación en Turbo C
- Graphical programming in Assembly (DOS) – Tutorial de programación de modos de vídeo(text, CGA, EGA, VGA, SVGA)
- https://github.com/balintkissdev/awesome-dos – Repositorio recopilatorio de enlaces a documentación interesante
- https://www.phatcode.net/res/224/files/html/index.html – El famoso libro Michael Abrash Graphics programming Black Book sobre programación gráfica
- https://www.chibialiens.com/8086/msdos.php – Web de Chibi Akumas con desarrollo para MS-DOS
- https://youtube.com/playlist?list=PLGJnX2KGgaw2L7Uv5NThlL48G9y4rJx1X&si=hH2VTh5pmn7Y02iv – Videos de root42 «Let’s Code ms-dos» en su canal de Youtube
- https://github.com/lethal-guitar/Duke2Reconstructed – Reconstrucción de Duke Nukem 2 en Github
- https://www.youtube.com/playlist?list=PLvI1iQmfH6UOkBSjL_EwtkmqRivM1bJk- – Canal de Reidrac donde programa en directo un juego para MS-DOS
- https://www.youtube.com/@ncot_tech – Vídeos sobre VGA
- http://www.brackeen.com/vga/unchain.html – Mas información de VGA del creador del Little Game Engine
Ejemplos
- https://github.com/onepopcorn/popcorn-bucket – Repositorio de Marc Onepopcorn con ejemplos para compilar y probar.
