El 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 computadoras domésticas de 8 bits de Commodore International, que se extiende desde el PET de 1977 hasta el C128 de 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 sobre la base de «un sólo pago, sin regalías» después de que Jack Tramiel rechazara la oferta de Bill Gates de una tarifa de por unidad, diciendo: «Yo ya estoy casado», y no pagaría más de por una licencia perpetua.Declarado por Jack Tramiel en la celebración del 25.° aniversario de Commodore 64 en el Computer History Museum el 10 de diciembre de 2007 .
La versión original del PET era muy similar a la implementación original de Microsoft con pocas modificaciones. El BASIC 2.0 en el C64 también era similar y también se vio en algunos C128 y otros modelos. Los PET posteriores implementaban BASIC 4.0, similar al original pero agregando una serie de comandos para trabajar con disquete.
El BASIC 3.5 fue el primero en desviarse realmente, agregando una serie de comandos para soporte de gráficos y sonido en el C16 y Plus/4. El BASIC 7.0 se incluyó con el Commodore 128 e incluía comandos de programación estructurados del BASIC 3.5 del Plus/4, así como palabras clave diseñadas específicamente para aprovechar las nuevas capacidades de la máquina. Se agregaron un editor de sprites y un monitor de lenguaje de máquina. El último, BASIC 10.0, fue parte del Commodore 65, que nunca fue comercializado.
Historia Commodore tomó el código fuente del BASIC y lo desarrolló internamente para todas sus otras computadoras domésticas de 8 bits. No fue hasta el Commodore 128 (con la V7.0) que se mostró un aviso de derechos de autor de Microsoft. Sin embargo, Microsoft había incorporado un huevo de Pascua en la versión 2 del Commodore Basic que demostró su procedencia: escribiendo el (oscuro) comando WAIT 6502, 1 haría que Microsoft! apareciera en la pantalla. (El huevo de Pascua estaba bien ofuscado: el mensaje no apareció en ningún desensamblado del intérprete).
El popular Commodore 64 implementaba el BASIC v2.0 en ROM a pesar de que la computadora se lanzó después de la serie PET/CBM que tenía la versión 4.0, porque la 64 estaba pensada como una computadora doméstica, mientras que la serie PET/CBM estaba dirigida a uso comercial y educativo donde se suponía que su lenguaje de programación incorporado se usaba más. Esto ahorró costos de fabricación, ya que el V2 encaja en ROM más pequeñas.
Detalles técnicos
Edición de programas Una característica conveniente del intérprete BASIC residente en ROM y el KERNAL era el editor de pantalla completa. Aunque los teclados Commodore solo tienen dos teclas de cursor que alternan la dirección cuando presiona la tecla mayúsculas, el editor de pantalla permitía a los usuarios ingresar comandos directos o ingresar y editar líneas de programa desde cualquier lugar de la pantalla. Si una línea tenía el prefijo de 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 cada vez que el cursor estaba en la línea. Esto marcó una mejora significativa en las interfaces de entrada de programas en comparación con otros BASIC de computadoras domésticas comunes en ese momento, que generalmente usaban un editor de línea, invocados por un comando EDIT separado, o un comando «copiar cursor», que truncaba la línea en la posición del cursor.
También tenía la capacidad de guardar archivos con nombre en cualquier dispositivo, incluido el casete, un dispositivo de almacenamiento popular en los días del PET y que permaneció en uso durante 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 disquete, lo que hacía que guardar varios archivos en otros dispositivos fuera más difícil. El usuario de uno de estos otros sistemas tenía que observar la ubicación del archivo en el contador de la grabadora, pero esto era inexacto y propenso a errores. Con el PET (y BASIC 2.0), los archivos de los casetes se podían solicitar por nombre. El dispositivo buscaría el nombre del archivo leyendo datos secuencialmente, ignorando cualquier nombre de archivo que no coincida. El sistema de archivos también estaba respaldado por una poderosa estructura de registro que podía cargarse o guardarse en archivos. Los datos del casete Commodore se grabaron digitalmente, en lugar de métodos analógicos menos costosos (y menos confiables) utilizados por otros fabricantes. Por lo tanto, se requería el Datasette especializado en lugar de una grabadora de cinta estándar. Había adaptadores disponibles que usaban un conversor analógico a digital para permitir el uso de una grabadora estándar, pero estos costaban solo un poco menos que el Datasette.
El comando se puede usar con el parámetro opcional 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 retienen en memoria). Si no se utiliza el parámetro , el programa se cargará al inicio del área del programa BASIC, que difiere mucho entre máquinas. Algunas variantes de Commodore BASIC proporcionaron comandos BLOAD y BSAVE que funcionaron como sus contrapartes en Applesoft BASIC, cargando o guardando bitmap de ubicaciones de memoria especificadas.
El PET no admite programas reubicables y el comando siempre se cargará en los primeros dos bytes contenidos en el archivo del programa. Esto creó un problema al intentar cargar programas BASIC guardados en otras máquinas Commodore, ya que se cargarían en una dirección más alta que donde el BASIC de PET esperaba que estuviera el programa, había soluciones para «mover» los programas a la ubicación adecuada. Si un programa se guardaba en una máquina CBM-II, la única forma de cargarlo en un PET era modificando los primeros dos bytes con un editor de sector de disco ya que la serie CBM-II tenía su área de programa BASIC en $0, lo que daría como resultado que el PET intente cargar en la página cero y se bloquee.
Las palabras reservadas de Commodore BASIC se podían abreviar ingresando primero una pulsación de tecla sin cambio y luego una pulsación de tecla cambiada de la siguiente letra. Esto establece el bit alto, lo que hace que el intérprete deje de leer y analice la declaración de acuerdo con una tabla de búsqueda. Esto significaba que la declaración hasta donde se estableció el bit alto se aceptó como un sustituto para escribir el comando completo. Sin embargo, dado que todas las palabras clave de BASIC se almacenaron en la memoria como tokens de un solo byte, esto fue una conveniencia para la entrada de declaraciones en lugar de una optimización.
En el conjunto de caracteres predeterminado solo en mayúsculas, los caracteres desplazados aparecen como un símbolo gráfico; p.ej. el comando, GOTO, podría abreviarse G{Shift-O} (que se parecía a GΓ 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 del comando sin mayúsculas, como GO{Shift-S} (GO♥) que se requieren para GOSUB. Algunos comandos no tenían forma abreviada, ya sea por brevedad o ambigüedad con otros comandos. Por ejemplo, el comando, INPUT no tenía abreviatura porque su ortografía chocaba con la palabra clave separada INPUT#, que se encontraba más cerca del comienzo de la palabra clave en la tabla de correspondencia. El comando PRINT muy utilizado tenía un solo atajo ?, 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.
Este método de tokenización tenía una falla tal que si uno incluía un REM (declaración BASIC para agregar un comentario al código) seguido de un {Shift-L}, al intentar ver la lista de programas, el intérprete de BASIC abortaría inmediatamente la lista, mostraría un ?SYNTAX ERROR y volvería al mensaje READY.. Esta falla fue utilizada con algún efecto por los programadores que querían probar y proteger su trabajo, aunque era bastante fácil de eludir.
Al abreviar las palabras clave, era posible incluir más código en una sola línea de programa (lo que podía ocupar dos líneas de pantalla en pantallas de 40 columnas, es decir, C64 o PET, o cuatro líneas en la pantalla de 22 columnas de VIC-20). Esto permitió un ligero ahorro para almacenar líneas de programa, que de otra forma hubieran necesitado líneas adicionales. Todos los comandos BASIC se tokenizaron y ocuparon 1 byte (o dos, en el caso de varios comandos de BASIC 7 o BASIC 10) en la memoria sin importar de qué manera se ingresaron. Las líneas tan largas eran una molestia para editar. El comando LIST mostraba la palabra clave completa del comando, extendiendo la línea del programa más allá de las 2 o 4 líneas de pantalla que podían ingresarse en la memoria del programa.
Rendimiento Al igual que el intérprete de Microsoft BASIC, Commodore BASIC es más lento que el código de máquina nativo. Los resultados de las pruebas han demostrado que copiar 16 kilobytes de ROM a RAM toma menos de un segundo en código de 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 coma 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 la coma flotante es el tipo predeterminado para todos los comandos, es más rápido usar números de coma flotante como argumentos, en lugar de números enteros. Cuando la velocidad era importante, algunos programadores convertían secciones de programas BASIC a lenguaje ensamblador del 6502 o 6510 que se cargaba por separado desde un archivo o se metía en la memoria desde instrucciones DATA en el final del programa BASIC, y ejecutado 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 de máquina era demasiado grande, como para un juego o cuando se esperaba la entrada del usuario, los programadores podían sondear leyendo ubicaciones de memoria seleccionadas (como $C6 para el 64, o $D0 para el 128, que indica 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 dentro de un programa, como borrar la pantalla o posicionar el cursor; estos se pueden invocar emitiendo un comando donde X corresponde al código de control que se emitirá (por ejemplo, es el código de control para limpiar la pantalla) o presionando la tecla en cuestión entre comillas, por lo tanto, al presionar después de una comilla, se mostrará la representación visual del código de control BASIC (en este caso, un corazón invertido) que luego se actúa en 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 ). Esto es en comparación con otras implementaciones de BASIC que normalmente tienen comandos dedicados para limpiar la pantalla o mover el cursor. BASIC 3.5 y posteriores tienen comandos específicos para limpiar la pantalla y mover el cursor.