archivo

Archivos Mensuales: junio 2020

HOTKEYS es una extensión que forma parte de “Pointer Environment” (PE), el entorno de ventanas creado por Tony Tebby para el Sinclair QL. Podríamos definirlo como un sistema para declarar combinaciones de teclas que cuando se pulsan dan lugar a una acción que es independiente de la tarea que se está realizando.

Lo primero que tenemos que tener presente es que, para poder disfrutar de las facilidades de HOTKEYS en nuestro QL, necesitamos cargar en nuestro sistema el “Pointer Environment” completo. Este entorno de ventanas consta específicamente de tres módulos residentes PTR_GEN, WMAN y HOT_REXT. Otro componente que podríamos catalogar de indispensable en el QL sería también el Toolkit 2, el cual viene de una manera u otra en la mayoría de los QL que incorporan expansiones de disquetera y ampliaciones RAM.

El programa más simple para cargar en nuestro QL un entorno mínimo para empezar a trabajar con HOTKEYS sería el siguiente:

100 TK2_EXT : REMark en algunos sistemas esta línea es esencial
110 LRESPR FLP1_PTR_GEN
120 LRESPR FLP1_WMAN
130 LRESPR FLP1_HOT_REXT
140 HOT_GO

Comentemos brevemente el las líneas del programa SuperBASIC anterior.

En la línea 100 se ejecuta el comando TK2_EXT que es usado para activar el Toolkit 2 en algunos sistemas. Esto nos permitirá usar a su vez el comando LRESPR, empleado en las líneas siguientes para cargar cómodamente el resto de extensiones necesarias para usar el PE. Si no tuviéramos el Toolkit 2 (que es el que aporta el comando LRESPR) tendríamos que cargar el resto de módulos averiguando primero el tamaños del archivos, y con los comandos LBYTES y CALL cargar cada uno de los módulos en modo residente. LRESPR nos ahorra esfuerzo ya que nos permite cargar las extensiones que necesitemos de una forma más automática.

En la línea 110 cargamos el primer módulo del PE llamado PTR_GEN. Este módulo controla la interfaz de puntero; una flecha en pantalla a modo de cursor que es controlada por un ratón o por las teclas del cursor del teclado. Al igual que otros sistemas GUI, podemos indicarle al ordenador lo que debe hacer desplazando el puntero hasta los “comandos” representados en la pantalla y haciendo “clic” sobre ellos.

El ratón en los QL tiene generalmente 2 botones. La presión sobre el botón izquierdo se llama HIT, y la presión sobre el botón derecho se llama DO. Esas acciones (HIT y DO) tienen equivalentes también en el teclado. Como hemos mencionado anteriormente el puntero se puede mover con las teclas del cursor del teclado, HIT se ejecuta con la barra espaciadora y la acción DO con la tecla ENTER.

WMAN es una abreviatura de “Window Manager” (el gestor de ventanas). Este gestor de ventanas es un sistema mediante el cual se proporciona un aspecto ‘estandarizado’ a la apariencia y funcionamiento de los menús, desplazamiento de las ventanas, etc. En la línea 120 de nuestro ejemplo cargamos WMAN con el comento LRESPR FLP1_WMAN.

HOT_REXT es la parte que controla las “Hotkeys”, las teclas de acceso rápido, que formalmente se denomina “Hotkey System II”. En nuestro ejemplo cargamos este módulo en la línea 130 con LRESPR FLP1_HOT_REXT, lo cual ejecuta un pequeño Job (o tarea residente) llamado Hotkey el cual se ocupa de controlar teclas de acceso rápido.

El comando HOT_GO de la línea 140 es el encargado de activar las teclas de acceso rápido (Hotkeys). En otras palabras, una vez que un comando HOT_GO ha sido ejecutado, las teclas de acceso rápido que se hayan programado comenzarán a funcionar.

Existe también un comando relacionado llamado HOT_STOP el cual desactiva las teclas de acceso rápido que se hayan definido. Es importante recordar este comando porque hay ocasiones en las que no podemos cargar extensiones adicionales mientras Hotkey está funcionando y una forma de hacerlo es desactivando temporalmente las Hotkeys con HOT_STOP y luego volverlo a activar una vez cargadas las extensiones necesarias.

Otra cosa importante a tener en cuenta es el uso de CTRL C (la pulsación conjunta de las teclas CTRL y la letra C). Este combinación de teclas permite conmutar el foco entre varios programas que están ejecutándose al mismo tiempo. Esta es una de las formas más habituales de conmutar entre los distintos programas que están ejecutándose en nuestro QL.

