Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previaÚltima revisiónAmbos lados, revisión siguiente | ||
012:software [d/m/Y H:i] – creado miguel | 012:software [d/m/Y H:i] – [Antimerge] miguel | ||
---|---|---|---|
Línea 23: | Línea 23: | ||
==== Macedonia de trucos ==== | ==== Macedonia de trucos ==== | ||
- | El primero y más conocido es el clásico POKE 23659,0 que tiene por efecto | + | El primero y más conocido es el clásico POKE 23659,0 que tiene por efecto bloquear nuestro ordenador si intentamos hacer un BREAK. La variable del sistema DF SZ cuya dirección es 23659 gestiona el número de líneas en la parte inferior de la pantalla. Si reducimos a cero este número, nuestro Spectrum no va a poder imprimir nada en esta zona de la pantalla y comoquiera que es precisamente aquí donde se van a imprimir los mensajes de error como el conocido «L BREAK into program» se producirá el clásico bloqueo que nos obligará a desenchufar nuestro ordenador o hacer uso del botón de reset en el caso de que lo hayamos instalado. El gran inconveniente de este truco es que no nos va a permitir utilizar la instrucción 1NPUT, por lo que si queremos introducir datos tendremos que hacerlo a través de la instrucción INKEY$. |
- | bloquear nuestro ordenador si intentamos hacer un BREAK. La variable del sistema DF SZ cuya dirección es 23659 gestiona el número de líneas en la parte inferior de la pantalla. Si reducimos a cero este número, nuestro Spectrum no va a poder imprimir nada en esta zona de la pantalla y comoquiera que es precisamente aquí donde se van a imprimir los mensajes de error como el conocido «L BREAK into program» se producirá el clásico bloqueo que nos obligará a desenchufar nuestro ordenador o hacer uso del botón de reset en el caso de que lo hayamos instalado. El gran inconveniente de este truco es que no nos va a permitir utilizar la instrucción 1NPUT, por lo que si queremos introducir datos tendremos que hacerlo a través de la instrucción INKEY$. | + | |
- | Otra forma más elegante de obtener el mismo resultado es mediante POKE 23613,0 que provocará un reset si intentamos parar el programa con la ventaja de no inutiizar la parte baja de la pantalla. En esta dirección | + | Otra forma más elegante de obtener el mismo resultado es mediante POKE 23613,0 que provocará un reset si intentamos parar el programa con la ventaja de no inutiizar la parte baja de la pantalla. En esta dirección 23613, se encuentra la variable ERR SP que indica al Spectrum dónde tiene que saltar en el caso de error y para nuestro ordenador, el BREAK o cualquier interrupción del programa se trata como un error. Modificando la dirección de salto forzamos la ejecución de la rutina de inicialización produciéndose el borrado total de la memoria. |
Otra variante del mismo tema, más elegante todavía, es desactivar el BREAK recurriendo a la misma variable. En este caso, la instrucción a emplear es POKE 23613,82, con lo que en caso de BREAK forzamos un salto a la misma línea donde estaba ejecutándose el programa. El inconveniente de este truco es que no es permanente. Los bucles FOR-NEXT, los GOTO y los GOSUB-RETURN lo desactivan, por lo que es necesario repetir el POKE de marras, antes y después de cada instrucción de este tipo. | Otra variante del mismo tema, más elegante todavía, es desactivar el BREAK recurriendo a la misma variable. En este caso, la instrucción a emplear es POKE 23613,82, con lo que en caso de BREAK forzamos un salto a la misma línea donde estaba ejecutándose el programa. El inconveniente de este truco es que no es permanente. Los bucles FOR-NEXT, los GOTO y los GOSUB-RETURN lo desactivan, por lo que es necesario repetir el POKE de marras, antes y después de cada instrucción de este tipo. | ||
- | ___Otras innovaciones____ | + | |
- | Todos estos trucos tienen, sin embargo, un grave problema. Basta con cargar el programa en memoria, pero evitando su autoejecución, | + | ==== Otras innovaciones ==== |
- | cubrió | + | |
- | La primera de ellas requiere pararnos un poco a pensar en cómo funciona el intérprete BASIC de nuestro Spectrum. Cuando damos la orden de RUN el intérprete busca en las variables del sistema la dirección de comienzo del programa, toma nota del número de línea, la ejecuta y pasa a la siguiente. Cada vez que se termina de ejecutar una instrucción, | + | Todos estos trucos tienen, sin embargo, un grave problema. Basta con cargar el programa en memoria, pero evitando su autoejecución, |
- | la a continuación, | + | |
- | 9998 LET A= PEEK 23653 + 256 * PEEK 23654 : SAVE " | + | La primera de ellas requiere pararnos un poco a pensar en cómo funciona el intérprete BASIC de nuestro Spectrum. Cuando damos la orden de RUN el intérprete busca en las variables del sistema la dirección de comienzo del programa, toma nota del número de línea, la ejecuta y pasa a la siguiente. Cada vez que se termina de ejecutar una instrucción, |
- | CODE 23552, A — 23500 | + | |
- | 9999 GOTO " | + | <code basic> |
- | Si colocamos estas líneas al final de nuestro programa y hacemos GOTO 9998 grabaremos en el cassette un bloque de «bytes» con toda la información | + | 9998 LET A = PEEK 23653 + 256 * PEEK 23654 : SAVE " |
- | necesaria para que, una vez cargado, se ejecute automáticamente la línea 9999, que es la que lanzará nuestro programa. Y a ver quién es capaz de hacer un MERGE con un bloque de «bytes»!! Evidentemente es posible deshacer este truco, pero ya es harina de otro costal. Habría que cargar el bloque en la parte alta de memoria, protegido por RAMTOP, mediante un monitor de código máquina modificar «a mano» el listado del programa eliminando los trucos de protección que nos impidieran parar el programa así como las variables del sistema manipuladas, | + | 9999 GO TO " |
- | ______Antimerge __ | + | </ |
+ | |||
+ | Si colocamos estas líneas al final de nuestro programa y hacemos GOTO 9998 grabaremos en el cassette un bloque de «bytes» con toda la información necesaria para que, una vez cargado, se ejecute automáticamente la línea 9999, que es la que lanzará nuestro programa. Y a ver quién es capaz de hacer un MERGE con un bloque de «bytes»!! Evidentemente es posible deshacer este truco, pero ya es harina de otro costal. Habría que cargar el bloque en la parte alta de memoria, protegido por RAMTOP, mediante un monitor de código máquina modificar «a mano» el listado del programa eliminando los trucos de protección que nos impidieran parar el programa así como las variables del sistema manipuladas, | ||
+ | |||
+ | ==== Antimerge ==== | ||
El segundo truco antiMERGE se basa en unos principios totalmente diferentes. Dado que esta instrucción está pensada originalmente para fusionar programas, es imprescindible que vaya tomando nota de los números de línea. El truco consiste en darle un número «imposible» con lo que la rutina se vuelve loca y se produce el consiguiente bloqueo. Naturalmente, | El segundo truco antiMERGE se basa en unos principios totalmente diferentes. Dado que esta instrucción está pensada originalmente para fusionar programas, es imprescindible que vaya tomando nota de los números de línea. El truco consiste en darle un número «imposible» con lo que la rutina se vuelve loca y se produce el consiguiente bloqueo. Naturalmente, | ||
- | 1 POKE 23802,0 : POKE 23613,0 | + | |
- | 2 GOTO 4 | + | <code basic> |
- | 3 POKE 23801,255 : SAVE " | + | 1 POKE 23802, 0: POKE 23613, 0 |
- | 4 REM principio del programa | + | 2 GOTO 4 |
- | A la hora de proteger un programa contra MERGE incluiremos estas líneas al principio del mismo y lo grabaremos haciendo GOTO 3. El POKE de esta línea tiene por objeto transformar el número de la línea 2, cambiándolo a 65282, lo que para el Spectrum es imposible, y provocará el bloqueo si intentamos hacer MERGE. Por el contraio, si utiliza- | + | 3 POKE 23801, 255: SAVE " |
- | 8 MICROHOBBY | + | 4 REM principio del programa |
- | mos el LOAD normal, la ejecución comenzará en la línea 1 donde el primer POKE devolverá a la línea 2 su número normal, y el segundo es uno de los de protección que ya hemos visto. Luego la ejecución se transferirá a la línea 4 donde comienza el resto del programa. Al utilizar esta rutinita hay que tener cuidado en no modificar la línea 1 ya que alteraríamos la dirección de la segunda línea con lo que el POKE debería de tener otra dirección. Por el contrario, si utilizamos | + | </ |
- | Inofensivo y divertido | + | |
+ | A la hora de proteger un programa contra MERGE incluiremos estas líneas al principio del mismo y lo grabaremos haciendo GOTO 3. El POKE de esta línea tiene por objeto transformar el número de la línea 2, cambiándolo a 65282, lo que para el Spectrum es imposible, y provocará el bloqueo si intentamos hacer MERGE. Por el contrario, si utilizamos | ||
+ | |||
+ | ==== Inofensivo y divertido | ||
Y siguiendo con nuestro panorama de trucos, vamos ahora con uno bastante inofensivo pero que siempre resulta divertido. El archifamoso de la línea 0. Muchos programadores que conocen este truco, lo emplean para crear una línea que no se puede editar y donde colocan su nombre para evitar que otra persona se apropie del programa. No nos parece mal, pero rogamos que no lo pongan en los programas que nos envían ya que luego llueven cartas de lectores justamente indignados quejándose de que no pueden introducir esta línea en su ordenador. Para ello, basta con introducir la línea con un número normal y, posteriormente, | Y siguiendo con nuestro panorama de trucos, vamos ahora con uno bastante inofensivo pero que siempre resulta divertido. El archifamoso de la línea 0. Muchos programadores que conocen este truco, lo emplean para crear una línea que no se puede editar y donde colocan su nombre para evitar que otra persona se apropie del programa. No nos parece mal, pero rogamos que no lo pongan en los programas que nos envían ya que luego llueven cartas de lectores justamente indignados quejándose de que no pueden introducir esta línea en su ordenador. Para ello, basta con introducir la línea con un número normal y, posteriormente, | ||
Un truco canallesco_ | Un truco canallesco_ |