stringtranslate.com

Sistema Bellota BÁSICO

Acorn System BASIC y Atom BASIC son dos dialectos estrechamente relacionados del lenguaje de programación BASIC desarrollado por Acorn Computers para sus primeras microcomputadoras como Acorn System 3 y Acorn Atom . Desarrollados internamente, tienen una serie de idiosincrasias importantes en comparación con la mayoría de los dialectos BÁSICOS de la era de las computadoras domésticas .

En particular, el lenguaje carecía de declaraciones para muchas de las funciones internas de la máquina y las proporcionaba mediante acceso directo y manipulación de ubicaciones de memoria mediante operadores de indirección en lugar de PEEK y POKE . Ambos también carecían de soporte de punto flotante , aunque esto se podía añadir con una ROM opcional que introducía más idiosincrasias. System y Atom BASIC se diferencian principalmente en que Atom usó el mismo sistema de dirección indirecta para proporcionar una manipulación rudimentaria de cadenas, de la que Standard carecía, y agregó una pequeña cantidad de declaraciones nuevas para gráficos por computadora .

La mayoría de estas rarezas se eliminaron cuando el sistema subyacente se amplió enormemente para producir BBC BASIC en el sucesor de Atom, el BBC Micro . Posteriormente se ofrecieron ROM BBC BASIC a los usuarios de Atom.

Historia

Hermann Hauser utiliza Atom BASIC en el 30 aniversario de BBC Micro.

Acorn Computers se formó en 1978 y comenzó a fabricar una serie de sistemas basados ​​en kits y basados ​​en Eurocard, comenzando con el Acorn System 1 en 1979. Desarrollaron Acorn System BASIC para estas máquinas, [1] un dialecto de números enteros que solo requería 4 KB de memoria en total. [2] El lenguaje tenía una serie de detalles de implementación que lo hacían "altamente no estándar". [3]

El Atom , presentado en 1980, se construyó a partir de partes del System 3 empaquetadas en una sola placa. Los sistemas se entregaban de serie con 2 KB de RAM y 8 KB de ROM, que incluían BASIC y varios controladores de dispositivos . Atom BASIC tuvo solo algunos cambios con respecto a la versión del sistema, agregando soporte para manipulación de cadenas y una pequeña cantidad de comandos gráficos. El Atom era actualizable, con hasta 12 KB de RAM en total y 4 KB adicionales de ROM que agregaban soporte de punto flotante . Esto usaba funciones y operaciones separadas que trabajaban en ellas, indicadas por el símbolo %. [3] Esta elección de símbolo fue desafortunada, ya que Microsoft BASIC usó el signo de porcentaje para indicar números enteros, no punto flotante. [4]

El Atom estuvo en el mercado sólo por un corto período antes de que Acorn comenzara el desarrollo de su sucesor, el Proton. Inicialmente iba a ser una unidad de dos procesadores. El diseño aún estaba en sus primeras etapas cuando una serie de eventos llevaron a que fuera seleccionado como base para el BBC Micro de una sola CPU . [1] En ese momento, hubo comentarios de que definitivamente no debería usar la variedad de BASIC de Acorn, que "prácticamente ningún otro microordenador puede entender" y que "si el nuevo lenguaje se basara en la forma de BASIC de Atom, sería un desastre." [5]

Al final, el sistema de la BBC utilizó un BASIC escrito por Acorn, pero muy modificado. El BBC BASIC resultante era mucho más similar al Microsoft BASIC y luego se ofreció como una actualización del Atom. [6]

Descripción

Como los dos dialectos son muy similares, a continuación nos referiremos principalmente a Atom BASIC y señalaremos las diferencias donde existan.

Edición de programas

Como la mayoría de los BASIC de la época, Atom BASIC utilizaba un editor orientado a líneas con modos directo (inmediato) e indirecto. Al escribir una declaración sin un número de línea, la operación se realizó de inmediato. En su lugar, agregar un número de línea colocó esas declaraciones en el programa almacenado. Una particularidad era que, si bien permitía múltiples declaraciones en una sola línea, el separador entre declaraciones era el punto y coma [7] en lugar de los dos puntos comúnmente utilizados, lo que requería que el usuario convirtiera ese carácter al escribir programas para otras computadoras.