Para comprender la importancia de la Hotkeys en un sistema de la época del QL pongamos un ejemplo. Supongamos que estamos tecleando algo en un procesador de textos y queremos comprobar algo en nuestra base de datos sin tener que salir del procesador de textos. En un ordenador personal de principios de los años 80, nosotros tendríamos que grabar en un fichero el trabajo que estuviéramos haciendo en nuestro procesador de textos, a continuación salir del procesador, arrancar la base de datos, chequear la información, salir del sistema de base de datos y volver a arrancar el procesador de textos con el fichero en el que estuviéramos trabajando.

Pero en un QL con su multitarea y el Hotkeys, las cosas se podrían hacer de otra manera.

Supongamos que hemos definido una combinación de teclas como la vía para arrancar un programa, sin tener que parar el programa actual sobre el cual estamos trabajado. Más aún, si ese segundo programa ya estuviera en ejecución, nuestra combinación de teclas provocaría que se activara ese programa que aún está en memoria. Luego, mediante otra combinación de teclas (Hotkeys) que también hayamos definido, podríamos regresar al primer programa en el que estábamos anteriormente.

Todo esto puede sonar muy complicado al principio, pero podemos acostumbrarnos rápidamente después de verlo en acción.

Este es el principio básico detrás de las Hotkeys: definimos teclas para realizar “acciones”. Independientemente de lo que estábamos haciendo, estas teclas permiten que hagamos algo más al instante sin tener que pasar por la molestia de grabar el programa actual, salir de él e ir al SuperBASIC, teclear comandos para ejecutar otras acciones y así sucesivamente. Lo bueno de este sistema es que una vez que hayamos configurado la pulsación de una determinada acción según nuestras necesidades, podemos ir y definirlas en el programa de arranque de nuestro QL (boot) para que se ejecuten cada vez que arrancáramos el sistema.

En la definición de Hotkey anterior hemos hecho referencia al término “acciones”, pero ¿Qué son exactamente esas acciones?

Las acciones pueden ser:
– Cargar un programa en memoria para iniciarlo de forma rápida posteriormente.
– Cargar un programa desde disco.
– Seleccionar un programa (saltar directamente a él desde otro programa)
– Relleno de texto, o lo que sea, en un búfer especial (como una especie de portapapeles) para pasar en otro programa
– Enviar comandos al SuperBASIC
– Listar las teclas que se han definido
– Activar o desactivar definición de teclas individuales

Exploraremos esta acciones a medida que avancemos en el tema.

Las Hotkeys se definen como una pulsación de varias teclas donde se usa siempre la tecla ALT junto con otra tecla. Esto no es nuevo en el QL y de hecho el Toolkit II tiene algo muy parecido llamado ALTEKEYs. Veamos cual es la diferencia mediante un ejemplo sencillo.

Supongamos que hemos definido un ALT key del Toolkit II para cargar un programa llamado MIPROGRAMA_BAS desde la unidad de disco flp1_. Para ello utilizaremos el siguiente comando:

ALTKEY 'a','LOAD FLP1_MIPROGRAMA_BAS'

Bien, supongamos que estamos en SuperBASIC y pulsamos ALT junto con la tecla ‘a’. Efectivamente, aparecerá en el canal #0 (area de comando en la zona inferior de la pantalla) la orden LOAD FLP1_MIPROGRAMA_BAS. Pero supongamos que estamos editando un documento con el procesador de textos Quill, ¡vaya …!, ahora aparece LOAD FLP1_MIPROGRAMA_BAS como parte del documento que estábamos editando y esto no es lo que queremos. Tendríamos que regresar al SuperBASIC para que este altkey sea de utilidad.

El sistema HOTKEY nos permite hacer esto mucho mejor. Por ejemplo, con el comando HOT_CMD de HOTKEY podemos definir una combinación de teclas para indicarle al ordenador que queremos un comando destinado al SuperBASIC. Esto nos aseguraría que el control del ordenador “salta” al BASIC primero y luego ejecutal el comando por nosotros. El proceso de saltar al BASIC o a otro programa se conoce como “PICKING” en la terminología del sistma de Entorno de Ventanas del QL (PE). Esto evitaría el incoveniente de ALTKEY que hemos mencionado anteriormente.

Así podemos ver que el sistema HOTEKY nos da más versatilidad y potencia que el sistema ALTKEY usado por el Toolkit II.

Podemos elegir cualquier tecla a la hora de definir una acción con HOTEKY pero hay algunas teclas reservadas que deberíamos evitar.

Las letras y números son buenos candidatos. Las teclas de función se pueden definir también pero son más difíciles de recordar. Entre las teclas a evitar están la tecla ENTER (ALT ENTER tiene un significado especial para HOTKEY, nos recupera la última línea de ordenes que hemos tecleado), las teclas de cursor, la tecla CAPS LOCK y la telca TAB. Tampoco es buena idea usar las teclas de apóstrofe o las teclas de símbolos (por ejemplo \).

¿Cómo definir combinaciones de teclas y acciones?

Veamos ahora cómo definir combinaciones de teclas y sus correspondientes acciones.

