Commodore BASIC , también conocido como PET BASIC o CBM-BASIC , es el dialecto del lenguaje de programación BASIC utilizado en la línea de ordenadores domésticos de 8 bits de Commodore International , que abarca desde el PET (1977) hasta el Commodore 128 (1985).
El núcleo se basa en Microsoft BASIC 6502 y, como tal, comparte muchas características con otros BASIC 6502 de la época, como Applesoft BASIC . Commodore obtuvo la licencia de BASIC de Microsoft en 1977 bajo la modalidad de "pago único, sin regalías " después de que Jack Tramiel rechazara la oferta de Bill Gates de una tarifa de 3 dólares por unidad, declarando: "Ya estoy casado", y que no pagaría más de 25 000 dólares por una licencia perpetua. [ 1 ]
La versión original de PET era muy similar a la implementación original de Microsoft, con pocas modificaciones. BASIC 2.0 en la C64 también era similar, y también se vio en las C128 (en modo C64) y otros modelos. Las versiones posteriores de PET incluían BASIC 4.0, similar a la original pero con la adición de varios comandos para trabajar con disquetes .
BASIC 3.5 fue la primera en diferenciarse realmente, añadiendo varios comandos para soporte de gráficos y sonido, así como un mini- ensamblador integrado en el monitor de lenguaje máquina de la C16 y la Plus/4 . BASIC 7.0 se incluyó con la Commodore 128 e incluía comandos de programación estructurada de BASIC 3.5 de la Plus/4, así como un editor de sprites y palabras clave diseñadas específicamente para aprovechar las nuevas capacidades de la máquina. La última, BASIC 10.0, formó parte de la Commodore 65 , que nunca llegó a publicarse .
Historia
Commodore tomó el código fuente del BASIC de tarifa plana y lo desarrolló internamente para todos sus demás ordenadores domésticos de 8 bits. No fue hasta el Commodore 128 (con la versión 7.0) que se mostró un aviso de derechos de autor de Microsoft. Sin embargo, Microsoft había incorporado un huevo de Pascua en su software para demostrar su procedencia: el comando WAIT 6502,1en un PET con la versión 2 o "actualización" de BASIC aparecerá MICROSOFT!en la parte superior de la pantalla. (El huevo de Pascua estaba bien ofuscado; el mensaje no apareció en ningún desensamblaje del intérprete). [ 2 ]
El popular Commodore 64 venía con BASIC v2.0 en la ROM, a pesar de que se lanzó después de la serie PET/CBM, que incluía la versión 4.0. Esto se debía a que el 64 estaba diseñado para uso doméstico, mientras que la serie PET/CBM estaba dirigida a empresas y centros educativos, donde se presumía que su lenguaje de programación integrado tendría un uso más intensivo. Esto permitió ahorrar en costes de fabricación, ya que la versión 2 cabía en ROMs más pequeñas.
Detalles técnicos
Edición de programas
Una característica práctica del intérprete BASIC residente en ROM y del KERNAL de Commodore era el editor de pantalla completa . [ 3 ] [ 4 ] Aunque los teclados de Commodore solo tenían dos teclas de cursor que invertían su dirección al mantener presionada la tecla Mayús, el editor de pantalla permitía a los usuarios introducir comandos directos o introducir y editar líneas de programa desde cualquier lugar de la pantalla. Si una línea tenía como prefijo un número de línea, se tokenizaba y se almacenaba en la memoria del programa. Las líneas que no comenzaban con un número se ejecutaban presionando la tecla cuando el cursor se encontraba sobre la línea. Esto representó una mejora significativa en las interfaces de entrada de programas en comparación con otros BASIC comunes para ordenadores domésticos de la época, que normalmente utilizaban editores de línea , invocados por un comando separado , o un "cursor de copia" que truncaba la línea en la posición del cursor.RETURNEDIT
También tenía la capacidad de guardar archivos con nombre en cualquier dispositivo, incluyendo el casete , un dispositivo de almacenamiento popular en la época del PET, y que se mantuvo en uso durante toda la vida útil de los Commodores de 8 bits como una forma económica de almacenamiento masivo. La mayoría de los sistemas solo admitían nombres de archivo en disquetes , lo que dificultaba guardar varios archivos en otros dispositivos. El usuario de uno de estos otros sistemas tenía que anotar la ubicación del archivo en el contador de la grabadora, pero esto era impreciso y propenso a errores. Con el PET (y BASIC 2.0), se podían solicitar archivos de casetes por nombre. El dispositivo buscaba el nombre del archivo leyendo los datos secuencialmente, ignorando cualquier nombre de archivo que no coincidiera. El sistema de archivos también contaba con una potente estructura de registro que podía cargarse o guardarse en archivos. Los datos de los casetes de Commodore se grababan digitalmente, en lugar de los métodos analógicos menos costosos (y menos fiables) utilizados por otros fabricantes. Por lo tanto, se requería el Datasette especializado en lugar de una grabadora de cinta estándar. Existían adaptadores que utilizaban un convertidor analógico-digital para permitir el uso de una grabadora estándar, pero estos costaban solo un poco menos que la Datasette.
El comando LOAD puede usarse con el parámetro opcional ,1, que cargará un programa en la dirección de memoria contenida en los dos primeros bytes del archivo (estos bytes se descartan y no se conservan en la memoria). Si no se usa el parámetro ,1 , el programa se cargará al inicio del área de programa BASIC, que varía considerablemente entre máquinas. Algunas variantes de Commodore BASIC incluían comandos que funcionaban como sus equivalentes en Applesoft BASIC , cargando o guardando mapas de bits desde ubicaciones de memoria específicas.BLOADBSAVE
El PET no admite programas reubicables y el comando LOAD siempre cargará en los dos primeros bytes del archivo del programa. Esto generaba un problema al intentar cargar programas BASIC guardados en otras máquinas Commodore, ya que se cargaban en una dirección superior a la que el BASIC del PET esperaba. Existían soluciones alternativas para "mover" los programas a la ubicación correcta. Si un programa se guardaba en una máquina CBM-II , la única forma de cargarlo en un PET era modificando los dos primeros bytes con un editor de sectores de disco, ya que la serie CBM-II tenía su área de programa BASIC en $0, lo que provocaba que el PET intentara cargar en la página cero y se bloqueara.
Las palabras clave de Commodore BASIC podían abreviarse pulsando primero una tecla sin Mayús y, a continuación, la siguiente letra con Mayús. Esto activaba el bit más significativo , lo que hacía que el intérprete dejara de leer y analizara la instrucción según una tabla de búsqueda. Esto significaba que la instrucción hasta el punto en que se activaba el bit más significativo se aceptaba como sustituto de escribir el comando completo. Sin embargo, dado que todas las palabras clave de BASIC se almacenaban en memoria como tokens de un solo byte, esto era más una comodidad para la introducción de instrucciones que una optimización.
En el conjunto de caracteres predeterminado de solo mayúsculas, los caracteres desplazados aparecen como un símbolo gráfico; por ejemplo, el comando, GOTO, podía abreviarse G{Shift-O}(que se parecía en pantalla). La mayoría de estos comandos tenían dos letras, pero en algunos casos eran más largos. En casos como este, había una ambigüedad, por lo que se necesitaban más letras sin desplazar del comando, como ( ) que se requería para . Algunos comandos no tenían forma abreviada, ya sea por brevedad o por ambigüedad con otros comandos. Por ejemplo, el comando, no tenía abreviatura porque su ortografía chocaba con la palabra clave separada, que estaba ubicada más cerca del principio de la tabla de búsqueda de palabras clave . El comando muy utilizado tenía un único acceso directo, como era común en la mayoría de los dialectos de Microsoft BASIC. La abreviación de comandos con letras desplazadas es exclusiva de Commodore BASIC.GΓGO{Shift-S}GO♥GOSUBINPUTINPUT#PRINT?
Este método de tokenización tenía un fallo: si se incluía una REMinstrucción BASIC (para añadir un comentario al código) seguida de un punto y coma {Shift-L}al intentar ver el listado del programa, el intérprete BASIC abortaba inmediatamente el listado, mostraba un error ?SYNTAX ERRORy volvía al READY.indicador de comandos. Este fallo fue utilizado con cierto éxito por programadores que querían proteger su trabajo, aunque era bastante fácil de sortear.
Al abreviar las palabras clave, era posible incluir más código en una sola línea de programa (que podía ocupar dos líneas de pantalla en pantallas de 40 columnas, como la C64 o la PET, o cuatro líneas en la pantalla de 22 columnas del VIC-20). Esto permitía un ligero ahorro en la sobrecarga de almacenar líneas de programa adicionales que de otro modo serían necesarias, pero nada más. Todos los comandos BASIC se tokenizaban y ocupaban 1 byte (o dos, en el caso de varios comandos de BASIC 7 o BASIC 10) en la memoria, independientemente de cómo se introdujeran. Estas líneas tan largas resultaban engorrosas para editar. El LISTcomando mostraba la palabra clave completa del comando, extendiendo la línea de programa más allá de las 2 o 4 líneas de pantalla que se podían introducir en la memoria del programa.
Actuación
Al igual que el intérprete original de Microsoft BASIC , Commodore BASIC es más lento que el código máquina nativo , debido a la sobrecarga de interpretación en tiempo de ejecución. Los resultados de las pruebas han demostrado que copiar 16 kilobytes de ROM a RAM lleva menos de un segundo en código máquina, en comparación con más de un minuto en BASIC. Para ejecutar más rápido que el intérprete, los programadores comenzaron a usar varias técnicas para acelerar la ejecución. Una era almacenar valores de punto flotante de uso frecuente en variables en lugar de usar valores literales, ya que interpretar un nombre de variable era más rápido que interpretar un número literal. Dado que el punto flotante es el tipo predeterminado para todos los comandos, es más rápido usar números de punto flotante como argumentos, en lugar de enteros. Cuando la velocidad era importante, algunos programadores convertían secciones de programas BASIC a lenguaje ensamblador 6502 o 6510 que se cargaba por separado desde un archivo o se insertaba en la memoria mediante instrucciones DATA al final del programa BASIC, y se ejecutaba desde BASIC usando el comando SYS , ya sea desde el modo directo o desde el propio programa . Cuando la velocidad de ejecución del lenguaje máquina era demasiado alta, como en un juego o al esperar la entrada del usuario, los programadores podían consultar ubicaciones de memoria seleccionadas (como $C6 [ 5 ] para el 64, o $D0 [ 6 ] para el 128, que indican el tamaño de la cola del teclado) para retrasar o detener la ejecución.
Una característica única de Commodore BASIC es el uso de códigos de control para realizar tareas como borrar la pantalla o posicionar el cursor dentro de un programa; estos se pueden invocar emitiendo un comando donde X corresponde al código de control que se va a emitir (por ejemplo, es el código de control para borrar la pantalla) o presionando la tecla en cuestión entre comillas, así, presionar + después de una comilla hará que BASIC muestre la representación visual del código de control (en este caso, un corazón invertido) que luego se ejecuta durante la ejecución del programa (imprimir directamente los códigos de control usa menos memoria y se ejecuta más rápido que invocar una función CHR$ ). Esto es en comparación con otras implementaciones de BASIC que normalmente tienen comandos dedicados para borrar la pantalla o mover el cursor.PRINTCHR$(X)PRINTCHR$(147)⇧ ShiftCLR HOME
BASIC 3.5 y versiones posteriores incluyen comandos adecuados para borrar la pantalla y mover el cursor.
Las líneas de programa en Commodore BASIC no requieren espacios en ningún lugar (pero el comando LIST siempre mostrará uno entre el número de línea y la instrucción), por ejemplo, , y era común escribir programas sin espacios. Esta característica se agregó para ahorrar memoria ya que el tokenizador nunca elimina ningún espacio insertado entre palabras clave: la presencia de espacios resulta en 0x20 bytes adicionales en el programa tokenizado que simplemente se omiten durante la ejecución. Los espacios entre el número de línea y la instrucción del programa son eliminados por el tokenizador.100IFA=5THENPRINT"YES":GOTO160
Las líneas de programa pueden tener un total de 80 caracteres en la mayoría de las máquinas, pero las máquinas con texto de 40 columnas harían que la línea se desbordara a la siguiente línea en la pantalla, y en el VIC-20, que tenía una pantalla de 22 columnas, las líneas de programa podían ocupar hasta cuatro. BASIC 7.0 en el Commodore 128 aumentó el límite de una línea de programa a 160 caracteres (cuatro líneas de 40 columnas o dos líneas de 80 columnas). Al usar abreviaturas como ?en lugar de PRINT, es posible que quepa aún más en una línea. BASIC 7.0 muestra un¿CUERDA DEMASIADO LARGA?Se produce un error si el usuario introduce una línea de programa de más de 160 caracteres. Las versiones anteriores no generaban ningún error y simplemente mostraban el mensaje READY dos líneas más abajo si se superaba la longitud de la línea. El número de línea se incluye en el número de caracteres de la línea de programa, por lo que un número de línea de cinco dígitos resultará en cuatro caracteres menos permitidos que un número de un dígito.
El orden de ejecución de las líneas de Commodore BASIC no se determinaba por la numeración de las líneas, sino que seguía el orden en que se enlazaban en la memoria. [ 7 ] Las líneas de programa se almacenaban en la memoria como una lista enlazada simple con un puntero (que contenía la dirección del inicio de la siguiente línea de programa), un número de línea y, a continuación, el código tokenizado de la línea. Mientras se introducía un programa, BASIC reordenaba constantemente las líneas de programa en la memoria para que los números de línea y los punteros estuvieran en orden ascendente. Sin embargo, una vez introducido un programa, la modificación manual de los números de línea y los punteros con los comandos POKE podía permitir la ejecución fuera de orden o incluso asignar el mismo número a todas las líneas. En sus inicios, cuando BASIC se utilizaba comercialmente, esta era una técnica de protección de software para desalentar la modificación casual del programa.
Los números de línea pueden variar de 0 a 65520 y ocupan cinco bytes, independientemente de la cantidad de dígitos que contengan. Sin embargo, la ejecución es más rápida cuanto menor sea el número de dígitos. Colocar varias instrucciones en una misma línea consume menos memoria y se ejecuta con mayor rapidez.
Las instrucciones GOTO y GOSUB buscarán un número de línea hacia abajo desde la línea actual si se realiza un salto hacia adelante; en caso de un salto hacia atrás, volverán al inicio del programa para comenzar la búsqueda. Esto ralentizará los programas grandes, por lo que es preferible colocar las subrutinas de uso frecuente cerca del inicio del programa.
Los nombres de las variables solo tienen dos caracteres de significado; por lo tanto, los nombres de las variables VARIABLE1 , VARIABLE2 y VA se refieren a la misma variable.
Commodore BASIC también admite los operadores bit a bit (de dos bytes, con signo, en complemento a dos ) : NOT , AND y OR . Aunque esta característica formaba parte del código base de Microsoft 6502 BASIC, generalmente se omitía en otras implementaciones como Applesoft BASIC .
El formato numérico nativo de Commodore BASIC, al igual que el de su predecesor MS BASIC , era de punto flotante . La mayoría de las implementaciones contemporáneas de BASIC utilizaban un byte para la característica ( exponente ) y tres bytes para la mantisa . La precisión de un número de punto flotante con una mantisa de tres bytes es de aproximadamente 6,5 dígitos decimales, y el error de redondeo es común. Las implementaciones de Microsoft BASIC para el procesador 6502 utilizaban aritmética de punto flotante de 40 bits, lo que significa que las variables ocupaban cinco bytes (cuatro bytes para la mantisa y uno para el exponente), a diferencia del punto flotante de 32 bits presente en BASIC-80.
Mientras que las implementaciones de Microsoft BASIC para los procesadores 8080/Z80 admitían variables enteras y de doble precisión, las implementaciones para el procesador 6502 solo admitían variables de coma flotante.
Aunque Commodore BASIC admite variables enteras con signo (indicadas con un signo de porcentaje) en el rango de -32768 a 32767, en la práctica solo se utilizan para variables de matriz y sirven para ahorrar memoria limitando los elementos de la matriz a dos bytes cada uno (una matriz de 2000 elementos ocupará 10 000 bytes si se declara como una matriz de punto flotante, pero solo 4000 si se declara como una matriz de enteros). Denominar cualquier variable como entera simplemente hace que BASIC la convierta de nuevo a punto flotante, lo que ralentiza la ejecución del programa y desperdicia memoria, ya que cada signo de porcentaje ocupa un byte adicional (dado que esto también se aplica a las matrices de enteros, el programador debería evitar usarlas a menos que se utilicen matrices muy grandes que excederían la memoria disponible si se almacenaran como punto flotante). Además, no es posible realizar operaciones POKE o PEEK en ubicaciones de memoria superiores a 32767 con una dirección definida como una variable entera con signo.
Se puede usar un punto (.) en lugar del número 0 (por lo tanto, en lugar de o en lugar de ), esto hará que la ejecución sea un poco más rápida.10A=.10A=010FORA=.TO10010FORA=0to100
La instrucción SYS , utilizada para iniciar programas en lenguaje máquina, fue añadida por Commodore y no figuraba en el código original de Microsoft BASIC, que solo incluía la función USR para invocar rutinas en lenguaje máquina. Esta instrucción carga automáticamente los registros de la CPU con los valores de $30C-$30F (C64; varía en otras máquinas). Esto puede utilizarse para pasar datos a rutinas en lenguaje máquina o como medio para llamar a funciones del núcleo desde BASIC (por ejemplo, para borrar la pantalla).POKE780,147:SYS65490
Dado que las máquinas Commodore de 8 bits distintas de la C128 no pueden arrancar automáticamente el software del disco, la técnica habitual consiste en incluir un fragmento de BASIC como para iniciar la ejecución del programa. Es posible iniciar automáticamente el software después de la carga y no requerir que el usuario escriba una instrucción RUN ; esto se consigue mediante un fragmento de código que intercepta el vector "ready" de BASIC en .10SYS2048$0302
Al igual que en la mayoría de las versiones de Microsoft BASIC , si una matriz no se declara con una instrucción DIM , se establece automáticamente en diez elementos (en la práctica, once, ya que los elementos de la matriz se cuentan desde cero). Las matrices más grandes deben declararse; de lo contrario, BASIC mostrará un error al ejecutar el programa. Además, no se puede redimensionar una matriz en un programa a menos que se borren todas las variables mediante una instrucción CLR. Las matrices numéricas se rellenan automáticamente con ceros al crearse; puede haber una breve demora en la ejecución del programa si se dimensiona una matriz grande.
Las variables de cadena se representan añadiendo un signo de dólar al nombre de la variable. Así, las variables AA$ , AA y AA% se entenderían como distintas. Las variables de matriz también se consideran distintas de las variables simples; por lo tanto, A y A(1) no se refieren a la misma variable. El tamaño de una matriz de cadenas solo indica cuántas cadenas se almacenan en ella, no el tamaño de cada elemento, que se asigna dinámicamente. A diferencia de otras implementaciones de Microsoft BASIC, Commodore BASIC no requiere que se reserve espacio para cadenas al inicio de un programa.
A diferencia de otras máquinas de 8 bits como la Apple II, las máquinas Commodore tienen un reloj integrado que se inicializa a 0 al encenderse y se actualiza con cada ciclo del temporizador PIA/VIA/TED/CIA, es decir, 60 veces por segundo. Se le asignan dos variables de sistema en BASIC, TI y TI$ , que contienen la hora actual. TI es de solo lectura y no se puede modificar; si se modifica, se producirá un error de sintaxis. TI$ se puede usar para establecer la hora mediante una cadena de seis números (se produce un error si se usa una cadena distinta a seis números). El reloj no es un método muy fiable para medir el tiempo, ya que se detiene cuando se desactivan las interrupciones (lo cual hacen algunas rutinas del kernel) y el acceso al puerto IEC (o IEEE en el PET) ralentizará la actualización del reloj unos pocos ciclos.
La función RND en Commodore BASIC puede usar el reloj para generar números aleatorios; esto se logra mediante , sin embargo, su utilidad es relativamente limitada ya que solo devuelve números entre 0 y 255. Por lo demás, RND funciona igual que otras implementaciones de Microsoft BASIC en que se usa una secuencia pseudoaleatoria a través de un valor semilla fijo de 5 bytes almacenado al encender en las ubicaciones de memoria $8B-$8F en C64 (la ubicación difiere en otras máquinas). RND con cualquier número mayor que 0 generará un número aleatorio amalgamado del valor incluido con la función RND y el valor semilla, que se actualiza en 1 cada vez que se ejecuta una función RND. RND con un número negativo va a un punto en la secuencia del valor semilla actual especificado por el número.RND(0)
Dado que la generación de números verdaderamente aleatorios es imposible con la instrucción RND , en los ordenadores C64 y C128 es más habitual utilizar el canal de ruido blanco del chip SID para generar números aleatorios.
BASIC 2.0 sufría de una lentitud extrema en la recolección de basura de cadenas. Esta se invocaba automáticamente cada vez que se ejecutaba una función FRE , y si había muchas variables de cadena y matrices manipuladas durante el programa, su limpieza podía tardar más de una hora en el peor de los casos. Además, no era posible abortar la recolección de basura, ya que BASIC no detectaba la tecla RUN/STOP mientras realizaba esta tarea. BASIC 4.0 introdujo un sistema de recolección de basura mejorado con punteros hacia atrás, y todas las implementaciones posteriores de Commodore BASIC también lo incorporaron.
La función FRE en BASIC 2.0 adolecía de otro fallo técnico: no podía manejar números con signo mayores de 32768. Por lo tanto, si se invocaba en un C64 (con 38 KB de memoria BASIC), se mostraba una cantidad negativa de memoria libre para BASIC (sumando 65535 al valor mostrado se obtenía la cantidad correcta). El PET y el VIC-20 nunca tuvieron más de 32 KB de memoria total disponible para BASIC, por lo que esta limitación no se hizo evidente hasta el desarrollo del C64. La función FRE en BASIC 3.5 y 7.0 corrigió este problema, y en BASIC 7.0 , FRE se dividió en dos funciones: una para mostrar la memoria libre de texto del programa BASIC y otra para mostrar la memoria libre de variables.
Alternativas

