PROGRAMACIÓN DE MODOS X

Artículo 3: EL CRT CONTROLLER

Autor: (c) Santiago Romero.
Revista: Sólo Programadores (Tower Communications) número 24, Agosto-1996


El CRTC Controller permite el control sobre el refresco de la pantalla y define cómo debe ser realizado éste, incluyendo funciones que posibilitan el desplazamiento de la pantalla por la video-memoria, base del scroll hardware.

Continuando con el importante tema de los registros VGA, que se dejará zanjado definitivamente al término de este artículo, se describirán a continuación los más importantes registros del Cathode Ray Tube Controller.

En las tablas siguientes están descritos los registros a los que se tiene acceso mediante la programación del CRTC Controller y el significado de sus bits junto con los puertos índice en los que están situados.

Tabla

Tabla

Tabla

Tabla

Tabla

La importancia de estos registros radica en su control sobre las condiciones en que aparece en el monitor la imagen contenida en memoria a partir del segmento VGA (A000h). A lo largo de las tablas de registros aparece varias veces el concepto de scan-line counter, line counter o, simplemente, contador interno de líneas. Este contador interno es una variable que contiene el número de scan-line por el que va el haz de electrones en su camino de refresco de la pantalla. Un scan-line es cada una de las líneas horizontales de las que se compone un gráfico, en este caso cada una de las líneas horizontales de la pantalla.

En los ejemplos incluidos en el CD de la revista se pueden encontrar listados pensados para ayudar a comprender el resultado que comportaría la modificación de algunos de estos registros, pero conviene que la base de esta experimentación la realice el lector, ya que mediante la librería VGAREGS.H y gracias a las tablas publicadas tiene total control sobre su tarjeta y debería ir investigando el significado de cada registro y el uso que podría dar de cada uno de ellos en sus programas.

Para ayudar en esta experimentación, y para comprender los valores que toman estos registros cuando tenemos iniciado un modo gráfico estándar, el autor incluye en el CD de la revista una sencilla utilidad (VGAREGS.EXE) que le va a permitir al lector explorar los registros de los modos estándar y unchained de la VGA.


LA UTILIDAD VGAREGS

Esta utilidad está creada mediante la librería REGTABLE.H, que engloba funciones de carga de ficheros .UNC (unchained). Estos ficheros son un formato propio del programa Vgaregs que contienen simplemente una lista consecutiva de valores que hay que enviar a los registros para conseguir un determinado modo gráfico. Por ejemplo, podemos cargar en memoria el fichero 360x400.UNC mediante la función LoadRegTable(), y enviar estos valores a los puertos VGA gracias a la función OutRegTable(), para inicializar el modo unchained de 360x400 píxels. Esto se ha hecho para que los lectores de Solo Programadores dispongan de casi todos los modos X preparados para ser usados en los programas con las funciones implementadas en esta librería.

La utilidad VGAREGS gestiona (carga y salva) estos ficheros y es capaz de mostrar los valores de los registros VGA en el modo de vídeo que se le indique, además de ofrecer la posibilidad de modificar estos valores y generar un .UNC preparado para hacer pruebas con los nuevos registros establecidos.

También puede ser usado para estudiar el valor que toman los registros en cualquier modo estándar. Por ejemplo, podemos estudiar cómo está compuesto internamente el modo 13h cargándolo en Vgaregs mediante la tecla M (de modo) y escribiendo 19 como respuesta al modo (siempre en formato decimal 13h = 19d) que queremos cargar. A continuación aparecen en pantalla los valores que los registros toman por defecto en ese modo.

Esto es tan sólo un ejemplo de lo que podemos hacer con esta sencilla utilidad, además de la posibilidad de crear nuestros propios modos X.

No obstante, existe una utilidad shareware técnicamente más completa que Vgaregs, y ésta es Tweak. Si podeís conseguirla, adelante, es una herramienta casi profesional de Robert Schmidt.


LA LIBRERÍA REGTABLE

Fundamentalmente consta de las siguientes funciones:

- InitRegTable(): Inicializa la estructura RegTable con los valores iniciales que necesita.
- LoadRegTable( char *filename ): Carga un fichero .UNC dentro de la estructura RegTable en memoria, leyendo todos sus registros y cargándolos.
- SaveRegTable( char *filename ): Salva hacia un archivo el contenido actual de la tabla en memoria.
- InRegTable():Lee el valor de todos los registros que son importantes para el modo X en la estructura.
- OutRegTable(): Manda hacia los registros VGA los valores que contiene la tabla.

