SERIE CLONICOS DEL SPECTRUM GOSH WONDERFUL Continuo con mi serie de textos dedicados a clonicos del Spectrum, esta vez traduciendo al castellano el texto original publicado en internet: " La ROM del ZX Spectrum GOSH WONDERFUL. Nombre: gw03.rom Version: 1.32 Fecha : 09-DEC-2004 Version 1.29 - es plenamente compatible con el Plus D y DISCiPLE Version 1.31 - corrige un fallo del tokenizador descubierto por Andrew Owen. Version 1.32 - introduce sentencias abreviadas a sugerencia de Andrew. " Iba a continuar traduciendo el texto de la version 1.32, pero al encontrar el texto de la version 1.33, decidi traducir todo el texto integro de esta ultima version: " La ROM del ZX Spectrum GOSH WONDERFUL. ====================================== Para usar con emuladores y quemadores EPROM. Nombre: gw03.rom Version: 1.33 Fecha: 02-JUL-2017 Nuevo : Removida la abreviacion de los tokens y la compatibilidad ha sido mejorada. ROM modificada por Geoff Wearmouth en Noviembre y Diciembre 2003. Amstrad PLC tiene el copyright de la ROM del ZX Spectrum. Amstrad gentilmente ha dado su permiso para la redistribucion de material con su copyright pero retiene dicho copyright. La gw03.rom es retro compatible con la ROM original del Specrum de 16K. Por eso se puede usar sin problemas. Ya tienen un manual, pero si no hubiese uno disponible online, otra vez gracias a Amstrad PLC. La gw03.rom es mas compatible con el BASIC del manual que la ROM original de 1982. En adicion, el BASIC tiene ahora RENUMBER y DELETE que eran algo estandar en las implementaciones de BASIC de 1970 y 1980 y es mas facil ver la memoria y canales FREE (libres). Esta ROM es plenamente compatible con la Impresora ZX asi como la Interface 1 y su RED ZX. Tambien opera bien con ResiDOS. Cualquier ayuda es recivida con agradecimiento en la direccion del email en la pagina principal. Ejm.: gwearmouth(at)hotmail.com Tokenizar ========= La mas obvia diferencia esta en el editor ya que las instrucciones deben ser tipeadas letra a letra. Debido a eso, las palabras del Basic ya no pueden ser usadas mas como nombres de variable. Tampoco es posible tipear PRINT CODE "BORDER" en mode 'L'. Si deseas volver al editor original y viceversa, puedes hacerlo tipeando 'STOP' en la linea de comandos. Tras cargar un snapshot el modo del teclado tal vez cambie. 'STOP' debe ser usado para seleccionar el modo de teclear preferido. Los juegos cargados de un 'tap' no afectan al modo de tipear en curso. Este modo de tipeo puede ser preferido especialmente si se trabaja con diferentes languajes de programacion. Comandos Extendidos =================== Aparte de 'STOP', la otra sentencia que no tiene significado cuando se tipea directamente es 'REM' y este es usado para entrar comandos adicionales directos. Un 'REM' en la linea de comandos muestra los comandos y la version de la ROM. Cada comando debe ser precedido por 'rem' tipeado ya sea en mayusculas o minusculas. REM streams ----------- Basado en 'Stream Lister' (listador de flujos) aparecido en un libro sobre microdrive de Andrew Pennell y aunque esta recortado, ayuda a ver que flujos estan en uso. Un estimado de memoria libre aparece en lo alto de la pantalla y es muy util para desarrollar programas. Esta ajustado para dar el mismo resultado que PRINT 65536-USR 7962 el cual aun sirve y nos da el resultado de 41473 en un Spectrum estandar sin nada. Con la Interfaz 1 y sus variables del sistema extra creados, el resultado es 41415. Es especialmente muy util cuando se usa con la Interfaz 1 y las Interfaces de MGT, y la memoria libre se reduce cuando los canales extra estan abiertos y se eleva cuando estan cerrados. Este comando ha revelado un nuevo bug en la Interfaz 1 y si tipeas OPEN #4, "S" REM streams entonces el nuevo flujo aparece pero habra que hacer CLOSE #4 no una vez sino dos para que el flujo se cierre realmente. REM delete {first} {last} ---------- El borrado en bloques es simple y eliminara todas las lineas BASIC entre la primera y ultima lineas dadas. Las lineas BASIC deben de existir y estar en el orden del numero menor a mayor. Solo espacios son permitidos como separadores. El comando STREAMS nos mostrara cuanta memoria ha sido reclamada. REM renumber {start} {step} {first} {last} ------------ Este es el comando mas poderoso y renumera todo o parte de un programa. La memoria libre sera afectada de un modo u otro y es mejor evitarlo usando este comando cuando haya poca memoria. REM renumber sin parametros, renumera todo el programa empezando en la linea 100. Todas las instancias de 'GOTO', 'GOSUB', 'RESTORE', 'LIST', 'LLIST', 'RUN' y 'SAVE LINE' tendran sus argumentos ajustados hai donde sea mas apropiado. REM renumber {start} empieza a renumerar a partir del numero de linea usando saltos de diez. REM renumber {start} {step} igual al anterior pero eleigiendo el salto entre lineas. REM renumber {start} {step} {first} renumera solo la ultima parte del programa comenzando por la linea especificada por el parametro 'first'. REM renumber {start} {step} {first} {last} restringe la renumeracion a un rango limitado de lineas. Esto puede ser usado para arreglar una subrutina pero tambien puede ser usado para reorganizar secciones del programa. Mientras encajen y no se superpongan sobre otras secciones, entonces un rango de lineas puede ser movido a una nueva posicion. Renumber siempre termina haciendo un ordenado de burbuja al programa BASIC, lo cual esta bien, ya que este tipo de ordenacion en BASIC fue una de las primeras cosas con la que experimente en mi Spectrum. Ordenar por burbuja un gran programa BASIC puede tomar varios min. INTERRUPCION NO ENMASCARABLE ============================ La rutina NMI tuvo su funcionalidad original restaurada y su funcion por defecto es llevar a cabo un reinicio en caliente. Originalmente el Spectrum iba a usar la direccion contenida en NMIADD (23728 y 23729) como un vector a la rutina NMI. Estas dos locaciones han sido dejadas en blanco y activando el salto NMI a la direccion $121C donde unos pocos bytes han sido a~adidos para lograr un reinicio en caliente. Dado que el Spectrum fue introducido primero, la interfaz 1 ahora usa 23728 y 23729 para controlar el ancho de la impresora y sobrescribe cualquier valor que uno haya puesto ahí cuando es paginado por primera vez. Lo que es mas, Plus D y DISCiPLE suprimen los mensajes de error si en 23728 hay un valor distinto de cero. Si no se da ningun conflicto de hardware entonces se puede activar la funcion original haciendo que RASP (normalmente da 64) tenga un raro valor como es 63. La ROM entonces usara la dir. en NMIADD si es no cero. Aunque el Reset en caliente por defecto fue planeado para ayudar al desarrollador de cod. maquina, permite a programas como Bomb Jack (IM2) y juegos en microdrive ser interrumpidos para estudiar sus tecnicas de programacion. Como sea un gran numero de programas de prueba eran para alterar CHANS, la long. de bytes de lineas BASIC y la dir. de E-LINE etc. haciendo del exito de caulquier Reset en caliente un asunto de acertar-y-fallar con cualquier otra cosa que no sean tus propios programas. El NMI de la ROM proncipal no es usado con las interfaces M.G.T., ZXCF o ZXATASP que paginan su propia ROM cuando la dir. $0066 es accesada. DISCiPLE y Plus D ================= Para hacer estos sistemas mas robustos, la rutina CLOSE ahora usa una tabla de busqueda con un marcador de final cero y toma las acciones adecuadas si el identificador de canal no esta presente con el comando estandar p.ejm. CLOSE #7 (en vez del comando M.G.T. CLOSE #*7). Los canales abiertos por las Interfaces M.G.T. se muestran en la pantalla con una letra 'D'. Otras características ===================== Este desarrollo ha estado siempre corto de espacio. Algunas bien conocidas imperfecciones han sido consideradas para dar una respuesta mas satisfactoria. A continuacion una lista de ellas: Fuente: Comprende tu Spectrum por el Dr. Ian Logan, 1982. (12 bugs listados en el apendice) 1) El error de 'division' - esta mal nombrado. La inexactitud mencionada ocurre en la rutina DEC_TO_FP y al intercambiar las operaciones de multiplicar y dividir ($2CDA) entonces a 0.5 es dada la forma en coma flotante de 80 00 00 00 00. La correccion sugerida es erronea y ha sido ignorada. 2) el error '-65536' como en PRINT INT -65536 que da -1. El arreglo del Dr. Logan es aplicado aqui (con mods) (en $3221) pero las otras secciones del codigo (en $30E5) NO se deben remover como el sugiere, ya que son requeridas. 3) La rutina 'ZX81 program name' (en $04AA) es removida con REC_EDIT. Todo ese espacio ha sido reutilizado. 4) El error 'CHR$ 9' es corregido llamando a PO_ABLE en preferencia al salto final a CL_SET/PO_STORE. 5) Los errores 'scroll?' y 'Start tape' se han corregidos con una nueva rutina CONS_IN que solo acepta una tecla (o ENTER). 6) El error del cursor en curso, corregido actualizando E_PPC_hi en vez de E_PPC_lo. 7) El 'error del espacio principal' no ha sido corregido y eso para que los listados en pantalla o impresora salgan tal como se ven en libros y magazines. (Originalmente corregido). 8) El error del modo 'K' no ha sido corregido ya que el modo aqui preferido es letra a letra. 9) El error 'CHR$ 8' ha sido corregido como sugiere el Dr. Frank O'Hara. 10) El error 'SCREEN$' ha sido corregido sustituyendo la sugerida instruccion RET. (en $257D) 11) El error 'STR$' ha sido corregido al remover el cero extra de la pila del calculador tal como se sugiere (en $2E25). El espacio fue creado cambiando un JP por JR. 12) El error 'CLOSE' se ha corregido verificando el estatus del flujo y dando un error si ya esta cerrado. Esto es mas por OPEN que da un mensaje si el flujo ya esta abierto. Para beneficio de las interfaces de disco de M.G.T. una tabla de búsqueda con cero como marca final es ahora usada. Fuente: The Complete Spectrum ROM Disassembly. by Dr. Ian Logan y Dr. Frank O'Hara, 1983 (lista varias cosas adicionales). 1) El bug del NMI se ha corregido y la logica cambiada tal como sugiere la Pag. 2. La nueva configuración predeterminada es para hacer un reset en caliente usando algo del cod. original y poniendo RASP con un valor impar permite al original vector NMIADD ser usado. 2) Las cadenas simples no son excluidas cuando haces SAVE DATA - Pag. 22. Ejm.: 10 LET a$="dodo": SAVE "animal" DATA a$() Ahora ya es rechazado pues no se carga corectamente. (credito: corregido por Dr. Ian Logan en la Interfaz 1 ROM). 3) Ahora existe una marca final para la tabla de busqueda de flujos en CLOSE, auqnue esto no era requerido en el original ROM independiente. Fuente: ZX Spectrum BASIC programming de Steven Vickers, 1982. (discrepancias) 1) El numero de linea deberia ser opcional en SAVE "nombre" LINE - Pag. 133. No corregido por razones de compatibilidad, pero es un cambio de una linea. Si RUN puede ser cero por defecto, entonces el auto arranque debe por defecto hacer lo mismo. 2) CLEAR hece RESTORE (Pag. 124). Eso parece ser un error del manual de BASIC, no de la ROM - ignorado. No es clara la functionalidad que el Dr. Vickers planeaba. Se podria hacer un caso logico para ambos. 3) "Noten que los numeros en una sent. DRAW pueden ser negativos, pero los de PLOT no" - Pag. 92 Corregido. 0<=x<=255, 0<=y<=175, de lo contrario Error B. 4) Similarmente POINT (x,y) permite coordenadas negativas. Corregido. Error B si no es 0<=x<=255, 0<=y<=175. Pag. 153. 5) ATTR (y,x) permite coordenadas negativas y no validas. Corregido. Error B si no es 0<=x<=31 y 0<=y<=23. Pag. 152. 6) SCREEN$ (y,x) permite parametros negativos y no validos. Corregido. Error B si no es 0<=x<=31 y 0<=y<=23. Pag. 154. Fuente: The Pitman Pocket Guide to the Sinclair Spectrum by Steven Vickers, 1984. (discrepancias no mencionadas antes.) 1) RESTORE. "No usar numeros > 9999, el programa puede colapsar." Siendo pedantes > 16383 - ver abajo. 2) "'Statement lost' (sentencia perdida) puede darse con RUN, GOTO y GOSUB cuando la linea esta entre 32768 y 61439." Corregido con nueva rutina que verifica SAVE LINE, LIST, LLIST, RUN, GOTO, GOSUB y RESTORE por lineas no validas. 3) "Debido a un bug, si accesdes a un canal de periferico y despues usas una sentencia de color, los controles de color se enviaran a ese canal por error." Corregido verificando que la pantalla es seleccionada primero por CLASS_07 y CLASS_09. 4) TABLA DE LAS TECLAS DE EDICION Cuando se ingresa de la red, RS232 o fichero microdrive, el cod. 6 (coma separador) es insertado en el buffer. ("ese es un bug. Deberia operar igual que CHR$ 14"). No corregido. Solución alterna: usar ' como separador es O.K. Fuente: www.nonowt.com "Bugs in the ROM" (muchas ya vistas. Algunas son guias de programacion no errores.) 1) La Monopolizacion del Error IY. Aunque no es estrictamente un error, la rutina de interrupcion debe ser modificada para evitar usar el registro IY. No corregido por razones de compatibilidad. La rutina de interrupcion continua usando el registro IY. 2) El error de PR_CC (creditos: Dilwyn Jones 1983, Andrew Pennell 1982). No Corregido. La variable del sistema 23681 no deberia ser utilizada. 3) Bug CLEAR PRINTER BUFFER (limpiar bufer de impresora). COPY aun limpia innecesariamente el buffer de impresora pero la posibilidad de un 'Out of screen' con... por ejemplo: PRINT : COPY : PRINT ha sido removido poniendo bit 1 de FLAGS durante la rutina. 4) Error en MAIN-4 COPY-BUFF. La posibilidad de un mensaje 'Out of screen' (fuera de pant.) ha sido removido, haciendo que CLEAR_PRB fije el bit 1 de FLAGS para indicar la posicion de la impresora ZX antes que la pos. de pantalla deba actualizarse.'LPRINT "p";: PRINT' y enseguida 'PRINT' operan OK. Algo menor. Noten que el mismo fallo se da con la Interfaz 1 cuando un reporte de error es generado cuando el cod. en MAIN-4 aparece en la Interfa 1. 10 LPRINT "p";: PRINT : GOTO 20 genera el reporte 'Program finished, 10:3' y corrompe la pos. de print. Ese bug tambien esta curado en la gw03 ROM. 5) La instruccion MAIN-4 HALT no esta corregida ya que no es mas un error. Su proposito original como un lugar seguro para el contador del programa cuando un return es hecho con las interrupciones desabilitadas ha sido restaurado. El NMI corregido provee un medio limpio de continuacion si es que la situacion se da. Por ejm. que un programador olvide habilitar las interrupciones antes de retornar al BASIC. 6) el WRITE TO ROM en $0000 por SKIP_CONS ha sido evitado simple mente poniendo valores no deseados donde ira el valor deseado. el WRITE TO ROM por la rutina SCROLL (credito: Philip Giblin) ha sido evitado, asegurandose de que todas las 24 lineas no se desplacen. 7) la instruccion e-to-fp no implementada del calculador puede ser removida asignando $3C para 're-stack' (volver a apilar). Cinco rutinas del calculador pueden requerir alteracion. Esto solo gana 2 bytes extra de espacio en ROM y no ha sido hecho por razones de compatibilidad y el magro beneficio. Es un remanente del ZX81. 8) Error INKEY$ #0. Se puede aplicar a cualquier flujo, pero los flujos 0 y 1 leen del teclado por defecto. Si el flujo elegido se ha asociado al teclado, entonces la cadena nula es casi siempre devuelta. No corregido ya que no tiene uso practico. Fallos y caracteristicas miscelaneos. 1) En el modo grafico, las teclas V, W, X, Y y Z dan palabras inapropiadss. Corregido no guardando una tecla mayor de 'U'. 2) tipear algo como LIST 40000 era silenciosamente cambiado a LIST 7232. Corregido. Ahora que es error, el cod. modificante (AND $3F) ya no tiene efecto y ha sido dejado. 3) ED-RIGHT alterado para prevenir que el cursor se posicione entre un caracter de control y su parametro. (credito: Andrew Owen) 4) Pulsar ENTER estando en los modos Grafico o Extendido no causa reversion al modo 'KLC'. Algo muy minoritario en verdad. 5) Hubo la intencion de que el flujo 0 se asociara a INKEY$ y el flujo 1 se asociaria a INPUT, pero el orden de rutinas en la rutina del comando INPUT previene lo ultimo y asocia ambos con el flujo 0. Eso ha sido corregido y ahora: OPEN #1,"S" : INPUT a$ da Error-J tal como debio de haber pasado en 1982. ----------------------------------------------------------------------------- Technical Information ===================== Renumber exitosamente renumera lineas que contienen cod. maquina en sentencias REM, en particular si contienen chr$ 13 y chr$ 14. Si no hay disponibles 20 bytes libres para apilar los 4 parametros o sus val. por defecto, entonces Renumber fallara dando un reporte 'Out of memory' (sin memoria). Renumber aun puede quedarse sin memoria, si por ejemplo, varios GOTO 10 son cambiados a GOTO 1000. Si eso pasa, entonces hay que completar el numero usando GOTO VAL "1000" con lo que realmente se puede incrementar la memoria libre. El NMI verifica el valor de RASP 23608 y si el bit 0 es fijado, usa la dir. de NMIADD (23728 y 23729) como rutina de servicio. Normalmente RASP reset el bit 0 y la rutina de servicio del NMI efectua un Reset en caliente igual que el Elan Enterprise. Muchos programas usan proteccion extra, osea que puedes no llegar a la linea de comandos. Programas que usan pags. de la ROM para vectorizar el modo de Interrupccion 2 deberian operar ya que las pos. $38FF, $39FF, $3AFF y 3BFF dirigen valores de 16 bit $FFFF. La ROM GW03 mantiene todos los puntos de entrada detallados en el Complete ZX Spectrum ROM Disassembly. Tambien tiene puntos de entrada utiles usados en libros y software. La Interfaz 1 de Sinclair usa puntos de entrada no estandares para llamar al codigo en la ROM base y estas se mantienen. El Disciple de MGT usa estos mas un juego adicional de puntos de entrada. La compatibilidad con hardware y software es por lo tanto alta. Esta ROM puede ser usada con muchos emuladores. El emulador BACTERIA usa el espacio extra antes del juego de caracteres para su sistema de ayuda pero es largo y mientras F1 no sea pulsado, no encuentro problemas. Esta ROM no es compatible con el Opus Discovery ya que copia partes sustanciales de ROM en la RAM, pone RET al final y lo ejecuta todo alli mismo. ------------------------------------------------------------------------ EJEMPLO DE SESION CON ZX Spectrum ------------------------------------------------------------------------ goto10 ; mays. o mins., espacios no requeridos restore 65000 ; nums. no validos pueden crashear - OK ahora print int -65536 ; da el resultado esperado print 1/2=.5 ; evaluado como verdadero print int (.5+.5) ; imprime 1 rem streams ; da el flujo estandar con 41473 bytes libres print "A"; chr$9 ;"B" ; imprime un espacio entre caracteres print : copy : print "Ok" ; ya no da error 'Out of screen' print attr(255,255) ; ahora da error 'Integer out of range' ------------------------------------------------------------------------ EJEMPLO DE SESION CON DISCiPLE o PLUS D con disco insertado ------------------------------------------------------------------------ rem streams ; open #4;d1;"test" out ; abre fichero para escritura asociado al # 4 rem streams ; muestra la letra 'D' junto al 4. print #4;"Howdy" ; escribe texto en el fichero close #4 ; normalmente crashea - ahora da GDOS error. close #*4 ; corrige la sintaxis del DISCiPLE rem streams ; open #1;d1;"test" in ; abre fichero para lectura input a$ ; lee del fichero no del teclado print a$ ; imprime 'Howdy' print inkey$ ; INKEY$ aun lee del teclado close #*1 ; INPUT vuelve a leer del teclado cat 1 ; cataloga la unidad 1 load p1 ; carga el primer programa en disco ------------------------------------------------------------------------ EJEMPLO DE SESION CON Interfaz 1 con cartucho microdrive insertado ------------------------------------------------------------------------ rem streams ; open#7,"s" ; asocia la pantalla con el flujo 7 close #7 ; el flujo no cierra la interface inicializa rem streams ; muestra 'S' junto al 7 close #7 ; una segunda vez y funciona. rem streams ; 41415 bytes libres open #9,"n";2 ; enlaza flujo 9 a la estacion de red 2 rem streams ; muestra 'N' junto al 9, memoria reducida close #9 ; reclama el canal de redes rem streams ; 41415 bytes libres open #0,"n";2 ; prueba aceptar comandos de otro Spectrum rem streams ; muestra si hay perdida de memoria ------------------------------------------------------------------------ " Mis apreciaciones He probado varias GS ROMS y mis resultados fueron los sigtes.: La ROM 1.27 es compatible con Wafadrive, Timex FDD, SpeccyDos y Didaktik 80. Acepta incluso al Opus Discovery. En cuanto al Beta128, es preferible pasar al modo 'K' antes de ir al DOS, si se desea usar RETURN para volver del DOS al Basic. Si solo se desea cargar algo antes, no habra problema. Los sistemas de MGT, Disciple y +D simplemente se cuelgan. Con la ROM 1.28 pasa lo mismo. La 1.29 no la he probado pero a partir de aqui ya es compatible plenamente con Disciple y +D. La 1.32 en efecto tiene comandpos abreviados al mismo estilo que las ROM de LEC: la 80lec y 528lec. La 1.33 aparentemente fue la ultima version en existencia y en efecto es tan plenamente compatible con todo lo antes dicho. Curiosamente aunque dice que el Opus D. ya no opera con la gw03.rom, en el emulador REALSpectrum, ambos parecen llevarse muy bien. En cuanto al nombre... ZX Spectrum GOSH WONDERFUL... como lo traduciriamos? "Oh mi Dios! Que maravilla!" o "el Spectrum es una maravilla por Dios!" o... acaso se refiera solamente a que su version de ROM gs lo es. (c)2023 zx_if1@hotmail.com