Un Forth-83 estándar y completo para ZX Spectrum
Descripción del contenido de la página
Primer contacto con el Forth-83 Standard System de L.C. Benschop para ZX Spectrum, un Forth con todas las herramientas deseables.
Desde que aprendí Forth en mi ZX Spectrum, en 1984, siempre tuve esperanza de tener un Forth potente para esa máquina, un Forth que pudiera manejar minicintas (microdrives) de Sinclair o, más tarde, disquetes Beta o DISCiPLE; un Forth que dispusiera de un ensamblador de Z80, de un editor de pantalla completa... Lo más parecido era la versión 1.1B de Abersoft Forth, que al parecer nunca llegó a comercializarse.
En estos últimos meses, recopilando fuentes de antiguos programas míos escritos en Forth, para publicarlas en programandala.net, he tenido que usar Abersoft Forth tras muchos años, aunque lógicamente no en una ZX Spectrum «de carne y hueso» sino en el emulador Fuse. Y he vuelto a sentir la misma necesidad (escribí algo sobre ello hace unos días en la página de La aventura de Ug). Se me ocurrió la idea, como me suele suceder, de escribir yo mismo un sistema Forth para la ZX Spectrum, o bien modificar Abersoft Forth o Artic Forth... o incluso además adaptar alguno de ellos para que sustituyera a la ROM de la computadora...
Ayer, casi inconscientemente, hice una búsqueda deseperada más en Google (con el estupendo navegador Elinks, para concentrarme mejor). El primer resultado de la lista era una página mía de programandala.net en que escribo sobre estos asuntos, vaya... Es de agradecer pero no me sirve de mucho...
Pero al poco rato encontré algo muy interesante entre los resultados, un documento llamado My first experiences with Forth (Mis primeras experiencias con Forth), en la página personal de Lennart Benschop. Yo no recordaba su nombre, pero sí haber leído una tan divertida como falsa entrevista con Charles Moore, de la que resulta que Lennart era el autor.
En ese documento Lennart habla de los sistemas Forth que en su día escribió para la ZX Spectrum. El segundo de ellos era un Forth-83 estándar, muy completo, con muchas utilidades, que funcionaba tanto en la Spectrum de 48 KiB como en la de 128, tanto con cintas como con minicintas... No podría creerlo.
Por un momento temí que en el párrafo siguiente el autor dijera algo así como Lástima que mis cintas y mis cartuchos se perdieran cuando me mudé de casa en el año tal y cual
o bien No sé en qué vieja caja de cartón, perdida en el fondo de un oscuro y mohoso armario, andará el código fuente de este programa
. Cosas parecidas he leído más de una vez de programadores que en su día crearon programas valiosos, interesantes, o simplemente curiosos, y que no se preocuparon de preservarlos y publicarlos, lo cual en mi opinión es una lástima.
Pero no, el autor continuaba diciendo, así como de pasada, como si no fuera con él, que el programa seguía disponible en un servidor de FTP noruego cuya dirección citaba. No lo podía creer. Fui a buscarlo como un rayo, temiendo que el documento ya no estuviera allí al cabo de los años. Navegué por intuición entre los directorios del servidor y lo encontré. Lo bajé, lo probé, lo examiné... y seguía sin poder creerlo: Era una maravilla. Todo lo que me hubiera gustado programar a mí él lo había hecho ya veintidós años antes.
Breve descripción del sistema
Esta implementación de Forth es un sistema estándar Forth-83 con todas las herramientas opcionales deseables: editor, descompilador, números de doble precisión, números de coma flotante, metacompilador, ensamblador, multitarea, cadenas de texto, gráficos... Aún durante un momento pensé que estaba soñando.
El manual completo, con la referencia de todas las palabras del sistema, está en neerlandés, pero se incluye también un resumen en inglés de lo más necesario. [Actualización: En 2015, Lennart tradujo el manual al inglés].
La solución dada por Lennart al manejo del código fuente es muy original: En una Spectrum de 48 KiB Forth-83 usa un disco RAM de 10 bloques, del 1 al 10 (Abersoft Forth usa 11, numerados del 0 al 10, pero el número 0, como es convención en Forth, no puede ser compilado y sólo se usa para poner comentarios); en una Spectrum de 128 KiB hay 80 bloques libres (lo que se logra, de forma transparente para el usuario, usando la memoria paginada de la máquina, como se explica muy bien en el manual). Pero en lugar de leer y grabar todo el disco RAM completo, como hace Abersoft Forth, es posible grabar cualquier rango de bloques en un fichero y leer el contenido de un fichero de bloques en cualquier bloque del disco RAM. Es una solución magnífica que permite organizar cómodamente grandes cantidades de código fuente.
Muestro una explicación de las palabras que permiten gestionar el código fuente:
FORMAT
limpia el disco RAM.0 DRIVE
seleccciona la cinta como entrada y salida.1 DRIVE
selecciona la minicinta 1 (o el número que sea, hasta 8).60 BCAL
graba el sistema Forth (si lo hemos ampliado hay que hacer antesHERE FENCE !
).DELETE
borra un fichero de la minicinta.CAT
muestra el contenido de la minicinta.n1 n2 PUT
guarda los bloques n1 a n2 en cinta o minicinta.n1 GET
carga un fichero de bloques desde la cinta o la minicinta, en la posición del bloque n1.RUN
carga un fichero en el disco RAM y empieza a compilarlo.
Todas las operaciones de entrada y salida de cinta y minicinta las realiza el pequeño programa en BASIC que a su vez sirve de cargador del sistema; la línea 1 de dicho programa sirve como punto de reentrada en caliente en caso de que abandonemos el sistema Forth. La ingeniosa palabra BCAL
sirve precisamente para ejecutar desde nuestro programa en Forth el programa actual en BASIC a partir de una línea; eso abre posibilidades muy interesantes.
Como se ve el sistema elegido para la gestión del código fuente es sencillo, original y muy versátil.
Todos los ficheros fuente proporcionados no tienen más de diez bloques cada uno, para que puedan ser gestionados con una Spectrum de 48 KiB, pero si trabajamos con una máquina de 128 KiB podremos juntar varios de esos ficheros en uno (por ejemplo el metacompilador) o añadirlos a los ficheros de nuestra propia aplicación.
El editor
El formato tradicional del código fuente en Forth es de bloques de 1 KiB organizados como 16 líneas de 64 columnas Este formato es poco adecuado para la pantalla de la ZX Spectrum.
Algunos sistemas Forth para esta máquina, como Abersoft Forth, obvian la cuestión y usan el formato estándar, dificultando así la lectura de los bloques y el manejo del editor, que por otra parte es un editor clásico de comandos; otros Forth poco conocidos optaron por crear logicialmente una pantalla de 64 caracteres (como hacía el tratamiento de textos Tasword 2).
Lennart Benschop incluye en su Forth un editor de pantalla completa y propone una original solución de compromiso: dividir cada bloque de código en 32 líneas de 32 caracteres. Así la escritura es más cómoda, con la única pega de que el editor sólo puede mostrar una mitad del bloque a la vez: 16 líneas.
Las teclas del editor son:
- Las teclas del cursor (de CAPS SHIFT+5 a CAPS SHIFT+8) mueven el cursor.
- GRAPHICS (CAPS SHIFT+9) inserta un espacio en la posición del cursor.
- DELETE (CAPS SHIFT+) borra el carácter bajo el cursor.
- TRUE VIDEO (CAPS SHIFT+3) inserta una línea.
- INV VIDEO (CAPS SHIFT+4) elimina la línea.
- SYMBOL SHIFT+Q: va hacia atrás por mitades de bloque.
- SYMBOL SHIFT+E: va hacia delante por mitades de bloque.
- SYMBOL SHIFT+W: va al inicio del bloque.
- EDIT (CAPS SHIFT+1) abandona el editor.
Sorprendentemente, el editor tiene una importante limitación: no ofrece combinaciones de teclas para copiar y pegar líneas. No sería difícil implementarlas.
Pantallazos
Muestro a continuación la pantalla inicial del sistema en ambos modos (48 y 128 KiB). Como se ve, la memoria libre es de 18 179 octetos en un caso y de 28 419 octetos en el otro:
El editor, como expliqué anteriormente, muestra sólo la mitad de cada bloque. Los siguientes ejemplos muestran el editor en acción con las dos mitades del segundo bloque de código fuente del propio editor:
Y por último muestro el resultado de listar el primer bloque del primer fichero del metacompilador, para que se aprecie que el código fuente puede leerse perfectamente en la pantalla gracias a las líneas de 32 caracteres:
Sobre compartir, ayudar e inspirarse
Casualmente, Lennart Benschop estaba escribiendo su Forth-83 por las mismas fechas en que yo estaba escribiendo La aventura de Ug, precisamente echando en falta un sistema Forth más potente y cómodo con que trabajar. ¿Pero cómo hubiera podido enterarme de ello entonces, a menos que hubiera sido vecino suyo en los Países Bajos y hubiéramos estado apuntados al mismo club de usuarios de Spectrum o de Forth? Y aun así. Una vez más me doy cuenta de la importancia de la red, que permite compartir nuestras obras, por pequeñas que sean, y lanzarlas como semillas para que sirvan de ayuda o fuente de inspiración a los demás.
De momento, este Forth me ha ayudado a mover algunos proyectos que tenía en mente desde el apartado de «improbables» al apartado de «posibles»; y me ha inspirado otros nuevos.
Descargas
El enlace al programa en el servidor de FTP donde lo encontré originalmente:
Distribución de programandala.net, que incluye ficheros adicionales: un artículo del autor; las fuentes de la librería del sistema, extraídas del fichero MDR; y dos documentos creados por el autor en 2015: la fuente del metacompilador anotada por el autor; y la traducción inglesa del manual.
Esta distribución también está disponible en la sección de ficheros de Forth on Sinclair (and Z80) computers. Una versión anterior de la misma puede descargarse también del archivo de World of Spectrum.
La traducción inglesa del manual (incluida en la última versión del fichero anterior):
- Manual de Spectrum Forth-83 en inglés, traducido por Lennart Benschop (texto comprimido con ZIP) (35.60 KiB)
- Manual de Spectrum Forth-83 en inglés, editado por Guy Fortabat (PDF comprimido con ZIP) (317.90 KiB)