
   Tutorial:   Programacion avanzada de la VGA - Tut: 2
   ------------------------------------------------------------------------
   Titulo:     Algunos registros de la VGA: Formatos de la pantalla.

   Autor:      Macross

   E-Mail:     balleste@uv.es

   Sumario:    Lo prometido es deuda: comenzaremos con la programacion
	       de verdad. Veremos la version (mas) correcta de como
	       visualiza la VGA lo que tiene guardado en memoria. Daremos
	       las dimensiones que queramos a la pantalla, examinando
	       los registros involucrados,...(y bla,bla,bla)

   Comentario: HAY VIDA EN ESPANYA! SIIII, ALGUNAS PERSONAS ME HAN ESCRITO!!
	       GRACIAS A LOS QUE ME HAN ESCRITO, Y GRACIAS A LOS QUE ME
	       VAIS A ESCRIBIR (hjmm,hmmj,...bueno,...por donde iba?!?)

	       Respondere a cualquier cuestion que me pregunteis (no, aun no
	       se si Dios existe). Tan solo decidme vuestro E-Mail.
	       Y por si no lo habeis visto, mi E-Mail es:

				balleste@uv.es

   Disclaimer: El de siempre: No me hago responsable de ningun danyo que os
	       pudiese surgir (no se como) como consecuencia de la lectura
	       de este tutorial (insadindad, demencia...) o los ficheros que
	       lo acompanyan.

   Indice:     0 - Programacion de la E/S. Registros de la VGA
	       1 - Visualizacion de la memoria de video
	       2 - Formateo de las pantallas logica y fisica
		 2.1 - Registros relacionados con el ancho de la pantalla
		 2.2 - Registros relacionados con la altura de la pantalla
	       3 - Un pequenyo detalle
	       4 - Modo palabra y doble palabra. Lo que pueden dar de si
	       5 - Terminando
	       6 - El proximo tutorial...
   ------------------------------------------------------------------------

   0 - Programacion de la E/S. Registros de la VGA
   ------------------------------------------------------------------------
   No se que conoces sobre la programacion de la E/S, asi que dare algunas
   indicaciones. En primer lugar hay que diferenciar E/S de la memoria. A
   las dos se accede atraves de direcciones. Si trabajamos con la memoria
   se habla de una direccion de memoria y cuando trabajamos con E/S se suele
   hablar de puertos. Los puertos nos permiten controlar cosas como el
   altavoz interno, la targeta de sonido, la vga... Una diferencia importante
   con la memoria es que solo disponemos de 64k para puertos, y se usa un
   modo muy diferente de acceso desde ensamblador. Para programar la VGA,
   se usan los registros en las direcciones que van desde el 3C0h hasta 3DAh.
   Muchos de los registros de la VGA estan indexados: metes el indice del
   registro en un puerto y el valor que quieres que contenga en el siguiente.
   El motivo es claro: es mas 'economico' usar 2 puertos (uno de indice y
   otro de datos), que 15 o 20 puertos, uno para cada registro.
   Imaginemos que queremos poner a 1111b el registro de 'mascara del mapa de
   memoria'. Este es el indice 2 del secuenciador (puerto 3C4h). El codigo
   que haria esto seria:

		mov   dx, 03C4h          ; Metemos en DX el n§ de puerto
		mov   ax, 0F02h          ; El registro al va a parar al
					 ; puerto 03c4 que es el que controla
					 ; el indice. Como es el indice 2, es
					 ; esto lo que le pasamos. En ah
					 ; metemos el dato. Este se grabara
					 ; en el puerto 03C5h
		out   dx,ax              ; Pasamos AX al puerto DX

   Bien. Esto es todo lo que necesitas saber sobre E/S para entender lo que
   sigue. Si sabes mas sobre E/S o sobre como programar bien algun
   dispositivo, MANDAME UN E-MAIL y charlaremos sobre la posibilidad de hacer
   un tutorial sobre el tema (animo...la gente lo agradece, yo el primero).
   Por cierto, hmmjmm, creo que sabeis que E/S no es Estupido/Subnormal sino
   Entrada/Salida (verdad?!?).... bueno, corramos este es-tupido velo.

   1 - Visualizacion de la memoria de video.
   ------------------------------------------------------------------------
   Antes de meternos en materia dura, vamos a ver algo de vital importancia.
   Se trata de algo que ya toque en el anterior tutorial, pero dejando
   algunas sutilezas que no lo hicieran demasiado complicado: como visualiza
   la VGA la memoria de video. No es un tema para nada trivial y es de gran
   importancia conceptual. TODO LO QUE SIGUE PRESUPONE QUE TRABAJAMOS EN UN
   MODO NO ENCADENADO A 256 COLORES.

   Debes tener bien clara la siguiente idea fundamental: cada direccion de
   memoria direcciona 4 puntos contiguos de la pantalla. Escoges la direcc.,
   seleccionas el bloque, y alli esta tu punto. De modo que las 5 primeras
   direcciones del segmento de video seleccionan los primeros 20 puntos, y
   las 80 primeras direcciones direccionan los 320 puntos de la primera fila.
   A cada grupo de 4 pixels que se direccionan con el mismo desplazamiento
   (pero cambiando el bloque) le llamaremos 'caracter' (porque quiero, puedo,
   y porque no estas aqui para decirme que no te gusta).

   Sigueme ahora en el razonamiento. La memoria de video, y en general todo
   tipo de memoria, es lineal. Esto quiere decir que la podemos ver como una
   cinta de papel muy larga:

	       ÚÄÄÄÄÄ Dir 0                     ÚÄÄÄÄÄ Dir 65535
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ......ÄÄÄÄ¿
	      ³..................................³


   Sin embargo,...los monitores que visualizan la memoria de video no son
   lineales!!! (...creo que manyana me dan el nobel por haber hecho tan
   impresionante descubrimiento, ...como? que no es el nobel? que dice mi
   madre de unas gafas de 80 dioptrias?). Pues si. Nuestros monitores no
   son largas tiras impresionantes. Son mas bien cuadradas. Sin embargo
   representan perfectamente la memoria de video, y lo hacen del modo mas
   logico. Veamos.

   Que pasa si tu quieres una hoja de papel de 20cm x 20cm y solo tienes una
   inmensa cinta de papel de 1 cm? Pues que te gastas las 10ptas que cuesta
   y ya esta. Pero..., un tio racano como yo haria otra cosa. Cortaria
   la cinta de papel en tiras de 20cm y las iria poniendo una debajo de otra
   hasta un total de veinte. Pues bien,.... esto es,casi, lo que hace la VGA.
   La VGA tiene un registro que contiene la longitud de la 'tira de memoria'.
   Cuando la vga pinte los puntos de la primera fila, lo sacara de la primera
   tira, los de la segunda fila de la segunda tira, y asi sucesivamente.

   Puede que te estes preguntando donde esta lo nuevo. Pues esta justamente
   en el detalle de que ese tamanyo esta en un registro... y puede alterarse.

   Imagina la pantalla en modo 13h no encadenado. Con una resolucion de 320
   puntos horizontales, necesitamos unas tiras de 320/4=80 bytes.

	       ÚÄÄ Dir 0                        ÚÄÄ Dir 79
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
	      ³..................................³
	      ³..................................³
	      ³..................................³

   Que pasa si ahora cambiamos el registro de 80 a 100? Pues que tendremos
   la memoria dividida en tiras mas largas:

	       ÚÄÄ Dir 0                                ÚÄÄ Dir 99
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
	      ³..........................................³
	      ³..........................................³
	      ³..........................................³

   Que cambio veremos por pantalla? Veremos 400 puntos horizontales? No.
   Solo hemos dicho que las 'tiras de memoria' seran mas largas, la VGA
   sigue con un ancho 'fisico' de 80 (320 puntos). Lo que hemos hecho es
   alterar el ancho 'logico' o de memoria. La vga representara en pantalla
   los 80 primeros caracteres de cada 'tira':

	       ÚÄÄ Dir 0                                ÚÄÄ Dir 99
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
	      ³++++++++++++++++++++++++++++++++++........³
	      ³++++++++++++++++++++++++++++++++++........³
	      ³++++++++++++++++++++++++++++++++++........³

   Es como si vieramos una hoja de papel grande de la cual solo podemos
   ver una parte. Esta parte es, obviamente, la que corresponde a las
   dimensiones fisicas de nuestro modo (en nuestro ejemplo 320x200).

   Si esto se fuera a quedar asi, parece que seria un absurdo aumentar el
   ancho logico, ya que queda una parte sin usar. Ahora bien,... crees que
   los disenyadores de la VGA se permitirian el lujo de darle todo un
   registro, si no fuera util? eh, eh? Veamos donde esta la clave.

   Existen un par de registros que nos permiten dar el desplazamiento
   origen en la memoria de video. En el ejemplo de la explicacion es
   desplazamiento era cero, pero que pasaria si yo le doy un desplazamiento
   de 3. Pues que veriamos esto:

	       ÚÄÄ Dir 0                                ÚÄÄ Dir 99
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
	      ³...++++++++++++++++++++++++++++++++++.....³
	      ³...++++++++++++++++++++++++++++++++++.....³
	      ³...++++++++++++++++++++++++++++++++++.....³


   La utilidad de los registros de desplazamiento (que son dos porque el
   desplazamiento esta entre [0,65355] y eso requiere 2 bytes) queda patente
   en los 'scrolls' de pantalla. El primer tutorial venia acompanyado de
   un programa que muestra la potencia de este metodo. El programa tan solo
   hace un barrido de arriba a abajo de la memoria de video. La idea que hay
   tras el programa es que si damos un desplazamiento de n veces el ancho
   logico de la pantalla, veremos algo como esto:

	       ÚÄÄ Dir 0                                ÚÄÄ Dir 99
	      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
	      ³..........................................³
	      ³...++++++++++++++++++++++++++++++++++.....³
	      ³...++++++++++++++++++++++++++++++++++.....³
	      ³...++++++++++++++++++++++++++++++++++.....³

   Si n=1, saltamos la primera tira y comenzamos a visualizar a partir de
   la segunda. Con un n cualquiera, comenzaremos a visualizar a partir de
   la fila n+1.

   Pero no todo acaba aqui. Hemos sido capaces de hacer un formateo logico
   de la pantalla, o lo que es igual, un formateo de la memoria de video.
   Podemos hacer un formateo fisico?, esto es,... podemos visualizar mas
   puntos por pantalla? Si. (ostras! de verdad que podemos? ESTOY LEYENDO
   TU MALDITO TUTORIAL POR QUE PROMETIAS QUE PODIAS HACERLO, asi que no me
   vengas con 'podemos obtener mas puntos?' ni chorradas de esas!!)
   Bien..., hmm,...hmmmmm, al comentario de este simpatico lector he de decir
   que A MI ME GUSTA QUE ME EXPLIQUEN ASI, por lo que pido disculpas si
   alguien ha visto ofendida su inteligencia.

   Que??? Lo has pillado? Si no lo captas por lo que a ti te parece una
   'explicacion-deficiente-y-patatera-hecha-por-un-chapuzas' enviame un
   E-Mail y tratare de darte otra mejor,... bueno, al menos lo intentare.

   En resumen, lo que hemos hecho es formatear la memoria de la VGA como
   una pagina de las dimensiones que queramos. A continuacion, metemos una
   ventana de dimensiones tambien arbitrarias y eso sera lo que veamos por
   pantalla. La idea, vista asi, es tremendamente sencilla. Veamos como
   decirle a la VGA que queremos una pantalla logica de tanto y una fisica
   de tanto otro.

   2 - Formateo de las pantallas logica y fisica.
   ------------------------------------------------------------------------
   Pasamos ahora a la parte tecnica. Hay muchas cosas en Internet sobre el
   tema. De hecho es muy probable que si estas leyendo esto es por que te
   interesa el tema, lo cual me hace pensar que ya has leido algo sobre el.
   Como habras podido observar, TODA la informacion existente esta en ingles
   y, ademas, es poco especifica. Con esto quiero decir que entran muy poco
   en materia. Una lastima, porque la gente que escribe sabe mucho mas de lo
   que pone... pero no te lo cuenta, con lo que te quedas con las ganas de
   mas, y con la sensacion de que tendras que currartelo por tu cuenta. Bien.
   Intentaremos ser un poco mas especificos.
   Del parrafo anterior debes haber concluido tres cosas:
       - Yo estuve en esa situacion antes.
       - Ya no lo estoy (...espero)
       - El conocimiento que tengo es producto de algunas horas de 'jugar',
	 por lo que lo que diga aqui puede no ser cierto o completamente
	 cierto.
   Sin embargo, lee atento ya que estoy seguro de que resultara interesante.

   Voy a comenzar a dar registros y sus descripciones. Estas estan sacadas
   de un fichero incluido en muchos .zip relacionados con el tema. En mi
   caso, lo he sacado del .zip 'tweak' de Robert Schmidt. Es un programa
   estupendo sin el cual no habria podido aprender lo que se. Se lo agradezco
   sinceramente desde aqui, y recomiendo a todo aquel que lea esto que lo
   consiga. El mejor metodo que conozco de saber donde esta este fichero es
   hacer un archie (yo lo localice asi cuando supe que existia).

   2.1 - Registros relacionados con el ancho de la pantalla
   ------------------------------------------------------------------------
   Englobare aqui los registros relacionados con el ancho de la pantalla.
   Primero la descripcion. Despues el comentario.

   ------------------------------------------------------------------------
   3c2h (w): Registro de salida miscelanea
   bit 0    Si ON, emulacion de color. Direccion base =3DXh
       1    Permite el acceso de la CPU a la memoria de video
       2-3  Seleccion de reloj
	      0: 14Mhz(EGA)    25Mhz(VGA)
	      1: 16Mhz(EGA)    28Mhz(VGA)
	      2: Externo(EGA)  Reservado(VGA)
       4    (solo EGA) Deshabilita los drivers internos de video
       5    Cuando en modo par/impar selecciona el banco alto de 64k
       6-7  Selecciona el numero de lineas en la pantalla:
	      0: 200(EGA)      reservado(VGA)
	      1:               400(VGA)
	      2: 350(EGA)      350(VGA)
	      3:               480(VGA)
   Este puerto se puede leer en la VGA desde 3cch
   ------------------------------------------------------------------------
   3d4h indice 0h (r/w): CRTC: Registro total horizontal
   bit 0-7  Pulsos totales de caracteres
	    Representa el ancho total de caracteres en pantalla incluyendo
	    la zona de blanqueo, por lo que no es relevante como 'resolucion'
	    de la pantalla.
   ------------------------------------------------------------------------
   3d4h indice 1h (r/w): CRTC: Registro de fin de pantalla horizontal
   bit 0-7  Pulsos de caracteres visualizados-1
	    Numero de caracteres que se van a visualizar. Es, por tanto, el
	    registro determinante de la resolucion horizontal. Nos dara el
	    ancho fisico de la pantalla.
   ------------------------------------------------------------------------
   3d4h indice 2h (r/w): CRTC: Registro de comienzo del blanqueo horizontal
   bit 0-7  Pulso en el que comienza el blanqueo horizontal. Suele valer
	    uno mas que el registro de fin de pantalla horizontal... adivinas
	    por que? Determina el blanqueo por la derecha.
   ------------------------------------------------------------------------
   3d4h indice 3h (r/w): CRTC: Registro de fin del blanqueo horizontal
   bit 0-4  Pulso de fin del blanqueo horizontal. Determina el blanqueo por
	    la izquierda.
	    (VGA) el sexto bit esta en el puerto 3d4 indice 5 bit 7
       5-6  Numero de pulsos de caracter a esperar al comienzo de la visual.
       7    (solo VGA) Acceso a los registros de retrazo vertical
   ------------------------------------------------------------------------
   3d4h indice 4h (r/w): CRTC: Registro de comienzo del retrazo horizontal
   bit 0-7  Contador de caracter en el que se termina el blanqueo y a
	    partir del cual, el trazado pasa a la linea siguiente.
   ------------------------------------------------------------------------
   3d4h indice 5h (r/w): CRTC: Registro de fin del retrazo horizontal
   bit 0-4  Retrazo horizontal termina cuando los ultimos 5 bits del
	    contador de caracteres se iguala a estos.
       5-6  Numero de pulsos de caracter a esperar para visualizar despues
	    del retrazo horizontal.
       7    (VGA) bit 5 del registro de fin de blanqueo horizontal.
   ------------------------------------------------------------------------
   3d4h indice 13h (r/w): CRTC: Ancho logico
   bit 0-7  (Numero de caracteres por linea)/K
	    Donde K vale 2 para el modo byte, 4 para el modo palabra, y 8
	    para el modo doble palabra.
   ------------------------------------------------------------------------

   Estos registros son los necesarios para alterar el ancho fisico y las
   dimensiones logicas de la pantalla. Puedes apreciar que excepto el
   primero, todos son registros de el CRTC. Este es un chip que controla el
   trazado de rayos. Tiene mas registros, pero no son relevantes para las
   dimensiones horizontales de la pantalla. Las descripciones son vagas en
   ocasiones, pero son las mejores que puedo dar. Sin embargo, lo que vale
   realmente, es saber que hace cada uno de ellos y eso es lo que voy a hacer
   ahora.

   Estas delante de tu monitor? Si es asi, haz lo siguiente: pon al maximo
   el brillo y al minimo el contraste. Puedes ver una zona gris entorno a lo
   que conocemos como 'pantalla'? Si es asi, quiere decir que esto no solo
   funciona en mi monitor: me alegra un monton que hayas sido tan cooperativo.
   Eso que has visto es lo que se llama zona de blanqueo y, como has podido
   ver, juega un papel importante en los registros. Los registros son los
   siguientes: un registro horizontal total, dos registros de blanqueo, dos
   registros de retrazo y un registro de ancho fisico.
   El ancho total es el ancho de la pantalla incluido la zona de blanqueo.
   No es este, por tanto, el que determina cual es la resolucion horizontal.
   Esta esta determinada por el registro de fin de pantalla horizontal. Es
   en este registro donde tenemos que poner el ancho fisico del modo en el
   que queremos trabajar. Los registros de blanqueo y retrazo ayudan a
   centrar la imagen.

   Puedes ver que he anyadido un registro al principio que no parece tener
   relacion con los demas. Esta aqui por el siguiente motivo. Imaginemos que
   queremos modificar el ancho de la pantalla. Lo primero que hemos de
   alterar es el ancho total, ya que este debe ser mayor que el ancho que
   queramos conseguir. Sin embargo, si vamos modificando su valor,encontramos
   que la pantalla 'se cuelga' al pasar de un cierto valor. En mi caso es 6Ah
   cuando parto del modo 13h y voy subiendo. Esto se debe a que la VGA, que
   en modo 13h trabaja con el reloj a 25Mhz, y esto no es suficiente para
   representar todos los puntos. El problema se soluciona cambiando el reloj
   y poniendolo a 28Mhz. El mismo problema surge cuando estamos a 28Mhz y
   bajamos hasta un cierto valor (en mi caso 62h): el sistema se cuelga. Por
   tanto, todos estos problemas se solucionan alterando la frecuencia de
   trabajo. Como el primer registro permite cambiar esta frecuencia, lo he
   puesto aqui.

   Supongamos que queremos alterar las dimensiones laterales de la pantalla.
   Lo primero, modificamos el ancho total (indice 0), ajustando el reloj si
   es necesario. A continuacion modificamos el ancho fisico (indice 1). Ahora
   modificamos el blanqueo por la derecha a uno mas que el ancho fisico, y
   centramos la imagen con el blanqueo izquierdo. Ajustamos el comienzo de
   retrazo horizontal poco despues del blanqueo lateral derecho, lo que nos
   dara el margen de blanqueo a la derecha. Ajustamos el fin de retrazo
   horizontal para centrar la imagen; aqui habra que jugar un poco, por que
   no se muy bien como funciona. Una vez hecho esto... solo queda disfrutar.
   De todos modos, yo os recomiendo 'pasar' literalmente de modificar los
   registros de fin de blanqueo y fin de retrazo horizontal. No creo que
   necesiteis modificarlos. Si os vierais obligados vereis que tienen un
   comportamiento algo extranyo. NOTA: Ehhhh, fiera! Si tu, fiera! Ese que
   sabe mogollon y que lee esto por que le han dicho que digo tonterias. Si
   sabes como funcionan estos registros mejor que yo, no dudes en escribirme.
   Me ENCANTARIA saber como funcionan exactamente. Gracias!

   El indice 13h contiene el ancho logico de la pantalla. Como ya debes saber
   es el ancho de la pantalla de memoria. Puedes ver que hay que dividir el
   ancho, que se expresa en caracteres, por 2,4 u 8 segun el modo en el que
   trabajemos. El modo va a determinar de cuantos bytes es el incremento de
   memoria por cada pulso de caracter. Lo veremos mas adelante con detalle.

   2.2 - Registros relacionados con la altura de la pantalla
   ------------------------------------------------------------------------
   El dimensionado vertical (guuuaaaau!, que curlto q' soy) es similar al
   horizontal, aunque un poco mas variado. Veamos los registros.


   ------------------------------------------------------------------------
   3c2h (w): Registro de salida miscelanea (detallado ya en 2.1)
   bit 6-7  Selecciona el numero de lineas en la pantalla:
	      0: 200(EGA)      reservado(VGA)
	      1:               400(VGA)
	      2: 350(EGA)      350(VGA)
	      3:               480(VGA)
   ------------------------------------------------------------------------
   3d4h indice 6h (r/w): CRTC: Registro vertical total
   bit 0-7  8 bits menos significativos del Total Vertical
	    Bit 8 en 3d4h indice 7 bit 0
	    (VGA) Bit 9 en 3d4h indice 7 bit 5
   ------------------------------------------------------------------------
   3d4h indice 7h (r/w): CRTC: Registro de desbordamiento
   bit 0    Bit 8 de Total Vertical (3d4h indice 6h)
       1    Bit 8 de fin de pantalla vertical (3d4h indice 12h)
       2    Bit 8 de comienzo de retrazo vertical (3d4h indice 10h)
       3    Bit 8 de comienzo de blanqueo vertical (3d4h indice 15h)
       4    Bit 8 de registro de comparacion de linea (3d4h indice 18h)
       5    (VGA) Bit 9 de Total Vertical (3d4h indice 6h)
       6    (VGA) Bit 9 de fin de pantalla vertical (3d4h indice 12h)
       7    (VGA) Bit 9 de comienzo de retrazo vertical (3d4h indice 10h)
   ------------------------------------------------------------------------
   3d4h indice 9h (r/w): CRTC: Registro de n§ maximo de lineas de scaneado
   bit 0-4  Numero de lineas de scaneado en una fila de caracter - 1
       5    (VGA) Bit 9 de comienzo de blanqueo vertical (3d4h indice 15h)
       6    (VGA) Bit 9 del registro de comparacion de linea
       7    (VGA) Dobla cada linea de escaneado (200 lineas en una de 400)
   ------------------------------------------------------------------------
   3d4h indice 10h (r/w): CRTC: Registro de comienzo de retrazado vertical
   bit 0-7  8 bits menos significativos de comienzo de retrazo vertical. El
	    retrazado vertical comienza cuando el contador de linea alcanza
	    este valor.
	    Bit 8 esta en 3d4h indice 7 bit 2
	    (VGA) Bit 9 esta en 3d4h indice 7 bit 7
   ------------------------------------------------------------------------
   3d4h indice 11h (r/w): CRTC: Registro de fin de retrazo vertical
   bit 0-3  El trazado vertical finaliza cuando los ultimos 4 bits del
	    contador de linea alcanzan este valor.
       6    (VGA) Si esta a 1 selecciona 5 ciclos de refresco por linea
	    de escaneado en lugar de 3
       7    (VGA) Deshabilita la escritura en los indices 0-7 si esta a 1
	    El indice 7 bit 4 no se ve afectado.
   ------------------------------------------------------------------------
   3d4h indice 12h (r/w): CRTC: Registro de fin de pantalla vertical
   bit 0-7  8 bits menos significativos de fin de pantalla vertical. La
	    pantalla termina cuando el contador de linea alcanza este valor.
	    Bit 8 esta en 3d4h indice 7 bit 1
	    (VGA) Bit 9 esta en 3d4h indice 7 bit 6
   ------------------------------------------------------------------------
   3d4h indice 15h (r/w): CRTC: Registro de comienzo de blanqueo vertical
   bit 0-7  8 bits menos significativos de comienzo de blanqueo vertical. El
	    blanqueo vertical comienza cuando el contador de linea alcanza
	    este valor.
	    Bit 8 esta en 3d4h indice 7 bit 3
	    (VGA) Bit 9 esta en 3d4h indice 9 bit 5
   ------------------------------------------------------------------------
   3d4h indice 16h (r/w): CRTC: Registro de fin de blanqueo vertical
   bit 0-6  (VGA) El blanqueo vertical termina cuando los 7 bits menos
	    significativos del contador de lineas alcanza este valor.
   ------------------------------------------------------------------------

   Recuerdas todo lo que dijimos para modificar las dimensiones horizontales?
   Pues es lo mismo para las verticales. Hay que anyadir, sin embargo, alguna
   cosilla mas. Por ejemplo, el indice 9h bit 7 dobla las lineas. Esto tiene
   como consecuencia, que donde antes veiamos 400 ahora vemos 200 mas gordas.
   Otra cosa muy interesante, y por cierto la clave para resoluciones vert.
   altas, son los 5 primeros bits del indice 9h. Si lees la descripcion que
   pongo, veras que dice:

	 Numero de lineas de scaneado en una fila de caracter - 1

   Sabes que quiere decir eso? Pues fijate. Cuando ponemos el modo 13h, su
   valor es de uno. El registro de salida miscianelo esta puesto para que
   la pantalla tenga 400 lineas de scaneado. Si el n§-1 es 1, quiere decir
   que dibujara 2 lineas por cada fila de caracteres, es decir, que pintara
   2 veces la misma linea. El resultado es que nosotros veremos 200 lineas
   en lugar de 400. Si lo pones a cero, tendras una linea de caracteres por
   cada linea de scaneado y veras 400 lineas por pantalla. Si lo ponemos a
   2, dibujara 3 filas por cada linea de caracteres y veremos 400/3=133
   lineas por pantalla.
   Que?,... esta bien o no? Pues nada. Ahora que ya sabes como hacerlo...
   disfruta.

   3 - Un pequenyo detalle
   ------------------------------------------------------------------------
   Pues si, es pequenyo pero importante. Resulta que si te pones a variar
   a diestro y siniestro los indices 0 al 7 del CRT (3d4h), te encuentras
   con que nada cambia: tu pantalla sigue igual. Piensas entonces que te he
   tomado el pelo y me mandas una carta poniendome verde. Pues no! No voy
   a dejar que mi reputacion se vaya al traste por una tonteria. El problema
   reside en el indice 11h. Si lo miras de nuevo y te fijas en el bit 7,
   veras que pone que cuando esta activo no se puede escribir en los indices
   0 a 7. De modo que lo que hay que hacer es ponerlo a cero. Vale?
   Si no te ha quedado claro, examina el fichero vga_t2-1.c y fijate como
   se hace.

   4 - Modo palabra y doble palabra. Lo que pueden dar de si.
   ------------------------------------------------------------------------
   La VGA tiene 3 modos de trabajo conocidos como modo byte, modo word y
   modo double word. Lo que hacen es tan sencillo como indicar cuanto vale
   el incremento de memoria por cada caracter (grupo de 4 puntos). Sera 1
   para el modo byte, 2 para el modo palabra y 4 para el modo dpalabra.
   Veamos graficamente el efecto:

   Supongamos que estamos en modo byte. Toda la memoria sera recorrida.
   Si pintamos en la pantalla los 17 primeros puntos, veremos los marcados
   con un signo +, en este caso todos:
	      ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄ....
	      ³ 0³ 1³ 2³ 3³ 4³ 5³ 6³ 7³ 8³ 9³10³11³12³13³14³15³16³
		+  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +

   Si nos ponemos ahora en modo palabra, como saltamos la memoria de 2 en 2,
   pintamos un caracter si y otro no, por lo que cuando pintemos los que
   creemos 16 primeros puntos, lo que se vera sera:
	      ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄ....
	      ³ 0³ 1³ 2³ 3³ 4³ 5³ 6³ 7³ 8³ 9³10³11³12³13³14³15³16³
		+  +  +  +              +  +  +  +              +

   Es como si pintaramos franjas negras de 4 puntos, espaciadas por 4 puntos.
   Solo veriamos las zonas no pintadas. Adicionalmente, las franjas se pegan,
   por lo que veremos nuestra pantalla original, pero reducida a la mitad.
   La primera mitad de la pantalla mostrara las filas pares y la segunda
   mitad (suponiendo que el lateral logico sea igual al fisico) mostrara las
   filas impares. El motivo es trivial si se ha entendido bien todo, y te
   detienes a pensarlo un poco. Si aun asi no lo entiendes... mandame un
   E-mail.

   Que pasa con el modo doble palabra? Pues lo mismo, pero extendiendolo
   a 4 caracteres:
	      ÚÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄÄÂÄ...
	      ³ 0³ 1³ 2³ 3³ 4³ 5³ 6³ 7³ 8³ 9³10³11³12³13³14³15³16³17³
		+  +  +  +                                      +  +

   Sobre las posibilidades... ,que crees que se podria hacer? Investiga un
   poco con el programa sobre estos modos. Puede que se te ocurran ideas
   buenas. Una de las posibilidades evidentes es la de ofrecer un nuevo modo
   de paginacion, tal vez mas eficaz para alguna tarea, que los tradicionales.

   5 - Terminando
   ------------------------------------------------------------------------
   En el primer tutorial que escribi, ya hable sobre la carencia de
   tutoriales en lengua hispana. Nuevamente tengo que hablar del tema. Este
   tutorial, como el primero, pretende abrir un camino. Pretende fomentar
   la expresion libre en nuestro idioma ademas de difundir conocimentos, que
   si bien tecnicos, no menos importantes para quien le gusten. En no muchos
   anyos, la gente tendra mucho mas acceso a todos los recursos de los que
   ahora solo disfrutamos unos pocos. Que cuando lleguen se encuentren con
   algo que puedan entender. Animo desde aqui a todo aquel que lea esto, a
   que escriba y difunda lo que sepa. Por ultimo agradecer, a todas las
   personas que me han enviado una respuesta a mi insistente peticion de
   correo del primer tutorial, sus animos y comentarios. Espero volver a
   saber de vosotros. Gracias.


   (Aunque a alguien le resulte dificil.... si, era yo: Macross, aunque en su
    version todo-tiene-su-momento, y ESTE era el momento)

   6 - El proximo tutorial...
   ------------------------------------------------------------------------
   Mas??? Vas a seguir torturandonos con tus chorradas?? Ehhjjmmm...., bingo
   para el nene. Aun dare un poco mas la lata con la VGA. Quedan cosas por
   hacer y por explicar, pero ante todo es preferente cualquier cosa sobre
   lo que quereis que hable, siempre y cuando yo lo sepa, claro (no,noooohh,
   no hare comentarios religiosos ni del gracioso de turno). Asi que ya
   sabeis, mandadme un E-Mail con lo que os gustaria que tenga mi proximo
   tutorial. El tema es en principio la VGA, aunque puede que trate otros
   temas si se piden.

        Macross, Valencia, Spain