Diseñado para su uso con terminales de computadora , Acorn BASIC no admitía un modo de edición de pantalla completa. Por el contrario, en Commodore BASIC (y muchos otros dialectos de microcomputadoras), se pueden usar las teclas del cursor para moverse hacia arriba en una lista de programas, realizar cambios en la pantalla y luego presionar Returnpara ingresar esos cambios. En Atom, uno podía moverse hacia arriba en una lista usando las teclas del cursor , pero para editar ese texto, se presionaba la tecla para copiarlo al área de entrada donde se podía editar. [8]Copy

Otra diferencia en el Atom fue la clave, que realizaba un reinicio del sistema, borrando potencialmente el programa de la memoria. Para restablecer esto si la tecla se presionó por error, Atom BASIC agregó el comando, que también podría usarse para restablecer un archivo accidental . Un cambio menor fue que se utilizaron números de línea separados por comas hacia y desde los números de línea en lugar del signo menos, para imprimir las líneas 20 a 40. [9]BreakOLDNEWLISTLIST 20,40

El lenguaje también tenía la capacidad de utilizar etiquetas de línea en lugar de números para realizar bifurcaciones . Las etiquetas consistían en una sola letra minúscula escrita inmediatamente después del número de línea. Por ejemplo: [10]

10s IMPRIMIR "*"20 IR A s

La ventaja de este método es que la dirección de memoria de la declaración se almacena en s, lo que significa que la rama, un GOTO, puede moverse directamente a esa línea sin tener que buscar en cada línea del programa el número de línea coincidente. [10] Acorn también permitió el uso de cualquier expresión para producir el número de línea para objetivos de rama, como GOSUB 500+(A*10). [11]

Declaraciones

Las primitivas de Acorn eran similares a otros BÁSICOS de la época y admitían la mayoría de las declaraciones elementales como CLEAR, DIM, END, FOR..TO..STEP..NEXT , GOSUB , GOTO , IF..THEN , INPUT, (opcional). DEJAR, LISTA, CARGAR, IMPRIMIR, REM , REGRESAR , EJECUTAR, GUARDAR, DETENER . [12] Hay una serie de declaraciones comunes que faltan, en particular DATA, READ, RESTORE utilizadas para almacenar datos en un programa, ON..GOSUB, ON..GOTO ramas calculadas y DEF FN para funciones definidas por el usuario. [a]

A estos conceptos básicos, Acorn agregó DO..UNTILla construcción de bucles basados ​​en expresiones probados en el fondo. Los bucles FOR están altamente optimizados mediante el uso de una comparación directa entre su variable de índice y un valor constante que se establece solo una vez al ingresar al bucle. Otra optimización es que se almacena la dirección del FOR, no el número de línea, por lo que cuando se encuentra el NEXT coincidente, el programa puede volver inmediatamente al FOR. Si bien FOR es adecuado para muchos bucles, cuando se necesita más control, por ejemplo al comparar con un criterio más complejo, se puede utilizar la declaración IF:

500 A=A+1510 REM declaraciones adicionales aquí600 SI A>10 Y B>100 ENTONCES 500

La desventaja de este estilo de bucle es que la rama requiere que se busque en el programa la línea 500, lo que, en un bucle, normalmente ocurre muchas veces. En programas grandes, esto puede generar una sobrecarga significativa. Utilizar un DO para este fin ofrece un mayor rendimiento:

500 HACER A=A+1510 REM declaraciones adicionales aquí600 HASTA A>10 Y B>100

En este caso, al igual que el bucle FOR, la dirección del DO se almacena cuando se ingresa el bucle, lo que permite que UNTIL regrese a la parte superior del bucle inmediatamente sin tener que escanear el programa. [14] Tenga en cuenta el caso especial en el que DO puede ir seguido directamente de otra declaración sin que se requiera el separador de punto y coma: A=A+1no forma parte de DO, es una declaración separada. [15]

