003:trucos

No renderer 'odt' found for mode 'odt'

Microhobby 3. Año I, del 26 de noviembre al 03 de diciembre de 1984

Son muchas las ocasiones en las que, por necesidad de programación, se nos plantea el problema de tener que introducir un determinado valor en una dirección de memoria. Siempre que el valor sea mayor de 255, habrá que tener en cuenta que va a estar compuesto de dos octetos, de los cuales el primero va a ser el menos significativo (aunque esto no parezca muy lógico).

Veamos un ejemplo: si queremos introducir el número 1000 en la dirección de memoria 64500, podemos consultar el capítulo 25 del manual, en el que se nos habla de las variables del sistema. Allí encontramos una fórmula:

POKE N, V — 256 INT(V/256)
POKE N+1, INT(V/256)

Con ella es posible almacenar en la dirección antes citada los valores 232 y 3 correspondientes a los octetos más significativo y menos, respectivamente. La solución es buena, pero la fórmula puede resultar un poco engorrosa si la utilizamos muchas veces.

Otra solución más rápida está relacionada directamente con la variable del sistema SEED, que es la que contiene el origen para RND.

Es la variable que se fija mediante la función RANDOMIZE. Las direcciones donde se encuentra almacenada esta variable son la 23670 y la 23671. Si introducimos la siguiente instrucción RANDMIZE 1000, almacenaremos en la primera dirección de la variable SEED el octeto menos significativo (232), y en la segunda, el más significativo (3). Por tanto, bastará con introducir la siguiente línea PRINT PEEK 23670, PEEK 23671 y tendremos en pantalla los valores antes citados, los cuales se introducen más tarde con los POKES correspondientes.

Una forma de simplificar todo esto consistiría en introducir directamente en los POKES correspondientes los valores PEEK. Para conseguirlo, utilíze el siguiente programa:

10 IMPUT N: RANDOMIZE N 20 POKE 64500, PEEK 23670

30 POKE 64501, PEEK 23671 40 GOTO 10

La sentencia “on… goto” permite bifurcar una serie de líneas de programa dependiendo del valor de una determinada variable, por ejemplo:

ON X GOTO 100, 200, 300, 400

Si X es igual a cero o X es mayor que cuatro, la sentencia se ingnora y se ejecuta la siguiente. Si la variable X está dentro del rango 1-4, el programa bifurcará correctamente (X = 1 goto 100, X = 2 goto 200, etc.).

Aunque el BASIC del SPECTRUM no posee este comando, su simulación es bastante sencilla; una de las maneras de hacerlo sería la siguiente:

10 REM *** ON ... GOTO DEMO. ***
20 LET X = (1 AND CONDICION-1-CIERTA) + (2 AND CONDICION-2-CIERTA) + (3 AND CONDICION-3-CIERTA) + (4 AND CONDICION-4-CIERTA)
30 IF X = 0 THEN GOTO 60
40 GOTO X*100
50 REM *** END DEMO.
60 REM *** RESTO DEL PROGRAMA ***

Para el caso de subrutinas, sustituir la línea 40 por:

40 GOSUB X*100

Las limitaciones de esta forma particular de resolver el problema, son:

  • A: No puede haber dos CONDICIONES SIMULTÁNEAMENTE CIERTAS.
  • B: Las líneas de programa donde vamos a bifurcar deben poseer una SEPARACIÓN CONSTANTE.

Aunque se puede objetar que esto no es más que la resolución de un caso particular, debemos hacer notar que el método siempre es el mismo, es decir, hallar un algoritmo que se ajuste a los números de sentencia a los que queremos bifurcar.

trucos_3.jpg

Uno de los problemas con los que más a menudo nos encontramos en todo tipo de aplicaciones, bien sean juegos o programas de utilidad, es la presentación en pantalla de los resultados.

Indudablemente existen para este problema multitud de soluciones incluso en BASIC, pero la que nosotros sugerimos nos parece la más simple, recurriendo, eso sí, al código máquina.

En la ROM (READ ONLY MEMORY, memoria de sólo lectura), existe un complejo programa encargado de gestionar multitud de tareas esenciales para el funcionamiento del ordenador que, normalmente, nos pasan inadvertidas; pues bien, dicho programa se compone en general, de subrutinas que se llaman unas a otras y nosotros, aprovechándonos del trabajo de la casa SINCLAIR vamos a emplear una de ellas que comienza en la dirección 3190.

Esta subrutina realiza lo que en la jerga informática se conoce como SCROLL de pantalla, es decir, todo aquello que se encuentra en el display de nuestro monitor o televisor se mueve una línea hacia arriba, proceso análogo al que realizamos al terminar un renglón y mover el carro en una máquina de escribir.

El truco está en IMPRIMIR EN LA ULTIMA LINEA DE LA PANTALLA mediante un “print at 21,0;” lo que sea “ ” y luego llamar a la subrutina, bien mediante “RANDOMIZE USR 3190” o asignando a una variable cualquiera este número “LET NOIMPORTA = USR 3190”.

Cualquiera de las dos sentencias antedichas bastará para que nuestra rutina se ejecute.

Para aclarar ideas, teclee el siguiente programa de demostración por favor:

10 REM **** SCROLL DEMO ****
20 PRINT AT 21,0; " ESTE PROGRAMA ES"
30 LET A=USR 3190
40 PRINT AT 21,0; "UNA DEMOSTRACIÓN"
50 RANDOMIZE USR 3190
60 PRINT AT 21,0; "DE SCROLL LINEA A LINEA"
70 LET A=USR 3190
80 PRINT AT 21.0
  • 003/trucos.txt
  • Última modificación: d/m/Y H:i
  • por 127.0.0.1