# System/34 BASIC

El IBM System/34 BASIC era un intérprete para la computadora IBM System/34 de rango medio. Se ofreció por primera vez en 1978 y, como tal, contenía muchas de las trampas que un programa BASIC habría encontrado en la época del TRS-80, o muchas otras ofertas de la década de 1970 y principios de la de 1980. Como tal, el BASIC S/34 usa convenciones que ya no son estándar en los BASIC modernos, como números de línea, y no admite funciones más nuevas como WHILE/WEND, DO/ENDDO, WITH/END WITH, procedimientos, propiedades, etc.

## Convenciones BASIC

Los intérpretes BASIC escritos en los años setenta tendían a «hacer cosas extrañas de maneras extrañas». Por ejemplo, en el Apple II, un programador podía incrustar un comando de DOS en un programa a través de PRINT, cuando está precedido por la cadena de caracteres CHR$ (4). PEEK y POKE podrían usarse en varios BASIC para examinar el contenido de la memoria o cambiarlo, o incluso para crear un programa de lenguaje de máquina ad hoc y luego ejecutarlo. El System/34 BASIC tiende a mantenerse alejado de estas extrañas convenciones; sin embargo, el programador podía hacer sonar la alarma (un zumbido hecho por la terminal) a través de PRINT CHR$(7).
Se espera que las declaraciones de BASIC se ingresen en letras mayúsculas, y aunque el operador puede presionar Cmd2 para usar minúsculas, el intérprete de BASIC convertirá las palabras clave que no son comentarios en mayúsculas.
Para que BASIC pudiera ser útil en un entorno informático de rango medio, IBM agregó extensiones al lenguaje que eran específicas de las convenciones de hardware y software de la familia IBM System/34, como el archivo WORKSTN, soporte para archivos de disco indexados, directos y secuenciales, la capacidad de abrir y cerrar varios archivos de impresora y LOAD/SAVE desde bibliotecas en el disco fijo.

## Declaraciones BASIC

Se utilizaron estas declaraciones, funciones y comandos básicos de BASIC:
       DATA
       DIM
       END
       FOR...NEXT
       GOSUB...RETURN
       GOTO
       IF...THEN
       INPUT
       LET
       ON...GOTO
       PRINT
       PRINT USING
       READ
       REM
       STOP
       ASC
       RND
       SIN
       COS
       TAN
       TAB
       SQRT
       LOG
       LIST
Declaraciones más avanzadas proporcionadas por IBM incluyen:
       ON ERROR Permite atrapar errores
       OPTION Permite propiedades de todo el programa, como indexación de matriz Base 1 o Base 0, precisión larga o corta, etc.
       OPEN Permite abrir un archivo o dispositivo (estación de trabajo formateada, impresora)
       CLOSE Cierra un archivo o dispositivo
       WRITE Salidas a un archivo o dispositivo
       REWRITE Cambia el formato de un registro o de visualización
       APPEND Agrega a un archivo
       DELETE Elimina un registro de un archivo
       IMAGE Define el formato de un registro utilizando una sintaxis similar a COBOL
       FORM Define el formato de un registro utilizando una sintaxis tipo RPG
       DEF FN..FNEND Define una función
       CHAIN Carga y pasa el control a otro programa BASIC
       PRINT #255: Imprime en el archivo de impresora (predeterminada)
       PRINT NEWPAGE Borra la pantalla
       PRINT #255: NEWPAGE Avanza a la siguiente página en el archivo de impresora
       AIDX Hace referencia al índice ascendente de una matriz, que es una matriz de punteros ordenados relativos a los elementos de la matriz.
       DIDX Igual que AIDX pero usa un índice descendente
       SRCH Se utiliza para encontrar un valor en una matriz recuperando el puntero de coincidencia
       SRCH$ Se usa para encontrar un valor de cadena en una matriz de cadenas recuperando el puntero de coincidencia
       RENUMBER Un comando usado para renumerar las líneas dentro de un programa
       LOAD Un comando usado para cargar un programa desde una biblioteca en el disco fijo
       SAVE Un comando utilizado para guardar un programa en una biblioteca en el disco fijo
       OFF Un comando utilizado para salir de la sesión BASIC interactiva
       LISTP Un comando usado para listar el programa actual a la impresora
