007:trucos

Microhobby 7. Año I, del 18 al 24 de diciembre de 1984

Sin duda, nuestros lectores recordarán un truco publicado en el número anterior que nos permitía proteger nuestro programas de miradas curiosas, inhabilitando las dos líneas inferiores de la pantalla empleadas por la máquina para mensajes de error, etc. Proponemos aquí un método alternativo que consideramos muy útil, dado que es muy difícil, por no decir imposible, «reventar» un programa protegido de esta forma.

El asunto está en impedir el funcionamiento de la tecla «BREAK» específicamente, de forma que cualquier intento de detener el programa conllevará la destrucción del mismo.

Para ello, nos aprovechamos de que al pulsar esta tecla, el ordenador necesita saber el contenido de determinadas posiciones de memoria; si cambiamos estas posiciones y le «mandamos» a otro sitio, sucederá el «system crash» que queremos.

El programa listado más abajo, realiza el trabajo y debería funcionar indistintamente en 16 K y 48 K, con o sin Interface 1 e, incluso, si al ordenador están conectador periféricos que empleen memoria RAM para inicializarse, como algunas interfaces de impresora.

Hemos aprovechado también, para incluir en el programa algunas técnicas que, aparte de su utilidad, pueden considerarse dentro del apartado trucos.

Vamos pues a analizar el listado detenidamente para tratar de averiguar cómo y por qué funciona.

Líneas 20-30:

Lo primero que hay que hacer, es fijar el 'RAMTOP' del sistema, es decir, la última posición de memoria RAM utilizable inmediatamente antes de la zona de gráficos definibles por el usuario.

La primera pregunta sería, por qué empleamos 'DEF FN' en lugar de la sentencia 'LET' mucho más obvia; la razón estriba en que el resultado de la función lo empleamos en la línea 40 después de haber ejecutado una sentencia 'CLEAR', la cual desgraciadamente, borra las variables, así que el ordenador no sabría de que le estamos hablando en la línea 40 (el ominoso 'VARIABLE NOT FOUND'…).

Línea 40:

Aquí empleamos una técnica bastante curiosa que permite examinar la manera en que la máquina evalúa una «expresión lógica», dando un resultado de verdadero (1) o falso (0); pretendemos asignar a la variable 'HPILA' el valor de la variable 'LPILA + 1'; como comentaremos más adelante, 'INKEY$' efectivamente contendrá la cadena vacía cuando se ejecute el programa, así que la expresión es cierta y por tanto vale 1. La utilidad de este tipo de truco es muy grande, ya que por ejemplo, nos permite bifurcar a varias líneas según qué tecla hayamos pulsado.

Línea 60:

Inhabilita la tecla «BREAK».

Línea 90:

Restaura la tecla «BREAK» colocando los valores originales en las posiciones de memoria adecuadas.

Línea 110:

Esto es una llamada a una subrutina de la memoria ROM que permite terminar un programa de una manera bastante inusitada; dejamos al lector que se sorprenda agradablemente.

Para ver cómo funciona el programa, sugerimos que se incluya una línea como la siguiente:

65 GO TO 65 + (INKEY$="a").

La pantalla permanecerá en blanco hasta que se pulse la «a» minúscula; si pulsamos «BREAK» se destruirá. Recordemos que al hacer 'RUN', 'INKEY$' contiene la cadena vacía puesto que no la hemos utilizado para nada, por lo que la expresión de la línea 40 vale 1.

En fin, una vez expuesta la idea, no dudamos que el ingenio de nuestros lectores hará el resto.

10 REM *** FIJA EL RAMTOP ***
20 DEF FN R()=PEEK 23730+256*PEEK 23731
30 CLEAR FN R()
40 LET LPILA=FN R() -3: LET HPILA=LPILA + (INKEY$ = "")
50 REM *** INHABILITA LA TECLA "BREAK" ***
60 POKE LPILA, 0 :POKE HPILA, 0
70 REM *** RESTO DEL PROGRAMA ***
80 REM *** RESTAURA "BREAK" ***
90 POKE LPILA, 3: POKE HPILA, 19
100 REM *** "DESPEDIDA FINAL" ***
110 RANDOMIZE USR 4710

Proponemos una corta rutina en código máquina que nos permite cambiar instantáneamente el color del borde, papel y tinta a los valores que elijamos; la rutina se presenta en forma «artesanal», es decir, hay que construir el valor del byte de color y luego introducirlo mediante 'POKE' o bien cambiar el valor en las 'DATAS'.

Si se observa el listado del programa se verá que el número 41 se repite 2 veces; éste es el byte de color que indica papel 5 (cyan) y tinta 1 (blue).

El byte se construye multiplicando el valor del papel por 8 y sumándole la tinta [41=(5*8)+1],

Por ejemplo, para poner papel negro y tinta amarilla, cambiaríamos en las 'DATAS' el valor de 41 por 6 [6=(0*8)+6].

De paso, hemos incluido unos pocos bytes más que colocan el borde del mismo color del papel, empleando la instrucción 'RRCA' con objeto de mover el número que representa el papel a los bits 0, 1 y 2 del acumulador. Acto seguido, mediante la instrucción 'OUT (C)', A cuyo equivalente ya vimos en un truco BASIC, conseguimos el efecto deseado.

Los colores no quedan fijados de forma permanente, así que si imprimimos algunos caracteres después, sin indicación explícita de papel y tinta, aparecerán con los atributos que el ordenador conserve por defecto.

10 FOR N=40960 TO 40960+22: READ X: POKE N,X : NEXT N
15 LIST
20 RANDOMIZE USR 40960
100 DATA 33, 0, 88, 54, 41, 17, 1, 88, 1, 255, 2, 237, 176, 14, 254, 62 ,41 ,15, 15, 15, 237, 121, 201
  • 007/trucos.txt
  • Última modificación: d/m/Y H:i
  • por miguel