English French
German Spanish
CPC Basic

Generalidades

Descripción del entorno

Opciones de compilación

Tipos de salida

Uso de la ventana de entrada

Diferencias con Locomotive Basic

Librería para uso de valores reales

Requisitos e instalación de CPC Basic

Descripción de los archivos y carpetas de la aplicación

Fichero de configuración

Línea de comandos

Enlaces relacionados

Notas técnicas

Agradecimientos

Historial

Generalidades

CPC Basic es un entorno integrado para desarrollar programas para Amstrad CPC 464, 664 y 6128. Funciona en Windows y otros sistemas operativos que permitan compatibilidad con aplicaciones Windows, como por ejemplo Linux con Mono o Mac OS con Wine.

La función de CPC Basic es permitir la introducción y edición de un programa y realizar la compilación para generar el código máquina necesario y ejecutarlo en un ordenador Amstrad CPC o en un emulador.

Los programas se escriben en lenguaje Basic basado en Locomotive Basic con una serie de diferencias obligadas por tratarse de un compilador y para optimizar la velocidad del código producido.

CPC Basic es gratis de uso y de distribución libre, agradeciendo la mención de su autor.

Descripción del entorno

La pantalla consta de tres zonas:

  • La parte superior permite definir las opciones de compilación para la generación del código a partir del programa introducido.
  • La parte principal es la ventana de salida, donde se van mostrando las sentencias y líneas introducidas, los resultados que producen, los mensajes de error, etc. Se puede desplazar el contenido de esta ventana para ver su contenido anterior pulsando sobre ella y usando las teclas del cursor o de retroceso y avance de página.
  • La parte inferior es la ventana de entrada, donde se introducen los comandos de edición y las líneas del programa.

La ventana de la aplicación CPC Basic es dimensionable y la división entre las ventanas de salida y entrada se puede desplazar para adaptarla al gusto del usuario.

Para salir del entorno es necesario cerrar la ventana del programa pulsando sobre el aspa de la parte superior derecha.

Opciones de compilación

En la parte superior de la ventana de CPC Basic se encuentra:

  • Lista CPC type: modelo de Amstrad CPC (464, 664 o 6128) para el que se va a generar el código. Según el modelo seleccionado existen algunos comandos y funciones que no se soportan.
  • Lista Output: tipo de salida generada por el proceso de compilación.
  • Valor Real numbers: número de valores reales que va a utilizar el programa.
  • Botón Programs: abre el explorador de archivos para el directorio de almacenamiento por defecto de programas Basic.
  • Botón Output: abre el explorador de archivos para el directorio de almacenamiento de ficheros resultantes de la compilación.

Tipos de salida

  • Binary file: produce un archivo con el código máquina correspondiente al programa Basic.
  • Assembler code: produce un fichero con código ensamblador para Z80 correspondiente al programa Basic. Este fichero se pude modificar y ensamblar para producir el código binario necesario para ejecutarlo en un Amstrad CPC o emulador.
  • ccz80 code: produce un fichero con código ccz80 correspondiente al programa Basic. Este fichero se puede modificar y compilar con ccz80 para producir el código binario necesario para ejecutarlo en un Amstrad CPC o emulador.
  • CDT file: produce un fichero imagen de cinta CDT que incluye un fichero OUTPUT.BIN con el código máquina correspondiente al programa Basic. El fichero CDT puede utilizarse en un emulador y ejecutar el fichero incluído con RUN"".
  • DSK file: produce un fichero imagen de disco DSK que incluye un fichero OUTPUT.BIN con el código máquina correspondiente al programa Basic. El fichero DSK puede utilizarse en un emulador y ejecutar el fichero incluído con RUN"OUTPUT.BIN".
  • Snap file: produce un archivo imagen de memoria snap que incluye el código máquina correspondiente al programa Basic. Este fichero SNA puede utilizarse en una emulador y ejecutar el programa pulsando la tecla Intro tras cargar el fichero snap.
  • Run in emulator: misma funcionalidad que la salida Snap file, y además pone en funcionamiento el emulador con la imagen snap ya cargada. La imagen snap no queda almacenada en el disco. Para continuar utilizando CPC Basic hay que salir del emulador.

