Introducción al hardware de video

Aqui empieza una serie de artículos dedicados a la programación gráfica y sus derivados. En este capítulo trataremos (bueno, trataré) el tema de la programación del hardware de la vga. Este es el punto de partida para todos aquellos que no tienen ni puta idea de qué va esto. Los que ya sepais cómo se programa podeis pasar a los siguientes capítulos, que es donde está la chicha.


Que será eso de la vga

Bien, queridos colegas; la vga (Video Graphics Array, ó matriza gráfica de video) es el perro lazarillo que nos guía en el tortuoso camino de la información que procesa nuestra máquina. La vga es el circuito electrónico que controla la información que aparece en la pantalla.

A este tipo de dispositivos se le llama tarjetas de video y existen muchos tipos : más antiguos, como la ega, cga, etc; y más modernos, como la Super vga. De los dispositivos antiguos, ya no existen ordenadores (que merezcan llamarse así) que las tengan entre sus órganos vitales. Los ordenadores de hoy en día cuentan con tarjetas Super vga, que poseen características muy superiores al resto de las demás tarjetas, pero cuya programación se puede complicar un poquillo. Estas tarjetas pueden llegar a representar imágenes de hasta 16 millones de colores, con resoluciones de 1280 puntos de ancho por 1024 puntos de alto.

Pero nuestras aspiraciones son, en principio, un poco más modestas. Nosotros utilizaremos el modo 13h de la vga (también compatible en la svga) que pude representar 256 colores distintos, de una paleta de 262144 ( 218) colores, con una resolución de 320 pixels de ancho y 200 de alto. Por cierto, un pixel es el nombre que se le da a un punto de la pantalla, el cual tiene un color determinado y una posición.

Los modos de video

La tarjeta de video lee el contenido de su memoria e interpreta la información que allí encuentra de forma distinta. La forma de interpretarla depende del modo de funcionamiento en el que se encuentre. Este modo de funcionamiento es lo que llamamos modo de video. Hay modos de video de texto (se emplean al arrancar el ordenador y en MS-DOS) y modos de video gráficos. Cada uno de estos modos se caracteriza por una resolución y una profundidad de colores.

La resolución indica el número de puntos que se muestran en la pantalla (o el tamaño de los mismos). Pro ejemplo, en el modo 13h arriba mencionado, la resolución es de 320x200 pixels. En los modos de texto, se toman caracteres en lugar de puntos. Un ejemplo de modo de texto es el 3, que es el característico de la vga, y puede representar 25 filas de 80 caracteres cada una (esto es 80x25).

La profundidad de color es una manera de expresar el número de colores distintos que pueden tomar los pixels. Sin embargo, hay una forma de indicar los tonos RGB que queremos que tome un color, pero esto ya se verá más adelante.

La cuestión ahora es cómo se cambia de un modo a otro. Por lo general (en DOS) la terjeta se encuentra en modo texto, así que para representar gráficos es necesario cambiar el modo. Para ello hay que ejecutar una interrupción por software. Una interrrupción es una rutina que tiene el ordenador en memoria y que sirve para controlar los dispositivos del sistema. Para ejecutar esta rutina hay que hacer una llamada especial, indicando mediante los registros del procesador, la funcion a ejecutar. En este caso, la rutina es la de cambio de modo de video, que es una función de la interrupción número 10h (16 en decimal). Para llamar a esta subfunción es necesario que el registro AH contenga 00 y que el AL contenga el nº de modo de video a cambiar.

Cambiando de modo de video

La siguiente porción de código en C (para turbo c) cambia al modo 13h :


#include <dos.h>
/* includes varios ... */
main (void)
{
   union REGS regs;
   /* aqui va el codigo del programa */
   /*  .....                         */
   regs.h.ah = 0;    /* AH <- 0  */
   regs.l.al = 0x13; /* AL <- 16 */
   int86(0x10, ®s, ®s); /* interrupcion 10h, la de video */
   /* mas codigo */
}
Y en pseudocódigo, para cambiar otra vez al modo texto :
 AX <- 0003h
 INT (10h)

Mi primer pixel

Bien, ahora que ya sabemos como cambiar el modo de video, el siguiente paso para dominar el hardware de la tarjeta de video es escribir un pixel en la pantalla.
Para escribir un pixel en la pantalla hay dos opciones : utilizar una función de la interrupción 10h ó escribir la información a pelo en la memoria de video.

La primera opción, a pesar de ser la más genérica y fácil de programar, es la menos conveniente para nuestros intereses. Esto se debe a que las funciones de la interrupción 10h son demasiado generales y contienen detecciónes de errores atendiendo a las especificaciones de todos y cada uno de los modos de video. Esto hace que contengan instrucciones innecesarias para nosotros, que sólo queremos utilizar un modo y podemos implementar nuestros propios sistemas de detección de errores, más eficientes que los de la interrupción.

La segunda opción es la más rápida y eficiente a la hora de programar efectos gráficos. Para escribir un pixel, debemos escribir la información correspondiente (que más tarde veremos) en una posición de memoria específica. A esta zona de memoria en la que se escribe la información correpondiente a los pixels se le llama memoria de video. En la vga, modo 13h, la memoria de video se encuentra en el segmento A000h. Es decir, va de la dirección A000:0000 a la A000:FFFF, en formato SEGMENTO:OFFSET.

Un pixel en la pantalla (en el modo citado antes) puede tomar 256 colores distintos. Para representar estos 256 valores(=colores) distintos es necesario utilizar 8 bits, porque 28=256. Por lo tanto, para representar un pixel utilizamos un byte, que tendrá que ser escrito en la posición correcta dentro de la memoria de video, claro.
Para escribir un pixel blanco en la posición (0,0), que se encuentra en la esquina superior izquierda, será necesario poner el primer byte de la memoria de video a 15. Es decir :

   *(A000:0000) <- 15;

Bueno, por ahora ya sabes suficiente para experimentar por tí mismo/a. Lo fundamental es que experimentes con programas que escriban distintos valores en distintas posiciones, para ir aprendiendo y cogiendo soltura. En el próximo capítulo se verán las correspondencias entre las posiciones de memoria y las de pantalla, además de algún ejemplo.


Espero que esta información te haya sido útil, y si no, pues te aguantas ;-)
Nos vemos en el próximo capítulo.