# Color BASIC

Color BASIC es la implementación de Microsoft BASIC que se incluye en la ROM de las computadoras a color Tandy/Radio Shack TRS-80 fabricadas entre 1980 y 1991. BASIC (Código de instrucciones simbólicas multipropósito para principiantes, de ahí en inglés sus siglas), es un lenguaje de alto nivel con una sintaxis simple facilitada, para tener la posibilidad de escribir programas simples. La decodificación ocurre, al momento en que BASIC se está ejecutando.

## Fondo

El núcleo de Color BASIC fue Microsoft BASIC-69, que Tandy obtuvo la licencia de Microsoft. Color BASIC 1.0 se lanzó con la computadora a color 4k TRS-80 original en 1980. Reside en 8 Kilobytes de ROM y es responsable de todas las tareas de "limpieza" del sistema. Esto incluye comienzo de hardware, administración de memoria, procesamiento de interrupciones, etc. Como la mayoría de las implementaciones de BASIC, cada línea de código comienza con un número de línea y consta de no únicamente una declaración con variables y operadores. Se requieren 16 Kilobytes de memoria para el siguiente nivel de BASIC, Extended Color BASIC ("ECB"). Extended BASIC se requiere para el controlador de disquete, que luego le proporciona un Disco de Color Extendido BASIC ("DECB"). La disponibilidad de emular este intérprete está disponible para las computadoras modernas, de las cuales, algunas requieren un archivo de "instantánea" de la máquina física.

## Variables

Color BASIC comprende un tipo de variable numérica y variables de cadena de texto. Hay dos principales caracteres significativos como nombres de variables en Color BASIC. El primer carácter del nombre de la variable viene a ser una letra, mientras que el segundo carácter puede ser una letra o un número. Las variables de cadena se indican agregando un signo de dólar ($) después del nombre de la variable.

### Ejemplos

Las variables numéricas tienen un solo tipo, siendo este una implementación binaria de coma flotante. Cada variable de números usa 5 bytes de memoria, pudiendo estar entre el rango de -1E+38 y 1E+37.
A diferencia de la mayoría de las implementaciones de Microsoft BASIC, Color BASIC requiere que el usuario debe reservar espacio, para las variables de cadena, mediante la instrucción CLEAR.
Las matrices de múltiples dimensiones también tienen compatibilidad con variables numéricas y de cadena. En el caso de una matriz, la dirección o ubicación del elemento está encerrada entre paréntesis:
Varias dimensiones están separadas por comas

## Operadores y Símbolos

Color BASIC proporciona varios operadores para operaciones matemáticas y operaciones de cadenas, en menor medida.
    + se puede usar para concatenar cadenas o para sumas matemáticas
    - se usa para restar
    * se usa para la multiplicación
    / se usa para dividir
Los paréntesis ( ) son usados, para anular el orden matemático de operación
    AND se utiliza para operaciones lógicas 'y'
    OR se usa para operaciones lógicas 'o'
    NOT se utiliza para operaciones lógicas 'not'
Para la prueba, se utilizan los siguientes operadores:
    = es igual a
    > es mayor que
    < es menor que
    >= es mayor o igual que (también => es aceptable)
    <= es menor o igual que (también =< es aceptable)
    <> no es igual a (también >< es aceptable)
Otros símbolos utilizados en BASIC:
    " " indica que la cadena de datos es una constante (estática)
    : separa múltiples comandos en una sola línea de programa
    Un punto y coma, cuando se encuentra en una función IMPRIMIR, hará que la salida permanezca en la misma línea
    Una coma, cuando se encuentra en una función IMPRIMIR, pasará a la siguiente columna

## Clave

num indica que es necesario expresar un número. Este puede ser dígito fijo, una variable u otra operación o función que devuelva la expresión numérica.
str indica que es necesario expresar una cadena de texto. Las posibilidades existen en ser un valor de cadena estático (entre comillas), una variable de cadena u otra función o expresión que devuelva una cadena de caracteres.
device number indica un dispositivo. Por defecto, se asume el dispositivo 0 (pantalla y teclado), como principal dispositivo. En Color BASIC, el dispositivo #-1 (casete) y #-2 (impresora) están disponibles para el programador.

## Modo de edición

