Integer BASIC es un intérprete de BASIC escrito por Steve Wozniak para los ordenadores Apple I y Apple II . Originalmente disponible en casete para el Apple I en 1976, luego incluido en la ROM del Apple II desde su lanzamiento en 1977, fue la primera versión de BASIC utilizada por muchos de los primeros propietarios de ordenadores domésticos . [2]
El único tipo de datos numéricos era el entero; no se admitían números de punto flotante . El uso de números enteros permitió almacenar números en un formato compacto de 16 bits 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ó al BASIC de Microsoft en las pruebas comparativas. 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 el Integer BASIC trataba las cadenas como matrices de caracteres, de forma similar al sistema de C o Fortran 77. Se accedía a las subcadenas mediante la segmentación de matrices en lugar de funciones de cadenas. Este estilo se introdujo en HP Time-Shared BASIC y también se podía encontrar en otros BASIC contemporáneos basados en HP, como North Star BASIC y Atari BASIC . Contrastaba con el estilo que se encontraba en los BASIC derivados de DEC , incluido Microsoft BASIC .
El lenguaje fue desarrollado inicialmente bajo el nombre de GAME BASIC y se lo conocía simplemente como Apple BASIC cuando se introdujo en el Apple I. Se convirtió en Integer BASIC cuando se adaptó al Apple II y se envió junto con Applesoft BASIC , una adaptación de Microsoft BASIC que incluía soporte de punto flotante. Integer BASIC fue reemplazado por Applesoft BASIC a partir del Apple II Plus en 1979.
Cuando estaba en el último año de secundaria , el profesor de electrónica de Steve Wozniak organizó que los estudiantes más destacados de la clase tuvieran puestos 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 intensamente en ese momento. Después de recibir tres días de acceso, se les pidió a los estudiantes que escribieran cartas sobre por qué la escuela debería recibir una terminal de forma permanente, pero sus esfuerzos finalmente fueron infructuosos. [1]
Algunos años después, Wozniak trabajaba en Hewlett-Packard (HP) realizando simulaciones de diseños de chips y disposición lógica para calculadoras. [1] HP hizo importantes incursiones en el mercado de las minicomputadoras con sus máquinas de la serie HP 2000 que ejecutaban una versión personalizada de BASIC en modo de tiempo compartido . Por aproximadamente 100.000 dólares , se podía construir una máquina razonablemente equipada que pudiera soportar entre 16 y 32 usuarios ejecutando programas BASIC. [5] Aunque era caro, seguía siendo una fracción del costo de las máquinas mainframe [b] y, para los usuarios intensivos, menos que los servicios de tiempo compartido. [c] HP siguió con la HP 9830 , una máquina del tamaño de una de escritorio por 10.000 dólares (equivalente a 78.000 dólares en 2023) que también ejecutaba BASIC, al que Wozniak tenía acceso. [9]
Olí el viento y supe que la clave para hacer que mi computadora fuera buena (popular) era incluir un lenguaje de alto nivel y que tenía que ser BASIC.
Steve Wozniak [1]
En enero de 1975 se anunció el Altair 8800 , lo que desencadenó la revolución de los microordenadores . En marzo, Wozniak asistió a la primera reunión del Homebrew Computer Club y comenzó a formular el diseño de su propio ordenador. Una de las piezas de software más importantes para el Altair, y una de las más pirateadas , 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 lenguaje 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 BASIC de HP. [1] No sabía que el BASIC de HP era muy diferente de la variedad DEC BASIC utilizada en 101 Games , que también fue la base de Microsoft BASIC para Altair. Basándose en estas fuentes, Wozniak comenzó a esbozar un diagrama de sintaxis para el lenguaje. El diseño inicialmente incluía soporte de punto flotante, pero aún con la esperanza de poder 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 unas pocas semanas de tiempo de programación. [1]
Wozniak describiría más tarde su lenguaje como "pensado principalmente para juegos y usos educativos". [11] Refiriéndose a él durante todo el desarrollo como "GAME BASIC", 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 a su computadora. [12] Sin ningún entrenamiento sobre cómo escribir un lenguaje de computadora, utilizó su experiencia con la calculadora 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 manera 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... Hice una demostración de Breakout [en Homebrew], escrito totalmente en BASIC... Después de diseñar juegos arcade de hardware, sabía que poder programarlos en BASIC iba a cambiar el mundo.
Steve Wozniak [9]
En los anuncios de principios de 1976 para su ordenador Apple I , Apple Inc. afirmó que "nuestra filosofía es proporcionar software para nuestras máquinas de forma gratuita o a un coste mínimo" [13] y "sí, amigos, Apple BASIC es gratuito". [14] Esto se publicó poco después de la infame Carta abierta de Bill Gates a los aficionados 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. Añadió comandos para leer los controladores de paletas y, tras una serie de ediciones rápidas, consiguió tener una versión del juego en funcionamiento. Para mejorar su jugabilidad, añadió un altavoz para hacer clics cuando la bola golpeaba cosas. Mientras se lo mostraba a Jobs, Wozniak demostró que podía cambiar rápidamente los colores que utilizaba 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 de 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 luego pasó a formar parte de las ROM del Apple II . [18] Wozniak comenzó a trabajar en la adaptación del código de punto flotante al Apple BASIC, pero se distrajo 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 iría al Consumer Electronics Show en Las Vegas si el sistema de disco estaba 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 tomando demasiado tiempo. Sin que Wozniak lo supiera, la compañía ya había acordado una licencia con Microsoft para recibir su versión 6502 recientemente completada del código de 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 punto flotante a su propio BASIC, 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 era más fácil de modificar. El desarrollo del BASIC de Apple terminó en favor de lo que se convirtió en Applesoft BASIC . Wozniak señaló más tarde: "Mi mayor decepción fue pasar a las horribles funciones de cadena como y en lugar de las mías". [19] [d]LEFT$(VAR, 5)
MID$(VAR2,5,3)
Cuando se lanzó el Apple II en el verano de 1977, el BASIC Integer se suministraba en ROM, mientras que el BASIC Applesoft se entregaba en casete. Esto cambió con la introducción del Apple II Plus en 1979, cuando se incluyó el Applesoft en la ROM. [20]
Como la mayoría de las implementaciones de BASIC de la época, Integer BASIC actuaba como intérprete del lenguaje y como entorno de edición de líneas. Cuando BASIC se estaba ejecutando, se mostraba un >
símbolo del sistema en el que el usuario podía introducir instrucciones. [21] [e] A diferencia de las plataformas de ordenadores domésticos posteriores , BASIC no era el entorno predeterminado cuando se iniciaba el Apple II, normalmente se iniciaba en el monitor . BASIC se iniciaba pulsando Ctrl+ . [22]BReturn
Las sentencias que se ingresaban con números iniciales se ingresaban en el almacenamiento del programa para su "ejecución diferida", [23] ya sea como líneas nuevas o reemplazando cualquiera que pudiera haber tenido el mismo número anteriormente. [24] Las sentencias que se ingresaban sin un número de línea se denominaban comandos y se ejecutaban inmediatamente. [f] Los números de línea podían ser de 0 a 32767, [25] [g] y las líneas podían contener hasta 128 caracteres. [27]
El BASIC entero también incluía el AUTO
comando para ingresar automáticamente números de línea en un número inicial dado como AUTO 100
, agregando 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 desactivaba 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 tiempo real. Normalmente, se trataba de la pantalla completa, pero se podía limitar a un área más pequeña introduciendo POKE
valores en las posiciones de memoria 32 a 35. [29] Esta característica se podía utilizar para crear un área de texto editable mientras el resto de la pantalla estaba en modo gráfico. [30]
Como en la mayoría de los BASIC, los programas se iniciaban con el RUN
comando y, como era común, se podían dirigir a un número de línea particular como RUN 300
. [31] La ejecución se podía detener en cualquier momento usando + [32] y luego reiniciar con tinue, a diferencia del más típico . [33]CtrlCCON
CONT
Para la ejecución paso a paso, la TRACE
instrucción se podía utilizar en el símbolo del sistema o dentro del propio programa. Cuando se activaba, se imprimían los números de línea para cada línea que visitaba el programa. La función se podía desactivar de nuevo con NOTRACE
. [34]
Una característica un tanto inusual era el DSP
comando (para "mostrar"). Cuando se encontraba en un programa, a partir de ese momento se mostraban todos los cambiosDSP X
en el valor de una variable. Por ejemplo, mostraba el valor de X cada vez que cambiaba, junto con el número de línea donde se producía el cambio. [35] Al igual que con TRACE, el DSP se desactivaba con NODSP
. [26]
Mientras que Dartmouth BASIC y HP-BASIC limitaban los nombres de las variables a un máximo de dos caracteres (una sola letra o una letra seguida de un dígito), y MS-BASIC permitía una letra seguida de una letra o dígito opcional (ignorando los caracteres subsiguientes), Integer BASIC era inusual en admitir nombres de variables de cualquier longitud (por ejemplo, SUM, GAMEPOINTS, PLAYER2). La única salvedad era que los nombres de las variables no podían contener palabras reservadas; por ejemplo, THISCOLOR y COLORFUL eran nombres de variables invá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]
El BASIC de enteros, 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 el 6502). Esto permitía un valor máximo para cualquier cálculo entre -32767 y 32767; aunque el formato también podía almacenar el valor -32768, el BASIC no podía mostrar ese número. Los cálculos que resultaban en valores fuera de ese rango producían un >32767 ERR
. [37]
Los operadores infijos incluían +
(suma), -
(resta), *
(multiplicación), /
(división), MOD (resto) y exponente utilizando el ^
carácter . Los operadores binarios incluían AND
, OR
y NOT
. Las comparaciones binarias incluían el conjunto estándar de =
, >
, <
, >=
, <=
, <>
y el , inspirado en HP #
, que era equivalente a <>. [38]
Sólo se permitían matrices unidimensionales, limitadas en tamaño sólo por la memoria disponible. [39] Las funciones matemáticas eran dispersas; sólo se admitían ABS
(valor absoluto), SGN
(signo) y (número aleatorio). [40] A diferencia de las versiones derivadas de MS, donde se ignoraba el parámetro y siempre devolvía un valor 0..<1, Integer BASIC usaba el parámetro; devolvía un entero de 0 a 5. [41]RND
RND
RND(6)
El manejo de cadenas de caracteres del BASIC de enteros se basaba en el sistema del BASIC de HP, que trataba las variables de cadena como matrices de caracteres que debían ser DIM
editadas antes de su uso. Esto es similar al modelo de C [42] o Fortran 77. [ 43] Esto contrasta con los BASIC tipo 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 poco común; North Star BASIC [45] y Atari BASIC [46] utilizaban el mismo concepto, al igual que otros.
Las cadenas en Integer Basic usaban una cantidad fija de memoria sin importar el número de caracteres usados dentro de 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 proporcionaba mediante la sintaxis de segmentación de matrices . Por ejemplo, se imprimían los primeros seis caracteres de , caracteres del 0 al 5. [49] [49] [i] La concatenación se proporcionaba utilizando el mismo sistema, se reemplazaban todos los caracteres que comenzaban en la posición 5 con la cadena "ABC". [50] Esto contrasta con el manejo de cadenas al 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 segmentació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 del CHR$
que devolvía el carácter ASCII con un código numérico dado. [53]
Cuando se lanzó, el único controlador de juegos para Apple era el controlador de paleta , que tenía dos controladores en un solo conector. La posición del controlador se podía 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 de Apple no incluían hardware de sonido dedicado, sólo un simple "beeper". La producción de sonidos se lograba al PEEK
buscar la ubicación del altavoz en la memoria, -16336. [l] Al buscar repetidamente ese valor se obtenían tonos, y el manual sugería usar una expresión matemática para hacerlo, como . [56]S=PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)
El soporte para gráficos era más detallado. El modo de gráficos se activaba con la GR
declaración y se desactivaba 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 de dibujo en 12, verde claro. Uno podría entonces PLOT 10,10
producir un único punto de ese color, [58] HLIN 0,39 AT 20
dibujar una línea horizontal en la fila 20 que abarcara 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
devolvía el color de la pantalla en X,Y. [52] [m]
El BASIC de enteros carecía de comandos de entrada/salida personalizados y también carecía de la DATA
declaración y el READ
. Para introducir y extraer 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ían la salida o la entrada (respectivamente) a la ranura numerada. A partir de entonces, los datos podían enviarse a la tarjeta mediante comandos convencionales PRINT
y leerse desde ella mediante INPUT
. [52]
El BASIC de enteros incluía una TAB
función que posicionaba el cursor en una columna dada de 0 a 39. Se diferenciaba de las versiones que se encuentran en la mayoría de los BASIC en que era un comando con un número a continuación, en lugar de una función con el valor entre paréntesis; uno movería el cursor a la columna 10 usando TAB 10
en el BASIC de enteros [60] mientras que en MS esto sería PRINT TAB(10)
. Además, el VTAB
comando funcionaba de manera similar a TAB
pero agregaba espacios verticales en lugar de horizontales. Por razones inexplicables, en este caso las coordenadas eran de 1 a 24 en lugar de 0 a 23. [61]
El BASIC de enteros incluía un POP
comando para salir de los bucles. [52] Esto hacía que el elemento superior saliera de la pila FOR. El BASIC de Atari también admitía el mismo comando, [62] mientras que el BASIC de North Star utilizaba EXIT
. [63]
Las ROMs de Integer BASIC 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 utilizó para escribir Integer BASIC. [64] [65] [2]
Apple BASIC tenía los siguientes comandos: [66]
AUTO val1 , val2 CLR [ CLEAR ] DEL val1 , val2 LIST val1 , val2 RUN val1 SCR [ SCRATCH / NEW ] HIMEM = expr LOMEM = expr ( LET ) var = expr INPUT ( solicitud ,) var1 , var2 ... PRINT elemento ( s ) TAB expr FOR var = expr1 TO expr2 STEP expr3 NEXT var IF expr THEN instrucción IF expr THEN número de línea GOTO expr GOSUB expr RETURN DIM var1 ( expr1 ), var2 ( expr2 ) ... REM texto END 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 NEW [ reemplaza a SCR ] NOTRACE PLOT expr1 , expr2 POP TEXT TRACE VLIN expr1 , expr2 AT expr3 Función: ASC (), PDL (), SCRN ( X , Y )
El BASIC entero leía las líneas escritas por el usuario desde un búfer y las ejecutaba a través de un analizador que generaba una serie de tokens . Como parte de este proceso, se detectaban y enumeraban errores de sintaxis simples . Si el análisis era exitoso, el número de línea (si estaba presente) se convertía del formato decimal ASCII a un entero de 16 bits y cualquier palabra clave a un token entero de 7 bits. [64]
Algunas palabras clave estaban representadas por múltiples 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 no iba seguida de argumentos, uno si iba seguida de una expresión aritmética y uno si iba seguida de un literal de cadena. [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 en cambio configurando 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 su bit alto activado y todos los dígitos del nombre representados por los correspondientes $B0 a $B9 , de modo que la variable se tokenizara como $C1B5 . [64]A
A5
Si la línea se ingresaba sin número de línea, el código se ejecutaba directamente desde el búfer. Si tenía número de línea, se copiaba desde el 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 dieron 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, el cálculo de los valores internos de una fórmula de 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. La dirección del almacenamiento de la variable, tal vez recién creada, se colocaba luego 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 que la memoria pudiera ser direccionada a través de 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 multiinstrucción subyacente. La máquina virtual completa se escribió en solo 300 bytes. El código puede llamar a SWEET16 emitiendo una llamada de subrutina y luego regresar al código 6502 normal cuando se completan las operaciones de 16 bits. [70]
SWEET16 no fue utilizado en el código BASIC central, pero más tarde se utilizó para implementar varias utilidades. Entre ellas, se destaca la rutina de renumeración de líneas, que se incluyó en la ROM Programmer's Aid #1, se agregó a los modelos posteriores de Apple II y estuvo disponible para la instalación del usuario en los ejemplos anteriores. [71]
Aunque el BASIC entero contenía sus propias rutinas matemáticas, las ROM del 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 estaba incluido en el manual del Apple II. Los programas BASIC que requerían cálculos de punto flotante podían CALL
incluirse en estas rutinas. [72]
Como el BASIC entero procesaba más del código fuente original en tokens, el tiempo de ejecución era más rápido que las versiones que requerían un análisis adicional en tiempo de ejecución. A modo de comparación, el BASIC Tiny tokenizaba sólo el número de línea, [73] mientras que el BASIC MS tokenizaba sólo las palabras clave. Así, por ejemplo, mientras que el BASIC entero convertía la línea 100 GOTO 200
entera en tokens que podían leerse y ejecutarse inmediatamente, en el BASIC MS sólo se tokenizaban el número de línea y GOTO, el "200" se dejaba en su formato ASCII original y tenía que volver a analizarse en un entero de 16 bits cada vez que se encontraba la línea. [74]
Además, trabajar únicamente con operaciones matemáticas con números enteros proporciona otro gran impulso en cuanto a velocidad. Esto se debe tanto a que el formato más pequeño de 16 bits requiere menos accesos a la memoria, como a que elimina la necesidad de mover el decimal de punto flotante después de los cálculos. Como muchos de los puntos de referencia informáticos de la época eran pequeños y a menudo realizaban operaciones matemáticas simples que no requerían puntos flotantes, el BASIC de números enteros superó a la mayoría de los demás BASIC. [o]
En uno de los primeros benchmarks de microcomputadoras conocidos, el benchmark Rugg/Feldman , Integer BASIC fue más del doble de rápido que Applesoft BASIC en la misma máquina. [76] En el Byte Sieve , donde las matemáticas eran menos importantes pero el acceso a matrices y el rendimiento de bucles dominaban, Integer BASIC tardó 166 segundos mientras que Applesoft tardó 200. [77] No apareció en el 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, tomada de ambos artículos originales de Rugg/Feldman, [76] [75] muestra el rendimiento de Integer en relación con el BASIC derivado de MS en la misma plataforma.
A continuación se muestra 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 se incluyó en el Manual de Apple II Mini. [79] Hay una serie de errores conocidos en esta versión. [80]
El programa comienza configurando la pantalla en TEXT
y luego CALL -936
limpiando 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 instrucciones COLOR
y VLIN
para dibujar el campo de juego y la visualización de la puntuación en la ventana de texto. El bucle principal completo se ejecuta 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 la impresión de 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 de 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 : LLAMAR -936 : VTAB 4 : TAB 10 : IMPRIMIR "*** JUEGO DE BREAKOUT ***" : IMPRIMIR 7 IMPRIMIR " EL OBJETIVO ES DESTRUIR TODOS LOS LADRILLOS CON 5 BOLAS" : PARA N = 1 A 7000 : SIGUIENTE N 10 DIM A$ ( 20 ), B$ ( 20 ) : GR : IMPRIMIR : INGRESAR "HOLA, ¿CÓMO TE NOMBRAS? " , 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 EN I 25 SIGUIENTE I : PINCHAR 34 , 20 : IMPRIMIR : IMPRIMIR : IMPRIMIR : PARA I = 0 A 15 : VTAB 21 + I MOD 2 : TAB I + I +1 : IMPRIMIR I ;: SIGUIENTE I : PINCHAR 34 , 22 : VTAB 24 : IMPRIMIR : IMPRIMIR "FONDO" ; 27 GOSUB 100 : A = E : IMPRIMIR "LADRILLO PAR" ;: GOSUB 100 : B = E : IMPRIMIR " LADRILLO IMPAR " ; : GOSUB 100 : C = E : IMPRIMIR "PALETA" ; : GOSUB 100 : D = E : IMPRIMIR "PELOTA" ; : GOSUB 100 30 POKE34 , 20 : COLOR = A : PARA I = 0 A 39 : VLIN0 , 39 ATI : SIGUIENTE I : PARA I = 20 A 34 PASO 2 : TAB I +1 : IMPRIMIR I / 2-9 ; : COLOR = B : VLIN 0 , 39 EN I : COLOR = C : PARA J = I MOD 4 A 39 PASO 4 35 VLIN J , J +1 EN I : SIGUIENTE J , I : TAB 5 : IMPRIMIR "PUNTAJE = 0" : IMPRIMIR : IMPRIMIR : TOCAR 34 , 21 : S = 0 : P = S : L = S : X = 19 : Y = 19 : X = 19 40 COLOR = A : TRAZAR 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 N.º" ; 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 ) : 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. REINGRESAR" ; 100 ENTRADA "COLOR (0 A 15)" , E : SI E < 0 O E > 15 ENTONCES 99 : DEVOLVER 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 ) 124 SI S < 720 ENTONCES 80 130 IMPRIMIR "FELICIDADES, USTED GANE." : IR A 150 140 IMPRIMIR "SU PUNTAJE 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 "REGULAR". : 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
]
indicador.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)
.