Vous êtes sur la page 1sur 6

MODO DE VIDEO 13H Estos nmeros representan uno de los modos de video ms utilizado para la programacin de videojuegos.

Cada modo de video tiene dos caractersticas, primero la resolucin o nmero de pixeles horizontales y verticales, 320 y 200 en nuestro caso, y segundo el nmero de colores que pueden aparecer simultneamente en pantalla, 256 para nosotros. Por pxel se entiende mnimo elemento (punto) que se puede representar en pantalla. En el mercado existen varios tipos de tarjetas de video: EGA, VGA y Sper-VGA. La primera ya est obsoleta y la ltima es nuestros propsitos inmediatos. Comenzaremos con el modo 13h de la VGA para realizar los programas y no otros modos con ms resolucin como el 0Eh (640x200), el 10h (640x350) o el 12h (640x480), debido al nmero de colores. Estos tres modos que hemos nombrado tienen un mximo de 16 colores simultneos en pantalla y como ya hemos dicho, el modo 13h cuenta con 256 colores, y preferimos tener ms colores en pantalla a consta de perder resolucin. Adems otra ventaja adicional de este modo es la organizacin de su memoria de video, que es muy sencilla como veremos ms adelante. Algunos lenguajes como C y Pascal suministran unos controladores e instrucciones especiales para trabajar en modo grfico, pero nosotros en la medida de lo posible evitaremos el uso de estos servicios, ya que adems de tener que cargar con los controladores grficos, dgase BGI o como sea, suelen ser bastante lentos derivadas del hecho de ser una "librera grfica no especializada". Por otra parte, su principal ventaja era que nos permita trabajar en cualquier modo de video sin apenas trabajo de creacin de nuestra parte. Si pretendemos usar los distintos modos grficos de que disponemos, nos vemos en la necesidad de crear nuestro propio set de funciones ( put pixel(), get pixel(), line(),etc. ) para poder trabajar en el modo grfico que deseemos. El problema es que cada modo de video se programa de una manera. De los (en principio) 19 estndar existentes se gestiona de una forma diferente, por lo que tendremos que crear una librera especializada para cada uno de ellos, aprovechando las ventajas que ese modo nos proporciona para obtener un cdigo mas rpido y optimizado. Por supuesto, pueden agruparse estas libreras en una sola, para crear una librera no especializada, pero mucho ms que cualquier BGI, y permitir en nuestros programas que el usuario elija el modo de

video en el que desea trabajar, tal como lo hacen Quake, Windows y la mayora de los juegos profesionales actuales.
El modo de video 320X200X256

Para programar grficos en este modo de video, principalmente hemos de saber hacer tres cosas: 1) Inicializar el modo de video 320X200 13h. 2) Comprender el modo de direccionamiento lineal del 13h y su organizacin interna 3) Realizar rutinas grficas para dicho modo. Veamos primero cmo inicializar cualquier modo de vide (entre ellos el 13h), utilizando los servicios disponibles en la ROM-BIOS del PC
La BIOS del PC