Entre las adiciones menores se encuentra la WAITdeclaración, que detuvo la ejecución hasta el siguiente tic del reloj, cada 160 de segundo. Esto no espera a un tic completo, sólo hasta el siguiente tic, lo que puede ocurrir inmediatamente. [14] LINK llama a una rutina de lenguaje de máquina , [16] el análogo de CALLo SYSen la mayoría de los dialectos. [17]

Matemáticas, operadores y funciones.

Acorn utilizó enteros con signo de 32 bits para todas las matemáticas, [18] sin soporte estándar de punto flotante . Para manejar la división, que a menudo devuelve una parte fraccionaria, agregaron el %operador para devolver el resto. Por ejemplo, PRINT 7/3devolverá 2, mientras que PRINT 7%3devolverá 1. [19]

Los nombres de las variables pueden consistir sólo en una sola letra, de la A a la Z. [20] Todas las combinaciones de dos letras están reservadas como matrices, por lo que E era un valor único, mientras que EE era una matriz. Todas las matrices requerían una declaración DIM, [21] no asumía una dimensión de 10 como los BASIC de Microsoft . En tiempo de ejecución, la única verificación realizada en una matriz fue que el índice que se pasaba era un valor positivo, por lo que se podía leer en la memoria pasando valores mayores que la dimensión. [22] No admitía matrices multidimensionales. [23]

Las operaciones matemáticas básicas incluían +, -, *, /, % . También admitía operadores lógicos bit a bit, con &, \, : utilizados para AND, OR y XOR, respectivamente. Estos operadores realizan comparaciones, por lo que devuelven 0. El uso de dos puntos para OR [b] es la razón por la que el separador de declaraciones tuvo que usar punto y coma. [24] Tenga en cuenta que estas son independientes de las conexiones lógicas que se encuentran en las declaraciones IF, como , que también son compatibles. [25]1 & 0IF A=1 AND B=0 THEN...

Sólo había dos funciones matemáticas, ABS y RND . ABS funciona como en otros BASIC, devolviendo el valor absoluto de una entrada determinada. RND no lo hace, devuelve un valor entre los valores enteros máximos -ve y +ve. Para usar esto en la forma convencional para devolver un valor entre 0 y un valor positivo dado, entre 0 y 10 por ejemplo, se usa . [26]ABS(RND)%11

Vectores

La mayoría de los BASIC de la época usaban PEEK y POKE para acceder a funciones específicas de la máquina que no estaban integradas en el lenguaje en sí. Acorn no tenía PEEK ni POKE, y utilizó nuevos operadores para proporcionar esta funcionalidad en un sistema más fácil de usar. Los operadores eran ?y !, el primero configuraba o devolvía el byte en una ubicación determinada, y el segundo configuraba o devolvía una "palabra" de 4 bytes. [27] Por ejemplo, ejemplos comunes de PEEK en la mayoría de los dialectos, como PRINT PEEK(4000), se podrían lograr con PRINT ?4000. [28] La mayoría de los dialectos carecían del equivalente del !. [c] Además, se podría usar la misma sintaxis para establecer el valor en la memoria, como un POKE, por ejemplo ?4000=200. [28]

Para ayudar a acceder a datos organizados de forma continua en la memoria, como matrices de números, los operadores podrían aplicarse al lado derecho de una variable. Cuando se usa de esta manera, como A?, el sistema accedía a la memoria en la ubicación de la variable en la memoria. Cualquier número que siguiera al operador se aplicaba como desplazamiento, por lo que, por ejemplo, A?100devolvería el valor del byte 100 ubicaciones después de la ubicación de A en la memoria. [28]

Esto se usaba a menudo con otro concepto exclusivo de Acorn, el "vector". De manera confusa, estos se crearon usando los mismos comandos DIM que una matriz, pero se aplicaron a variables de una sola letra. Cuando se encontraba el DIM, el sistema reservaba tantas ubicaciones en la parte superior de la memoria y luego movía el puntero de la memoria hacia arriba. Esto dejó un bloque de memoria al que luego se podía acceder con los operadores de indirección. Por ejemplo: [28]

10 DIM A(100)20 IMPRIMIR A?10

