ON ERROR GO TO de Computer Kontakt Continuando con las rutinas de captura de error para el Spectrum, paso a traducir un articulo publicado en idioma aleman por Computer Kontakt de febrero/marzo de 1986, en su pag. 22: " ON ERROR GO TO ZX Spectrum 16/48 K Con esta rutina en CM, la computadora salta a una línea previamente definida cuando ocurre un error y continúa el programa desde allí. Para hacer esto, debe activar la función antes de que se de un error con RANDOMIZE USR 65000 y luego se especifica el salto con RANDOMIZE número de línea (sin USR). La función se puede desactivar de nuevo con RANDOMIZE USR 65012 y se emiten entonces los mensajes de error normales. Después de iniciar el cargador, puede elegir si esto debe suceder automáticamente después de cada salto ejecutado o no. A continuacion se genera un CM ligeramente modificado, que se salva como "ON ERROR a" o "...b". Después de cada salto causado por un error, los números de línea y declaraciones también están en las variables de sistema OLD PPC o OS PPC (el código de error en ERR NR) y se puede consultar allí con PEEK. Dado que la rutina no se puede reubicar fácilmente en la memoria, ya que de todos modos sería necesario usarla en un dispositivo de 16K, el cargador ofrece una opción para hacer los cambios necesarios. Se comunican las nuevas direcciones de inicio. Al escribir, también es importante asegurarse de que los valores sean correctos, ya que la suma de verificación no los verifica. El siguiente programa demo es un ejemplo de su aplicación, pruébelo con ambas versiones (a + b) con GOTO 100. Cuando se usa la versión "a", aún es posible hacer un BREAK, pero no con "b", ya que la función de salto se mantiene aquí y BREAK cuenta como un error al igual que "OK" (!). Por lo tanto, el programa siempre vuelve a la línea 1000. De esta forma, solo es posible salir del programa eligiendo un modo de escape (en el ejemplo, ingresando un número razonable en INPUT). Si no se asigna un número de línea a la rutina con la orden RANDOMIZE x, se asume el valor predeterminado 9999. Además, si ingresa un número de línea no válido con la versión "a", aparece el mensaje "LINE @, x:y" (código de error 146). La versión "b" por otro lado, no lo hace con tales errores. ¡Así que ten cuidado! Lorenz Weiler " A continuacion el programa: 1 REM ON ERROR GO TO 2 REM ********************** 3 REM by Lorenz Weiler 4 REM Albr.-Duerer-Str.5 5 REM 3200 HILDESHEIN 6 REM ********************** 10 DATA 42,61,92,54,253,35,54,253,1,15,39,201, 42,61,92,54,3,35,54,19,201,33,3,19,229 15 DATA 237,75,118,92,33,15,39,167,237,66,48, 2,207,146,42,69,92,34,110,92,58,71,92,50,112,92, 205,106,30,195,158,27 17 LET ad=65000: INPUT "Start bei 65000 ? (j/n )";e$: IF e$="n" THEN INPUT "neue Addesse :";ad 20 CLEAR ad-1: LET s=0: LET d=0 21 LET ad=PEEK 23730+256*PEEK23731+1 25 INPUT "Automatisches Inaktivieren nach jede m Sprung ? (j/n)";e$: IF e$="n" THEN LET d=1 30 FOR n=ad TO ad+56-2*d: READ c: LET s=s+c: POKE n,c 35 IF d=1 AND n=ad+21 THEN POKE n,59: LET n=n +1: POKE n,59: LET s=s+251: RESTORE 15 40 NEXT n 42 POKE ad+7,INT ((ad+21)/256) 43 POKE ad+4,256*((ad+21)/256-PEEK (ad+7)) 45 IF s<>5062 THEN PRINT FLASH 1;AT 10,2;"Fe hler in den Zeilen 10 - 35": STOP 50 PRINT " Daten fehlerfrei:" 55 PRINT "Funktion aktivieren: ";ad 57 PRINT '" '' inaktivieren: ";ad+12 60 PRINT AT 15,0;"=>CONTINUE zum Saven des MC" 65 STOP 70 CLS: PRINT AT 10,6;"SAVING CODE ";ad;","; 57-2*d 80 SAVE "ON ERROR "+CHR$ (97+d)CODE ad,57-2*d 90 STOP 95 REM 96 REM Testprogramm 97 REM 98 REM deutshe Fehlered 99 REM 100 LET akt=ad 110 LET inakt=ad+12 120 RANDOMIZE USR akt 130 RANDOMIZE 1000 135 REM 140 INPUT "Geben sie irgendetwas Error er- zeug endes ein! (Zahl fuer quit)"'a 145 REM 150 RANDOMIZE USR inakt 160 PRINT AT 10,10;"Kein Error": STOP 180 REM 190 REM 1000 LET e=PEEK 23610: INPUT "" 1010 PRINT #0;CHR$ (49+e+7*(e>9));" "; 1020 IF e=1 THEN PRINT #0;"undefinierte Variable"; 1030 IF e=5 THEN PRINT #0;"Division durch 0"; 1040 IF e=16 THEN PRINT #0;"STOP bei Eingabe"; 1045 IF e=20 THEN PRINT #0;"Jetzt nix mehr BREAK"; 1050 PRINT #0;", ";PEEK 23662+256*PEEK 23663;":" ;PEEK 23664 1060 PAUSE 0: CLS : GO TO 100 Mis observaciones: Hasta el momento de escribir estas notas, existe una version del programa que puede ser descargada ya sea de Spectrum Computing o World of Spectrum, pero ha sido alterado en cierto modo como veremos enseguida. Algunos textos fueron modificados: 17 ...: INPUT "Ablegen ab 65000 ? ".... 45 ...: ... "Fehler in DATA": ... 50 ... " Startadressen:" 60 ... " Saven des Codes "; ... 99 REM *Testprogramm* GOTO 100 160 ... : LIST 99 - en vez de STOP quedando en bucle sin fin y muchas lineas REM fueron eliminadas: 2 - 6, 65, 95 - 98, 180 - 190 se fusionaron las lineas 10 y 15 en una sola, esto ultimo hace imposible las condiciones de las lineas 25 y 35, lo que me obliga a eliminarlas (debido a que la fusion de las DATAs hace que RETORE 15 acabe invocando una linea que ya no existe mas) tambien, para asi poder ejecutar de forma correcta el programa. Aun asi, es claramente el mismo programa, pero sin reconocer al autor o la fecha de su realizacion. Mi traduccion de los textos y adaptacion del listado: 17 LET ad=65000: INPUT "Mantener dir. 65000 ? (s/n)";e$: IF e$="n" THEN INPUT "nueva direccion :";ad 25 INPUT "Desactivar automaticamente después de cada salto? (s/n)";e$: IF e$="n" THEN LET d=1 45 IF s<>5062 THEN PRINT FLASH 1;AT 10,2;"Error en los datos": STOP 50 PRINT ''''"Direcciones para..." 55 PRINT "activar la funcion: ";ad 57 PRINT '"desactivarla: ";ad+12 60 PRINT AT 15,0;"Salvando el Codigo ";ad;",";57-2*d 80 SAVE "ONERROR."+CHR$ (97+d)CODE ad,57-2*d 100 LET on=ad 110 LET off=ad+12 120 RANDOMIZE USR on 140 INPUT "Ingrese cualquier error (un numero para salir) ";a 150 RANDOMIZE USR off 160 PRINT AT 10,10;"No hay error": STOP 1000 LET err=PEEK 23610: INPUT "" 1010 PRINT #0;CHR$ (49+err+7*(err>9));" "; 1020 IF err=1 THEN PRINT #0;"Variable sin definir"; 1030 IF err=5 THEN PRINT #0;"Division por 0"; 1040 IF err=16 THEN PRINT #0;"STOP en input"; 1045 IF err=20 THEN PRINT #0;"BREAK en el programa"; Esas son las unicas lineas que he modificado del listado original. La rutina funciona tanto en un 48k como un 128k pero no con el +3. (c)2022 zx_if1@hotmail.com