ZX SPECTRUM Borrando lineas y capturando errores ---------------------------------------------------------------------------------- A modo introductorio, he querido compartir una traduccion que le hice a un articulo publicado en el boletin SINC-LYNK vol.4 nro.4 de agosto/setiembre de 1986, en el cual se mencionan dos peque~as rutinas, siendo la primera para eliminar lineas y la ultima para capturar errores (la cual ya habia tratado antes en otro texto, pero sin hacerle un review). " BOB'S NOTEBOOK - la libreta de apuntes de Bob ---------------------------------------------------- AGO 5 1986 Ahora que ya tengo mi Spectrum Emulator de Zebra Systems, el cual de paso, funciona muy bien con el Larken DOS y el TiMachine de Cameron Hayne! Voy a ofrecerles algunas de mis notas sobre varios programas de Spectrum que yo he seleccionado para tal ocasion. La primera es una corta utilidad que provee de DELETE, funcion de borrado de bloques de lineas, a la cual estamos acostumbrados con el T/S 2068. Tipealo y verifica la DATA en la linea 5 ya que yo no he incluido CheckSUM; salvalo a una cinta y luego lo a~ades con MERGE a cualquier programa del Spectrum con el que lo quieras usar. Dejalo tal como esta y cada vez que necesites hacer un DELETE, simplemente usas GOTO 3. El codigo maquina de esta rutina lo he puesto en el area del buffer de la impresora, por lo que si justo has usado la impresora conectada, todo lo que tienes que hacer es GOTO 3, de lo contrario GOTO 1. El programa es el que viene a continuacion: DELETE para el ZX SPECTRUM 1 INPUT "Eliminar" ' "desde la linea "; from; "hasta la linea ";to: IF from<6 OR to>9999 OR from>to THEN GOTO 1 2 RANDOMIZE from: POKE 23296,PEEK 23670: POKE 23697 ,PEEK 23671: RANDOMIZE to: POKE 23298,PEEK 23670: POKE 23299,PEEK 23671: RAMDOMIZE USR 23300: STOP 3 RESTORE 5: FOR i=0 TO 18: READ value: POKE 23300+i ,value: NEXT i 4 GOTO 1 5 DATA 42,0,91,205,110,25,229,42,2,91,35,205,110,25,209,205,229,25,201 ======================== Gracias a Personal Software Magazine de oto~o de 1985, tengo una buena utilidad ON ERR la cual les ofrezco con algunas de mis anotaciones. ON ERROR para el ZX SPECTRUM Carga el codigo hexadecimal que les muestro aqui, a partir de ED00. Tambien he puesto el codigo desensamblado. Salvalo a cinta con: SAVE "ON ERR"CODE 60672,64 cuando lo vuelvas a cargar, podras reubicarlo donde quieras, por ejemplo, en 50000. La rutina ON ERR se activa mediante 'RANDOMIZE USR nnnn' donde 'nnnn' es la direccion de tu eleccion. Ahora pon siempre al comienzo del programa: "RAMDOMIZE USR nnnn”. La sigte. linea sera: "POKE 23610,255" Finalmente, asegurate de que la ultima linea del programa sea "STOP". He incluido un listado de programa demostrativo para que lo pruebes. Llena una matriz de modo que ya no lo puedes detener hasta que el programa mismo termine con la sentencia STOP. Otras acciones pueden ser efectuadas usando las sentencias apropiadas del BASIC. Por ejemplo: "IF PEEK 23610=14 (nombre de archivo no valido) THEN GOTO 120 (num. de linea del nombre de arch.)" Debes conseguir una copia del articulo aqui mencionado para leer mas sobre esta util rutina. [Codigo en hexadecimal] ED00 21 0F 00 09 22 B0 5C EB ED08 2A 3D 5C 73 23 72 C9 3A ED10 3A 5C 3C 28 02 FE 09 CA ED18 03 13 21 44 5C CB 7E 28 ED20 0B 3A 47 5C 3C 77 2A 45 ED28 5C 22 42 5C 21 00 00 7C ED30 32 71 5C 22 0B 5C 2A B0 ED38 5C E5 2A 42 5C C3 9E 1B [Listado en ensamblador] ED00 210F00 LD HL, 000F ED03 09 ADD HL, BC ED04 22B05C LD (5CB0), HL ED07 EB EX DE, HL ED08 2A3D5C LD HL, (5C3D) ED0B 73 LD (HL), E ED0C 23 INC HL ED0D 72 LD (HL), D ED0E C9 RET ED0F 3A3A5C LD A, (5C3A) ED12 3C INC A ED13 2802 JR Z, ED17 ED15 FE09 CP 09 ED17 CA0313 JP Z, 1303 ED1A 21445C LD HL, 5C44 ED1D CB7E BIT 7, (HL) ED1F 280B JR Z, ED2C ED21 3A475C LD A, (5C47) ED24 3C INC A ED25 77 LD (HL), A ED26 2A455C LD HL, (5C45) ED29 22425C LD (5C42), HL ED2C 210000 LD HL, 0000 ED2F 7C LD A, H ED30 32715C LD (5C71), A ED33 220B5C LD (5C0B), HL ED36 2AB05C LD HL, (5CB0) ED39 E5 PUSH HL ED3A 2A425C LD HL, (5C42) ED3D C39E1B JP 1B9E [Programa ejemplo] 20 RANDOMIZE USR 60672 30 POKE 23610,255 40 PRINT "setting up array" ' "try to BREAK in" 50 DIM N(300) 60 FOR i=1 TO 300 70 LET n(i)=1/INT(10*RND) 90 NEXT i 240 STOP R.H.Mitchell " Para cerrar... MIS APRECIACIONES La rutina DELETE Funciona perfectamente sobreentendiendo que la mayoria de programas empieza siempre en la linea 10. Si el listado original empieza con la linea 1, entonces o se reubica la rutina dentro del listado o se renumera todo el programa. Debido a que usa el bufer de impresora ZX, solo funciona en un 48k, pero en un 128k habria que ver el modo de reubicar el codigo maquina a otra area. Para aclarar mas el texto ofrecido, en modo comando bastaria con GOTO 1 y seguir las solicitudes del INPUT. Pero si se ha usado la impresora ZX, pues hacer primero GOTO 3 para reinsertar el C.M. otra vez y asi usar ya la rutina. Optima para usarse con la programacion modular y la tecnica del "overlay" simulando el CHAIN MERGE DELETE en el Spectrum. En este caso debemos convertirla en una subrutina y reemplazar el INPUT por LETs e invocarla mediante GOSUBs. Si nos fijamos en la linea 2 veremos que es un buen ejemplo del uso de RAND para pasar valores doble poke a una rutina en C.M. La rutina ON ERR Tal como menciona el autor de esta miscelanea, la rutina de captura de errores dice el, que fue originalmente publicada por la revista Personal Software, y sugeria que uno lea la edicion original por mas informacion. Resulta que es la misma rutina publicada por la muy britanica Computing Today y sucede tambien que ambas eran de la misma editora, asi que ya no me asombra que fuese publicada dos veces y republicada por tercera vez en el newsletter norteamericano Sinc-Lync. Caracteristicas de la rutina La rutina es plenamente reubicable. Y la primera linea en el programa que la use, debe ser con RANDOMIZE USR 60672 y POKE 25610,255. Una vez se ha activado capturara todos los errores reportados mediante una letra asociada a un valor numerico interno, por eso le es imposible capturar los errores de Microdrive y similares pues estos no tienen un codigo asignado. Fue dise~ada para no capturar STOP ni OK, de modo que uno pueda terminar el programa sin acabar atrapado en un bucle sin fin, cosa que puede pasar con aquellas rutinas ON error que si lo hacen. En el caso de discos: captura los errores del disco en timex FDD, evitando que se pare el programa con el mensaje generado por el error y este continue como si nada. Lo mismo pasa con Opus, Didaktik y Kempstondos. Se cuelga con los errores de Disciple y +D. Compatible con el Beta128. No captura los errores del MB-02+. Incluyendolo en una ROM Tras ver tanta ROM de 16k del Spectrum modificada, como por ejemplo, LEC o Mistrum, decidi crear mi propia ROM modificada. Gracias al libro "The Complete Spectrum Rom Disassembly" de Dr. Ian Logan & Dr. Frank O'Hara, corregi unos cuantos 'bugs' pero se me ocurrio que podia incluirle una rutina 'on error' en el area libre de la ROM y ya que la de Computing Today es reubicable y no necesita POKEarsele nada, pues me parecio la rutina ideal. A mi mod la llame 48onerror.bin durante su edicion y basta con cambiarle la extension a .rom para que cualquier emulador la acepte. Ahora todavia hay sitio para meterle algo mas, pero no se me ocurre que otra cosa agregarle, asi que lo dejo tal cual por el momento. Una vez que he escogido un emulador que me permita reemplazar la ROM, pongo mi 48onerror.rom en accion y ya que no cambie el mensaje inicial, no parece ser en nada diferente del original hasta que usamos la rutina, esta vez mediante RAND. USR 15551 (3CBF). Las unicas ventajas son que ya no ocupa espacio en RAM y tampoco hay que estar cargandola de una cinta o disco. Y eso es todo cuanto experimente con dicha rutina. (c)2024 zx_if1@hotmail.com