ON ERROR es una declaración de captura de errores que permite a BASIC suspender un error que, de lo contrario, podría detener la ejecución de un programa BASIC y, en su lugar, realizar una rutina de manejo de errores. Las variantes incluyen el sufijo OFLOW, ZDIV y otros tipos de errores en una declaración y atrapan inmediatamente estos errores.
OPTION permite que el programa BASIC cumpla con criterios especiales. A veces BASIC no tenía mucho espacio de usuario (dado que todos los programas S/34 están limitados a 64K) y el área llamada «espacio de código» que contiene el programa de usuario actual debe residir dentro del espacio de usuario. Por lo tanto, los usuarios pueden elegir OPTION LPREC, que hace que BASIC calcule con valores numéricos de precisión doble (largos), u OPTION SPREC, que proporciona más espacio y valores numéricos de precisión simple (cortos). Algunos programadores prefieren las matemáticas matriciales donde el índice con el número más bajo es 0, otros prefieren 1. OPTION BASE 0 y OPTION BASE 1 logran esto. Hay otros usos para OPTION.
Los programas RPG II en el S/34 no podían llamarse entre sí, pero los programas BASIC sí, usando la instrucción CHAIN. CHAIN pasa el control del módulo BASIC actual al módulo nombrado, con una lista de argumentos que pueden convertirse en variables en el nuevo módulo cuando se carga.
DEF FN permite la definición de una función de usuario en BASIC que puede ser nombrada y referenciada en el programa. FNEND se coloca después de la última declaración en una función.
Hay cuatro formas de formatear la entrada y salida BASIC. Primero, sin formato; simplemente PRINT e INPUT lo que desee. En segundo lugar, con PRINT USING, que en BASIC S/34 puede incorporar una constante, una variable de cadena, un número de línea o una etiqueta. En tercer lugar, con PRINT FIELDS y INPUT FIELDS, que colocan campos de visualización de tipo 5250 en el CRT en modo inmediato. Cuarto, usando un archivo de estación de trabajo (abierto con OPEN #x: "WS,NAME=" y así sucesivamente) y realizando varias combinaciones de WRITE y READ en ese archivo de estación de trabajo, usando Formatos de pantalla generados por SDA similares a los de otras aplicaciones S/34. WRITE y READ, así como PRINT USING e INPUT USING, pueden dirigir al BASIC a un número de línea o una etiqueta que contiene la palabra clave «IMAGE:».
Una instrucción IMAGE contiene decimales, comas, signos de dólar, guiones y signos de numeral («#») en representación de los valores numéricos o alfanuméricos sustituidos.
Una instrucción FORM denota el tamaño de las variables que se leerán o escribirán. Para guardar un valor numérico de 0,00 a 99.999,99, utilice esta notación:
Una etiqueta es una etiqueta en una línea de la siguiente manera:
Si lo desea, se puede usar la instrucción GOSUB COMIENZO_CÁLCULOS en lugar de GOSUB 260.
OPEN, CLOSE, WRITE, REWRITE, DELETE y APPEND ya son familiares para los programadores de COBOL y describen las acciones realizadas para acceder a archivos de disco S/34 utilizando BASIC. No es posible acceder a todos los tipos de archivos S/34 porque incluyen archivos del sistema, bibliotecas y carpetas, pero todos los archivos S/34 creados por el usuario con una longitud de registro fija (solo los programas FORTRAN pueden usar longitudes de registro variables) será suficiente. Los archivos de disco se pueden abrir secuencialmente, por índice o relativamente (por número de registro). Si un archivo tiene capacidad de eliminación, los registros se pueden eliminar mediante la instrucción DELETE. Para agregar un registro, use WRITE (con APPEND especificado en la sentencia OPEN) y para actualizar use REWRITE.

## Impresión

En el BASIC S/34, para imprimir en la impresora se debe usar un archivo de dispositivo. Siempre existe un archivo de impresora predeterminado llamado #255 cuando se inicia BASIC. Tiene un nombre de impresora BASIC255 y abre el dispositivo que es la impresora predeterminada para el terminal que inicia una sesión BASIC. Si lo desea, es posible crear un archivo de impresora diferente numerado entre 1 y 254. Use OPEN #x: PRINTER,NAME= y así sucesivamente para hacer esto, especificando columnas o ID de dispositivo u otros parámetros según sea necesario. La palabra clave PAGEOFLOW se puede utilizar para atrapar la condición de desbordamiento de página para la impresora.

## Matriz

Algunas versiones de BASIC permiten al programador ordenar una matriz. El S/34 BASIC no proporciona una función para esto, pero proporciona un solución interesante. El programador puede definir una matriz con el mismo número de elementos que la matriz de destino y usar AIDX o DIDX para crear un índice ascendente o descendente. Cada elemento de la nueva matriz contendrá un número que representa la posición ordenada ordinal de la matriz de destino, por lo que si AMÉRICA es el sexto elemento de la matriz A$ pero primero en orden alfabético, entonces establece A = AIDX (A$) haría que A(1) contuviera el valor 6.
Escribir un programa BASIC es mucho más divertido que reescribir el mismo programa cada vez que lo usa, por lo tanto, los autores de BASIC permiten a los programadores SAVE (guardar) su código de programa en un miembro de la biblioteca y REPLACE (reemplazar) cuando se realizan cambios.
SAVE PROG1,PGMRLIB hace que el módulo actual se guarde como un miembro de subrutina (tipo R) denominado PROG1 en una biblioteca de usuario denominada PGMRLIB.
Tenga en cuenta que los archivos System/34 no forman parte de las bibliotecas. Si un archivo de disco se llama FNF001, entonces una instrucción OPEN como esta puede funcionar:
OPEN #3:"NAME=FNF001,SEQUENTIAL",INPUT
No importa qué biblioteca se use para acceder al archivo FNF001.
RENUMBER es el comando del BASIC S/34 utilizado para renumerar sentencias. Todas las referencias internas a números de sentencias se recalculan inmediatamente.
El System/34 BASIC tiene un comando muy peligroso llamado FREE. Escribir FREE seguido de un nombre de archivo elimina ese archivo sin dejar rastro. Funcionará para todos los archivos de usuario, a menos que haya un conflicto de seguridad o una condición de uso que lo bloquee.
El System/34 BASIC tiene otro comando peligroso llamado LOCK. El comando LOCK hará que el código fuente del programa actual sea inaccesible y no es reversible. Guarde siempre una copia desbloqueada antes de usar LOCK.

## Incompatibilidad entre S/34 y S/36

En 1983, IBM anunció la familia System/36 de computadoras de gama media.
System/34 BASIC y System/36 BASIC son muy similares; sin embargo, la incompatibilidad a nivel código de máquina hace que sea imposible portar una subrutina de un programa BASIC entre estos sistemas.