Integer BASIC es un intérprete de BASIC escrito por Steve Wozniak para las computadoras Apple I y Apple II . Originalmente disponible en casete para Apple I en 1976, luego incluido en ROM en Apple II desde su lanzamiento en 1977, fue la primera versión de BASIC utilizada por muchos de los primeros propietarios de computadoras domésticas . [2]
El único tipo de datos numérico era el número entero; No se admitían números de coma flotante . El uso de números enteros permitió almacenar números en un formato de 16 bits mucho más compacto que podía leerse y procesarse más rápidamente que los formatos de punto flotante de 32 o 40 bits que se encontraban en la mayoría de los BASIC de la época. Esto lo hizo tan rápido que Bill Gates se quejó cuando superó a Microsoft BASIC en los puntos de referencia. Sin embargo, esto también limitó su aplicabilidad como lenguaje de propósito general. [a]
Otra diferencia con otros BASIC de la época es que Integer BASIC trataba las cadenas como matrices de caracteres, similar al sistema en C o Fortran 77 . Se accedió a las subcadenas mediante división de matrices en lugar de funciones de cadena. Este estilo se introdujo en HP Time-Shared BASIC y también se puede encontrar en otros BASIC contemporáneos basados en HP, como North Star BASIC y Atari BASIC . Contrastaba con el estilo encontrado en los BASIC derivados de DEC , incluido Microsoft BASIC .
El lenguaje se desarrolló inicialmente con el nombre GAME BASIC y se lo denominó simplemente Apple BASIC cuando se introdujo en Apple I. Se convirtió en Integer BASIC cuando se transfirió a Apple II y se envió junto con Applesoft BASIC , un puerto de Microsoft BASIC que Incluye soporte de punto flotante. Integer BASIC fue eliminado gradualmente a favor de Applesoft BASIC a partir del Apple II Plus en 1979.
En su último año de secundaria , el profesor de electrónica de Steve Wozniak consiguió que los estudiantes más destacados de la clase tuvieran prácticas en empresas de electrónica locales. Wozniak fue enviado a Sylvania donde programó en FORTRAN en un IBM 1130 . [4] Ese mismo año, General Electric colocó una terminal en la escuela secundaria que estaba conectada a una de sus computadoras centrales que ejecutaban su servicio BASIC de tiempo compartido , que estaban promocionando fuertemente en ese momento. Después de tres días de acceso, se pidió a los estudiantes que escribieran cartas explicando por qué la escuela debería recibir una terminal de forma permanente, pero sus esfuerzos finalmente no tuvieron éxito. [1]
Algunos años más tarde, Wozniak trabajaba en Hewlett-Packard (HP) ejecutando simulaciones de diseños de chips y distribución lógica para calculadoras. [1] HP hizo grandes avances en el mercado de las minicomputadoras con sus máquinas HP serie 2000 ejecutando una versión personalizada de tiempo compartido de BASIC . Por aproximadamente 100.000 dólares , se podría construir una máquina razonablemente equipada que pudiera soportar entre 16 y 32 usuarios ejecutando programas BÁSICOS. [5] Si bien era caro, todavía era una fracción del costo de las máquinas mainframe [b] y, para los usuarios habituales, menos que los servicios de tiempo compartido. [c] HP siguió esto con la HP 9830 , una máquina de escritorio por 10.000 dólares (equivalente a 75.000 dólares en 2022) que también ejecutaba BASIC, al que Wozniak tenía acceso. [9]
Olí el viento y supe que la clave para que mi computadora fuera buena (popular) era incluir un lenguaje de alto nivel y que tenía que ser BÁSICO.
Steve Wozniak [1]
En enero de 1975 se anunció el Altair 8800 y desató la revolución de las microcomputadoras . En marzo, Wozniak asistió a la primera reunión del Homebrew Computer Club y comenzó a formular el diseño de su propia computadora. Uno de los software más importantes para Altair, y uno de los más pirateados , fue Altair BASIC de la recién formada Microsoft . [10] Wozniak concluyó que su máquina tendría que tener un BASIC propio, que, con suerte, sería el primero para el procesador MOS Technology 6502 . Como el idioma necesitaba 4 KB de RAM, hizo que esa fuera la memoria mínima para el diseño. [1]
Las referencias de Wozniak para BASIC fueron una copia de 101 BASIC Computer Games y un manual de HP BASIC. [1] No sabía que el BASIC de HP era muy diferente de la variedad DEC BASIC utilizada en 101 Games , que también era la base del BASIC de Microsoft para Altair. Basándose en estas fuentes, Wozniak comenzó a esbozar un diagrama de sintaxis para el idioma. El diseño inicialmente incluía soporte de punto flotante, pero aún con la esperanza de publicar el primer BASIC en el 6502 y convertirse en "una estrella", decidió abandonar el punto flotante y escribir un sistema matemático entero separado para ahorrar algunas semanas de tiempo de programación. [1]
Wozniak describiría más tarde su lenguaje como "destinado principalmente a juegos y usos educativos". [11] Refiriéndose a él durante el desarrollo como "JUEGO BÁSICO", Wozniak escribió el código a mano, traduciendo las instrucciones del código ensamblador a sus equivalentes en código de máquina y luego cargando el resultado en su computadora. [12] Sin ninguna formación sobre cómo escribir un lenguaje informático, utilizó su experiencia en calculadoras HP para implementar una máquina de pila para interpretar expresiones. Una vez que las rutinas básicas estuvieron en funcionamiento, trabajó en los otros comandos uno por uno de forma modular. Con cada visita al club Homebrew, demostró algunas características más agregadas en el último mes. [1]
Fue el día más satisfactorio de mi vida... Demostré Breakout [en Homebrew], totalmente escrito en BASIC... Después de diseñar juegos arcade de hardware, supe que poder programarlos en BASIC iba a cambiar el mundo.
Steve Wozniak [9]
A principios de 1976, en los anuncios de su computadora Apple I , Apple Inc afirmó que "nuestra filosofía es proporcionar software para nuestras máquinas de forma gratuita o a un costo mínimo" [13] y "sí, amigos, Apple BASIC es gratuito". [14] Esto se imprimió poco después de la infame Carta abierta a los aficionados de Bill Gates que sugería que la gente le estaba robando copiando versiones de Altair BASIC . [15]
Wozniak había ayudado a Steve Jobs , que trabajaba para Atari , con un rediseño de Breakout . [16] En algún momento posterior, decidió ver si se podía escribir el juego en BASIC. Agregó comandos para leer los controladores de paletas y, tras una serie de ediciones rápidas, tuvo una versión del juego en funcionamiento. Para mejorar su jugabilidad, añadió un altavoz para hacer clics cuando la pelota golpea las cosas. Mientras se lo mostraba a Jobs, Wozniak demostró que podía cambiar rápidamente los colores que usaba su juego, simplemente alterando el código fuente . Wozniak escribió más tarde que había demostrado que "el software era mucho más flexible que el hardware" y que él y Jobs se dieron cuenta de que "ahora cualquiera podía crear juegos arcade sin tener que diseñarlos en hardware". [1]
Wozniak completó una biblioteca de punto flotante para el 6502 y la publicó en la edición de agosto de 1976 del Dr. Dobb's Journal . [17] Esta biblioteca pasó a formar parte posteriormente de las ROM para Apple II . [18] Wozniak comenzó a trabajar en la adaptación del código de punto flotante al BASIC de Apple, pero se desvió en la tarea de diseñar un controlador de disquete para lo que se convirtió en el Disk II . Mike Markkula dijo que la compañía asistiría al Consumer Electronics Show en Las Vegas si el sistema de disco estuviera listo a tiempo, por lo que Wozniak y Randy Wigginton trabajaron en él sin parar durante las vacaciones de 1977. [19]
Cuando volvió al tema del punto flotante en BASIC, Jobs se quejó de que estaba tardando demasiado. Sin que Wozniak lo supiera, la compañía ya había concertado una licencia con Microsoft para recibir su versión 6502 recientemente completada del código Altair. Al examinar el código de MS, Wozniak decidió que era más fácil agregar soporte gráfico a su código que agregar su propio BASIC de punto flotante, ya que este último requería parchear manualmente el código de máquina original mientras que el de MS estaba escrito en ensamblador y se modificaba más fácilmente. El desarrollo del BASIC de Apple terminó a favor de lo que se convirtió en Applesoft BASIC . Wozniak señaló más tarde: "Mi mayor decepción fue recurrir a funciones de cadena horribles como y en lugar de las mías". [19] [d]LEFT$(VAR, 5)
MID$(VAR2,5,3)
Cuando Apple II se lanzó en el verano de 1977, Integer BASIC se entregó en ROM, mientras que Applesoft BASIC se envió en casete. Esto cambió con la introducción del Apple II Plus en 1979, cuando se puso Applesoft en la ROM. [20]
Como la mayoría de las implementaciones de BASIC de la época, Integer BASIC actuó como intérprete de lenguaje y como entorno de edición de líneas. Cuando se ejecutaba BASIC, se mostraba un >
símbolo del sistema donde el usuario podía ingresar declaraciones. [21] [e] A diferencia de las plataformas de computadoras domésticas posteriores , BASIC no era el entorno predeterminado cuando inicié Apple, normalmente se iniciaba en el monitor . BASIC se inició presionando Ctrl+ . [22]BReturn
Las declaraciones que se ingresaron con números iniciales se ingresan en el almacenamiento del programa para "ejecución diferida", [23] ya sea como nuevas líneas o reemplazando cualquiera que pudiera haber tenido el mismo número anteriormente. [24] Las declaraciones que se ingresaban sin un número de línea se denominaban comandos y se ejecutaban inmediatamente. [f] Los números de línea pueden ser de 0 a 32767, [25] [g] y las líneas pueden contener hasta 128 caracteres. [27]
Integer BASIC también incluía el AUTO
comando para ingresar automáticamente números de línea en un número inicial determinado como AUTO 100
, sumando 10 al último número con cada nueva línea. AUTO 300,5
comenzaría a numerar en la línea 300 de cinco en cinco; 300, 305, etc. La numeración automática se desactivó ingresando MAN
. [28]
Una característica interesante del editor era que se podía reservar una sección de la pantalla como "ventana", donde se realizaban las actualizaciones en vivo. Normalmente, esto era toda la pantalla, pero podría limitarse a un área más pequeña ingresando POKE
valores en las ubicaciones de memoria 32 a 35. [29] Esta función podría usarse para crear un área de texto editable mientras el resto de la pantalla estaba en modo de gráficos. . [30]
Como en la mayoría de los BASIC, los programas se iniciaban con el RUN
comando y, como era común, podían dirigirse a un número de línea particular como RUN 300
. [31] La ejecución podría detenerse en cualquier momento usando + [32] y luego reiniciarse con tinue, a diferencia del método más típico . [33]CtrlCCON
CONT
Para la ejecución paso a paso, la TRACE
instrucción podría usarse en el símbolo del sistema o colocarse dentro del programa mismo. Cuando se activó, se imprimieron los números de línea para cada línea que visitó el programa. La función se puede desactivar nuevamente con NOTRACE
. [34]
Una característica algo inusual fue el DSP
comando (para "mostrar"). Cuando se encuentra en un programa, a partir de ese momento se mostrará cualquier cambio en el valor de una variable. Por ejemplo, DSP X
mostraría el valor de X cada vez que cambiara, junto con el número de línea donde ocurrió el cambio. [35] Al igual que con TRACE, DSP se desactivó con NODSP
. [26]
Donde Dartmouth BASIC y HP-BASIC limitaron los nombres de las variables a un máximo de dos caracteres (ya sea una sola letra o una letra seguida de un dígito), y donde MS-BASIC permitió una letra seguida de una letra o dígito opcional (ignorando los caracteres posteriores), Integer BASIC era inusual al admitir cualquier nombre de variable de longitud (por ejemplo, SUM, GAMEPOINTS, PLAYER2). La única advertencia era que los nombres de las variables no podían contener palabras reservadas; por ejemplo, ESTECOLOR y COLORIDO eran nombres de variables no válidos porque contenían la palabra clave COLOR
, un comando del sistema. [36] Además, las líneas estaban limitadas a 128 caracteres, por lo que los nombres de las variables no podían exceder esa longitud. [27]
Integer BASIC, como su nombre lo indica, utiliza números enteros como base para su paquete matemático. Estos se almacenaban internamente como un número de 16 bits, little-endian (como lo es el 6502). Esto permitió un valor máximo para cualquier cálculo entre -32767 y 32767; aunque el formato también podría almacenar el valor -32768, BASIC no pudo mostrar ese número. Los cálculos que dieron como resultado valores fuera de ese rango produjeron un >32767 ERR
. [37]
Los operadores infijos incluyen +
(suma), -
(resta), *
(multiplicación), /
(división), MOD (resto) y exponente usando el ^
carácter. Operadores binarios incluidos AND
, OR
y NOT
. Las comparaciones binarias incluyeron el conjunto estándar de =
, >
, <
, >=
, <=
y <>
el inspirado en HP #
, que era equivalente a <>. [38]
Sólo se permitieron matrices unidimensionales, limitadas en tamaño únicamente por la memoria disponible. [39] Las funciones matemáticas eran escasas; solo se admitieron ABS
(valor absoluto), SGN
(signo) y (número aleatorio). [40] A diferencia de las versiones derivadas de MS, donde el parámetro se ignoraba y siempre devolvía un valor 0..<1, Integer BASIC usaba el parámetro; devolvió un número entero de 0 a 5. [41]RND
RND
RND(6)
El manejo de cadenas de Integer BASIC se basó en el sistema de HP BASIC. Esto trataba las variables de cadena como matrices de caracteres que debían DIM
editarse antes de su uso. Esto es similar al modelo en C [42] o Fortran 77 . [43] Esto contrasta con los BASIC similares a MS, donde las cadenas son un tipo intrínseco de longitud variable. [44] Antes de que los BASIC derivados de MS se convirtieran en el estándar de facto , este estilo no era infrecuente; North Star BASIC [45] y Atari BASIC [46] utilizaron el mismo concepto, al igual que otros.
Las cadenas en Integer Basic usaban una cantidad fija de memoria independientemente de la cantidad de caracteres utilizados en ellas, hasta un máximo de 255 caracteres. [47] Esto tenía la ventaja de evitar la necesidad de la recolección de basura del montón que era notoriamente lenta en MS BASIC [h] pero significaba que las cadenas que eran más cortas que la longitud declarada se desperdiciaban.
El acceso a subcadenas se proporcionó mediante la sintaxis de división de matrices . Por ejemplo, imprimió los primeros seis caracteres de , caracteres del 0 al 5. [49] [49] [i] La concatenación se proporcionó usando el mismo sistema, reemplazó cualquier carácter que comenzara en la posición 5 con la cadena "ABC". [50] Esto contrasta con el manejo de cadenas estilo DEC/MS que utiliza funciones de cadena como para acceder a subcadenas y para la concatenación. [51] [j]PRINT A$(0,5)
A$
A$(5)="ABC"
MID$
+
Como muchas de las características que proporcionarían las funciones de cadena se proporcionaron mediante la división de matrices, se redujo la selección de funciones de cadena. LEN
devolvió la longitud de una cadena [47] y ASC
devolvió el código numérico ASCII para la primera letra de una cadena. [52] Carecía de un equivalente CHR$
que devolviera el carácter ASCII con un código numérico determinado. [53]
Cuando se lanzó, el único controlador de juegos de Apple era el controlador de paleta , que tenía dos controladores en un solo conector. La posición del controlador se puede leer usando la PDL
función, pasando el número del controlador, 0 o 1, como , devolviendo un valor entre 0 y 255. [54] [k]A=PDL(0):PRINT A
Las máquinas Apple no incluían hardware de sonido dedicado, sólo un simple "biper". La producción de sonidos se logró mediante PEEK
la ubicación del altavoz en el mapa de memoria, -16336. [l] Echar un vistazo repetidamente a ese valor produjo tonos, y el manual sugirió usar una expresión matemática para hacer esto, como . [56]S=PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)
El soporte para gráficos fue más detallado. El modo de gráficos se activó con la GR
declaración y se desactivó con TEXT
. [57] El dibujo era modal y normalmente comenzaba emitiendo un comando para cambiar el color, lo que se lograba estableciendo una pseudovariable; COLOR=12
Establecería el color del dibujo en 12, verde claro. Luego, se podría PLOT 10,10
producir un solo punto de ese color, [58] HLIN 0,39 AT 20
dibujar una línea horizontal en la fila 20 que abarque la pantalla, o VLIN 5,15 AT 7
dibujar una línea vertical más corta en la columna 7. [59] A=SCRN X,Y
devolvió el color de la pantalla en X ,Y. [52] [m]
Integer BASIC carecía de comandos personalizados de entrada/salida y también carecía de la DATA
declaración y el archivo READ
. Para ingresar y sacar datos de un programa, la funcionalidad de entrada/salida se redirigía a una ranura de tarjeta seleccionada con PR#x
y IN#x
, que redirigía la salida o entrada (respectivamente) a la ranura numerada. A partir de entonces, los datos podrían enviarse a la tarjeta mediante PRINT
comandos convencionales y leerse mediante INPUT
. [52]
Integer BASIC incluía una TAB
característica que posicionaba el cursor en una columna determinada del 0 al 39. Se diferenciaba de las versiones encontradas en la mayoría de los BASIC en que era un comando con un número siguiente, a diferencia de una función con el valor entre paréntesis; uno movería el cursor a la columna 10 usando TAB 10
Integer BASIC [60] mientras que en MS esto sería PRINT TAB(10)
. Además, el VTAB
comando funcionó de manera similar TAB
pero agregó espacios verticales en lugar de horizontales. Por razones no explicadas, en este caso las coordenadas eran de 1 a 24 en lugar de 0 a 23. [61]
Integer BASIC incluía un POP
comando para salir de los bucles. [52] Esto sacó el elemento superior de la pila FOR. Atari BASIC también admitía el mismo comando, [62] mientras que North Star BASIC usaba EXIT
. [63]
Las ROM BASIC de Integer también incluían un monitor de código de máquina , un "miniensamblador " y un desensamblador para crear y depurar programas en lenguaje ensamblador . Wozniak ensambló a mano el monitor como el primer programa del Apple II y luego lo usó para escribir Integer BASIC. [64] [65] [2]
Apple BASIC tenía los siguientes comandos: [66]
AUTO val1 , val2 CLR [ BORRAR ] DEL val1 , val2 LIST val1 , val2 RUN val1 SCR [ SCRATCH / NEW ] HIMEM = expr LOMEM = expr ( LET ) var = expr INPUT ( solicitud ,) var1 , var2 ... IMPRIMIR elemento ( s ) TAB expr FOR var = expr1 A expr2 PASO expr3 SIGUIENTE var SI expr ENTONCES declaración SI expr ENTONCES número de línea GOTO expr GOSUB expr RETURN DIM var1 ( expr1 ), var2 ( expr2 ) ... REM texto FINALIZAR POKE expr1 , expr2 CALL expr Funciones: ABS (), SGN (), PEEK (), RND (), LEN ()
Integer BASIC agregó lo siguiente: [67] [68]
COLOR = expr CON [ CONTINUAR ] DSP GR HLIN expr1 , expr2 AT expr3 MAN NUEVO [ reemplaza SCR ] NOTRACE PLOT expr1 , expr2 POP TEXT TRACE VLIN expr1 , expr2 AT expr3 Función: ASC (), PDL (), SCRN ( X , Y )
Integer BASIC leyó las líneas escritas por el usuario desde un búfer y las ejecutó a través de un analizador que generó una serie de tokens . Como parte de este proceso, se detectaron y enumeraron errores de sintaxis simples. Si el análisis fue exitoso, el número de línea (si está presente) se convirtió del formato decimal ASCII a un entero de 16 bits y las palabras clave a un token entero de 7 bits. [64]
Algunas palabras clave estaban representadas por varios tokens; por ejemplo, donde Microsoft BASIC tenía un token para la palabra clave PRINT
, Integer BASIC tenía tres tokens: uno si la palabra clave iba seguida de ningún argumento, otro si iba seguida de una expresión aritmética y otro si iba seguida de una cadena literal. [69]
Los literales numéricos, como el valor 500, se convirtieron a su representación binaria de 16 bits (dos bytes), en este caso, $01F4 hexadecimal . Para indicar que se trataba de un valor y no de una palabra clave, se insertó un solo byte entre $B0 y $B9 delante del valor de dos bytes. [n] Los literales de cadena, como "HELLO WORLD", se convirtieron estableciendo el bit alto de cada carácter para que se almacenara como $C1 . Los nombres de las variables se convirtieron de la misma manera, con las letras convertidas para tener el bit alto activado y cualquier dígito en el nombre representado por los correspondientes $B0 a $B9 , de modo que la variable se tokenizaría como $C1B5 . [64]A
A5
Si la línea se ingresó sin un número de línea, el código se ejecutó directamente desde el búfer. Si tenía un número de línea, se copiaba del búfer al área de almacenamiento del programa. [64]
El intérprete de tiempo de ejecución utilizó dos pilas para la ejecución: una para las palabras clave de la declaración y la otra para evaluar los parámetros. A cada declaración se le asignaron dos prioridades: una que indicaba dónde debería ocurrir en una operación de varios pasos, como una cadena de operaciones matemáticas para proporcionar el orden de las operaciones , y otra que sugería cuándo debería ocurrir la evaluación, por ejemplo, calcular los valores internos de una fórmula entre paréntesis. Cuando se encontraban variables, se analizaba su nombre y luego se buscaba en el área de almacenamiento de variables. Si no se encontraba, se agregaba al final de la lista. Luego, la dirección del almacenamiento de la variable, quizás recién creada, se colocó en la pila de evaluación. [64]
Además de Integer BASIC, las ROM de Apple contenían un lenguaje ensamblador personalizado conocido como SWEET16 . SWEET16 se basa en códigos de bytes que se ejecutan dentro de una máquina virtual simple de 16 bits . Este modelo se utilizó para poder direccionar la memoria mediante punteros indirectos de 16 bits y funciones matemáticas de 16 bits calculadas sin la necesidad de traducirlas al código 6502 de 8 bits de múltiples instrucciones subyacente. Toda la máquina virtual se escribió en sólo 300 bytes. El código puede llamar a SWEET16 emitiendo una llamada de subrutina y luego volver al código 6502 normal cuando se completen las operaciones de 16 bits. [70]
SWEET16 no fue utilizado por el código BASIC principal, pero luego se usó para implementar varias utilidades. Entre ellas se destacó la rutina de renumeración de líneas, que se incluyó en la ROM #1 de Ayuda al Programador, se agregó a modelos posteriores de Apple II y estuvo disponible para la instalación del usuario en ejemplos anteriores. [71]
Aunque Integer BASIC contenía sus propias rutinas matemáticas, las ROM de Apple II también incluían una biblioteca completa de punto flotante ubicada en la memoria ROM entre $F425-$F4FB
y $F63D-$F65D
. El código fuente se incluyó en el manual de Apple II. Los programas BÁSICOS que requieren cálculos de punto flotante podrían CALL
incluirse en estas rutinas. [72]
Debido a que Integer BASIC procesó más código fuente original en tokens, el tiempo de ejecución fue más rápido que las versiones que requirieron análisis de tiempo de ejecución adicional. A modo de comparación, Tiny BASIC tokenizó solo el número de línea, [73] mientras que MS BASIC tokenizó solo las palabras clave. Entonces, por ejemplo, mientras que Integer BASIC convertiría la línea 100 GOTO 200
completamente en tokens que podrían leerse y ejecutarse inmediatamente, en MS BASIC solo se tokenizaría el número de línea e GOTO, el "200" se dejó en su formato ASCII original y tuvo que ser Se vuelve a analizar en un entero de 16 bits cada vez que se encuentra la línea. [74]
Además, trabajar únicamente con matemáticas de números enteros proporciona otro aumento importante en la velocidad. Esto se debe tanto al formato más pequeño de 16 bits que requiere menos accesos a la memoria como a la eliminación de la necesidad de mover el decimal de punto flotante después de los cálculos. Como muchos puntos de referencia informáticos de la época eran pequeños y a menudo realizaban operaciones matemáticas simples que no requerían punto flotante, Integer BASIC derrotó a la mayoría de los demás BASIC. [o]
En uno de los primeros puntos de referencia de microcomputadoras conocidos, los puntos de referencia Rugg/Feldman , Integer BASIC fue más del doble de rápido que Applesoft BASIC en la misma máquina. [76] En Byte Sieve , donde las matemáticas eran menos importantes pero dominaban el acceso a la matriz y el rendimiento de bucle, Integer BASIC tardó 166 segundos mientras que Applesoft tardó 200. [77] No apareció en Creative Computing Benchmark , que se publicó por primera vez en 1983. , momento en el que Integer BASIC ya no se suministraba de forma predeterminada. [78]
La siguiente serie de pruebas, tomadas de los dos artículos originales de Rugg/Feldman, [76] [75] muestran el rendimiento de Integer en relación con el BASIC derivado de MS en la misma plataforma.
Aquí hay un resumen de lo que hizo cada prueba:
La siguiente es una versión de Breakout escrita en la versión de 1977 de Integer BASIC para Apple II, que figuraba en el Mini Manual de Apple II. [79] Hay varios errores conocidos en esta versión. [80]
El programa comienza configurando la pantalla TEXT
y luego CALL -936
borrando la pantalla. Las líneas 20 a 27 y las subrutinas asociadas en las líneas 100 y 200 son el código de selección de color que Wozniak demostró para Jobs. La línea 30 configura la ventana de texto con POKE 32,20
[p] y luego usa una serie de declaraciones COLOR
y VLIN
para dibujar el campo de juego y la visualización de la puntuación en la ventana de texto. Todo el circuito principal va desde la línea 40 a la 90 con subrutinas asociadas. Otra gran cantidad de código cerca del final del programa se ocupa de imprimir la puntuación final. Otras notas de interés incluyen las #
comparaciones (no iguales) en la línea 20, la producción de un sonido de tono alto usando una cadena de PEEK
s en la línea 65 en comparación con un tono más bajo usando un bucle en la línea 70, y la mezcla de gráficos y texto en una sola pantalla. [q]
5 TEXTO : LLAME -936 : VTAB 4 : TAB 10 : IMPRIMIR "*** JUEGO DE BREAKOUT ***" : IMPRIMIR 7 IMPRIMIR "EL OBJETO ES DESTRUIR TODOS LOS LADRILLOS CON 5 BOLAS" : PARA N = 1 A 7000 : SIGUIENTE N 10 DIM A$ ( 20 ), B$ ( 20 ) : GR : IMPRIMIR : ENTRADA " HOLA, ¿CUÁL ES TU NOMBRE? " , A$ : A = 1 : B = 13 : C = 9 : D = 6 : E = 15 : IMPRIMIR "COLORES ESTÁNDAR" ; A$ ; 20 ENTRADA "?" , B$ : SI B$ # "N" Y B$ # "NO" ENTONCES 30 : PARA I = 0 A 39 : COLOR = I / 2 *( I < 32 ) : VLIN 0 , 39 AT I 25 SIGUIENTE I : POKE 34 , 20 : IMPRIMIR : IMPRIMIR : IMPRIMIR : PARA I = 0 A 15 : VTAB 21 + I MOD 2 : TAB I + I +1 : IMPRIMIR I ; : SIGUIENTE I : POKE 34 , 22 : VTAB 24 : IMPRIMIR : IMPRIMIR "FONDO" ; 27 GOSUB 100 : A = E : IMPRIMIR "PARA LADRILLO" ; : GOSUB 100 : B = E : IMPRIMIR "LADRILLO IMPAR" ; : GOSUB 100 : C = E : IMPRIMIR "PADEL" ; : GOSUB 100 : D = E : IMPRIMIR "BOLA" ; : GOSUB 100 30 POKE34 , 20 : COLOR = A : FOR I = 0 A 39 : VLIN0 , 39 ATI : NEXT I : FOR I = 20 A 34 PASO 2 : TAB I +1 : IMPRIMIR I / 2-9 ; : COLOR = B : VLIN 0 , 39 AT I : COLOR = C : FOR J = I MOD 4 A 39 PASO 4 35 VLIN J , J +1 AT I : SIGUIENTE J , I : TAB 5 : IMPRIMIR "PUNTUACIÓN = 0" : IMPRIMIR : IMPRIMIR : POKE 34 , 21 : S = 0 : P = S : L = S : X = 19 : Y = 19 : X = 19 40 COLOR = A : TRAZADO X , Y / 3 : X = 19 : Y = RND ( 120 ) : V = -1 : W = RND ( 5 ) -2 : L = L +1 : SI L > 5 ENTONCES 140 : TAB 6 : IMPRIMIR "BOLA #" ; L : IMPRIMIR : PARA I = 1 A 100 : GOSUB 200 : SIGUIENTE I : M = 1 : N = 0 50 J = Y + W : SI J >= 0 Y J < 120 ENTONCES 60 : W =- W : J = Y : PARA I = 1 A 6 : K = PEEK ( -16336 ) : SIGUIENTE I 55 SI PEEK ( -16287 ) > 127 ENTONCES SW = 1 - SW 60 I = X + V : SI I < 0 ENTONCES 400 : GOSUB 200 : COLOR = A : K = J / 3 : SI I > 39 ENTONCES 70 : SI SCRN ( I , K )= A ENTONCES 90 : SI I ENTONCES 120 : N = N +1 : V =( N > 9 ) +1 : W =( K - P )* 2-5 : M = 1 65 Z = PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( - 16336 )- PEEK ( -16336 ) : IR A 90 70 PARA I = 1 A 6 : M = PEEK ( -16336 ) : SIGUIENTE I : I = X : M = 0 80 V =- V 90 TRAZAR X , Y / 3 : COLOR = E : TRAZAR I , K : X = I : Y = J : IR A 50 99 IMPRIMIR "INVÁLIDO. VOLVER A INGRESAR" ; 100 ENTRADA "COLOR (0 A 15)" , E : SI E < 0 O E > 15 ENTONCES 99 : REGRESAR 120 SI M ENTONCES V = ABS ( V ) : VLIN K / 2 * 2 , K / 2 * 2+1 AT I : S = S + I / 2-9 : VTAB 21 : TAB 13 : IMPRIMIR S 123 Q = PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 ) - PEEK ( -16336 )- PEEK ( -16336 ) 124 SI S < 720 ENTONCES 80 130 IMPRIMIR "FELICIDADES, USTED GANA" . : IR A 150 140 IMPRIMIR "TU PUNTUACIÓN DE " ; S ; " ES " ; : IR A 141 + S / 100 141 IMPRIMIR "¡TERRIBLE!" : IR A 150 142 IMPRIMIR "Pésimo". : IR A 150 143 IMPRIMIR "POBRE". : IR A 150 144 IMPRIMIR "JUSTO". : IR A 150 145 IMPRIMIR "BUENO". : IR A 150 146 IMPRIMIR "MUY BUENO". : IR A 150 147 IMPRIMIR "EXCELENTE". : IR A 150 148 IMPRIMIR "CASI PERFECTO". 150 IMPRIMIR "MISMOS COLORES" ; : IR A 20 200 SI SW ENTONCES 220 : Q =( PDL ( 0 ) -5 )/ 6 : SI Q < 0 ENTONCES Q = 0 205 SI Q > = 34 ENTONCES Q = 34 : COLOR = D : VLIN Q , Q + 5 EN 0 : COLOR = A : SI P > Q ENTONCES 210 : SI Q ENTONCES VLIN 0 , Q -1 EN 0 : P = Q : REGRESAR 210 SI P = Q ENTONCES REGRESAR : SI Q # 34 ENTONCES VLIN Q +6 , 39 EN 0 : P = Q : REGRESAR 220 Q =( Y -5 )/ 3 + RND ( 3 )* SGN ( W )*( X < 10 Y V < 0 ) : SI Q < 0 ENTONCES Q = 0 : IR A 205 400 PARA I = 1 A 80 : Q = PEEK ( -16336 ) : SIGUIENTE I : IR A 40
]
mensaje.CONVERT
comando para convertir una cadena en una matriz de valores ASCII que luego el usuario manipulaba y convertía nuevamente al formato de cadena con un segundo CONVERT
.A=SCRN(X,Y)
.