Saltar al contenido.

Depuración de listados BASIC tecleados a mano con un ZX Spectrum

septiembre 25, 2018
Cuando hace años se tenía la virtud de la paciencia, era algo normal ponerse delante de un ordenador y atreverse a teclear algún listado de los que figuraban publicados en páginas de alguna revista de la época o cualquier otra publicación que los contuviese (libros, cursos de programación, manuales y hasta enciclopedias), durase el tiempo que durase dicha tarea. Teclear un programa escrito normalmente en BASIC es un ejercicio muy útil, sobre todo para aprender a escribir con un ordenador y familiarizarse sobre todo con sus caracteres especiales, incluidos en su propio código ASCII. En el caso del ZX Spectrum, había que prestar atención a la distribución de sus comandos, instrucciones y símbolos varios, a los que se accede desde el teclado de la manera descrita en su manual.

Aparte de la paciencia requerida, las técnicas aprendidas de programación en BASIC y el fin último para el que destinamos el programa tecleado, hay que tener en cuenta que cuando terminamos de introducir todas las líneas de dicho programa se tiene que comprobar que no nos hemos equivocado en su transcripción, con tan solo ejecutarlo y comprobar que el software iniciado funciona al 100%. Si tras ejecutarlo con RUN nos encontramos durante su desarrollo algún error o “bug”, éstos pueden aparecer solamente por acciones totalmente involuntarias o que se han escapado a nuestro control, a veces por descuido y otras veces por fallos no achacables a nuestra voluntad (algunos listados publicados por algunas revistas no han pasado un control específico de calidad ó se produjeron fallos en su maquetación. Esto mismo ha pasado en contadas ocasiones con programas publicados en el interior de revistas como ZX y MicroHobby).

Corregir estos errores casi siempre tienen fácil solución, siempre y cuando no hayamos introducido alguna subrutina en código máquina que pueda alterar el comportamiento de nuestro ordenador tras haber ejecutado ese programa, una vez instalado todo su contenido en su memoria. En tal caso, si hemos almacenado ese programa en cinta o disco como medida de precaución o si habremos creido que tras copiarlo enteramente está listo para su ejecución, lo podemos MERGEar primero, en lugar de ejecutar LOAD “”. Tras ejecutar MERGE “” y aparezca en pantalla el mensaje 0 OK 0:1 al instante o al cabo de unos segundos, se comprueba antes que todos los datos de esa subrutina sean los correctos, con solo hacer el chequeo de los mismos con los que figuran en el listado que hemos copiado. Mejor curarse en salud, antes que encontrarnos con un posible bloqueo o cuelgue del ordenador por una mala transcripción de esos datos.
 

 
El ejercicio de depurar (de la palabra “debugging”) un programa BASIC no es muy complicado. Se obtiene con ello una mayor perspicacia y comprensión en cómo funciona ese programa que se ha trasladado del papel al ordenador, más que el mero hecho de haberlo tecleado sin más. Rastrear estos errores es incluso un arte en sí mismo y se necesita ciertas habilidades en programación BASIC para corregirlos completamente.

Hoy en dia seremos poquísimos los que nos atrevamos a teclear algún listado publicado en revistas de aquí y allá. Y no es porque lo diga yo, teniendo en cuenta que otra de mis labores actuales dentro del panorama “retro” es precisamente la de preservar el mayor número posible de programas publicados en revistas y libros de nuestro pais, gracias a mi Proyecto BASIC ZX. El ritmo actual de la vida nos impide, en la mayoría de las ocasiones, disponer de tiempo más que suficiente para dedicarlo a este aspecto fundamental de la informática.

Aquí van una serie de consejos para algunos de los posibles mensajes de error que el ZX Spectrum puede indicar al usuario. Éstos son los más habituales y en todos los casos la solución es bastante obvia, salvo que el usuario no se haya leido el manual del Spectrum primero…

 
1 NEXT without FOR

Si aparece este mensaje de error en pantalla, hay que localizar primero la línea indicada y a partir de ahí buscar hacia adelante y atrás, con los cursores arriba y abajo para mover el símbolo “>”, a través del propio listado ya en memoria y así EDITar fácilmente la línea en cuestión. Puede pasar que la variable añadida al comando NEXT sea errónea, o se dé el caso de que se haya definido un bucle con otra variable distinta. También puede deberse si se está gestionando dentro de ese mismo bucle alguna variable que coincida por la usada por los comandos FOR y NEXT.