Lo que imprimirá el valor del byte en la undécima ubicación en A (todos los accesos están indexados a cero). [28] Asimismo, se podrían almacenar valores en la memoria utilizando el mismo operador aplicado antes del nombre de la variable:

!A=123456

Esto convertirá el valor decimal 123456 de ASCII en un número entero y lo almacenará en las ubicaciones de memoria comenzando en la ubicación base para A. [27]

Para facilitar la operación con vectores, Acorn agregó la pseudovariable TOP. Cuando el sistema se inició por primera vez, apuntó a la primera ubicación después del final del programa. Luego se crearon todos los DIM con el valor actual de TOP y luego se actualizó TOP hasta el final del nuevo objeto. Fue posible crear vectores dinámicos manipulando directamente TOP. [30]

Instrumentos de cuerda

Atom BASIC agregó soporte para cadenas pero no admitía variables de cadena ni tenía el concepto de cadena como tipo atómico. En cambio, el sistema vectorial se utilizó para manipular datos de cadena en la memoria, como valores ASCII . [28] Para facilitar este uso, el $operador convirtió los valores en memoria a sus valores ASCII. Este operador continuó leyendo datos de la memoria hasta que encontró un retorno y, cuando escribía datos en la memoria, siempre agregaba un retorno al final. [31] Entonces, mientras PRINT ?Aimprimiría el valor único del byte en la ubicación de A en la memoria como un número, PRINT $Aleería los valores que comienzan en esa ubicación y los imprimiría como una cadena. [31] Por ejemplo:

10 ATENUADO A(12)20 $A="HOLA MUNDO"30 IMPRIMIR $A

Este código puede parecer muy similar al uso de cadenas en otros dialectos, aunque la ubicación de $ en relación con el nombre de la variable cambia. Es especialmente similar a aquellos dialectos que requerían un DIM en todas las cadenas, como HP Time-Shared BASIC o Atari BASIC . Internamente el funcionamiento es muy diferente. En esos dialectos, A y A$ son dos variables diferentes y $ es, de hecho, parte del nombre. En Acorn, A y $A son la misma variable, y $ está aplicando una operación unaria a esa variable. Esto también significa que se pueden usar matrices para cadenas, como $AA(10), que convierte el valor en AA(10) en una cadena. [3]

Este concepto permite acceder a caracteres individuales mediante notación vectorial. Por ejemplo, A?5devolvería el valor ASCII del quinto carácter, 79 para O en este caso, mientras que PRINT $A?5generaría "O". [32] No hay forma de extraer una subcadena en una sola operación, hay que recorrer los caracteres y moverlos uno por uno. La concatenación es posible asignando una variable al final de otra; por ejemplo, $A+LEN(A)=$Bcopia la cadena B al final de A. [33]

El lenguaje tiene solo dos funciones de cadena, LENque busca el carácter de retorno final y devuelve la longitud, y CHdevuelve el valor ASCII de un carácter. CH tiene un formato extraño sin paréntesis, por lo que CH"A"devolvería 65. [32] Por lo demás, es similar al más común ASCque se ve en otros dialectos. [34]

Otro operador nuevo fue #, que convertía un valor numérico en una cadena hexadecimal . Al igual que $, esto podría usarse en cualquier lugar para realizar la conversión. Por ejemplo, A=#4000establece el valor de A en el valor decimal 16384, la ubicación de la memoria de la pantalla. Esto a menudo se combinaba con el operador $ para permitir que las cadenas contuvieran caracteres no imprimibles, como el carácter "cursor arriba". [8]

punto flotante

Se podría agregar soporte de punto flotante con la expansión ROM adicional de 4 KB. Esto utilizó un tamaño de palabra expandido de 40 bits, 32 bits de mantisa con signo seguido de un exponente de 8 bits. [35] Esto significaba que el sistema necesitaba alguna forma de distinguir los datos al leer y escribir desde la memoria, lo cual se manejaba de manera similar al operador de cadena, usando el %prefijo: [35]

%A=123,45