Los ficheros generados se encuentran en el subdirectorio Output dentro del directorio donde se ha instalado CPC Basic. Cuando se genera un fichero tras la compilación, se eliminan los ficheros creados en compilaciones previas.

Uso de la ventana de entrada

En esta ventana se pueden introducir los comandos de edición y líneas del programa, así como realizar la modificación de éstas.

Se puede introducir una única línea o varias separadas por Control + Intro. Al pulsar la tecla Intro se interpretan todas las líneas existentes en la ventana de entrada. Pulsando la tecla Escape se anula todo el contenido de la ventana de entrada. También es posible pegar en esta ventana el contenido del portapapeles que se haya copiado previamente, con la opción correspondiente del menú contextual que se muestra pulsando el botón secundario del ratón o con las combinaciones de tecla Control + V o Control + Ins, y si se pulsa Intro se interpretará igual que si se hubiese tecleado manualmente el contenido pegado. Esta funcionalidad puede ser útil por ejemplo para introducir líneas o parte de líneas que existan en la ventana de salida o listados de programas completos.

Cada línea introducida puede contener una o varios comandos de edición, separados por el símbolo dos puntos o una línea de programa, que comenzará por un número de línea.

Los comandos de edición admitidos son:

  • AUTO: misma sintaxis y funcionalidad que en Locomotive Basic.
  • CAT: misma sintaxis y funcionalidad que en Locomotive Basic.
  • CLS: misma sintaxis y funcionalidad que en Locomotive Basic, pero no admite especificación de cauce.
  • DELETE: misma sintaxis y funcionalidad que en Locomotive Basic.
  • LIST: misma sintaxis y funcionalidad que en Locomotive Basic, pero no admite especificación de cauce.
  • EDIT: misma sintaxis y funcionalidad que en Locomotive Basic.
  • LOAD: misma funcionalidad que en Locomotive Basic, pero sólo admite la carga de archivos Basic, con la sintaxis LOAD “nombre archivo”. Puede especificarse una ruta para el nombre de archivo; si no se indica, el archivo se carga desde el subdirectorio Programs dentro del directorio de instalación de CPC Basic. Si se especifica como nombre de archivo una cadena vacía se abrirá el cuadro de diálogo de ficheros para seleccionarlo.
  • MERGE: misma sintaxis y funcionalidad que en Locomotive Basic. Puede especificarse una ruta para el nombre de archivo; si no se indica, el archivo se carga desde el subdirectorio Programs dentro del directorio de instalación de CPC Basic. Si se especifica como nombre de archivo una cadena vacía se abrirá el cuadro de diálogo de ficheros para seleccionarlo.
  • MODE: misma sintaxis y funcionalidad que en Locomotive Basic.
  • NEW: misma sintaxis y funcionalidad que en Locomotive Basic.
  • RENUM: misma sintaxis y funcionalidad que en Locomotive Basic.
  • RUN: compila el programa que se encuentra en memoria y produce el fichero correspondiente al tipo de salida que se haya seleccionado. El archivo resultante se almacena en el subdirectorio Output dentro del directorio de instalación de CPC Basic.
  • SAVE: misma funcionalidad que en Locomotive Basic, pero sólo admite la grabación de archivos Basic, con la sintaxis SAVE "nombre archivo". Puede especificarse una ruta para el nombre de archivo; si no se indica el archivo se graba en el subdirectorio Programs dentro del directorio de instalación de CPC Basic. Si se especifica como nombre de archivo una cadena vacía se abrirá el cuadro de diálogo de ficheros para seleccionar el directorio y nombre.

Las líneas introducidas en la ventana de entrada se añadirán al programa. Si se introduce una línea con un número que ya existía sustituirá a la que estaba almacenada. Si se introduce sólo un número de línea la línea se eliminará del programa si existía.

