Manual de Basic Spectrum 48k.

Capítulo 14

El juego de caracteres

Resumen

  • CODE, CHR$
  • POKE, PEEK
  • USR
  • BIN

Las letras, dígitos, signos de puntuación, etc., que pueden aparecer en cadenas se denominan caracteres y constituyen el alfabeto, o juego de caracteres, que emplea el ZX Spectrum. La mayoría de estos caracteres son símbolos simples, pero hay algunos más, denominados tokens (términos simbólicos) que representan a palabras completas, tales como PRINT, STOP, <>, etc.

Hay 256 caracteres y cada uno tiene un código entre 0 y 255. Hay una lista completa de ellos en el Apéndice A. Para la conversión entre códigos y caracteres, hay dos funciones CODE y CHR$.

CODE se aplica a una cadena y proporciona el código del primer carácter en la cadena (o 0 si la cadena está vacía).

CHR$ se aplica a un número y proporciona la cadena de caracteres única cuyo código es ese número.

Este programa proporciona la impresión del juego completo de caracteres:

10 FOR a = 32 TO 255: PRINT CHR$ A;: NEXT a

En la parte superior puede ver un espacio, 15 símbolos y signos de puntuación, los diez dígitos, siete símbolos más, las mayúsculas, seis símbolos más, las minúsculas y cinco símbolos adicionales. Estos son todos (salvo £ y ©) tomados de un juego de caracteres, de gran uso, conocido como ASCII (que es la abreviatura de American Standard Codes for Information Interchange - Códigos normalizados americanos para intercambio de información); ASCII asigna también códigos numéricos a estos caracteres y estos son los códigos que utiliza el ZX Spectrum.

El resto de los caracteres no forman parte del ASCII y son peculiares para el ZX Spectrum. Los primeros entre ellos son un espacio y 15 configuraciones de manchas negras y blancas. Se denominan los símbolos gráficos y pueden utilizarse para el dibujo de imágenes. Puede introducirlos a partir del teclado, con el empleo de lo que se llama modo de gráficos. Si pulsa GRAPHICS (CAPS SHIFT con 9), entonces, el cursor cambiará a  G . Ahora, las teclas para los dígitos 1 a 8 darán los símbolos de gráficos; por sí mismas, proporcionan los símbolos dibujados en las teclas y con una tecla de cambio pulsada, dan el mismo símbolo pero invertido, esto es, el negro se hace blanco y viceversa.

Prescindiendo de las teclas de cambio, el dígito 9 le lleva de nuevo al modo normal (L) y el dígito 0 es DELETE.

Los dieciséis símbolos gráficos son los siguientes:

Símbolo Código Cómo se obtiene Símbolo Código Cómo se obtiene
128  G 
8
143  G 
cambiada 8
129  G 
1
142  G 
cambiada 1
130  G 
2
141  G 
cambiada 2
131  G 
3
140  G 
cambiada 3
132  G 
4
139  G 
cambiada 4
133  G 
5
138  G 
cambiada 5
134  G 
6
137  G 
cambiada 6
135  G 
7
136  G 
cambiada 7

Después de los símbolos de gráficos, observará lo que parece ser otra copia del alfabeto de la A a la U. Son caracteres que puede redefinir usted mismo, aunque cuando la máquina se enciende por primera vez constituyen un conjunto de letras. Se denominan gráficos definidos por el usuario. Puede introducirlos desde el teclado pasando al modo de gráficos y utilizando luego las teclas de letras de A a U.

Para definir un carácter nuevo, siga esta recomendación: defina un carácter para indicar PI.

  1. Decida cuál quiere que sea el aspecto del carácter. Cada carácter tiene un cuadrado de puntos de 8 x 8, cada uno de los cuales puede mostrar el color del papel o el color de la tinta (ver el fascículo de introducción). Debe dibujar un diagrama similar al adjunto, con cuadros negros para el color de tinta.

    Hemos dejado un margen de un cuadro alrededor de todo el perímetro, porque todas las demás letras tienen dicho margen (salvo las letras minúsculas con rabos, en las que dicho rabo va a la derecha hasta la parte inferior).

  2. Decida qué gráfico definido por el usuario ha de indicar PI. Por ejemplo, la correspondiente a P, de modo que si pulsa P en el modo de gráficos obtendrá PI.

  3. Almacene la nueva configuración. Cada gráfico definido por el usuario tiene su configuración almacenada como ocho números, uno por cada fila. Puede escribir cada uno de estos números como BIN seguida por ocho "0" o "1" (0 para papel, 1 para tinta) de modo que los ocho números para nuestro carácter PI son:

    BIN 00000000
    BIN 00000000
    BIN 00000010
    BIN 00111100
    BIN 01010100
    BIN 00010100
    BIN 00010100
    BIN 00000000

    (si tiene conocimientos sobre números binarios, entonces, se dará cuenta de que BIN se utiliza para escribir un número en el sistema binario en lugar de hacerlo en el sistema decimal habitual).