Los comandos para definir HOTEKYs están incluidos como extensiones SuperBASIC para hacer uso de ellos. La mayoría son funciones en lugar de comandos, esto significa que al ejecutar esas funciones nos devolverá un valor de retorno el cual nos indica si todo se ha ejecutado bien o si ha habido algún error.

Por ejemplo, ejecuta los siguiente desde la línea de comandos SuperBASIC:

PRINT HOT_CMD('a','LOAD flp1_MIPROGRAMA_bas')

Esto imprime el número 0 si todo ha ido bien en la definición del HOTEKY. Si ha habido algún error entonces la función retornará un valor distinto de 0 que representa al código de error, por ejemplo “In Use” error (-9).

Existe un pequeño comando para manejar esos números de retorno pasados por la función que define el HOTEKY, llamado ERT, que significa Error ReporT. Si todo ha ido bien no hace nada, pero si algo ha fallado ese comando emite un sonido o nos da un mensaje descriptivo del error. Un ejemplo de cómo usarlo sería el siguiente:

ERT HOT_CMD('a','LOAD flp1_MIPROGRAMA_bas')

El primer parámetro de la función HOT_CMD define la tecla a la cual será asociada el comando. Presionando la tecla ALT junto con esa tecla (en nuestro ejemplo la tecla 'a') se ejecutará el comando especificado en el segundo parámetro (en el ejemplo, 'LOAD flp1_MIPROGRAMA_bas'). Un aspecto importante a tener en cuanta es que HOTEKY es sensible a las mayúsculas y minúsculas. Se puede definir una acción distinta para la tecla en mayúscula con lo cual tendremos dos definiciones para la misma tecla, pero existen particularidades y ciertas reglas en su uso.

Si defines una HOTEKEY con una tecla en minúscula y no existe otra definición para esa tecla en mayúsculas entonces ambas teclas provocarán en mismo resultado (en el ejemplo anterior ALT a , SHIFT ALT a , o ALT A producirán el mismo efecto).

Los usuarios QL suelen aplicar patrones en la definición de las teclas que resultan útiles.

Por ejemplo, para acciones que involucren la carga o la selección (picking) de programa:

a) usa teclas en mayúsculas para la carga de programa.
b) usa la tecla en minúscula para la selección de programa.

Esto parece lógico, la carga de un programa desde disco es una acción típicamente menos común durante una sesión de trabajo, así usamos las teclas SHIFT ALT y la tecla deseada (tenemos que pulsar tres teclas). Sin embargo, una vez cargado los programas en memoria podría ser muy habitual conmutar entre ellos con una combinación más simple de teclas, la tecla ALT y la tecla deseada (sólo pulsamos dos teclas).

Bien, veamos ahora cómo cargar y seleccionar programas.

Hay varias formas de cargar un programa. Puede cargarse en la memoria y posteriormente ejecutarlo desde la memoria. Esto es muy útil en sistemas sin disco duro ya que podemos para evitar tener que insertar su disquete cada vez que necesite iniciar cualquier programa frecuente y que no esté disponible en el disquete en esos momentos. Sin embargo, siendo muy útil para los programas de uso común, nos ata un poco en cuanto al uso óptimo de la memoria. El más simple de entender es el comando que simplemente carga un programa desde el sistema de almacenamiento (un disquete por ejemplo). Asumiré que mi programa se llama PROGRAM_EXE en este ejemplo:

ERT HOT_LOAD('p','flp1_program_exe')

Cuando mantienes presionada la tecla ALT y pulsas la tecla p, el sistema intenta cargar PROGRAM_EXE desde FLP1_. Sencillo. Pero, de nuevo, hay un par de puntos menores a tener en cuenta.

He puesto el texto entre comillas en el ejemplo anterior, pero en la mayoría de los casos, podría haberse escrito los parámetros del comando de esta forma:

ERT HOT_LOAD(p,flp1_program_exe)

En caso de duda, usa las comillas. Además, el nombre de archivo del programa está escrito en minúsculas, no importa ¡el QL maneja los nombres de archivo en mayúsculas y minúsculas! Ten en cuenta que si omites el nombre de la unidad, HOTKEY intentarán agregar el nombre de la unidad predeterminada por DATA_USE o PROG_USE (las unidades predeterminadas de Toolkit 2 para datos y programas).

Con HOTKEY hay dos extensiones para cargar programas en la memoria para que, posteriormente, puedan iniciarse rápidamente sin tener que tener tus discos en las unidades (esto es bastante similar en principio a usar RESPR o LRESPR para cargar extensiones SuperBasic).

Las dos extensiones son: HOT_RES y HOT_CHP. ¡Ahora las cosas se vuelven un poco más complejas! De hecho, hay otras variaciones llamadas HOT_RES1, HOT_CHP1 y HOT_LOAD1 para casos especiales en los que no te atreves a ejecutar dos copias del mismo programa al mismo tiempo. (A tener en cuenta que en QDOS podrían haber programas que se modifican a sí mismos cuando se cargan en memoria, lo cual podría tener efectos no deseados. Ignoraremos esto por ahora, pero ten en cuenta que existen razones para estas variantes del mismo comando).

