Atrapando errores con PC Weekly A continuacion dos rutinas de captura de error publicadas el 86 en Popular Computing Weekly! I. Solo con IF1 Publicado como "Define un nuevo comando Basic" p.17, vol 5 #2. " ERROR TRAP (atrapando errores) por Nigel Mossman Como muchos propietarios del Interface 1 saben, es posible definir nuevos comandos Basic para el Spectrum. El codigo maquina que les ofrecemos aqui define un nuevo comando que toma la forma de STEP LINE n. Step y Line pueden encontrarse en las teclas D y 3 respectivamente. Y este nuevo comando cumplira con las sigtes. operaciones: Cuando el comando Step Line es encontrado, el programa almacena el valor n. En este caso n debe ser igual a un numero de linea valido en Basic. Si en una etapa final un error ocurre o la tecla BREAK es presionada, el programa ya no se detendra, sino que saltara a la linea especificada por n. Los errores generados por las operaciones del Interface 1 no pueden ser capturados. Esto es debido a la forma en la que el Interface genera e imprime sus errores. Ya que la mayoria de usuarios suelen trabajar con rutinas en codigo maquina añadidos a sus programas Basic, he diseñado el Cargador Basic para poner el codigo del aTrapador en una parte especificada en la RAM. Ya que el Spectrum mueve trozos de memoria durante sus diversas operaciones, es vital que el codigo maquina este ubicado por arriba de la RAM Top. El cargador usa el comando CLEAR para fijar el RAM Top una direccion mas abajo de lo especificado. Cualquier variable existente creada por el usuario antes de que el cargador se ejecute, se destruira. Como pasa con todas las extenciones al Basic, el Vector de las variables del sistema necesita ser POKEada direccionandola al inicio del Basic Extendido. El cargador Basic se encarga de hacer eso. Si no hay ninguna otra rutina en codigo maquina operando, entonces el programa puede ser puesto para correr en 65293. De este modo, se preserva el area de UDGs. La rutina en codigo maquina se divide en dos secciones principales. La primera es la del Basic Extendido, la cual en primera instancia chequea la sintaxis de la linea/comando. La rutina llamada Stend es un punto de interrupcion oculto en la ROM Sombra. Si el micro esta ejecutando un programa, entonces el programa continua en ese punto. Si la sintaxis es chequeada entonces no hay retorno alguno. El computador proseguira chequeando la sintaxis de la sigte. linea o sentencia. Aquellos que han estudiado el Spectrum con cierto detalle sabran ya que al fondo de la pila se encuentra una direccion en la ROM. Esta direccion es de hecho la rutina para el manejo de errores. La accion de la parte del Basic Extendido (que es la parte despues del Call Stend) simplemente remplaza la direccion de la Rom con la de rutina de captura (TRAP). Si en una ultima etapa hubiere algun error o interrupcion del programa Basic, el computador saltaria a la rutina de captura. Esto haria que el micro siga corriendo el programa en la linea especificada por STEP LINE. En el proceso, la pila de la maquina es reconstruida. Como todos los programadores del Spectrum ya saben, cada reporte de error es acompañado de un numero o letra, los cuales se halan en el rango desde 0 (reporte OK) hasta R (tape load error). El codigo de la letra del reporte esta ordenado como valores desde 10 por A (Invalid Argument} hasta to 26 por R. Pero por alguna rara razon, los codigos de error son guardados en 23810 siempre con un valor menor al real. Asi que de hecho, el reporte 0 es almacenado como 255 y el reporte R es 25 mientras 9 es 8y asi sucesivamente. Si creamos una rutina que PEEKee, es entonces posible determinar el tipo de error que se ha producido. Esto es muy util si lo que necesitamos es determinar la diferenoia entre un error de carga en la cinta y el haber pulsado la tecla BREAK. Como resultado, el programa Basic tomara un curso de accion particular dependiendo de los ciertos errores que sucedan (ver programa ejemplo). Cargador Basic: 10 INPUT "Direccion de memoria ";a 20 IF a<27000 OR >65400THEN GOTO10 30 GOSUB99:POKE23735,c:POKE 23736,b: CLEAR a—1: LET a=PEEK 23736+PEEK 23736*256 40 FOR d:=a TO a+71:READ b: POKE d,b: NEXT d: LET a=a+62: GOSUB99: LET a=a-6 2: POKE a+32,c: POKE a+33,b: POKE a+44,c: POKE a+45,b 45 LET a=a+39: GOSUB 99: LET a=a—39: POKE a+63,c: POKE a+64,b: STOP 99 LET b=INT (a/256): LET c=(a-b*256): RETURN 100 DATA 215,24,0,254,205,194,240,1,215,32,0,254,202.32,22,215,32,0,215,130,28, 205,183,5,215,153,30,237,67,176,92,205,75,255,195,193,5,231,0,237,123,61,92,205, 75,255,237,75,176,92,237,67,66,92,62,0,50,68,92,195,125,27,1,52,255,42,61,92,113 ,35,112,201 Programa ejemplo: 1000 LET x=1000:STEP LINE 9000: PRINT xx l010 RETURN 1020 BORDER 89 1030 CAT 2 9000 LET error=PEEK 23610: LET x=x+10 9010 IF error=1 THEN PRINT "Lo siento pero no puedo encontrar xx" 9020 IF error=6 THEN PRINT "No hay subrutina" 9030 IF error=19 THEN PRINT "No puedes hacer BORDER de color 89" 9040 GOTO x " II. Sin el IF1 Una estupenda rutina de error ofrecida a ustedes, p.29 vol 50 #50 " Programacion: Spectrum Error Trapping (atrapando errores) por J. Collins Esta rutina para el Spectrum es una utilidad "On error goto" que empieza en la direccion 64000 y es de 77 bytes solamente. Una vez ejecutado y depurado, el programa salvara el codigo maquina a cinta usando un nombre de archivo especificado por el usuario. Para poder usar esta rutina en sus propios programas incluya las sigtes. lineas al comienzo de sus propios programas. El numero de linea 'line' es adonde se dara el salto cada vez que se encuentre un error. 2 LOAD "nombre" CODE 4 POKE 64077,line-(256*INT(line/256)) 6 POKE 64078,line/256 8 POKE 64079,1 10 RANDOMIZE USR 64000 El numero de la linea 8 es el de la sentencia a la que salta la rutina en la linea especicada cuando encuentra un error. 1 CLS: PRINT "Generando codigo - espere" 5 LET chk=0 10 FOR n=64000TO64076: READ a:POKE n,a:LET chk=chk+a:NEXT n 15 IF chk<>7749THEN PRINT "Error en los datos - verifique":STOP 20 INPUT "Nombre de archivo ?";LINE a$: PRINT "Salvando el codigo ...": SAVE a$ CODE 64000,77 25 INPUT "Verificar S/N ?";LINE b$: IF b$="S"THEN PRINT "Verificando el codigo ...": VERIFY a$CODE 640000,77 100 DATA 33,255,249,34,178,92,17,16,250,42,61,92,115,35,114,201, 205,84,31,48,251,58,58,92,198,49,254,58,56,2,198,7,50,129,92,62, 255,50,58,92,42,77,250,34,110,92,58,79,250,50,112,92,42,69,92,34, 176,92,42,89,92,0,0,0,205,82,22,213,225,54,232,35,54,13,195,206,18 " Mis observaciones: Sobre la primera rutina basta decir conque sin la Interfaz 1 no funciona. En cuanto a la segunda, si vemos las lineas a añadir a un programa y lo usamos con el ejemplo del programa anterior, nos damos conque ya no hay modo de salir pues nos deja "atrapados" literalmente ya que captura desde el STOP hasta el OK inclusive. El unico modo de salir es repitiendo los dos POKEs con un nuevo valor para line pero sin el USR. A continuacion un ejemplo usando RANDOMIZE y SEED: 5 RANDOMIZE 400: POKE 64077,PEEK23670: POKE 64078,PEEK23671: POKE 64079,1 10 RANDOMIZE USR 64000 20 INPUT "Introducir un numero ";n 30 LET r=SQR n 40 PRINT "La raiz de ";n'"es igual a ";r 50 PRINT "Fin" 55 RANDOMIZE 9999: POKE 64077,PEEK23670: POKE 64078,PEEK23671 400 REM rutina on error 420 PRINT "Numeros positivos, siempre" 430 PRINT "Intente de nuevo" 440 GOTO 10 9999 REM Nota: si no existe la linea a saltar, acaba con N lost statement. Nota2: parece ser incompatible con el 128k. (c)2022 zx_if1@hotmail.com