La ROM-BIOS del PC es una zona de memoria no modificable, en la cual disponemos de una serie de funciones y servicios para su uso por el sistema operativo (utilizables por el usuario), que gestionan accesos a disco, control de la tarjeta de video, gestin de impresora, etc. Estas funciones son las llamadas "interrupciones de software" y proporcionan al programador todo el control sobre el hardware del PC. La manera de llamar a una de esas interrupciones, en lenguaje assembler, consiste en preparar todos los parmetros que sta requiera (cargar los registros del PC, como AX, BX, CX, con los valores adecuados) y ejecutar la llamada a la interrupcin. Supongamos que queremos iniciar el 320x200. Cargamos los registros como se solicita y efectuamos la llamada: mov ah,0 VideoMode */ mov al,13h int 10h o interrupcin de video) */ Podemos observar que conociendo los parmetros que requiere cada interrupcin y servicio podemos utilizar cualquiera de las funciones de bajo nivel que nos provee la BIOS. Dentro de una fucin en C sera, por ejemplo: /* modo : 13h */ /* llamada a int 10h ( /* AH=0 : Init

void SetVideoMode (char modo) { asm{ mov ah,0 mov al,[modo] int 10h } } La misma puede ser convocada para iniciar el modo grfico ( SetVideomode(0x13) y tambin volver al modo texto que es el modo 03h ( SetVideomode(3) ).
Organizacin interna del modo 13h

Las tarjetas EGA/VGA disponan de un segmento de 64 kb para representar su imagen (A000), esta zona forma parte de la VRAM (Video RAM) y es la zona de memoria de donde la tarjeta grfica lee los datos para convertirlos en imgenes, es decir, cuando nosotros queremos visualizar algo en la pantalla no tratamos directamente con el monitor, si no que trabajamos con una zona de memoria y a partir de ah, la VGA se encarga automticamente de 'dibujar' las imgenes. Hemos dicho que esa zona de memoria es de 64 Kb entonces, Cmo se explica que algunas tarjetas VGA consten de una memoria de 1, 2 ms megas?, pues bien, ante la imposibilidad de trabajar con ese estrecho margen de 64 kb, los fabricantes de tarjetas se decidieron por utilizar los que se llaman Bit-planes o pginas de 64 kb cada uno, que se 'esconden' detrs de esos 64 kb visibles y direccionales, aumentando la memoria disponible pero complicando mucho la electrnica del sistema de vdeo, en algunos modos de video (los de 16 colores) se hace imprescindible trabajar directamente con las pginas, pero en este modo no es as. Como ya dijimos al principio, una de las ventajas de trabajar en el modo 13h es la organizacin de la memoria de video. En este modo cada punto en pantalla se representa por un byte que indica el color de ese punto, por lo tanto con 8 bits se pueden codificar 256 valores diferentes, de ah viene el nmero de colores de este modo de video. La resolucin grfica de este modo es de 320x200, cada lnea de pantalla se compone de 320 puntos o bytes y en total habr 200 lneas, todas estas lneas se suceden unas a otras de modo lineal a travs de ese segmento de 64 kb situado en la direccin A000, ocupando un total de 64000 bytes.

Aproximadamente entre 50 y 70 veces por segundo la tarjeta grfica lee de su memoria todos los valores que contiene y transforma esa informacin digital en los puntos que vemos en la pantalla. Tras nuestro monitor hay un haz de electrones que bombardea la pantalla con electrones que producen las diferentes tonalidades. Estas partculas tienden a apagarse lo que es necesario redibujar la pantalla, este proceso se denomina "retrasado o refresco de pantalla" Volviendo al direccionamiento si nosotros nos definimos una tabla de 64000 bytes y la situamos en esa zona de memoria con la clusula Pascal absolute...: Pantalla :Array[1..64000] of bytes Absolute $A000:0000; Tendremos una variable definida justo 'encima' de la memoria de video y cualquier cambio que hagamos sobre dicha variable se reflejar inmediatamente en pantalla. Para escribir un punto en pantalla de color C, en las coordenadas X,Y nicamente tendremos que calcular la posicin en dicha tabla donde escribir el color. Debido a la disposicin lineal que dijimos antes, esta ser y*320+x, es decir, el nmero de lnea por 320 ms el nmero de columna, en Pascal nos quedara: Pantalla [Y*320+X]:=C coordenadas X,Y*/ /*Visualiza un punto de color C en

En C no podemos poner cualquier valor, en la tarjeta VGA todos los colores (256) que se pueden representar en pantalla en un momento determinado, se guardan en una estructura conocida como tabla de colores o paleta. El mtodo anterior para representar un punto utiliza la tcnica de acceso directo a memoria (no confundir con la DMA), para lograr sus propsitos podramos haber tenido el mismo resultado si hubisemos utilizado la instruccin MEM, que se utiliza para referenciar una posicin de memoria. MEM[$A000:Y*320+X]:=C coordenadas X,Y*/ /*Visualiza un punto de color C en

Existen otros mtodos para representar puntos en pantalla, en el sentido de optimizar los anteriores. Optimizar una rutina significa eliminar operaciones innecesarias y

sustituir las operaciones lentas por otras ms rpidas logrando as velocidad. Una de los puntos que podemos mejorar es en las multiplicaciones. Cualquier programador de ensamblador sabe que la multiplicacin es una de las operaciones ms lentas para el microprocesador (entre 139 y 13 ciclos de reloj0 y una rutina tan crtica como el clculo del desplazamiento (offset) de un punto que es repetida varios cientos de miles de veces por segundo, es importantsimo su optimizacin. Recordemos que los bits de cualquier byte pueden ser desplazados a izquierda y a derecha mediante las instrucciones asm shl y shr o usando los operadores de C << y >> . Desplazar un nmero binario de izquierda es equivalente a multiplicarlo por 2, veamos: 00010110 binario = 22 decimal 00101100 binario = 44 decimal 01011000 binario = 88 decimal Con el desplazamiento de los bits a derecha ocurrira lo contrario se dividira por 2, 4, 16 segn la cantidad de bits a mover. Logramos as que el producto o la divisin se reduzcan a a simples operaciones lgicas a nivel de bits (en solo 1 2 ciclos de reloj). Pero por desgracia 320 no es potencia de 2, por lo que no podemos multiplicar directamente usando desplazamientos...excepto aprovechndonos de la propiedad distributiva del producto segn la cual una multiplicacin puede dividirse en suma de multiplicaciones: num*320 = (num*256) + (num*64) Ahora s, 256 y 64 son potencias de 2 y podemos usar desplazamientos para multiplicar: Off set = (y<<8) + (y<<6) + x Esta rutina es mucho ms rpida que la primera que desarrollamos y por tanto podremos poner ms pxeles en pantalla en menos tiempo. La optimizacin de cdigo es otro punto importante de la programacin grfica, ya que araar algn ciclo de reloj puede parecer poco y nada, pero si es una rutina que se ejecuta miles de veces por segundo, el incremento de velocidad puede ser notable.

Podemos encontrar valioso verlo ahora en una fuente real en Pascal y en C (Turbo C++ 3.0) que colocan un pixel en la posicin (100,50) de la pantalla (observar detenidamente :-).

Vous aimerez peut-être aussi