Para el caso de que nos aparezca en pantalla otro mensaje similar, I FOR without NEXT, se procedería de igual forma.

 
2 Variable not found

En muchos casos, es el error más frecuente. De nuevo, el fallo puede estar en que hayamos tecleado erróneamente alguna variable tras su definición con el comando LET ó a partir de otras instrucciones como DIM o FOR/NEXT. Aparte de comprobar cuidadosamente la existente en la línea que nos muestra el mensaje de error, conviene repasar el resto del listado en busca de esa variable numérica, la cual puede tener un solo carácter ó más caracteres. Si es alfanumérica, contendrá tan solo una letra delante del símbolo del dólar (A$, B$, C$, etc.)

Si solo hay una variable en la línea mostrada en pantalla (2 Variable not found 270:6, por ejemplo), buscamos esa línea 270 y comprobamos si hemos transcrito correctamente dicha variable dentro del sexto comando existente en dicha línea (un PRINT xx ó un LET xx=número tal). El problema puede estar en esa línea o en otra distinta. Casi siempre tiene fácil solución y conviene examinar a fondo el listado, comparándolo con el de referencia en la revista ó libro donde éste figure.

Si hay más de una variable en dicha línea dada junto al mensaje de error, entonces habrá que mirar con cuidado dónde hemos transcrito mal dicha variable. Valga como ejemplo una línea con estas instrucciones: 270 ...: PRINT AT xx1,yy1;A$: .... Para ello, basta con teclear directamente estos comandos:

PRINT xx1
PRINT yy1
PRINT A$

Una vez se compruebe cuál induce a tal error, se busca acto seguido en el resto del listado. Probablemente hayamos pasado por alto algún comando LET sin añadir o haber cambiado sin darnos cuenta algún carácter de la variable a la que alude el mensaje de error, bien en dicha línea o bien en otra cualquiera.
 

 
3 Subscript Wrong

Este error suele producirse tras alguna alteración con una ó más variables matriciales definida con el comando DIM, el cual puede contener entre uno y varios parámetros para crear una tabla o matriz. Si el número entre paréntesis en dicha línea donde el error ha sido detectado es mayor que el definido por DIM, no es un número entero ó es menor de 1, este mensaje es mostrado en pantalla. Si el subíndice o cualquiera de ellos de los que pueden figurar dentro de los paréntesis es un número, se comprueba y se cambia. En el caso de que sean variables numéricas, se procede según el caso anterior y se averigua qué causa el error Subscript Wrong. Normalmente por exceder de los límites permitidos por la matriz ó por otras causas, como las ya indicadas.

 
4 Out of Memory

Además de los programas que son demasiado grandes, si mientras estamos copiando un listado con una extensión más o menos considerable nos surge en pantalla este mensaje, es posible que pueda deberse a que hayamos borrado con un NEW un programa usado anteriormente, de menor longitud y que hubiese establecido una RAMTOP a partir de una determinada posición de la RAM disponible, que en ese mismo momento ha sido ocupada por nuestro actual programa.

Si el ordenador parece haberse bloqueado en ese estado, habría que anular la línea de comando (ó serie de órdenes) usando la tecla de borrado (DELETE) y después anular una línea de programa ó tal vez más, con la intención de restablecerlas después para permitir la utilización de, por ejemplo, el comando CLEAR. Tecleando CLEAR USR "a"-1 todo volverá a la normalidad.

En cualquier momento, podemos incluso comprobar cuánta memoria del “stack” de BASIC hay disponible en ese momento en nuestro Spectrum con una sencilla operación:

PRINT "Mem:";INT ((65535-USR 7962)/1024);"K"
 

 
7 RETURN without GOSUB

Por algún motivo, el ordenador se ha encontrado con una línea que contiene un comando RETURN sin haberse producido previamente una llamada con el comando GO SUB. En otro caso puede deberse a una sentencia RETURN de más. Comprueba si acaso un GO TO se ha insertado en lugar de un GO SUB en algún punto no concreto del programa, o en otro caso ese GO SUB no se ha copiado, ayudándote del listado de referencia.

 
A Invalid argument

