Manual de Basic Spectrum 48k. |
Capítulo 18
MovimientoResumen
Con bastante frecuencia, deseará conseguir que el programa tenga una duración determinada y para tal fin, encontrará de utilidad la sentencia PAUSE. PAUSE n
interrumpe el cómputo y congela el contenido de pantalla durante n imágenes de la televisión (a 50 imágenes por segundo en Europa o 60 en América). El valor n puede ser de hasta 65535, lo que le proporciona poco menos de 22 minutos; si n = 0, entonces, significa "Pausa para siempre". Una pausa siempre puede acortarse pulsando una tecla (tenga presente que un espacio con CAPS SHIFT producirá también una interrupción). Ha de pulsar la tecla después de que haya comenzado la pausa. El siguiente programa actúa sobre el segundero de un reloj.
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 temporizació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 ordenador 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: (65536 * PEEK 23674 + 256 * PEEK 23673+ PEEK 23672) / 50/div
Nos da el número de segundos desde que el ordenador se puso en marcha (hasta unos 3 días y 21 horas, cuando retorna a 0). Damos a continuación, un programa de reloj para aplicar lo anterior:
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 segundos 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 elementos suplementarios de equipos que pueda emplear con el ordenador. Todas estas 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 significa 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 segundo, 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
que está desesperadamente equivocada. 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:
Puede cambiar los tres números del contador de modo que proporcionen el tiempo 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
Para poner los tres números a 27, 119 y 64, hace: POKE 23674,27: POKE 23673,119: POKE 23672,64
En los países con frecuencias de red de 60 hertzios, estos programas deben sustituir 50 por 60, en donde sea adecuado. La función INKEY$ (que no tiene ningún argumento) efectúa la lectura del teclado. Si está pulsando exactamente una tecla (o una tecla SHIFT y cualquier otra tecla), entonces, el resultado es el carácter que dicha tecla da en modo L; de no ser así, en cualquier otro modo, el resultado es la cadena vacía. Pruebe el siguiente programa que opera como una máquina de escribir:
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á perdido su oportunidad. Ejercicios
|
Manual de Basic Spectrum 48k. |