HOT_RES se utiliza para cargar programas RESIDENTES. Eso significa que se cargan en la memoria para que posteriormente podamos iniciarlos rápidamente (una o más copias de ellos). Este comando tiene un problema: si hay otros programas ejecutándose o el Job del HOTKEY está activo, este comando podría no funcionar. En estos casos se debe utilizar HOT_CHP. En algunas versiones del sistema HOTKEY, la función HOT_RES parece convertirse automáticamente en HOT_CHP cuando sucede este problema.

¿Cuándo debes utilizar HOT_RES o HOT_CHP en lugar de HOT_LOAD?

Fácil. Reserva el uso de HOT_RES o HOT_CHP para los programas que utilizas con más frecuencia para evitar tener que insertar sus disquetes cada vez que inicies una copia. HOT_LOAD está bien para programas usados ocasionalmente en los que no quieres que acaparen memoria todo el tiempo mientras están cargados de forma residentes.

La secuencia real de eventos cuando se emite un comando HOT_RES o HOT_CHP es la siguiente:

1. Cuando el sistema interpreta el comando, agrega el programa pasado como parámtro al sistema de teclas de acceso directo. Esto significa que, en esencia, cuando se ejecuta la línea que define la tecla de acceso directo, se busca el programa y se carga en la memoria.

2. Cuando más tarde se pulsa la tecla de acceso directo definida como HOT_CHP o HOT_RES, busca el programa en la memoria e intenta iniciar su ejecución.

HOT_LOAD es esencialmente sólo el equivalente del paso (2) – sólo carga el programa nombrado cuando se pulsan las teclas indicadas, en lugar de almacenar una copia en la memoria. Es importante entender la diferencia entre estos comandos. HOT_LOAD iniciará un programa desde el disco sólo cuando se lo indicas. HOT_CHP y HOT_RES harán inmediatamente una copia del programa desde la unidad de almacenamiento a la memoria cuando se definan sus parámetros (tecla de acceso y nombre del programa). Posteriormente, al pulsar la tecla definida por HOT_RES o HOT_CHP, se ejecuta una copia del programa ya cargado en memoria. De hecho, es bastante inteligente, si usas HOT_CHP o HOT_RES, sólo una copia del programa se mantiene en memoria incluso si tiene dos de esos programas en ejecución. Es bastante complejo de explicar, pero básicamente los programas definidos como ‘puros’ pueden tener más de una instancia de sí mismos ejecutándose al mismo tiempo, aunque de hecho sólo hay una copia en la memoria – ¡el sistema está siendo bastante inteligente al ejecutar más de una instancia del mismo código a partir de una sola copia de él!

Estos programas ‘puros’ incluyen a Quill, Archive, Abacus, Easel y los programas QPAC1, por ejemplo. Pero hay otros programas (llamados ‘no puros’) que modifican su propio código de tal manera que no es prudente hacer que un programa en memoria se ejecute como si se tratara de dos instancias separadas. En caso de que una copia modificara su propio código al mismo tiempo que la otra instancia de sí misma intentara hacer algo podría producir el caos. Los programas compilados por Turbo entran en esta categoría – tiene que usar las versiones HOT_CHP1 y HOT_RES1 de estos comandos para asegurarse de que hay el mismo número de copias físicas del programa en la memoria como instancias de si mismo en ejecución. (Esto no es fácil de explicar pero espero que puedas seguirlo).

HOT_LOAD no hace esa distinción. Siempre carga una copia del disco y la ejecuta cuando la necesita. Si tienes problemas para entender HOT_CHP y HOT_RES y sus variaciones, ignóralos, usa HOT_LOAD solo por ahora hasta que entiendas estos conceptos.

Una vez que un programa se en memoria y se está ejecutando, se necesita una forma de saltar a y desde él. Supongamos que nuestro pequeño programa de ejemplo llamado PROGRAM_EXE tiene un nombre simplemente “PROGRAM” (es decir, el nombre que muestra cuando se está ejecutando y que emite el comando JOBS desde BASIC). Hay una función llamada HOT_PICK cuya función es encontrar el programa llamado, y traerlo para que sea el trabajo (o ‘Job’) actual. Esta acción se llama PICKING.

Por ejemplo:

ERT HOT_PICK('a','PROGRAM')

Una vez ejecutado el comando anterior, cuando presiones ALT a, el sistema busca un programa con ese nombre que se esté ejecutando en la memoria y lo “activa” para que puedas trabajar en él.

Todo esto está muy bien, pero como de costumbre con las teclas de acceso rápido (HOTKEYS), la historia no es tan simple.

