Applesoft BASIC — диалект Microsoft BASIC , разработанный Марком Макдональдом и Риком Вейландом , поставляемый с компьютерами Apple II . Он заменяет Integer BASIC и является BASIC в ПЗУ во всех компьютерах серии Apple II после оригинальной модели Apple II . Его также называют FP BASIC (от floating point ) из-за команды Apple DOS,FP
используемой для его вызова, вместо INT
Integer BASIC.
Applesoft BASIC был предоставлен Microsoft , и его название произошло от названий Apple Computer и Microsoft. Сотрудники Apple, включая Рэнди Виггинтона , адаптировали интерпретатор Microsoft для Apple II и добавили несколько функций. Первая версия Applesoft была выпущена в 1977 году на кассетной ленте и не имела надлежащей поддержки графики высокого разрешения. Applesoft II , которая была доступна на кассете и диске, а также в ПЗУ Apple II Plus и последующих моделей, была выпущена в 1978 году. Именно эта последняя версия, которая имеет некоторые различия в синтаксисе и поддерживает режимы графики высокого разрешения Apple II, обычно является синонимом термина «Applesoft».
Компилятор для Applesoft BASIC, TASC (The Applesoft Compiler), был выпущен Microsoft в 1981 году. [1]
Когда Стив Возняк написал Integer BASIC для Apple II , он не реализовал поддержку арифметики с плавающей точкой, поскольку его в первую очередь интересовало написание игр, задача, для которой было достаточно одних только целых чисел. [2] В 1976 году Microsoft разработала Microsoft BASIC для MOS Technology 6502 , но в то время не было ни одного серийного компьютера, который бы его использовал. Узнав, что у Apple есть машина 6502, Microsoft спросила, заинтересована ли компания в лицензировании BASIC, но Стив Джобс ответил, что у Apple уже есть один.
Apple II был представлен публике на выставке West Coast Computer Faire в апреле 1977 года и поступил в продажу в июне. Одной из самых распространенных жалоб клиентов на компьютер было отсутствие в BASIC математики с плавающей точкой. [3] Еще больше усложняло ситуацию то, что у конкурирующего персонального компьютера Commodore PET с самого начала был интерпретатор BASIC с поддержкой плавающей точки. Поскольку Возняк — единственный человек, который понимал Integer BASIC достаточно хорошо, чтобы добавлять функции плавающей точки, — был занят дисководом и контроллером Disk II , а также Apple DOS , Apple обратилась к Microsoft.
Apple, как сообщается, получила восьмилетнюю лицензию на Applesoft BASIC от Microsoft за фиксированную плату в размере 31 000 долларов США, продлив ее в 1985 году по соглашению, которое предоставило Microsoft права и исходный код для версии BASIC для Macintosh от Apple . [4] Applesoft был разработан с учетом обратной совместимости с Integer BASIC и использует ядро реализации Microsoft 6502 BASIC, которое включает использование команды GET для обнаружения нажатий клавиш и не требует никаких пробелов в строках программы. Хотя Applesoft BASIC медленнее Integer BASIC, у него есть много функций, которых нет в старом BASIC:
DIM A$(10)
DATA
операторы с командами READ
и RESTORE
для представления числовых и строковых значений в количественном выраженииCHR$
, STR$
, и VAL
функции для преобразования между строковыми и числовыми типами (оба языка имели эту ASC
функцию)Напротив, в Applesoft отсутствует MOD
оператор (остаток) из Integer BASIC.
Адаптация BASIC для Apple II была утомительной работой, поскольку Apple получила исходный листинг для Microsoft 6502 BASIC, который оказался глючным и также требовал добавления команд Integer BASIC. Поскольку у Apple не было ассемблера 6502, команда разработчиков была вынуждена отправить исходный код по телефонным линиям в Call Computer, компанию, предлагавшую услуги компилятора. Это был чрезвычайно утомительный и медленный процесс, и после того, как Call Computer потеряла исходный код из-за неисправности оборудования, один из программистов, Клифф Хьюстон, использовал свой собственный компьютер IMSAI 8080 для кросс-ассемблирования исходного кода BASIC. [5]
Applesoft похож на BASIC 2.0 от Commodore, за исключением функций, унаследованных от Integer BASIC. Есть несколько незначительных отличий, таких как отсутствие в Applesoft побитовых операторов; в противном случае большинство программ BASIC, не использующих аппаратно-зависимые функции, будут работать на обоих BASIC.
Оператор PR# перенаправляет вывод на карту расширения, а IN# перенаправляет ввод с карты расширения. Номер слота карты указывается после PR# или IN# в операторе. Компьютер блокируется, если в слоте нет карты. PR#0 восстанавливает вывод на 40-колоночный экран, а IN#0 — на клавиатуру.
Оператор PR# может использоваться для перенаправления вывода на принтер (например, ), где x — номер слота, содержащего карту порта принтера. Чтобы отправить листинг программы BASIC на принтер, пользователь вводит .10 PR#x:PRINT"Hello!"
PR#x:LIST
Использование PR# на слоте с дисководом (обычно в слоте 6) заставляет Applesoft загрузить дисковод. Использование PR# на слоте с картой на 80 столбцов (обычно в слоте 3) переключает в текстовый режим на 80 столбцов.
Как и в Commodore BASIC, числовые переменные хранятся как 40-битные с плавающей точкой; каждая переменная требует пять байт памяти. Программист может обозначить переменные как целые, поставив после них знак процента, в этом случае они используют два байта и ограничены диапазоном от -32768 до 32767; однако BASIC внутренне преобразует их обратно в плавающую точку при выполнении вычислений, в то время как каждый знак процента также занимает дополнительный байт программного кода, поэтому на практике эта функция полезна только для сокращения использования памяти большими переменными массива, поскольку она не дает никакого выигрыша в производительности.
Функция RND генерирует псевдослучайное дробное число от 0 до 1. RND(0)
возвращает последнее сгенерированное случайное число. RND с отрицательным числом перейдет к точке в последовательности, определяемой конкретным использованным отрицательным числом. RND с любым положительным значением генерирует следующее число в последовательности, независимо от фактического заданного значения.
Как и другие реализации Microsoft BASIC, Applesoft отбрасывает пробелы (вне строк и комментариев) в строках программы. LIST
добавляет пробелы при отображении кода для удобства чтения. Поскольку LIST добавляет пробел до и после каждого токенизированного ключевого слова, он часто создает два пробела подряд, когда для удобства чтения было бы достаточно одного.
По умолчанию приглашением INPUT
является вопросительный знак. PRINT
не добавляет начальный пробел перед числами.
В нескольких ранних моделях Apple II Applesoft BASIC не поддерживал использование строчных букв в программах, за исключением строк. PRINT
является допустимой командой, но print
приводит Print
к синтаксической ошибке.
В Applesoft отсутствуют несколько команд и функций, общих для большинства интерпретаторов Microsoft BASIC, отличных от 6502, например:
INSTR
(поиск подстроки в строке)PRINT USING
(форматировать числа в печатном виде)INKEY$
(проверьте нажатие клавиши, не останавливая программу; хотя PEEK в ячейку $C000 выполняет это действие)LPRINT
(вывод на принтер вместо экрана)Applesoft не имеет команд для обработки файлов или дисков, кроме как для сохранения и загрузки программ с помощью кассеты. Дисковая операционная система Apple II, известная просто как DOS, дополняет язык, чтобы предоставить такие возможности.
Значимы только первые две буквы имен переменных. Например, "LOW" и "LOSS" рассматриваются как одна и та же переменная, и попытка присвоить значение "LOSS" перезапишет любое значение, присвоенное "LOW". Программист также должен избегать последовательных букв, которые являются командами или операциями Applesoft. Имя "SCORE" для переменной интерпретируется как содержащее OR
логический оператор , отображаемый как SC OR E
. "BACKGROUND" содержит GR
, команду для вызова графического режима низкого разрешения, и приводит к синтаксической ошибке.
Единственная поддержка звука — это возможность использовать символ колокольчикаPRINT
ASCII для подачи звукового сигнала системного оповещения и команда для нажатия на динамик. Язык недостаточно быстр, чтобы производить больше, чем баритональное гудение от повторяющихся щелчков. Однако программы могут хранить подпрограмму на машинном языке, которая будет вызываться для генерации электронных музыкальных тонов, охватывающих несколько октав.PEEK
Applesoft поддерживает рисование в режимах низкого и высокого разрешения Apple II. Существуют команды для построения пикселей и рисования горизонтальных и вертикальных линий в низком разрешении. Высокое разрешение позволяет использовать произвольные линии и векторные таблицы фигур для рисования масштабированных и повернутых объектов. Единственное положение для смешивания текста и графики — четыре строки текста в нижней части графического дисплея.
Начиная с Apple IIe , режим "двойного высокого разрешения" стал доступен на машинах с 128k памяти. Этот режим по сути дублирует разрешение исходного режима высокого разрешения, но включает все 16 цветов палитры низкого разрешения. Applesoft не предоставляет прямой поддержки этого режима. Специфические для Apple IIGS режимы также не поддерживаются.
Applesoft BASIC можно расширить двумя способами: командой амперсанда ( & ) и функцией USR() . Это две функции, которые вызывают низкоуровневые процедуры машинного языка, хранящиеся в памяти, что полезно для процедур, которые должны быть быстрыми или требуют прямого доступа к произвольным функциям или данным в памяти. Функция USR() принимает один аргумент и может быть запрограммирована на получение и возврат вычисленного значения функции для использования в числовом выражении. фактически является сокращением для CALL с предопределенным адресом. Вызывая процедуры в ПЗУ Applesoft, процедуры амперсанда могут анализировать значения, следующие за амперсандом. Было доступно множество сторонних коммерческих пакетов для расширения Applesoft с использованием процедур амперсанда.&
Недостаток перехвата ошибок via ONERR
означает, что системный стек не сбрасывается, если процедура обработки ошибок не вызывает RESUME
, что может привести к сбою. [6] Встроенная функция генератора псевдослучайных чисел RND
способна выдавать предсказуемую серию выходных данных благодаря способу, которым генератор задается при первом включении. Такое поведение противоречит тому, как документация Apple описывает эту функцию. [7]
Первоначально Возняк называл свой Integer BASIC «Game BASIC» (написав его для того, чтобы реализовать клон Breakout для своего нового компьютера). [2] На Applesoft BASIC было написано мало игр в жанре экшн , во многом потому, что использование чисел с плавающей точкой для всех математических операций снижает производительность.
Программы Applesoft BASIC хранятся в виде связанного списка строк; GOTO
или GOSUB
занимает линейное время . Некоторые программы имеют подпрограммы в верхней части, чтобы сократить время их вызова.
В отличие от Integer BASIC, Applesoft не преобразует литеральные числа (например, 100) в исходном коде в двоичные при вводе строки. Вместо этого строка ASCII преобразуется всякий раз, когда выполняется строка. Поскольку поиск переменных часто быстрее этого преобразования, может быть быстрее сохранять числовые константы, используемые внутри циклов, в переменных до ввода цикла.
Hello, World! в Applesoft BASIC можно ввести следующим образом:
10 ТЕКСТ : ДОМОЙ 20 ? "ПРИВЕТ МИР"
Несколько команд могут быть включены в одну строку кода, если они разделены двоеточием ( :
). Их ?
можно использовать в Applesoft BASIC (и почти во всех версиях Microsoft BASIC) как сокращение для «PRINT», хотя написание слова не только приемлемо, но и канонично — Applesoft преобразовывал «?» во введенных программах в тот же токен, что и «PRINT» (таким образом, при использовании «?» память фактически не экономится), поэтому они отображаются как «PRINT» при перечислении программ. Программа выше отображается в LIST
команде как:
10 ТЕКСТ : ГЛАВНАЯ 20 ПЕЧАТЬ "HELLO WORLD"
Когда Applesoft II BASIC был первоначально выпущен в середине 1978 года, он поставлялся на кассетной ленте и мог быть загружен в память через монитор машинного языка Apple II. Когда усовершенствованный Apple II+ заменил оригинальный II в 1979 году, Applesoft теперь был включен в ПЗУ и автоматически запускался при включении питания, если отсутствовала загрузочная дискета. Напротив, Integer BASIC теперь был удален из ПЗУ и превращен в исполняемый файл на диске DOS 3.3.
Оригинальный Applesoft, хранящийся в ОЗУ, как описано в его Справочном руководстве от ноября 1977 года, имеет меньший код интерпретатора, чем более поздняя Applesoft II, занимая 8½ КБ памяти, [8] вместо 10 КБ, используемых более поздней Applesoft II. Следовательно, в нем отсутствует ряд командных функций, разработанных для более поздней, основной версии:
а также несколько более поздних версий, которые уже присутствовали в Integer BASIC от Apple:
Кроме того, его графические команды низкого разрешения имеют названия, отличные от их аналогов Integer BASIC/Applesoft II. Все названия команд имеют форму PLTx, так что GR, COLOR=, PLOT, HLIN и VLIN называются PLTG, PLTC, PLTP, PLTH и PLTV соответственно. Команда для возврата в текстовый режим, известная как TEXT в других версиях, — это просто TEX, и есть условие, что она должна быть последним оператором в строке программы.
Applesoft BASIC 1.x был ближе к оригинальному коду Microsoft 6502 BASIC, чем более поздний Applesoft II; он сохранил запрос Memory Size? и отображал уведомление об авторских правах Microsoft. Для сохранения согласованности с Integer BASIC запрос «Ok» из кода Microsoft был заменен символом ]. Applesoft 1.x также предлагал пользователю при загрузке отключить оператор REM и ключевое слово LET в операторах присваивания в обмен на графические команды lores.
Функция USR() также определяется по-другому, выступая в качестве замены отсутствующей команды CALL. Ее аргумент не предназначен для передачи числового значения в подпрограмму машинного языка, а вместо этого является адресом вызова самой подпрограммы; нет «зацепки» для предварительного определения адреса. Все несколько примеров в руководстве используют функцию только для доступа к подпрограммам «системного монитора ROM» или коротким пользовательским подпрограммам для управления подпрограммами ROM. Не упоминается ни один код для вычисления значения, возвращаемого самой функцией; функция всегда отображается как назначенная «фиктивным» переменным, которые без действия по установке значения пользовательским кодом просто получают бессмысленное значение, возвращаемое им. Даже доступные подпрограммы ROM, которые возвращают значения (в примерах те, которые предоставляют услуги функций PDL() и SCRN()), просто сохраняют свои значения пользовательскими подпрограммами в местах, которые отдельно PEEKируются в последующем операторе.
В отличие от Integer BASIC и Applesoft II, булевы операторы AND, OR и NOT выполняют побитовые операции над 16-битными целыми значениями. Если им заданы значения за пределами этого диапазона, возникает ошибка.
Термины OUT и PLT (а также вышеупомянутый IN) присутствуют в списке зарезервированных слов, но нигде в руководстве не объясняются.
Coleco заявила, что исходный код SmartBASIC ее домашнего компьютера Adam совместим с Applesoft. [9]
Microsoft лицензировала BASIC, совместимый с Applesoft, для VTech для своего клона Laser 128. [10]
Все, кто знает Applesoft BASIC, также знают Adam SmartBASIC. Доступны все те же команды, все те же элементы управления для этого BASIC, этого интерпретатора. Фактически, мы собираемся показать вам программу, которая использует графические команды Applesoft ... выполняемые через Adam. ... Что касается нас, когда мы находимся в BASIC, и мы не PEEKing или POKEing ... все, что находится ниже интерпретатора BASIC, мы совместимы по исходному коду.
В статье использован текст из Everything2, лицензированный по GFDL.