Diferencias con Locomotive Basic

Existe una gran compatibilidad en la sintaxis de los comandos, pero existen algunas diferencias debidas a que CPC Basic es un compilador y no un intérprete y también porque se ha buscado una generación de código lo más rápida posible. Las principales diferencias, además de otras menores que puedan encontrarse, son:

  • En CPC Basic no se controlan los errores durante la ejecución del programa. Si se produce un error el programa sigue funcionando pero posiblemente de forma incorrecta.
  • Cualquier expresión numérica que produzca un valor negativo se transformará a su valor positivo equivalente en complemento a dos, que equivale a sumar 256 si se asigna a una variable byte y 65536 si se asigna a una variable word, al valor negativo producido. Se aconseja evitar que una expresión produzca un valor negativo a menos que se compruebe que el valor equivalente en complemento a dos es válido para la operación en que se va a utilizar.
  • Una expresión que produzca un valor superior al límite de la variable que la almacena se transformará a ese valor restado 256 si se asigna a una variable byte y 65536 si se asigna a una variable word.
  • También hay que tener en cuenta estos conceptos en los bucles descendentes que finalicen en 0 (por ejemplo FOR n%=10 TO 0 step -1, donde n% nunca podrá tomar el valor -1 que indicaría el final del bucle, ya que tras tratar el valor 0, al decrementar en 1 quedaría en 255) o ascendentes que finalicen en el límite superior para una variable (por ejemplo FOR n!=60000 to 65535, donde n! nunca podrá tomar el valor 65536 que indicaría el final del bucle, ya que tras tratar el valor 65535, al incrementar en 1 quedaría en 0), o incrementos y decrementos de variables que produzcan resultados menores de 0 (por ejemplo a%=10:a%=a%-11:IF a%=-1 THEN PRINT "Negativo" no daría el resultado esperado, ya que 10 - 11 produce -1, que se transforma en 255, por lo que la condición no será verdadera) o mayores al límite superior de la variable (por ejemplo a!=60000:a!=a!+10000:IF a!=70000 THEN PRINT "Correcto", donde 60000 + 10000 produce 70000, que se transforma en 70000 - 65536 = 4464).
  • Como se menciona anteriormente, el sufijo % se utiliza para especificar el tipo byte, y el sufijo ! para especificar el tipo word a un identificador de variable, función definida por el usuario, argumento de función, etc.
  • El tipo por defecto para las variables e identificadores en CPC Basic es word si no se utiliza DEFBYTE o DEFSTR para modificarlo, mientras que en Locomotive Basic el tipo por defecto es real.
  • En CPC Basic existen las sentencias DEFBYTE y DEFWORD que sustituyen a DEFINT y DEFREAL de Locomotive Basic, con la misma sintaxis y funcionalidad para identificadores de tipo byte y word respectivamente.
  • Debido principalmente a que CPC Basic produce código máquina en lugar de ser interpretado, porque no realiza ninguna comprobación sobre los errores que se puedan producir y porque los tipos de datos que utiliza varían respecto a Locomotive Basic, no soporta los siguientes comandos dentro de líneas de programa: AUTO, CHAIN, CHAIN MERGE, CLEAR, CONT, DEFINT, DEFREAL, DEG, DELETE, EDIT, ERASE, ERROR, LIST, MEMORY, MERGE, NEW, ON BREAK CONT, ON BREAK GOSUB, ON BREAK STOP, ON ERROR GOTO, RAD, RENUM, RESUME, RESUME NEXT, RUN, WIDTH. El compilador reconoce todas estas palabras clave pero produce un error si se utilizan en un programa.
  • Por los mismos motivos indicados en el punto anterior, CPC Basic no soporta las siguientes funciones: ATN, CINT, COS, CREAL, DERR, ERL, ERR, EXP, FIX, FRE, INT, LOG, LOG10, PI, ROUND, SIN, TAN, UNT. El compilador reconoce todas estas palabras clave pero produce un error si se utilizan en una expresión.
  • Las sentencias DATA, DEF FN, DEFBYTE, DEFSTR, DEFWORD, DIM, SYMBOL AFTER, TROFF, TRON actúan en cualquier punto del programa donde se usen, no importando si el flujo del programa pasa por ellas o no para que realicen su acción o definición correspondiente. Por ejemplo IF a=0 THEN DEF FNf(x,y)=x+y define la función f sin importar el valor de la variable a; a=0:WHILE a>0:TRON:WEND activa el seguimiento del programa aunque el flujo no entre dentro del bucle; END:DIM n$(20) declara la tabla n$ aunque el programa finalice en la sentencia previa.
  • Las variables tipo cadena tienen una longitud de 255 caracteres. Si su contenido va a ser de menor longitud y se quiere utilizar menos espacio en memoria se puede usar la sentencia DIM para especificarlo, con la sintaxis DIM variable*longitud. Por ejemplo, para definir la longitud de la variable a$ a 10 caracteres se indicaría con DIM a$*10. Lo mismo se puede aplicar para las tablas de tipo cadena donde cada uno de los elementos tendrá por defecto 255 caracteres, se puede utilizar la sentencia DIM con la sintaxis DIM tabla(índices)*longitud. Por ejemplo, para definir la longitud de todos los elementos de la tabla de 16 elementos tabla$ a 25 se indicaría con DIM tabla$(15)*25.
  • Los índices especificados en la declaración de una tabla deben ser expresiones constantes, no se pueden utilizar variables en ellas. Por ejemplo DIM a(10*3) es correcto, pero no lo es DIM a(10*n).
  • No se permiten redefinciones de tablas, sólo se pueden declarar una vez.
  • Los operadores / y \ son equivalentes ya que los valores con los que operan son siempre enteros.
  • La expresión de salto en un bucle FOR siempre se interpreta positiva si no es constante, por ejemplo s=-2:FOR i=10 TO 1 STEP s no funcionará como se espera, pero sí lo hará FOR i=10 to 1 step -2.
  • La función RND devuelve un valor de 0 a 65535. Para obtener un valor en el rango n a m hay que utilizar la expresión RND MOD (m - n + 1) + n. Por ejemplo, para obtener un valor aleatorio entre 7 y 10 sería RND MOD 4 + 7; para un valor aleatorio entre 1 y 5 sería RND MOD 5 + 1, para un valor aleatorio entre 0 y 20 sería RND MOD 21.
  • La función TIME devuelve un valor en el rango 0 a 65535, volviendo a cero cuando llega al límite aproximadamente cada 218 segundos.
  • Las expresiones condiciones con operadores relacionales (menor, menor o igual, mayor, mayor o igual, igual y distinto) y las funciones con resultado booleano (por ejemplo EOF) devuelven un valor 0 para indicar falso y un valor 65535 para indicar verdadero, que puede ser interpretado como -1 para efectuar otras operaciones aritméticas.
  • Las funciones ABS y SGN interpretan los valores superiores a 32767 como negativos.
  • El rango de longitud para la función BIN$ es de 1 a 4.
  • El rango de longitud para la función HEX$ es de 1 a 16.
  • La plantilla que se puede especificar para la función DEC$ y para la cláusula USING en PRINT tiene una sintaxis diferente de la usada en Locomotive Basic. Se pueden utilizar los siguientes símbolos: almohadilla (#) especifica un dígito si es significativo o un espacio si no lo es; asterisco (*) especifica un dígito si es significativo o un asterisco si no lo es; cero (0) especifica siempre un dígito; punto (.) y coma (,) especifican punto o coma respectivamente si existe algún dígito significativo previo a ellos; cualquier otro carácter especifica ese mismo carácter. Por ejemplo DEC$(123,"#.##0") produce " 123" (con dos espacios al principio), DEC$(123,"00000") produce "00123", DEC$(123,"***** euros") produce "**123 euros".
  • La claúsula USING sólo puede aplicarse a valores numéricos, no de cadena, y en una plantilla sólo puede especificarse el formato para una expresión numérica, aunque se pueden especificar varias expresiones numéricas a las que aplicar el formato, como en Locomotive Basic.
  • La función STR$ no genera el espacio inicial reservado para el signo cuando el número es positivo.
  • El comando PRINT no imprime el espacio inicial reservado para el signo cuando el número es positivo ni el espacio posterior después de una expresión numérica.
  • El comando PRINT no tiene en cuenta el ancho de pantalla para realizar un salto de línea cuando una expresión a imprimir no cabe en la línea actual o debe avanzarse a la siguiente zona por el uso del separador coma o debe avanzarse a la posición especificada por la cláusula TAB.
  • En el comando PRINT el separador coma y la claúsula TAB no tienen funcionalidad para los cauces 8 y 9 de impresora y fichero respectivamente.
  • Un carácter de código 0 dentro de una cadena trunca la cadena en ese punto. Si es necesario utilizarlo se debe usar la expresión CHR$(0).
  • El comando RANDOMIZE siempre requiere una expresión como parámetro, no se puede omitir para que se le solicite al usuario.
  • Las funciones POS y VPOS no tienen funcionalidad para los cauces 8 y 9 de impresora y fichero respectivamente.
  • El código para las rutinas llamadas por AFTER y EVERY debe ser muy breve en tiempo de ejecución.
  • No se debe salir de un bucle FOR con la sentencia GOTO si el valor final del bucle o el salto se han especificado con una expresión no constante, por ejemplo FOR i=1 TO 10 STEP n ó FOR j=100 TO f*2. Para realizar esta acción se puede establecer el valor de la variable de control del bucle igual al valor final del bucle y saltar hasta la sentencia NEXT correspondiente.
  • Dentro de cada conjunto de sentencias de la parte verdadera o falsa de una sentencia IF no se puede realizar sólo la apertura de un bucle FOR o WHILE o sólo el cierre NEXT o WEND, sino que debe abrirse y cerrarse dentro de la misma parte. Por ejemplo, produce error IF a=0 THEN WHILE a>10, ya que dentro de la parte verdadera de IF sólo se abre el bucle sin cerrarse, aunque se cierre en otra línea posterior.
  • En las sentencias ON .. GOSUB y ON .. GOTO no se verifica que el valor selector sea mayor que el número de líneas de programa especificadas; sólo se comprueba que si es cero no se hace el salto a ninguna línea.
  • Las sentencias ENT y ENV no aceptan parámetros con la sintaxis = para especificar el control de la envolvente por hardware.
  • La sintaxis para declarar una tabla y para especificar un elemento no admite el uso de corchetes que sí lo admite Locomotive Basic, únicamente paréntesis.
  • El operador @ aplicado sobre una variable de cadena o elemento de tabla de cadena devuelve la dirección de su descriptor, tal como en Locomotive Basic, pero este descriptor es temporal, por lo que no es conveniente almacenar esa dirección para usos posteriores, sino sólo utilizarla en el comando actual.
  • Cuando se utiliza el operador @ para una variable numérica o de cadena no es necesario declararla previamente.

Librería para uso de valores reales

Para solucionar la imposibilidad de utilizar valores de tipo real en CPC Basic se da la posibilidad de instalar un conjunto de comandos RSX que permiten su uso. En el parte superior de la ventana de la aplicación se puede indicar el número de valores reales que va a utilizar la aplicación. Si se indica cero no se instalan los comandos; si se indica otro valor n se instalan éstos, reservando espacio en memoria para una tabla de n variables reales, identificadas con índices de 0 a n - 1, que se deben tratar mediante los comandos RSX. Los comandos que operan con la tabla de variables reales son:

  • |ABS,i1,i2: equivale a la operación tabla(i1)=ABS(tabla(i2)).
  • |ADD,i1,i2,i3: equivale a la operación tabla(i1)=tabla(i2)+tabla(i3).
  • |ATN,i1,i2: equivale a la operación tabla(i1)=ATN(tabla(i2)).
  • |CINT,@variable,i: equivale a la operación variable=CINT(tabla(i)), almacenando el valor de índice i en la variable especificada, ignorando el signo. Útil para pasar el valor de un elemento de la tabla de valores reales a una variable del programa CPC Basic.
  • |CMP,@variable,i1,i2: almacena en variable un valor 1 si tabla(i1)>tabla(i2), un valor 0 si tabla(i1)=tabla(i2), o un valor 255, interpetable como -1, si tabla(i1)<tabla(i2).
  • |COS,i1,i2: equivale a la operación tabla(i1)=COS(tabla(i2)).
  • |CREAL,i,expresión: equivale a la operación tabla(i)=expresión. Útil para pasar un valor del programa CPC Basic a un elemento de la tabla de valores reales.
  • |DEG: equivale al comando DEG.
  • |DIV,i1,i2,i3: equivale a la operación tabla(i1)=tabla(i2)/tabla(i3).
  • |EXP,i1,i2: equivale a la operación tabla(i1)=EXP(tabla(i2)).
  • |FIX,i1,i2: equivale a la operación tabla(i1)=FIX(tabla(i2)).
  • |INT,i1,i2: equivale a la operación tabla(i1)=INT(tabla(i2)).
  • |LET,i1,i2: equivale a la operación tabla(i1)=tabla(i2).
  • |LOG,i1,i2: equivale a la operación tabla(i1)=LOG(tabla(i2)).
  • |LOG10,i1,i2: equivale a la operación tabla(i1)=LOG10(tabla(i2)).
  • |MUL,i1,i2,i3: equivale a la operación tabla(i1)=tabla(i2)*tabla(i3).
  • |PI,i: equivale a la operación tabla(i)=PI.
  • |POW,i1,i2,i3: equivale a la operación tabla(i1)=tabla(i2)^tabla(i3).
  • |RAD: equivale al comando RAD.
  • |REV,i1,i2: equivale a la operación tabla(i1)=-tabla(i2).
  • |ROUND,i1,i2,expresión: equivale a la operación tabla(i1)=ROUND(tabla(i2),expresión).
  • |SGN,@variable,i: equivale a la operación variable=SGN(tabla(i)).
  • |SIN,i1,i2: equivale a la operación tabla(i1)=SIN(tabla(i2)).
  • |SQR,i1,i2: equivale a la operación tabla(i1)=SQR(tabla(i2)).
  • |STR,@variable,i: equivale a la operación variable=STR$(tabla(i)), donde variable es de tipo cadena y con una longitud mínima de de 11 caracteres.
  • |SUB,i1,i2,i3: equivale a la operación tabla(i1)=tabla(i2)-tabla(i3).
  • |TAN,i1,i2: equivale a la operación tabla(i1)=TAN(tabla(i2)).
  • |VAL,i,@variable: equivale a la operación tabla(i)=VAL(variable), donde variable es de tipo cadena o tambien puede ser una constante de cadena sin el operador @.

Para especificar los parámetros que correspondan a índices de los elementos de la tabla de valores reales se pueden indicar valores constantes, variables o expresiones que produzcan un valor numérico en el rango 0 a n – 1. Si los elementos se van a utilizar como variables independientes y no como una tabla de valores, se aconseja dar valor a algunas variables con un nombre descriptivo y usar esa variable para mejorar la legibilidad del código. Por ejemplo, si en el valor de índice 0 va a almacenarse el resultado velocidad de calcular el cociente entre otros valores de índice 1 para la distancia y de índice 2 para el tiempo, se podría hacer velocidad=0:distancia=1:tiempo=2:|DIV,velocidad,distancia,tiempo.

Requisitos e instalación de CPC Basic

Es necesario disponer de un ordenador con:

Para instalar CPC Basic descargar y descomprimir el fichero CPC Basic.

En Windows Vista y Windows 7, si la instalación se ha hecho en un directorio considerado de sistema, como Archivos de programa o Windows, es necesario ejecutar CPC Basic con permisos de administrador. Se aconseja modificar las propiedades del acceso directo a CPC Basic para dejarlo así establecido.

Para reinstalar una nueva versión de CPC Basic no es necesario realizar la desinstalación de la versión que esté en el sistema, se reescribirá sobre la versión anterior.

Si se quiere desinstalar CPC Basic basta eliminar el directorio de instalación.

Descripción de los archivos y carpetas de la aplicación

Tras la instalación de CPC Basic, dentro del directorio que se haya seleccionado para ello, se encuentran los siguientes elementos:

  • Archivo cpcbasic.exe: el archivo principal de la aplicación.
  • Archivos web.url y forum.url: acceso directos a la página web y al forum respectivamente dedicados a CPC Basic.
  • Directorio Files: en ella se encuentra el fichero de configuración, los ficheros de fuentes para la aplicación y los ficheros imagen de memoria base para cada modelo de Amstrad CPC.
  • Directorio Output: en él se generan los archivos resultantes de la compilación según el tipo de salida seleccionado, que pueden ser de tipo binario, ensamblador, ccz80, CDT, DSK, snap. También se almacena en esta carpeta el fichero de traza de extensión LOG que pueda crearse si durante en la utilización de las diferentes utilidades que usa CPC Basic (compilador ccz80, generador de ficheros de imagen de cinta, de disco, de memoria o ejecución del emulador) se produce algún error.
  • Directorio Programs: es la ubicación por defecto para los programas que se graban con SAVE y se cargan con LOAD o MERGE desde CPC Basic. Inicialmente en este directorio se encuentran varios programas de ejemplo que se pueden cargar en CPC Basic.
  • Directorio Utils: contiene una serie de subdirectorios con las distintas utilidades que usa CPC Basic para generar el resultado solicitado: compilador ccz80, generador de archivos CDT, DSK y snap y emulador.

Se recomienda no cambiar nada en esta estructura, excepto acceder al directorio Output para obtener los ficheros resultantes de la compilación y modificar el contenido del fichero de configuración si es necesario.

Fichero de configuración

Dentro del directorio donde se instala CPC Basic, en el subdirectorio Files se encuentra el fichero cpcbasic.ini que se puede modificar para personalizar la apariencia de la aplicación. Se puede establecer el color de cada elemento cuando se visualicen en la ventana de salida y el tamaño de la fuente para las ventanas de salida y entrada. Para ello hay que modificar los valores numéricos que se asignan a cada variable del fichero. Los valores referentes a colores son los de la paleta de colores de Amstrad CPC, en el rango 0 a 26. Por ejemplo, para usar CPC Basic con color de fondo rojo y color de texto blanco en la ventana de entrada se modificarian las variables PaperInput y PenInput con los valores 3 y 13 respectivamente.

Para que tenga efecto la modificación en este fichero es necesario grabarlo en disco y reiniciar la aplicación CPC Basic.

Línea de comandos

Se puede utilizar CPC Basic desde la línea de comandos ejecutando el archivo cpcbasic.exe que se encuentra en el directorio donde se instaló la aplicación. La sintaxis para este modo de uso es:

cpcbasic [/cpc:464|664|6128] [/out:bin|asm|ccz80|cdt|dsk|snap|run] [/real:number]

donde:

  • /cpc especifica el modelo de Amstrad CPC para el que se quiere generar el resultado.
  • /out especifica el tipo de resultado que se va a generar: fichero binario (bin), código ensamblador (asm), código ccz80 (ccz80), fichero CDT (cdt), fichero DSK (dsk), fichero snap (snap) o ejecución del programa en el emulador (run).
  • /real especifica el número de valores reales que va a utilizar el programa.

El fichero resultante de la compilación en modo línea no se genera en el directorio Output, sino en el mismo directorio que se encuentre el fichero fuente Basic, incluso el fichero de traza LOG. La salida de mensajes de error de la compilación se realiza por la consola. En caso de que la compilación falle en cualquier de sus fases CPC Basic devuelve código de salida 1, en caso de ser todo correcto devuelve código de salida 0.

Para la compilación en línea es necesario que exista toda la estructura de directorios de la aplicación, no es suficiente con el fichero cpcbasic.exe.

Enlaces relacionados

Página web dedicada a CPC Basic.

Foro dedicado a CPC Basic, para resolver dudas de programación, comunicar errores encontrados en la aplicación, sugerencias de mejoras, propuestas de ayuda, etc.

Notas técnicas

CPC Basic está escrito en lenguaje C#.

Está creado completamente desde cero, sin tener nada en común con las anteriores versiones de CPC Basic, que quedó más como resultado de una investigación sobre compiladores que como producto útil en la práctica de programación.

Su funcionamiento interno se basa en convertir el fichero fuente Basic en código ccz80, que se compila y se convierte en código binario.

Para la compilación se utiliza ccz80 con las librerías estándar y propia del modelo Amstrad CPC que se haya especificado más una librería de funciones adicionales para emular algunos de los comandos y funciones de Locomotive Basic.

Posteriormente, según se haya solicitado, el código binario se incrusta en un archivo imagen de cinta, de disco o de memoria. Si se ha indicado la ejecución en emulador se lanza éste cargando automáticamente una imagen de memoria que contiene el código binario.

El código máquina se genera para cargarse en la dirección de memoria &H4000, ocupando memoria continua según la longitud del código. Con la función HIMEM se puede saber cual es la última dirección de memoria ocupada por el programa, a partir de la cual se pueden considerar memoria libre. Además, el código máquina generado utiliza la memoria desde &H170 hasta &H3FFF como memoria dinámica para realizar las operaciones internas, por lo que este espacio no se puede utilizar.

En un principio CPC Basic admitía números enteros y reales al igual que Locomotive Basic, pero durante su desarrollo se vio que la velocidad de evaluación de las expresiones no mejoraba apenas la de versiones anteriores de CPC Basic o de Locomotive Basic, pues casi todas las expresiones utilizaban algún valor real, bien como variable o bien por uso de una función intrínseca, y ello implicaba que todos los valores de la expresión se debían convertir a real para operar correctamente. Por ello se decidió prescindir de este tipo de variables, ya que también se comprobó que una mayoría de programas Basic, que son aplicaciones de juegos, no necesitaban usarlas, ya que los datos que utilizan son coordenadas, puntuaciones, identificadores de elementos, etc., que son siempre valores enteros y positivos. En todo caso, se ideó la utilización de los comandos RSX que gestionan valores reales para poder utilizar este tipo de datos en las ocasiones puntales que fuese necesario.

Agradecimientos

  • Wesley Clarke por su fuente de Amstrad CPC, en la que están basadas las utilizadas por CPC Basic.
  • Julián Albo por el ensamblador pasmo con el que se generan los ficheros CDT.
  • Ludovic Deplanque (Demoniak) por la utilidad ManageDSK con el que se generan los ficheros DSK.
  • César Nicolás Gonzalez (CNGSoft) por el emulador CPCE para ejecutar el código máquina generado.

Historial

  • 11 marzo 2012: Publicación de CPC Basic versión 3.0.0.
  • 11 marzo 2012: Publicación de CPC Basic versión 3.0.1. Corrección de la declaración de tablas en el código ccz80.
  • 14 marzo 2012: Publicación de CPC Basic versión 3.0.2. Mostrar el número de versión en título de ventana.
  • 17 marzo 2012: Publicación de CPC Basic versión 3.0.3. Corrección para evitar bloqueo cuando el resultado de la compilación del fichero ccz80 produce demasiado texto. Añadidos botones para acceder los directorios de programas y de salida.
  • 19 marzo 2012: Publicación de CPC Basic versión 3.0.4. Corrección en el formato del resultado de la orden CAT.
  • 17 mayo 2014: Actualización de ccz80.