Los nombres de los “Jobs” (de las tareas o trabajos en QDos) no son simples y pueden no ser obvios, por lo que el sistema HOTKEYS ofrece otra opción relacionada con esos nombres de “Jobs”.

Para elegir un “Job” o incluso eliminarlo, es posible que necesites saber su nombre. Muchas veces, el nombre del “Job” es igual al nombre del programa que cargaste, pero esto no siempre es así; ¡peor aún, algunos programas cambian sus propios nombres mientras se ejecutan por razones que se nos escapan a la mayoría de nosotros!

Para resolver esto, puedes usar la siguiente opción en algunos comandos HOTKEYS para establecer los nombres que desees darle al “Job” que representa tu programa. Estos comandos tienen la siguiente forma que incluye la especificación de un tercer parámetro:

ERT HOT_xxx('key','nombre del archivo','nombre del programa')

HOT_xxx puede ser, por supuesto, HOT_RES, HOT_CHP, etc.

El ‘nombre del archivo’ es el mismo que en los ejemplos anteriores. El ‘nombre del programa’ es cualquier nombre razonable que quieras dar al “Job” (o a la tarea). Por ejemplo, si el programa fuera una aplicación de base de datos llamado DATABASE_EXE y quisiéramos darle al “Job” (o a la tarea) el nombre de ‘mydbase’, entonces el comando debería ser este:

ERT HOT_LOAD('D','FLP1_DATABASE_EXE','mydbase')

Una vez que el programa se está ejecutando, verás el nombre de ‘mydbase’ si tecleas el comando JOBS o si has utilizado el menú de tareas del QPAC2. (Una tarea o un “Job” es simplemente un programa en código máquina, uno que se puede iniciar con EXEC, por ejemplo).

A partir de ese momento, podemos definir un HOTKEYS (una tecla de acceso directo) para que elijamos ese programa, por ejemplo así:

ERT HOT_PICK('d','mydbase')

De modo que al pulsar ALT d el sistema busca un programa que tenga el nombre de ‘mydbase’, y si lo encuentra lo traerá al primer plano como programa activo o programa seleccionado.

Aquí dejamos la primera parte de la descripción del sistema HOTKEYS, seguiremos profundizando en la segunda parte de este artículo.

—-
Fuente :
CAUTION: HOTKEYS – Don’t Burn Your Fingers
By David Denham, 1999
QL Today.

—-

La red del Sinclair QL es realmente impresionante a pesar de su antigüedad y muy fácil de usar una vez que te acostumbras a los principios que están detrás de ella.

Como todos los QL tienen dos conectores de red (también las placas Aurora o las QXL), puedes encadenar hasta 63 máquinas en una misma red. Las dos máquinas de los extremos de la red deben tener uno de los dos conectores desconectados. Seguramente éstos tendrán una resistencia o algo parecido para establecer el final de la red cuando no hay un cable conectado. (Es decir, los dos extremos no necesitan conectarse a modo de red circular, esto si es necesario en SERNET y en MIDINET tal como diremos más abajo).

El cableado de la red QL es extremadamente simple. Un cable de dos hilos con conectores de audio mono de 3,5 mm en ambos extremos es todo lo que necesitas para unir dos QL, un cable de altavoces es perfectamente adecuado. Cualquier longitud razonable de cable debería funcionar, aunque no sé cual es la distancia máxima recomendada entre máquinas.

Antes de pensar en usar la red del QL asegúrate de usar Toolkit 2, el uso se hace mucho más simple y divertido. La red básica es usable sin Taoolkit 2, pero es necesario tener Toolkit 2 para aprovechar al máximo la red.

Número de estación.

Para identificar los ordenadores dentro de la red es necesario asignar a cada uno de un número entre 1 y 63. Esto se hace con el comando NET y un número entre 1 y 63 (por defecto el número de estación es la 1 si al comando NET no se suministramos número alguno). Por ejemplo, con el comando “NET 2” asignamos al ordenador la estación número 2 dentro de la red.

En una simple red con 2 estaciones (sólo dos QL conectados entre ellos) ambos ordenadores pueden tener el mismo número de estación. En estos casos la configuración es mucho más simple ya que no haría falta el comando NET ni asignar a cada ellos un número distinto. Como el valor 1 es el defecto, en cada uno de los QL nos referiríamos al otro como estación n1.

En una red con más de dos QL, la numeración de las estaciones no es automática y se debe realizar estación a estación con el comando NET y asignando a cada máquina de la red un número distinto entre 1 y 63. Puede ser una buena estrategia ir numerando secuencialmente las estaciones de la red, pero hay que tener en cuenta que para que una estación actúe como “servidor de dispositivos”, el número de dicha estación tienen que estar comprendido entre 1 y 8 (ambos inclusive). Esto implica que en una res QL NET sólo pueden existir 8 servidores de dispositivos.

