005:iniciacion

Microhobby 5. Año I, del 04 al 10 de diciembre de 1984

El código máquina nos permite colorear la pantalla de forma casi inmediata.

En este último capítulo sobre EL COLOR EN EL SPECTRUM, vamos a analizar un punto muy importante. Una vez conocida la distribución de atributos del ordenador, hay que saber cuál es el contenido de cada dirección de memoria y cómo podemos modificar éste, según sean las necesidades de programación.

Con lo visto en el capítulo anterior, ya sabemos cómo está distribuida la pantalla, pero ¿cuál es el contenido de cada dirección de memoria y cómo podemos modificarlo?

Si desconectamos nuestro ordenador y seguidamente lo volvemos a conectar, habremos borrado toda la información que permanecía en la memoria 'RAM', por lo que partiremos con los valores iniciales, situados allí por el fabricante, de cada celdilla de memoria. ¿Qué quiere decir esto? Tecleemos la siguiente línea:

10 PRINT PEEK 23000

En la pantalla nos aparecerá el número 56. ¿Por qué este número? Recordemos que el comando 'PEEK' nos sirve para explorar las direcciones de memoria y ver el contenido de cada una de ellas. De forma que el número 56, en este caso, es el contenido de la celdilla 23000.

Para entender esto, tenemos que recurrir a la composición de los números binarios. El número 56 en el sistema binario sería:

00111000

Si tenemos que tener en cuenta el valor de cada posición del número binario, se quedaría de izquierda a derecha como sigue:

128 64 32 16 8 4 2 1
0 0 1 1 1 0 0 0

Los números subrayados representan el valor que tiene cada posición de abajo cuando ésta se encuentra activada. Para que esto ocurra, el bit correspondiente tiene que tener el valor 1. En el ejemplo anterior, los bits activados tienen los valores 32, 16 y 8, la suma de los cuales nos da el número 56, que era el valor que tenía la dirección de memoria 23000. Las ocho partes del número binario forman un octeto, ya que están compuestas por ocho bits; cada uno de los cuales, como ya hemos dicho, puede estar activado o no. Si lo está, tendrá el valor 1, y si no, tendrá el valor 0. Cuando se encuentran activados, tendrán los valores correspondientes a la suma que les corresponda de cada lugar de la fila de arriba (128, 64, …. 2, 1). Así, el número máximo que podemos obtener de este modo es el 11111111, que será el 255, ya que la suma de sus bits activados nos da dicho valor.

Hay que tener en cuenta que en los números binarios se empieza a contar de derecha a izquierda, por tanto, el esquema del octeto sería el siguiente:

128 64 32 16 8 4 2 1
BITS

Esto tiene su lógica, porque 128, por ejemplo, es el resultado de elevar 2 a la 7ª potencia; 64 de elevarlo a la 6ª, y así con todas las demás posiciones.

Teniendo en cuenta esto último, el carácter tendrá el valor:

  • 128: Si está activado el 'FLASH'.
  • 64: Si está activado 'BRIGHT'.
  • 8: Multiplicado por el código de color del papel (de 0 a 7).

El valor del código del color de tinta (de 0 a 7), que se forma combinando los valores de los tres primeros bits.

Por ejemplo, un carácter impreso con 'FLASH', papel azul y tinta blanca, está representado por el valor 143:

  • 128 por estar activado el 'FLASH'.
  • 8 por el color del papel, que se obtiene multiplicando el código del papel azul (que es 1) por ocho.
  • 7 correspondiente al código de la tinta blanca.

La suma de todos ellos nos da 143. Haga la prueba con diferentes tipos de caracteres.

A continuación vamos a introducir el siguiente programa, que nos va a dar el contenido de todas las direcciones de memoria que componen el fichero de atributos:

10 FOR I=22528 TO 23295
20 PRINT I, TAB 8; PEEK I
30 NEXT I

En todas las posiciones obtenemos el valor 56, como ocurría anteriormente en la posición 23000, que correspondía al carácter de la fila 14, columna 24. Este valor se obtiene multiplicando por 8 el color del papel (blanco cuando conectamos el ordenador). Como toda la pantalla está en blanco, todas las direcciones de la memoria del archivo de atributos tendrán el mismo valor.

Sin embargo, vamos a probar a introducir una nueva línea en el programa anterior:

5 PRINT AT 10,0; PAPER 1; INK 6; " "

Al llegar a la dirección 22538, veremos que aparece el número 14 en lugar del 56. Esto ocurre porque hemos modificado dicho carácter en la línea 5. Ahora al multiplicar 8 por el código del color azul y sumarle el de la tinta, nos da 14 (8 x 1 + 6).

Otra forma de introducir directamente los códigos de color en el ordenador es utilizando la sentencia 'POKE'. Esta tiene la peculiaridad de que puede cambiar el valor almacenado en una dirección de memoria, sustituyéndole por uno nuevo, que va a producir un efecto diferente en la pantalla. Así, por ejemplo, 'POKE 23000, 248' nos muestra un cuadrado en la fila 14, columna 24, con tinta negra, papel blanco, brillo y flash activado. Sería lo mismo que introducir la línea:

10 PRINT AT 14,24; FLASH 1; BRIGHT 1; PAPER 7; INK 0; " "