El argumento de una función determinada no es correcto por algún motivo. Examinar bien todas las líneas, además de la indicada por este mensaje, por si se ha cometido un error con la manipulación de algún dato almacenado en una variable, gestionada por alguna de estas instrucciones: SQR, LN, ASN, ACS, USR, RANDOMIZE, POKE, DIM, GO TO, GO SUB, LIST, LLIST, PLOT, CHR$ o PEEK.

 
B Integrer out of range

El manual nos describe este mensaje a partir de este razonamiento: “Cuando se requiere un entero, el argumento de la coma flotante se redondea al entero más próximo.” Otra posibilidad para encontrarnos con este mensaje es que alguna instrucción ha intentado gestionar un dato no admitido por las limitaciones de algunos comandos, o por omisión del mismo. Verifica todas las variables involucradas según el informe 2 Variable not found y rastrée a través del programa buscando ajustes en él, así como observar que hayamos incluido correctamente algún símbolo matemático (suma, resta, multiplicación ó división) en la gestión de fórmulas y funciones aritméticas en las que se empléen una o más variables numéricas.

También sucede que si se quiere imprimir algo en pantalla con PRINT ó hacer dibujos con los comandos CIRCLE, PLOT y DRAW, conviene recordar que este error puede producirse incluso si, en algún momento dado, el programa intenta imprimir fuera de sus límites. Repasa dichos comandos y de usarse variables, mirar también en bucles FOR/NEXT, definiciones con LET y otras funciones, subrutinas de impresión y formulaciones varias.
 

 
E Out of DATA

Otro error común que se da con muchos programas transcritos en los que se emplée la instrucción DATA para almacenar datos tanto numéricos como alfanuméricos. Se necesita solamente comprobar las líneas que contiene esos DATA y sobre todo la subrutina READ, poniendo especial cuidado en la cantidad existente de datos. Suele darse el caso de que hayamos olvidado uno ó más datos, sin habernos dado cuenta, teniendo en cuenta que se ha intentado leer más allá del final de la lista de datos contenida en nuestro programa. Solo es necesario comprobarlos y en tal caso añadirlos en su lugar correspondiente. Comprobamos nuevamente el programa ejecutándolo desde el principio o a partir de esta subrutina de READ/DATA, y si el ordenador no nos devuelve el mismo mensaje de error, el programa seguirá su curso sin mayores problemas.

Puede darse el caso de que hayamos equivocado una coma de separación, poniendo en su lugar un punto ortográfico entre datos numéricos, habitualmente números enteros, haciendo que dos números correlativos se conviertan equivocadamente en un número decimal. Llegado a este punto, el ordenador nos podría devolver otro mensaje de error (B Integrer out of range, por ejemplo) de fácil solución.

También puede deberse si se intenta releer una lista de DATAs sin haber empleado previamente el comando RESTORE (o RESTORE ‘línea de partida de los DATA afectos’) para reestablecer su lectura. Puede ocurrir tras una primera ejecución del programa a partir de una línea específica (de haberse grabado con la instrucción SAVE "nombre" LINE xxx, siendo xxx la línea de comienzo del programa) o simplemente si se vuelve a la subrutina de lectura por otro camino.

 
M RAMTOP no good

RAMTOP incorrecto. El número especificado como RAMTOP con el comando CLEAR es muy grande ó muy pequeño. Solo es necesario cambiar dicho número por otro que sea perfectamente asumible por el sistema.

 

FIN

 
Y esto es todo, amigos. Depurar programas tecleados no tiene mayor dificultad, salvo que no se sepa cómo resolver algunos casos concretos no analizados aquí (C Nonsense in BASIC, por ejemplo), pero casi siempre tienen fácil solución. Como ya aseguraba antes, el manual de vuestro ordenador Spectrum es vuestro mejor aliado para comprender el funcionamiento de su lenguaje primordial, el BASIC. Ante cualquier eventualidad, consultarlo cuidadosamente. Y para el caso de que no entendáis nada de lo expuesto en él y por qué se dan éstos y otros mensajes de error, tenéis a vuestra disposición los foros de speccy.org, Computer Emuzone, Zona de Pruebas, RetroWiki, World of Spectrum y Spectrum Computing donde podéis hacer vuestras consultas y resolver dudas sobre programación en BASIC.

No comments yet

Publica aquí tu comentario

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: