Probando la transferencia de ficheros desde el PC al QL vía RS232.

Ya hemos tratado en otras entradas de QBlog el tema de la transferencia de ficheros entre QL y PC, por ejemplo aquí puedes ver algunas entradas recientes: «Copiando ficheros desde el QL al PC» y «Experimentando con Sernet»; pero en ellos sólo hemos comentado «la teoría». En esta entrada detallaré paso a paso las pruebas que he realizado al intentar transferir ficheros desde un PC a un QL y viceversa.

La transferencia de ficheros entre el QL y el PC vía RS232 puede ser muy útil para aquellos usuarios que deseen pasar software disponible en Internet a su QL y que tengan un QL con algunos cartuchos microdrive y sin ningún tipo de expansión de disquetes. También puede ser útil para antiguos usuarios que tengan un viejo QL y con software o datos en cartuchos microdrive que quieran pasar al PC con el fin de preservar dicho material.

Todo esto es innecesario para quienes dispongan de unidades controladoras de disquetes, ya que la transferencia de ficheros hasta o desde el PC es directa empleando cualquier emulador que sea capaz de leer discos en formato QDOS.

En mi caso, más que por necesidad, por pura diversión me decidí a probar la transferencia de ficheros entre un PC y mi QL. Mi objetivo era ejecutar en el QL algún programa obtenido mediante la transferencia del fichero correspondiente vía RS232 desde el PC, por ejemplo el Chess de Psion.

La idea básica está tomada de un post de aupf82 en QL-Users. He añadido además más datos extraídos de un artículo de Zerover publicado en sinclairql.es y de varios comentarios y orientaciones de Salvador Merino en un post en QBlog. Por lo tanto, nada de lo que voy a comentar es original, sólo me he limitado a traer aquí información de varias fuentes y relatar mi experiencia cuando intenté llevar estas ideas a la práctica.

Para ejecutar esta transferencia, la idea no es emplear MS-DOS, ni Windows ni ningún otro sistema operativo nativo en el PC sino un emulador QL, corriendo (en mi caso) bajo Windows XP en el PC. Este emulador es Q-emuLator, de libre distribución en su versión básica. Una de las bondades de Q-emuLator es que puede manejar unidades virtuales (mapeadas sobre directorios nativos Windows en el PC) como si fueran unidades nativas QDOS, sean éstas unidades de microdrive, disquetera o discos duros (mdv, flp o win).

Vamos a dividir el proceso en tres pasos a modo de «taller práctico». Los pasos son:
Paso 1. La conexión del hardware.
Paso 2. Copiar ficheros al QL desde el PC empleando Q-emuLator, pero sin perder la información de la cabecera de los ejecutables.
Paso 3. Copiar ficheros desde el QL al PC.

Paso 1. La conexión del hardware.

El hardware que yo he usado es el siguiente:
– Mi QL con algunos microdrives (también tiene una tarjeta Gold Card y 2 disqueteras, pero no son imprescindibles para hacer este «taller»). Las pruebas las he realizado volcando ficheros tanto al microdrive como a disquetes.
– PC con Windows XP y Q-emuLator v.2.5.
– Un adaptador BT631W a conector DB9.
– Un cable null modem (conectores DB9 hembras en ambos extremos).

