Apuntes sobre Beta BASIC 4.0+D

Descripción del contenido de la página

Relación de características destacadas, limitaciones, fallos y trucos de Beta BASIC 4.0+D (para ZX Spectrum 128 con interfaz +D).

Etiquetas:
Este texto describe los principales puntos fuertes y débiles del lenguaje de programación Beta BASIC 4.0+D, que uso en algunos de mis proyectos.

La versión 4.0+D del lenguaje es una variante de la versión 4.0, específica para la interfaz de disco Plus D (o su antecesora DISCiPLE); había variantes de la versión 4.0 para varias unidades de disco. A su vez, la versión 4.0 del lenguaje es la adaptación de la versión 3.0 para aprovechar las ventajas de la ZX Spectrum 128 respecto al modelo anterior: disco RAM y chip de sonido.

Toda la documentación de la versión 3.0 es válida para la 4.0 salvo casos excepcionales. De hecho la documentación de la versión 4.0 solo se ocupa de los comandos y funciones nuevos o ampliados, y remite al manual de la 3.0 para el resto.

Características destacadas

Las mejoras que Beta BASIC 4.0+D ofrece sobre Sinclair BASIC son muchas y muy importantes. No es un conjunto de extensiones para el lenguaje original de la ZX Spectrum, como ha habido varios, sino un BASIC nuevo que por restricciones de espacio utiliza parte de las rutinas de la ROM.

Listo a continuación, divididas en secciones, algunas de las características que me parecen más destacadas.

Programación estructurada

Edición de programas

Velocidad

Datos

Gráficos

Otras mejoras

Funciones

Beta BASIC ofrece la posibilidad de definir procedimientos, pero no funciones propiamente dichas. Es una de sus limitaciones.

El programador tiene dos opciones:

  1. Crear funciones con el mismo y limitado comando DEF FN de Sinclair BASIC, funciones que sólo permiten cálculos de una línea y cuyo nombre sólo puede constar de una letra.
  2. Crear seudo-funciones con procedimientos que devuelvan el cálculo en una variable global o en un parámetro pasado por referencia.

Esto no es todo. Beta BASIC usa 29 de las 52 funciones disponibles en Sinclair BASIC para definir sus propias funciones con nombres largos nuevos, de forma casi trasparente. ¿Cómo lo hace? Por una parte, las definiciones de estas funciones (con el citado comando DEF FN) están escondidas en la línea 0 del programa (que el editor mantiene invisible) y contienen, camufladas, las llamadas al código máquina correspondiente en cada caso; por otra parte, el editor reconoce estas funciones tanto con su nuevo nombre largo como con su nombre original corto (en este caso las funciones numéricas son reconocidas al teclear el paréntesis de apertura; las funciones de cadena son reconocidas al teclear el símbolo del dólar). En los listados en pantalla o impresora, así como en la línea de edición, siempre se mostrará el nombre largo.

La siguiente tabla muestra una fila por cada una de las funciones que el programador puede definir en Sinclair BASIC. Las que ya están definidas por Beta BASIC 4.0 (29, dos más que en Beta BASIC 3.0) muestran sus parámetros y, en la segunda celda, el nombre largo alternativo; las restantes (23) están disponibles para el programador.

Nombre original Nombre largo
FN A$()
FN A(N,N) AND(N,N)
FN B$(N) BIN$(N)
FN B()
FN C$(N) CHAR$(N)
FN C(N) COSE(N)
FN D$()
FN D(T$) DEC(T$)
FN E$()
FN E(N) EOF(N)
FN F$(N,N) FP$(N,N)
FN F() FILLED()
FN G$()
FN G()
FN H$(N) HEX$(N)
FN H()
FN I$()
FN I(N,T$,T$) INSTRING(N,T$,T$)
FN J$()
FN J()
FN K$(N,N) SCRN$(N,N)
FN K()
FN L$()
FN L(N,N$) LENGTH(N,N$)
FN M$() MEMORY$()
FN M() MEM()
FN N$()
FN N(T$) NUMBER(T$)
FN O$()
FN O(N,N) OR(N,N)
FN P$()
FN P(N) DPEEK(N)
FN Q$()
FN Q()
FN R$()
FN R(N) RNDM(N)
FN T$(N,T$) STRING$(N,T$)
FN S(N) SINE(N)
FN T$() TIME$()
FN T() ITEM()
FN U$(T$,N) USING$(T$,N)
FN U(M$,T$) INM(M$,T$)
FN V$()
FN V(N,N) MOD(N,N)
FN W$()
FN W()
FN X$() MDP$()
FN X(N,N) XOR(N,N)
FN Y$() CAT$()
FN Y()
FN Z$(N,T$) SHIFT$(N,T$)
FN Z()

Parámetros utilizados:

Limitaciones

Algunas de las limitaciones de Beta BASIC 4.0 son lamentables porque el desarrollo de programas sería mucho más fácil sin ellas; otras limitaciones son de poca importancia. Pero en conjunto todas las limitaciones están compensadas más que sobradamente por las muchas e importantes ventajas del lenguaje.

Fallos

Todo programa complejo tiene fallos. En los números del boletín Beta BASIC Newsletter el autor del lenguaje fue proponiendo soluciones para algunos fallos que los usuarios fueron describiendo. Este apartado mostrará los fallos que he descubierto yo y que no están mencionados en la citada documentación:

Comando DELETE

Una de los usos del comando DELETE es borrar elementos de matrices, pero si lo usamos, análogamente a otros comandos, con la sintaxis para acceder a las matrices creadas en el disco RAM (DELETE!), provocamos un cuelgue del sistema en lugar de un error sintáctico, que sería lo adecuado pues es una funcionalidad no implementada.

Función STRING$()

Cuando la función STRING$() es anidada, muchas veces el resultado es diferente de lo esperado. Aún no he averiguado por qué no siempre ocurre.

Ejemplos:

Para mostrar este fallo escribí el programa stringBug.

Comandos de G+DOS y Beta DOS tras ELSE

Los comandos de la unidad de disco no son aceptados tras la nueva palabra clase ELSE; es necesario separarlos por medio del signo de dos puntos.

La siguiente línea es aceptada, porque CAT! es un comando del disco RAM:

10 IF 1 THEN PRINT:ELSE CAT!

Pero estas otras no son aceptadas, porque CAT 1 es comando del G+DOS original de la interfaz +D, y CAT es la versión abreviada de Beta DOS:

10 IF 1 THEN PRINT:ELSE CAT 1
20 IF 1 THEN PRINT:ELSE CAT

La solución es separar ELSE en estos casos:

10 IF 1 THEN PRINT:ELSE:CAT 1
20 IF 1 THEN PRINT:ELSE:CAT

Lo he probado con varios comandos de disco y ocurre lo mismo, pero con Beta DOS; no lo he probado con G+DOS.

Páginas relacionadas

OverBug
Herramienta para investigar un fallo de Beta DOS en Beta BASIC, para la Sinclair ZX Spectrum.
stringBug
Demostración de un fallo de Beta BASIC, para la Sinclair ZX Spectrum.
bb4d-fixer
Programa que corrige varios fallos de Beta BASIC 4.0+D.