Tal como acabamos de comentar, una de las facilidades más importantes que nos aporta el Toolkit 2 es que podemos configurar en la red hasta 8 estaciones que actúen como servidores. Esto simplemente se hace con el comando “FSERVE”. De forma general las estaciones en las que hemos cargado el job FSERVE pueden compartir con el resto de la red, no sólo su sistema de almacenamiento, sino también impresoras, puerto serie, puerto paralelo (si tienes Super GoldCard), su propia consola, etc.

Algunos ejemplos.

Supongamos que tenemos una red de tres QL (los tres con Toolkit 2) y queremos configurar una red donde queremos que dos de los QL actúen como cliente y como servidor y el último de ellos sólo como estación que consume recursos de los anteriores. Lo que podríamos hacer es configurar la red con los siguientes comandos:

En el QL 1 tecleamos el siguiente comando:

  FSERVE

En el QL 2 tecleamos el siguiente los comandos:

  NET 2
  FSERVE

En el QL 3 tecleamos el siguiente los comandos:

  NET 3

Eso es todo, pero resaltemos algunos detalles:

– En el QL 1 no hace falta especificar un número de estación ya que por defecto el valor de la estación es 1 (el comando NET sólo sirve para especificar el número de estación cuando ésta es distinta de 1).

– Como tenemos dos máquinas actuando como “servidores” de dispositivos, a esas máquinas (QL 1 y QL 2) les tenemos que asignar números de estación comprendidos entre 1 y 8. Al QL 3 le hemos asignado la estación 3, pero podría haber sido cualquier otro número entre 3 y 63.

Una vez configurada la red, pongamos algunos ejemplos de uso. En el QL 3 podríamos teclear los siguientes comandos:

DIR n1_FLP2:
  (Nos mostrará el pantalla el directorio raíz de la segunda disquetera
   de la estación 1). 

DIR n2_WIN1_programas_
  (Nos mostrará el pantalla el directorio WIN1_programas_ 
   de la estación 2). 

COPY win1_boot to n2_PAR             
  (Copiará el fichero boot de la unidad win1_ en la impresora
   paralelo de la estación 2)

COPY win1_boot to n2_SCR
  (Copiará el fichero boot de la unidad win1_ en la consola
   de la estación 2)

WCOPY flp1_games_ to n1_win1_games1_ 
  (Copiará todos los ficheros de la disquetera 1 al subdirectorio
   win1_Games1_ de la estación 1)

OPEN #5, n2_ser1: list #5: close#5
  (Listará el programa que tengamos cargado en memoria en la
   impresora serie de la estación 2)

EXEC n1_win1_games_chess
  (Ejecutará el programa chess desde el subdirectorio win1_games_
   de la estación 1). 

Una caractarística curiosa es que podemos abrir una ventana en la consola de otro usuario, imprimir un mensaje y esperar de él una respuesta. Por ejemplo, Afx (que está en la estación 1) podría ejecutar el siguiente programa para hacer una pregunta a Badaman que está en la estación 2:

10 OPEN #4, n2_con_200x200a0x0
20 INPUT #4, "Hola, aquí afx ¿podemos almorzar juntos?", r$
30 PRINT r$
40 CLOSE #4

Otra versión del mismo programa.

10 ch = FOPEN(n2_con_200x200a0x0): CLS #ch
20 INPUT #ch, "Hola aquí afx, ¿podemos almorzar juntos?", r$
30 PRINT r$
40 CLS #ch: CLOSE #ch

Una configuración interesante dentro de QL NET es hacer uso del sistema de dispositivos por defecto incorporado en el sistema operativo, proporcionado por los comandos DATA_USE, PROG_USE, SPL_USE y DEST_USE.

DATA_USE [nombre]    
  (selecciona el directorio de omisión para ficheros de datos)

PROG_USE [nombre]
  (selecciona el directorio de omisión para programas ejecutables)

DEST_USE [nombre]
  (selecciona el directorio de omisión de destino (COPY, WCOPY)) 

SPL_USE  [nombre]
  (selecciona el spooler de impresión por omisión (SPL))

El uso de estos nombres de directorio por omisión hace nos hace el trabajo bastante más fácil. Por ejemplo, con la siguiente instrucción todos los programas serán cargados por defecto desde el directorio “progs” del disco win1_ de la estación 1 cuando no indiquemos expresamente una unidad de almacenamiento.

PROG_USE n1_win1_progs 

Una vez introducido el comando anterior, podríamos ejecutar cualquier programa ubicado en esta estación de trabajo y subdirectorio simplemente con EXEC y el nombre del programa.

Pongamos otro ejemplo, con la siguiente instrucción se selecciona el dispositivo PAR (puerto paralelo) de la estación 2 como destino del “spooler” de omisión.

SPL_USE  n2_par

Y partir de la línea anterior, podemos imprimir en segundo plano cualquier fichero como el ejemplo siguiente:

SPL flp1_myFile_txt    
  (imprime myFile_txt en el puerto paralelo de la estación 2)

NFS_USE

Además del uso de dispositivos por defecto, podemos también “mapear” rutas de una red a un dispositivo cualquiera, esto lo hacemos con el comando NFS_USE que nos aporta el Toolkit 2. Veámoslo.

Mediante el comando NFS_USE es posible ocultar la red local a las aplicaciones escogiendo un nombre especial para el servidor de ficheros en red local. La sintaxis es la siguiente:

NFS_USE "nombre", "ubicaciones de la red local", ...

Los “nombres de red local” deben ser nombres de directorio completos, pudiéndose dar hasta 8 en un comando. Cada uno de estos nombres estará asociado con uno de los 8 posibles dispositivos de directorio (“nombre_1” a “nombre_8”). Pongamos un ejemplo.

NFS_USE mdv,n2_win1_,n2_flp1_,n2_flp2_

La anterior sentencia asigna distintas ubicaciones de la estación 2 que actúa como servidor de ficheros a los dispositivos mdv1_, mdv2_ y mdv3_ de la estación cliente. En el ejemplo, “mdv1_” es asignada a la unidad win1_ en la estación 2, “mdv2_” será tomado como “flp1_” en estación 2 y “mdv3_” será tomado como “flp2_ “también en la estación 2.

Una cosa que también se suele hacer es “reasignar” un nuevo nombre a los dispositivos existentes si queremos “mapear” éstos a otras rutas de la red local. En nuestro ejemplo anterior haríamos lo siguiente:

MDV_USE MDD
NFS_USE mdv,n2_win1_,n2_flp1_,n2_flp2_

De esta manera mantendremos los accesos a las unidades de microdrive como MDD1_ y MDD2_ en lugar de MDV1_ y MDV2_.

El controlador de dispositivos DEV (DEV_USE).

En la primera versión de QDOS no existía la posibilidad de crear subdirectorios reales dentro de un dispositivo de almacenamiento. Debido a esto muchos programas de QL fueron escritos sin tener en cuenta la posibilidad de almacenar archivos en subdirectorios. En la siguientes versiones de QDOS, y por supuesto de SMSQ/E, apareció el soporte a lo que se llaman “nivel 2” del sistema de almacenamiento donde el soporte de subdirectorios es completo. Este “nivel 2” del sistema de almacenamiento se extendió con la (Super)GoldCard, dispositivos de disco duro y unidades de disquete de alta densidad. En este contexto, para facilitar la compatibilidad de los programas antiguos que no daban soporte a los subdirectorios, se creó una extensión que aporta un dispositivo virtual llamado DEV. En si, el dispositivo DEV es un dispositivo genérico por defecto (no sólo acotado al uso de la red local) y es una especie de “engaño” para permitir que el software antiguo (como Quill, Archive, Abacus y Easel) hagan uso de subdirectorios.

Además de lo expuesto anteriormente, y en el contexto que nos ocupa, los dispositivos DEV también tienen la capacidad de “mapear” dispositivos lógicos a rutas reales dentro de la red local.

Como de costumbre, hay hasta 8 dispositivos DEV; DEV1_ a DEV8_. Cada dispositivo DEV está conectado a un dispositivo real particular o a un directorio por defecto particular en un dispositivo real. Los archivos en un dispositivo DEV pueden ser abiertos, usados y borrados de la misma manera que en un dispositivo real.

Cada unidad “DEV” está conectada a un dispositivo mediante el comando DEV_USE. La sintaxis es la siguientes.

DEV_USE NúmeroDisp, DirectorioReal

Pongamos un ejemplo.

DEV_USE 4, n2_win1_sys_

A partir de la introducción de comando anterior podemos hacer referencia al contenido del directorio win1_sys_ de la estación 2 como dispositivo DEV4_ de nuestra estación.

A tener en cuenta que el sistema QDOS y SMSQ/E puede manejar también dispositivos distintos a los dispositivos de almacenamiento. Estos dispositivos son:

SER1 y SER2  (puertos serie RS232)
PAR          (puerto paralelo (sólo a partir de SuperGoldCard))
SCR,         (pantalla como dispositivo de salida)  
CON          (consola como dispositivo de entrada/salida)

Esto significa que podemos mapear una unidad DEV a uno de estos dispositivos. Por ejemplo:

DEV_USE 8, n1_par

La orden anterior asigna la unidad lógica “DEV8_” al puerto paralelo de la estación 1.

Otro ejemplo interesante:

NFS_USE "ser",n1_par, n2_par 
PAR_USE "ser"
COPY_N "flp1_myfile" TO "ser2"

Las líneas anteriores reasignan los identificadores de los puertos serie de mi estación, concretamente, SER1_ se reasigna al puerto paralelo el la estación 1 y SER2_ se reasigna al puerto paralelo de la estación 2.

