Historial de desarrollo de BBim
Descripción del contenido de la página
Historial de desarrollo de BBim, utilería para programar en Beta BASIC con el editor Vim.
2011-08-04
Borrador de algunas posibles opciones para pasar un código fuente estándar, escrito con Vim, al intérprete de Beta BASIC.
Opción 1
Un programa en Beta BASIC que extraiga las líneas de texto de una zona de una de la memoria de ZX Spectrum (en la que el emulador habrá cargado el fichero del sistema anfitrión) y las procese con KEYIN
.
Es la manera en que trabaja el programa MBimport 1. En Beta BASIC es inviable debido a poca memoria RAM libre. Se podría usar la memoria de pantalla, pero dividir el código fuente en bloques de 6'75 KiB complicaría y ralentizaría mucho el trabajo.
Opción 2
Un programa en SBASIC o en Forth convertiría el código fuente original en un fichero TAP en el que cada línea original sería un un bloque de código. Después, un sencillo programa en Beta BASIC cargaría cada bloque de código con LOAD ""CODE
, por ejemplo en la memoria de pantalla o en la dirección de una cadena, y lo interpretaría con KEYIN
.
Opción 3
Un programa de Vim convertiría el código fuente en una falsa imagen de disquete MGT, que sería leída sector a sector por un programa en Beta BASIC para extraer sus líneas originales y procesarlas con KEYIN
.
Este es el método utilizado en el programa MBimport 2. con éxito (aunque con resultado infructuoso debido a los fallos de la ROM de la SAM Coupé) y que parece el más efectivo como parte de un entorno de trabajo: el mismo editor con el que se escribe el código fuente crea fácilmente un fichero en un formato directamente importable por la herramienta de la máquina destino.
2011-08-31
Creados los programas vim2bb.vim y vim2bb2mgt.sh a partir de las versiones análogas de para SAM Coupé.
Corregido y mejorado el fichero de resaltado de sintaxis de Beta BASIC.
Creado el fichero de resaltado de sintaxis bb.vim, extensión de beta_basic.vim, a partir de sb.vim (extensión a su vez de superbasic.vim).
El programa en Bash se hace innecesario porque Vim puede crear el fichero MGT llamando al programa dd
. El programa de Vim se renombra como bb2mgt.vim.
Primera versión del programa importador load_bbmgt, para leer el código fuente de los sectores de una falsa imagen de disquete MGT. Parece que el comando LOAD @
de Beta DOS, para cargar sectores del disco y homónimo del original de G+DOS, provoca fallos en Beta BASIC cuando se usa dentro de bucles DO
- LOOP
o procedimientos. Parece algo similar al fallo en Beta BASIC con el SAVE OVER
de Beta DOS, que descubrí hace tiempo.
2011-09-01
Terminado el fichero de resaltado de sintaxis BBim para Vim. Es una extensión para el de Beta BASIC, del que tenía una versión incompleta pero bastante avanzada.
Nuevo importador sencillo, para leer el fichero de texto creado por bbim2bb.vim y metido en una imagen de disquete MGT por SAM Diskimage Manager (hay que editar el fichero MGT en modo binario para cambiar el tipo de fichero a OPENTYPE).
Parece haber problemas de compatibilidad entre Beta DOS y Beta BASIC al leer ficheros secuenciales; pruebo con G+DOS 2a y parece que pasa lo mismo.
La función FN E()
provista por Beta DOS para conocer el estado del final de fichero ya está ocupada por Beta BASIC; se puede cambiar la letra de la función con POKE @4481,char
pero no parece dar resultado. Errores extraños. Sería más práctico y seguro usar una marca convencional al final del fichero.
2011-09-02
Primeras pruebas, con el código de La legionela del pisto.
El listado original (con todos los módulos juntos) obtenido mediante LLIST
, lldp.bas, lo convierto con llist2BBim y lo reviso a mano. Obtengo así el fichero lldp.mbim.
A continuación proceso el fichero lldp.mbim con el programa mbim2mb.vim y obtengo lldp.mbim.mb, la versión importable.
Seguidamente añado el fichero lldp.mbim.mb a la imagen de disquete mmbim.mgt con el programa SAM Diskimage Manager.
Por último solo queda modificar el tipo de fichero (que por defecto queda como CODE de SAM Coupé). Para ello uso el visor integrado en el gestor de ficheros Midnight Commander (serviría igual cualquier editor que permita modificar ficheros binarios; por supuesto Vim lo hace también). Basta modificar cambiar el octeto que precede al nombre en la entrada de directorio del disquete: de 19 (SAM CODE) a 10 (OPENTYPE).
Una vez montado el disquete en el emulador Fuse, el fichero importable figura correctamente en el directorio. El siguiente programa realiza la prueba de lectura:
1 INPUT "Drive: ";d,"File:"; LINE f$
CLOSE #*
OPEN #VAL "4",dd;f$ IN
2 FOR n=SGN PI TO VAL "9"
LET l$=INKEY$#VAL "4"
NEXT n
3 INPUT #VAL "4"; LINE l$
PRINT l$
GO TO 3
Los primeros nueve octetos saltados por la línea 2 son al parecer los de la cabecera del fichero, que extrañamente se lee como parte del mismo, cosa sin embargo no ocurre con los ficheros OPENTYPE creados desde Beta BASIC o Sinclair BASIC. Eso ya me hace sospechar.
Efectivamente, no podía ser todo tan fácil: Se produce un error inesperado de fin de fichero, siempre en el mismo punto, tras haber leído unas pocas líneas. Tras consultar de nuevo el sistema de ficheros MGT veo cuál es el motivo: No basta con cambiar el tipo de fichero en el directorio: En DISCiPLE y +D, los ficheros OPENTYPE necesitan datos adicionales en el directorio del disquete: el octeto 210 de su entrada de directorio debe contener el número de bloques de 64 KiB del fichero; y los octetos 212 y 213 la longitud de su último bloque.
Una solución sería prescindir de SAM Diskimage Manager y escribir un programa que metiera un fichero del sistema anfitrión en una imagen de disquete MGT como si fuera un fichero de tipo OPENTYPE. Pero una alternativa más sencilla, para salir del paso y poder confirmar si la importación es posible, sería escribir un programa que convirtiera una entrada de directorio de SAM CODE a OPENTYPE en una imagen de disquete MGT.
2011-09-03
Correcciones y ajustes en importMGT (antes load_bbmgt); algunas pruebas nuevas.
2011-09-07
import renombrado como BBimport 2; importMGT renombrado como BBimport 1.
Nuevas pruebas con BBimport 1 confirman que LOAD@
hace inestable el sistema cuando se ejecuta en procedimientos, bucles o subrutinas. Para soslayar este incoveniente empiezo a escribir BBimport 3, versión de BBimport 1 en que el bucle principal está fuera de un procedimiento y en lugar de bucles se usan saltos de línea.
2011-09-10
Completado el código de prueba para implementar las etiquetas con que sustituir los números de línea. Los nombres de etiqueta deben comenzar con el signo @. La definición debe estar al comienzo de su línea. El comando label
es opcional en la definición.
" label_test.vim
" Test to learn how to implement labels in BBim (and SBim).
" 2011-09-09 First version. It works.
" 2011-09-10 Improved with optional command "label".
let lineNumber={} " Empty dictionary to store the line numbers of the labels; the labels are used as keys
" Go to the top of the file:
normal gg
" Store every label in the lineNumber dictionary:
while search('^\s*\(label\s\+\)\?@[0-9a-z_]\+\>','Wc')
" Store the label in the register 'l':
normal "l2yw
" If 'label' is present, repeat:
if getreg('l',1)=='label @'
normal w"l2yw
endif
" Use the label as the key to store the line number:
let lineNumber[getreg('l',1)]=line('.')
normal w
endwhile
" Remove all labels:
%substitute/^\s*\(label\s\+\)\?@[0-9a-z_]\+//
" Substitute every label reference with its line number:
for s:label in keys(lineNumber)
" Go to the top of the file:
normal gg
while search(s:label,'Wc')
execute "substitute/".s:label."\>/".lineNumber[s:label]."/"
endwhile
endfor
Añadida al programa llist2BBim la capacidad de convertir los números de línea en etiquetas y eliminar después las que no sean necesarias.
2011-09-11
Corregida en el programa llist2BBim la función que reagrupa las líneas partidas por Beta BASIC; completada la función que sustituye la indentación automática de Beta BASIC por tabuladores.
2011-09-29
BBim2BB terminado: Revisada y completada la gestión de etiquetas; añadida la función que pone números de línea al programa final; corregido un error que impedía después a BBimport leer la última línea del código.
BBimport 3 terminado; pruebas realizadas con el código de Inebriated Day.
Escrito BBimport 4, versión más rápida de BBimport 3: lee los sectores del disquete de cinco en cinco. Pruebas realizadas con el código de Inebriated Day.
2011-09-30
Mejorados los programas llist2bbim y bbim2bb: eliminados los mensajes de error y del sistema durante la ejecución; añadidos mensajes informativos al final de cada fase del proceso.
2012-01-25
Arreglado un problema con las etiquetas en BBim2BB: las líneas cuyo único contenido era una etiqueta debían ser unidas a la línea siguiente. De otro modo se producían desajustes en el cálculo de su valor.
También se añade en el mismo programa un posible signo «:» tras las etiquetas, a la hora de buscarlas para eliminarlas.
Ambas mejoras fueron tomadas de la reciente implementación de etiquetas en SBim.
En el fichero de coloreado de código en BBim se corrige un pequeño fallo en el coloreado de las etiquetas.
2012-01-27
En BBim2BB se corrige la expresión regular que elimina los comentarios de bloque: tomaba el máximo contenido posible en lugar del mínimo, lo que provocaba que engullera también el contenido entre los bloques primero y último del programa. Esta mejora fue tomada también de SBim.
En el fichero de coloreado de código en BBim se corrige un fallo en el coloreado de la barra inclinada y de la almohadilla.
2012-01-28
Dos capacidades nuevas en BBim2BB:
Se eliminan los números de línea de aquellas líneas que comiencen con el signo de dos puntos. Esto hace que se ejecuten en el momento de la importación.
Se reconoce el nuevo comando #firstline
, que permite elegir la primera línea con que se renumerará el código final en Beta BASIC.