Gráficos bitmap con tgi.h

TGI significa “Tiny Graphics Interface”, es decir, algo así como “interfaz para gráficos pequeña”. Por tanto, se trata de una librería para hacer gráficos con máquinas basadas en el 6502, en nuestro caso el C64.

Lo primero sería repasar los modos gráficos del C64:

Modos gráficos del C64:

Los modos gráficos del C64 ya los vimos hace tiempo en este blog:

  • Modo carácter estándar.
  • Modo carácter multicolor.
  • Modo carácter con color de fondo extendido.
  • Modo bitmap estándar.
  • Modo bitmap multicolor.

Todos estos modos pueden combinarse con sprites. Es más, usando interrupciones raster, también pueden combinarse varios modos gráficos entre sí, cambiando el modo cuando el raster llega a la línea X.

Y por recordar un poco más, el modo bitmap estándar tiene una resolución de 200 x 320 pixels y cada uno de esos pixels se puede activar / desactivar independientemente de todos los demás. El estado activado / desactivado de esos 64.000 pixels sale de 8.000 bytes de la RAM (no de la RAM de pantalla), y su color sale de la RAM de pantalla (no de la RAM de color). El color de los pixels activos y el de los pixels inactivos de un carácter 8 x 8, pueden ser diferentes de los colores de los pixels activos e inactivos del carácter 8 x 8 de al lado, pero esto no suele ser lo habitual. Al final, en el modo bitmap estándar o “HIRES” lo habitual es tener un color uniforme para pintar formas (pixels activos) y otro color uniforme para el fondo (pixels inactivos). Por ejemplo, líneas blancas sobre fondo negro. En definitiva, es útil para líneas, polígonos, etc.

Por su parte, el modo bitmap multicolor es parecido al modo bitmap estándar, pero los pixels se agrupan de dos en dos en sentido horizontal. Por tanto, la resolución es de 200 x 160 pixels y, a cambio, en vez de dos fuentes de color se utilizan cuatro (por cada carácter 8 x 8). Es útil para gráficos tipo foto, dibujo, etc.

Pues bien, lo que nos ofrece tgi.h es una interfaz de programación, es decir, un conjunto de funciones y constantes, para programar en modo bitmap estándar con el C64.

Inspección de tgi.h:

Lo mejor es que le echemos un vistazo al header file tgi.h:

Como podemos ver, hay funciones para:

  • Pintar puntos o pixels.
  • Pintar una línea entre dos posiciones.
  • Continuar una línea desde la posición actual hasta otra.
  • Pintar círculos.
  • Pintar elipses.
  • Pintar arcos.
  • Pintar sectores.
  • Pintar rectángulos.
  • Pintar textos.
  • Etc.

Esta es la parte más representativa u obvia, pero también hay funciones y constantes para:

  • Cargar e instalar un driver.
  • Inicializar el modo gráfico o salir de él.
  • Cargar e instalar fuentes (tipos de letras).
  • Consultar códigos y mensajes de error.
  • Borrar la pantalla gráfica.
  • Contar el número de páginas disponibles.
  • Elegir la página que se ve y la que se pinta.
  • Consultar los colores disponibles.
  • Consultar y fijar el color con que se pinta.
  • Consultar la resolución.
  • Cambiar la posición actual.

Como siempre, lo mejor es verlo con un ejemplo o, mejor todavía, con un par.

Primer programa de ejemplo con tgi.h:

El primer programa va a ser muy sencillo. Básicamente vamos a instalar el driver y luego vamos a preguntarle cosas. Algo así:

De este modo, si compilamos y ejecutamos:

averiguamos que el driver de TGI para el C64:

  • Soporta una única página.
  • Soporta dos colores, que son el blanco y el negro.
  • Que la resolución es 320 x 200, es decir, bitmap estándar.
  • Y que la ratio de aspecto es 212.

Bueno, no está mal para empezar, vamos con el segundo.

Segundo programa de ejemplo con tgi.h:

El segundo programa tiene una primera parte que instala el driver, inicializa el modo gráfico y llama a una función pinta_tgi() (también tiene una última llamada que sale del modo gráfico, pero actualmente está comentada para ver el resultado):

Por su parte, la función pinta_tgi() es así:

Es decir:

  • Borra la pantalla gráfica.
  • Fija el color blanco como color de pintado.
  • Activa el pixel (10, 10).
  • Pinta una línea entre un origen y un final.
  • Continúa la línea hasta otro nuevo final.
  • Pinta un círculo.
  • Pinta una elipse.
  • Y pinta una barra o rectángulo.

Adicionalmente hay unas líneas finales relativas al pintado de algún texto, pero yo no he conseguido que me funcionen. Quizás algún lector se anime a dar alguna pista extra.


Código de ejemplo: tgi

Deja un comentario