EL ZX SPECTRUM, PUERTOS SERIALES, PARALELOS Y MODEMS ó "no solo de impresoras vive el Spectrum". A modo de introducción En mi colección de notas llamada "EMULANDO LA IMPRESORA ZX ASI COMO OTRAS INTERFACES SERIAL Y PARALELO PARA ZX SPECTRUM" me limité precisamente a eso, tratar solo de las impresoras e interfaces para conectarlas a un ZX Spectrum. Aquí, en cambio trato de ver y comparar qué otras opciones aparte de las impresoras me ofrecen dichas interfaces, como es la comunicación mediante modems y cosas así. El texto se divide en varias partes: la primera trata sobre el serial del IF1 y sus comandos para su uso. La segunda es acerca de los conectores incorporados en los modelos 128k, +2, +3 y +2a. La tercera compara las opciones que ofrecen otros perifericos, como son el Wafadrive o el +D, por ejemplo; así como aquellos que no han sido replicados hasta ahora en ningún emulador. Y para cerrar vuelvo a explorar con más detenimiento el 128k y su toma serial. Y ahora sí, pasamos a... Parte 1 El ZX INTERFACE 1 Sentencias del serial: FORMAT, SAVE*, LOAD* Experimentando recientemente acerca de qué tan bien ha sido emulado el puerto serial del IF1, debido a que segun el manual existen dos curiosas sentencias a los que no les veo mucho uso y como no tengo un IF1 real, pues, ignoro como aprovecharlo si se puede. El caso es que estas sentencias son LOAD *"b" y SAVE *"b" pudiendo ser usadas para salvar programas enteros, SCREEN$, CODE y hasta DATAs por medio del SERIAL pero... ¿a dónde los manda? a otro Spectrum supongo con ZX IF1 y serial, pero en la maquina real esta FORMAT "n" para la red y debería bastar, pienso. Solo que en un emulador no veo que se puedan conectar 2 maquinas por este medio, así que decidi probar que hacian SAVE y LOAD serial. Para empezar, intenté con el REALS pero este solo permite crear un SERIAL.BIN para escritura y no puede volver a leerlo, de intentarlo lo borra o reinicia a cero. Lo lógico es primero pulsar F3 para ir a las opciones de hardware y buscar la ZX IF1 en periféricos discos. Seleccionarla y luego pulsar ALT+F3 para ver las opciones de comunicación, una vez ahí ir a rs232 y pulsar el cursor hasta que uno llegue a la opción "serial.bin", pulsar ENTER hasta salvar el archivo y así iniciarlo. Hice FORMAT "b";9600, CIRCLE 100,100,50 y lo salvé con SAVE *"b"SCREEN$. Sali de REALS y verifiqué que el fichero BIN había sido creado, leí el archivo BIN en Spectaculator 5.3, y entonces hice LOAD *"b" SCREEN$ y lo cargó sin problemas. Es decir, el circulo apareció en pantalla. En este emulador, hay que tener el IF1 activo y luego ir a las opciones de su puerto rs232 y buscar el fichero serial.bin para abrirlo como lectura (input). Probé ese mismo archivo tambien en el EIGHTYONE y funcionó igual que antes. Incluso lo probé con el viejo Z80 en DOS, así como WINz80 cargando y salvando sus propios ficheros .SAV que se leen igual que si fueran .TXT y no pude quejarme, ya que SERIAL.BIN puede ser renombrado y leido por estos emuladores incluso como TXT. Aun así, no he logrado encontrar mayor utilidad a esto de enviar datos a un fichero BIN, excepto confirmar que la emulacion es optima. Fuera de estos tres, parece que ningun otro emulador puede leer y escribir a un TXT con el puerto serial. Ah... de hecho descubrí que también existe la posibilidad de usar MERGE*"b", el cual no esta mencionado en el manual del ZX IF1, asi como VERIFY*"b", pero a este último ya no le veo utilidad alguna. Como sea, me divirtió descubrir que con MERGE se podia cargar programas Basic a traves del serial. No sé si otros habrán experimentado igual... Nota: todo lo antes mencionado, fueron mis experimentos hechos en el 2007, y ahora... En suma: El original ZX Spectrum 48k se completaba definitivamente con la ZX printer, la ZX IF1 con los ZX microdrives y el ZX IF2. Incluso sin los Microdrives, la ZX IF1 era una poderosa expansión que ampliaba el potencial del Basic Sinclair, al dotarlo de instrucciones de RED, una toma serial para conexión de impresoras, comunicación mediante modems, así como la posibildad de añadirle nuevas órdenes e instrucciones al Basic del Spectrum. Conclusiones: La primera es algo que no pensé entonces cuando experimentaba con los comandos SAVE *"b" y LOAD *"b" en los emuladores mencionados y es que fueron pensados para usarse con modems conectados al puerto serial del ZX IF1. La segunda es que "serial.bin" actúa en el REALS como un modem virtual, y solo puede emitir, así que el fichero debe ser abierto por otro emulador como por ejemplo Spectaculator, convirtiendose este en el receptor. Como ya descubrí, el archivo "serial.bin" que REALS crea, no puede ser leido ni reutilizado más que por cualquier otro emulador que no sea el propio REALS. Uno debe luego renombrarlo siempre que se quiera conservar su contenido. En cambio, Spectaculator puede leerlos, y también escribirlos solamente cuando se activa la emulación del IF1. Aparte de REALS y Spectaculator, ha sido emulada también por Eighty-One, z80, Win-z80, Warajevo, parcialmente por x128w, EmuZwin 2.5 y FUSE. Pero no todas añaden la emulación del serial. Y continuamos con... Parte 2 SPECTRUM 128k, +2 y +3 Sentencias: FORMAT, OPEN#, CLOSE#, LPRINT, INPUT#, INKEY$# El original ZX Spectrum 48k carece de interfaces tanto serial como paralelo de base, ya sea para conectar impresoras, redes o modems. Por lo tanto, requería de ya sea la ZX IF1 por el conector serial, o de alguna de las muchas interfaces que salieron al mercado en ese entonces, para dotarlo tanto de toma serial o paralelo. En cambio, los modelos 128k y +2 vinieron con toma serial de fábrica, mientras los modelos +3 y +2a añadían a todo eso, también el paralelo. Veamos lo que dice el manual original del 128k español, este modelo viene con una toma serial, que puede ser usada para conectar ya sea una impresora, un modem o un sistema MIDI (el cual será tema para otra ocasión). Ahora, el manual se limita a la impresora y solo nos dice que si conectamos un modem podemos leerlo mediante INPUT #3. Es todo. Ni siquiera un listado ejemplo de su aplicación. El texto en inglés del 128k británico peor, ni menciona algo al respecto. Los manuales de Amstrad del +2 y +3 también hablan solamente sobre la impresora, pero del modem o como usarlo desde el Basic, nada de nada. Algo que tampoco se menciona es que el serial debería permitir conectar dos 128k o +2 y lograr que se intercomuniquen entre sí. Pasamos a probar con los emuladores, a ver qué obtenemos. Empiezo de nuevo con REALS. Creo un fichero "serial.bin" y selecciono el 128k. Tipeo FORMAT "p",9600 y a continuación: 20 FOR n= 1 TO 10 30 LPRINT n 40 NEXT n Cierro REALS y verifico que el fichero fue creado. Vuelvo a intentarlo, esta vez creando un "lprint.txt"; paso a seleccionar el +2a y tipeo el mismo ejemplo de antes. Cierro de nuevo REALS y verifico que se creo el nuevo fichero. Muy bien, ahora, la pregunta es ¿qué hacemos luego con estos ficheros? REALS los crea pero no los puede volver a leer. Los demás emuladores tampoco permiten al 128k, +2, +2a/b o +3 leer de su puerto serial. La mayoría ni emula tal opción. REALS ha enviado información y los únicos que pueden leer (recibir) son Spectaculator, WinZ80, y EightyOne. Y estos solo tienen emulación de input y output cuando se selecciona la ZX IF1. Paso pues a usar Spectaculator y abro el "serial.bin" para su lectura. Selecciono 128k con IF1 y tipeo lo sigte.: FORMAT "t";9600 10 OPEN #3;"t" 20 FOR n= 1 TO 10 30 INPUT #3;m 40 PRINT m 50 NEXT n 60 CLOSE #3 Ejecuto el listado y el borde cambia mientras los datos aparecen en pantalla. Vuelvo a hacer RUN y esta vez solo obtengo cambio de borde, pero no relee el fichero desde su inicio, sino que trata de leer lo que hay a continuación. Al no encontrar nada más, se queda en espera hasta que hago BREAK. Reemplazo el "serial.bin" creado con 128k, por el "lprint.txt" generado por +2a, Vuelvo a ejecutar la rutina y de nuevo logro leer la información contenida en el fichero, pero de nuevo queda en espera y no muestra nada si reintento leerlo de nuevo con RUN. Prosigo ahora con EIGHTYONE, con los mismos resultados que antes. WINZ80 idem. En suma: Dos Spectrum 128k pueden conectarse directamente mediante el puerto serial, pero al carecer de comandos de intercambio como los que posee el IF1, todo se limita a datos tipo OPEN#/CLOSE#. Un modem puede ser conectado directamente, pero sin el software adecuado, no hay más intercambio de datos que no sean mensajes tipo INPUT#/PRINT#. Conclusión: Habría que probar a conectar dos PCs usando un cable serial a COM1 en ambos. Uno con Spectaculator y el otro con EightyOne. Un emulador en modo 128k o +2 y el otro con la ZX IF1 activa. Luego probar uno con +2a o +3 y el otro con 128k o +2 pero sin IF1. En este caso, REALS podría ser probado con ambas PCs, ya que este emulador admite el serial a COM1 o COM2, lo cual puede ser usado tanto para lectura como para escritura o recepción/envío de datos, tanto con ZX IF1, 128k o +3. Visto eso, seguimos con... Parte 3 Otros dispositivos e interfaces 3.A - SISTEMAS EMULADOS Pasamos a continuación a ver, los perifericos para el Spectrum que ofrecen toma ya sea serial, paralela y/o modems, que han sido replicadas por los emuladores en existencia para el Spectrum. WAFADRIVE Veamos qué es lo que nos dice el manual: Para conectar todo tipo de periféricos, el Wafadrive de Rotronics, ofrece dos puertos, uno serial y otro paralelo. Ambos pueden ser usados para conectar impresoras. Pero el serial puede servir también para conectar ya sea terminales, modems, incluso otras computadoras. Aunque el Basic es muy lento y restringido para una comunicación eficiente, sí es posible obtener buenos resultados. La información puede ser recibida mediante INPUT# e INKEY$#, siendo más usado el último pues no requiere retorno de carro. Si uno tiene un terminal u otro periférico serial que trasmita, es posible leer y mostrar lo que este trasmite, mediante la sigte. rutina: 10 FORMAT *"r";2400: REM lo que sea apropiado en baudios 20 OPEN #*4,"r" 30 PRINT INKEY$ #4; 40 GO TO 30 Hasta el momento de escribir estas notas, solo existe en el Real Spectrum y x128w en su versión 095 open alpha. Pero ninguna parece emular sus puertos de comunicación. OPUS DISCOVERY Posee solamente un puerto paralelo, que según el manual puede ser usado además de conectar impresoras, también para envío y recepción de datos, o sea que nos permite crear comunicación entre Spectrums, o entre estos y cualquier otro periferico que ofrezca dichas opciones. Esto se hace mediante los sigtes. canales: "b" - Input / output al puerto paralelo. "t" - Input / output al puerto paralelo. El ZX IF1 usa dichos puertos para la conección serial, mientras el Opus los usa para comunicacrse mediante el puerto paralelo de modo similar. Los sigtes. comandos pueden ser usados con canales: SAVE*# - equivale a SAVE*"b" del IF1 con la misma sintaxis. LOAD*# - como LOAD*"b" del IF1 MERGE*# - igual que MERGE*"b" (no mencionado) del IF1 VERIFY*# - como su contraparte (tampoco mencionado) IF1 Si creemos y confiamos en el manual, entonces podríamos conectar dos Spectrums mediante sus respectivos Opus Disc. a traves del puerto paralelo. Para replicar el ejemplo del IF1 antes mencionado, tendriamos que tipear en un Spectrum: OPEN #3,"b" CIRCLE 100,100,50 SAVE *#3 SCREEN$ y en el Spectrum receptor tipeariamos: OPEN #3,"b" LOAD *#3 SCREEN$ Emulada correctamente en REALS primero, posteriormente tambien en Eighty-One y FUSE. Este último no parece ofrecer emulación de su toma paralelo hasta el momento de hacer estas notas en su versión Windows a lo más. Disciple y +D Ambas interfaces ofrecen toma paralelo para impresora, pero solo el Disciple posee conexión a red igual que el ZX IF1. Sus respectivos manuales no mencionan nada acerca de poder usar el paralelo para interconectar dos Spectrums del mismo modo que lo hace el Opus Discovery. Tampoco ofrece comandos similares a los del IF1 y Opus para intercambiar información entre sistemas, pero ya que posee INPUT# e INKEY$#, debería ser posible algún tipo de comunicación entre dos Spectrums a traves del puerto paralelo del +D. Habría que probar intentarlo a ver si es o no factible. Los emuladores que la admiten son: REALS, Spectaculator 8.xx, Eighty-One, z80, x128w y FUSE. Estos últimos carecen de la emulación del paralelo. MODEM T/S-2050 EightyOne es el único que ofrece emulación del modem de TIMEX, el TS-2050, con las opciones de usar un TXT, el conector COM1, y por ultimo la opción TCP/IP, la cual requiere de una dirección y puerto al cual conectarse. 3.B - LOS NO EMULADOS. Además de los antes mencionados, existen otras interfaces que también ofrecen conexiones seriales o paralelo y modems. Entre los sistemas no emulados aun, tenemos: Swift Disk I y II Para activar el puerto serial debe hacerse por ejemplo: FORMAT %#3,"t";9600,79 De acuerdo con el manual, su serial es para conectarle una impresora. Ninguna mención sobre la posibilidad de conectar dos màquinas mediante esta toma para intercambiar información o usar un modem con ella. Pero considerando que es serial, debe poder hacerse lo mismo que con el 128k, o el Wafadrive. Cosa de probar.´ Timex FDD-3000 Al igual que la IF1 y el Discovery, el FDD posee una buena cantidad de comandos para manejar la comunicación por medio del serial desde el BASIC. FORMAT * c$ donde c$ = ":CH_A" ó ":CH_B" - selecciona el canal del puerto a usar. De este modo los ejemplos anteriores pasan a ser, para el trasmisor: 10 FORMAT *":ch_a": REM activa el serial puerto A 20 OPEN #*1;":cha_a";o 30 IF INKEYS$=¨¨ THEN GOTO 30 45 PRINT INKEY$; 50 PRINT *#1;INKEY$ 60 GO TO 30 Y en la unidad receptora: 20 OPEN #*1,":ch_a";i;1 30 INPUT *#1;a$; 35 PRINT a$; 40 GO TO 30 SAVE* c$ - equivale a SAVE*"b" del IF1 con la misma sintaxis. LOAD* c$ - como LOAD*"b" del IF1 MERGE* c$ - igual que MERGE*"b" (no mencionado) del IF1 La unidad que trasmite usa SAVE*, mientras la receptora usa LOAD* o MERGE* MOVE* ... TO ... - similar al MOVE del IF1 El trasmisor usa: MOVE*"file" TO c$ y el receptor: MOVE* c$ TO "file". Modem VTX-5000 Diseñada por PRISM, para los modelos originales de 16 y 48k. Permitía conectar con la MICRONET 800 o PRESTEL por el teléfono. Así como la comunicación entre dos Spectrums mediante un programa en cinta que venía con el aparato. EN SUMA: un 48k clásico o plus, requería del IF1 para poder tener sistema de red, y serial para impresoras o modems; el MULTIPRINT para impresoras con toma paralelo Centronics y el modem vtx5000 para comucnicación vía telefónica. El 128k o el +2 venían ya con toma serial para impresoras, modems o MIDI, así que la IF1 y su serial era un verdadero "extra". El OPUS, por otro lado le añadía el paralelo que le falta, convirtiendose en un buen complemento. El T/S-2068 tenía por un lado su modem T/S-2050, siendo perfectamente completado con el FDD-3000 que le añade dos tomas seriales tanto para conectar impresoras o comunicarse entre dos máquinas Timex o Sinclair. Y por último... Parte 4 RETOMANDO AL 128k. Muy bien, una vez revisado todo lo anterior, no quise terminar esto sin antes volver a retomar el 128k y ver qué más podía experimentar con su serial. (Obviamente con el REALS en mi PC) Para replicar el comando SAVE*¨b¨SCREEN$ en el Basic 128k, debemos tipear: FORMAT "p",9600 una vez hecho eso en el 128k trasmisor tipeamos: 10 CIRCLE 100,100,50 20 CIRCLE 100,100,70 30 FOR n=1 TO 6912 40 LPRINT PEEK 16383+n 50 NEXT n Y en el 128k receptor, como reemplazo a LOAD *"b" SCREEN$, solamente nos queda hacer: 30 FOR n=1 TO 6912 40 INPUT #3;m 50 POKE 16383+n,m 50 NEXT n Lo mismo se aplica para datos en código máquina con SAVE/LOAD *¨b¨ CODE {xxx}. En el caso de un programa Basic, necesitamos conocer el inicio del Basic en la RAM (el cual varía si se usa el IF1) y su longitud, para poder hacer un envío y recepción correctas entre dos 128k. En el caso del 128k trasmisor, la rutina debe estar al final del programa que será enviado o ser tipeada como comando directo. Pero en el 128k receptor habrá que tipear y ejecutar todo como un comando directo para no corromper el area de la memoria del Basic. En el caso de las matrices SAVE/LOAD *"b" DATA, estas deben ser manejadas como ficheros OPEN/CLOSE usando simplemente PRINT #3 o LPRINT para el envío, y para su recepción INPUT #3 o INKEYS$ #3, dependiendo de la necesidad. Logicamente, es lento desde el BASIC, pero sería mucho más rápìdo si se usaran rutinas en CM para ello. (c)2018 zx_if1@hotmail.com