Como el código estaba contenido en una ROM separada de 4 KB, no modificaba las declaraciones existentes como PRINT. En cambio, se introdujo un conjunto de declaraciones completamente nuevo, incluidas FDIM, FIF, FINPUT, FPRINT, FUNITL . Esto significa, por ejemplo, que no se puede si los valores son de punto flotante, sino que se debe hacerlo . Un valor entero se puede convertir a flotante usando y flotante a entero usando el operador flotante, %. [27]IF A=BFIF A=B THEN...FLT

La ROM también incluía una variedad mucho mayor de funciones matemáticas, incluidas ABS, ACS, ASN, ATN, COS, DEG, EXP, FLT, HTN, LOG, PI, RAD, SGN, SIN, SQR, STR, TAN, VAL . [36] convirtió un número de punto flotante en una cadena, como era el caso en otros dialectos, pero en este caso, la cadena se escribió en la memoria y la función devolvió la dirección donde estaba almacenada. Como la cuerda requería almacenamiento el tiempo suficiente para sostenerla, esto a menudo se lograba usando TOP. Por ejemplo: STRSTR$

STR PI, ARRIBA IMPRIMIR $ARRIBA ARRIBA=ARRIBA-LEN(ARRIBA)

Esto convierte el valor de la pseudovariable PI en una cadena que comienza en la ubicación de memoria TOP, imprime la cadena usando $TOP y luego abandona esa memoria. [37]

Entrada/salida

PRINTy INPUTen su mayoría funcionó como en otros dialectos. Surgió una rareza porque los dos puntos y el punto y coma ya se usaban para otros propósitos, dejando solo la coma para separar campos. Para imprimir valores sin espacios entre ellos, los valores se enumeraban con un carácter de espacio entre ellos, como PRINT A B C, un formato que también estaba permitido en muchos otros dialectos, aunque rara vez se usaba. Esto por sí solo no causaría que los números se impriman en formato compacto, porque normalmente se imprimen con espacios a la derecha para que cada uno tenga 8 caracteres de ancho. Esto podría ajustarse cambiando el valor en la @pseudovariable. [38] Se imprimió una nueva línea con una comilla simple, PRINT "HELLO" ' "WORLD". [27] COUNT devuelve la columna del cursor, similar a POSla mayoría de los dialectos. [39]

El dispositivo de almacenamiento predeterminado del Atom era un sistema de casete compacto . Cada archivo se almacenaba como una serie de bloques, cada uno de los cuales contenía un encabezado con el nombre del archivo. [40] Los archivos guardados con SAVE THISFILEse pueden volver a leer con LOAD THISFILE, mientras que *CATse enumeran los nombres de los archivos en el casete a medida que se leen más allá de sus encabezados. [41]

Se podían abrir datos arbitrarios para leerlos usando FINo escribiendo FOUT, y ambos devolvían un identificador de archivo numérico . Los archivos se cerraron con SHUT. Los datos se leyeron o escribieron en formato numérico usando GET, PUT, como bytes individuales con BGET, BPUTy como cadenas usando SGET, SPUT. Devolvieron EXTla longitud del archivo, mientras PTRdevolvieron o establecieron el puntero actual en el archivo, [16] el número de bytes leídos o escritos hasta el momento. [42] Si la ROM de punto flotante estaba presente, agregaba FGET, FPUT. [36]

Por ejemplo:

A=FOUT"AFILE"HAGA BPPON A,88; ESPERAR; ESPERAR; ESPERAR; ESPERAR; HASTA 0

Utilizará BPUTpara escribir una serie de bytes, 88s, hasta que el usuario presione para detener el programa. Luego se pueden volver a leer (después de rebobinar manualmente la cinta) usando: [43]Escape

A=FIN"AFILE"IMPRIMIR $BGET A; HASTA 0

El signo de dólar le dice al sistema que convierta los datos binarios entrantes al formato de cadena, por lo que en este caso, la salida será una serie de X, no 88. [43] Podría parecer que se podría usar SGET en lugar de BGET, pero esto intentaría continuar leyendo el archivo hasta que viera un carácter de retorno, que en este ejemplo no se había escrito. [44]

Soporte de gráficos

