Atari BASIC — это интерпретатор языка программирования BASIC , который поставлялся с 8-битными компьютерами Atari . В отличие от большинства американских BASIC эпохи домашних компьютеров, Atari BASIC не является производным от Microsoft BASIC и отличается от него существенными отличиями. Он включает ключевые слова для функций, специфичных для Atari, и не поддерживает строковые массивы.
Язык распространялся в виде картриджа ROM объемом 8 КБ для использования с компьютерами Atari 400 и 800 1979 года. Начиная с 600XL и 800XL в 1983 году, BASIC встроен в систему. Существует три основных версии программного обеспечения: оригинальная версия на основе картриджа "A", встроенная версия "B" для 600XL/800XL и финальная версия "C" в последних моделях XL и серии XE.
Несмотря на то, что 8-битные компьютеры Atari работали на более высокой скорости, чем большинство его современников, несколько технических решений поместили Atari BASIC в нижнюю часть тестов производительности. Первоначальные авторы решили большинство этих проблем в серии улучшенных версий: BASIC A+ (1981), BASIC XL (1983) и BASIC XE (1985).
Полный аннотированный исходный код и спецификации проекта Atari BASIC были опубликованы в качестве The Atari BASIC Source Book в 1983 году. [2]
Машины, которые впоследствии стали 8-битными компьютерами Atari, изначально разрабатывались как игровые консоли второго поколения , призванные заменить Atari VCS . Рэй Кассар , новый президент Atari, решил бросить вызов Apple Computer , создав вместо этого домашний компьютер. [3]
Это означало, что проекты должны были включать язык программирования BASIC , стандарт для домашних компьютеров. В начале 1978 года Atari лицензировала исходный код версии Microsoft BASIC для MOS 6502. [4] Он предлагался в двух версиях: одна использовала 32-битный формат с плавающей точкой, который составлял около 7800 байт при компиляции, а другая использовала расширенный 40-битный формат, который был близок к 9 КБ. [5]
Даже 32-битная версия едва влезала в 8-килобайтный формат картриджа ПЗУ машины . Atari также чувствовала, что им нужно расширить язык для поддержки аппаратных функций своих компьютеров, подобно тому, что Apple сделала с Applesoft BASIC . Это увеличило размер версии Atari примерно до 11 КБ; AppleSoft BASIC на Apple II+ имел длину 10 240 байт. [a] Через шесть месяцев код был урезан почти до 8-килобайтного ПЗУ, [4] но Atari столкнулась с крайним сроком в январе 1979 года для выставки бытовой электроники (CES), где должны были быть продемонстрированы машины. Они решили обратиться за помощью, чтобы подготовить версию BASIC к выставке. [4]
В сентябре 1978 года Shepardson Microsystems выиграла тендер на завершение BASIC. [4] В то время они завершали Cromemco 16K Structured BASIC для машин Cromemco S-100 на базе Z80 . [6] [7] Разработчики Кэтлин О'Брайен и Пол Лоутон использовали Data General Business Basic , реализацию только для целочисленных вычислений, в качестве вдохновения для своего BASIC, учитывая опыт Лоутона с Data General в системе разделения времени . [1]
Cromemco BASIC включал расширенную реализацию с плавающей точкой , используя 14-значный двоично-десятичный формат (BCD), что стало возможным благодаря использованию всех 16 регистров процессора Zilog Z80 . Поскольку он преобразовывал все данные во внутренний формат во время редактирования, небольшие константы, такие как «1», занимали бы значительный объем памяти, и это могло бы стать особой проблемой при хранении массивов чисел. Чтобы решить эту проблему, язык также поддерживал 6-значный формат BCD. Он также включал отдельный 16-битный целочисленный формат для хранения внутренних значений, таких как номера строк и аналогичные системные значения. [8]
Даже самые маленькие BASIC на 6502 обычно использовали около 10 КБ, например, Commodore BASIC использовал 9 КБ, но также полагался на поддержку KERNAL , [ b] в то время как Applesoft BASIC использовал 10780 байт. [c] Чтобы достичь цели размещения в 8 КБ ПЗУ, новый BASIC должен был состоять из двух частей: сам язык на картридже и отдельная библиотека FP, использующая 2 КБ в 10 КБ ПЗУ системы. [11] Чтобы разместиться в пределах 2 КБ, система с плавающей точкой поддерживала только 6-значный формат.
Atari приняла предложение, и когда спецификации были окончательно доработаны в октябре 1978 года, Лоутон и О'Брайен начали работу над новым языком. [4] В контракте была указана дата поставки 6 апреля 1979 года или ранее, и это также включало файловую систему (позже известную как DOS 1.0). [11] Планы Atari состояли в том, чтобы вывести раннюю версию Microsoft BASIC 8K на выставку CES 1979 года, а затем перейти на Atari BASIC для производства. Разработка продвигалась быстро, чему способствовал бонусный пункт в контракте, что привело к тому, что первоначальная версия была доставлена в октябре. Atari вывела на выставку CES версию с картриджем 8K вместо версии Microsoft. [12] Позже Microsoft BASIC от Atari стал доступен как отдельный продукт. [13]
Версия, предоставленная Шепардсоном Atari для демонстрации на CES, не была финальной, и Шепардсон продолжил исправлять ошибки. [12] Шепардсон не знал, что Atari уже отправила версию для CES в производство. [14]
Эта версия позже стала известна как Revision A. Она содержит серьезную ошибку в процедуре копирования памяти: удаление строк кода длиной ровно 256 байт вызывает блокировку после ввода следующей команды. Ключ Resetне исправляет ее. [15]
Revision B пыталась исправить основные ошибки Revision A и была выпущена в 1983 году как встроенное ПЗУ в моделях 600XL и 800XL. Исправляя ошибку копирования памяти, программист заметил тот же шаблон кода в разделе для вставки строк и применил то же исправление. Вместо этого это внесло исходную ошибку в этот код. Вставка новых строк встречается гораздо чаще, чем удаление старых, поэтому изменение резко увеличило количество сбоев. [15] Revision B также добавляет 16 байт к программе каждый раз, когда она SAVE
d и LOAD
ed, в конечном итоге заставляя машину исчерпывать память даже для самых маленьких программ. [16] [17] Mapping the Atari описал их как «потрясающие ошибки» и посоветовал владельцам Revision B «не дурачьтесь; получите новое ПЗУ, которое доступно на картридже» от Atari. [17] В книге приводится программа для патча Revision B до Revision C для тех, у кого нет картриджа. [18]
Revision C устраняет утечки памяти в Revision B. [17] Он встроен в более поздние версии 800XL [16] и все модели XE, включая XEGS. Revision C также была доступна в виде картриджа. [17]
Версию можно определить, набрав PRINT PEEK(43234)
в строке READY. Результат 162
для Revision A, 96
для Revision B и 234
для Revision C. [19]
Как и большинство BASIC для домашних компьютеров, Atari BASIC завязан на своем редакторе строк . Строки программы могут быть до трех физических строк экрана по 40 символов, всего 120 символов. Курсор можно свободно перемещать, при этом редактор автоматически отслеживает, к какой строке программы BASIC относится текущая строка экрана. Например, если курсор в данный момент находится на строке 30, а пользователь использует курсор-вверх на строку 20, любое редактирование с этой точки будет выполняться на строке 20.
Редактор Atari BASIC обнаруживает множество ошибок, которые не были бы замечены в версиях, производных от MS. Если обнаружена ошибка, редактор повторно отображает строку, выделяя текст рядом с ошибкой в инверсном видео . Ошибки отображаются в виде числовых кодов с описаниями, напечатанными в руководстве. [20] Благодаря тому, как работает редактор строк, пользователь может немедленно исправить ошибку. В примере, изображенном выше (с PRUNT
), ошибку можно исправить, наведя курсор на U
, введя (редактор имеет только режим перезаписи) и нажав .IRETURN
Строка, введенная с ведущим номером от 0 до 32767, [21] вставляется в текущую программу или заменяет существующую строку. Если номер строки отсутствует, интерпретатор присваивает ей номер -1 (8000 16 ), и команды выполняются немедленно, в «немедленном режиме». RUN
Команда выполняет сохраненную программу с наименьшего номера строки. Atari BASIC позволяет выполнять все команды в обоих режимах. Например, LIST
может использоваться внутри программы, тогда как во многих интерпретаторах это было бы доступно только в немедленном режиме.
Во время ввода ключевые слова можно сокращать с помощью шаблона, установленного Palo Alto Tiny BASIC , вводя точку в любом месте слова. So L.
расширяется до LIST
, как есть LI.
. Необходимо ввести только достаточное количество букв, чтобы сделать сокращение уникальным, so PLOT
требуется , PL.
поскольку единственная буква P не является уникальной. Чтобы расширить сокращение, токенизатор просматривает свой список зарезервированных слов, чтобы найти первое, которое соответствует предоставленной части. Более часто используемые команды появляются первыми в списке зарезервированных слов, с REM
в начале (его можно ввести как .
). Когда программа позже LIST
редактируется, она всегда будет выписывать полные слова с тремя исключениями: PRINT
имеет синоним, ?
; GOTO
имеет синоним, GO TO
; и LET
имеет синоним, который является пустой строкой (так что и означают одно и то же). Это отдельные токены, и поэтому останутся таковыми в листинге программы. В MS BASIC также допускалась краткая форма для , но в ней использовался тот же токен, поэтому она расширялась до того времени, когда была выпущена, и рассматривалась как аббревиатура, а не синоним.10 LET A = 10
10 A = 10
?
PRINT
PRINT
LIST
Когда пользователь нажимает во время редактирования, текущая строка копируется в буфер входной строки BASIC в памяти между 580 и 5FF 16 . [21] Токенизатор Atari BASIC сканирует текст, преобразуя каждое ключевое слово в однобайтовый токен (например, is 20 16 ), [22] каждое число в шестибайтовое значение с плавающей точкой, каждое имя переменной в индекс в таблице и так далее, пока строка полностью не будет преобразована в легко интерпретируемый формат. Результат сохраняется в выходном буфере, расположенном в первых 256 байтах наименьшей доступной свободной памяти, на который указывает указатель LOMEM, хранящийся в 80, 81 16 . [21] Затем вывод из токенизатора перемещается. Программа сохраняется в виде дерева синтаксического анализа . [d]RETURNPRINT
Шепардсон назвал эту концепцию полной токенизации «предкомпилирующим интерпретатором». [23] Полученный токенизированный код исключает любой синтаксический анализ во время выполнения, что ускоряет его работу. Его недостаток в том, что небольшие константы, такие как 0 или 1, имеют размер шесть байтов каждая, что длиннее исходного текста.
Набор указателей (адресов) указывает на различные данные: имена переменных хранятся в таблице имен переменных (VNTP – 82, 83 16 ), а их значения хранятся в таблице значений переменных (указывается на VVTP – 86, 87 16 ). При таком косвенном указании имен переменных для ссылки на переменную требуется всего один байт для обращения к ее записи в соответствующую таблицу. Строковые переменные имеют свою собственную область (указывается на STARP – 8C, 8D 16 ), как и стек времени выполнения (указывается на RUNSTK – 8E, 8F 16 ), используемый для хранения номеров строк операторов цикла ( FOR...NEXT
) и подпрограмм ( GOSUB...RETURN
). Наконец, конец использования памяти BASIC указывается адресом, хранящимся в указателе MEMTOP – 90, 91 16 ).
Atari BASIC включает три тригонометрические функции: синус, косинус и арктангенс. DEG
и RAD
устанавливает, используют ли эти функции радианы или градусы, по умолчанию радианы. Восемь дополнительных функций включают округление, логарифмы и квадратный корень. Случайная функция, RND
, генерирует число от 0 до 1; параметр не используется.
Atari BASIC скопировал систему обработки строк Hewlett-Packard BASIC , [24] , где базовый тип данных — один символ, а строки — массивы символов. Внутренне строка представлена указателем на первый символ в строке и его длиной. Чтобы инициализировать строку, ее необходимо DIMensioned с ее максимальной длиной. Например:
10 DIM A$ ( 20 ) 20 PRINT "ВВЕДИТЕ СООБЩЕНИЕ: " ; 30 INPUT A$ 40 PRINT A$
В этой программе зарезервирована строка из 20 символов, и любые символы, превышающие длину строки, будут усечены. Максимальная длина строки составляет 32 768 символов. Массивы строк не поддерживаются.
Доступ к строке осуществляется с помощью функций индексации массива или среза . A$(1,10)
возвращает строку из первых 10 символов A$
. Массивы индексируются с 1, поэтому строка длиной 10 начинается с 1 и заканчивается 10. Функции среза просто устанавливают указатели на начальную и конечную точки в пределах существующей выделенной памяти.
Массивы не инициализируются, поэтому числовой массив или строка содержат все данные, которые были в памяти, когда они были выделены. Следующий трюк позволяет быстро инициализировать строку, а также полезен для очистки больших областей памяти от нежелательного мусора. Числовые массивы можно очистить только с помощью цикла FOR...NEXT:
10 REM Инициализируем A$ 1000 символами X 20 DIM A$ ( 1000 ) 30 A$ = "X" : A$ ( 1000 ) = A$ : A$ ( 2 ) = A$
Конкатенация строк работает так, как в следующем примере. Целевая строка должна быть достаточно большой, чтобы вместить объединенную строку, иначе возникнет ошибка:
10 DIM A$ ( 12 ), B$ ( 6 ) 20 A$ = "Привет " : B$ = "там!" 30 A$ ( LEN ( A$ ) + 1 ) = B$ 40 PRINT A$
Значения в операторах DATA разделены запятыми и не типизированы. Следовательно, строки в операторах DATA обычно не заключаются в кавычки. В результате элементы данных не могут содержать запятую, но могут включать двойные кавычки. Числовые значения в операторах DATA считываются как строки или как числа в зависимости от типа переменной, в которую они считываются. Оператор READ нельзя использовать с переменными массива.
Atari OS включает в себя подсистему для ввода/вывода периферийных устройств (I/O), известную как CIO (Central Input/Output). Большинство программ можно писать независимо от того, какое устройство они могут использовать, поскольку все они соответствуют общему интерфейсу; в то время это было редкостью на домашних компьютерах. Новые драйверы устройств можно было написать довольно легко, и они автоматически становились доступными для Atari BASIC и любой другой программы, использующей Atari OS, а существующие драйверы можно было заменить или дополнить новыми. Например, заменяющий E: мог бы заменить тот, что в ПЗУ, чтобы обеспечить отображение на 80 столбцов, или совмещаться с ним для генерации контрольной суммы всякий раз, когда возвращается строка (например, используется для проверки листинга программы ввода).
Atari BASIC поддерживает доступ CIO с зарезервированными словами OPEN #, CLOSE #, PRINT #, INPUT #, GET #, PUT #, NOTE #, POINT # и XIO # . В ОС есть процедуры для простых функций рисования графики, но не все они доступны как определенные ключевые слова BASIC. PLOT и DRAWTO для рисования линий поддерживаются, а команда, обеспечивающая заливку области для примитивных линейных геометрических фигур, не поддерживается. Функцию заливки можно использовать через общую точку входа CIO, которая вызывается с помощью команды BASIC XIO .
Оператор BASIC OPEN # подготавливает устройство для доступа к вводу-выводу:
10 REM Открывает кассетное устройство на канале 1 для чтения в BASIC 20 OPEN # 1 , 4 , 0 , "C:MYPROG.DAT"
Здесь OPEN # означает «убедиться, что канал 1 свободен», вызвать драйвер C: для подготовки устройства (это установит катушки кассетной ленты на натяжение и продвинет головки, удерживая кассетный проигрыватель «на паузе»). 4 означает «чтение» (другие коды — 8 для записи и 12 = 8 + 4 для «чтения и записи»). Третье число — вспомогательная информация, устанавливаемая в 0, когда она не нужна. C:MYPROG.DAT — это имя устройства и имя файла; имя файла игнорируется для драйвера кассеты. Физические устройства могут иметь номера (в основном диски, принтеры и последовательные устройства), поэтому « P1: » может быть плоттером, а « P2: » — ромашковым принтером, или « D1: » может быть одним дисководом, а « D2: » и т. д. Если отсутствует, предполагается 1.
Оператор LPRINT отправляет строку на принтер.
A считывается путем PEEK- индексации ячеек памяти, поддерживаемых драйвером клавиатуры, или путем открытия его как файла (например, ). Последний ожидает нажатия клавиши.OPEN 1,4,0,"K:":GET #1,A$
Ввод текста DOSиз BASIC приводит к выходу в меню команд Atari DOS . Все несохраненные программы теряются, если на текущем диске не включена функция подкачки файлов памяти. Команды для отображения каталога на диске из BASIC нет; это можно сделать, выйдя в DOS.
Atari BASIC поддерживает звук (через оператор SOUND ), графику ( GRAPHICS, SETCOLOR, COLOR, PLOT, DRAWTO ) и контроллеры ( STICK, STRIG, PADDLE, PTRIG ). [25] Оператор SOUND устанавливает один из 4 каналов прямоугольных импульсов оборудования с параметрами громкости, высоты тона и искажения.
Расширенные возможности оборудования, такие как более высокое разрешение тона, фильтры верхних частот, оцифрованный звук и формы волн, графика игрока/ракеты ( спрайты ), переопределенные наборы символов, прокрутка и пользовательские графические режимы не поддерживаются BASIC; для этого потребуются процедуры машинного языка или операторы PEEK/POKE. К некоторым из 17 основных режимов символов/графики, поддерживаемых оборудованием, нельзя просто получить доступ из BASIC на Atari 400/800, поскольку ПЗУ ОС не поддерживают их. К ним относятся некоторые многоцветные режимы символов (режимы ANTIC 4 и 5), режим символов с выносным элементом (режим ANTIC 3) и режимы с самым высоким разрешением 2 и 4 цветов (режимы ANTIC C и E, 160x192 пикселей). Единственный способ получить к ним доступ — через PEEK/POKE или машинный язык, вручную настроив регистры ANTIC и список отображения. В ПЗУ ОС на XL/XE добавлена поддержка этих режимов, за исключением режима ANTIC 3, для корректной работы которого требуется переопределение набора символов в ОЗУ. [26]
Режимы растрового изображения в BASIC обычно устанавливаются так, чтобы текстовое окно занимало последние четыре строки в нижней части экрана, чтобы пользователь мог отображать подсказки и вводить данные в программу. Если к номеру режима, вызванного с помощью оператора GRAPHICS, добавляется 16, весь экран будет в режиме растрового изображения (например, GRAPHICS 8+16). Если вызывается режим растрового изображения на весь экран, Atari BASIC корректно переключится обратно в текстовый режим, когда выполнение программы будет завершено, избегая оставления пользователя с неотвечающим экраном, который необходимо вывести, введя слепую команду или перезагрузив компьютер.
Координаты растрового изображения находятся в диапазоне от 0 до максимального числа строк/столбцов минус один, таким образом, в режиме 6 (160x192) максимальные координаты пикселя могут быть 159 и 191. Если Atari BASIC попытается выполнить вывод за пределами разрешенных для этого режима координат, возникнет ошибка выполнения.
Atari BASIC позволяет использовать числовые переменные и выражения для предоставления номеров строк GOTO
и GOSUB
команд. Например, подпрограмма, очищающая экран, может быть записана как GOSUB CLEARSCREEN
, что проще для понимания, чем GOSUB 10000
.
Базовые адреса строки хранятся в таблице переменных. Адреса строк могут быть перенаправлены для указания на произвольные области ОЗУ. Это позволяет быстро выполнять процедуры сдвига памяти, лежащие в основе назначения строк и подстрок, применять из BASIC к памяти, используемой для экрана или графики игрока/ракеты. Это особенно полезно для достижения быстрого вертикального перемещения изображений игрока/ракеты непосредственно из Atari BASIC.
Числовые переменные и выражения могут использоваться в качестве параметра для RESTORE
оператора, что позволяет DATA
осуществлять произвольный доступ к операторам с помощью кода, например . Это также можно использовать для эмуляции статических строковых массивов: .RESTORE ROOMBASE+ROOMNUMBER:READ DESCRIPTION$, TREASURE$, EXITS
RESTORE STRBASE+INDEX:READ A$:PRINT A$
Оператор TRAP
переходит к номеру строки при возникновении ошибки, что снижает необходимость в ручной проверке ошибок. Например, при рисовании графики на экране не нужно проверять, выходят ли линии за границы экрана текущего графического режима. Это состояние ошибки можно перехватить, и при необходимости обработать ошибку.
Команда ENTER
считывает исходный код с устройства и объединяет его с текущей программой, как если бы пользователь ввел его. Это позволяет сохранять программы по разделам через LIST
, считывая их с помощью ENTER
для объединения или замены существующего кода. Используя блоки номеров строк, которые не перекрываются, программисты могут создавать библиотеки подпрограмм и объединять их в новые программы по мере необходимости.
Редактор может быть настроен на многократное считывание ввода с экрана до тех пор, пока не будет достигнут EOF. Это позволяет программе записывать новый программный код, за которым следует оператор CONT
на экране, а затем, устанавливая курсор экрана в начало нового кода, STOP
запускать программу, заставляя новый код считываться, а затем выполнение будет продолжено оператором CONT
.
Atari BASIC может вызывать подпрограммы машинного кода, хранящиеся в строках или ed в памяти. Для этой цели часто используется POKE
область размером 256 байт, начинающаяся с адреса 1536 10 (600 16 ).
Машинный код вызывается функцией USR
. Первый параметр — адрес подпрограммы, а следующие значения — параметры. Если код хранится в строке с именем, ROUTINE$
его можно вызвать с двумя параметрами как .ANSWER=USR(ADR(ROUTINE$),VAR1,VAR2)
Параметры помещаются в аппаратный стек как 16-битные целые числа в порядке, указанном в вызове USR
в порядке от младшего байта к старшему. Последний байт помещается, указывая количество аргументов. Код машинного языка должен удалить эти значения перед возвратом через инструкцию RTS
. 16-битное значение можно вернуть в BASIC, поместив его в адреса 212 10 и 213 10 (D4 16 и D5 16 ).
Atari BASIC поддерживал форму Бэкуса–Наура . Она была частично задокументирована Кэрол Шоу . [27] Шоу, вместе с Кейтом Брюстером, также написали Atari BASIC Reference Manual . [28] [29] [30]
Теоретически Atari BASIC должен работать быстрее, чем современные BASIC, основанные на шаблоне MS. Поскольку исходный код полностью токенизирован при вводе, все шаги токенизации и анализа уже завершены. Даже сложные математические операции готовы к запуску, при этом любые числовые константы уже преобразованы во внутренний 40-битный формат, а значения переменных ищутся по адресу, а не их нужно искать. [e] На практике Atari BASIC медленнее большинства других BASIC для домашних компьютеров , часто на большую величину. [31]
В двух широко используемых бенчмарках той эпохи, « Sieve of Eratosthenes» журнала Byte и бенчмарке Creative Computing, написанном Дэвидом Х. Алем , Atari оказалась в конце списка по производительности и была намного медленнее современных Apple II и PET , [32] несмотря на то, что имела тот же самый процессор, работающий примерно в два раза быстрее. Она финишировала позади более медленных машин, таких как ZX81 и даже некоторых программируемых калькуляторов. [33]
Большая часть медлительности языка обусловлена тремя проблемами. [31]
Первая заключается в том, что математические процедуры с плавающей точкой плохо оптимизированы. В тесте Ahl одна операция возведения в степень была ответственна за большую часть плохих результатов машины. [31] Преобразование между числами с плавающей точкой и 16-битными целыми числами также происходит особенно медленно. Внутри эти целые числа используются для номеров строк и индексации массивов, а также для нескольких других задач, но числа в токенизированной программе хранятся в двоично-десятичном формате (BCD). [34] Всякий раз, когда встречается одно из них, например номер строки в GOTO 100
, значение BCD преобразуется в целое число, что может занять до 3500 микросекунд. [35]
Другая проблема заключается в том, как Atari BASIC реализует переходы. Чтобы выполнить переход в GOTO
или GOSUB
, интерпретатор ищет по всей программе соответствующий номер строки. [36] Напротив, современные версии MS-производных BASIC выполняли бы поиск вперед от текущей строки, если бы номер строки цели перехода был больше, тем самым улучшая производительность перехода примерно в два раза в среднем.
Связанная и более серьезная проблема — реализация FOR
... NEXT
циклов. Когда FOR
выполняется оператор, Atari BASIC записывает его номер строки. Каждый раз, когда NEXT
достигается , он ищет эту строку в программе, несмотря на то, что она находится в том же месте, что и в прошлый раз. [31] Все другие BASIC вместо этого записывают местоположение оператора в памяти FOR
и могут немедленно вернуться к нему без необходимости поиска.
Причину столь низкой эффективности лучше всего иллюстрирует цитата одного из основных авторов, Билла Уилкинсона; в 1982 году он заявил:
Лично я никогда не был уверен, что интерпретируемый язык (например, BASIC) должен быть быстрым. Авторы... утверждали, что Atari BASIC — самый медленный язык из когда-либо созданных. Моим первым побуждением было сказать: «Кому какое дело?» [37]
Эту философию можно сравнить с философией Apple BASIC Стива Возняка для оригинального Apple I , который был разработан специально для обеспечения производительности, необходимой для написания игр:
После разработки аппаратных аркадных игр я понял, что возможность программировать их на BASIC изменит мир. [38]
На платформе появилось несколько сторонних BASIC, которые решили некоторые или все эти проблемы. В их число входил собственный BASIC XL Уилкинсона , который сократил время для теста Byte с 194 до 58 секунд, [31] более чем в три раза быстрее. На тесте Ahl Atari BASIC потребовалось 405 секунд, в то время как точно такой же код в Turbo-BASIC XL занял 41,6 секунды, что на порядок лучше. [39]
INKEY$
, CLS
, DEF FN
, SPC
, TAB
, ELSE
.LEFT$
, MID$
и RIGHT$
заменяются индексацией строк.INPUT
не допускает подсказки.PRINT
может быть сокращено как ?
as в Microsoft BASIC, но Atari BASIC не токенизирует его в PRINT
. Это остается вопросительным знаком.GOTO
and GOSUB
может быть переменная или выражение.RESTORE
может принимать числовую константу, переменную или выражение в качестве параметра, заставляя следующий READ
начинаться с указанного номера строкиFOR..NEXT
Циклы в Atari BASIC должны иметь имя переменной, на которое ссылается NEXT
оператор, тогда как Microsoft BASIC этого не требует.NEXT
, как в Microsoft BASIC (например, NEXT X,Y
).LIST
для разделения диапазона используется запятая вместо знака минус.Шоу, Кит Брюстер. BASIC REFERENCE MANUAL. черновик, Atari, Inc., Саннивейл, Калифорния (1979)