El primer problema que nos encontramos con el hardware es el adaptador BT631W (el conector SER del QL) a conector DB9, cosa que no es sencilla de conseguir. Yo he optado por lo rápido, esto es, comprarlo ya hecho a un proveedor de retroinformática vía eBay (lo compré en su día en http://www.thesinclairshop.com/) y concretamente compré este (www.thesinclairshop.com/PDF/sinclairserialadaptor.pdf). Aunque sean proveedores que suministran productos específicos para máquinas de Sinclair no te fíes que esté todo correcto, en mi caso el adaptador tenía soldada una patilla a un pin que no se correspondía con el estándar PC.

El cable NULL modem, es bastante estándar y se puede conseguir fácilmente. Yo opté por comprarlo también en eBay a un proveedor inglés (¡me salía más barato que comprarlo en España!).

Aquí va una foto de mis cables (hay un pequeño adaptador también para conectar dos extremos hembra-hembra DB9).

Adaptador serie y cable null modem

Tras varios problemas debido a la confusión de pines de mi adaptador, al final logré dar con la combinación correcta en la ayuda de Salvador Merino y Badaman, la información está en este enlace (http://sinclairql.es/articulos/comunicaciones/rs232.html).

En este artículo de Zerover podéis ver el esquema correcto de las conexiones que hay que emplear. De ese esquema yo no he usado la conexión de los pin 1 del BT631W al 5 del DB9 del adaptador ni las conexiones de los pin 1 del cable null modem. El resto de conexiones es exactamente el que yo he empleado. (Desconozco si los pin que yo no he conectado son imprescindibles para otro tipo de transferencia, para las pruebas que yo he realizado no lo son).

Ojo, que las conexiones a emplear son diferentes dependiendo del conector serie que uses del QL (SER1 o SER2). En mi caso yo usé el conector SER2.

Una vez resuelto el tema del cable no queda más que conectar los ordenadores. Yo empleé la salida SER2 del QL a la entrada COM1 del PC. No realice ningún cambio en la configuración predeterminada de los puertos COM en Windows XP.

Una vez conectados el QL y Q-emuLator bajo Windows XP, el siguiente paso es hacer una prueba para verificar que todo funciona correctamente.

Para hacer un test de conectividad, lo primero que hay que hacer es ajustar la misma velocidad de transferencia en los dos ordenadores. Para ello usamos el comando BAUD, tecleando en los dos ordenadores

BAUD 4800

(4800 baudios fue el valor óptimo que yo conseguí, a 9600 no conseguir hacer transferencias fiables).

Una vez ajustada la velocidad de transferencia tecleamos lo siguiente en el Q-emuLator.

COPY ser1 to scr_

una vez tecleado esto, el cursor desaparece y deja de parpadear en Q-emuLator, quedándose a la espera de la entrada de datos por SER1 (mapeado desde COM1 del PC).

En el QL teclearemos lo siguiente:

OPEN #4,ser2
PRINT #4,"Hola mundo ... testeando comunicaciones por rs232 ..."

Bien, ahora deberíamos ver en la pantalla de Q-emuLator la cadena «Hola mundo … testeando comunicaciones por rs232 …».

Sigamos, ahora en el QL tecleemos la siguiente instrucción para cerrar las comunicaciones.

CLOSE #4

En Q-emuLator, debemos presionar las teclas CTRL-ESPACIO, entonces el cursor volverá a aparecer. También obtendremos un mensaje que dice «not complete» (este mensaje aparecerá después también en la trasferencia de fichero, pero no nos debemos de preocupar, la trasferencia ha ido bien).

Otra prueba a realizar es la inversa de esta, es decir, poner el QL a «escuchar» la entrada por el puerto serie y desde Q-emuLator mandar información a la consola del QL.

En mi caso yo hice lo siguiente.

En el QL

COPY ser2 to scr_

en Q-emuLator teclee el siguiente ”mini-programa”

100 OPEN #4,ser2
110 FOR i=1 TO 10
120    PRINT #4,"Hola mundo ... testeando rs232 ..."
130 NEXT I

Al ejecutar este programa en el emulador obtendremos como resultado la impresión de la cadena “Hola mundo … testeando rs232 …» repetida 10 veces en la pantalla del QL.

Paso 2. Copiando un programa desde el PC al QL.

Los programas ejecutables QL tienen una particularidad especial, llevan una especie de cabecera (de definición de área de datos del programa) que se pierde cuando descomprimimos un fichero ejecutable, o cuando lo copiamos a través de un enlace RS232. Por esto, en este segundo paso, tenemos que resolver dos problemas distintos. El primero, la copia del fichero en sí mismo y el segundo la reconstrucción de esas cabeceras.

Lo que vamos a hacer es copiar una pequeña utilidad (programa ejecutable) que en el futuro nos ahorrará la reconstrucción de esas cabeceras cuando traspasemos programas del QL al PC sin tenerlo que hacer manualmente como en nuestro ejemplo. Esta utilidad es MdvToWin que acompaña a Q-emuLator, practicaremos por tanto con la transferencia de este fichero y luego aplicaremos, con un pequeño truco, la corrección de la cabecera para que el programa se pueda ejecutar correctamente.

Lo primero que debemos hacer es copiar el fichero MdvToWin_exe en la unidad virtual mdv1_ de Q-emuLator. En el QL colocaremos un microdrive con espacio libre suficiente parar traernos este fichero.

Para la copia yo he definido como tasa de transferencia 4800 baudios con esta orden tanto en el QL como en Q-emuLator.

BAUD 4800

A continuación, en Q-emuLator teclearemos

COPY mdv1_MdvToWin_exe to ser1

(el cursos dejará de parpadear en Q-emuLator)

Ahora en el QL teclearemos

COPY ser2 to mdv1_MdvToWin_exe

inmediatamente la unidad microdrive empezará a funcionar y el fichero empezará a copiarse. Sabremos que la copia del fichero ha finalizado porque el cursor comenzará a parpadear de nuevo en Q-emuLator y la unidad microdrive del QL parará de trabajar. En este momento debemos pulsar CTRL-ENTER en el QL.

Tendremos ahora el fichero MdvToWin_exe en la unidad mdv1_ de nuestro QL, pero este programa no podrá ser ejecutado ya que su cabecera se ha perdido. Para poder reconstruir la cabecera utilizaremos el siguiente «truco».

Lo primero que tenemos que averiguar es el tamaño en bytes del programa que acabamos de transferir, podemos verlo fácilmente activando las propiedades el fichero en el PC (con botón derecho del ratón sobre el fichero, Windows nos lo mostrará en la ventana de propiedades del fichero). En la versión que yo tengo, este fichero tiene un tamaño de 1058 bytes.

Tomando este valor, en Q-emuLator teclearemos lo siguiente:

PRINT ALCHP(1058)

esto nos dará un valor similar 169220 (el valor puede cambiar en tu sistema). En realidad esto lo podremos hacer también en un QL que tenga Toolkit II (el comando ALCHP forma parte de las extensiones del TK II, disponible en Q-emuLator). Esta instrucción lo único que hace es devolver una dirección de memoria donde se puedan alojar 1058 bytes.

Ahora, en el QL debemos teclear lo siguiente:

LBYTES mdv1_MdvToWin_exe,169220
SEXEC mdv1_mdvtowin,169220,1058,10240

Con esto, tendremos un nuevo fichero en la unidad microdrive del QL llamado «mdvtowin» el cual ya es un programa ejecutable. (Nota: no sé exactamente a qué se debe el valor de 10240 -la fuente de donde extraje el truco tampoco explicaba el sentido de este valor- pero funciona).

Yo repetí la operación, pero en lugar de grabar el fichero en mdv1_ lo guardé en flp1_, y por supuesto, funcionó a la perfección.

Esto demuestra una de las características más destacables de QDOS, su sistema de redirección de entrada/salida extensible, lo cual proporciona un marco genérico para los sistemas de archivos y controladores de dispositivos (al estilo Unix).

Si en el QL tecleamos ahora

exec_w mdv1_mdvtowin

veremos que se ejecuta un programa con el título «MDV -> Q-emulator for Windows 95». (Yo ejecuté el programa tanto desde mdv1_ como desde flp1_).

Programa MdvToWin

Este programa, en realidad es una utilidad de Daniele Terdina para transferir ficheros desde unidades Microdrive del QL al PC sin que los programas pierdan la cabecera (con lo que nos ahorraremos el último paso de la explicación anterior).

He realizado también la prueba de transferir el programa Chess_exe de Psion desde Q-emuLator al QL. Chess_exe es un programa bastante más largo y quería probar la fiabilidad de las transferencias. En este caso, en lugar de guardar el fichero en la unidad mdv1_ la he guardado en flp1_ de mi QL. Para reconstruir la cabecera seguí exactamente los mismos pasos que el ejemplo anterior y todo funcionó correctamente.

Pase 3. Copiar un fichero desde el QL a QemuLator.

El proceso es el inverso al paso anterior, y tenemos dos posibilidades.

a) Trasferir el fichero y reconstruir las cabeceras manualmente, como lo hemos realizado en el paso anterior (este paso no merece más explicación ya que es idéntico a paso anterior pero de forma inversa).

b) Emplear la utilidad mdvtowin que hemos recuperado desde el PC para hacer la transferencia sin perder la cabecera de los ejecutables. Para ello simplemente ejecutamos en el QL