Atom tenía gráficos de mapa de bits rudimentarios y Atom BASIC agregó una serie de comandos para admitirlo. CLEARBorró la pantalla, MOVEmovió el cursor gráfico a la ubicación X,Y dada y DRAWdibujó una línea desde la ubicación actual hasta la X,Y proporcionada. [45]

La ROM de punto flotante también incluía soporte para gráficos en color con la adición de la COLOURdeclaración. Al llamar a COLOR con un parámetro del 0 al 3, se establece la salida posterior en ese color. En una pantalla en blanco y negro, los colores se mostraban como tonos de gris. [46]

Notas

  1. ^ Una buena fuente de lo que ya se consideraba el estándar para los BASIC de la era de las microcomputadoras es la introducción a BASIC Computer Games , que presenta las declaraciones que utiliza y habla de excepciones al "BASIC normal". [13]
  2. ^ Probablemente porque parece una barra vertical, que se usa en la mayoría de los textos de matemáticas para OR.
  3. ^ Varios dialectos avanzados como Turbo-BASIC XL incluían comandos como DPEEK"doble vistazo", que devolvían un valor de 16 bits. Estos son similares en concepto a !. [29]

Referencias

Citas

  1. ^ ab Gazzard 2016, pag. 22.
  2. ^ Extraño.
  3. ^ abc Gravamen 1981, pag. 425.
  4. ^ Gravamen 1981, pag. 396.
  5. ^ BBC 1981, pág. 662.
  6. ^ Frutas 1982, pag. 11.
  7. ^ Johnson Davies 1979, pag. 14.
  8. ^ ab Johnson Davies 1979, pág. 65.
  9. ^ Johnson Davies 1979, pag. 7.
  10. ^ ab Johnson Davies 1979, pág. 25.
  11. ^ Johnson Davies 1979, pag. 26.
  12. ^ Johnson Davies 1979, págs. 3–4.
  13. ^ Ahl, David (1978). Juegos de Computadora BÁSICOS . Obrero. pag. XII.
  14. ^ ab Johnson Davies 1979, pág. 37.
  15. ^ Johnson Davies 1979, pag. 35.
  16. ^ ab Lien 1981, pág. 427.
  17. ^ Gravamen 1981, pag. 43.
  18. ^ Johnson Davies 1979, pag. 67.
  19. ^ Johnson Davies 1979, pag. 11.
  20. ^ Johnson Davies 1979, pag. 12.
  21. ^ Johnson Davies 1979, pag. 45.
  22. ^ Johnson Davies 1979, pag. 50.
  23. ^ Johnson Davies 1979, pag. 51.
  24. ^ Johnson Davies 1979, pág. 15.
  25. ^ Johnson Davies 1979, pag. 30.
  26. ^ Johnson Davies 1979, pag. 24.
  27. ^ abcd Gravamen 1981, pag. 426.
  28. ^ abcdef Johnson Davies 1979, pág. 53.
  29. ^ Fetzer, Ron (1985). Documentación ampliada de Turbo-BASIC XL (PDF) .
  30. ^ Johnson Davies 1979, pag. 46.
  31. ^ ab Johnson Davies 1979, pág. 58.
  32. ^ ab Johnson Davies 1979, pág. 59.
  33. ^ Johnson Davies 1979, pag. 61.
  34. ^ Gravamen 1981, pag. 45.
  35. ^ ab Johnson Davies 1979, pág. 162.
  36. ^ ab Johnson Davies 1979, pág. 161.
  37. ^ Johnson Davies 1979, pag. 163.
  38. ^ Johnson Davies 1979, pag. 13.
  39. ^ Gravamen 1981, pag. 73.
  40. ^ Johnson Davies 1979, pag. 10.
  41. ^ Johnson Davies 1979, pag. 9.
  42. ^ Johnson Davies 1979, pag. 151.
  43. ^ ab Johnson Davies 1979, pág. 8.
  44. ^ Johnson Davies 1979, pag. 152.
  45. ^ Johnson Davies 1979, pag. 28.
  46. ^ Johnson Davies 1979, pag. 167.

Bibliografía