Pero como podemos ver, el hacerlo con 'POKE' es mucho más directo y práctico al mismo tiempo. Podemos cambiar los valores de la dirección 23000 para observar cada vez un carácter diferente.

Con el programa que les ponemos a continuación, ustedes tienen que introducir los valores de 'x' a través del 'INPUT' y verán como la pantalla completa toma el color del código que le han introducido. Prueben con varios números para conseguir el efecto deseado, teniendo en cuenta siempre lo que decíamos anteriormente sobre los códigos de color, en relación con 'FLASH', 'PAPER' …

10 INPUT X
20 FOR I=22528 TO 23295
30 POKE I,X
40 NEXT X
50 GO TO 10

Si ha probado este programa, habrá observado que el ordenador ha coloreado también las líneas 22 y 23, las cuales normalmente no se pueden usar, ya que están reservadas para que su Spectrum emita mensajes o bien para que usted introduzca datos, mediante 'INPUT'. Sin embargo, al utilizar 'POKE', podemos tener acceso libre a estas dos líneas, si bien al final de haber realizado nuestras órdenes, el ordenador emitirá un mensaje OK, que nos las borrará de nuevo. Esto podría evitarse utilizando el código máquina.

Podemos también introducir un programa que nos coloree la imagen de forma aleatoria:

10 FOR I=22528 TO 23295
20 LET X=RND*255
30 POKE I,X
40 NEXT I

Con todo lo aprendido hasta ahora, hemos empezado a conocer el archivo de atributos. Para sacarle el máximo rendimiento, tendremos que recurrir ineludiblemente al empleo del código máquina. Pero no se preocupen, ya sabemos que son muchos los lectores que tienen cierto respeto a este tema, por eso no vamos a tratar aquí de explicarles tan complicado lenguajes. Ahora interesa mostrarles la rapidez con que dicho léxico actúa en relación al BASIC.

Para ello, vamos a comparar dos programas que hacen exactamente lo mismo, uno de ellos escrito en Basic y el otro en código máquina.

Los dos llenan la pantalla del televisor con tres colores diferentes, a partir de las mismas posiciones. El primero está escrito en Basic:

10 FOR I=22528 TO 23295
20 IF I>=22784 AND I<=23007 THEN POKE I, 24: GO TO 50
30 IF I>=23008 AND I<=23295 THEN POKE I, 16: GO TO 50
40 POKE I, 32
50 NEXT I

Al ejecutarlo, verá cómo la pantalla se va llenando poco a poco con tres colores: verde, magenta y rojo. En este programa hemos utilizado el método directo (a través de 'POKE') del que hablábamos antes. A pesar de ello, tarda en ejecutarse aproximadamente, alrededor de 14 segundos, tiempo bastante considerable, que no nos permitiría incluirlo como una rutina, ya que su lentitud le restaría bastante interés al programa.

A continuación vamos a hacer lo mismo, pero esta vez en código máquina. Para ello utilizaremos un programa Basic, donde incluiremos dicho código a través de varias sentencias 'DATA'.

10 FOR I=30000 TO 30036
20 READ L: POKE I, L
30 NEXT I
40 DATA 33, 0, 88, 62, 32, 119, 35, 62, 89, 188, 32, 247
50 DATA 33, 0, 89, 62, 24, 119, 35, 62, 90, 188, 32, 247
60 DATA 33, 0, 90 ,62, 16, 119, 35, 62, 91, 188, 32, 247, 201
70 RANDOMIZE USR 30000

Este programa tarda en ejecutarse apenas un segundo, lo que comparado con el anterior, supone una considerable diferencia. Los números que están escritos en blanco sobre fondo oscuro, son los que contienen los códigos de color. Recordemos que el 32 en el sistema binario era 00100000. El bit activado en este caso es el 6º, al que le correspondía el valor 32. Si quisiéramos, por tanto, cambiar los colores del programa anterior y sustituirlos por otros, sólo tendríamos que buscar los códigos de color que nos interesaran a través del sistema binario, y sustituirlo en forma decimal en la sentencia 'DATA', por el número escrito en blanco sobre fondo oscuro.

Como ejemplo, vamos a sustituir el 32 por un color verde con el flash activado. Recordemos que el 'FLASH' se activa con el 7º bit, por tanto éste deberá estar en la posición 1. El color de la tinta se conseguirá activando el 3º bit.

128 64 32 16 8 4 2 1
1 0 0 0 0 1 0 0

Este número corresponde al 132 decimal. Sustitúyalo y verá cómo cambia el efecto del primer bloque de pantalla.

Este método nos puede servir para colorear la imagen en nuestros programas, de forma automática. Dominar el código máquina en este sentido nos puede resultar muy útil, ya que no podemos olvidar que éste es la base de nuestro ordenador. Todas las instrucciones del Spectrum se traducen desde el Basic, para que el microprocesador las entienda. Es por eso que, al escribirlas en el formato del código original, la velocidad con que se realizan las instrucciones es mucho más rápida. Además, en este formato podemos llegar a lugares que están prohibidos para el lenguaje Basic, sacándole de esta forma mucho más provecho al ordenador.

Gabriel Nieto

  • 005/iniciacion.txt
  • Última modificación: d/m/Y H:i
  • por 127.0.0.1