Capítulo VII: ARQUITECTURA DEL PC, AT Y PS/2 BAJO DOS
RET tipo_tarjeta ENDP
7.4.3. - INTRODUCCIÓN AL ESTÁNDAR GRÁFICO VGA.
La tarjeta VGA es el estándar actual en ordenadores personales, siendo el sistema de vídeo mínimo que incluye la máquina más asequible. En este apartado estudiaremos la forma básica de programar sus modos gráficos, haciendo un especial hincapié en el tema menos claramente explicado por lo general: el color. Se ignorarán por completo las tarjetas CGA y Hércules, aunque sí se indicará qué parte de lo expuesto se puede aplicar también a la EGA. Tampoco se considerará la MCGA, un híbrido entre EGA y VGA que solo equipa a los PS/2-30 de IBM, bastante incompatible además con la EGA y la VGA.
La VGA soporta todos los modos gráficos estándar de las tarjetas anteriores, resumidos en la figura 7.4.3.1, si bien los correspondientes a la CGA (320x200 en 4 colores y 640x200 monocromo) son inservibles para prácticamente cualquier aplicación gráfica actual.
┌────────────┬────────────────┬──────────┬──────────┬───────────────┬───────────┐ │ Modo (hex) │ Resolución │ Colores │ Segmento │ Organización │ Adaptador │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 4 y 5 │ 320 x 200 │ 4 │ B800 │ entrelazado │ CGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 6 │ 640 x 200 │ 2 │ B800 │ entrelazado │ CGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 0Dh │ 320 x 200 │ 16 │ A000 │ planos de bit │ EGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 0Eh │ 640 x 200 │ 16 │ A000 │ planos de bit │ EGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 0Fh │ 640 x 350 │ 2 │ A000 │ planos de bit │ EGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 10h │ 640 x 350 │ 4 │ A000 │ planos de bit │ EGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 10h │ 640 x 350 │ 16 │ A000 │ planos de bit │ EGA (128K)│ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 11h │ 640 x 480 │ 2 │ A000 │ lineal │ VGA/MCGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 12h │ 640 x 480 │ 16 │ A000 │ planos de bit │ VGA │ ├────────────┼────────────────┼──────────┼──────────┼───────────────┼───────────┤ │ 13h │ 320 x 200 │ 256 │ A000 │ lineal │ VGA/MCGA │ └────────────┴────────────────┴──────────┴──────────┴───────────────┴───────────┘ FIGURA 7.4.3.1: MODOS GRÁFICOS DE VIDEO
La organización de
la memoria (entrelazado, planos de bit o lineal) es la manera en que se direcciona la memoria de vídeo por parte de la CPU. Por ejemplo, en el modo 6, cada pixel de la pantalla está asociado a un bit (8 pixels por byte) a partir de la dirección B800:0000; sin embargo, cuando se recorren 80 bytes en la memoria (640 bits o pixels, primera línea
completa) no se pasa a la segunda línea de la pantalla sino unas cuantas más abajo, en una arquitectura relativamente compleja debida a las limitaciones del hardware de la CGA. Esto ha sido superado en las siguientes tarjetas, en las que las líneas están consecutivas de manera lógica en una organización lineal, si bien
el límite de 64 Kb de memoria que puede direccionar en un segmento el 8086 ha obligado al truco de los planos de bit. Para establecer el modo de vídeo se puede emplear una función del lenguaje de programación que se trate o bien llamar directamente a la BIOS, si no se desea emplear la librería gráfica del compilador: la función 0 (AH=0) de servicios de vídeo de la BIOS (INT 10h) establece el modo de vídeo solicitado en AL. En Turbo C sería, por ejemplo:
#include <dos.h>
main() {
struct REGPACK r;
r.r_ax=0x0012; /* AH = 00, AL=12h */ intr (0x10, &r); /* ejecutar INT 10h */ }
7.4.3.1 - EL HARDWARE DE LA VGA.
El chip VGA consta de varios módulos internos, que definen conjuntos de registros direccionables en el espacio E/S del 80x86. En la EGA eran de sólo escritura, aunque en la VGA pueden ser tanto escritos como leídos. Por un lado está el secuenciador, encargado de la temporización necesaria para el acceso a la memoria de vídeo. Por otro lado tenemos el controlador de gráficos, encargado del tráfico de información entre la CPU, la memoria de vídeo y el controlador de atributos; consta de 9 registros cuya programación es necesaria para trazar puntos a gran velocidad en los modos de 16 colores. El controlador de atributos gestiona la paleta de 16 colores y el color del borde. Por último, el DAC o Digital to Analog Converter se encarga en la VGA (no dispone de él la EGA) de gestionar los 262.144 colores que se pueden visualizar en pantalla. La parte del león son los ¡768 registros! de 6 bits que almacenan la intensidad en las componentes roja, verde y azul de cada color, de los 256 que como mucho puede haber simultáneamente en la pantalla (256*3=768).
7.4.3.2 - EL COLOR.
La CGA puede generar 16 colores diferentes, utilizando un solo bit por componente de color más un cuarto que indica la intensidad. Sin embargo, la EGA emplea dos bits por cada una de las tres componentes de color, con lo que obtiene 26=64 colores diferentes. Para asociar estos 64 colores a los no más de 16 que puede haber en un momento determinado en la pantalla, se emplean los 16 registros de paleta del controlador de atributos: En cada uno de estos registros, de 6 bits significativos, se definen los 16 colores posibles. La BIOS de la EGA y la VGA carga los registros de paleta adecuadamente para emular los mismos colores de la CGA. Así, por ejemplo, en los modos de texto el color 0 es el negro y el 15 el blanco brillante, si bien se puede alterar esta asignación. Un cambio en un registro de paleta afecta instantáneamente a todo el área de pantalla pintado de ese color. El valor binario almacenado en los registros de paleta tiene el formato xxrgbRGB, siendo rgb los bits asociados a las componentes roja, verde y azul de baja intensidad, y RGB sus homólogos en alta intensidad. Así, el valor 010010b se corresponde con el verde más brillante.
Modos de 16 colores en VGA.
En la VGA el tema del color en los modos de pantalla de 16 colores (tanto gráficos como de texto) se complica algo más, debido a la presencia del DAC: una matriz de 256 elementos que constan cada uno de 3 registros de 6 bits. Cada uno de los registros de paleta apunta a un elemento del DAC, que es quien realmente contiene el color; lo que sucede es que los registros del DAC son programados por la BIOS para emular los 64 colores de la EGA. Existen dos maneras diferentes de indexar en el DAC los registros de paleta, de manera que se puede dividir el DAC en 16 bloques de 16 elementos o bien en 4 bloques de 64 elementos: en un momento dado, sólo uno de los bloques (denominado página de color del DAC) está activo. Esto significa que se pueden crear 16 ó 4 subpaletas, pudiéndose activar una u otra libremente con una función de la BIOS de la VGA. Por defecto, la BIOS establece 4 páginas de 64 elementos en el DAC, de manera que valores en el rango 0-63 en los 16 registros de paleta referencien a posiciones distintas en el DAC (al área 0-63, al 64-127, al 128-191 ó al 192- 255): por defecto, la BIOS emplea los elementos 0..63 del DAC que programa para emular los 64 colores de la EGA. Sin embargo, puede resultar más interesante disponer de 16 subpaletas de 16 elementos para conseguir
determinados efectos gráficos: en este caso no tiene sentido que los registros de paleta almacenen valores fuera del rango 0-15 (de hecho, solo se consideran los 4 bits menos significativos de los mismos). La figura 7.4.3.2 expresa gráficamente la manera en que se genera el color. Se pueden definir, por ejemplo, las 16 subpaletas en tonos ascendentes de azul y, cambiando la página o subpaleta activa a cierta velocidad se puede hacer que la imagen se encienda y apague rítmica y suavemente. Por supuesto, también se pueden obtener efectos similares alterando directamente los registros del DAC, aunque es mucho más lento que conmutar entre varias paletas ya definidas. Conviene resaltar que el color del borde de la pantalla se define en la EGA y en la VGA en una especie de registro que sigue a los 16 registros de paleta: en la VGA no interviene el DAC en la generación del color del borde, del que solo existen por consiguiente 64 tonos (si bien el borde suele estar en color negro y su tamaño reducido y variable lo hace inservible para nada).
Los pixels en los modos gráficos de 16 colores pueden parpadear, si bien es una técnica poco empleada: para ello, basta con cambiar un bit de un registro del controlador de atributos, aunque existe una función de la BIOS que realiza dicha tarea (llamar a la INT 10h con AX=1003h y BX=1 para activar el parpadeo -situación por defecto en los modos de texto- ó BX=0 para desactivarlo).
┌────────────────────┐ │ │ ├────────────────────┤ │ │ ├────────────────────┤ │ │ ┌─ 0..63 ┐ ├────────────────────┤ CASO 4 X 64 │ │ │ │ ├─ 64..127 │
├────────────────────┤ ┌── valor 0..63 ─────¾ elemento del DAC ───┤ │¾ página (0..3) │ │ │ ├─ 128..191 │ seleccionable ├────────────────────┤ │ │ │ (0 por defecto) ┌───¾│ │─────────────┤ └─ 192..255 ┘
│ ├────────────────────┤ │
color │ │ │ │ ┌─ 0..15 ┐
en pantalla (0..15) ────────┘ ├────────────────────┤ └── valor 0..15 ─────¾ elemento del DAC ───┼─ 16..31 │
│ │ ├─ 32..47 │ ├────────────────────┤ CASO 16 x 16 : │¾ página (0..15) │ │ : │ seleccionable ├────────────────────┤ ├─ 224..239 │ │ │ └─ 240..255 ┘ ├────────────────────┤
│ │ Elementos del DAC ├────────────────────┤ │ │ ├────────────────────┤ │ │ ├────────────────────┤ │ │ ├────────────────────┤ │ │
├────────────────────┤ FIGURA 7.4.3.2: OBTENCIÓN DEL COLOR EN LOS MODOS DE 16 COLORES (VGA) │ │
└────────────────────┘
16 Registros de paleta
El truco del mono.
Los monitores monocromos VGA solo admiten 64 tonos y se limitan siempre a presentar la componente verde del DAC. Lo que sucede es que la BIOS ajusta la intensidad de la señal verde para emular la presencia de las otras dos. En concreto, suma el 30% del valor rojo, el 59% del verde y el 11% del azul y el resultado lo fuerza al rango 0-63, lo cual simula aproximadamente la intensidad que percibiría el ojo humano con los colores reales. Si se accediera directamente al hardware sin ayuda de la BIOS, lo cual no es nuestro
caso, este sería un aspecto a considerar. Por último, decir que en el modo de 4 colores y 350 líneas, solo se emplean los registros de paleta 0, 1, 4 y 5, si bien lo normal aquí es esperar que existan 16 colores (caso de la VGA, o incluso de la EGA con 128K).
Modo de 256 colores.
En el modo 13h de 320x200 con 256 colores, la generación del color se aparta de lo estudiado hasta ahora para los demás modos gráficos y los de texto, ya que solo interviene el DAC: el byte de memoria de vídeo asociado a cada punto de la pantalla apunta directamente a un elemento del DAC. Por tanto, los registros de paleta del controlador de atributos no se emplean en este modo, siendo más sencillo el proceso de generación del color.
Cómo definir la paleta y los registros del DAC.
A la hora de cambiar la paleta es conveniente emplear funciones de la BIOS o del lenguaje de programación, ya que un acceso directo al hardware sin más precauciones puede provocar interferencias con algunas tarjetas VGA. Conviene también emplear las funciones que cambian de una sola vez un conjunto de registros del DAC, ya que hacerlo uno por uno es demasiado lento. Otra ventaja de emplear la BIOS es que ésta hace automáticamente las conversiones necesarias para lograr la mejor visualización posible en pantallas monocromas. En algunos casos, las paletas que define por defecto la BIOS al establecer el modo de pantalla son apropiadas. Sin embargo, puede ser útil cambiarlas para lograr un degradado atractivo en los modos de 16 colores y casi obligatorio en el modo de 256 colores, dada la absurda paleta propuesta por la BIOS. Para definir un color en el DAC, basta con un poco de imaginación: si las tres componentes están a cero, saldrá el negro; si están a 63 (valor máximo) saldrá un blanco brillante; si se ponen la roja y la azul en 32 y la verde en 0, saldrá un morado de oscuridad mediana. Se puede realizar un bucle y llenar los primeros 64 elementos del DAC con valores crecientes en una componente de color, poniendo a 0 las demás: de esa manera, se genera una paleta óptima para hacer degradados (escalas de intensidad) de un color puro.
FIGURA 7.4.3.3:
/********************************************************************* * EJEMPLO DE CAMBIO DE LA PALETA DE 16 COLORES (EGA/VGA) LLAMANDO AL * * BIOS PARA ELEGIR LOS COLORES DESEADOS, ENTRE LOS 64 POSIBLES DE LA * * EGA (POR DEFECTO EMULADOS POR EL DAC DE LA VGA). * *********************************************************************/ #include <dos.h> #include <graphics.h> void main() { struct REGPACK r;
int gdrv, gmodo, coderr, i, x, color, pixel; char paleta[17];
/* ESTABLECER MODO EGA/VGA 640x350 - 16 COLORES */ detectgraph (&gdrv, &gmodo); coderr=graphresult(); if (((gdrv!=EGA) && (gdrv!=VGA)) || (coderr!=grOk)) { printf("\nNecesaria tarjeta EGA o VGA.\n"); exit(1); } gmodo=EGAHI; initgraph(&gdrv, &gmodo, ""); coderr=graphresult(); if (coderr!=grOk)
{ printf("Error gráfico: %s.\n", grapherrormsg(coderr)); exit(1);} /* DIBUJAR BANDAS VERTICALES DE EJEMPLO */
for (x=color=0; color<16; color++)
for (pixel=0; pixel<getmaxx()/16; pixel++, x++) { setcolor (color); line (x, 0, x, getmaxy()); }
/* DEFINIR NUEVA PALETA */
paleta[0]=0; /* __rgbRGB = 0 --> negro */ paleta[1]=4; /* __000100 = 4 --> componente roja normal */ paleta[2]=4*8; /* __100000 = 32 --> componente roja oscura */ paleta[3]=4*8+4; /* __100100 = 36 --> ambas: rojo brillante */ for (i=4; i<17; i++) paleta[i]=0; /* resto colores y borde negros */
r.r_es=FP_SEG(paleta); r.r_dx=FP_OFF(paleta);
r.r_ax=0x1002; intr (0x10, &r); /* establecer paleta y borde */ getch(); closegraph();
Para establecer la paleta se puede llamar a la BIOS (INT 10h) con AX=1002h y ES:DX apuntando a un buffer de 17 bytes: uno para cada registro de paleta más otro final para el color del borde de la pantalla. El Turbo C permite cambiar la paleta con instrucciones de alto nivel; sin embargo, quienes no deseen aprender las particularidades de cada compilador, siempre pueden recurrir a la BIOS, que cambiando la paleta es bastante solvente. Echemos un vistazo al ejemplo de la figura 7.4.3.3 (para ejecutar este programa hay que tener en cuenta que el fichero EGAVGA.BGI del compilador ha de estar en el directorio de trabajo). Al principio se trazan unas bandas verticales con la función line() que serán coloreadas con los 16 colores por defecto, aunque cambiarán instantáneamente al modificar la paleta. Al definir la paleta, los 4 primeros registros son asignados con los 4 posibles tonos de rojo, más bien 3 (el primero es el negro absoluto): rojo, rojo
oscuro y rojo brillante. Todos los demás registros y el borde de la pantalla son puestos a 0 (negro) por lo que en la pantalla quedan visibles sólo las tres bandas verticales citadas. El cambio de la paleta es instantáneo, lo que permite hacer efectos especiales. En la VGA, recuérdese que los valores de la paleta son simples punteros al DAC y no los colores reales. Lo que sucede es que los registros del DAC son inicializados al cambiar el modo de pantalla de tal manera que emulan los colores que se obtendría en una EGA... a menos que se cambien los valores de dichos registros.
Para ello, nada mejor que llamar de nuevo a la INT 10h con AX=1012h, indicando en BX el primer elemento del DAC a cambiar (típicamente 0) y en CX el número de elementos a modificar (a menudo los 256 posibles). También se pasa en ES:DX la dirección de la tabla de 768 bytes que contiene la información: 3 bytes consecutivos para cada elemento del DAC (rojo, verde y azul) aunque solo son significativos los 6 bits de menor orden de cada byte. Existe también otra función bastante interesante, invocable con AX=1013h y que consta de dos subservicios: el primero se selecciona poniendo un 0 en BL, e indicando en BH si se desean 4 páginas de 64 elementos en el DAC (BH=0) ó 16 páginas de 16 elementos (BH=1). El segundo servicio se indica llamando con BL=1, y permite seleccionar la página del DAC activa en BH (0-3 ó 0-15, según cómo esté estructurado). Obviamente, esta función no está disponible en el modo 13h de 256 colores, en el que no interviene la paleta (sólo el DAC y entero, no a trocitos). La figura 7.4.3.4 contiene un nuevo
FIGURA 7.4.3.4:
/********************************************************************* * EJEMPLO DE CAMBIO DE LA PALETA DE 16 COLORES Y REPROGRAMACION DEL * * DAC DE LA VGA POR EL BIOS PARA ELEGIR LOS 16 COLORES ENTRE 262.144 * *********************************************************************/ #include <dos.h> #include <graphics.h> void main() { struct REGPACK r;
int gdrv, gmodo, coderr, pagina, i, x, color, pixel; char paleta[17], dac[256][3];
/* ESTABLECER MODO VGA 640x480 - 16 COLORES */ detectgraph (&gdrv, &gmodo); coderr=graphresult(); if ((gdrv!=VGA) || (coderr!=grOk))
{ printf("\nNecesaria tarjeta VGA.\n"); exit(1); }
gmodo=VGAHI; initgraph(&gdrv, &gmodo, ""); coderr=graphresult(); if (coderr!=grOk)
{ printf("Error gráfico: %s.\n", grapherrormsg(coderr)); exit(1);}
/* DIBUJAR BANDAS VERTICALES DE EJEMPLO */ for (x=color=0; color<16; color++)
for (pixel=0; pixel<getmaxx()/16; pixel++, x++) { setcolor (color); line (x, 0, x, getmaxy()); }
/* SELECCIONAR 16 BLOQUES DE 16 ELEMENTOS EN EL DAC */ r.r_ax=0x1013; r.r_bx=0x0100; intr (0x10, &r);
/* PAGINA 2: LA PALETA SE APOYARA EN ELEMENTOS 32..47 DEL DAC */ pagina=2; r.r_ax=0x1013; r.r_bx=(pagina<<8) | 1; intr (0x10, &r); /* APUNTAR REGISTROS DE PALETA A ELEMENTOS CONSECUTIVOS DEL DAC */
for (i=0; i<16; i++) paleta[i]=i;
paleta[16]=0; /* color del borde */ r.r_es=FP_SEG(paleta); r.r_dx=FP_OFF(paleta);
r.r_ax=0x1002; intr (0x10, &r); /* establecer paleta y borde */ /* LLENAR ELEMENTOS 32..47 DEL DAC DE AMARILLOS CRECIENTES */ for (i=32; i<48; i++) {
dac[i][0]=i*4; /* valores crecientes 0..60 de rojo */ dac[i][1]=i*4; /* valores crecientes 0..60 de verde */ dac[i][2]=0; /* sin componente azul */
}
r.r_bx=32; /* primer elemento del DAC */ r.r_cx=16; /* número de elementos a definir */ r.r_es=FP_SEG(dac[32]); r.r_dx=FP_OFF(dac[32]);
r.r_ax=0x1012; intr (0x10, &r); /* programar elementos del DAC */ getch();
closegraph(); }
programa completo de demostración, desarrollado a partir del anterior, que requiere ya un auténtico adaptador VGA. Lo primero que se hace es seleccionar el modo de 16 páginas en el DAC, estableciendo la página 2 como activa (exclusivamente por antojo mio). Ello significa que se emplearán los elementos 32..47 del DAC (la página 0 apuntaría a los elementos 0..15, la 1 hubieran sido los elementos 16..31 y así sucesivamente). Los registros de paleta, simples índices en el DAC, toman los valores 0,1,...,15 (excepto el 17º byte, color del borde, puesto a 0 para seleccionar el negro). A continuación, basta programar los registros 32..47 del DAC con los colores deseados, entre los 262.144 posibles. Como cada componente puede variar entre 0 y 63, elegimos 16 valores espaciados proporcionalmente (0, 4, 8,..., 60) y los asignamos a las componentes roja y verde (rojo+verde=amarillo), apareciendo en la pantalla una escala de 16 amarillos (el primero, negro absoluto) de intensidad creciente. Si bien 16 colores son pocos, son suficientes para representar con relativa precisión algunas imágenes, especialmente en las que predomina un color determinado (los ficheros gráficos se ven normalmente tan mal en los modos de 16 colores debido a que respetan la paleta de la EGA, en la VGA sería otra historia).
Por supuesto, existen más funciones que éstas, entre ellas las que permiten cambiar sólo un registro de paleta o un elemento del DAC (y no un bloque); sin embargo, son más lentas cuando se va a cambiar un conjunto de registros. En cualquier caso, el lector puede consultarlas en el fichero INTERRUP.LST si lo desea. También existen en la VGA las funciones inversas (obtener paletas y registros del DAC). El acceso por medio de la BIOS para cambiar la paleta es a menudo más cómodo que emplear funciones del lenguaje de programación y garantiza en ocasiones un mayor nivel de independencia respecto a la evolución futura del hardware (aunque si la librería gráfica llama a la BIOS...). Sin embargo, para otras aplicaciones, es mejor no usar la BIOS. Por ejemplo, el programa de la figura 7.4.3.5 accede directamente a los registros de la VGA para modificar la paleta en dos bucles, en el primero disminuyendo la luminosidad de la pantalla (hasta dejarla negra) y en el segundo restaurándola de nuevo. Este efecto cinematográfico hubiera sido imposible a través de la BIOS por razones de velocidad: el acceso directo al hardware, con precauciones (en este caso, esperar el retrazado vertical para evitar interferencias) es a veces inevitable. El programa de ejemplo funciona también en monitores monocromos, aunque en la práctica sólo actúe en ellos sobre la componente verde. El lector deberá consultar bibliografía especializada para realizar este tipo de programación.
7.4.3.3 - DIRECCIONAMIENTO DE PIXELS.
Para pintar pixels en la pantalla y para consultar su color, existen funciones de la BIOS de uso no recomendado. La razón estriba en el mal diseño de la BIOS inicial de IBM, no mejorado tampoco por las VGA clónicas. El problema es que las BIOS emplean 4, 5 y hasta 10 veces más tiempo del necesario para
FIGURA 7.4.3.5:
/********************************************************************* * EFECTO «CINEMATOGRAFICO» DE DESVANECIMIENTO Y POSTERIOR * * REAPARICION DE LA PANTALLA CON ACCESO DIRECTO AL HARDWARE VGA. * *********************************************************************/
#include <dos.h> void main() {
register i, j;
for (i=0; i<256; i++) { /* anotar la paleta activa */ disable();
outportb (0x3C7, i);
dac [i][0] = inportb (0x3C9); /* R */ dac [i][1] = inportb (0x3C9); /* G */ dac [i][2] = inportb (0x3C9); /* B */ enable();
}
/* claridad descendente desde el 64/64-avo al 0/64-avo de intensidad */ for (i=64; i>=0; i--) {
while (!((inportb(0x3DA) & 8)==8)); /* esperar retrazo vertical */ while (!((inportb(0x3DA) & 8)==0)); /* esperar su fin */ for (j=0; j<256; j++) { disable(); outportb (0x3C8, j); outportb (0x3C9, dac[j][0]*i >> 6); outportb (0x3C9, dac[j][1]*i >> 6); outportb (0x3C9, dac[j][2]*i >> 6); enable(); } }
/* claridad ascendente desde el 0/64-avo al 64/64-avo de intensidad */ for (i=0; i<=64; i++) {
while (!((inportb(0x3DA) & 8)==8)); /* esperar retrazo vertical */ while (!((inportb(0x3DA) & 8)==0)); /* esperar su fin */ for (j=0; j<256; j++) { disable(); outportb (0x3C8, j); outportb (0x3C9, dac[j][0]*i >> 6); outportb (0x3C9, dac[j][1]*i >> 6); outportb (0x3C9, dac[j][2]*i >> 6); enable(); } } }
trazar los puntos. La causa de este problema no reside en que empleen rutinas multipropósito para todos los modos, ya que existen básicamente sólo tres tipos de arquitectura de pantalla (modos CGA, 16 colores y 256 colores). El fallo reside, simplemente, en que han sido desarrollados sin pensar en la velocidad. Por ejemplo, la BIOS emplea el algoritmo más lento posible que existe para trazar puntos en los modos de 16 colores. Lo más conveniente es utilizar los recursos del lenguaje de programación o, mejor aún, acceder directamente a la memoria de pantalla con subrutinas en ensamblador. Este es el procedimiento seguido por la mayoría de las aplicaciones comerciales. Sin embargo, la BIOS tiene la ventaja de que permite normalizar el acceso a la pantalla. Así, un programa puede fácilmente trazar un punto en el modo 1024x768x256 de una SuperVGA (y nunca mejor dicho, porque como sean muchos más de uno...). Para trazar un punto se coloca en CX la coordenada X, en DX la coordenada Y, en AL el color, en BH la página y en AH el valor 0Ch. A continuación se llama,
como es costumbre, a la INT 10h. Para consultar el color de un punto en la pantalla, se cargan CX y DX con sus