SERIE COMPARANDO BASICS (I) BASIC DARMOUTH A modo de introducción Tras haber escrito sobre el Basic Sinclair, ZX81, 128k y Timex; y por razón de la existencia de emuladores de otras máquinas para el ZX Spectrum, como son el APPLE-1, VIC-20, BBC Basic, Galaksija y UK-101, he decidido crear una nueva serie de textos, esta vez dedicados a otras versiones de BASIC; ¿y qué mejor modo de iniciar esto, que hablando sobre el BASIC original? Sí, el Basic de Darmouth, el Basic que lo empezó todo. HISTORIA Dartmouth College es una universidad cya fundación data de 1769, dedicada a la educación e instrucción de los jóvenes. In 1940 un gran evento, no muy bien recordado hasta recientemente (Loveday 1977), tuvo lugar en Dartmouth. El Dr. George Stibitz de Bell Telephone Laboratories demostró publicamente y por primera vez, en el encuentro anual de la American Mathematical Society, el uso remoto de una computadora mediante unaa línea de comunicaciones. La computadora era una calculadora de relés diseñada para manejar cálculos aritméticos con números complejos. La terminal era un Teletipo Modelo 26. Pero no sería hasta el 1 de mayo de 1964 a las 4 a.m., cuando John Kemeny y John McGeachie corrieron los primeros programas BASIC ejecutados exitosamente en terminales por el sistema de DTSS del cual hablaremos luego. Varias versiones se hicieron en Dartmouth de su BASIC, el cual era compilado, a diferencia de otras implementaciones del lenguaje usadas en otros lados, que eran interpretados. La primera versión interactiva fue puesta a disposición de los usuarios en junio de 1964; la segunda en octubre de 1964; la tercera en 1966; la cuarta en 1969; la quinta en 1970; la sexta en 1971; y la séptima en 1979. Y con cada versión se hacían añadidos y mejoras al lenguaje hasta llegar a su forma actual. TELETIPO El teletipo era un aparato telegráfico que permite transmitir directamente un texto, por medio de un teclado mecanográfico, e imprimirlo en la estación receptora. También se le llama así al mensaje transmitido por dicho aparato. Fue muy usado a fines de los sesenta y practicamente toda la dcada del 70, como medio de interfasear una computadora central con los usuarios a travez del uso de terminales a distancia pormedio de líneas telefónicas. Un teclado de teletipo no era muy diferente a uno de una máquina de escribir mecánica de aquel entonces, en la cual estaba basada de hecho, tal como se ve a continuación: | ! | | " | | # | | $ | | % | | & | | | | ( | | ) | | * | | = | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 0 | | : | | - | |ALT | |WRU| |TAPE| |tape| |TAB| |<- | | @ | |LINE| |MODE| | Q | | W | | E | | R | | T | | Y | | U | | I | | O | | P | |FEED| |RETURN| |X OFF| |EOT| |RU | |BELL| |VT | |FORM| | + | |CTRL| | A | | S | | D | | F | | G | | H | | J | | K | | L | | ; | |RUBOUT| | ^ | | < | | > | | ? | |SHIFT| | Z | | X | | C | | V | | B | | N | | M | | , | | . | | / | |SHIFT| |LOC| | LF| [ BARRA ESPACIADORA ] Significado de algunas teclas: ALT MODE - elimina toda la línea tipeada antes de pulsar RETURN <- - back space / delete (retrocede y borra caracteres) TAB - tabula o indenta la línea a ingresar EOT - end of transmission (final de la transmisión) WRU - por who are you? ("¿quién es usted?") RU - por TRUE (¿verdad?) LOC LF - bloquea o impide el line feed (salto de línea) LINE FEED - provoca un salto de línea pero sin terminarla e ingresarla al listado RETURN - termina la línea y la inserta en el listado BELL - toca una campana o produce una señal audible en el receptor. VT - virtual terminal ("terminal virtual de red") X OFF - una abreviatura de transmisión fuera RUBOUT - para hacer correcciones a textos en la cinta de papel perforado TAPE - para iniciar la cinta perforada tape - en mayúsculas, subrayada o tachada, para detener la cinta perforada CTRL - el BASIC ignora sus símbolos Otros botones: ORIG - enciende la máquina teletipo CLR - apaga el teletipo BUZ-RLS - desactiva el zumbido producido al detectarse que hay poco papel en la máquina Y de aquí derivaron los teclados dea PCs y deás micros de 8 bits, pero con unas ligeras modificaciones como en el caso del ZX Spectrum. DTSS Dartmouth timesharing system. Sistema de tiempo compartido de Darmouth. Es una interfaz de usuario de línea de comandos a manera de entorno de desarrollo integrado. Fue el primer sistema implementado exitosamente, desde 1963 hasta 1999. La lista de comandos es la que viene a continuación: HELLO - inicia nueva sesión, pide entrar tu número de usuario NEW - para crear un nuevo programa, solicita un nombre OLD - carga un programa previamente guardado SAVE - salva el programa actual REPLACE - salva el programa actual sobreescribiendo la versión original RENAME - renombra el programa en curso CATALOG - lista los nombres de los programas que salvaste (forma breve CAT) LIST - lista el programa en curso, número de línea opcional RUN - ejecuta el programa en curso STOP - detiene la ejecución del programa (en caso de bucles infinitos). Basta tipear S UNSAVE - elimina el programa salvado SCRATCH - como NEW pero sin cambiar el nombre del programa (forma breve SCR) SYSTEM - elige el sistema a usar (en este caso BASIC) GOODBYE - termina la sesión (forma breve BYE) Estos comandos directos no eran parte del programa, es decir no podían usarse dentro de un listado BASIC, ya que además de este lenguaje Darmouth también ofrecia Algol o Fortran. Sin embargo pasarían a ser integrados dentro del BASIC, ya sea con ligeros cambios en su sintaxis o renombradas pero cumpliendo la misma función. BASIC 1964 El BASIC Darmouth en su primera versión solamente tenía quince sentencias y diez funciones. Sentencias LET - requerido, sentencia de asignación y creación de variables PRINT - provee salida de formato libre END - requerido, termina el programa READ - asigna valores a variables con los datos internos DATA - introduce datos internos GOTO - simplemente eso, salta a otros números de linea IF - se usa para hacer GOTOs condicionales FOR - inicia un bucle NEXT - cierra el bucle GOSUB - como GOTO pero saltando a una subrutina RETURN - retorna al finalizar la subrutina DEF - permite crear funciones definidas por el programador DIM - permite dimensionar las matrices REM - Provee comentarios al programa STOP - similar a END, termina el programa deteniéndolo. Funciones ABS - da el valor absoluto ATN - da la arctangente COS - da el coseno EXP - el valor exponencial, o sea, e^x INT - la parte entera (trunca hacia el 0) LOG - da el logaritmo natural RND - da el siguiente número aleatorio SIN - da el seno SQR - la raiz cuadrada TAN - da la tangente Características de este Basic. Los nombres de programas deben ser de máx. 6 caracteres. SAVE no permite sobreescribir un programa existente, eso evita borrar accidentalmente. Acepta números de línea de hasta 5 dígitos. No acepta palabras BASIC en modo comando. Para eliminar una línea basta con tipear su número. El programa debe terminar siempre con la sentencia END. Las variables numéricas deben ser de una letra o de una letra más un dígito. No admite variables alfauméricas, solamente mensajes de texto en PRINT. Esta versión carecía de INPUT. Sería añadido después sólo para variables numéricas. Este BASIC ya ofrece listas con subindices de 0 a 10 sin DIM. Sólo se permite una letra como nombre de variable con subindice. Las sentencias DEF siempre deben aparecer en cualquier parte del programa antes de END. DEF solamente acepta FN + una letra como nombre de función, dando hasta 26 funciones. Acepta hasta 75 caracteres por línea de impresión. El único separador en PRINT es la coma que separa los datos mediante tabulación. PRINT X,Y imprime los números tabulando con 15 espacios de distancia entre ambos. Son consideradas complementarias o parte de la sintaxis de otras sentencias: TO - parte de la sentencia GOTO y también de la sintaxis del bucle FOR STEP - opcional en el bucle FOR THEN - parte de la sintaxis de IF FN - completa a sintaxis de DEF y sirve de prefijo para las funciones creadas por el usuario. BASIC DE TARJETAS La segunda versión le hizo ligeros cambios a todo lo anterior, mientras una variante de la mismle comocida como Card Basic (Basic de tarjetas perforadas) le añadía nuevas instrucciones mientras cambiaba ligeramente algunas otras. Usaba las sigtes. palabras en vez de los signos relacionales: EQU - breve de EQUAL, igual que (=) LSS - por LESS, menor que (<) GRT - por GREAT, mayor que (>) LQU - LESS EQUAL, menor igual que (<=) GQU - GREAT EQUAL, mayor igual que (>=) NQU - NOT EQUAL, no es iagual que (<>) Y añadía dos nuevas instrucciones: PAGE - crea nueva página impresa como salida. MAT - breve por MATRIX, para el manejo de matrices numéricas Caracteristicas Permitía a las matrices empezar con sub-índice 0 en vez de 1 (util con polinomios) y añadió el punto y coma (;) a PRINT. La versión de tarjetas carecía del sub-índice 0. Estaba implementada para el manejo de tarjetas "on-line" la cual permitía programs de mayor tamaño en comparación con los teletipos. No había limites en el uso de DATAs y se accedia a una impresora de alta velocidad. PRINT usaba la comilla simple en lugar de las comillas dobles. Los datos iban al final del programa pero sin usar la sentencia DATA para nada. BASIC 1968 En 1966 saldría la versión 3, la cual retuvo la sentencia MAT ahora con subindice cero, añadía la función SGN, así como las sentencias RESTORE e INPUT, además de mejorar la función INT. Un "update" a la tercera versión añadiría ON ... GOTO y RANDOMIZE con RND, así como el punto y coma a PRINT. La versión 4 de 1968 añadiría más mejoras, como definir funciones multilínea y la sentencia CHANGE. DEbido al manejo de cadenas MAT nuevamente volvería a empezar con sub-índice 1. Nuevas sentencias y funciones ON GOTO - salto a un valor de una lista dependiendo de una variable dada INPUT - ingresa datos durnte la ejecucución de un programa directamente del teclado RANDOM - breve para RANDOMIZE, resetea los números aleatorios de forma aleatoria FNEND - completa una definición mutilínea de una función de usuario DEF CHANGE - cambia un caracter de una cadena en su valor ASCII y viceversa RESTORE - vuelve al inicio de una lista READ-DATA. COT - función cotangente DET - usado soalmente con MAT, devuelve la determinante de una matriz dada INT - función de valor entero NUM - usado con con MAT INPUT, captura cada valor tipeado para su comparación RND - sin argumentos, genera un valor aleatorio entre 0 y 1 SGN - da 1 para valores positivos, -1 para los negativos o 0 si es cero. Nuevos comandos DTSS EDIT - edita o combina programas LENGTH - da el largo del programa imprimiendo el número de caracteres que lo componen LISTNH - genera listados sin cabecera con LIST STATUS - da el estado del teletipo en uso, si está activo o en pausa o modo edición TTY - ofrece información más completa sobre el teletipo, el usuario y estado. Comandos de EDIT EDIT RESEQUENCE - remumera el programa EDIT PAGE - lista con formato paginado EDIT DELETE - borra lineas del programa EDIT EXTRACT - extrae líneas del listado EDIT LIST - lista líneas o bloques de líneas EDIT WEAVE - permite entrelazar hasta nueve programas, reteniendo su numeración EDIT APPEND - añade un programa al final de otro EDIT MERGE - inserta un programa en otro y renumera todo si es necesario EDIT MOVE - mueve o traslada líneas de lugar EDIT TRACE - añade textos al programa y lo ejecuta EDIT RUNOFF - produce listado paginado pero sin números de línea EDIT EXPLAIN xx - da una explicación sobre la instrucción xx de EDIT Características de esta versión. Retuvo la sentencia MAT y el punto y coma para PRINT. PRINT X;Y imprime los números con 5 espacios en blanco entre ambos. ON GOTO tiene otra variante sintáctica posible: ON THEN MAT ahora permite trabajar también con cadenas, no solo con números como era al inicio Los signos que no pueden ser usados en el nombre de un programa son: '*', ',', ';', '/' y '$'. Ejemplos del uso de sentencias exclusivas de este BASIC 10 DEF FNM(X,Y) 20 LET FNM = X 30 IF Y<= x THEN 50 40 LET FNM = Y 50 FNEND 5 REM THIS PROGRAM INVERTS AN N-BY-N HILBERT MATRIX 10 DIM A(20,20),B(20,20) 20 READ N so MAT A = CON(N,N) so FQR 1 = 1 TO N 60 FOR J = l TO N 70 LET A(I,J) = l/(I+J-1) 80 NEXT J 90 NEXT I 100 MAT B = INV(A) I15 PRINT "INV(A) =", 120 MAT PRINT B; 125 PRINT 130 PRINT "DETERNINANT OF A =" DET 190 DATA 4 199 END 5 DIM A(65) I0 READ A$ 15 CHANGE A$ TB A 20 FOR I= 0 TO A(0) 25 PRINT A(I)$ 30 NEXT I 40 DATA ABCDEFGHIJKLMNBPQRSTUVWXYZ 45 END 5 DIM V(l28) IO PRINT “WHAT DO YOU WANT THE VECTOR V TO BE"; 20 MAT INPUT V 50 LET V(0) = NUM 40 CHANGE V TO A$ 50 PRINT A$ 60 GO TO IO 70 END Uso de librerías No hay mención alguna sobre el uso de librerías en el manual de 1964, pero si está brevemente mencionado en el apéndice B del manual de 1968. Los archivos de librería son programas que han sido sAlvados para que sean accesibles libremente por todos los usuarios. Se diferencian de los programas comunes de usuario porque tiene tres asteriscos al final del nombre. Ejemplo: BASICT***. BASIC 1970 La quinta edición añadió la posibilidad del manejo de ficheros de datos. Ahora PRINT e INPUT operaban con ficheros secuenciales y para el acceso directo READ en asociación con RESET y WRITE llevaban a abo esa función. Se añadieron las funciones LOC y LOF además de EOF o END para capturar el final del fichero. También se añadió la opción de invocar un programa BASIC desde otro, mediante CHAIN y COMMON. DEF ahora incluía manejo de cadenas y se añadieron nueas funciones como LEN, STR$, VAL, ASC,; así como CLK$ (por clock=reloj), DAT$, TIM y USR$ para saber el número del usuario en curso. ASí como se usó ' como forma breve de REM. La sexta edición reemplazó CHAIN y COMMON por CALL y SUB ... ENDSUB. La sentencia FILE se volvió más parecida al OPEN de los BASICs que le sucedieron. Como nueva función de cadena apareció SEG$ (equivalente a su sucesor MID$), POS y concatenación mediante &. Así como PRINT USING para presentaciones fomateadas como lo hacia FORTRAN. BASIC 1976 Al añadirsele programación estrucuturada, surgió el SBASIC o DSS (Darmouth Structure Basic) el Basic estructurado de Darmouth. El S-Basic usaba estructuras tipo ALGOL-68 en vez de las implementadas en PASCAL. Las estrucuturas eran multilíneas y usaban las sentencias DO ... LOOP dentro de las cuales se incluian WHILE, UNTIL y FOREVER. También incluía la IF THEN sentencias, originalmente del BASIC-PLUS de la DEC y expandiendo la sintaxis haciendolo multilíneas, cerrandolo mediante CONTINUE. Otra mejora fue SELECT-CASE. El SBASIC coexistió con la 6ta. edición y su preconpilador convertía el código fuente a su versión 6 para su apropiada compilación y ejecucuón. Otro añadido fue el poder hacer diseños gráficos mediante trazadores. Para esto rquería de las sentencias PLOTTER y WINDOW para enseguida dibujar usando la orden PLOT x,y{;z,w}. La 7ma. edición en cambio era una vrsión del SBASIC con su propio sistema de compilación. entre sus mejoras estaba el que el programa podía llamar a su vez a otros programas mediante la técnica de "overlay", lo que permitía dividir un programa en varias partes. Otra mejora fue añadir recursión a las subrutinas. BASIC 1982 Tras la aparición del BasicPlus en 1972, y el Basic Altair en el 75 (el primer Basic de Microsoft), el BASIC ANSI (American National Standards Institute) Instituto Nacional Estadounidense de Estándares desaarrolla el Basic Minimo (en el 76) y el Basic Estandar (originalmente del 78) es implementado por Darmouth como su octava versión en el 82. ERRORES DEL BASIC 1964 DIMENSION TOO LARGE - El tamaño de una matriz es mayor al espacio disponible para almacenamiento. ILLEGAL CONSTANT - El valor de una variable es más largo de 9 cifras. ILLEGAL FORMULA - La expresión que se calcula es erronea. ILLEGAL RELATION - La condición indicada en un IF-THEN no es una de las 6 posibles. ILLEGAL LINE NUMBER - Se ha tratado de guardar una línea de código de más de 5 dígitos. ILLEGAL INSTRUCTION - No se ha usado uno de los 15 comandos de BASIC disponibles. ILLEGAL VARIABLE - Nombre de variable incorrecto. INCORRECT FORMAT - Error de sintaxis en la línea indicada. END IS NOT LAST - El comando END no es la última línea del programa. NO END INSTRUCTION - El programa no acaba con el comando END. NO DATA - Un comando READ intenta leer más valores de los DATA disponibles. UNDEFINED FUNCTION - Se intenta ejecutar una función no definida. UNDEFINED NUMBER - Un comando GOTO o IF-THEN hace referencia a un número de línea inexistente. PROGRAM TOO LONG - El programa es demasiado largo. TOO MUCH DATA - Hay demasiados valores en líneas DATA. TOO MANY LABELS - El largo total de todas las etiquetas impresas excede el límite. TOO MANY LOOPS - Hay más de 26 bucles encadenados. NOT MATCH WITH FOR - Un comando NEXT no tiene el FOR correspondiente. FOR WITHOUT NEXT - Un bucle no tiene NEXT. CUT PROGRAM OR DIMS - Se intentan crear más matrices del espacio disponible. SUBSCRIPT ERROR - Si hace referencia a una matriz con un valor mayor del definido. ILLEGAL RETURN - Un comando RETURN no ha sido llamado por un GOSUB. ERRORES DEL BASIC 1968 ILLEGAL FORMAT - reemplaza al mensaje "incorrect format" NO NUMERIC DATA - reemplaza a "no data" para datos numéricos NO STRING DATA - igual que el anterior pero para cadenas UNDEFINED FUNCTION FN_ reemplaza a su equivalente en Basic 64 UNDEFINED LINE NUMBER - en vez de "undefined number" NEXT WITHOUT FOR - se halló un NEXT sin su respectivo FOR Basic Verdadero Desarrollado en el 83 como el sucesor del S-Basic de Darmouth, pero introducido en 1985, True Basci (Basic Verdadero) era compilado y salieron vrsiones para MS-DOS, MS Windows, y Mac OS Clásico. También hubieron versiones para el TRS-80 Color Computer, Amiga y Atari ST además de UNIX. La última versión de True Basic es la 6 y el paquete completo al momento de escribir estas notas es de $149 y el más básico de $19. En su WEB oficial es posible descargar en forma gratuita, solamwente demos, utilidades y manuales. En cuanto al original BAsic de DArmouth, existen programas ya sea simuladores o emuladores o interpretes que permiten escribir listados en la versión de 1964. EN EL SPECTRUM Hasta el momento de escribir estas notas, no existe emulación, simulación, intérprete o compilador de éste BASIC ni siquiera de su versión 1964 al menos, para el ZX Spectrum, la cual no debería de ser dificil de implementar en un Spectrum. Por ejemplo, el Basic de 1964, practicamente todas las sentencias y funciones existen en el Basic Sinclair y en cuanto a los comandos DTSS, estos también están presentes o tienen sus equivalentes. Considerando eso, lo más sencillo es convertir todos los listados del Basic Darmouth al Spectrum. La simulación se mejoraría con 64 columnas. Ahora lo único que necesitamos es repiicar solamente el DTSS mediante una rutina en C.M. con los comandos requeridos. Y ya que algunos comandos son identicos a los del Basic Sinclair, podríamos usar un prefijo como el '*' o el punto para empezar el comando. La otra opción es alterar la sintaxios de NEW y SAVE para enseguida añadir los comandos faltantes como SCR, OLD y otros, mientras dejamos LIST, RUN, STOP Y CAT sin alterar. Nuestro hipotético DTSS para Spectrum tendría las sigtes. características: *HELLO nn - donde nn= un número de usuario para iniciar una sesión *NEW n$ - donde n$= nombre del programa a crear *OLD{n$} - n$= el nombre de programa a cargar *SAVE - sin parámetros, salva el programa con el nombre dado en *NEW *SCR - haría lo mismo que el NEW del Basic *BYE - cierra la sesión del usuario pero sin salir del DTSS *SYSTEM - abandona el sistema DTSS y devuelve el control al Basic Sinclair Suficientes para un sistema de cintas. Si se adapta a disco o Microdrives, entonces sí le añadimos: *RENAME n$ - renombraría programa salvado en disco o Microdrive *UNSAVE n$ - eliminaría programa salvado ya sea en microdrive o disco *LIST x{,y}- una mejora al LIST del Spectrum para listar de x a y líneas si queremos. También se puede hacer que el programa al cargar nos de el sigte. mensaje inicial y las preguntas correspondientes: > DTTS para Zx Spectrum > HELLO - ingrese su número de usuario > SYSTEM--BASIC > Nuevo o antiguo? - Ingrese NEW o OLD > Ingrese nombre del nuevo problema (si se tipeó NEW) > Nombre del problema a cargar (si se tipeó OLD) > READY Y tras este último mensaje ya sabemos que el Spectrum espera a que tipeemos algo en Basic. (c)2020-2021 zx_if1@hotmail.com