Si quisiéramos cargar el fichero generado con Vgaregs 256x240.unc en un programa propio, por ejemplo, bastaría con que se encontrara en el mismo directorio que el .EXE generado desde un listado que incluyera las líneas:


  InitRegTable();
  LoadRegTable( "256x240.unc" );
  OutRegTable();

Con esta librería se pretende proporcionar al lector un control sobre todos los modos X, aunque en los artículos se profundice sobre los 320 píxels horizontales de resolución.


NUEVAS FUNCIONES

Además de las nuevas funciones SetAddress() y SetPage(), que serán comentadas en el próximo número, en la librería VGAREGS.H se han implementado funciones relacionadas con el control de los retrazos, tanto verticales como horizontales, y para el enmascaramiento de planos.

Enmascarar significa tapar, cubrir. Esto es lo que hace la función MaskPlanes() que permite prohibir el acceso a cualquiera de los 4 planos de la VGA. A esta función se le pasa como parámetro un byte cuyos últimos cuatro bits indican 1 (acceso permitido) o 0 (acceso no permitido), de manera que el bit 0 representa al plano 0, el bit 1 al plano 1, etc...

Si quisiéramos permitir sólo la escritura a los planos 0 y 2, se le debería pasar como parámetro el valor 5 (0101b). Es decir, cada bit actúa como interruptor para un plano ( el bit 0 para el plano 0, etc... ). Para permitir la escritura en los cuatro planos, bastaría con escribir MaskPlanes( 0xF ); ( 0xf = 15 = 1111b ), tal y como hace la función EnableAllPlanes().

El enmascaramiento de los planos se realiza mediante el Map Mask Register del VGA Sequencer, como se puede ver en las tablas de registros publicadas en el número anterior de la revista Sólo Programadores.

Un ejemplo de enmascaramiento de planos lo podemos ver en el listado del disco ejemplo4.c, donde realizamos un dibujo después de enmascarar el plano 0, que como se refleja en el resultado, resulta protegido contra escritura.


DOCUMENTOS DE INFORMACIÓN

En el soporte de software que acompaña a la revista se incluye el subdirectorio DOCS, dentro del apartado de modo X, que incluye varios documentos de texto escritos por importantes programadores dentro de la escena que constituye el modo X.

De Michael Abrash podemos encontrar los listados SETMODEX.ASM y SHOWPAGE.ASM. El primero muestra la inicialización del modo X que diseñó el "padre" de los modos unchained. El segundo muestra la función llamable desde C que M. Abrash creó para cambiar el Start Address Register.

De Robert Schmidt podemos encontrar MODEX.TXT, un documento que resulta una excelente introducción al modo X, extraido del programa TWEAK. El documento VGA.DOC, de diversos autores, resulta imprescindible pues acumula la definición de todos los registros VGA, incluyendo sus puertos, índices y el valor de sus bits. Una extracción de los registros que controla el CRTC se ha realizado hacia el documento CRTC.DOC.


EN LA PRÓXIMA ENTREGA

En el próximo número se verá como inicializar la memoria VGA de los modos X para disponer de otras resoluciones de pantallas como 2x2 o 4x1, en vez de 4 pantallas verticales como en la figura 1, consiguiendo mediante el desplazamiento por la memoria realizar scrolles multidireccionales para demostraciones gráficas. Se dispondrá además de una versión mucho más potente de la librería de modo X de manera que sea estándar para todas las resoluciones de páginas de 320x200 y 320x240. Hasta entonces, en los ejemplos del disco el lector puede encontrar un scroll vertical en modo X que puede ir estudiando como anticipo del próximo número.

Pulse aquí para bajarse los ejemplos y listados del artículo (12 Kb).
Pulse aquí para bajarse la utilidad VGARegs (25 Kb).

Tabla 1: "Registros del CTR Controller (I)."
Tabla 2: "Registros del CTR Controller (II)."
Tabla 3: "Registros del CTR Controller (III)."
Tabla 4: "Registros del CTR Controller (IV)."
Tabla 5: "Registros del CTR Controller (V)."

Santiago Romero


Volver a la tabla de contenidos.