Al cometer un error en la escritura de una línea, se puede volver a escribirla desde cero (o ELIMINARLA) o puede EDITARLA.
Estando en modo EDITAR, se obtiene una reimpresión de la línea y una segunda copia que coloca la barra ESPACIADORA en los caracteres. No está permitido utilizar las teclas de flecha. Y el retroceso lo lleva a la izquierda, sin poder borrarlo en el búfer. 'i' coloca al usuario en modo de inserción. Presionando Regresar, lo saca de eso. 'c' cambia un carácter. 'd' borra un carácter. 'x' lleva al usuario al final de la línea, lo que le permite extenderla. 'l' vuelve a dibujar la línea. 's' busca la siguiente instancia de un carácter. Para los comandos 's', 'c' y 'd' también permite al usuario ingresar un número (#) antes de presionar cualquiera de ellos, de modo que: 's' buscará la instancia numérica o # del carácter, 'c' le permitirá al usuario cambiar el número de caracteres y 'd' elimina el número de caracteres que el usuario esté pidiendo.

## Funciones
### ABS(num)

    Devuelve el valor absoluto de num

### ASC(str)

    Devuelve el código ASCII del primer carácter en str

### CHR$(num)

    Devuelve un solo carácter de cadena str con el número de código ASCII

### EOF(device number)

    Devuelve 0 si el archivo tiene datos, o -1 si al final del archivo

### INKEY$

    Devuelve un carácter si se ha presionado una tecla en el teclado, o nulo si no se presiona nada

### INT(num)

    Devuelve la parte entera de num

### INSTR(startpos,search str,target str)

    Busca la primera cadena, en la cadena de destino; startpos es opcional.

### JOYSTK(num)

    Devuelve la posición del eje del joystick (0-3) con un valor de 0 a 63

### LEFT$(str,num)

    Devuelve el primer número de caracteres ("izquierda") de la cadena str

### LEN(str)

    Devuelve la longitud (en caracteres) de la cadena str

### MEM

    Devuelve la memoria libre disponible en bytes

### MID$(str,start num,length num)

    Devuelve una subcadena de cadena str que comienza en la posición número de inicio y longitud número de caracteres de longitud. También se puede reasignar agregando ="nuevovalor"

### PEEK(num)

    Devuelve el valor de la ubicación de memoria num (0-65535)

### POINT(x num,y num)

    Devuelve el color del punto semigráfico en la posición x num (0-63) e y num (0-31)

### RIGHT$(str,position num)

    Devuelve la parte final ("derecha") de la cadena str que comienza en la posición del carácter num

### RND(number)

    Devuelve un número aleatorio (entero) entre 1 y num

### SGN(num)

    Devuelve el signo de un número num, 1 si es positivo, -1 si es negativo, 0 si es 0

### SIN(num)

    Devuelve el seno de num en radianes

### STR$(num)

    Devuelve una cadena del número num

### USR(num)

    Llama a una subrutina de lenguaje de máquina cuya dirección está almacenada en las ubicaciones de memoria 275 y 276. num se pasa a la rutina y se asigna un valor de retorno cuando finaliza la rutina

## Comandos
### AUDIO [ON|OFF]

    Conecta o desconecta el audio del casete del sonido del televisor

### CLEAR variable space[,highest memory location]

    Reserva memoria para variables de cadena y, opcionalmente, un programa en lenguaje de máquina

### CLOAD ["name"]

    Carga el programa BASIC desde el casete. Si no se especifica ningún nombre, se carga el siguiente programa

### CLOADM ["name"]

    Carga el programa en lenguaje máquina desde el casete. Si no se especifica ningún nombre, se carga el siguiente programa

### CLOSE [device number]

    Cierra un dispositivo (en Color BASIC solo puede ser #-1, el casete)

### CLS(num)

    Borra la pantalla. Se puede especificar un número de color opcional (0-8)

### CONT

    Continúa un programa después de presionar BREAK o una instrucción STOP

### CSAVE ["name"]

    Guarda un programa BASIC en casete con nombre opcional

### DATA var,var,var...

    Almacena datos en un programa BASIC para recuperarlos con el comando READ

### DIM variable(dimension[,dimension 2,...]

    Dimensiona una matriz y reserva espacio de memoria para ella

### END

    Indica el final de un programa BASIC

### EXEC

    [dirección de memoria] ejecuta el programa en lenguaje máquina en la dirección de memoria. Si no se especifica ninguno, se usa la dirección de ejecución del programa cargado fuera de la cinta

### INPUT [device number] [{prompt text};] variable [,variable 2, variable n]

    Espera la entrada del número de dispositivo. Si no se especifica, se asume el dispositivo 0 (teclado). Se puede imprimir un mensaje opcional en la pantalla, para la declaración de entrada

### LIST [starting line] - [ending line]

    Enumera la(s) línea(s) de su programa. Se puede omitir el inicio o el final, o si se omiten ambos, se listará el programa completo

### LLIST [starting line] - [ending line]

    Funciona como LIST, pero da salida a la impresora

### MOTOR [ON|OFF]

    Enciende o apaga el motor del casete

### NEW

    Borra el contenido de la memoria (programa y variable)

### ON {num} GOSUB line 1, line 2, ... line n

    Evalúa la expresión num y llama a la subrutina numth listada

### ON (num) GOTO line 1, line 2, ... line n

    Evalúa la expresión num y salta a la línea numth de la lista

### OPEN "[I|O]",device number[,"filename"]

    Abre un dispositivo para la comunicación

### POKE memory address, data

    Escribe datos (0-255) en la dirección de memoria (0-65535)

### PRINT device number,expression

    Imprime datos en el dispositivo especificado. Si se omite, se asume #0 (pantalla)

### PRINT @{screen position} expression

    Funciona como IMPRIMIR, pero imprime en la ubicación especificada (0-511)

### READ variable[,variable,...]

    Lee la(s) siguiente(s) variable(s) del programa BASIC incrustado con sentencias DATA

### RENUM num

    Vuelve a numerar cada línea del programa en múltiplos de num

### RESET(x,y)

    Establece el píxel semigráfico en la ubicación x (0-63) e y (0-31) en negro

### RESTORE

    Restablece el puntero READ de nuevo a la primera instrucción DATA

### RETURN

    Regresa de una subrutina

### RUN num

    Ejecuta el programa BASIC, opcionalmente, en el número de línea especificado

### SET(x,y,color)

    Establece el píxel semigráfico en la ubicación x (0-63) y (0-31) en color (0-8)

### SKIPF ["filename"]

    Salta los programas BASIC en la cinta hasta que se encuentra el nombre del programa especificado

### SOUND tone,duration

    Suena un tono con frecuencia (1-255) y duración (1-255)

### STOP

    Hace que el programa deje de ejecutarse

### TAB(column)

    Tabula a la columna especificada (usado con PRINT)

### VAL(str)

    Devuelve el valor numérico de una cadena que contiene un número en forma de cadena

## Flujo de control
### GOSUB {line number}

    Llama a la subrutina en el número de línea especificado

### GOTO {line number}

    Salta al número de línea del programa especificado

### IF {test} THEN {command(s)} [ELSE {command(s)}]

    Realiza la prueba condicional. Si la prueba es verdadera ENTONCES se ejecutan los comandos, de lo contrario (ELSE) se ejecutan otros comandos. Si no se especifica ELSE y la prueba es falsa, se ejecutará la siguiente línea del programa.
    crea un bucle en el que la variable numérica (num) se ejecuta desde el número inicial hasta el número final en incrementos de número (PASO). Si se omite el paso, se supone 1

## Error de mensajes
### /0

    división por cero

### AO

    el archivo especificado ya está abierto

### BS

    mal subíndice. el subíndice está fuera del rango DIM

### CN

    no puede continuar (ver comando CONT)

### DD

    intentar redimensionar una matriz

### DN

    número de dispositivo no válido

### DS

    error de declaración directa (el programa no tiene números de línea)

### FC

    llamada de función ilegal: la función contiene un valor que está fuera de rango

### FD

    datos de archivo erróneos: intento de leer un número en un valor de cadena, etc.

### FM

    modo de archivo incorrecto, intento de ENTRADA de datos en un archivo abierto para SALIDA, etc.

### ID

    directo ilegal: el comando especificado solo se puede ejecutar en un programa

### IE

    entrada más allá del final del archivo. Ver EOF

### IO

    error de entrada/salida

### LS

    cadena larga: las cadenas solo pueden tener 255 caracteres

### NF

    SIGUIENTE sin PARA

### NO

    archivo no abierto

### OD

    fuera de datos: intenta leer más allá de los últimos DATOS en el programa

### OM

    sin memoria

### OS

    fuera del espacio de cadena: vea CLEAR

### OV

    desbordamiento: el número está fuera de rango

### RG

    VOLVER sin GOSUB

### SN

    error de sintaxis

### ST

    operación de cadena demasiado compleja

### TM

    tipo de discrepancia (A$=3, A="CAT")

### UL

    intente ir a GOTO o GOSUB a una línea que no existe

## Subrutinas ROM documentadas

Hay algunas subrutinas disponibles para programas de lenguaje de máquina en la ROM BÁSICA de Color, estos disponibles para programación general.

### POLCAT

    dirección [$A000]: sondea el teclado para un carácter

### CHROUT

    dirección [$A002]: envía un carácter a la pantalla o dispositivo

### CSRDON

    dirección [$A004]: inicia el casete y se prepara para la lectura

### BLKIN

    dirección [$A006]: lee un bloque del casete

### BLKOUT

    dirección [$A008]: escribe un bloque en el casete

### JOYIN

    dirección [$A00A]: lee los valores del joystick