Атари БЕЙСИК
![]() Программа готова к запуску | |
Семья | БАЗОВЫЙ |
---|---|
Разработано | Пол Лотон Кэтлин О'Брайен |
Разработчик | Шепардсон Микросистемс |
Впервые появился | 1979 год |
Стабильная версия | Версия С
/ 1983 |
Платформа | 8-битные компьютеры Atari |
Лицензия | Коммерческое проприетарное программное обеспечение |
Под влиянием | |
Данные Общие Бизнес Базовые [1] | |
Под влиянием | |
БАЗОВЫЙ А+ , БАЗОВЫЙ XL , БАЗОВЫЙ XE, Турбо-БЕЙСИК XL |
Atari BASIC — это интерпретатор языка программирования BASIC , поставляемый с 8-битными компьютерами Atari . В отличие от большинства американских BASIC эпохи домашних компьютеров, Atari BASIC не является производным от Microsoft BASIC и существенно отличается от него. Он включает ключевые слова для функций, специфичных для Atari, и не поддерживает массивы строк.
Язык распространялся в виде 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 лицензировала исходный код для MOS 6502 версии Microsoft BASIC . [4] Он предлагался в двух версиях: одна использовала 32-битный формат с плавающей запятой, размер которого при компиляции составлял около 7800 байт, а другая использовала расширенный 40-битный формат, размер которого был близок к 9 КБ. [5]
машины Даже 32-битная версия едва вписывалась в размер 8 КБ формата картриджа ПЗУ . Atari также посчитала, что им необходимо расширить язык для поддержки аппаратных функций своих компьютеров, аналогично тому, что Apple сделала с Applesoft BASIC . Это увеличило размер версии Atari примерно до 11 КБ; AppleSoft BASIC на Apple II+ имел длину 10 240 байт. [а] Через шесть месяцев код был урезан и почти уместился в ПЗУ размером 8 КБ. [4] но у Atari был срок проведения выставки Consumer Electronics Show (CES) в январе 1979 года, на которой должны были быть продемонстрированы машины. Они решили попросить помощи, чтобы подготовить версию BASIC к выставке. [4]
Шепардсон Микросистемс
[ редактировать ]
В сентябре 1978 года компания Shepardson Microsystems выиграла тендер на завершение разработки BASIC. [4] В то время они заканчивали работу над Cromemco 16K Structured BASIC для Z80 на базе автобусных машин Cromemco S-100 . [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 . [б] в то время как Applesoft BASIC использовал 10780 байт. [с] Чтобы достичь цели установки в ПЗУ 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] Позже Atari Microsoft BASIC стала доступна как отдельный продукт. [13]
Релизы
[ редактировать ]Версия, которую Шепардсон предоставил Atari для демоверсии CES, не должна была быть окончательной, и Шепардсон продолжал исправлять ошибки. [12] Шепардсон не знал, что Atari уже отправила версию для CES в производство. [14]
Эта версия позже была известна как Редакция A. Он содержит серьезную ошибку в процедуре копирования памяти: удаление строк кода длиной ровно 256 байт приводит к зависанию после ввода следующей команды. Reset ключ это не исправляет. [15]
Версия B попыталась исправить основные ошибки в версии A и была выпущена в 1983 году как встроенное ПЗУ в моделях 600XL и 800XL. Исправляя ошибку копирования памяти, программист заметил ту же закономерность кода в разделе вставки строк и применил такое же исправление. Вместо этого в этот код была добавлена исходная ошибка. Вставка новых строк встречается гораздо чаще, чем удаление старых, поэтому это изменение резко увеличило количество сбоев. [15] Версия B также добавляет 16 байт к программе каждый раз, когда она выполняется. SAVE
д и LOAD
ed, что в конечном итоге приводит к нехватке памяти даже для самых маленьких программ. [16] [17] Mapping Atari описал их как «потрясающие ошибки» и посоветовал владельцам версии B: «Не валяйте дурака; приобретите новое ПЗУ, доступное на картридже» от Atari. [17] В книге представлена встроенная программа для обновления версии B до версии C для тех, у кого нет картриджа. [18]
Версия C устраняет утечки памяти в версии B. [17] Он встроен в более поздние версии 800XL. [16] и все модели XE, включая XEGS. Версия C также была доступна в виде картриджа. [17]
Версию можно определить, набрав PRINT PEEK(43234)
в командной строке ГОТОВО. Результат 162
для версии А, 96
для версии B и 234
для редакции С. [19]
Описание
[ редактировать ]Редактирование программы
[ редактировать ]
Как и большинство BASIC для домашних компьютеров, Atari BASIC основан на своем линейном редакторе . Строки программы могут содержать до трех строк физического экрана по 40 символов, всего 120 символов. Курсор можно свободно перемещать, при этом редактор автоматически отслеживает, частью какой строки программы BASIC является текущая строка экрана. Например, если курсор в данный момент находится в строке 30 и пользователь перемещает курсор вверх на строку 20, любое редактирование с этой точки будет выполняться в строке 20.
Редактор Atari BASIC обнаруживает множество ошибок, которые не были бы замечены в версиях, производных от MS. Если обнаружена ошибка, редактор повторно отображает строку, выделяя текст возле ошибки в инверсном видео . Ошибки отображаются в виде числовых кодов с описаниями, напечатанными в руководстве. [20] Благодаря тому, как работает редактор строк, пользователь может сразу исправить ошибку. В примере, изображенном выше (с PRUNT
), ошибку можно исправить, наведя курсор на U
, печатаю I (в редакторе есть только режим перезаписи) и нажав RETURN.
Строка, введенная с начальным номером от 0 до 32767, [21] вставляется в текущую программу или заменяет существующую строку. Если номера строки нет, интерпретатор присваивает ей номер -1 (8000 16 ) и команды выполняются немедленно, в «немедленном режиме». RUN
Команда выполняет сохраненную программу с наименьшего номера строки. Atari BASIC позволяет выполнять все команды в обоих режимах. Например, LIST
может использоваться внутри программы, тогда как во многих интерпретаторах это доступно только в непосредственном режиме.
Во время ввода ключевые слова можно сокращать, используя шаблон, установленный Palo Alto Tiny BASIC , путем ввода точки в любой точке слова. Так L.
расширен до LIST
, как есть LI.
. Необходимо ввести достаточное количество букв, чтобы аббревиатура стала уникальной, поэтому PLOT
требует PL.
потому что одна буква P не уникальна. Чтобы расширить сокращение, токенизатор просматривает список зарезервированных слов, чтобы найти первое, соответствующее предоставленной части. Наиболее часто используемые команды идут первыми в списке зарезервированных слов. REM
в начале (его можно напечатать как .
). Когда программа будет позже LIST
ed он всегда будет записывать полные слова за тремя исключениями: PRINT
есть синоним, ?
; GOTO
есть синоним, GO TO
; и LET
имеет синоним, который представляет собой пустую строку (поэтому 10 LET A = 10
и 10 A = 10
имею в виду то же самое). Это отдельные токены, поэтому они останутся таковыми в листинге программы. MS BASIC также разрешен ?
как краткая форма для PRINT
, но при этом использовался тот же токен, поэтому он снова расширился до PRINT
когда LIST
ред., рассматривая это слово как аббревиатуру, а не синоним.
токенизатор
[ редактировать ]Когда пользователь нажимает RETURN во время редактирования текущая строка копируется в буфер ввода строки BASIC в памяти между 580 и 5FF 16 . [21] Atari BASIC Токенизатор сканирует текст, преобразуя каждое ключевое слово в однобайтовый токен (например, PRINT
составляет 20 16 ), [22] каждое число преобразуется в шестибайтовое значение с плавающей запятой, каждое имя переменной — в индекс в таблице и так далее, пока строка не будет полностью преобразована в удобный для интерпретации формат. Результат сохраняется в выходном буфере, расположенном в первых 256 байтах самой низкой доступной свободной памяти, на которую указывает указатель LOMEM, хранящийся по адресам 80, 81 16 . [21] Затем выходные данные токенизатора перемещаются. Программа хранится в виде дерева разбора . [д]
Шепардсон назвал эту концепцию полной токенизации «интерпретатором предварительной компиляции». [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] где базовый тип данных — это один символ, а строки — это массивы символов. Внутренне строка представлена указателем на первый символ строки и ее длину. Чтобы инициализировать строку, ей необходимо указать максимальную длину DIMension. Например:
10 DIM A$(20)
20 PRINT "ENTER MESSAGE: ";
30 INPUT A$
40 PRINT A$
В этой программе зарезервирована строка длиной 20 символов, и любые символы, превышающие длину строки, будут обрезаны. Максимальная длина строки — 32 768 символов. Нет поддержки массивов строк.
Доступ к строке осуществляется с помощью функций индексации массива или нарезки . A$(1,10)
возвращает строку из первых 10 символов A$
. Массивы имеют индекс 1, поэтому строка длиной 10 начинается с 1 и заканчивается 10. Функции среза просто устанавливают указатели на начальную и конечную точки в существующей выделенной памяти.
Массивы не инициализируются, поэтому числовой массив или строка содержат все данные, которые находились в памяти на момент выделения. Следующий прием позволяет выполнить быструю инициализацию строки, а также полезен для очистки больших областей памяти от нежелательного мусора. Числовые массивы можно очистить только с помощью цикла FOR...NEXT:
10 REM Initialize A$ with 1000 characters of X
20 DIM A$(1000)
30 A$="X":A$(1000)=A$:A$(2)=A$
Конкатенация строк работает, как показано в следующем примере. Целевая строка должна быть достаточно большой, чтобы вместить объединенную строку, иначе возникнет ошибка:
10 DIM A$(12),B$(6)
20 A$="Hello ":B$="there!"
30 A$(LEN(A$)+1)=B$
40 PRINT A$
Значения в операторах DATA разделены запятыми и нетипизированы. Следовательно, строки в операторах DATA обычно не заключаются в кавычки. В результате элементы данных не могут содержать запятую, но могут содержать двойные кавычки. Числовые значения в операторах DATA считываются как строки или числа в зависимости от типа переменной, в которую они считываются. Оператор READ нельзя использовать с переменными массива.
Ввод/вывод
[ редактировать ]Atari ОС включает подсистему периферийных ввода/вывода устройств, известную как CIO (центральный ввод/вывод). Большинство программ можно писать независимо от того, какое устройство они используют, поскольку все они имеют общий интерфейс; В то время это было редкостью на домашних компьютерах. Можно было довольно легко написать новые драйверы устройств, которые автоматически стали бы доступны для Atari BASIC и любой другой программы, использующей ОС Atari, а существующие драйверы можно было бы заменить или дополнить новыми. Замена E: , например, может заменить тот, который находится в ПЗУ, чтобы обеспечить отображение 80 столбцов, или использовать его для генерации контрольной суммы всякий раз, когда возвращается строка (например, используется для проверки листинга вводимой программы).
Atari BASIC поддерживает доступ CIO с зарезервированными словами. ОТКРЫТЬ #, ЗАКРЫТЬ #, ПЕЧАТЬ #, ВВОД #, ПОЛУЧИТЬ #, ПОЛОЖИТЬ #, ПРИМЕЧАНИЕ #, ТОЧКА # и ХИО # . В ОС есть процедуры для простых функций рисования графики, но не все они доступны в виде специальных ключевых слов BASIC. СЮЖЕТ и DRAWTO для рисования линий поддерживается, а команда, обеспечивающая заливку области для примитивных линейных геометрических фигур, — нет. Функцию заполнения можно использовать через общую точку входа CIO, которая вызывается с помощью команды BASIC. 11 .
БАЗОВОЕ заявление OPEN # подготавливает устройство к доступу к вводу/выводу:
10 REM Opens the cassette device on channel 1 for reading in BASIC
20 OPEN #1,4,0,"C:MYPROG.DAT"
Здесь, OPEN# означает «убедиться, что канал 1 свободен», вызвать C: драйвер для подготовки устройства (это приведет к натяжению катушек с кассетами и перемещению головок вперед, удерживая кассетный проигрыватель «на паузе». 4 означает «чтение» (остальные коды 8 для записи и 12 = 8 + 4 для «чтения и записи»). Третье число — это вспомогательная информация, которая устанавливается на 0, когда она не нужна. C:MYPROG.DAT — имя устройства и имя файла; имя файла игнорируется драйвером кассеты. Физические устройства могут иметь номера (в основном диски, принтеры и последовательные устройства), поэтому " П1: "может быть, заговорщик и" P2: "принтер-ромашка, или" D1: "может быть один диск и" D2: " и так далее. Если его нет, предполагается 1.
Оператор LPRINT отправляет строку на принтер.
А читает PEEK позволяет просматривать ячейки памяти, поддерживаемые драйвером клавиатуры, или открывать их как файл (например, OPEN 1,4,0,"K:":GET #1,A$
). Последний ждет нажатия клавиши.
Ввод текста DOS из BASIC выходит в командное меню Atari DOS . Все несохраненные программы будут потеряны, если на текущем диске не включена функция подкачки файлов в памяти. В BASIC нет команды для отображения каталога диска; это необходимо сделать, выйдя в DOS.
Графика и звук
[ редактировать ]Atari BASIC поддерживает звук (через оператор SOUND ), графика ( ГРАФИКА, НАСТРОЙКА ЦВЕТА, ЦВЕТ, СЮЖЕТ, DRAWTO ) и контроллеры ( ПАЛКА, СТРИГ, ВЕСЛО, ТРИГ ). [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.
Произвольный доступ через DATA/RESTORE
[ редактировать ]Числовые переменные и выражения могут использоваться в качестве параметра для RESTORE
заявление, позволяющее DATA
операторы, к которым будет произвольный доступ через код, такой как RESTORE ROOMBASE+ROOMNUMBER:READ DESCRIPTION$, TREASURE$, EXITS
. Это также можно использовать для эмуляции статических массивов строк: RESTORE STRBASE+INDEX:READ A$:PRINT A$
.
Обработка ошибок с помощью TRAP
[ редактировать ]The TRAP
Инструкция переходит к номеру строки при возникновении ошибки, и это уменьшает необходимость ручной проверки ошибок. Например, при рисовании графики на экране не обязательно проверять, выходят ли линии за границы экрана текущего графического режима. Это состояние ошибки можно перехватить и при необходимости обработать ошибку.
Включает
[ редактировать ]The ENTER
Команда считывает исходный код с устройства и объединяет его с текущей программой, как если бы его ввел пользователь. Это позволяет сохранять программы по разделам с помощью LIST
, читая их с помощью ENTER
объединить или заменить существующий код. Используя блоки номеров строк, которые не перекрываются, программисты могут создавать библиотеки подпрограмм и при необходимости объединять их в новые программы.
Самомодифицирующийся код
[ редактировать ]Редактор можно настроить на многократное чтение ввода с экрана до тех пор, пока не будет достигнут EOF. Это позволяет программе писать новый программный код, за которым следует CONT
затем выведите оператор на экран, поместив экранный курсор в начало нового кода, STOP
работающей программе, что приводит к чтению нового кода и продолжению выполнения CONT
заявление.
Встроенный машинный язык
[ редактировать ]Atari BASIC может вызывать подпрограммы машинного кода, хранящиеся в строках или 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 должен работать быстрее, чем современные BASIC, основанные на шаблоне MS. Поскольку исходный код полностью токенизирован при вводе, все этапы токенизации и анализа уже завершены. Даже сложные математические операции готовы к выполнению: все числовые константы уже преобразованы во внутренний 40-битный формат, а значения переменных ищутся по адресу, а не искать их. [и] На практике Atari BASIC медленнее, чем большинство других BASIC для домашних компьютеров , часто значительно. [27]
В двух широко используемых тестах той эпохи, Byte журнала «Решете Эратосфена» и тесте Creative Computing, написанном Дэвидом Х. Алом , Atari финишировала ближе к концу списка с точки зрения производительности и была намного медленнее, чем современный Apple II. и ПЭТ , [28] несмотря на то, что тот же процессор работает примерно в два раза быстрее. Он финишировал позади более медленных машин, таких как ZX81 , и даже некоторых программируемых калькуляторов. [29]
Большая часть медлительности языка связана с тремя проблемами. [27]
Во-первых, математические процедуры с плавающей запятой плохо оптимизированы. В тесте Ahl операция с одной экспонентой была причиной большей части плохих результатов машины. [27] Преобразование между числами с плавающей запятой и 16-битными целыми числами также происходит особенно медленно. Внутри эти целые числа используются для номеров строк и индексации массивов, а также для некоторых других задач, но числа в токенизированной программе хранятся в двоично-десятичном формате (BCD). [30] Всякий раз, когда встречается один из них, например номер строки в GOTO 100
, значение BCD преобразуется в целое число, что может занять до 3500 микросекунд. [31]
Другая проблема заключается в том, как Atari BASIC реализует ветвления. Чтобы выполнить ветвь в GOTO
или GOSUB
, интерпретатор ищет по всей программе соответствующий номер строки. [32] Напротив, современные версии BASIC, основанные на MS, будут выполнять поиск вперед от текущей строки, если номер строки целевой ветки будет больше, тем самым улучшая производительность ветвления в среднем примерно в два раза.
Связанной с этим и более серьезной проблемой является реализация FOR
... NEXT
петли. Когда FOR
оператор выполняется, Atari BASIC записывает номер его строки. Каждый раз, когда NEXT
достигнута, она ищет в программе эту строку, несмотря на то, что она находится в том же месте, что и в прошлый раз. [27] Все остальные BASIC вместо этого записывают ячейку памяти FOR
оператор и может немедленно вернуться к нему без необходимости поиска.
Причину столь плохих результатов лучше всего иллюстрирует цитата одного из ее основных авторов, Билла Уилкинсона; в 1982 году он заявил:
Лично я никогда не был уверен, что интерпретируемому языку (например, BASIC) необходимо быть быстрым. Авторы... утверждают, что Atari BASIC — самый медленный язык, когда-либо созданный. Моим первым порывом было сказать: «Кого это волнует?» [33]
Эту философию можно противопоставить философии Стива Возняка для Apple BASIC оригинального Apple I , которая была разработана специально для обеспечения производительности, необходимой для написания игр:
После разработки аппаратных аркадных игр я понял, что возможность программировать их на BASIC изменит мир. [34]
На платформе появилось несколько сторонних BASIC, которые решили некоторые или все эти проблемы. Уилкинсона Сюда входил собственный BASIC XL , который сократил время теста Byte со 194 до 58 секунд. [27] более чем в три раза быстрее. В тесте Ahl Atari BASIC потребовалось 405 секунд, тогда как точно такой же код в Turbo-BASIC XL занял 41,6 секунды, что является улучшением на порядок. [35]
Отличия от Microsoft BASIC
[ редактировать ]- Синтаксис проверяется, и ошибки сразу выделяются при вводе строки.
- Имена переменных могут иметь произвольную длину, и все символы являются значимыми.
- Следующие ключевые слова отсутствуют в Atari BASIC:
INKEY$
,CLS
,DEF FN
,SPC
,TAB
,ELSE
. - Перед использованием всем массивам необходимо определить размеры, в то время как Microsoft BASIC по умолчанию устанавливает размер массива в 10 элементов, если он не имеет размеров.
- Строковые переменные рассматриваются как массивы символов, и перед использованием им необходимо определить размеры. MS BASIC хранит строки в куче и иногда делает паузу для сборки мусора .
- Функции
LEFT$
,MID$
, иRIGHT$
заменяются строковой индексацией. - Оператора объединения строк не существует.
- Нет никаких массивов строк.
- Целочисленные переменные не поддерживаются.
- Побитовых операторов нет.
INPUT
не позволяет подсказку.PRINT
может быть сокращено как?
как в Microsoft BASIC, но Atari BASIC не токенизирует его вPRINT
. Это остается знаком вопроса.- Цель
GOTO
иGOSUB
может быть переменной или выражением. RESTORE
может принимать числовую константу, переменную или выражение в качестве параметра, вызывая следующееREAD
начать с указанного номера строкиFOR..NEXT
циклы в Atari BASIC должны иметь имя переменной, на которую ссылаетсяNEXT
заявление, хотя Microsoft BASIC этого не требует.- Несколько переменных не допускаются с
NEXT
операторы, как они есть в Microsoft BASIC (например,NEXT X,Y
). LIST
для разделения диапазона используется запятая вместо знака минус.
Ключевые слова
[ редактировать ]Примечания
[ редактировать ]- ^ AppleSoft BASIC занимал ячейки памяти от $D000 до $F7FF, всего 10240 байт.
- ^ Commodore BASIC использовал две основные области памяти: $A000-$BFFF и $E000-$E4D2. [9]
- ^ Applesoft находилась в районе $D000-$F7FF, включая библиотеку FP. [10]
- ^ Хотя дерево разбора реализовано как набор таблиц, что на самом деле является деталью реализации.
- ^ По этой причине MS-BASIC имеют только две значащие буквы в именах переменных. Они хранятся в списке, содержащем только два байта ASCII для имени, чтобы сократить время поиска.
Ссылки
[ редактировать ]Цитирование
[ редактировать ]- ^ Jump up to: а б Лоренцо, Марк (2017). Бесконечный цикл: история языка программирования BASIC . Филадельфия: Книги SE. п. 106. ИСБН 978-1974-27707-0 .
- ^ Уилкинсон, О'Брайен и Лотон 1983 .
- ^ Декуир 2004 .
- ^ Jump up to: а б с д и Уилкинсон 1982 , с. ix.
- ^ Стейл, Майкл (20 октября 2008 г.). «Создайте свою собственную версию Microsoft BASIC для 6502» . Требуется некоторая сборка .
- ^ Уилкинсон 1982 , стр. iv – v.
- ^ Кромемко 1978 .
- ^ Cromemco 1978 , стр. 2, 3.
- ^ «Карта памяти» .
- ^ «Карта памяти – Apple II с загруженным Applesoft BASIC» .
- ^ Jump up to: а б Уилкинсон 1982 , с. в.
- ^ Jump up to: а б Уилкинсон 1982 , с. х.
- ^ Черри, Чарльз (июнь 1987 г.). «БАЗОВОЕ Золотое дно» . Антик .
- ^ Уилкинсон 1982 , с. VI.
- ^ Jump up to: а б «Ошибки Atari BASIC» . Вычислите! . Июль 1986 г. с. 10.
- ^ Jump up to: а б Рэдклифф, Мэтью (сентябрь 1985 г.). «Конвертер редакции C» . Антик . Проверено 8 июля 2023 г.
- ^ Jump up to: а б с д Чедвик 1985 , с. 230.
- ^ Чедвик 1985 , стр. 250–251.
- ^ Харди, Боб (февраль 1993 г.). «Получатель кодов ключей» . Классика Атари . п. 18.
- ^ Руководство 1980 г. , Приложение B.
- ^ Jump up to: а б с Кроуфорд 1982 , с. 10.3.
- ^ Кроуфорд 1982 , с. 10.6.
- ^ Уилкинсон, О'Брайен и Лотон 1983 , с. 5.
- ^ Справочное руководство HP 2000/Access BASIC (PDF) . Хьюлетт Паккард. Май 1976. стр. e.
- ^ Руководство 1980 г. , с. 54.
- ^ «ATR: глава 15: Списки отображения» .
- ^ Jump up to: а б с д и Уилкинсон 1985 , с. 139.
- ^ Ахль, Дэвид (ноябрь 1983 г.). «Эталонный сравнительный тест» . Творческие вычисления . стр. 259–260.
- ^ Ахль, Дэвид (январь 1984 г.). «Бенчмарк творческих вычислений» . Творческие вычисления . п. 12.
- ^ Уилкинсон, О'Брайен и Лотон 1983 , с. 17.
- ^ Кроуфорд 1982 , с. 8.45.
- ^ Победитель, Лейн (1982). «De Re Atari, Глава 10: Atari BASIC» . Атари, Инк.
- ^ Уилкинсон, Билл (сентябрь 1982 г.). «Инсайт: Атари» . Вычислите! . п. 116.
- ^ Уильямс, Грегг; Мур, Роб (декабрь 1984 г.). «История Apple / Часть 1: Ранняя история» . Байт . п. А71.
- ^ «Эталон Ахла?» . 28 ноября 2007 г.
Библиография
[ редактировать ]- Справочное руководство по ATARI BASIC . Atari Inc. 1980. Архивировано из оригинала 1 мая 2005 года.
- Чедвик, Ян (1985). Карта Атари . Вычислите! Публикации. ISBN 0-87455-004-1 .
- Кроуфорд, Крис (1982). Де Ре Атари . Обмен программами Atari.
- Cromemco 16K Расширенный BASIC (PDF) . Кромемко. 1978.
- Уилкинсон, Билл (1982). Внутри Atari DOS . Optimized Systems Software, Inc. ISBN 0-942386-02-7 . Проверено 4 апреля 2009 г.
- Декуир, Джо (30 декабря 2004 г.). 3 поколения архитектуры игровых автоматов (Речь). Classic Gaming Expo 2004. Конференц-центр Сан-Хосе.
- Уилкинсон, Билл; О'Брайен, Кэтлин; Лотон, Пол (1983). Справочник по Atari BASIC . Вычислите! Книги. ISBN 0-942386-15-9 .
- Уилкинсон, Билл (февраль 1985 г.). «ИНСАЙТ: Атари» . Творческие вычисления . стр. 139–140.
Внешние ссылки
[ редактировать ]- Atari BASIC, Хороший, плохой, злой
- Альбрехт, Боб; Финкель, Лерой; Браун, Джеральд Р. (1979). Atari Basic — Руководство для самообучения . Проверено 29 июня 2013 г.
- Альбрехт, Боб; Финкель, Лерой; Браун, Джеральд Р. (1985). Atari Basic — издание XL . Проверено 29 июня 2013 г.
- Викиверситет: программирование на Atari BASIC