Primeras pruebas de funcionamiento
Valoración de usuario: / 8
PeorMejor 
Sábado, 11 de Octubre de 2008 05:22

Al encender el Spectrum con la interface de video conectada no se observa nada fuera de lo habitual. En los primeros instantes del arranque, cuando la señal RESET pasa a nivel bajo durante unas milésimas de segundo, el TMS9929 se inicia, inhibiendo su salida de video; el biestable que decide qué dispositivo envía interrupciones al Spectrum se borra, haciendo que el buffer triestado conectado a su salida corte la conexión entre el pin de interrupción del TMS y el Spectrum.

A partir de aquí, están disponibles los puertos 153 y 152 (99h y 98h) para controlar al nuevo chip de video. Puede hacerse una prueba simple desde BASIC como ésta, que muestra un vocado de caracteres en pantalla, usando la fuente de caracteres original de Sinclair:

English version is in progress. In the meanwhile, please use this Google automated translation version. It may be a little odd to read, but at least, you will get an idea of what's going on, if you can't read spanish.

  10 DATA 0,192,0,12,1,32,3,31
  20 RANDOMIZE IN 153
  30 PRINT "Configurando registros..."
  40 FOR n=0 TO 7: READ a: OUT 153,a: OUT 153,128+n: NEXT n
  50 PRINT "Cargando patrones..."
  60 OUT 153,0: OUT 153,72
  70 FOR n=0 TO 2047: OUT 152,PEEK (15360+n): NEXT n
  80 PRINT "Cargando atributos (negro sobre blanco)..."
  90 OUT 153,0: OUT 153,67
 100 FOR n=0 TO 31: OUT 152,31: NEXT n
 110 PRINT "Volcando codigo ASCII..."
 120 OUT 153,0: OUT 153,64
 130 LET c=32
 140 FOR n=0 TO 767: OUT 152,c: LET c=(32 AND c=127)+(c+1 AND c<127): NEXT n

La línea 10 contiene los valores que se van a escribir en los registros 0 a 7 del TMS. Estos valores programan el modo 1 de gráficos y definen dónde comenzarán, en VRAM, las distintas estructuras de datos necesarias para generar la pantalla. Estas estructuras son: la tabla de patrones (definiciones de caracteres), la tabla de colores (que define el color que puede tener cada grupo de 8 caracteres), y por último, el frame buffer ("name table" en la terminología de Texas Instruments) donde se guardan los códigos de los caracteres que se pretenden visualizar. También se definen las estructuras para sprites, aunque en este ejemplo no se usan.

La línea 40 lee en secuencia los valores DATA y los aplica a cada registro. Para ello, primero hace un OUT al puerto 153 con el valor que va a tener un registro, y seguidamente, hace otro OUT al mismo puerto, pero con el valor 128+n donde n es el número de registro (0 a 7).

La línea 60 inicializa el contador de direcciones VRAM para que tenga el valor 800h. Para ello hace dos OUT's al puerto 153: el primero, con la parte baja de la dirección (0) y el segundo, con la parte alta de la dirección (8) sumado a 64 (es decir, el segundo OUT siempre tiene un valor cuyo bit 7 vale 0 y cuyo bit 6 vale 1).

800h es el valor donde, según hemos programado en la línea DATA, comenzará en VRAM la definición del juego de caracteres. El TMS9929 permite definir hasta 256 caracteres, cada uno ocupando 8 bytes (patrones de 8x8 píxeles), de ahí que haya que rellenar 2048 bytes con esta información. Los 8 primeros bytes conforman el carácter cuyo código ASCII es 0, los 8 siguientes, el carácter cuyo código ASCII es 1, y así hasta el carácter con código ASCII 255.

La ROM del Spectrum contiene un área, que comienza en la posición de memoria 15616, donde se guardan las definiciones de los caracteres con código ASCII desde el 32 hasta el 127. Para hacer coincidir los códigos ASCII en el TMS, la línea 70 comienza a copiar a VRAM desde la posición 15360 (donde estaría guardada la definición del hipotético carácter ccon código ASCII 0) y se extiende más allá de la ROM, donde "deberían" estar las definiciones de los caracteres con código ASCII superior a 128.

Para escribir un valor en la VRAM en la posición apuntada por el contador de direcciones, basta escribir dicho valor en el puerto 152. El contador de direcciones se incrementa automáticamente en el TMS.

Las líneas 90 y 100 inicializan de nuevo el contador de direcciones VRAM a la posición 300h, y a partir de esa dirección, se rellenan 32 bytes con el valor 31. El modo 1 de pantalla admite definir una pareja de colores (los equivalentes a INK y PAPER) para cada grupo de 8 caracteres. Para este ejemplo hemos elegido, para todos los caracteres, usar color de primer plano negro, sobre fondo blanco. El negro tiene como código 01h y el blanco, 0Fh. El byte que define por tanto el color de primer plano y el color de fondo será: 1Fh, es decir, 31.

Por último, las líneas 120 y 130 se encargan de rellenar con datos el frame buffer, que comienza en la dirección 0000h de la VRAM. El modo de pantalla seleccionado ofrece 24 filas de 32 caracteres, es decir, 768 caracteres en total. El bucle de la línea 130 rellena estos 768 caracteres con los números del 32 al 127 de forma cíclica. El resultado: la lista de todos los caracteres ASCII con la forma en la que se encuentran en la ROM del Spectrum.

Dado que la inicialización del contador de direcciones, o la introducción de datos en los registros de configuración, requieren de dos OUT's en secuencia, un flip-flop interno determina qué parte del valor se espera a continuación. Como quiera que un error de programación puede dejar este flip-flop en un estado indeterminado, el TMS permite resetear el estado del mismo simplemente leyendo el registro de estado. Es por ello que se hace un IN al puerto 153 al comienzo del programa, en la línea 20. Como el valor devuelto no lo necesitamos en realidad, hemos usado RANDOMIZE.

 

Add your comment

Your name:
Your email:
Título:
Comment:
  The word for verification. Lowercase letters only with no spaces.
Word verification:
ZX Projects, Powered by Joomla! and designed by SiteGround web hosting