EXEC_W mdv1_MdvToWin

(MdvToWin es el programa que nos homos traídos desde el PC y al que le hemos reconstruido las cabeceras)

El programa nos preguntará el fichero origen, a lo que responderemos con el nombre del programa (o fichero que queramos transferir al PC), por ejemplo:

mdv1_miprograma_exe

MdvToWin buscará el fichero y a continuación nos preguntará el destino de la copia, a lo que responderemos

ser2

(O ser1, dependiendo del puerto serie que estemos usando). En este punto el QL comenzará a enviar los datos por el puerto serie y el cursor dejará de parpadear ya que está esperando a que el envío sea aceptado en el otro extremo de la comunicación.

En Q-emuLator debemos teclear

COPY ser1 to mdv2_miprograma_exe

La luz indicadora de actividad en la unidad mdv1 en Q-emuLator se encenderá hasta que el fichero sea transferido completamente. Una vez que termine el proceso de copia el cursor en el QL comenzará a parpadear de nuevo. Por último tendremos que teclear CTRL-ESPACIO en Q-emuLator para finalizar.

Ahora, ya tendremos en Q-emuLator el fichero que hemos transmitido desde el QL. Si fuera un programa podríamos ejecutarlo sin problemas.

5 comentarios
  1. Salvador Merino dijo:

    Me alegro que por fin te funcione el cable serie QL a PC.

    Esto de pasar programas QL a PC usando el puerto serie, me hace recordar viejos tiempos, e incluso un artículo publicado en el fanzine CUQ nº 11 Agosto 1989, llamado «A LA FUERZA AHORCAN O EL HAMBRE AGUDIZA EL INGENIO», autor: Antonio Rodríguez Hernández, que se describe cómo hacer copias de seguridad de cartuchos de microdrive QL en Cinta de Cassette usando un Sinclair ZX-Spectrum con Interface I.

    La verdad es que el puerto serie se puede usar para guardar/leer datos en cinta de cassette, pues el Cambridge Z88 tiene una programa que lo hace (en realidad, un interface de cassette y un puerto serie son muy similares). Supongo que los usuarios QL nunca hicimos ese programa, porque pasamos directamente a usar discos 3.5″, pero existe un programa escrito para emuladores ZX-Spectrum que leía cintas cassette del Spectrum en un QL usando el puerto Q-lan como interface cassette.

  2. badaman dijo:

    Fenomenal. A ver si la gente se anima a trastear. En su día yo use un pequeño programa (a ver si doy con él) en el QL y un programa de comunicaciones en el PC. Con ellos pasé la imagen de la ROM MGE que tenemos en sinclairql.es y otros programas, sobre todo listados SuperBASIC.

    Aquí el enlace al artículo del que habla Salvador
    http://sinclairql.es/articulos/trucos/cinta.htm

  3. afx dijo:

    Pues ya que lo comentáis, efectivamente, a esto se le puede sacar mucho «jugo».

    No estaría mal probar la transferencia de ficheros entre QL y Spectrum vía RS-232 o vía red local. Los tiempos han cambiado, y las «tornas» parece que también … ahora el «hermano pequeño» del QL (el Spectrum) tiene el DivIDE+ y tarjetas Compact Flash, con lo que en lugar de pasar programas a cinta se podría pasar a la Compact Flash del Spectrum.

    ¿Imagináis un Spectrum con DivIDE+ e Interface-1 haciendo de «servidor de ficheros» de un QL? …. friki ehh ….

    Hace poco me compré un Interface 1 y una DivIDE+ para el Spectrum, uno de mis objetivos era justo «jugar» con la transferencia de ficheros.

    Miraré con detalle el artículo que comentáis, seguro que me vendrá muy bien.

  4. Salvador Merino dijo:

    Si te interesa conectar un QL a Spectrum mediante RS-232, o red local, a lo mejor te interesa leer los siguientes artículos:

    – Conexión mediante RS232 entre QL y Spectrum (CUQ nº 5 Febrero 1989).
    – Transmitir bytes desde el QL al Spectrum mediante conexión RS232 (CUQ nº 6 Marzo 1989).
    – Comunicando QL a Spectrum via red local (CUQ nº 11 Agosto 1989).

    • afx dijo:

      ¡Gracias Salvador!, empezaré por la lectura de esos artículos.

      Saludos.

Deja un comentario