Estos ocho números se almacenan en memoria, en ocho lugares, cada uno de los cuales tiene una dirección. La dirección del primer byte, o grupo de ocho dígitos, es USR "P" (P porque es lo que elegimos en (ii)), la del segundo es USR "P" + 1 y así sucesivamente, hasta el octavo, que tiene la dirección USR "P" + 7.

USR es, en este caso, una función para convertir un argumento de cadena en la dirección del primer byte en memoria para el correspondiente gráfico definido por el usuario. El argumento de cadena debe ser un carácter único que puede ser el gráfico definido por el usuario, o la correspondiente letra (en mayúsculas o en minúsculas). Hay otro uso para USR, cuando su argumento es un número, que se tratará más adelante.

Aun cuando no lo comprenda, el siguiente programa lo hará por usted:

10 FOR n = 0 TO 7
20 INPUT fila: POKE USR "P" + n, fila
30 NEXT n

Interrumpirá la introducción de datos (INPUT) ocho veces para permitirle teclear los ocho números BIN anteriores. Ha de teclearlos en el orden correcto, comenzando por la fila superior.

La sentencia POKE almacena un número directamente en la posición de memoria, eludiendo los mecanismos normalmente utilizados por el BASIC. La opuesta de POKE es PEEK y nos permite examinar el contenido de una posición de memoria, aunque no altere realmente el contenido de esa posición. Se tratarán adecuadamente en el capitulo 28.

Después de los gráficos definidos por el usuario vienen los 'tokens' (términos simbólicos).

Habrá observado que no hemos impreso los primeros 32 caracteres con códigos 0 a 31. Estos son caracteres de control. No producen nada que pueda imprimirse y ya que no tienen efecto sobre la pantalla, o se emplean para controlar algo distinto de ésta se imprime ? para indicar que no los entiende. Se describen con más detalle en el Apéndice A.

Tres que utiliza la televisión son los correspondientes a los códigos 6, 8 y 13; después de todo CHR$ 8 es el único que probablemente encuentre de utilidad.

CHR$ 6 imprime espacios en exactamente la misma forma que una coma en una sentencia PRINT, por ejemplo:

PRINT 1; CHR$ 6;2

hace lo mismo que

PRINT 1,2

Evidentemente, esta no es una forma muy clara de utilizarlo. Una forma más sutil es:

LET a$="1" + CHR$ 6 + "2"
PRINT a$

CHR$ 8 es "retroceso": desplaza la posición de la impresión un espacio hacia atrás. Pruebe:

PRINT "1234"; CHR$ 8; "5"

que imprime 1235.

CHR$ 13 es "nueva línea": desplaza la posición de impresión al principio de la línea siguiente.

En la televisión se utilizan también los correspondientes a los códigos 16 a 23; estos se explican en los capítulos 15 y 16. Todos los caracteres de control se indican en el Apéndice A.

Con el empleo de códigos para los caracteres podemos ampliar el concepto de "ordenación alfabética" para cubrir las cadenas que contengan cualquier tipo de carácter no sólo letras. Si en lugar de pensar sobre la base del alfabeto habitual de 26 letras, utilizamos el alfabeto ampliado de 256 caracteres, en el mismo orden que sus códigos, el principio es exactamente el mismo. Por ejemplo, estas cadenas están en el orden alfabético del ZX Spectrum. (Observe la característica bastante singular de que las letras minúsculas van después de todas las mayúsculas; así, "a" va después de "Z"; también cuentan los espacios)

