Programación ZX Spectrum
Programación ZX Spectrum
Indice
CAPITULO 9
CAPITULO 1 Funciones Pág. 55
Introducción Pág. 5 Funciones definibles por el usuario y
Una guía para el teclado del ZX otras fácilmente disponibles en el ZX
Spectrum y una descripción de la Spectrum con el empleo de DEF,
presentación visual LEN, STR$ , VAL, SGN, ABS, INT,
SQR, FN
CAPITULO 2
Conceptos de la programación en CAPITULO 10
Basic Pág. 11 Funciones matemáticas Pág. 63
Programas, números de línea, edición incluyendo la trigonometría sencilla ,
de programas con el empleo de , y PI, EXP, LN, SIN, COS, TAN, ASN,
EDIT, RUN, LIST, GO TO, CONTINUE, ACS, ATN
INPUT, NEW, REM, PRINT, STOP en
INPUT datos, BREAK
CAPITULO 11
Números aleatorios Pág. 71
CAPITULO 3 con el empleo de RANDOMIZE y RND
Decisiones Pág. 23
IF, STOP,
= , < , > , <= , >= , <> CAPITULO 12
Matrices Pág. 77
Matrices numéricas y cadenas
CAPITULO 4 DIM
Iteración con bucles Pág. 29
FOR, NEXT, TO, STEP
Introducción de bucles FOR-NEXT CAPITULO 13
Condiciones Pag .83
y expresiones lógicas AND, OR, NOT
CAPITULO 5
Subrutinas Pág. 35
GO SUB, RETURN CAPITULO 14
El juego de caracteres Pág. 89
Una descripción del juego de
CAPITULO 6 caracteres del ZX Spectrum
READ, DATA, RESTORE Pág. 39 incluyendo gráficos y formas de
elaborar sus propios caracteres
CAPITULO 7 gráficos
Expresiones Pág. 43 CODE, CHR$, POKE, PEEK, USR,
Expresiones matemáticas con el empleo BIN
de +, - , * , /
notación científica y nombres de CAPITULO 15
variables Más sobre PRINT e INPUT Pág. 99
Algunos usos más complicados de
CAPITULO 8 estos comandos con el empleo de
Cadenas Pág. 49 separadores: , ; ' , TAB, AT, LINE y
Manipulación de cadenas y CLS
fragmentación
CAPITULO 16 CAPITULO 24
Colores Pág. 107 La memoria Pág. 161
INK, PAPER, FLASH, BRIGHT, Un vistazo a los elementos funcionales
INVERSE, OVER, BORDER internos del ZX Spectrum CLEAR
CAPITULO 25
CAPITULO 17 Las variables del sistema Pág. 171
Gráficos Pág. 119
PLOT, DRAW, CIRCLE, POINT
CAPITULO 26
Empleo del código máquina Pág. 177
CAPITULO 18 Introducción de USR con un argumento
Movimiento Pág. 127 numérico
Gráficos animados con el empleo de
PAUSE, INKEY$ y PEEK
APENDICES
A El juego de caracteres Pág. 183
CAPITULO 19 B Informes Pág. 189
BEEP, Pág. 133 C (parte 1) Una descripción del ZX
Las capacidades sonoras del ZX Spectrum para referencia Pág. 193
Spectrum con el empleo de BEEP C (parte 2) El BASIC Pág. 197
D Programas ejemplo Pág. 209
E Binario y hexadecimal Pág. 217
Indice Pág. 221
CAPITULO 20
Almacenamiento en cinta Pág. 139
Cómo almacenar sus programas en
cinta de cassette
SAVE, LOAD, VERIFY, MERGE
CAPITULO 21
LA Impresora ZX Pág. 149 LLIST,
LPRINT, COPY
CAPITULO 22
Otros equipos Pág. 153
Forma de conectar el ZX Spectrum a
otras máquinas y dispositivos
CAPITULO 23
IN y OUT Pág. 157
Conectores de entrada/salida y sus
usos IN, OUT
Capítulo 1
Introducción
Tanto si leyó primero el fascículo de introducción como si pasó directamente a este
manual, debe tener conocimiento de que los comandos se obedecen inmediatamente y
que las instrucciones comienzan con un número de línea y se almacenan para su
posterior ejecución. Asimismo, debe conocer los comandos PRINT, LET e INPUT que
pueden utilizarse en todas las máquinas que usan BASIC) y BORDER, PAPER y BEEP
(que se utilizan en el Spectrum).
Este manual de BASIC comienza repitiendo algunas cosas dadas en el fascículo
de introducción, pero con mucho más detalle, indicándole con exactitud lo que usted
puede hacer y lo que no puede. También encontrará algunos ejercicios al final de cada
capítulo. No haga caso omiso de ellos, pues muchos de ellos ilustran puntos que están
solamente insinuados en el texto. Écheles una ojeada y haga alguno que le interese o
que le parezca referirse a un tema que no entiende adecuadamente.
Siempre que pueda hacerlo y, en cualquier caso, tenga encendido el ordenador.
Si se pregunta: ¿Qué hará el ordenador si le digo esto o lo otro?, no vacile en intro-
ducirlo por el teclado y ver lo que ocurre. Siempre que el manual le diga que teclee
algo, pregúntese a sí mismo: ¿Qué podría teclear en su lugar? y pruebe sus respues-
tas. Cuantos más programas propios escriba, tanto mejor comprenderá el funciona-
miento del ordenador.
Al final de este manual de programación hay algunos apéndices. En ellos se
incluyen secciones sobre la forma en que está organizada la memoria, sobre cómo el
ordenador manipula los números y una serie de programas ejemplo que ilustran la
potencia del ZX Spectrum.
El teclado
Los caracteres del ZX Spectrum no solamente comprenden los símbolos
simples (letras, dígitos, etc.), sino también los comandos (palabras clave, nombres de
funciones, etc.), estos últimos accesibles con una sola pulsación de la tecla en lugar de
deletrearse. Para obtener todas estas funciones o los comandos, algunas teclas tienen
cinco o más significados distintos, dados en parte por el cambio de las teclas (esto es,
pulsando la tecla CAPS SHIFT o la tecla SYMBOL SHIFT al mismo tiempo que la
requerida) y en parte, al tener la máquina en modos operativos diferentes.
El modo viene indicado por el cursor, que es una letra parpadeante que indica
en dónde se insertará el siguiente carácter introducido por el teclado.
El modo K (por «Keywords» - Palabras clave) sustituye automáticamente al
modo L cuando la máquina está esperando un comando o una línea de programa (en
vez de entrada de datos), y por su posición en la línea sabe que debe esperar un
número de línea o una palabra clave. Esta posición es al principio de la línea o
inmediatamente después de THEN o de : (salvo en una cadena). Si no está cambiada
la siguiente tecla se interpretará como una palabra clave (escrita en las teclas) o bien
como un dígito.
El modo L (por letras) suele presentarse en todas las demás circunstancias. Si
no está cambiada la siguiente tecla se interpretará como el símbolo principal en esa
tecla, en minúsculas para las letras.
En los modos K y L, SYMBOL SHIFT y una tecla serán interpretados como el
carácter rojo subsidiario en la tecla y CAPS SHIFT con una tecla de dígito se inter-
pretará como la función de control escrita en blanco en la tecla. CAPS SHIFT con las
demás teclas no afecta a las palabras clave en el modo K y, en el modo L, convierte las
minúsculas en mayúsculas.
7
Capítulo 1
La pantalla de televisión
Tiene 24 líneas, con 32 caracteres cada una de longitud, y está dividida en dos partes.
La parte superior comprende, como máximo, 22 líneas y visualiza un listado o salida de
programa. Cuando la impresión en la parte superior ha llegado a la parte inferior, todo
se desplaza hacia arriba en una línea; si ello trajera consigo la pérdida de una línea que
no hubiera tenido todavía oportunidad de ver, entonces el ordenador se detiene con el
mensaje scroll?. Al pulsar las teclas N, SPACE o STOP se hará que se pare el
8
Capítulo 1
programa con el informe D BREAK - CONT repeats; cualquier otra tecla permitirá que
continúe el desplazamiento hacia arriba («scrolling»). La parte inferior se emplea para la
introducción de comandos, lineas de programa o entrada de datos y también para
visualizar informes: La parte inferior se inicia a partir de dos líneas (la superior es una
línea en blanco), pero se amplía para admitir lo que pueda introducirse por el teclado.
Cuando llegue a la posición de la impresión en curso en la mitad superior, ulteriores
ampliaciones harán que se desplace hacia arriba la mitad superior.
9
Capítulo 2
Resumen
Programas
Números de línea
Edición correctora de programas con el
empleo de , y EDIT, RUN, LIST
GO TO, CONTINUE, INPUT, NEW, REM, PRINT
STOP en entrada de datos
BREAK
20 PRINT a
10 LET a = 10
15 LET b = 15
13
Capítulo 2
y veamos lo que ocurre. Hubiera sido imposible insertar esta línea entre las dos antes
indicadas si estas se hubieran numerado 1 y 2, en lugar de 10 y de 20 (los números de
línea deben ser números enteros entre 1 y 9999), por ello es por lo que, cuando se
introduce por el teclado un programa, es muy conveniente dejar espacios entre los
números de línea.
Ahora necesita cambiar la línea 20 a:
20 PRINT a + b
Podría introducir la nueva instrucción por completo, pero resulta más fácil emplear
el modo EDIT descrito en el fascículo de introducción. El >. en la línea 15 se denomina
el cursor del programa y la línea a la que apunta es la línea en curso. Esta suele ser la
última línea que introdujo, pero puede utilizar las teclas o para desplazar el
cursor del programa hacia abajo o hacia arriba (inténtelo, dejando el cursor del
programa eventualmente en la línea 20).
Cuando pulse la tecla EDIT, una copia de la línea en curso se visualizará en la parte
inferior de la pantalla (en su caso, una copia de la línea 20). Mantenga oprimida la tecla
hasta que el cursor L. se desplace al final de la línea y entonces, teclee
+b (sin ENTER)
20 PRINT a + b
Pulse ENTER y sustituirá la anterior línea 20, de modo que en la pantalla aparecerá:
PRINT a,b
14
Capítulo 2
Las variables siguen estando allí, aun cuando el programa haya acabado.
Hay un método útil empleando EDIT para prescindir de la parte inferior de la
pantalla. Teclee cualquier cosa que carezca de significado (sin ENTER), e imagínese
que después desea hacerlo desaparecer por carecer de valor. Una forma de borrarlo es
pulsar la tecla DELETE, pero de otro modo de hacerlo es como sigue. Si pulsa EDIT, lo
que se quiere borrar en la parte inferior de la pantalla se sustituirá por una copia de la
línea en curso. Si pulsa ahora ENTER, dicha línea en curso volverá intacta al programa,
dejando limpia la parte inferior de la pantalla.
Si introduce una línea por error, por ejemplo:
12 LET b=8
Observará con sorpresa que ha desaparecido el cursor del programa. Debe ima-
ginar que está oculto entre las líneas 10 y 15, por lo que si pulsa se desplazará hasta
la línea 10, mientras que si pulsa se desplazará hasta la línea 15.
Teclee:
12 (y ENTER)
De nuevo, el cursor del programa se ocultará entre las líneas 10 y 15. Ahora pulse
EDIT y descenderá la línea 15; cuando el cursos del programa esté oculto entre dos
líneas, EDIT bajará la siguiente línea después del nuevo número de línea. Teclee
ENTER para borrar la parte inferior de la pantalla.
Ahora, teclee:
30 (y ENTER)
Esta vez, el cursor del programa está oculto tras el final del programa y si pulsa
EDIT, la línea 20 bajará.
Finalmente, teclee:
LIST 15
15 LET b=15
20 PRINT a+b
15
Capítulo 2
línea 15. Si tiene un programa muy largo, entonces, LIST será probablemente una
forma más útil de desplazar el cursor del programa que con las teclas y .
Esto ilustra otro uso de números de línea y es que actúan como nombres para las
líneas del programa de modo que pueda hacer referencia a los mismos, de forma
bastante parecida a cuando las variables tienen nombres.
LIST, sin ningún número, lista el programa a partir de la primera línea.
Otro comando visto en el fascículo de introducción es:
NEW
Su efecto es borrar tanto los programas como las variables que hubiese almace-
nados en el ordenador. Ahora, introduzca cuidadosamente este programa que cambia
las temperaturas en grados Fahrenheit a grados Centígrados.
CONTINUE
16
Capítulo 2
Ahora introduzca por teclado números hasta que la pantalla comience a llenarse.
Cuando esté llena, el ordenador desplazará el conjunto de la mitad superior de la
pantalla hacia arriba una línea para hacer espacio, perdiendo el encabezamiento al
salir por la parte superior. Este desplazamiento se denomina «scrolling».
Las comas se utilizan para hacer que la impresión comience en el margen iz-
quierdo, o en la parte central de la pantalla, dependiendo de lo que venga a conti-
nuación. Así, en la línea 50, la coma hace que la temperatura centígrada se impri-
ma en medio de la línea.- Por el contrario, con punto y coma, el siguiente número o
cadena se imprime inmediatamente después de lo que le precede. Puede
constatarlo en la línea 50, si sustituye la coma por punto y coma.
Otro signo de puntuación que puede utilizar como tal en los comandos PRINT es
el apóstrofe ('). Este signo hace que lo que se imprima a continuación aparezca al
principio de la siguiente línea en la pantalla, pero ello sucede, de todos modos, al
final de cada comando PRINT, por lo que no tendrá mucha necesidad del apóstrofe.
Esta es la razón por lo que el comando PRINT en la línea 50 comienza siempre su
impresión en una línea nueva y también por qué el comando PRINT en la línea 30
produce una línea en blanco.
Si quiere inhibir lo anterior, de modo que después de un comando PRINT el
siguiente quede en la misma línea, puede poner una coma, o un punto y coma, al fi-
nal del primer comando. Para constatarlo, sustituya la línea 50 sucesivamente por
cada una de las sentencias.
50 PRINT F,
50 PRINT F;
y
50 PRINT F
0 PRINT F
50
El comando con la coma extiende todo en dos columnas, con el punto y coma
presenta todo junto, sin ninguno de los dos signos anteriores asigna una línea para
17
Capítulo 2
cada número y lo mismo sucede con el apóstrofe (el apóstrofe da una nueva línea
por sí mismo, pero inhibe la automática).
Tenga presente la diferencia entre las comas y el punto y coma en los comando
PRINT; además, no debe confundirlos con los dos puntos (:) que se utilizan para se-
parar comandos en una sola línea.
Ahora, teclee estas líneas suplementarias:
RUN 100
Puesto que este programa espera que se introduzca una cadena en lugar de un
número, imprime dos comillas. Esto le ayuda a saber que debe introducir. Pruébelo
escribiendo cualquier cosa.
Otra vez volverá a encontrarse con dos comillas, pero no tiene que utilizarlas si no
lo necesita. Pruebe esto, por ejemplo: suprima las comillas (con y DELETE) y
teclee:
n$
n$
de nuevo, pero esta vez sin suprimir las comillas de cadena. Ahora, precisamente
para confundirle, la variable n$ tiene el valor «n$».
Si desea utilizar STOP para la introducción de datos, debe desplazar primero el
cursor haciéndolo retroceder al principio de la línea, con el empleo de la tecla .
Volvamos, ahora, a ese RUN 100 que teníamos anteriormente y que saltaba a la
línea 100. ¿Podríamos haber puesto GO TO 100 en su lugar? En este caso, hemos
de dar una respuesta afirmativa en primera instancia, pero hay una diferencia.
RUN 100, ante todo, suprime todas las variables y borra la pantalla y después de
ello opera lo mismo que GO TO 100. Esta última no borra nada. Pueden darse
casos en los que quiera ejecutar un programa sin borrar ninguna variable; entonces,
sería necesaria GO TO y sin embargo, RUN podría tener efectos desastrosos. Por
ello es preferible dejar la costumbre de teclear automáticamente RUN para ejecutar
un programa.
Otra diferencia es que puede teclear RUN sin un número de línea y el ordenador
18
Capítulo 2
200 GO TO 200
RUN 200
encontrará que puede utilizar n$ como introducción de datos sin ninguna dificultad.
En este caso, CONTINUE realiza un salto al comando INPUT en la línea 110. No
hace caso del informe de la sentencia LET, porque dijo «OK», y salta al comando al
que se hizo referencia en el anterior informe, el primero en la línea 110. Se pretende
que esto sea de utilidad. Si un programa se interrumpe por algún error, entonces
puede hacer todo lo preciso para subsanar la anomalía y CONTINUE podrá operar
todavía en lo sucesivo.
Como dijimos anteriormente, el informe L BREAK into program es especial,
porque después del mismo CONTINUE no repite el comando en donde se detuvo el
programa.
Los listados automáticos (los que no son el resultado de un comando LIST, sino
que se producen después de introducir una nueva línea) quizás le hayan desconcer-
19
Capítulo 2
tado. Si introduce por el teclado en un programa con 50 líneas todas las sentencias
REM
1 REM
2 REM
3 REM
: :
: :
49 REM
50 REM
23 REM
28 REM
y obtendrá las líneas 7 a 28. (En ambos casos, al teclear una nueva línea, ha des-
plazado el cursor del programa y por ello se ha realizado un nuevo listado).
Quizás esto le parezca algo arbitrario. Realmente, trata de proporcionarle exac-
tamente lo que necesita, aunque al ser los «humanos criaturas imprevisibles, no
siempre el ordenador adivina correctamente.
El ordenador mantiene un registro no solamente de la línea en curso (la que ha
de aparecer en la pantalla), sino también de la línea superior en la pantalla. Cuando
intenta hacer un listado, lo primero que hace es comparar la línea superior con la
línea en curso.
Si la línea superior viene detrás, entonces no resulta oportuno comenzar en este
punto y por ello el ordenador utiliza la línea en curso para una nueva línea superior y
realiza su listado.
De cualquier otro modo, su método es comenzar la ejecución del listado a partir
de la línea superior y proseguir hasta que la línea en curso sea objeto de listado, con
un desplazamiento hacia arriba («scrolling»-arrollamiento) en caso de necesidad. Sin
embargo, primero efectúa un calculo aproximado para ver cuánto ocupa y si la
respuesta es que tiene una magnitud excesiva, entonces el ordenador desplaza la
línea superior hacia abajo para estar mucho más próxima a la línea en curso. Ahora,
al haber determinado su línea superior, el ordenador comienza el listado a partir
de la misma. Si, cuando llega al final del programa o al fondo de la pantalla, se ha
20
Capítulo 2
listado la línea en curso, entonces, se detiene el ordenador. De no ser así, se
produce un desplazamiento hacia arriba hasta que la línea en curso esté en la
pantalla y por cada línea adicional que sea objeto de listado, el ordenador desplaza
la línea superior hacia abajo en una línea, de modo que la línea superior se
desplace a las proximidades de la línea en curso.
Experimente con el desplazamiento de la línea en curso, tecleando
LIST desplaza la línea en curso pero no la línea superior, por lo que los subsiguien-
tes listados podrían ser distintos. Por ejemplo, teclee
LIST
para conseguir el listado y luego pulse, de nuevo, ENTER para hacer que la línea 0
sea la línea superior. Debe tener las líneas 1 a 22 en la pantalla. Teclee:
LIST 22
que le proporciona las líneas 22 a 43; cuando pulse ENTER de nuevo, vuelva a las
líneas 1 a 22. Ello tiende a ser más útil para programas cortos que para largos.
Utilizando el programa lleno de sentencias REM anterior, teclee:
LIST
CONTINUE
: LIST
:: LIST
21
Capítulo 2
Ejercicios
1. Ponga una sentencia LIST en un programa de modo que cuando lo ejecute haga
automáticamente un listado.
22
Capitulo 3
Decisiones
Resumen
IF, STOP
= , < , > , <= , >= , <>
Todos los programas que hemos visto hasta ahora han sido bastante prede-
cibles (han pasado a través de las instrucciones y han vuelto al principio de nuevo).
Ello no es de mucha utilidad. En la práctica, el ordenador habría de tomar
decisiones y actuar en consecuencia. La Instrucción utilizada tiene la forma ... IF (si)
algo es verdadero, o no verdadero, THEN (entonces) hacer algo más.
Por ejemplo, utilice NEW para borrar el anterior programa del ordenador e
introduzca por el teclado y ejecute el siguiente programa (que evidentemente admite
que jueguen dos personas).
en donde «...» significa una secuencia de comandos, separados por dos puntos, en
la forma habitual. La condición es algo que ha de determinarse como verdadero o
falso; si es verdadero, se ejecutan las sentencias en el resto de la línea después de
THEN, en caso contrario, se saltan y el programa ejecuta la siguiente instrucción.
Las condiciones más sencillas comparan dos números o dos cadenas. Pueden
probar si dos números son iguales o si uno es mayor que el otro y pueden probar si
dos cadenas son iguales o (aproximadamente) si una está antes que la otra en el
orden alfabético. Utilizan las relaciones = , < , > , <= , >= , y <> .
= significa «igual a». Aunque es el mismo símbolo que el = en un comando
LET, se utiliza en un sentido bastante diferente.
< (SYMBOL SHIFT con R) significa «es menos que», por lo que:
1< 2
-2 < -1
-3 < 1
1< 0
0 < -2
son falsas.
25
Capitulo 3
El comando CLS, borrar pantalla, en la línea 20 era para impedir que la otra
persona vea lo que está introduciendo.
El símbolo > (SYMBOL SHIFT con T) significa «es mayor que» y es lo mismo
que < pero en sentido contrario. Puede recordar cuál es cuál porque el extremo agu-
zado apunta siempre al número que se supone que es más pequeño.
<= (SYMBOL SHIFT con O), que no ha de teclearse < seguido por = , significa
«es menor que o igual a», por lo que es como < con la salvedad de que es ver-
dadero incluso si los dos números son iguales; por consiguiente 2<=2 es verdadero,
pero 2 < 2 es falso.
>= (SYMBOL SHIFT con E) significa que «es mayor que o igual a» y es análogo
a > , con las salvedades antes indicadas.
Los matemáticos suelen escribir <= , >= y < > en la forma , y . Escriben
también cosas como '2 <3 <4' para significar '2<3' y '3 <4', pero ello no es posible en
BASIC.
Observación: En algunas versiones de BASIC, pero no en la del ZX Spectrum, la
sentencia IF puede tener la forma
Ejercicios
CONTINUE
26
Capitulo 3
27
Capítulo 4
Suponga que desea introducir cinco números y sumarlos juntos. Una forma (que
no le recomendamos que haga la introducción por el teclado a no ser que sea
«masoquista») es escribir:
10 LET total =0
20 INPUT a
30 LET total = total + a
40 INPUT a
50 LET total = total + a
60 INPUT a
70 LET total = total + a
80 INPUT a
90 LET total = total + a
100 INPUT a
110 LET total = total + a
120 PRINT total
10 LET total =0
20 LET cuenta = 1
30 INPUT a
40 REM cuenta = número de veces que a se ha introducido hasta ahora
50 LET total = total + a
60 LET cuenta = cuenta + 1
70 IF cuenta <= 5 THEN GO TO 30
80 PRINT total
Observe cuán fácil sería cambiar la línea 70 de modo que este programa sume
diez números o incluso un centenar.
Esta clase de contaje es tan útil que hay dos comandos especiales para hacerlo
más fácil: los comandos u órdenes FOR y NEXT. Siempre se utilizan conjuntamente.
31
Capítulo 4
Con el empleo de estos nuevos medios, el programa que acaba de introducir por
el teclado realiza exactamente lo mismo que:
10 LET total = 0
20 FOR c=1 TO 5
30 INPUT a
40 REM c=número de veces que a se ha introducido hasta ahora
50 LET total = total + a
60 NEXT c
80 PRINT total
(Para conseguir este programa a partir del anterior, ha de corregir las líneas 20,
40, 60 y 70, TO es SYMBOL SHIFT con F).
Observe que hemos cambiando cuenta por c. La variable de contaje (o variable
de control) de un bucle FOR-NEXT debe tener una sola letra para su nombre.
El efecto de este programa es que e opera a través de los valores 1 (el valor
inicial), 2, 3, 4 y 5 (el limite) y para cada uno, se ejecutan las líneas 30, 40 y 50. A
continuación, cuando c ha terminado con sus cinco valores, se ejecuta la línea 80.
Una sutileza adicional es que la variable de control no tiene que Incrementarse
en 1 en cada ocasión, sino, que puede cambiar este 1 a cualquier otro valor que
desee mediante el empleo de una parte STEP en el comando FOR. La forma más
general para un comando FOR es:
en donde la variable de control es una sola letra y el valor inicial, limite y paso son,
en su totalidad, elementos que puede calcular el ordenador como números (como
los números reales, o sumas o los nombres de variables numéricas. Por
consiguiente, si sustituye la línea 20 en el programa por:
entonces c operará con los valores 1, 2’5 y 4. Observe que no tiene que limitarse a
números enteros y también, que la variable de control no tiene que alcanzar el límite
exactamente (mantiene la iteración por bucle en tanto que sea inferior o igual al
límite).
Pruebe el siguiente programa para imprimir los números desde 1 a 10 en orden
inverso.
32
Capítulo 4
10 FOR m=0 TO 6
20 FOR n=0 TO m
30 PRINT m;":";n;””; bucle n bucle m
40 NEXT n
50 PRINT
60 NEXT m
Puede observar que el bucle n está completamente en el interior del bucle m (se
dice que están adecuadamente «anidados» o encajados). Lo que debe evitarse es
tener dos bucles FOR-NEXT que se solapen sin estar completamente uno en el
interior del otro, como es el caso que se indica a continuación:
Dos bucles FOR-NEXT deben estar uno en el interior del otro o completamente
separados.
Otra cosa a evitar es saltar a la parte media de un bucle FOR-NEXT desde el
exterior. La variable de control sólo está adecuadamente establecida cuando ejecuta
su sentencia FOR y si la omitiera, la sentencia NEXT produciría confusión en el or-
denador. Probablemente obtendrá un informe de error con el mensaje NEXT
without FOR (NEXT sin FOR) o variable not found (variable no encontrada).
No hay nada que le detenga con el empleo de FOR y de NEXT en un comando di-
recto. Por ejemplo, pruebe:
A veces, puede utilizarle como una forma (algo artificial) de eludir la restricción
de que no puede realizar la función GO TO en cualquier lugar en el interior de un
comando (porque un comando no tiene ningún número de línea). Por ejemplo:
El paso (STEP) de cero, en este caso, hace que el comando (u orden) se repita
a sí mismo «eternamente».
Este procedimiento no es recomendable, porque si se produce un error, enton-
ces habrá perdido el comando y tendrá que volverle a introducir por el teclado (y
CONTINUE ya no actuará).
33
Capítulo 4
Ejercicios
1. Una variable de control no sólo tiene un nombre y un valor, como una variable
ordinaria, sino también un limite, un paso y una referencia a la sentencia des-
pués de la sentencia FOR correspondiente. Persuádase a sí mismo de que
cuando se ejecuta la sentencia FOR toda esta información esté disponible (utili-
zando el valor inicial como el primer valor que toma la variable) y también de que
esta información es suficiente para que la sentencia NEXT conozca en cuanto
incrementar el valor, si ha de saltar hacia atrás y, de ser así, a dónde debe efec-
tuarse el salto.
PRINT c
4. En la línea 10 del cuarto programa anterior, cambie 10 por 100 y ejecute el pro-
grama. Imprimirá los números desde 100 a 89 en la pantalla y luego comunicará
el mensaje scroll? en la parte inferior de la pantalla. Ello le da una oportunidad
de ver los números que están a punto de desaparecer de la pantalla por la parte
superior. Si pulsa n, STOP o la tecla BREAK, el programa se Interrumpirá con el
informe D BREAK-CONT repeats. Si pulsa cualquier otra tecla, entonces el
ordenador imprimirá otras 22 líneas y le interrogará de nuevo con la misma
pregunta anterior.
5. Suprima la línea 30 del cuarto programa. Cuando ejecute el nuevo programa así
abreviado, el ordenador imprimirá el primer número y se parará con el mensaje
0 OK. Si teclea:
NEXT n
34
Capítulo 5
Subrutinas
Resumen
GO, SUB, RETURN
A veces, partes diferentes del programa tendrán tareas bastante similares que
realizar y se encontrará tecleando las mismas líneas en dos o más ocasiones; sin
embargo, ello no es necesario. Puede teclear las líneas una sola vez, en una forma
conocida como una subrutina, y luego utilizarlas, o llamarlas, en cualquier lugar del
programa sin necesidad de volverlas a introducir por el teclado.
Para realizar esta operación, utilice las sentencias GO SUB (GO a SUBrutina)
y RETURN.
Ello adopta la forma:
GO SUB n
RETURN
37
Capítulo 5
Cuando se ejecute este programa, vea si puede determinar lo que está suce-
diendo. La subrutina comienza en la línea 500.
Una subrutina puede llamar a otra o incluso a sí misma (en este último caso, se
llama recursivo).
38
Capítulo 6
10 READ a,b,c
20 PRINT a,b,c
30 DATA 10, 20, 30
40 STOP
Una sentencia READ está constituida por READ seguida de una lista de nom-
bres de variables, separados por comas. Actúa de forma bastante similar a una sen-
tencia INPUT, salvo que en lugar de hacerle introducir por el teclado los valores
asignados a las variables, el ordenador busca los valores en la sentencia DATA.
Cada sentencia DATA es una lista de expresiones, numéricas o de cadenas, se-
paradas por comas. Puede ponerlas en cualquier lugar que desee en un programa,
porque el ordenador las ignora salvo cuando está realizando una sentencia READ.
No obstante todas las sentencias DATA en el programa suelen ponerse juntas para
formar una larga lista de expresiones, la lista de datos. La primera vez que el orde-
nador llega a la función READ de un valor, toma la primera expresión de la lista
DATA; la siguiente vez, toma la segunda y, así, a medida que encuentra las suce-
sivas sentencias READ, abre su camino a través de la lista de DATA (si intenta ir
más allá del final de dicha lista, se producirá un error).
Observe que es una pérdida de tiempo poner las sentencias DATA en un
comando directo, porque READ no las encontrará. Las sentencias DATA han de ir
en el programa.
Veamos cómo se encajan juntas en el programa que acaba de introducir por el
teclado. La línea 10 dice al ordenador que efectúe la lectura de tres elementos de
datos y los asigne a las variables a, b y c. La línea 20 le dice que imprima (PRINT)
estas variables. La sentencia DATA en la línea 30, da los valores de a, b y c. La
línea 40 detiene el programa. Para ver el orden en que se realizan las cosas, cambie
la línea 20 a:
20 PRINT b,c,a
La información en DATA puede ser parte de un bucle FOR ... NEXT. Teclee.
10 FOR n=1 TO 6
20 READ D
30 DATA 2,4,6,8,10,12
40 PRINT D
50 NEXT n
60 STOP
41
Capitulo 6
Cuando este programa se ejecuta (RUN), puede ver a la sentencia READ des-
plazarse a través de la lista de DATA. Las sentencias DATA pueden contener tam-
bién variables de cadena. Por ejemplo:
10 READ d$
20 PRINT «La fecha es», d$
30 DATA «1 junio 1982»
40 STOP
10 READ a,b
20 PRINT a,b
30 RESTORE 10
40 READ x,y,z
50 PRINT x,y,z
80 DATA 1,2,3
70 STOP
En este programa, los datos requeridos por la línea 10 hacen a=1 y b=2. La
Instrucción RESTORE 10 restaura las variables y permite que sean objeto de lectura
(READ) las variables x, y y z comenzando a. partir del primer número en la senten-
cia DATA. Vuelva a ejecutar este programa sin la línea 30 y vea lo que sucede.
42
Capítulo 7
Expresiones
Resumen
Operaciones: + , - , * , /.
Expresiones, notación científica, nombres de variables.
proporciona apenas una indicación del muy importante hecho de que pueden com-
binarse estos cálculos. Dicha combinación, como suma*15/100, se denomina una
expresión, que es una forma abreviada de comunicar al ordenador que haga varios
cálculos, uno después del otro. En nuestro ejemplo, la expresión suma*15/100
significa «busque el valor de la variable denominada «suma», multiplíquele por 15 y
divida por 100».
Si todavía no lo ha hecho, recomendamos que examine el fascículo de introduc-
ción para ver cómo el ZX Spectrum trabaja con los números y el orden en que
evalúa el ordenador las expresiones matemáticas.
Para recapitular:
Las multiplicaciones y las divisiones se efectúan primero. Estas operaciones
tienen una prioridad más alta que la suma y la resta. En relación entre ellas, la
multiplicación y la división tienen la misma prioridad, lo que significa que ambas
operaciones se efectúan en orden de izquierda a derecha. Una vez realizadas, se
sigue con las sumas y las restas que también tienen la misma prioridad y que, por
tanto, se efectúan en orden de izquierda a derecha.
Aunque todo lo que realmente necesita saber es si una operación tiene una prio-
ridad más alta o más baja que otra, el ordenador realiza esto con la asignación de
un número entre 1 y 16 para representar la prioridad de cada operación: * y / tienen
prioridad 8 y + y - tienen prioridad 6.
Este orden de cálculo es absolutamente rígido, pero puede eludirlo con el
empleo de paréntesis: cualquier cosa entre paréntesis se evalúa primero y luego se
trata como un número único.
Las expresiones son útiles porque, siempre que el ordenador esté esperando
que usted le introduzca un número, puede darle una expresión en lugar de tal nú-
mero y el ordenador dará la solución. Las excepciones a esta regla son tan pocas
que se establecerán explícitamente en cada caso.
Puede reunir tantas cadenas (o variables de cadena) como quiera en una sola
expresión y si lo requiere, incluso puede utilizar paréntesis.
Realmente tenemos la obligación de decirle lo que puede y lo que no puede
utilizar como nombre de variables. Como ya dijimos, el nombre de una variable de
cadena ha de ser una sola letra seguida por $ y el nombre de la variable de control
de un bucle FOR-NEXT debe ser una sola letra, pero los nombres de las variables
numéricas ordinarias son mucho más libres. Puede utilizar ya sean letras o dígitos,
siempre y cuando comiencen por una letra. Puede poner espacios si con ellos se fa-
45
Capítulo 7
cilita la lectura, pero no han de considerarse como partes del nombre. Asimismo, no
se establece ninguna diferencia para el nombre si lo escribe en mayúsculas o en
minúsculas.
Damos algunos ejemplos de los nombres de variables que están permitidos:
x
t42
este nombre es tan largo que nunca será capaz de volverlo a escribir sin
cometer un error
ahora somos seis (estos dos últimos nombres se consideran los
aHORasoMosSEIS mismos y se refieren a la misma variable)
PRINT 2.34e0
PRINT 2.34e1
PRINT 2.34e2
PRINT 2.34e15
PRINT 2.34e-1
PRINT 2.34e-2
y así sucesivamente.
PRINT da solamente ocho dígitos significativos de un número. Pruebe:
Ello prueba que el ordenador puede retener los dígitos de 4294967295, aun
cuando no esté preparado para visualizarlos todos a la vez.
El ZX Spectrum utiliza la aritmética de coma flotante, lo que significa que man-
tiene separados los dígitos de un número (su mantisa) y la posición del punto (el
exponente). Ello no es siempre exacto, incluso para números enteros. Teclee:
46
Capítulo 7
Los número se calculan con una precisión de 9 ½ dígitos, por lo que 1e10 es
demasiado grande para ser almacenado con una precisión absolutamente correcta.
La inexactitud (realmente casi 2) es superior a 1 y por ello los números 1e10 y
1e10+1 son para el ordenador aparentemente iguales.
Para un ejemplo todavía más peculiar, teclee:
Como puede observar por lo que se imprime en la pantalla, cada doble comilla está
realmente sólo una vez; las ha escrito dos veces simplemente para que el ordenador
las identifique de forma adecuada.
47
Capítulo 8
Cadenas
Resumen
Fragmentación, utilizando TO. Observe que esta notación no es de BASIC estándar.
Dada una cadena, una subcadena de la misma está constituida por algunos
caracteres consecutivos de ella tomados en secuencia. Por consiguiente, «string»
es una subcadena de «bigger string» (una cadena más grande), pero no son
subcadenas «b sting» y «big reg».
Hay una notación denominada «slicing» (fragmentación) para describir las sub-
cadenas y puede aplicarse a cualquier expresión de cadena. La forma general es:
«abcdef» (2 TO 5) = «abcde»
«abcdef»(5 TO 7)
«abcdef»(1 TO 0) = ""
51
Capítulo 8
y luego:
PRINT a$
PRINT a$;”.”
52
Capítulo 8
observará que vuelve a suceder lo mismo (esta vez con espacios introducidos) por-
que a$() cuenta como una subcadena
lo hará adecuadamente.
Las expresiones de cadenas complicadas necesitarán encerrarse entre parénte-
sis antes de que puedan fragmentarse. Por ejemplo:
Ejercicio
53
Capítulo 9
Funciones
Resumen
DEF
LEN, STR$ , VAL, SGN, ABS, INT, SQR
FN
Considere una máquina de hacer embutidos. Suponga que pone un trozo grande
de carne en un extremo, gira una manivela y obtiene a la salida en el otro extremo,
un embutido de carne. Un hecho análogo se tendría con cualquier otro ingrediente
destinado a la fabricación de embutido.
Las funciones son algo similar a estas máquinas de embutidos pero hay una di-
ferencia: trabajan con números y cadenas de caracteres en lugar de hacerlo con
carne. Suministre un valor (llamado el argumento), trátelo efectuando algunos cál-
culos y, finalmente, obtendrá otro valor, el resultado.
57
Capítulo 9
10 10
LET a$ = STR$1e2
LET a$ = "100"
VAL "2*3"=6
o también:
VAL ("2"+"*3”)=6
58
Capítulo 9
Esto puede ser extremadamente confuso si no conserva su «presencia de ánimo»;
por ejemplo:
(Recuerde que en el interior de una cadena unas comillas de cadena deben escri-
birse dos veces. Si profundiza más en las cadenas, encontrará que las comillas de
cadena necesitan cuadruplicarse o incluso octuplicarse).
Hay otra función, bastante similar a VAL, aunque probablemente menos útil,
denominada VAL$. Su argumento sigue siendo una cadena, pero su resultado es
también una cadena. Para ver cómo actúa, recuerde que VAL tiene una acción en
en dos pasos: primero, su argumento se evalúa como un número. Con VALS$, el
primer paso es el mismo, pero después de eliminarse las comillas de cadena en el
segundo paso, lo que queda se evalúa como otra cadena. Así:
VAL$"""Chocolate""" = "Chocolate"
LET a$ = "99"
e Imprima todo lo siguiente: VAL a$, VAL "a$", VAL """ a$""", VAL$ a$, VAL "a$"
y VAL$ """a$"""$""". Algunas de ellas actuarán y otras no lo harán; intente
encontrar explicación a todas las respuestas.
SGN es la función signo. Es la primera función que ha visto que no tiene nada
que hacer con las cadenas, porque su argumento y su resultado son números. El re-
sultado es + 1 si el argumento es positivo, 0 si el argumento es cero y -1 si el ar-
gumento es negativo.
ABS es otra función cuyo argumento y cuyo resultado son números. Convierte el
argumento en un número positivo (que es el resultado) haciendo caso omiso del
signo, de modo que por ejemplo:
INT significa «parte entera» (un entero es un número entero, que puede ser
negativo). Esta función convierte un número fraccionario, con cifras decimales, en
un entero suprimiendo la parte fraccionaria, así por ejemplo:
INT 3.9 = 3
INT - 3* = - 4
59
Capítulo 9
Asimismo, puede definir funciones por su cuenta. Posibles nombres para estas
funciones son FN seguida por una letra (si el resultado es un número) o FN seguida
por una letra y por $ (si el resultado es una cadena). Hay más rigurosidad con res-
pecto a los paréntesis: el argumento debe encerrarse entre paréntesis.
Defina una función poniendo una sentencia DEF en algún lugar del programa.
Por ejemplo, veamos la definición de una función FN s, cuyo resultado sea el cuadra-
do del argumento:
PRINT FN s(2)
PRINT FNs(3 + 4)
PRINT 1 + INT FN s (LEN "pollo"/2+ 3)
60
Capítulo 9
Nota: En algunas versiones de BASIC, debe encerrar entre paréntesis el argu-
mento de una de las funciones del ordenador. Este no es el caso en el BASIC del
ZX Spectrum.
INT siempre, redondea por defecto. Para redondear al entero más próximo.,
añada primero 0.5 (podría escribir su propia función para hacer esta operación).
FN r(2.9) = 3 FN r(2.4) = 2
FN r(-2.9) = -3 FN r(-2.4) = -2
Compare estas respuestas con las que consigue cuando utiliza INT en lugar de
FN r. Escriba y ejecute lo siguiente:
Esta vez, FN p(2,3) tendrá el valor 10 porque FN q volverá también a las varia-
bles x e y en lugar de emplear los argumentos de FN p.
61
Capítulo 9
LEFT$ (a$,n) da la subcadena de a$ que consta de los primeros n caracteres.
RIGHT$ (a$,n) da la subcadena de a$ que está constituida por los caracteres
desde el enésimo en adelante.
MID$ (a$, n1, n2) da la subcadena de a$ que está constituida por n2 caracteres
que comienzan en el n1-ésimo.
TL$ (a$) da la subcadena de a$ que está constituida por todos sus caracteres
con la excepción del primero.
Puede escribir algunas funciones definidas por el usuario para hacer lo mismo,
por ejemplo:
Ejercicio
FN s(SQR x) = x
62
Capítulo 10
Funciones matemáticas
Resumen
PI; EXP, LN, SIN, COS, TAN, ASN, ACS, ATN
Este capítulo trata de las funciones matemáticas de que dispone del ZX Spec-
trum. Es bastante probable que nunca tenga que hacer uso de estas funciones en
absoluto, por lo que si lo encuentra demasiado pesado, no vacile en hacer caso
omiso de este capítulo. Abarca la operación (elevación a una potencia), las
funciones ESP y LN y las funciones trigonométricas SIN, COS, TAN y sus inversas
ASN, ACS y ATN.
y EXP
Puede elevar un número a la potencia de otro, ello significa «multiplicar el pri-
mer número por sí mismo el número de veces indicado por el segundo». Esto se
suele indicar escribiendo el segundo número inmediatamente encima y a la derecha
del primer número; pero, evidentemente, esta notación sería difícil en un ordenador
y por ello utilizamos el símbolo T en su lugar. Por ejemplo, las potencias de 2 son:
2 1=2
2 2 = 2*2 = 4 (2 al cuadrado, normalmente escrito 2 )
2 3 = 2*2*2 = 8 (2 al cubo, normalmente escrito 2 )
2 4 = 2`2'2'2 = 16 (2 a la cuarta potencia, normalmente escrito 2 )
Por consiguiente, a su nivel más elemental, 'a b' significa 'a multiplicada por
sí misma b veces', pero, evidentemente, esta operación sólo tiene sentido si b es un
número entero positivo. Para encontrar una definición que sirva para otros valores
de b, consideramos la regla:
(Observe que damos a Tuna prioridad mayor que a * y /, por lo que cuando
haya varias operacions en una sola expresión, las operaciones se efectúan antes
de las operaciones * y / ). Es bastante claro que lo anterior se verifica cuando b y c
son números enteros positivos; pero si decidimos que necesitamos operar incluso
cuando no lo son, entonces, nos veremos obligados a aceptar que:
a0=1
a (-b) = 1/a b
a (1/b) = la raíz b-ésima de a, o lo que es lo mismo, el número que tiene que
multiplicar por sí mismo b veces para obtener a
a (b*c) = (a b) c
a (-1) = 1/a
y
a (1/2) = SQR (a)
10 INPUT a,b,c,
20 PRINT a (b+c)=a b * a c
30 GO TO 100
Por supuesto, si la regla que dimos anteriormente es cierta, los números que
imprima cada vez el ordenador serán iguales. (Observación: Habida cuenta de la
forma en que el ordenador actúa con respecto a la operación , el número a la
izquierda, que es -a en este caso, nunca debe ser negativo).
Un ejemplo bastante típico de la posible aplicación de esta función es la del in-
terés compuesto. Suponga que tiene invertido parte de su dinero en una sociedad
inmobiliaria y ésta le devenga un interés anual del 15%. Entonces, transcurrido un
año, no sólo tendrá el 100% que tendría de todos modos, sino también los intereses
del 15% que la sociedad inmobiliaria le haya proporcionado, lo que totaliza el 115%
respecto a la cantidad que tenía originalmente. Para exponerlo de otra forma, ha
multiplicado su cantidad de dinero por un factor de 1.15 como consecuencia de esta
operación. Transcurrido otro año, volverá a suceder lo mismo, por lo que tendrá
1.15*1.15 = 1.152 =1.3225 veces su cantidad de dinero original. En general, trans-
curridos y años, tendrá 1.15 y veces la cantidad inicial de que disponía.
verá que incluso partiendo de solamente 2.000 pesetas su montante crece bastante
rápidamente y, lo que es más, crece con mayor rapidez a medida que transcurre el
tiempo (aún siendo así, podría considerar que no se mantiene a la altura de la
inflación).
Esta clase de comportamiento, en donde transcurrido un intervalo de tiempo
fijo esa cantidad se multiplica por sí misma en una proporción fija, se denomina
crecimiento exponencial, y se calcula elevando un número fijo a la potencia del
tiempo.
Suponga que hizo lo siguiente:
10 DEF FN a(x)=a x
En este caso, a es más o menos fija, mediante sentencias LET; su valor corres-
ponderá al tipo de interés, que sólo cambia periódicamente.
Hay un determinado valor para a que hace a la función FN a especialmente
atractiva a los ojos de un matemático y este valor se denomina e. El ZX Spectrum
tiene una función denominada EXP definida por:
EXP x = ex
66
Capítulo 10
PRINT EXP 1
porque EXP 1= e1 =e. Por supuesto, esto es sólo una aproximación. Nunca puede
obtener el número e con exactitud.
LN
La inversa de una función exponencial es una función logarítmica; el logaritmo
(en base a) de un número x es la potencia a la que tiene que elevar a para obtener
el número x y se escribe logax. Así, por definición, a log ax =x y es también cierto
que log (ax) =x.
Puede que ya conozca cómo utilizar los logaritmos de base 10 para efectuar
multiplicaciones (dichos logaritmos se denominan logaritmos vulgares). El ZX Spec-
trum tiene una función LN que calcula logaritmos en base e (que se conocen como
logaritmos naturales). Para calcular logaritmos en cualquier otra base, debe dividir el
logaritmo natural por el logaritmo natural de la base:
log ax = LN x / LN a
PI
Dado cualquier círculo, puede determinar su perímetro (la longitud de su con-
torno, que suele denominarse su circunferencia) multiplicando su diámetro (an-
chura) por un número llamado π (letra griega que significa perímetro).
Como el número e, π es un decimal no periódico y su valor es 3.141592653589...
La palabra PI en el Spectrum (en el modo extendido, entonces, M) se toma con el
significado de este número. Pruebe PRINT PI.
67
Capítulo 10
Hemos dibujado también dos líneas denominadas ejes que se cruzan en el cen-
tro del círculo. La línea horizontal (entre las posiciones de las tres y de las nueve en
punto de un reloj) se denomina el eje x y la vertical (entre las posiciones de las 6 y
de las 12 en punto) se denomina el eje y.
Para especificar dónde está el punto, dirá cuánto se ha desplazado éste alrededor del
círculo a partir de su posición de partida de las tres en punto: llamaremos a esta
distancia a. Sabemos que la longitud de la circunferencia del círculo es 2π (porque
su radio es 1 y su diámetro es, pues, 2), por lo que cuando se haya desplazado
una cuarta parte del recorrido del círculo, será a = π/2, cuando se haya desplazado
la mitad de su recorrido será a=π y cuando haya realizado el recorrido completo,
será a=2π.
Dada la distancia en forma curvilínea alrededor del contorno, a, puede consi-
derarse oportuno conocer otras dos distancias para determinar cuánto se ha
68
Capítulo 10
desplazado el punto a la derecha del eje y y cuánto por encima del eje x. Estas se
denominan coseno y seno de a respectivamente. Las funciones COS y SIN en el
ordenador sirven para calcularlas.
SIN (a+2*PI)=SIN a
COS (a+2*PI)=COS a
69
Capítulo 10
70
Capítulo 11
Números aleatorios
Resumen
RANDOMIZE RND
10 PRINT RND
20 GO TO 10
para ver cómo varía la respuesta. ¿Puede detectar alguna configuración deter-
minada? No será capaz pues «random» significa que es una función aleatoria.
Realmente, RND no es verdaderamente aleatoria, porque sigue una secuencia
fija de 65536 números. Sin embargo, es tan profundamente complicada la secuencia
que no se tienen pautas obvias y por ello diremos que RND es psedoaleatoria.
RND da un número aleatorio entre 0 y 1, pero fácilmente puede obtener números
aleatorios en otros intervalos. Por ejemplo, 5*RND está entre 0 y 5 y 1.3+0.7*RND
está entre 1.3 y 2. Para obtener números enteros, utilice INT (recordando que INT
siempre se redondea por defecto) como en 1+INT (RND*6) que utilizaremos en un
programa para simular dados. RND*6 está en el intervalo de 0 a 6, pero puesto que
nunca llega realmente a 6, INT (RND*6) es 0, 1, 2, 3, 4 ó 5.
Veamos el programa:
10 RANDOMIZE 1
20 FOR n = 1 TO 5: PRINT RND,: NEXT n
30 PRINT : GO TO 10
73
Capítulo 11
10 RANDOMIZE
20 PRINT RND : GO TO 10
Ejercicios
RANDOMIZE su número
Capítulo 11
Bi – 1
--------
p–1
Matrices
Resumen
Matrices (la forma en que el ZX Spectrum trata las matrices de cadenas se aparta
algo del procedimiento normal).
DIM ...
Suponga que tiene una lista de números, por ejemplo, las notas de diez perso-
nas en una clase. Para almacenarlas en el ordenador podría establecer una variable
única para cada persona, pero tal método se consideraría arduo. Podría decidir
llamar a la variable Bloggs 1, Bloggs 2 y así sucesivamente hasta Bloggs 10, pero el
programa para preparar estos diez números sería bastante largo y aburrido de intro-
ducir por teclado.
Sería mucho más atractivo si pudiera teclear:
DIM b(10)
establece una matriz llamada b con dimensión 10 (esto es, hay 10 variables con
subíndice b(1)...b(10)) e inicializa los 10 valores a 0. También borra cualquier matriz
denominada b que existiera anteriormente. (Pero no una variable simple. Una matriz
y una variable numérica simple con el mismo nombre pueden coexistir y no debe
producirse ninguna confusión entre ellas porque la variable de matriz siempre tiene
un subíndice).
El subíndice puede ser una expresión numérica arbitraria, por lo que, ahora,
puede escribir:
10 FOR n =1 TO 10
20 READ b(n)
30 NEXT n
40 DATA 10,2,5,19,16,3,11,1,0,6
79
Capítulo 12
DIM c(3,6)
c(1,1),c(1,2)...,c(1,6)
c(2,1),c(2,2)...,c(2,6)
c(3,1),c(3,2)...,c(3,6)
DIM a$(5,10)
con lo que obtendrá una matriz de 5*10 de caracteres, pero también puede conside-
rar cada fila como una cadena:
80
Capítulo 12
Obtendrá:
1234567890 7
Para el último subíndice (el que puede omitir), también tener una forma de
fragmentación, de modo que, por ejemplo, sea:
Recuerde:
En una matriz de cadena, todas las cadenas tienen la misma longitud fija.
La sentencia DIM tiene un número adicional (el último) para especificar dicha
longitud.
Cuando escriba una variable con subíndice para una matriz de cadena, puede in-
troducir un número adicional, o elemento de fragmentación, para estar en corres-
pondencia con el número adicional en la sentencia DIM.
Puede tener matrices de cadenas sin ninguna dimensión. Teclee:
DIM a$(10)
y encontrará que a$ se comporta casi como una variable de cadena, con la salvedad
de ue siempre tiene la longitud 10 y que la asignación es siempre «procrusteana».
Ejercicios
1. Utilice las sentencias READ y DATA para establecer una matriz m$ de doce
cadenas en las que m$(n) es el nombre del n-ésimo mes. (Sugerencia: La sen-
tencia DIM será DIM m$(12,9). Pruébela imprimiendo todas las m$(n)
(utilice un bucle)).
Teclee:
81
Capítulo 13
Condiciones
Resumen
AND, OR
NOT
IF condición THEN
Las condiciones, entonces, eran las relaciones (= , < , > , <= , >= y <>),
que comparan dos números o dos cadenas. También pueden combinar varias de
ellas, con el empleo de las operaciones lógicas AND, OR y NOT.
Una relación AND y otra relación es verdadera siempre que ambas relaciones
sean verdaderas, por lo que podría tener una línea como:
Persuádase a sí mismo que >= y <= son las negaciones de < y de > res-
pectivamente; por consiguiente, siempre puede prescindir de NOT en una relación
cambiando la relación.
Además:
y
NOT (una primera expresión lógica OR una segunda)
es lo mismo que
NOT (la primera) AND NOT (la segunda)
que podría esperar que diera un error de sintaxis. De hecho, en lo que respecta
al ordenador, no hay nada como un valor lógico; en cambio, emplea número
ordinarios, con observancia de unas pocas reglas:
(i) = , < , > , <= , =< y <> todos ellos dan resultados numéricos: 1 para
verdadero y 0 para falso. Por consiguiente, el comando PRINT anterior im-
primió 0 para '1 = 2', que es falso y 1 para '1 <> 2' que es verdadero.
(ii) En:
IF condición THEN ...
la condición puede ser realmente cualquier expresión numérica. Si su valor
es 0, entonces, cuenta como falso y cualquier otro valor (incluyendo el valor de 1
que da una relación verdadera) cuenta como verdadero. Así, la sentencia IF sig-
nifica exactamente lo mismo que:
IF condición <> 0 THEN ...
10 INPUT a
20 INPUT b
30 PRINT(a AND a >=b) + (b AND a<b)
40 GO TO 10
86
Capítulo 13
Ejercicio
1. El lenguaje BASIC opera, a veces, de forma distinta al inglés. Considere, por
ejemplo, la cláusula inglesa 'si a no es igual a b o c'. ¿Cómo
podría escribirla en BASIC? La respuesta no es
IF A<> B OR C
ni tampoco
IF A <> B OR A <>C
87
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 ca-
denas 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 com-
pleta 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:
91
Capítulo 14
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 des-
de 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 π
(i) 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.
92
Capítulo 14
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 mi-
núsculas). Hay otro uso para USR, cuando su argumento es un número, que se
tratará más adelante.
93
Capítulo 14
10 FOR n=0 TO 7
20 INPUT fila: POKE USR "P" + n, fila
30 NEXT n
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$
94
Capítulo 14
He aquí la regla para determinar en qué orden aparecen dos cadenas. Primero,
comprar 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 (in-
ferior) 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 cade-
nas 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
es verdadera, pero
es falsa.
95
Capítulo 14
El programa siguiente introduce los gráficos definidos por el usuario para mos-
trar 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.
96
Capítulo 14
Ejercicios
10 INPUT a
20 PRINT CHR$ a;
30 GO TO 10
“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 sen-
tencia INPUT.
97
Capítulo 15
Ya ha visto PRINT utilizado con mucha frecuencia, por lo que tendrá una idea
aproximada de cómo se emplea. Las expresiones cuyos valores se imprimen se de-
nominan elementos PRINT y están separados por comas o punto y corra. llamados
separadores PRINT. Un elemento PRINT puede ser también nada en absoluto, que es
una forma de explicar lo que sucede cuando utilice dos comas en una fila.
Hay dos clases más de elementos PRINT, que se emplean para decirle al orde-
nador que es lo que ha de imprimir sino en donde. Por ejemplo
PRINT AT 11,16; "*" imprime una estrella en la parte central de la pantalla.
AT línea, columna
101
Capítulo 15
102
Capítulo 15
TAB columna
10 FOR n =0 TO 20
20 PRINT TAB 8*n;n;
30 NEXT n
y luego:
PRINT 99
103
Capítulo 15
mi edad está entre paréntesis, por lo que su valor consigue ser impreso. Tu
edad no está entre paréntesis, por lo que ha de introducir por el teclado su valor.
Todo lo que una sentencia INPUT escribe sale en la parte inferior de la pantalla,
que actúa con cierta independencia de la mitad superior. En particular, sus líneas
están numeradas con respecto a la línea superior de la mitad inferior, aun cuando
esta última se haya desplazado hacia arriba de la pantalla de televisión real (lo que
sucede si introduce grandes cantidades de datos por INPUT).
Para ver cómo opera AT en las sentencias INPUT, trate de ejecutar
la siguiente:
(basta pulsar ENTER cada vez que se detenga). Cuando Esta es la línea 2 es objeto
de impresión, la parte inferior de la pantalla se desplaza hacia arriba para dejar
104
Capítulo 15
espacio para ella; pero la numeración se desplaza también hacia arriba, de modo
que las líneas de texto mantienen sus mismos números.
Ahora, pruebe el programa siguiente:
INPUT LINE a$
cat
como dato de INPUT, a a$ se le dará el valor cat. Puesto que las comillas de cadena
no aparecen en la cadena, usted no puede suprimirlas ni introducirlas por teclado
en una clase distinta de expresión de cadena para los datos de INPUT. Re-
cuerde que no puede utilizar LINE para variables numéricas.
Los caracteres de control CHR$ 22 y CHR$ 23 tienen efectos bastante
similares a AT y TAB. Son bastante singulares como caracteres de control porque
siempre que se envían para ser impresos en la pantalla de televisión, deben ir segui-
dos por dos caracteres más que no tienen su efecto habitual: se tra-
tan como números (sus códigos) para especificar la línea y la columna (por AT) o
la posición de tabulación (por TAB). Casi siempre encontrará más fácil utilizar AT
y TAB, en la forma habitual, en lugar de los caracteres de control, pero podrían
ser de utilidad en algunas circunstancias. El carácter de control AT es CHR$ 22. El
primer carácter después del mismo especifica el número de línea y el segundo el
número de columna, de modo que
PRINT AT 1,c;
105
Capítulo 15
El carácter de control de TAB es CHR$ 23 y los dos caracteres después del mismo
se utilizan para dar un número entre 0 y 65535 que especifica el número que hubie-
ra tenido en un elemento de información de TAB:
POKE 23692,255
10 FOR n =0 TO 10000
20 PRINT n: POKE 23692,255
30 NEXT n
y vigile cualquier zumbido (!) de la pantalla, por el movimiento con gran rapidez.
Ejercicios
1. Pruebe el siguiente programa con algunos niños para probar sus tablas de
multiplicación.
Si son hábiles, podrían ingeniárselas para no tener que hacer los cálculos
por sí mismos. Por ejemplo, si el ordenador les pide que escriban la respuesta a 2*3,
todo lo que tienen que teclear es 2*3.
Una forma de evitarlo es hacerles introducir cadenas en lugar de números. Sus-
tituir c en la línea 30 por c$ y en la línea 100 por VAL c$ e insertar
una línea.
Esto los volverá locos. Transcurridos unos días, sin embargo, uno de ellos quizás
descubra que pueden eludirlo borrando las comillas de cadena y tecleando STR$
(2*3). Para «cerrar esta escapatoria», puede sustituir c$ en la línea 30 por LINE c$.
106
Capítulo 16
Colores
Resumen
INK, PAPER, FLASH, BRIGHT, INVERSE, OVER
BORDER
10 FOR m =0 TO 1: BRIGHT m
20 FOR n = 1 TO 10
30 FOR c=0 TO 7
40 PAPER c: PRINT “ “;: REM 4 espacios coloreados
50 NEXT c: NEXT n: NEXT m
60 FOR m =0 TO 1: BRIGHT m: PAPER 7
70 FOR c=0 TO 3
80 INK c: PRINT c;" “;
90 NEXT c: PAPER 0
100 FOR c=4 TO 7
110 INK c: PRINT c;" “;
120 NEXT c: NEXT m
130 PAPER 7: INK 0: BRIGHT 0
Muestra los ocho colores (incluyendo blanco y negro) y los dos niveles de brillo
que el ZX Spectrum puede producir en un televisor en color (si su televisión es de
blanco y negro, verá diversas tonalidades de grises). Damos a continuación una lista
de colores para referencia; se escriben también con las teclas de números adecuadas.
0 - negro
1 - azul
2 - rojo
3 - púrpura o magenta
4 - verde
5 - azul claro, técnicamente llamado «cyan»
6 - amarillo
7 - blanco
En una televisión de blanco y negro, estos números están en orden de brillo o lu-
minosidad.
Para utilizar adecuadamente estos colores, necesita conocer un poco sobre cómo
se dispone la imagen.
La imagen está dividida en 768 (24 líneas de 32) posiciones en donde
109
Capítulo 16
PAPER 5
y luego, imprima algunas cosas. Todo aparecerá sobre papel «cyan» (azul-ver-
doso pálido), porque a medida que se imprimen, los colores del papel, en las
posiciones que ocupan, se ponen a «cyan» (que tiene código 5).
Las demás operan de la misma forma, por lo que después de
110
Capítulo 16
PAPER 8
En este caso, el color de la tinta siempre estará en contraste con el color del
papel anterior en cada posición.
La televisión en color se basa en el hecho bastante curioso de que el ojo humano
sólo puede ver realmente tres colores, que son los primarios: azul, rojo y
verde. Los demás colores son mezclas de ellos. Por ejemplo, el magenta se consigue
mezclando azul con rojo (que es la razón de que su código 3 sea la
suma de los códigos correspondientes a los colores azul y rojo).
Para ver cómo los ocho colores se acoplan juntos, imagine tres proyectores rec-
tangulares, con colores azul, rojo y verde, que inciden en un lugar no coincidente
en un recinto de papel blanco en la oscuridad En donde se solapen verá mezclas
de colores, como se indica por el siguiente programa (observe que los espacios de
tinta se obtienen con el empleo de una u otra tecla SHIFT con 8, cuando se
está en el modo G).
111
Capítulo 16
Hay una función denominada ATTR que averigua cuáles son los atributos que
están en una posición dada en la pantalla. Se trata de una función bastante
complicada, por lo que se ha relegado al final de este capítulo.
Hay otras dos sentencias, INVERSE Y OVER, que no controlan los atributos,
sino las configuraciones de puntos que se imprimen en la pantalla. Utilizan los
números 0 para desactivación y 1 para activación, en la misma forma que para el
parpadeo (FLASH) o para el brillo (BRIGHT), pero ellas no son las únicas posibili-
dades. Si hace INVERSE 1, entonces, las configuraciones de puntos impresas serán
las inversas de su forma habitual: los puntos de papel serán sustituidos por puntos
de tinta y viceversa. Así, a se imprimirla como
112
Capítulo 16
OVER 1
10 OVER 1
20 FOR n = 1 TO 32
30 PRINT "o"; CHR$ 8; """";
40 NEXT n
BORDER color
Cuando hace una entrada de datos, se sigue esta norma de empleo de tinta de
contraste en papel coloreado en el contorno; pero puede cambiar el color de los
epígrafes escritos por el ordenador utilizando los elementos de INK y PAPER (y así
sucesivamente) en la sentencia INPUT, lo mismo que lo haría en una sentencia PRINT.
Su efecto dura bien hasta el final de la sentencia o bien hasta que se tecleen al-
gunos datos en INPUT, lo que suceda primero. Pruebe:
113
Capítulo 16
Hay otra forma de cambiar los colores con el empleo de caracteres de control
(de manera bastante similar a la utilizada con los caracteres de control para AT y
TAB en el capitulo 15.
114
Capítulo 16
115
Capítulo 16
Sus dos argumentos son los números de línea y de columna que utilizaría en un
elemento AT y su resultado es un número que indica los colores y así sucesivamente
en la posición de carácter correspondiente en la pantalla de televisión. Puede utili-
zarlo tan libremente en expresiones como pueda hacerlo con cualquier otra función.
El número resultante es la suma de otros cuatro números como sigue:
128 si la posición de carácter está parpadeando, 0 si no parpadea
64 si la posición de carácter es brillante, 0 si es normal
8* código para el color del papel
número correspondiente al color de la tinta.
Por ejemplo, si la posición de carácter está parpadeando y tiene brillo normal
con papel amarillo y tinta azul, entonces, los cuatro números que hemos de sumar
son 128, 0, 8*6 (=48) y 1, lo que hace un total de 177. Pruebe lo anterior con:
Ejercicios
1. Pruebe
2. Teclee:
PAPER 0: INK 0
BORDER 0
116
Capítulo 16
No importa cómo opera; está cambiando los colores de los cuadrados en la pan-
talla de televisión y las RND deben conseguir que ello suceda aleatoria-
mente. Las bandas diagonales que quizás vea son una manifestación de la confi-
guración oculta en RND (la configuración que le hace pseudoaleatoria en lugar de real-
mente aleatoria.
117
Capítulo 17
Gráficos
Resumen
PLOT, DRAW, CIRCLE
POINT
pixels
10 FOR n =0 TO 255
20 PLOT n,88+80*SIN (n/128*PI)
30 NEXT n
10 FOR n =0 TO 255
20 PLOT n, 80*SQR(n/64)
30 NEXT n
Observe que las coordenadas del pixel son bastante diferentes de la línea y co-
lumna en un AT. Puede encontrar el diagrama en el capítulo 15 de utilidad cuando
trabaje con las coordenadas del pixel y los números de línea y de columna.
Para ayudarle en sus dibujos, el ordenador trazará líneas rectas, círculos y ar-
cos, con el empleo de las sentencias DRAW y CIRCLE.
La sentencia DRAW, para dibujar una línea recta, adopta la forma
DRAW x,y
121
Capítulo 17
Observe que los números en una sentencia DRAW pueden ser negativos, aun-
que los incluidos en una sentencia PLOT no lo pueden ser.
Las líneas parecen ser más anchas a medida que prosigue el programa y ello se
debe a que una línea cambia los colores de todo el entintado en pixels de todas las po-
siciones de carácter que atraviesa. Observe que puede encajar los elementos PAPER,
INK, FLASH, BRIGHT, INVERSE y OVER en una sentencia PLOT o DRAW, lo
mismo que podría hacerlo con PRINT e INPUT. Van entre la palabra clave y las coor-
denadas y están terminadas por punto y coma o comas.
Una característica adicional de DRAW es que puede utilizarlo para dibujar ar-
cos de circunferencia en lugar de líneas rectas, con el empleo de un número suple-
mentario para especificar un ángulo a girar; la forma es:
DRAW x,y,a
122
Capítulo 17
final en (150,150)
comienzo en (100,100)
Lo mismo que con PLOT y DRAW, puede poner las diversas clases de elementos
de color al principio de una sentencia CIRCLE.
La función POINT le dice si un pixel es de color de tinta o de papel. Tiene dos ar-
gumentos, las coordenadas del. pixel (que deben estar encerradas entre paréntesis)
y su resultado es 0 si el pixel es de color de papel y 1 si es color de tinta. Pruebe:
Teclee:
PAPER 7: INK 0
123
Capítulo 17
PLOT OVER 1: -cambia el pixel a partir de cualquier estado anterior, por lo que
si tenía color de tinta adquirirá color de papel y viceversa.
PLOT INVERSE 1; OVER 1; -deja el pixel exactamente igual a como estaba an-
tes; pero observe que también cambia la posición PLOT, por lo que podría
utilizarle simplemente para hacer esa operación.
Como otro ejemplo de utilización de la sentencia OVER, llene la pantalla con
escritura utilizando blanco y negro y luego, teclee:
Con esta orden no se opera de forma correcta, porque los pixels que la línea
utiliza en el recorrido de retorno no son completamente los mismos que los que se
emplearon en el trazado. Ha de borrar una línea en la misma dirección exacta-
mente en que la dibujó.
Una forma de conseguir colores no habituales es introducir dos colores normales
juntos en un solo cuadrado, con el empleo de un gráfico definido por el usuario.
Ejecute el siguiente programa:
124
Capítulo 17
Ejercicios
1. Juegue con los elementos PAPER, INK, FLASH y BRIGHT en una sentencia
PLOT. Estas son las partes que afectan a la totalidad de la posición de carácter
que contiene el pixel. Normalmente es como si la sentencia PLOT hubiera co-
menzado
2. Intente dibujar círculos con el empleo de SIN y COS (si ha leído el capítulo 9,
trate de resolverlo). Ejecute el programa siguiente:
Puede ver que la sentencia CIRCLE es mucho más rápida, aunque menos exacta.
3. Pruebe:
A partir de ella puede constatar que la sentencia CIRCLE deja la posición PLOT
en un lugar bastante indeterminado (siempre está en algún lugar a medio camino
ascendente en el lado derecho del círculo. Habitualmente necesitará seguir a la sen-
tencia CIRCLE con una sentencia PLOT antes de que haga cualquier otro dibujo.
125
Capítulo 17
Movimiento
Resumen
PAUSE, INKEYS, PEEK
Con bastante frecuencia, deseará conseguir que el programa tenga una dura-
ción determinada y para tal fin, encontrará de utilidad la sentencia PAUSE.
PAUSE n
La «cuerda» de este reloj se acabará en unas 55,5 horas debido a la línea 60, pero
fácilmente puede prolongar su período de funcionamiento. Observe cómo la tempo-
rización está controlada por la línea 210. Podría esperar PAUSE 50 para hacerle
dar un «tic-tac» de un segundo, pero el cómputo lleva algo de tiempo también y ha
de permitírselo. Esto es mejor hacerlo por tanteo, sincronizando el reloj del orde-
nador con uno real y ajustando la línea 210 hasta que concuerden (no puede hacer
esta operación con una gran exactitud; un ajuste de un cuadro en un segundo es el
2% o la mitad de una hora en un día).
Hay una manera mucho más exacta de medir el tiempo, utilizando el contenido
de determinadas posiciones de memoria. Los datos almacenados se recuperan con
el empleo de PEEK. En el capítulo 25 se explicará con detalle. La expresión
utilizada es:
129
Capítulo 18
El reloj interno que utiliza este método debe tener una exactitud de un 0,01 %
mientras el ordenador esté ejecutando su programa, o lo que es lo mismo, 10 se-
gundos por día; pero se detiene temporalmente siempre que haga BEEP, o una
operación de cinta de cassette, o utilice !a impresora o cualquiera de los demás ele-
mentos suplementarios de equipos que pueda emplear con el ordenador. Todas es-
tas operaciones le harán perder tiempo.
Los números PEEK 23674, PEEK 23673 y PEEK 23672 se retienen en el interior
del ordenador y se utilizan para el contaje en 1/50 de segundo. Cada uno está entre 0
y 255 y se incrementan gradualmente a través de todos los números desde 0 a 255;
después de 255 pasan directamente a 0.
El que se incrementa más frecuentemente es PEEK 23672. Cada 1/50 de segundo
se incrementa en 1. Cuando está en 255, el siguiente incremento le lleva a 0 y, al
mismo tiempo, impulsa a PEEK 23673 hasta 1. Cuando (cada 250/50 segundos)
PEEK 23673 se lleva desde 255 a 0, impulsa, a su vez, a PEEK 23674 en 1. Esto
debe ser suficiente para explicar por qué opera adecuadamente la anterior
expresión.
Ahora, veámoslo detenidamente. Suponga que nuestros tres números son 0
(para PEEK 23674), 255 (para PEEK 23673) y 255 (para PEEK 23672). Ello sig-
nifica que al cabo de unos 21 minutos después del encendido, nuestra expresión
debiera proporcionar:
(65536 *0 + 256 *255 + 255)/50 =1310,7.
Pero hay un peligro oculto. La siguiente vez que haya un contaje de 1/50 se-
gundo, los tres números cambiarán a 1, 0 y 0. Frecuentemente, esto sucederá cuando
esté a medio camino de la evaluación de la expresión: el ordenador evaluaría
PEEK 23674 como 0, pero, entonces, cambian los otros dos a 0 antes de que pueda
aplicarles la función PEEK. La respuesta sería, entonces:
(65536*0 + 256 *0 + 0) / 50 = 0
130
Capítulo 18
Una sencilla regla para evitar este problema es evaluar la expresión dos veces
en sucesión y tomar la respuesta más grande.
Si examina detenidamente el anterior programa puede ver que cumple con dicha
regla de forma implícita.
Veamos un artificio para aplicar la regla. Defina las funciones:
10 DEF FN m(x,y)=(x+y+ABS(x-y))/2: REM la más grande de
x y de y
20 DEF FN u()=(65536*PEEK 23674+256*PEEK 23673+PEEK
23672)/50: REM tiempo, puede estar equivocado
30 DEF FN t()= (FN u()): REM tiempo, correcto
Puede cambiar los tres números del contador de modo que proporcionen el tiem-
po real en lugar del tiempo desde que el computador se puso en marcha. Por ejemplo,
para ajustar el tiempo a las 10,00 de la mañana, se percatará de que equivale a
10*60*60*50 = 1800000 cincuentavas partes de un segundo y que:
1800000 = 65536*27 + 256*119 + 64
En este caso, la línea 10 espera a que retire su dedo del teclado y la línea 20
espera a que pulse una nueva tecla.
Recuerde que a diferencia con INPUT, INKEY$ no le espera. Por ello no teclee
ENTER, pero, por otra parte, si no teclea nada en absoluto, entonces, habrá per-
dido su oportunidad.
Ejercicios
2. Otra forma de utilizar INKEY$ es una conjunción con PAUSE, como en este
programa de máquina de escribir de alternativa.
10 PAUSE 0
20 PRINT INKEY$;
30 GO TO 10
131
Capítulo 18
Para hacer este trabajo ¿por qué es esencial que una pausa no deba acabar si
le encuentra pulsando una tecla cuando da comienzo?
10 IF INKEY$="" THEN GO TO 10
20 PRINT AT 11,14;"OUCH!"
30 IF INKEY$ <> "" THEN GO TO 30
40 PRINT AT 11,14" "
50 GO TO 10
Capítulo 19
BEEP
Resumen
BEEP
Para conseguir notas más altas o más bajas, ha de sumar o restar 12 para
cada octava que suba o baje.
Si tiene un piano frente a usted cuando esté programando una armonía, este
diagrama probablemente será todo lo que necesite para obtener los valores del tono.
Si, sin embargo, está transcribiendo directamente de alguna música escrita, enton-
ces, le sugerimos que dibuje un diagrama del pentagrama con el valor del tono es-
crito contra cada línea y espacio, teniendo en cuenta la tecla.
Por ejemplo, teclee:
135
Capítulo 19
Hemos puesto dos líneas suplementarias, sólo las necesarias. Observe cómo
la nota «mi» baja en la armadura afecta no solamente a la nota «mi» en el es-
pacio superior, bemolizándole de 16 a 15, sino también la nota «mi» en la línea in-
ferior, bemolizándola de 4 a 3. Ahora debe ser bastante fácil encontrar el valor del
tono de cualquier nota en el pentagrama.
Si desea cambiarla clave de la pieza, lo mejor que puede hacerse es establecer
una clave, clave, variable e insertar clave + antes de cada valor de tono;
así, la segunda línea se hace:
Antes de que ejecute un programa debe dar a key el valor adecuado: O para
«do» en tono menor, 2 para «re» en tono menor, 12 para «do» en tono menor una oc-
tava superior y así sucesivamente. Puede conseguir afinar el ordenador con otro ins-
trumento ajustando key, empleando valores fraccionarios.
También puede establecer las duraciones de todas las notas. Puesto que se
trata de una pieza bastante lenta, hemos fijado un segundo para una negra y el res-
to se basan en ello, medio segundo para una corchea y así sucesivamente.
Es más flexible establecer una variable, crochet, para almacenar la longitud
de una negra y especificar las duraciones en función de ella. A continuación, la
línea 20 se haría:
136
Capítulo 19
Tocará notas tan altas como pueda y luego se interrumpirá con el mensaje de
error B integer out of range. Puede imprimir n para averiguar cuán altas fueron las
notas conseguidas.
Pruebe lo mismo pero bajando las notas. Las notas muy bajas sonarán como chas-
quidos; de hecho, las notas más altas también están constituidas por chasquidos
de la misma forma, pero más rápidos, por lo que el oído no puede distinguirlos.
Solamente la gama media de notas son realmente buenas para la música; las
notas bajas suenan demasiado como chasquidos y las notas altas son agudas y tien-
den a gorjear un poco.
Introduzca por el teclado la línea de programa siguiente:
10 BEEP .5,0: BEEP .5,2: BEEP .5,4: BEEP .5,5: BEEP .5,7:
BEEP .7,9: BEEP .5,11: BEEP .5,12: STOP
Con ella se toca la escala de «do» en tono mayor, que utiliza todas las
notas «blancas» en el piano desde la nota «do» media a la siguiente nota «do»
arriba. La forma en que esta escala se armoniza es exactamente la misma que en
un piano y se denomina afinación plácida, porque el intervalo de altura de un semi-
tono es el mismo a lo largo de toda la escala. Sin embargo, un violi-
nista tocaría la escala de forma muy poco diferente, ajustando todas las notas para
hacerlas sonar más agradable al oído. Puede hacerlo moviendo sus dedos muy lige-
ramente hacia arriba o hacia abajo en las cuerdas de una forma que un pianista no
puede hacer.
La escala natural, que es lo que toca el violinista, se obtiene con:
Quizá pueda, o no pueda, ser capaz de detectar cualquier diferencia entre estas
dos; algunas personas sí pueden. La primera diferencia notable es que la tercera
nota es algo más baja en la escala naturalmente afinada. Si usted es un perfeccionista
real, podría desear programar sus armonías para utilizar esta escala natural en lugar
de la plácida antes adoptada. La desventaja es que aunque actúa perfectamente
137
Capitulo 19
en la clave de la nota «do», en otras no sucede lo mismo (todas ellas tienen sus pro-
pias escalas naturales) y en algunas, lo hace muy mal. La escala uniformemente tem-
perada (plácida) está solamente algo desactivada y opera igualmente bien en todas
las claves o tonos.
Esto es menos problema en el ordenador, por supuesto, porque puede utilizar
el artilugio de añadir una clave, key, variable.
Alguna música, especialmente la música india, utiliza intervalos de altura in-
ferior a un semitono. Puede programarlos en una sentencia BEEP sin ninguna di-
ficultad; por ejemplo, el cuarto de tono por encima de la nota «do» media tiene un
valor de altura acústica de 0,5.
Puede hacer que el teclado suene como una bocina, en vez de con
chasquidos, mediante:
POKE 23609,255
El segundo número determina la longitud del sonido de bocina (pruebe con div-
ersos valores entre 0 y 255). Cuando es 0, el sonido es tan corto que parece un
chasquido suave.
Si está interesado por hacer más con el sonido del Spectrum, como oír el sonido
que BEEP produce en algo distinto al altavoz interno, encontrará que la señal está
presente en las conexiones del micrófono y del auricular. estará a un nivel más alto
en la de los auriculares, pero, de cualquier modo, son las mismas. Puede usar
esta característica para conectar un auricular o un par de auriculares a su Spectrum.
Con ello no se cortará el altavoz interno. Si está realmente ansioso de producir mucho
ruido podría conectarle hasta un amplificador (la conexión «MIC» probablemente
le proporcionará el nivel correcto) o podría registrar el sonido en una cinta y con-
seguir que el Spectrum lo toque conjuntamente.
No deteriorá al Spectrum aunque cortocircuite las conexiones «MIC» o «EAR»,
por lo que debe experimentar para encontrar la mejor prestación para lo que
quiera hacer.
Ejercicio
138
Capítulo 20
Almacenamiento en cinta
Resumen
LOAD, SAVE, VERIFY, MERGE
1 PRINT 1
2 PRINT 2
10 PRINT 10
20 LET x = 20
y luego, proceda como para la verificación, pero sustituyendo VERIFY «dice» por:
MERGE "dice"
Si efectúa el listado del programa, puede ver que han sobrevivido las líneas
1 y 2, pero que las líneas 10 y 20 se han sustituido por las del programa de dados.
x también ha sobrevivido (pruebe PRINT x).
Ya ha visto formas sencillas de las cuatro sentencias utilizadas con la cinta
de cassette:
En cada una de ellas, la palabra clave va seguida por una cadena; para SAVE
ello proporciona un nombre para el programa en cinta, mientras que para las otras
tres, comunica al ordenador qué programa buscar. Mientras realiza la búsqueda,
imprime el nombre de cada programa que encuentra. Hay un par de peculiaridades
interesantes para todo ello.
Para VERIFY, LOAD y MERGE, puede proporcionar la cadena vacía como el
nombre para buscar; entonces, el ordenador no tiene que preocuparse del nombre,
sino que toma el primer programa que se encuentra.
141
Capítulo 20
entonces, SAVE toma la matriz b del ordenador y la almacena en cinta con el nom-
bre «Bloggs". Cuando teclea:
encuentra la matriz en la cinta y luego (si hay espacio para ella en el ordenador)
borra cualquier matriz ya existente, denominada b y carga la nueva matriz pro-
cedente de la cinta, a la que llama b.
No puede utilizar MERGE con matrices almacenadas.
Puede almacenar matrices de caracteres (cadenas) de la misma forma. Cuando el
ordenador está buscando la cinta y encuentra una de estas, escribe «Matriz de ca-
racteres»: seguida por el nombre. Cuando carga una matriz de caracteres, no
borrará solamente cualquier matriz de caracteres anterior con el mismo nombre,
sino también cualquier cadena con el mismo nombre.
El almacenamiento de bytes se utiliza para fragmentos de información sin
ninguna referencia a lo que se aplica la información que podría ser: una
142
Capítulo 20
imagen de televisión o gráfico definido por el usuario o algo que haya elaborado
por si mismo. Se muestra con el empleo de la palabra CODE, como en:
Este es un caso raro para el que no operará VERIFY. Tenga en cuenta que VERIFY
escribe los nombres de lo que encuentra en la cinta, de modo que en el momento
en que llega a la verificación se ha cambiado el fichero de la presentación visual
y falla la verificación. En todos los demás casos, debe utilizar VERIFY siempre
que emplee SAVE.
143
Capítulo 20
SAVE
Conserva información en cinta bajo el nombre dado. El error F se produce cuan-
do el nombre está vacío o tiene 11 o más caracteres.
SAVE siempre pone un mensaje «Start tape, then press any key» (ponga en mar-
cha cinta, luego pulse cualquier tecla) y espere a que se pulse una tecla antes de
conservar algo.
1. Programa y variables:
SAVE nombre
es la forma normal.
conserva el programa y variables de tal forma que la carga LOAD se sigue auto-
máticamente con
GO TO número de línea
SAVE nombre LINE es equivalente a SAVE nombre LINE 1, de modo que cuando
se cargue el programa, se ejecute por sí mismo desde el principio.
2. Bytes:
es equivalente a
144
Capítulo 20
3. Matrices:
VERIFY
Comprueba la información en cinta con respecto a la información existente en
memoria. La falta de verificación da el informe de error R Tape loading error
(error de carga de cinta).
1. Programa y variables:
VERIFY nombre
2. Bytes:
comprueba los bytes de nombre en cinta con respecto a los que hay en memoria
que comienzan en la dirección comienzo.
comprueba los bytes en nombre en la cinta con respecto a los que hay en memoria
que comienza en la dirección a partir de la cual se conservó el primer byte de
cassette.
es equivalente a:
145
Capítulo 20
3. Matrices:
LOAD
carga nueva información a partir de la cinta, borrando de la memoria la
anterior información.
1. Programa y variables:
LOAD nombre
2. Bytes:
3. Matrices:
146
Capítulo 20
borra cualquier matriz ya denominada letra o letra $ (según sea adecuado) y forma
una nueva a partir de la matriz almacenada en cassette.
El error 4 Out of memory se produce si no hay espacio para matrices nuevas.
No se borran las matrices anteriores.
MERGE
Carga la nueva información desde cassette sin borrar la anterior información
de la memoria.
1. Programa y variables:
MERGE nombre
2. Bytes:
Imposible
3. Matrices:
Imposible
Ejercicios
1. Haga una grabación en cassette en la que el primer programa, cuan-
do se carga, imprime un menú (una lista de los demás programas en la
cassette), le pida que elija un programa y luego, lo carga.
2. Tome el gráfico de piezas de ajedrez del capítulo 14 y luego, teclee NEW y se se-
guirán conservando. Sin embargo, no se conservarán cuando se desconecte
el ordenador; si desea mantenerles, debe conservarlos en cita, utilizando SAVE
con CODE. La forma más fácil de conservar los veintiún gráficos de-
finidos por el usuario mediante:
seguida por:
147
Capítulo 20
del primero de los ocho bytes que determinan la configuración del primer gráfico
definido por el usuario y el número de bytes a conservar es 21*8 (8 bytes
por cada uno de los 21 gráficos).
Para una nueva carga, normalmente utilizaría
USR permite el hecho de que el gráfico debe cargarse de nuevo en una direc-
ción diferente.
148
Capítulo 21
La Impresora ZX
Resumen
LPRINT, LLIST, COPY
Nota. Ninguna de estas sentencias es de BASIC estándar, aunque LPRINT se uti-
liza por otros ordenadores.
COPY
Observe que COPY no actúa con uno de los istados que el ordenador realiza
automáticamente, porque se suprime siempre que se obedezca una orden o comando.
Debe utilizar primero LIST o bien emplear LLIST y prescindir de COPY.
Siempre puede parar la impresora, cuando esté funcionando, al pulsar la tecla
BREAK (CAPS SHIFT y SPACE).
Si ejecuta estas sentencias sin la impresora conectada, se perderá toda la salida
y se proseguirá con la siguiente sentencia.
Pruebe el programa siguiente:
10 FOR n = 31 TO 0 STEP -1
20 PRINT AT 31-n,n; CHR$ (CODE "0" + n);
30 NEXT n
151
Capítulo 21
Ejercicio
152
Capítulo 22
155
Capitulo 23
IN y OUT
Resumen
OUT
IN
El procesador puede leer de, y (al menos con RAM) escribir en, la me-
moria utilizando PEEK y POKE. Al procesador, en sí mismo, no le importa realmen-
te si la memoria es ROM, RAM o incluso nada en absoluto; sabe que hay
65536 direcciones de memoria y puede leer un byte de cada una (aunque sea algo
sin sentido) y escribir un byte en cada una (aunque se pierda). De una forma comple-
tamente análoga, hay 65536 de los que se llaman "ports'' de E/S (que significa co-
nectores de entrada/salida). Estos se utilizan por el procesador para comunicar con
elementos tales como el teclado o la impresora y pueden controlarse por el BASIC
utilizando la función IN y la sentencia OUT.
IN dirección
escribe el valor dado al «port» con la dirección dada. La forma en que se interpreta
la dirección depende, en gran medida, del resto del ordenador; con bastante fre-
cuencia, muchas direcciones diferentes significan lo mismo. En el Spectrum es
mejor imaginar que la dirección se escribe en binario, porque los bits individuales
tienden a operar con independencia. Hay 16 bits, que llamaremos (utilizando A
para indicar dirección).
159
Capítulo 23
En el byte leído, los bits D0 a D4 significan las cinco teclas en la semifila dada
(D0 para la tecla exterior, D4 para la más cercana a la parte central. El bit es 0 si la
tecla está pulsada y es 1 si no lo está. D6 es el valor en la conexión EAR.
La dirección de 'port' 254 utilizada como salida excita el altavoz (D4) y la cone-
xión microfónica MIC (D3) y también establece el color del contorno (D2, D1 y DO).
La dirección de 'port' 251 maneja la impresora, tanto en lectura como en escri-
tura: la lectura averigua si la impresora está preparada para imprimir más datos
y la escritura envía puntos a imprimir.
Las direcciones de 'port' 254, 247 y 239 se emplean para los dispositivos su-
plementarios mencionados en el capitulo 22.
Ejecute el programa siguiente:
y juegue pulsando teclas. Cuando se haya aburrido con cada semifila, pulse BREAK
y luego, teclee:
NEXT n
160
Capítulo 24
La memoria
Resumen
CLEAR
Es probable que todos estos octetos carezcan de significado para el lector, pero
la pastilla procesadora los entiende como instrucciones que le indican qué hacer.
Para variar el contenido de una casilla (si es de RAM), empleamos la
sentencia POKE (introducir), cuya forma es
POKE 31000,57
para probarlo. (Trate de ejercer la función POKE con otros valores para comprobar
que no hay trampa). Los nuevos valores han de estar comprendidos entre
-255 y + 255 y si el elegido es negativo. entonces, se le añade 256.
La función POKE otorga un poder «inmenso» sobre el ordenador siempre que
se la sepa emplear y posibilidades destructoras enormes si no se sabe. Es muy fácil
echar a perder un programa que costó horas de teclado, mediante el ejercicio de
POKE con un valor incorrecto en una dirección equivocada. Afortunadamente, ello
no producirá al ordenador ningún daño permanente.
Echaremos, ahora, un vistazo más detallado a la manera en que se usa la RAM,
pero no se moleste en leerlo si no le interesa el tema.
La memoria está dividida en zonas diferentes (que se muestran en el diagrama
grande) para almacenar distintos tipos de información. Estas zonas son sólo sufi-
cientemente grandes para contener la información que contienen realmente, por lo
que si se añade algo más en algún punto determinado (por ejemplo, incluyendo una
línea de programa o una variable) se hace sitio empujando hacia arriba todo lo que
queda por encima de este punto. Y al contrario si se borra información, entonces
todo se empuja hacia abato.
El archivo para la representación en pantalla almacena una imagen de televisión.
Resulta bastante curioso el modo en que está presentado, por lo que es probable
que se prefiera no ejercer en ella las funciones PEEK y POKE. Cada carácter de la
pantalla posee un cuadrado de 8x8 puntos y cada punto puede tomar el valor 0
(papel) o 1 (tinta). así, utilizando la notación binaria se puede almacenar la confi-
guración como 8 octetos, uno para cada fila. Sin embargo, estos 8 octetos no se al-
macenan juntos, sino que lo hacen las filas correspondientes de los 32 caracteres
de una línea sencilla, como una traza de 32 octetos, ya que esto es lo que necesita
el haz electrónico de la televisión a medida que barre la pantalla de izquierda a
derecha. Comoquiera que la imagen completa tiene 24 líneas de 8 barridos cada una,
podría esperarse que hubiera que almacenar 172 barridos en total correlativos, pero
no es verdad. Primero vienen las trazas superiores de las líneas 0 y 7, después, el
siguiente barrido de las mismas líneas de 0 a 7 y así hasta llegar a la línea inferior'
de las citadas líneas de 0 a 7. A continuación, se repite el mismo proceso para las
líneas de 8 a 1 5 y, tras ello, se hace lo mismo con las líneas de 16 a 23.
El resultado final de todo esto es que si estamos habituados a un ordenador que usa
las funciones PEEK y POKE en la pantalla, habrá que cambiarse a usar SCREEN$
y PRINT AT en su lugar, o PLOT y POINT.
Los atributos son los colores, etc., para cada posición de carácter, me-
diante el uso de ATTR. Todo ello se alma cena línea tras línea en el orden que
se espera.
La memoria temporal de la impresora almacena los caracteres destinados a im-
presión.
Las variables del sistema contienen varios elementos de información que indi-
can al ordenador en qué estado se halla. Como están completamente listadas en el
capítulo próximo. nos conformaremos por el momento con destacar que existen
algunas (llamadas CHANS, PROG, VARS, E_LINE, etc.) que contienen las direc-
iones de los límites entre !as diversas zonas de la memoria. No son variables de
BASIC, por lo que sus nombres no serán identificados por el ordenador.
164
Capítulo 24
165
Capítulo 24
Los mapas de la unidad Microdrive sólo existen cuando se utiliza este dispo-
sitivo, por lo que, normalmente, sus posiciones están vacías.
La zona para información de los canales contiene la información pertinente
sobre los dispositivos de entrada y salida, es decir, el teclado (con la mitad inferior
de la pantalla), la mitad superior de la pantalla y la impresora.
Cada línea del programa BASIC tiene la forma:
Nótese que, a diferencia con todos los demás casos de números representados
con 2 bytes, en el Z80, el número de línea se almacenará aquí con el byte más sig-
nificativo en cabeza: es decir: en el mismo orden en que se escriben.
Cualquier constante numérica del programa va seguida de su forma binaria,
empleando el carácter CHR$ 14 seguido de 5 bytes para el propio número.
Las variables poseen formatos diferentes de acuerdo con sus distintas natura-
lezas. Las letras que componen los nombres deben ser imaginadas partiendo de
las minúsculas:
166
Capítulo 24
167
Capítulo 24
El calculador es la parte del sistema BASIC que trata de la aritmética y los nú-
meros con los que opera están contenidos en su mayoría en su pila de memoria.
La parte sobrante contiene el espacio no usado hasta ahora.
La pila de la máquina es la que usa el procesador del Z80 para contener las direc-
ciones de retorno y elementos similares.
La pila para GOSUB se mencionó ya en el capítulo 5.
El byte hacia el que apunta RAMTOP tiene la d irección más alta que utiliza
el sistema BASIC. Aún cuando NEW borra la RAM, lo hace sin alterar los
gráficos definidos por el usuario. Se puede variar la dirección de RAMTOP poniendo
un número en una sentencia CLEAR.
Esta sentencia
(i) borra todas las variables
(ii) borra el fichero de la representación visual (como CLS)
(iii) reajusta la posición de PLOT a la esquina inferior izquierda.
(iv) ejecuta una restauración (RESTORE)
(v) borra la pila de GOSUB y la coloca en el nuevo límite definido por RAMTOP
(suponiendo que queda entre la pila de cálculo y el final físico de la RAM).
En cualquier otro caso, deja el límite del RAMTOP donde estaba.
168
Capítulo 24
RUN también produce borrado como CLEAR, aunque nunca altera el valor
de la RAMTOP.
Utilizando de esta manera la instrucción CLEAR es posible tanto subir el límite
RAMTOP de modo que se haga más sitio para el BASIC recubriendo los gráficos de-
finidos por el usuario, como llevar el limite RAMTOP hacia abajo permitiendo más
cantidad de RAM de la prevista en la instrucción NEW.
Teclee NEW y después CLEAR 23800, para hacerse una idea de lo que ocurre
en la máquina cuando se llena.
Una de la primeras cosas que se notará cuando se comienza a escribir un pro-
grama es que el ordenador deja de aceptar entradas y hace sonar el zumbador.
Esto significa que el ordenador está repleto y hay que vaciarlo ligeramente. Existen,
además, dos mensajes de error cuyo significado es muy parecido: 4 Memory full
(Memoria completa) y G No room for line (No hay sitio para más líneas).
El zumbador suena también cuando se escribe una línea más larga de 23 líneas;
sin embargo, el mensaje no se pierde, aunque no pueda verse (el zumbador suena
como disuasión para escribir algo más).
Se puede ajustar la duración del zumbido mediante la instrucción POKE en la
dirección 23608. La duración normal correspondiente al número 64 puede ser sus-
tituida por otro número.
Cualquier número (a excepción del 0) puede escribirse únicamente como
± mx2e
donde ± es el signo
m es la mantisa y queda entre 1/2 y 1 (no puede ser 1),
y e es el exponente, un número entero (posiblemente negativo).
un medio se escribe .1
un cuarto se escribe .01
tres cuartos se escriben .11
una décima se escribe .000110011001100110011 ... etc. Nuestro número m, es
menor que la unidad, por lo que su representación binaria carece de cifras antes
del punto (coma en español) decimal. Y como quiera que su menor valor es 1/2, el
bit que sigue inmediatamente al punto (coma en español) decimal es siempre un 1.
1/10 = 4/5x2-3
170
Capitulo 25
PEEK n + 256*PEEK (n + 1)
173
Capítulo 25
174
Capítulo 25
175
Capítulo 25
10 FOR n=0 TO 21
20 PRINT PEEK (PEEK 16400+256*PEEK 16401 +n)
30 NEXT n
Esto último proporciona los primeros 22 octetos de la zona del programa. Com-
páreselo con el propio programa.
176
Capítulo 26
Este capítulo está concebido para quienes entienden el código máquina del
Z80, que es el conjunto de instrucciones que utiliza el microprocesador Z80. Si no es
su caso, pero le gustaría conocerlo, hay mucha bibliografía sobre esta materia y no le
será difícil encontrar un libro adecuado en una librería especializada.
Estos programas suelen estar escritos en lenguaje ensamblador, que, aunque
sea algo especial, no resulta demasiado difícil de entender con la práctica (puede
consultar las instrucciones de lenguaje ensamblador en el apéndice A). Sin
embargo, para ejecutarlos en el ordenador necesita codificar el programa en una se-
cuencia de bytes (en esta forma, se denomina código máquina). Esta tra-
ducción suele hacerse por el propio ordenador, con el empleo de un programa llamado
ensamblador. No hay ningún ensamblador incorporado en el Spectrum, pero puede
adquirir uno en cassette. Si no lo adquiere, tendrá que hacer la traducción por
sí mismo, a condición de que el programa no sea demasiado largo.
A título de ejemplo, sea el programa:
1d, bc, 99
ret
que carga el par de registros bc con 99. Traduce a los cuatro bytes de código má-
quina 1,99,0 (por Id, bc, 99) y 201 (por ret). (Si busca 1 y 201 en el Apéndice A, en-
contrará Id, bc, NN (en donde NN significa cualquier número de dos bytes) y ret.).
Cuando tenga su programa de código máquina, el siguiente paso es conseguir
su introducción en el ordenador (probablemente, un ensamblador haría esta tarea
de forma automática). Necesita decidirse en qué lugar de la memoria ha de ponerse
y lo mejor que se puede hacer es conseguir espacio suplementario para tal objeto
entre la zona del BASIC y los gráficos definidos por el usuario.
Supongamos, por ejemplo, que tiene una memoria de 16K para el Spectrum.
Para comenzar, el extremo superior de la RAM tiene:
Si teclea:
CLEAR 32499
179
Capítulo 26
10 LET a = 32500
20 READ n: POKE a,n
30 LET a = a + 1: GO TO 20
40 DATA 1,99,0,201
(se producirá una interrupción con el informe E Out of DATA cuando haya rellenado
los cuatro bytes que especificó).
Para ejecutar el código máquina, ha de emplear la función USR, pero esta vez
con un argumento numérico, la dirección de comienzo. Su resultado es el valor del
registro bc en el retorno desde el programa en código máquina, por consiguiente,
si hace:
180
Capítulo 26
Haga primero:
y luego:
181
Apéndice A
El Juego de Caracteres
A continuación se da el juego de caracteres del Spectrum completo, con códigos en
decimal y hexadecimal. Si se imagina los códigos como las instrucciones de código
máquina del Z80, entonces, las columnas de la derecha dan los mnemotécnicos (nemó-
nicos en la jerga informática) de lenguaje ensamblador correspondientes. Como pro-
bablemente sepa si está versado en estos temas, algunas instrucciones del Z80 son
compuestas comenzando con CBh o EDh; las dos columnas de la derecha las indican.
Código Carácter Hex Ensamblador -Después -Después
del Z80 de CB de ED
0 00 nop rlc b
1 01 ld bc, NN rlc c
2 02 ld (bc), a rlc d
3 03 inc bc rlc e
4 04 inc b rlc h
5 05 dec b rlc l
6 PRINT coma 06 ld b,N rlc (hl)
7 EDIT 07 rlca rlc a
8 cursor izquierda 08 ex af,af’ rrc b
9 cursor derecha 09 add hl,bc rrc c
10 cursor abajo 0A ld a,(bc) rrc d
11 cursor arriba 0B dec bc rrc e
12 DELETE 0C inc c rrc h
13 ENTER 0D dec c rrc l
14 número 0E ld c,N rrc (hl)
15 no utilizado 0F rrca rrc a
16 INK control 10 djnz DIS rl b
17 PAPER control 11 ld de,NN rl c
18 FLASH control 12 ld (de),a rl d
19 BRIGHT control 13 inc de rl e
20 INVERSE control 14 inc d rl h
21 OVER control 15 dec d rl l
22 AT control 16 ld d,N rl (hl)
23 TAB control 17 rla rl a
24 18 jr DIS rr b
25 19 add hl, de rr c
26 1A ld a,(de) rr d
27 1B dec de rr e
28 1C inc e rr h
29 1D dec e rr l
30 1E ld e,N rr (hl)
31 1F rra rr a
32 espacio 20 jr nz,DIS rr (hl)
33 ! 21 ld hl,NN sla c
34 “ 22 ld (NN),hl sla d
35 # 23 inc hl sla e
36 $ 24 inc h sla h
37 % 25 dec h sla l
183
Apéndice A
184
Apéndice A
185
Apéndice A
186
Apéndice A
187
Apéndice A
188
Apéndice B
Informes
Aparecen en las dos últimas líneas de la pantalla cada vez que el ordenador
cesa de ejecutar el programa BASIC y explican la causa de su parada, sea por ra-
zones naturales, sea porque se ha producido algún error.
El informe posee un número o letra codificados que hace posible acudir a la
tabla que a continuación se presenta, en donde un breve mensaje explica lo que
ha ocurrido, así como el número de línea y de sentencia dentro de la línea donde se
detuvo el programa. (Como línea 0 aparece un comando. Dentro de una línea, la
sentencia 1 es la del principio, la sentencia 2 sigue inmediatamente al primer signo
de dos puntos o a THEN, y así sucesivamente).
El comportamiento de CONTINUE depende, en gran manera, de los mensa-
jes de información. Normalmente, CONTINUE va a la línea y sentencia especifica-
das en el último informe, pero hay excepciones con los informes 0, 9 y D. (Véase
también el Apéndice C).
He aquí la tabla que muestra todos los informes. También indica las circunstan-
cias en que puede producirse el mensaje y ello hace referencia al Apéndice C. Por
ejemplo, el error A Invalid argument (Argumento no válido), puede producirse
con SQR, IN, ACS y ASN, siendo las entradas de estas funciones, en el apéndi-
ce C, las encargadas de señalar exactamente qué argumentos no son válidos.
0 OK Cualquiera
Terminación satisfactoria o salto a un número de
línea mayor que todos los existentes. Este informe
no altera la línea y sentencia a que salta CONTINUE
189
Apéndice B
Código Significado Situación
de la lista de datos.
F Invalid file name (Nombre de archivo no válido) SAVE
Se ha asignado a la función SAVE un nombre va-
cío o de más de 10 caracteres.
G No hay bastante sitio en la memoria para admitir Cuando se añade una
una nueva línea del programa. línea al programa
H STOP in INPUT (STOP en los datos de entrada) INPUT
Algún dato de entrada (INPUT) empezaba con
STP, o se apretó esta tecla durante la introducción
de una línea (INPUT LINE).
Al contrario que el informe 9, tras el informe H la
función CONTINUE se comportará normalmente
si se repite la sentencia INPUT
I For without NEXT (FOR sin NEXT) FOR
Había un lazo FOR para ser ejecutado ninguna
vez (p.e. FOR n=1 TO 0) y la sentencia NEXT
correspondiente no aparece.
J Invalid I/O device (Dispositivo de entrada/salida no Operaciones con
válida) Microdrive
K Invalid colour (Color no válido)
El número especificado no es un valor apropiado. INK, PAPER,
BORDER, FLASH,
BRIGHT, INVERSE,
OVER, también tras
uno de los caracteres de
control
correspondientes
L BREAK into Program (Hay un BREAK en el pro- Cualquiera
grama.
La tecla de BREAK fue oprimida y ello se detectó
entre dos sentencias. El número de línea y el de
sentencia que aparecen en el informe se refieren a la
sentencia en curso, antes de que se oprimiera
la tecla de BREAK, pero la sentencia CONTINUE
salta a la siguiente (permitiendo que se ejecute
cualquier salto), por lo que no se repite ninguna
sentencia.
M RAMTOP no good (RAMTOP incorrecto) CLEAR, posiblemente
El número especificado como RAMTOP es muy en RUN
grande o muy pequeño.
N Statement lost (sentencia perdida). RETURN, NEXT, y
Salta a una sentencia que ya no existe. CONTINUE
O Invalid Stream (Serie no válida) Operaciones con el
microdrive, etc.
P FN without DEF (FN sin DEF) FN
Función definida por el usuario.
191
Apéndice B
192
Apéndice C
El teclado
Los caracteres del ZX Spectrum no sólo comprenden los símbolos sencillos (le-
tras, dígitos, etc.), sino también los comandos (palabras clave, nombres de fun-
ción, etc.) y todos ellos se introducen por teclado sin tener que ser deletreados. Para
conseguir todas estas funciones y comandos u órdenes algunas teclas poseen
5, y más, significados distintos, dados en parte mediante el cambio de teclas (es de-
cir, oprimiendo la tecla CAPS SHIFT o la SYMBOL SHIFT a la vez que la tecla con-
siderada) y en parte, por tener la máquina en los diferentes modos.
El modo está indicado por el cursor , una letra que parpadea e indica dónde
se va a insertar el siguiente carácter del teclado.
El modo K (Keyword -palabra clave) reemplaza automáticamente al modo L
cuando la máquina está esperando una orden o una línea del programa (en vez de
datos de entrada, o INPUT data) y de su posición en la línea se sabe lo que debe
venir, si un número de línea o una palabra clave. Esto es al principio de la línea,
o exactamente detrás de THEN, o exactamente detrás del símbolo «:» (excepto en
una cadena). Si no se cambia de modo, la siguiente pulsación de tecla se inter-
pretará bien como una palabra clave (escrita sobre la tecla) o bien como un dígito.
El modo L (letras) es el modo en el que por defecto, de encuentra el ordenador
una vez introducido un comando. En este modo, se puede escribir cualquier
carácter alfanumérico.
En ambos modos K y L, una tecla pulsada a la vez que la de SYMBOL SHIFT
se interpreta como el carácter rojo escrito sobre la tecla. Y un número pulsado a la
vez que la tecla de CAPS SHIFT se interpreta como la función de control escrita en
blanco sobre la tecla. La tecla de CAPS SHIFT, en modo K, no produce ningún
efecto y en el modo L convierte las minúsculas en mayúsculas.
El modo C (de mayúsculas, o CAPITALS) es una variante del modo L en el que
todas las letras aparecen en mayúsculas. CAPS LOCK es una tecla que produce el
cambio del modo L al modo C y al revés.
El modo E (extendido) se usa para obtener otros comandos («to-
kens»). Se accede pulsando simultáneamente las dos teclas de SHIFT (CAPS SHIFT
y SIMBOL SHIFT) y permanece activo durante una pulsación.
Una vez que haya obtenido el cursor .E., podrá escribir cualquier comando
indicado en verde (parte superior de cada tecla), simplemente pulsando la tecla
deseada. Para escribir aquellos comandos que estén señalados en rojo (parte infe-
rior de cada tecla) -y los que también se accede en modo .E. -, deberá pulsar
las dos teclas SHIFT, y a continuación, pulsar la tecla SYMBOL SHIFT juntamente
con la tecla deseada.
El modo G (GRAPHICS) se activa cuando se pulsa la tecla GRAPHICS (CAPS
SHIFT y 9) y permanece hata que se vuelve a pulsar dicha tecla. Una tecla numé-
rica produce un gráfico tipo mosaico, a excepción de las teclas GRAPHICS (9) y
DELETE (0) que desavtivan el modo gráfico o borran un carácter respectivamente.
El resto de las teclas, excepto las teclas v, w, x, y y z, producen un
gráfico definido por el usuario.
193
Apéndice C
Cualquier tecla que sea retenida por más de 2 ó 3 segundos produce la repe-
tición automática.
Los símbolos introducidos por teclado aparecen en la parte inferior de la pan-
talla y se insertan en la posición en la que se encuentra el cursor. El cursor
se puede desplazar hacia la izquierda con CAPS SHIFT y 5, o hacia la derecha con
CAPS SHIFT y 8. Se puede borrar el carácter anterior al cursor con DELETE
(CAPS SHIFT y 0). (Nota: se puede borrar la línea entera tecleando EDIT (CAPS
SHIFT y 1) seguido de ENTER).
Cuando se pulsa ENTER, se ejecuta la línea, se la incluye en el programa, o
se la toma como dato de entrada, según convenga salvo que contenga algún error
de sintaxis. En este caso aparecerá junto al error un .?. intermitente.
A medida que se introducen líneas de programa se va presentando su listado
en la mitad superior de la pantalla. La forma en que se origina la lista es bastante
complicada y se explica más completamente en el capítulo 2. La última línea intro-
ducida se denomina línea en curso y está indicada por el símbolo .>. , pero se la
puede cambiar con la ayuda de las teclas (CAPS SHIFT y 6) y (CAPS
SHIFT y 7).
Si se pulsa EDIT (CAPS SHIFT y 1), la línea en curso se copia en la mitad in-
ferior de la pantalla y puede ser corregida por edición.
Cuando se ejecuta una orden, o se pone en marcha un programa, la salida se
presenta en la mitad superior de la pantalla y queda allí hasta que se introduce una
línea de programa, se pulsa ENTER junto con una línea vacía o se pul-
sa o . En la mitad inferior aparece un informe que muestra un código (dí-
gito o letra) referenciado en el Apéndice B, y que significa el número de la línea
que contiene la última sentencia ejecutada (o 0 si es una orden) y la posición de la
sentencia dentro de la línea. El informe permanece en la pantalla hasta que se pulsa
alguna tecla (que cambia al modo K).
En ciertas circunstancias, las teclas CAPS SHIFT y SPACE actúan en conjunto
como un BREAK (ruptura) parando el ordenador, apareciendo el informe D o el L.
Esto se reconoce:
La pantalla de televisión
194
Apéndice C
195
Apéndice C
La impresora
196
Apéndice C
El BASIC
Los números se almacenan con una exactitud de 9 ó de 10 dígitos . El mayor nú-
mero que puede conseguir es 1038 aproximadamente y el número (positivo) más
pequeño es 4*10-39
Un número se almacena en el ZX Spectrum en binario de coma flotante con un
byte de exponente e (1 < = e < = 255) y cuatro bytes de mantisa m (1/2 < = m < 1).
Ello representa el número m*2e-128
Puesto que 1/2 < = m < 1, el bit más significativo de la mantisa m es siempre 1.
Por consiguiente, en la realidad, podemos sustituirlo con un bit para indicar el signo
(0 para números positivos y 1 para negativos).
Los números enteros pequeños tienen una representación especial en la que
el primer byte es 0, el segundo es un bit de signo (O o FFh) y los bytes tercero y
cuarto son los enteros en la forma de complemento a 2, con el byte menos signifi-
cativo primero.
Las variables numéricas tienen nombres de longitud arbitraria, que comienzan
con una letra y continúan con letras y dígitos. Los espacios y los controles de colores
se ignoran y todas las letras se convierten en minúsculas.
Las variables de control de los bucles FORT-NEXT tienen nombres con una sola
letra de longitud.
Las matrices numericas tienen nombres de una sola letra de longitud, que pue-
den ser los mismos que el nombre de una variable simple. Pueden tener, arbitra-
riamente, muchas dimensiones de magnitud arbitraria. Los subíndice co-
mienzan en 1.
Las cadenas tienen una longitud completamente flexible. El nombre de una ca-
dena está constituido por una sola letra seguida por $.
Las matrices de cadena pueden tener, arbitrariamente, muchas dimensiones
de magnitud arbitraria. El nombre es una sola letra seguida por $ y quizás no sea
el mismo que el nombre de una cadena. Todas las cadenas en una matriz dada tienen
la misma longitud fija, que se especifica como una dimensión final suplementaria
en la sentencia DIM. Los subíndices comienzan en 1.
Fragmentación («troceado»): Las subcadenas de cadenas pueden especificarse
con el empleo de «slicers» (troceadores), que pueden ser
(i) vacío
o
(ii) expresión numérica
o
(iii) expresión numérica optativa TO expresión numérica optativa y se emplea
para expresar una subcadena mediante
Funciones
El argumento de una función no necesita paréntesis si es una constante o una va-
riable (con subíndice o «troceada», posiblemente).
200
Apéndice C
Operación Prioridad
Sentencias
En esta lista
α representa una sola letra
v representa una variable
x. y, z, representan expresiones numéricas
m, n representan expresiones numéricas que se redondean al ente-
ro más próximo
e representa una expresión
f representa una expresión valorada de cadena
s representa una secuencia de sentencias separadas por dos
puntos :
c representa una secuencia de elementos de color, cada uno
terminado por comas o punto y coma ;. Un elemento de
color tiene la forma de una sentencia PAPER, INK, FLASH,
BRIGHT, INVERSE u OVER.
201
Apéndice C
202
Apéndice C
204
Apéndice C
Se produce el error K si n no es 0 ni 1.
PAPER n Como INK, pero controlando el color (fondo) del papel.
PAUSE n Interrumpe el cálculo y congela el contenido de la pan-
talla durante n imágenes (a 50 imágenes por segun-
do o a 60 imágenes en Norteamérica) o hasta que se
pulse una tecla.
0 <= n <= 65535; si estuviera fuera de estos límites,
se produciría el error B. Si n=0, entonces la pausa no
se temporiza, sino que dura hasta que se pulse una
tecla.
PLOT C; m, n Imprime una zona entintada (sujeta a OVER e INVER-
SE) en el pixel ( m , n ); mueve la posición del PLOT.
A no ser que los elementos de color c especifiquen
otra cosa, el color de tinta en la posición de carácter
que contiene el pixel se cambia al color de tinta per-
manente actual y las otras características (color de
papel, parpadeo y brillo) se dejan inalteradas.
0 <= m <= 255, 0 <= n <= 175; si estuviera fue-
ra de estos límites se produce el error B.
POKE m, n Escriba el valor m en el byte de memoria de direc-
ción m.
PRINT ... Los ... es una secuencia de elementos de impre-
sión PRINT, separados por comas, puntos y comas
o apóstrofes y se escriben en pantalla.
Un punto y coma (;) entre dos elementos no tiene nin-
gún efecto; se utiliza simplemente para separar los
elementos. Una coma produce el carácter de control
de coma y un apóstrofe produce el carácter ENTER.
Al final de la sentencia PRINT, si no finaliza en un
punto y coma, o coma, o apóstrofe, se imprime un
carácter ENTER.
Un elemento de impresión PRINT puede ser:
(i) vacío; es decir, nada
(ii) una expresión numérica
Primero se imprime el signo menos, si el valor
es negativo. Supongamos que sea x el módulo
del valor a imprimir.
Si x <= 10-5 o x >= 1013 entonces, se impri-
me utilizando la notación científica. La parte de
mantisa tiene hasta ocho dígitos (sin ningún cero a
la derecha) y la coma decimal (ausente, si sólo
hay un dígito) aparece después de la primera
cifra. La parte del exponente es E, seguido por
+ o - y, a continuación, uno o dos dígitos.
En otro caso, x se imprime en notación decimal
ordinaria con hasta ocho dígitos significativos y
sin ceros a la derecha después de la coma de-
cimal. Un punto (coma) decimal justo al principio
206
Apéndice C
207
Apéndice C
208
Apéndice D
Programas ejemplo
En este apéndice se incluyen algunos programas ejemplo para poner de mani-
fiesto las capacidades funcionales del ZX Spectrum.
El primero de estos programs requiere la introducción de una fecha y propor-
ciona el día de la semana que corresponde a esta fecha.
209
Apéndice D
10 INPUT "yardas?",yd,"pies?",ft,"pulgadas?",in
40 GO SUB 2000: REM imprimirlos valores
50 PRINT "igual a:";PRINT
70 GO SUB 1000: REM el ajuste
80 GO SUB 2000: REM imprimirlos valores ajustados
90 PRINT
100 GO TO 10
1000 REM subrutina para ajustar yd, ft, in a la forma normal
para yardas, pies y pulgadas
1010 LET in=36*yd+12*ft+in: REM ahora todo está en pulgadas
1030 LET s=SGN in: LET in=ABS in: REM trabajamos con in
positivo, reteniendo su signo en s
1060 LET ft=INT (in/12): LET in= (in-12*ft)*s: REM ahora in es correcto
1080 LET yd=INT (ft3)*s: LET ft=ft*s-3*yd: RETURN
2000 REM subrutina para imprimir yd, ft, in
2010 PRINT "yardas:";yd,,"pies:";ft,,"pulgadas:";in:PRINT: RETURN
210
Apéndice D
160 INPUT a$
170 NEXT m: NEW
5 REM pangolines
10 LET nq=100: REM número de preguntas y animales
15 DIM q$(nq,50): DIM a(nq,2): DIM r$(1)
20 LET qf=8
30 FOR n=1 TO qf/2-1
40 READ q$(n): READ a(n,1): READ a(n,2)
50 NEXT n
60 FOR n=n TO qf-1
70 READ q$(n): NEXT n
211
Apéndice D
212
Apéndice D
930 NEXT n
940 PRINT p$(TO n);: RETURN
213
Apéndice D
Veamos un programa para jugar al verdugo (también conocido como «juego del
ahorcado»). Un jugador introduce una palabra y el otro ha de adivinarla.
214
Apéndice D
215
Apéndice D
216
Apéndice E
Binario y hexadecimal
En este apéndice se describe cómo cuentan los ordenadores, con el empleo
del sistema binario.
La mayoría de los idiomas europeos utilizan para contar una configuración de de-
cenas más o menos regular; en español, por ejemplo, aunque comienza un poco
erráticamente, pronto se estabiliza en grupos regulares:
veinte, veintiuno, veintidós ... veintinueve
treinta, treinta y uno, treinta y dos ... treinta y nueve
cuarenta, cuarenta y uno, cuarenta y dos ... cuarenta y nueve
y así sucesivamente. Ello se hace incluso más sistemático con lo números arábigos
que utilizamos en nuestros sistemas de numeración. Sin embargo, la única razón para
emplear el número diez es que «casualmente» tenemos diez dedos.
En lugar de emplear el sistema decimal, con el número diez como base, los or-
denadores utilizan una forma de binario denominada hexadecimal (o hex. en abrevia-
tura), con base 16. Como sólo hay diez dígitos disponibles en nuestro sistema de
numeración, neceistamos seis dígitos suplementarios para realizar el contaje. Por
ello utilizamos A, B, C, D, E y F. ¿Y qué viene después de F? Lo mismo que nosotros,
con diez dedos, escribimos 10 para diez, los ordenadores escriben 10 para dieciséis.
Su sistema de numeración comienza:
. .
. .
9 nueve
. .
. .
19 veinticinco
1A veintiséis
1B veintisiete
1C veintiocho
. .
. .
. .
. .
1F treinta y uno
20 treinta y dos
217
Apéndice E
21 treinta y tres
. .
. .
F4 ciento ochenta
. .
. .
218
Apéndice E
Por esta razón, aunque estrictamente hablando los ordenadores utilizan un sis-
tema binario puro, los operadores suelen escribir los números almacenados en el in-
terior de un ordenador con el empleo de la notación hexadecimal.
Los bits en el interior del ordenador suelen estar agrupados en conjuntos de ocho,
o bytes. Un solo byte puede representar cualquier número desde cero a doscientos
cincuenta y cinco (11111111 en binario o FF en hexadecimal) o, como alternativa,
cualquier carácter incluido en el juego de caracteres del ZX Spectrum. Su valor puede
escribirse con dos dígitos hexadecimales.
Dos bytes pueden agruparse para constituir lo que técnicamente se denomina una
palabra. Una palabra puede escribirse utilizando 16 bits o 4 dígitos hexadecimales y
representa a un número desde 0 a 216 - 1 = 65535 (en decimal).
Un byte siempre está constituido por ocho bits, pero las palabras varían en lon-
gitud de un ordenador a otro.
La notación BIN del capítulo 14 proporciona un medio de escribir números en
binario en el ZX Spectrum: «BIN 0» representa a cero, «BIN 1» representa al uno,
«BIN 10» representa al dos y así sucesivamente.
Sólo puede utilizar «0» y «1» para esta notación, por lo que el número debe ser
un número entero no negativo; por ejemplo, no puede escribir «BIN -11» por -3,
sino que ha de escribir «-BIN 11». El número tampoco debe ser mayor que el decimal
65535 (esto es, no ha de tener más de 16 bits).
ATTR era realmente binario. Si convierte el resultado de ATTR en binario, pue-
de escribirlo en ocho bits.
El primero es 1 para parpadeo y 0 para no parpadeo.
El segundo es 1 para brillo especial y 0 para brillo normal.
Los tres siguientes son el código para el color del papel, escrito en binario.
Los tres últimos son el código para el color de la tinta, escrito en binario.
En os códigos de colores también se utiliza el binario: cada código escrito en bi-
nario puede escribirse con tres bits, el primero para verde, el segundo para rojo y
el tercero para azul.
Estos colores tienen un solo bit 1 en una de las tres posiciones. Sus códigos son
100, 010 y 001 en binario, o cuatro, dos y uno en decimal.
El negro no tiene nada visible, por lo que todos los bits son 0 (desactivación).
Por consiguiente, el código para el negro es 000 en binario o cero.
Los demás colores son mezclas de los anteriores, por lo que sus códigos tienen
dos o más bits 1.
219
Indice
Indice
Este índice incluye las teclas del teclado y cómo obtenerlas (el modo K., .L.,
.E., .C. o .G. y qué tecla de desplazamiento, cuando sea adecuada).
Habitualmente, una entrada es objeto de referencia una sola vez por capítulo,
por lo que al haber encontrado una referencia, ojee el resto del capítulo incluyendo
los ejercicios.
A
ABS .E., en G 59
ACS .E., W cambiada 70
aleatorio 73
AND .K., .L., o .C., SYMBOL SHIFT Y 85
apóstrofe 17, 101
argumento 57, 159
ascii 91
asignación 52
asignación procrusteana 52, 80
ASN .E., Q cambiada 70
AT .K., .L., o .C., SYMBOL SHIFT I 101, 196
ATN .E., E cambiada 65, 70
atributos 110, 195
ATTR .E., L cambiada 116, 164, 219
B
basic 7, 26, 51
BEEP .E., Z cambiada 7, 130, 135
BIN .E., en B 93, 124
binario 93, 166, 197, 217
bit 159
BORDER (contorno) .K., en B 7, 113
BREAK CAPS SHIFT y SPACE 8, 19, 34, 151
BRIGHT .E., B cambiada 110, 125
brillo 110
bucle 33, 197
bucle for next 31, 41, 197
byte 143, 159, 163
C
cadena 51
cadena comillas 18
221
Indice
222
Indice
D
DATA .E., en D 41, 79, 142
datos 13
def FN 60
DELETE .C. o .G. en 0, .K., .L., .C. o .G. 8, 15, 91, 193
CAPS SHIFT 0
desplazamiento 7
DIM .K., en D 79
dimensión 79
dirección 143
dirección de memoria 159
dirección de port 159
dirección de retorno 37
dirección de un byte 143, 163
dobles comillas 47
DRAW .K., en W 121, 195
duración 135
E
EDIT .K., .L. o .C., CAPS SHIFT 1 8, 14
eje x 68
eje y 68
elemento 223
elemento de impresión 101
elemento de impresión PRINT 101
elemento de INPUT 104
ensamblador 179
enter 8, 14, 194
entero 59
223
Indice
ERASE .E. SYMBOL SHIFT 7 155
error de sintaxis 8
escala binaria 169
espacio 8, 45
exactitud 47
EXP .E., en X 65
exponente 46, 166
expresion
expresion aritmética 45
expresión en cadena 41, 53, 101, 197
expresión lógica 85
expresión matemática 45
expresión numérica 41, 45, 58, 101, 197
F
falso 25, 85
FLASH .E., V cambiada 109, 122
FN .E. SYMBOL SHIFT 2 60
fondo 110
fondo de pantalla 110
FOR .K., en F 31, 38, 197
FORMAT .E. SYMBOL SHIFT 0 155
fragmentación 67
función 7, 57, 198
función logarítmica 67
función trigonométrica 65
G
GOSUB .K., en H 37, 168
GOSUB - PILA 37, 168
GOTO .K., en G 16, 25, 31, 37
grabadora de cassette 8, 19, 141
grado 70
gráfica 125
gráficos 8, 121
gráficos definidos por el usuario 8, 92
GRAFHIS .K., .L. o .C., CAPS SHIFT 0 8, 91, 119, 193
H
hexadecimal 217
224
Indice
I
IF .K., en U 21, 31, 85
impresora 8, 19, 151, 196
IN .E., I cambiada 159
informe 8, 16, 26, 189
INK .E., X cambiada 109, 122, 195
INKEY$ .E., en N 131
INPUT .K., en I 7, 16, 25, 31, 195
INPUT – DATOS 103
INPUT – ELEMENTO 104
INT .E., en R 59, 73
inversa 67
INVERSE .E., M cambiada 12, 122, 195
iteración por bucle 32
J
juego de caracteres 91, 183
L
LEFT$ 61
LEN .E., en K 57
lenguaje ensamblador 179
LET .K., en L 7, 13, 31, 38
límite 32
LINE .E., SYMBOL SHIFT 3 105, 144, 181
línea 7
línea de programa 7, 13
línea en curso 8, 14
línea superior 20
LIST .K., en K 15
lista de datos 8, 13
listado 19
listado automático 19
llamada 37
LLIST .E., en V 151
LN .E., en Z 67
LOAD .K., en J 141, 181
LPRINT .E., en C 151, 195
225
Indice
M
mantisa 47, 166
matriz 79, 142
matriz de cadena 80
mayúsculas 8
memoria 159, 163
memoria intermedia 164, 196
menú 147
MERGE .E., T cambiada 147
microdrive 155
MID$ 61
minúsculas 7
mnemotécnico (mnemónico) 179, 183
modo 7
modo .C. 8
modo de letras 7, 193
modo .E. 8
modo extendido 8
modo .G. 8, 193
modo gráfico 8, 91, 193
modo .K. 7
modo .L. 7, 193
modo mayúsculas 8
modo palabra-clave 7, 193
módulo 103
MOVE .E., SYMBOL SHIFT 6 155
música 135
N
nesting (anidamiento) 33
NEW .K., en AI 16, 25
NEXT .K., en N 31, 41, 197
nombre 45
nombre de un programa 141
nombre de una variable 45
NOT .K., .L. o .C., SYMBOL SHIFT S 85
notación científica 46
número de línea 13, 26
O
octava 135
226
Indice
P
palabra clave 7, 193
pantalla 8
pantalla llena 20
PAPER .E., C cambiada 7, 109, 122, 195
paréntesis 53, 57
parte superior de la pantalla 8
PAUSE .K., en M 129
PEEK .E., en O 94, 129, 163
pentagrama 135
PI .E., en M 67
pila 37, 168
pila de GOSUB 37, 168
pila de máquina 168
pila del calculador 168
pixel 121
PLOT .K., en Q 121, 195
point 123, 164
POKE .K., en O 94, 124, 159, 163
ports de E/S 159
posición PRINT 9
potencia 65
primer plano 110
PRINT .K., en P 7, 13, 25, 31, 37, 195
prioridad 45, 65, 85, 201
procesador 159
programa 7, 13, 141
pseudoaleatorio 117
punto y coma 17, 26
puntuación 17
227
Indice
R
radianes 70
RAM 159, 163
RAMTOP 168
RANDOMIZE .K., en T 73
READ .E., en A 41
recurrencia 38
red 155
redondeo 47, 97
registro 179
relación 25, 85, 95
REM .K., en E 16, 25, 31
repetir 8
RESTORE .E., en S 41
resultado 57
RETURN .K., en Y 37
RIGHT$ 37
RND .E.,en T 73
ROM 159, 163
RS 232, 155
RUN .K., en R 14
S
SAVE .K., en S 149, 180
SCREEN$ .E., K cambiada a 143, 164
scroll? 8, 20, 104
scrolling 20, 103
sentencia 41
sentencia data 41
separadores PRINT 101
SGN .E., en F 59
signo, signum 59
símbolo 7
símbolos gráficos 91
SIN .E., en Q 67
sistema binario 218
sistema decimal 217
slicer 197
sobreimpresión 113
space 8
SQR .E., en H 60
STEP .K., .L. o .C., SYMBOL SHIFT D 32
STOP .K., .L. o .C., SYMBOL SHIFT A 58
228
Indice
STR$ .E., en Y 58
subcadena 51
subíndice 51, 79
subrutina 37
suma de cadenas 53, 58
SYMBOL SHIFT 7, 25, 32
T
TAB .E., en P 103, 196
TAN .E., en E 67
tecla 135
tecla cambiada 7
teclado 7, 115, 193
televisión 8, 109
THEN .K., .L. o .C., SYMBOL SHIFT G 7, 25, 85
TL$ 61
TO .K., .L. o .C., SYMBOL SHIFT F 32, 51
token (término simbólico) 7, 91
tono, altura 135
U
USR .E., en L 93, 124, 180
V
VAL .E., en J 58
VAL$ .E., J cambiada 59
valor 32
valor inicial 32
variable 15, 31, 141
variable con subíndice 79
variable con cadena 18
variable de contaje 32
variable de control 32
variable de sistema 164, 173
variable no definida 19
variable nombre 45
variable numérica 32
variable simple 79
229
Indice
verdadero 25, 85
VERIFY .E., R cambiada 141
Z
Z80 179
! .K., .L. o .C., SYMBOL SHIFT 1. 18
“ .K., .L. o .C., SYMBOL SHIFT P. 16
# .K., .L. o .C., SYMBOL SHIFT 3.
$ .K., .L. o .C., SYMBOL SHIFT 4.
5
18
% .K., .L. o .C., SYMBOL SHIFT 5.
& .K., .L. o .C., SYMBOL SHIFT 6.
‘ .K., .L. o .C., SYMBOL SHIFT 7. 17
( .K., .L. o .C., SYMBOL SHIFT 8. 16
) .K., .L. o .C., SYMBOL SHIFT 9. 16
* .K., .L. o .C., SYMBOL SHIFT B. 16
+ .K., .L. o .C., SYMBOL SHIFT K. 14
´ .K., .L. o .C., SYMBOL SHIFT H. 16
- .K., .L. o .C., SYMBOL SHIFT J.
. .K., .L. o .C., SYMBOL SHIFT M. 58
/ .K., .L. o .C., SYMBOL SHIFT V. 16
: .K., .L. o .C., SYMBOL SHIFT Z. 17
; .K., .L. o .C., SYMBOL SHIFT O. 17
< .K., .L. o .C., SYMBOL SHIFT R. 25
= .K., .L. o .C., SYMBOL SHIFT L. 13
> .K., .L. o .C., SYMBOL SHIFT T. 25
? .K., .L. o .C., SYMBOL SHIFT C. 47
@ .K., .L. o .C., SYMBOL SHIFT 2.
[ .E., Y cambiada
\ .E., D cambiada
] .E., U cambiada
.K., .L. o .C., SYMBOL SHIFT H. 65
_ .K., .L. o .C., SYMBOL SHIFT 0.
£ .K., .L. o .C., SYMBOL SHIFT X.
{ .E., F cambiada
230
Indice
| .E., S cambiada
} .E., G cambiada
~ .E., A cambiada
© .E., P cambiada
<= .K., .L. o .C., SYMBOL SHIFT Q. 25
>= .K., .L. o .C., SYMBOL SHIFT E. 25
<> .K., .L. o .C., SYMBOL SHIFT W. 25
.K., .L. o .C., CAPS SHIFT 5.
.K., .L. o .C., CAPS SHIFT 8. 14
.K., .L. o .C., CAPS SHIFT 6. 8
.K., .L. o .C., CAPS SHIFT 7. 8
231