Creando extensiones para SuperBASIC con Q_Liberator

Uno de los aspectos más sorprendentes del QDOS y del SuperBASIC es la capacidad de cargar archivos binarios para aportar un montón de nuevos comandos al SuperBASIC. La mayoría de los equipos de los años 80 venían con un Basic integrado, pero éstos eran estáticos y no había una forma simple de extenderlos. Otros lenguajes (como C, Fortran o Pascal) usan librerías de funciones y procedimientos que permiten ampliar las capacidades de sus bibliotecas.

La primera extensión importante que se desarrolló para el QL fue el ToolKit (I y II). A partir de entonces el término toolkit fue usado para hacer referencia a extensiones cargables. Algunos de los toolkits más populares son ToolKit II (TKII), DIY ToolKit, y DJToolKit

Los primeros toolkits fueron escritos en Ensamblador, pero es poco conocido que también pueden ser creados con Q_Libertator. El formato de los ejecutables y las extensiones en QDOS son muy similares, y cuando se compilan de hecho pueden ser intercambiables. Esto significa que un ejecutable puede ser cargado también como una extensión.

Para averiguar cómo crear un toolkit, tomaremos como ejemplo una función sencilla, Q_Liberator, y seguiremos una serie de pasos muy simples. La función que vamos a incluir en nuestro toolkit de ejemplo es la siguiente:

10 REMark $$external
100 DEFine FuNction MAYUSCULA$(cad$)
110   LOCal i, temp
120   FOR i = 1 TO LEN(cad$)
130     temp = CODE(cad$(i))
140     IF temp > 96 AND temp < 123 THEN
150       cad$(i) = CHR$(temp-32)
160     END IF
170   END FOR i
175   RETurn cad$
180 END DEFine

Esta función toma cualquier cadena y convierte todas sus letras en mayúscula. El $$external de la línea 10 es una directiva del compilador que le dice a Q_Liberator que la función o procedimiento siguiente debe estar disponible fuera del ejecutable. Para cada procedimiento o función que deseemos convertir en extensión, debemos poner la directiva $$external antes de su declaración.

A continuación, lo que debemos hacer es compilar nuestro pequeño programa. Ya hemos visto en un post anterior en nuestro Blog cómo compilar programas con Q_Liberator.

Cuando compilamos nuestra pequeña función con Q_Liberator, es una buena idea desactivar la opción WINDS, ya que la extensión no necesita canales abiertos. De lo contrario se abrirán 3 canales para ella, siendo esto innecesario para nuestra simple función. Para reducir el tamaño del archivo binario también es una buena idea desactivar las opciones NAMES y LINES. Esto es importante ya que nuestra extensión permanecerá siempre en memoria y cuanto menos espacio y recursos use mucho mejor. Por convención, todas las extensiones se suelen definir en mayúsculas (en nuestro ejemplo MAYUSCULA$). Puedes comprobar esto con el comando EXTRAS donde verás todas las extensiones instaladas en tu sistema.

Si vas a cargar la extensión en un sistema donde ya esté cargado el runtime Qlib, podemos compilar nuestra extensión sin el runtime de Q_Liberator, esto nos ahorrará memoria si hay varias extensiones generadas con Q_Liberator en nuestro sistema. Si no sabes si el runtime QLib de Q_Liberator va a estar disponible en el sistema donde se vaya a cargar tus extensiones, entonces es mejor incluir el runtime en la compilación. Es una buena idea compilar la extensión de las dos formas y luego que sea el usuario el que decida la versión que más se ajuste a su sistema. Nuestra extensión de ejemplo ocupa 448 bytes sin el runtime Qlib, con el runtime ocupa unos 11,200 bytes.

Si cargas una extensión que no incorpora el runtime Qlib, y el sistema donde se ejecuta tampoco tiene cargado este runtime, no recibirás un mensaje de error cuando cargues la extensión (con LRESPR por ejemplo). Sin embargo, cuando invoques alguna función o procedimiento de dicha extensión recibirás un error. El mensaje de error exacto es:

Error «Runtimes Missing !»

Una vez hayas compilado una extensión, todo lo que se necesita es cargar la extensión con LREPSR y probarla. Recuerda que no puedes cargar una extensión con LRESPR cuando cualquier otro trabajo, distinto del Job 0 (SuperBASIC), se está ejecutando.
A partir de ahora, ya tienes una nueva función en SuperBASIC (cada vez que cargues esta extensión) y usarla como cualquier otra función nativa del lenguaje, algo similar a esto:

100 PRINT MAYUSCULA$("hola mundo, mi primera extensión")

Con esta simple guía y el uso de Q_Liberator, ¡ya puedes desarrollar nuevos comandos para ampliar el SuperBASIC!


Fuente:
Artículo original de Timothy Swenson
en QL Hacker’s Journal

1 comentario
  1. Radastan dijo:

    No publiqueis estas cosas hombre, que luego se pone uno a experimentar y no hace nada productivo. xD

Deja un comentario