SERNET y MIDINET

Tanto SERNET como MIDINET son controladores de red que aparecieron posteriormente y te permiten montar redes de bajo costo como la QL NET original del Toolkit 2. SERNET permite conectar dos o más máquinas que ejecutan SMSQ/E a través de los puertos serie, mientras que MIDINET permite conectar dos o más ordenares ATARI con SMSQ/E a través de los puertos MIDI. SERNET fue desarrollado a partir del software MIDINET de Phil Borman. Bernd Reinhardt modificó el software para usar los puertos seriales en lugar de los puertos MIDI.

Con estos controladores podemos ampliar las “fronteras” extendiendo la red QL, por ejemplo, permitiendo que las máquinas sin conectores net 1 / net 2 del QL se unan a la red.

Tanto el SERNET como el MIDINET están organizados como una red circular. En el caso de MIDI, el puerto MIDI OUT de cada máquina tiene que estar conectado al puerto MIDI IN de la siguiente máquina. Todos los cables tienen que formar un círculo completo. Cada máquina en el círculo tiene que estar funcionando y el controlador tiene que cargarse para tener una red en funcionamiento. Lo mismo se aplica a SERNET: con dos máquinas, puede usar un cable de módem nulo. Con tres o más máquinas, debes cablear tus propios cables para que todas las señales de salida de una máquina estén conectadas a las señales de entrada de la siguiente máquina y así sucesivamente, para formar un círculo completo también.

SERNET tiene que configurarse para que sepa qué puerto usar como puerto de comunicación. Como es habitual en muchos programas y controladores de dispositivo del QL esto se hace mediante el uso de MenuConfig para configurar los parámetros dentro del binario del propio controlador (SERNET_REXT).

Una vez configurado podemos cargar el controlador con una instrucción similar a la siguiente (suponemos que el controlador está en el directorio raíz de la unidad win1_.

LRESPR win1_SERNET_REXT

Sernet enlaza los ordenadores a través del puerto serie y utiliza el nombre de dispositivo “S” de forma similar a la “N” para la red QL.

Y por último, una vez cargado el controlador, sólo tenemos que definir el número de estación y activar los servicios de la estación como servidora dentro de la red. Las instrucciones serían como el siguiente ejemplo:

Estación 1:
  SNET_USE 1
  SERNET 

Estación 2:
  SNET_USE 2
  SERNET 

A partir de este momento estas dos estaciones pueden compartir sus recursos. Por ejemplo con la siguiente instrucción en la estación s1.

DIR s2_FLP2_            

Nos mostrará el pantalla el directorio raíz de la segunda disquetera de la estación 2.

Enlazando las dos redes, QLNET y SERNET.

Para finalizar, el último paso de nuestro experimento es configurar un entorno, en el cual puedan convivir dos redes: QL NET y SERNET. Por un lado QL NET nos permitiría conectar QL originales (BBQL) en nuestro entorno, y por otro lado podríamos añadir a esta “red QL” sistemas modernos que tengan disponible al menos un puerto RS232 (por ejemplo el emulador QPC2 en un PC con Windows 10 o la FPGA Q68).

El punto de unión de estas dos redes la hemos resuelto con una combinación hardware-software relativamente reciente. El hardware no es otro que la FPGA Q68 que incluye de serie un puerto RS232 y a la cual se la he aplicado un “modding” para incluir dos conectores QL NET. En cuanto al software, lo único que necesitamos ejecutar en la Q68 es el driver SERNET que hemos mencionado anteriormente y el nuevo driver QLNET de Martyn Hill que te permite conectar en red el Q68 con otras máquinas compatibles con QL a través de los puertos QLNET estándar. Los comandos a incluir en el boot de arranque de la Q68 sólo debe incluir los siguientes comandos:

LRESPR win1_sernet_rext     (Carga el controlador SERNET)
BAUD 115200                 (Establece la velocidad en baudios) 
SERNET 2                    (Establece s2 como número de estación SERNET)
SERNET                      (Activa los servicios SERNET) 

LRESPR win1_ndq68_dvr_v305  (Carga el driver de red QL NET para Q68)
NET 2                       (Establece n2 como estación QL NET) 
FSERVE                      (Activa las funciones de servidor QL NET). 

Descrito todo esto, la primera parte de este artículo seguramente tendrá más sentido.

—-
Fuentes:
– SUPERTOOLKIT II, MANUAL DEL USUARIO (Tony Tebby, Qjump, Reino Unido. 1985).
– The QL Network. QL Today, Volume 9 Issue 4. (David Denham).
– SERNET on QDOS? QL Today, Volume 6 Issue 6. (Dilwyn Jones).
– Announcing availability of a QLNET driver for the Q68 (ND-Q68) (https://qlforum.co.uk/viewtopic.php?f=3&t=2881&p=28393) (Martyn Hill).