Se lanzaron muchas extensiones de BASIC para la Commodore 64, debido a las capacidades relativamente limitadas de su BASIC 2.0 nativo. Una de las extensiones más populares fue DOS Wedge , que se incluyó en el disco de prueba/demostración de la Commodore 1541. Esta extensión de 1 KB para BASIC añadía varios comandos relacionados con el disco, incluida la capacidad de leer un directorio del disco sin destruir el programa en la memoria. Sus características se incorporaron posteriormente en varias extensiones de terceros, como el popular cartucho Epyx FastLoad . Otras extensiones de BASIC añadieron palabras clave adicionales para facilitar la programación de sprites, sonido y gráficos de alta resolución, como Simons' BASIC (1983) y Vision BASIC (2022).
Aunque la falta de sonido o gráficos en BASIC 2.0 resultaba frustrante para muchos usuarios, algunos críticos argumentaban que, en última instancia, era beneficioso, ya que obligaba al usuario a aprender lenguaje de máquina.
Las limitaciones de BASIC 2.0 en el C64 llevaron al uso del lenguaje máquina ROM integrado de BASIC. Para cargar un archivo en una ubicación de memoria designada, el nombre del archivo, la unidad y el número de dispositivo se leían mediante una llamada: ; [ 8 ] la ubicación se especificaba en los registros X e Y: ; [ 9 ] y se llamaba a la rutina de carga: . [ 10 ]SYS57812"filename",8POKE780,0:POKE781,0:POKE782,192SYS65493
Loadstar , una revista en disquete para el C64 , era un lugar para programadores aficionados, que compartían colecciones de protocomandos para BASIC, llamados con el SYS address + offsetcomando.
Desde un punto de vista de programación moderno, las versiones anteriores de Commodore BASIC presentaban una serie de trampas de programación para el programador. Como la mayoría de estos problemas derivaban de Microsoft BASIC , prácticamente todos los BASIC de ordenadores domésticos de la época sufrían deficiencias similares. [ 11 ] Cada línea de un programa Microsoft BASIC tenía un número de línea asignado por el programador. Era práctica común incrementar los números en algún valor (5, 10 o 100) para facilitar la inserción de líneas durante la edición o depuración del programa, pero una mala planificación significaba que insertar grandes secciones en un programa a menudo requería reestructurar todo el código. Una técnica común era comenzar un programa en un número de línea bajo con una tabla de saltos ON...GOSUB , con el cuerpo del programa estructurado en secciones que comenzaban en un número de línea designado como 1000, 2000, etc. Si era necesario agregar una sección grande, simplemente se le podía asignar el siguiente número de línea principal disponible e insertarla en la tabla de saltos.
Además, todas las variables se tratan como variables globales. Resulta difícil crear bucles claramente definidos más allá de la estructura FOR...NEXT, lo que a menudo obliga al programador a recurrir al comando GOTO (esto se corrigió posteriormente en BASIC 3.5 con la incorporación de los comandos DO, LOOP, WHILE, UNTIL y EXIT ). Con frecuencia era necesario crear variables de bandera para realizar ciertas tareas.
Las versiones posteriores de BASIC para Commodore y otras plataformas incluían los comandos DELETE y RENUMBER , así como un comando de numeración automática de líneas que seleccionaba e insertaba automáticamente números de línea según un incremento predefinido. Las versiones anteriores de BASIC para Commodore también carecían de comandos de depuración, lo que dificultaba la detección de errores y variables no utilizadas. Las estructuras IF...THEN...ELSE , un componente estándar de las versiones Z80 de Microsoft BASIC, se añadieron a BASIC 3.5 tras no estar disponibles en versiones anteriores de Commodore BASIC.
Utilizar como interfaz de usuario
Al igual que otros ordenadores domésticos , las máquinas Commodore arrancaban directamente en el intérprete BASIC. Los comandos de programación y de archivos de BASIC podían introducirse en modo directo para cargar y ejecutar software. Si la ejecución del programa se detenía con la tecla RUN/STOP, los valores de las variables se conservaban en la RAM y podían imprimirse para la depuración. El 128 incluso dedicaba su segundo banco de 64k al almacenamiento de variables, lo que permitía que los valores persistieran hasta que se emitiera un comando. Esto, junto con el editor de pantalla avanzado NEWincluido en Commodore BASIC, proporcionaba al entorno de programación una sensación similar a la de un REPL ; los programadores podían insertar y editar líneas de programa en cualquier ubicación de la pantalla, construyendo el programa de forma interactiva. [ 12 ] Esto contrasta con los sistemas operativos orientados a negocios de la época, como CP/M o MS-DOS , que normalmente arrancaban en una interfaz de línea de comandos . Si se requería un lenguaje de programación en estas plataformas, tenía que cargarse por separado.RUN
DLOADSi bien algunas versiones de Commodore BASIC incluían comandos específicos para disco DSAVE, la versión integrada en el Commodore 64 carecía de ellos, lo que obligaba al usuario a especificar el número de dispositivo de la unidad de disco (normalmente 8 o 9) al LOADcomando estándar, que de lo contrario utilizaba la cinta por defecto. Otra omisión del BASIC 2.0 del Commodore 64 era un DIRECTORYcomando para mostrar el contenido de un disco sin borrar la memoria principal. En el 64, la visualización de archivos en un disco se implementaba cargando un "programa" que, al listarse, mostraba el directorio como un pseudo programa BASIC, con el tamaño del bloque del archivo como número de línea. Esto tenía el efecto de sobrescribir el programa cargado en ese momento. Complementos como DOS Wedge solucionaban esto renderizando la lista de directorios directamente en la memoria de pantalla.
Código de ejemplo
10 rem cbm basic v2 ejemplo 20 rem comentario con palabras clave: for, data 30 dim a$ ( 20 ) 35 rem la forma típica eficiente en espacio de omitir espacios: 40 for t = 0 to 15 : poke 646 , t : print chr$ ( 18 ) " " ;: next : rem 18=revers on 45 rem en la instrucción "if", "then" se puede omitir si se usa goto o on goto 47 rem comprobar chr$(0) no esperará a que se presione una tecla, usando "" en su lugar 50 get a$ : if a$ = "" goto 40 : rem no se permiten ":" antes del goto 55 rem es legal omitir la " de cierre on line end 60 print chr$ ( 23 ): print "bye... 65 rem 23=white 70 rem end no es necesario. el rem es un ficticio para que se ingrese la línea 70 remVersiones y características
Lista de versiones de CBM BASIC en orden cronológico, con las características añadidas sucesivamente:
Versiones publicadas
- V1.0: PET 2001 con teclado tipo chiclet y unidad de datos integrada (PET original)
- matrices limitadas a 256 elementos
- El comando PEEK está explícitamente deshabilitado en las ubicaciones de ROM BASIC superiores a $C000.
- V2.0: PET 2001 con teclado de recorrido completo y ROMs actualizadas
- Agregar compatibilidad con IEEE-488
- mejoró la recolección de basura [ 14 ]
- Corregir error de matriz
- Huevo de Pascua: al introducirlo, aparece MICROSOFT! un número arbitrario de veces.WAIT6502, [number]
- V4.0: Serie PET/CBM 4000/8000 (y versiones posteriores de la serie PET 2001)
- Operaciones de disco : DLOAD,DSAVE,COPY,SCRATCH, etc. (15 en total)
- Variables del canal de error del disco: DS,DS$
- rendimiento de recolección de basura notablemente mejorado [ 14 ]
- V2.1 (dice V2 al arrancar, internamente versionado como 2.1): VIC-20
- V2.2 (muestra V2 al arrancar, versión interna 2.2): C64 , C64GS (1990)
- V4+ : serie CBM-II (también conocida como gama B, P)
- gestión de memoria: BANK
- Más operaciones de disco : BLOAD , BSAVE , DCLEAR
- Impresión formateada: IMPRIMIR USANDO,PUDEF
- Captura de errores: DESPOSE
- Ramificación alternativa: ELSE
- Manejo dinámico de errores: TRAP,RESUME,ERR$()
- Lectura de datos flexible :
RESTORE [line number] - Función de búsqueda de cadena: INSTR
- V3.5: C16/116 , Plus/4
- comandos de sonido y gráficos
- Entrada del joystick : JOY
- Conversión decimal ↔ hexadecimal : DEC(),HEX$()
- Bucle estructurado: DO,LOOP,WHILE,UNTIL,EXIT
- Asignación de teclas de función: TECLA (también en modo directo)
- Entrada/edición de programas: AUTOMÁTICO, ELIMINAR, RENOMBRAR
- depuración (rastreo): TRON , TROFF
- Comando de entrada MLM : MONITOR
- C(1)16, Huevo de Pascua Plus/4 – ingresarSYS 52650
- V7.0: C128
- Más comandos de sonido y gráficos, incluyendo el manejo de sprites.
- Editor de sprites integrado: SPRDEF
- Bloques de múltiples instrucciones para estructuras IF THEN ELSE : BEGIN, BEND
- Entrada de teclado y lápiz óptico : POT,PEN
- función exclusiva : XOR
- obtener la dirección de la variable: PUNTERO
- Ventana de modo texto: VENTANA
- Retardo de tiempo controlado: DORMIR
- Gestión de memoria: SWAP, FETCH, STASH, FRE(1)
- Se utilizó la conmutación bancaria del 128 para almacenar el código del programa por separado de las variables. Los valores de las variables se conservaban entre ejecuciones del programa si este se iniciaba con el comando GOTO.
- Más operaciones de disco : ARRANQUE, VERIFICACIÓN DE DISCO
- Ajuste de velocidad de la CPU: RÁPIDO, LENTO (2 vs 1 MHz)
- Entrar en modo C64: GO64
- no documentado, funcionando: RREG (lee los registros de la CPU después de un SYS )
- Comandos no implementados: OFF,QUIT
- Huevo de Pascua C128 – ingresarSYS 32800,123,45,6
Versiones no publicadas
- V3.6 : LCD de Commodore (prototipo no publicado). Casi idéntico a V7.0, con las siguientes diferencias: [ 15 ]
- VOLUMEN en lugar de VOL
- SALIR en lugar de SALIR
- Comandos RÁPIDO, LENTO no presentes
- Comando adicional: POPUPS
- V10 : Commodore 65 (prototipo no lanzado)
- Comandos de gráficos/vídeo: PALETTE,GENLOCK
- Entrada del ratón : MOUSE,RMOUSE
- Utilidad de archivo de texto ( SECUENCIA ): TIPO
- Edición de programas: BUSCAR, CAMBIAR
- Gestión de memoria: DMA,FRE(2)
- Comandos no implementados: PINTAR, LOCALIZAR, ESCALAR, ANCHO, ESTABLECER, VENTANA GRÁFICA, PEGAR, CORTAR
Paquetes de extensión destacados
- Super Expander (VIC-20; suministrado en cartucho ROM ) (Commodore)
- Super Expander 64 (C64; cartucho) (Commodore)
- BASIC de Simons (C64; cartucho) (Commodore)
- BASIC gráfico (C64; disquete) ( Hesware )
- BASIC 8 (C128; disquete y chip ROM interno opcional) ( Walrusoft )
- Vision BASIC (C64; disquete) (Dennis Osborn)
- JiffyDOS (Diseños Micro Creativos)
Referencias
- ↑ Declarado por Jack_Tramiel en la celebración del 25.º aniversario de la Commodore 64 en el Computer_History_Museum el 10 de diciembre de 2007.Archivado el 11 de diciembre de 2008 en Wayback Machine.Archivado el 3 de octubre de 2017 en Wayback Machine ..
- ↑ "Los secretos personales de Bill Gates en BASIC de 8 bits - pagetable.com" . www.pagetable.com . Consultado el 8 de agosto de 2018 .
- ↑ "El uso del teclado y el editor de pantalla" . Julio de 1985.
- ↑ "Byte julio de 1983" (PDF) . Archivado del original (PDF) el 24 de agosto de 2017. Consultado el 1 de mayo de 2015 .
- ↑ Leemon, Sheldon (1987). Mapping the Commodore 64 & 64C . COMPUTE! Publications. pág. 37. ISBN 9780874550825. Consultado el 25 de marzo de 2018 .
- ↑ Cowper, Ottis R. (1986). Mapping the Commodore 128. COMPUTE! Publications. pág. 66. ISBN 9780874550603.
- ↑ "Mapeando el C64" . www.unusedino.de . Consultado el 21 de agosto de 2023 .
- ↑ Leemon, Sheldon (1987). Mapping the Commodore 64 & 64C . COMPUTE! Publications. pág. 209. ISBN 9780874550825. Consultado el 25 de marzo de 2018 .
- ↑ Leemon, Sheldon (1987). Mapping the Commodore 64 & 64C . COMPUTE! Publications. p. 71. ISBN 9780874550825. Consultado el 25 de marzo de 2018 .
- ↑ Leemon, Sheldon (1987). Mapping the Commodore 64 & 64C . COMPUTE! Publications. pág. 231. ISBN 9780874550825. Consultado el 25 de marzo de 2018 .
- ↑ "Compute!'s First Book of Atari" . www.atariaarchives.org . Consultado el 21 de agosto de 2023 .
- ↑ Scrimshaw, NB (11 de noviembre de 2013). Introducción al Commodore 64: Aventuras en la programación . Birkhäuser. ISBN 9781489967879.
- ↑ pygments/tests/examplefiles/cbmbas/cbmbas_example.bas en GitHub
- 1 2 "Mapa de memoria de BASIC 4.0" . zimmers.net . Consultado el 21 de agosto de 2023 .
- ↑ "Mike Naberezny – Firmware LCD de Commodore" . mikenaberezny.com . Consultado el 8 de agosto de 2018 .
Fuentes
- Cronología de la versión básica de Commodore/Microsoft
- Los secretos personales de Bill Gates en BASIC de 8 bits , pagetable.com
- BÁSICO 2.0
- Angerhausen et al. (1983). Anatomía del Commodore 64 (para la referencia completa, véase el artículo sobre el C64 ).
- BÁSICO 3.5
- Gerrard, Peter; Bergin, Kevin (1985). Desmontaje completo de la ROM del COMMODORE 16. Gerald Duckworth & Co. Ltd. ISBN 0-7156-2004-5.
- BÁSICO 7.0
- Jarvis, Dennis; Springer, Jim D. (1987). BASIC 7.0 Internals . Grand Rapids, Michigan: Abacus Software, Inc. ISBN 0-916439-71-2.
- BÁSICO 10.0
- c65manual.txt Documentación preliminar de Commodore 65 (marzo de 1991), con apéndice para la versión ROM 910501.
- Software Commodore
- Software para Commodore 64
- Software VIC-20
- Microsoft BASIC descontinuado
- Intérpretes BÁSICOS
- Familia de lenguajes de programación BASIC
- Lenguajes de programación de Microsoft
- Lenguajes de programación creados en 1977