CHR$ 3 + "JARDINES ZOOLOGICOS"
CHR$ 8 + "CAZA DE ARMADILLOS"
" AAAARGH!"
"(Observación entre paréntesis)"
"100"
"129.95 inc. IVA"
"AASVOGEL" (BUITRE SUDAFRICANO)
"Aardvark" (armadillo)
"PRINT"
"Zoo'
"[interpolación]"
"aasvogel"
"zoo'
"zoología

He aquí la regla para determinar en qué orden aparecen dos cadenas. Primero, comparar los primeros caracteres. Si son diferentes, entonces, uno de ellos tendrá su código inferior al del otro y la cadena a la cual pertenecen será la anterior (inferior) de las dos cadenas. Si son iguales, entonces, hay que pasar a la comparación de los caracteres siguientes. Si, en este proceso, una de las cadenas se acaba antes que la otra, entonces, esa cadena es la anterior; de cualquier otro modo, deben ser iguales.

Las relaciones =, < , > , <= , >= y <> se utilizan tanto para cadenas como para números: < significa "va antes" y > significa "va después", por lo que

"AA man" < "AARDVARK"
"AARDVARK" > "AA man"

son ambas verdaderas.

<= y >= actúan de la misma forma que lo hacen para números, de modo que:

"La misma cadena" <= "La misma cadena"

es verdadera, pero

"La misma cadena" < "La misma cadena"

Es falsa.

Experimente lo anterior con el empleo del programa siguiente, que introduce dos cadenas y las pone en orden.

10 INPUT "Teclee dos cadenas:" ,a$,b$
20 IF a$ > b$ THEN LET c$=a$: LET a$=b$: LET b$=c$
30 PRINT a$;" ";
40 IF a$ < b$ THEN PRINT "<"; GO TO 60
50 PRINT " = "
60 PRINT " "; b$
70 GO TO 10

Observe cómo hemos de introducir c$ en la línea 20 cuando permutamos a$ y b$.

LET a$ = b$: LET b$ = a$

no tendría el efecto deseado.

El programa siguiente introduce los gráficos definidos por el usuario para mostrar las piezas de ajedrez:

P para peón
R para torre
N para caballo
B para alfil
K para rey
Q para reina

Piezas de ajedrez.

  5 LET b = BIN 01111100: LET c = BIN 00111000: LET d = BIN 00010000
10 FOR n = 1 TO 6: READ p$: REM 6 piezas
20 FOR f = 0 TO 7: REM lectura de pieza en 8 bytes
30 READ a: POKE USR p$ + F, a
40 NEXT f
50 NEXT n
100 REM alfil
110 DATA "b", 0, d, BIN 00101000, BIN 01000100
120 DATA BIN 01101100, c, b, 0
130 REM rey
140 DATA "k", 0, d, c, d
150 DATA c, BIN 01000100, c, 0
160 REM torre
170 DATA "r", 0, BIN 01010100, b, c
180 DATA c, b, b, 0
190 REM reina
200 DATA "q", 0, BIN 01010100, BIN 00101000, d
210 DATA BIN 01101100, b, b, 0
220 REM peón
230 DATA "p", 0, 0, d, c
240 DATA c, d, b, 0 250 REM caballo
260 DATA "n", 0, d, c, BIN 01111000
270 DATA BIN 00011000, c, b, 0

Observe que 0 puede utilizarse en lugar de BIN 00000000.

Cuando haya ejecutado el programa, examine las piezas pasando al modo de gráficos.

Ejercicios

  1. Imagine el espacio para un símbolo dividido en cuatro partes como un pastel. Entonces, si cada cuarta parte puede ser negra o blanca, hay 2 x 2 x 2 x 2 = 16 posibilidades. Encontrarlas todas en el juego de caracteres.

  2. Ejecute este programa:

    10 INPUT a
    20 PRINT CHR$ a;
    30 GO TO 10

    Si experimenta con este programa, encontrará que CHR$ a está redondeado al número entero más próximo y si a no está en el intervalo de 0 a 255, entonces, el programa se interrumpe con informe de error B Integer out of range (B entero fuera de margen).

  3. ¿Cuál de los dos es el inferior?

    "EVIL"
    "evil"
  4. Indique cómo modificar el programa para establecer los gráficos definidos por el usuario de modo que utilice las sentencias READ y DATA en lugar de la sentencia INPUT.


Manual de Basic Spectrum 48k.