CPCBasic está orientado a programadores que quieran escribir aplicaciones para Amstrad CPC desde el entorno Windows. Es una aplicación en modo línea de comando que permite generar un fichero fuente ensamblador a partir de un fichero fuente escrito en el lenguaje CPCBasic, basado en el Locomotive Basic incluido en los ordenadores Amstrad CPC.
El fichero ensamblador generado se puede ensamblar para generar un fichero binario para ejecutar en un ordenador Amstrad CPC o emulador. Para crear este fichero binario puede utilizarse un ensamblador cruzado como pasmoo el ensamblador incluido en algunos emuladores como WinCPCo WinApe.
Una vez creado el fichero binario, si no se ha hecho con el ensamblador incluido en un emulador que genere el resultado directamente sobre la memoria del mismo, se pude utilizar alguna utilidad como InsSNApara llevar el fichero a un archivo .DSK que permita leerlo también en un emulador o alguna utilidad de transferencia para transportar el código binario del fichero a un Amstrad CPC real.
Para poder utilizar la aplicación CPCBasic o InsSNA debe estar instalada la librería Microsoft .NET Framework 2.0o superior. Para el resto de programas que se vayan a utilizar en el desarrollo de aplicaciones sobre CPCBasic consultar la documentación de dichas aplicaciones.
Características
Las principales diferencias del código CPCBasic respecto al intérprete Locomotive Basic del CPC son:
Es imprescindible declarar todas las variables, individuales o de tipo array.
Los números de línea desaparecen, y para referencia puntos del código con las instrucciones GOSUB, GOTO o RESTORE se utilizan etiquetas.
Los nombres de las funciones deben llevar como sufijo siempre el tipo de dato que devuelven, a menos que sea del mismo tipo, que en el momento de utilizarse la función, se encuentre determinado para los identificadores que comiencen por la letra inicial del nombre de la función. Dicho de otro modo, si no se ha utilizado ninguna directiva DEFBYTE, DEFINT, DEFLNG, DEFREAL o DEFSTR todos los identificadores se interpretan de tipo real, así que si se usa la función ABS que devuelve un dato real, no hará falta poner el sufijo de tipo !, pero si se usa INT que devuelve un tipo entero largo, sí que habrá que usarla como INT& (& es el sufijo de entero largo). Si se hubiese utilizado por ejemplo DEFLNG A-Z (define todos los identificadores sin sufijo como enteros largos), para usar ABS habría que escribir ABS!, mientras que para usar INT no haría falta especificar el sufijo &. De cualquier forma siempre se puede utilizar el sufijo para las funciones y así evitar confusiones.
También respecto a las funciones, aunque no necesiten parámetros, siempre necesitan los paréntesis. Este caso se da por ejemplo en la función TIME, que habrá que utilizarla escribiendo TIME&() (sobre el sufijo & se encuentra explicado en el punto anterior) o la función RND utilizada sin argumentos, que se escribiría en CPCBasic como RND!().
La orden PRINT sólo acepta un argumento, de tipo cadena de texto, así que siempre será necesario transformar los números a imprimir con DEC$, HEX$ o BIN$, y si son varias expresiones las que se quieren imprimir, concatenarlas con el operador +; por otra parte, para que se realice un salto de línea hay que usar una orden PRINT sin ningún argumento.
El manejo de cauces (ventanas de texto) se hace diferente, ya que para las órdenes que admiten este valor lo deben recibir como último argumento, siendo siempre opcional. Es decir, por ejemplo la orden PEN que en Locomotive Basic sería PEN#1,5 (establecer tinta 5 para la ventana de cauce 1) en CPCBasic sería PEN 5,1. En cualquier orden que utilice un número de cauce, si se omite se interpreta que es el 0 (PEN 5 sería equivalente a PEN 5,0, igual que PEN 5 equivaldría a PEN#0,5 en Locomotive Basic).
La instrucción DEF FN queda destinada a la definición de funciones de usuario en ensamblador, no existiendo la posibilidad de declarar funciones de usuario con instrucciones Basic.
No existe ningún control de errores, las operaciones pueden terminar correctamente, o darán resultados absurdos o bloquearán el ordenador, pero nunca aparece ningún tipo de error.
Existen otras ciertas diferencias en los parámetros recibidos en algunas órdenes.
Como mejoras de CPCBasic se podrían mencionar:
La posibilidad de utilizar datos de tipo byte (8 bits), entero largo (32 bits) además de los enteros, reales y cadenas de texto, para optimizar la velocidad.
Se pueden definir y utilizar constantes en lugar de variables con un valor fijo.
El uso de etiquetas en lugar de números de líneas permite la mejor legibilidad del programa.
El código se puede hacer también más legible dividiendo líneas largas en varias líneas físicas utilizando el carácter _ al final de una para indicar que la siguiente es su continuación.
En cuanto a la velocidad de ejecución, se ha intentado que sea el punto fuerte de este compilador, incluso en detrimento del espacio ocupado. En operaciones con números, el tiempo de ejecución es un 10% respecto al tiempo del intérprete (por supuesto si se usan correctamente los tipos de datos). En cuanto a otras operaciones que hagan uso del firmware la ganancia ya no es tanta, aunque nunca será superior el tiempo en CPCBasic respecto a Locomotive Basic. En global y con carácter general un programa en CPCBasic tarda menos de la mitad de tiempo en ejecutarse que el mismo en Locomotive Basic.
Por otra parte, el uso del firmware es bastante intenso en toda la aplicación, sobre todo en lo que se refiere a las órdenes y funciones y el uso de valores de tipo real. En cualquier caso siempre se puede crear una nueva orden o función y reescribirla sin usar el firmware si éste no se considera adecuado para la velocidad.
Modo de uso
Para crear el fichero fuente CPCBasic será necesario un editor cualquiera que genere un fichero de texto plano. Se recomienda cualquier editor bajo Windows orientado a programación, como UltraEdit(shareware) o PSPad.
Tras escribir y grabar el fichero fuente CPCBasic se debe compilar con CPCBasic desde la línea de comandos, de la forma:
donde fichero.bas es el nombre del fichero fuente creado con el editor (se recomienda extensión .BAS) y /destino es la especificación del modelo de Amstrad CPC para el que se quiere genera el código ensamblador. Se puede indicar /464, /664 y /6128, siendo estas dos últimas posibilidades de idéntico efecto. Si se omite este segundo parámetro se interpreta como si se hubiese especificado /464.
Si no aparece ningún error se habrá generado un fichero con el mismo nombre que el fuente, pero con extensión .ASM que contendrá el código ensamblador equivalente al programa CPCBasic. Este fichero se deberá ensamblar con algún programa ensamblador cruzado que genere código binario, como pasmou otro similar que admita la misma sintaxis. Consultar la documentación del ensamblador elegido para ver el modo de uso.
Si también se ha generado correctamente el fichero binario a partir del fichero ensamblador, será necesario llevar el contenido de este fichero a un Amstrad CPC real, mediante uno de los diferentes métodos existentes: cable, creación de disquete de 3½ para la lectura desde el CPC sobre disquetera externa, etc.
El otro sistema a partir de haber generado el fichero ensamblador es llevarlo a la herramienta de un emulador que permita ensamblarlo directamente a la memoria del emulador.
Ejemplo 1: Suponiendo que se tenga en la misma carpeta el programa en CPCBasic, el compilador CPCBasic, el ensamblador pasmo, la utilidad InsSNA y una imagen de memoria de emulador en un estado recién iniciado llamada inicial.sna, se utilizarían la siguientes sentencias desde la ventana de modo de símbolo de sistema:
cpcbasic fichero.bas
pasmo fichero.asm fichero.bin
inssna inicial.sna final.sna fichero.bin 16384
Posteriormente se cargaría en el emulador la imagen final.sna y se ejecutaría el programa con CALL &4000.
Ejemplo 2: Otra alternativo utilizando un emulador que permita ensamblar directamente sería realizar únicamente la compilación (primera línea del ejemplo anterior) y en el mencionado emulador abrir el fichero .ASM generado y ensamblarlo, llamando igualmente al programa con CALL &4000.
Ejemplo 3: Si se quiere ejecutar el programa en un Amstrad CPC real se realizaría la compilación y ensamblado (dos primeras líneas del primer ejemplo) y el fichero.bin generado se llevaría al CPC real con el método que se prefiera (consultar otras páginas web) y realizar igualmente la sentencia CALL &4000 en el Amstrad.
Documentación
Documentación del compilador CPCBasic
Descripción de órdenes y funciones incluidas en la librería estándar CPCBasic.bas
Documentación para librería Sprites Alive
Descargas
Librería estándar de órdenes y funciones
Librería para utilizar las rutinas de Sprites Alive
Utilidad InsSNA para inserción de código binario en archivos .SNA
Acrobat Reader para leer la documentación de esta web
Enlaces
Página web Amstrad.es (contiene enlaces a otros muchos sitios sobre Amstrad CPC)
FTP con contenido en español sobre Amstrad CPC
FTP con contenido en inglés sobre Amstrad CPC
Errores conocidos
Hasta ahora se han detectado en el compilador los siguientes problemas que según se resuelvan se irán eliminando de esta lista:
La compilación en direcciones inferiores a 16384 (#4000) produce problemas cuando se ejecuta el código binario al realizar operaciones con valores de coma flotante mediante las rutinas del firmware.
Produce error de compilación si se utiliza la palabra reservada ' para indicar un comentario al final de los argumentos de una orden sin separarlo por dos puntos. Ejemplo: LOCATE 5,6 ' Comentario ... produce error de sintaxis, habría que escribir LOCATE 5,6:' Comentario ...
La función RND! de la libreria estándar puede devolver un valor mayor de 1.
Contacto
Por favor, espero cuestiones sobre dudas, comentarios, críticas, sugerencias, comunicaciones de errores, comportamientos extraños, etc. que permitan mejorar esta aplicación a emilioguerrero@terra.es. También acepto cualquier tipo de ayuda para mejoras, traducción de documentación, ... Puedo responder en español, inglés, francés, italiano y portugués. Gracias.
Novedades
27/08/2007
Corregido error en la evaluación de estructuras como IF A<B THEN IF B>A THEN C=1 ELSE C=2 porque consideraba ELSE correspondiente al primer IF (A<B) y no al segundo (B>A) como debería ser.
Corregido error en las expresiones, donde se evaluaba en orden inverso cuando los operandos son a su vez resultado de expresiones como en (3*5)-(4*2) que no producía 15-8=7, sino 8-15=-7; en expresiones con cadenas de caracteres sucedía algo similar, ("A"+"B")+("C"+"D") no producía ABCD sino CDAB.
28/08/2007
Corregido error cuando se especificaba cauce 8 (impresora) en PRINT que producía bloqueo del sistema.
02/09/2007
Sustituído en el código ensamblador generado el prefijo & para constantes hexadecimal por #, ya que & no es reconocido por algunos ensambladores como el de WinAPE o el de DEVPAC bajo AMSDOS.
15/09/2007
En la librería CPCBasic.BAS se ha sustituído la instrucción ADD valor por ADD A,valor para evitar el error que se producía en algunos ensambladores.
18/09/2007
Corregido error en la evaluación de expresiones del tipo A-B*3 que se evaluaban como B*3-A.
22/09/2007
Corregido error en operación de cambio de signo para valores reales en las expresiones porque se modificaba la propia variable a la que se aplicaba.
Cambio para utilizar código ASCII en lugar de Unicode en la salida del código ensamblador para permitir la legibilidad correcta de los caracteres acentuados en la mayoría de editores.
Admitir parámetro /ORG=valor para especificar el origen del código objeto.
24/09/2007
Optimización y corrección del cálculo de productos donde el primer factor es cero, para tipos byte, entero y entero largo.
Validación del valor indicado en parámetro ORG y admisió de la dirección con el formato de las constantes numéricas en el código CPCBasic.
Utilización de ASCII en vez de Unicode para los mensajes de error en pantalla.
25/09/2007
Actualización manual de CPCBasic y manual de librería de órdenes y funciones y corrección de errores tipográficos en ellos.
26/12/2008
Pequeñas correcciones en la librería estándard CPCBasic.bas. Añadida en la página web la librería para utilizar Sprites Alive e instrucciones. Descripción de nuevos errores conocidos.