Введение

Интегер BASIC — интерпретатор BASIC, написанный Стивом Возняком для компьютеров Apple I и Apple II. Первоначально доступный на кассете для Apple I в 1976 году, а затем включенный в ПЗУ на Apple II с момента его выпуска в 1977 году, он был первой версией BASIC, которую использовали многие ранние владельцы домашних компьютеров. Единственным числовым типом данных было целое число; числа с плавающей точкой не поддерживались. Использование целых чисел позволяло хранить числа в компактном 16-битном формате, который можно было быстрее считывать и обрабатывать, чем 32- или 40-битные форматы чисел с плавающей точкой, используемые в большинстве BASIC того времени. Это делало его настолько быстрым, что Билл Гейтс пожаловался, когда он показал лучшие результаты, чем Microsoft BASIC в тестах производительности. Однако это также ограничивало его применимость в качестве языка программирования общего назначения. Другое отличие от других BASIC того времени заключалось в том, что Integer BASIC рассматривал строки как массивы символов, подобно системе в C или Fortran 77. Доступ к подстрокам осуществлялся с помощью срезов массивов, а не строковых функций. Этот стиль был впервые представлен в HP Time Shared BASIC и также встречался в других современных BASIC, основанных на HP, таких как North Star BASIC и Atari BASIC. Он контрастировал со стилем, используемым в BASIC, разработанных на основе DEC, включая Microsoft BASIC. Изначально язык разрабатывался под названием GAME BASIC и назывался просто Apple BASIC при его представлении на Apple I. Он стал Integer BASIC, когда был портирован на Apple II и поставлялся вместе с Applesoft BASIC — портом Microsoft BASIC, который поддерживал числа с плавающей точкой. Integer BASIC постепенно был заменен Applesoft BASIC, начиная с Apple II Plus в 1979 году.

История

В старших классах школы учитель электроники Стива Возняка организовал для лучших учеников в классе стажировки в местных компаниях по электронике. Возняка отправили в Sylvania, где он программировал на FORTRAN на IBM 1130. В том же году General Electric установила терминал в средней школе, подключенный к одному из их мейнфреймов с сервисом совместного использования BASIC, который они активно продвигали. После трех дней доступа студентов попросили написать письма с обоснованием необходимости постоянной установки терминала в школе, но их усилия не увенчались успехом. Несколько лет спустя Возняк работал в Hewlett Packard (HP), выполняя моделирование схем чипов и компоновки логики для калькуляторов. HP добилась значительных успехов на рынке миникомпьютеров с машинами серии HP 2000, работающими на собственной версии BASIC для совместного использования времени. За приблизительно 200 долларов можно было собрать достаточно оснащенную машину, поддерживающую от 16 до 32 пользователей, работающих с программами BASIC. Несмотря на высокую стоимость, это все равно было значительно дешевле, чем мейнфреймы и, для активных пользователей, чем услуги совместного использования времени. Затем HP выпустила HP 9830 – настольную машину, также работающую на BASIC, к которой имел доступ Возняк. В январе 1975 года был анонсирован Altair 8800, положивший начало микрокомпьютерной революции. В марте Возняк посетил первое собрание Homebrew Computer Club и начал разрабатывать собственный компьютер. Одним из важнейших и наиболее часто пиратских программных обеспечений для Altair был Altair BASIC от недавно созданной Microsoft. Возняк пришел к выводу, что его машине нужен собственный BASIC, который, возможно, станет первым для процессора MOS Technology 6502. Поскольку языку требовалось 4 КБ оперативной памяти, он установил это как минимальный объем памяти для проекта. Источниками Возняка для BASIC были копия 101 BASIC Computer Games и руководство HP BASIC. Он не знал, что BASIC от HP сильно отличался от разновидности DEC BASIC, используемой в 101 Games, которая также была основой Microsoft BASIC для Altair. На основе этих источников Возняк начал набрасывать схему синтаксиса языка. Изначально проект включал поддержку чисел с плавающей запятой, но, надеясь первым опубликовать BASIC для 6502 и стать "звездой", он решил отказаться от чисел с плавающей запятой и написать отдельную систему целочисленной математики, чтобы сэкономить несколько недель программирования. В дальнейшем Возняк описал свой язык как "предназначенный главным образом для игр и образовательных целей". На протяжении всей разработки он называл его "GAME BASIC" и писал код вручную, переводя инструкции ассемблера в их машинные эквиваленты, а затем загружая результат в свой компьютер. Не имея опыта в написании компьютерных языков, он использовал свой опыт работы с калькулятором HP для реализации стековой машины для интерпретации выражений. После запуска основных подпрограмм он последовательно работал над другими командами, модульным способом. С каждым посещением клуба Homebrew он демонстрировал новые функции, добавленные за последний месяц. В начале 1976 года в рекламе своего компьютера Apple I компания Apple Inc. заявила, что "наша философия заключается в предоставлении программного обеспечения для наших машин бесплатно или по минимальной цене" и "да, друзья, Apple BASIC бесплатен". Это было опубликовано вскоре после печально известного открытого письма Билла Гейтса любителям, в котором утверждалось, что люди грабят его, копируя версии Altair BASIC. Возняк помог Стиву Джобсу, работавшему в Atari, с перепроектированием Breakout. Позже он решил проверить, можно ли написать эту игру на BASIC. Он добавил команды для чтения контроллеров и после нескольких быстрых правок получил рабочую версию игры. Чтобы улучшить игровой процесс, он добавил динамик, издающий щелчки при столкновении мяча с препятствиями. Демонстрируя игру Джобсу, Возняк показал, что может быстро менять цвета, используемые в игре, просто изменяя исходный код. В дальнейшем Возняк написал, что доказал, что "программное обеспечение намного гибче аппаратного обеспечения", и что он и Джобс поняли, что "теперь любой может создавать аркадные игры, не разрабатывая их на аппаратном уровне". Возняк завершил библиотеку чисел с плавающей запятой для 6502 и опубликовал ее в августовском выпуске журнала Dr. Dobb's Journal за 1976 год. Эта библиотека позже вошла в состав ПЗУ Apple II. Возняк начал портировать код чисел с плавающей запятой в Apple BASIC, но отвлекся на разработку контроллера дисковода для Disk II. Майк Марккула сказал, что компания поедет на Consumer Electronics Show в Лас-Вегасе, если дисковая система будет готова вовремя, поэтому Возняк и Рэнди Уиггингтон работали над ней без остановки в течение праздников 1977 года. Вернувшись к теме чисел с плавающей запятой в BASIC, Джобс пожаловался, что это занимает слишком много времени. Не зная об этом, компания уже договорилась о лицензии с Microsoft на получение их недавно завершенной версии Altair для 6502. Изучив код MS, Возняк решил, что проще добавить поддержку графики в их код, чем добавлять числа с плавающей запятой в свой BASIC, поскольку последнее требовало ручного исправления исходного машинного кода, а код MS был написан на ассемблере и его было легче модифицировать. Разработка BASIC для Apple завершилась в пользу того, что стало Applesoft BASIC. В дальнейшем Возняк отметил: "Моим самым большим разочарованием было использование ужасных строковых функций, таких как и , вместо собственных". Когда Apple II поступил в продажу летом 1977 года, Integer BASIC поставлялся в ПЗУ, а Applesoft BASIC – на кассете. Это изменилось с выпуском Apple II Plus в 1979 году, когда Applesoft был помещен в ПЗУ.

Редактирование программы

Как и большинство реализаций BASIC того времени, Integer BASIC выполнял функции как интерпретатора языка, так и среды редактирования строк. Когда BASIC был запущен, отображалась командная строка, в которой пользователь мог вводить операторы. В отличие от более поздних домашних компьютерных платформ, BASIC не был средой по умолчанию при запуске Apple I – он обычно запускался в режиме монитора. BASIC запускался нажатием клавиши. Операторы, введенные с начальными номерами строк, сохранялись в память программы для "отложенного выполнения", либо как новые строки, либо заменяя строки с тем же номером. Операторы, введенные без номера строки, рассматривались как команды и выполнялись немедленно. Номера строк могли быть от 0 до 32767, а строки могли содержать до 128 символов. Integer BASIC также включал команду для автоматического присвоения номеров строк, начиная с заданного числа, например, с шагом 10. Команда `NEW` начинала нумерацию со строки 300 с шагом 5: 300, 305 и т.д. Автоматическая нумерация отключалась вводом команды `OLD`.

Одной из интересных особенностей редактора было то, что часть экрана можно было выделить как "окно", в котором происходило обновление в реальном времени. Обычно это был весь экран, но его можно было ограничить меньшей областью, записывая значения в ячейки памяти с 32 по 35. Эта функция позволяла создать редактируемую текстовую область, в то время как остальная часть экрана могла быть в графическом режиме.

Очистка

Как и в большинстве BASIC, программы запускались командой, и, как было принято, могли быть запущены с определенного номера строки, например, выполнение можно было остановить в любой момент с помощью, а затем возобновить с помощью tinue, в отличие от более типичной команды . Для пошагового выполнения можно было использовать инструкцию в командной строке или поместить её непосредственно в программу. При её включении номера строк выводились для каждой строки, которую проходила программа. Эту функцию можно было отключить командой .

Несколько необычной особенностью была команда (для "display"). При встрече в программе с этого момента любые изменения значения переменной отображались бы. Например, отображало бы значение X каждый раз, когда оно менялось, вместе с номером строки, где произошло изменение. Как и TRACE, DSP отключалась командой .

Названия переменных

В то время как в Dartmouth BASIC и HP BASIC имена переменных ограничивались максимум двумя символами (одной буквой или буквой, за которой следовала одна цифра), а в MS BASIC допускалось имя, состоящее из буквы, за которой могла следовать необязательная буква или цифра (остальные символы игнорировались), Integer BASIC выделялся тем, что поддерживал имена переменных любой длины (например, SUM, GAMEPOINTS, PLAYER2). Единственным ограничением было то, что имена переменных не могли совпадать с зарезервированными словами; например, THISCOLOR и COLORFUL были недопустимыми именами переменных, поскольку содержали ключевое слово, являющееся системной командой. Кроме того, длина строки была ограничена 128 символами, поэтому имена переменных не могли превышать эту длину.

Математика

Integer BASIC, как следует из названия, использует целые числа в качестве основы для своего математического пакета. Они хранились внутренне как 16-битное число, в формате little endian (как и у 6502). Это позволяло максимальное значение для любого вычисления находиться в диапазоне от -32768 до 32767; хотя формат мог также хранить значение 32768, BASIC не мог его отобразить. Вычисления, результаты которых выходили за пределы этого диапазона, приводили к ошибке. Infix-операторы включали сложение (+), вычитание (-), умножение (*), деление (/), MOD (остаток от деления) и возведение в степень (^). Бинарные операторы включали AND и OR. Бинарные сравнения включали стандартный набор: =, <, >, <=, >= и оператор <> (не равно), вдохновленный HP. Разрешались только одномерные массивы, размер которых ограничивался только объемом доступной памяти. Математических функций было немного: поддерживались только ABS (абсолютное значение), SGN (знак) и RND (случайное число). В отличие от версий, производных от MS, где параметр игнорировался и RND всегда возвращал значение 0 < 1, Integer BASIC использовал параметр; RND возвращал целое число от 0 до 5.

Струнки

Обработка строк в Integer BASIC была основана на системе, использованной в HP BASIC. В этой системе строковые переменные рассматривались как массивы символов, которые требовалось определить (выделить память) перед использованием. Это аналогично модели, используемой в C или Fortran 77. Это отличается от BASIC в стиле MS, где строки являются встроенным типом переменной длины. До того, как BASIC, производные от MS, стали де-факто стандартом, такой подход был распространен; North Star BASIC и Atari BASIC использовали ту же концепцию, как и другие. Строки в Integer BASIC использовали фиксированный объем памяти, независимо от количества символов, содержащихся в них, но не более 255 символов. Это давало преимущество, позволяя избежать медленного сбора мусора в куче, характерного для MS BASIC, но при этом приводило к неэффективному использованию памяти для строк, длина которых была меньше объявленной. Доступ к подстрокам осуществлялся с помощью синтаксиса срезов массивов. Например, `PRINT LEFT$(S,6)` выводило первые шесть символов строки `S`, символы с индексами от 0 до 5. Конкатенация осуществлялась с использованием той же системы: `MID$(S,5)=“ABC”` заменяло все символы, начиная с позиции 5, строкой "ABC". Это контрастирует с обработкой строк в стиле DEC/MS, которая использует строковые функции, такие как `SUBSTR()` для доступа к подстрокам и `CONCAT()` для конкатенации. Поскольку многие функции, которые обычно предоставляются строковыми функциями, были реализованы через срезы массивов, набор строковых функций был ограничен. Функция `LEN()` возвращала длину строки, а `ASC()` возвращала числовой код ASCII для первого символа строки. В Integer BASIC отсутствовал эквивалент функции `CHR$()`, которая возвращает символ ASCII по заданному числовому коду.

Графика и звук

Когда он был запущен, единственным игровым контроллером для Apple был контроллер Paddle, который имел два контроллера на одном разъёме. Положение контроллера можно было прочитать с помощью функции, передавая номер контроллера, 0 или 1, например, , возвращая значение от 0 до 255. Машины Apple не имели выделенного звукового оборудования, только простой "пищалку". Звуки воспроизводились путем записи в область памяти, соответствующую динамику, по адресу 16336. Многократное чтение этого значения генерировало тоны, и в руководстве предлагалось использовать математическое выражение для этого, например, . Поддержка графики была более развитой. Графический режим включался оператором , а выключался оператором . Рисование было модальным и обычно начиналось с команды на изменение цвета, что достигалось путем установки псевдопеременной; например, устанавливал цвет рисования на 12, светло-зеленый. Затем можно было нарисовать одну точку этого цвета, провести горизонтальную линию в строке 20 во всю ширину экрана или нарисовать короткую вертикальную линию в столбце 7. Функция возвращала цвет экрана в точке с координатами X, Y.

Вход/выход

Integer BASIC не имел пользовательских команд ввода/вывода, а также команд STEP и FOR…NEXT. Для ввода и вывода данных функциональность перенаправлялась на выбранный слот для карт с помощью команд OUT и IN, которые перенаправляли вывод или ввод (соответственно) в пронумерованный слот. После этого данные можно было отправлять на карту с помощью обычных команд записи и считывать с нее с помощью команд чтения.

Другие примечания

Integer BASIC включал в себя функцию, которая позиционировала курсор в заданном столбце от 0 до 39. Он отличался от версий, встречающихся в большинстве BASIC, тем, что это была команда, за которой следовало число, а не функция со значением в скобках; для перемещения курсора в столбец 10 в Integer BASIC использовалась команда , тогда как в MS это было бы . Кроме того, команда работала аналогично , но добавляла вертикальные пробелы вместо горизонтальных. По необъяснимой причине в этом случае координаты были от 1 до 24, а не от 0 до 23. Integer BASIC также включал команду для выхода из циклов. Она удаляла верхний элемент из стека FOR. Atari BASIC также поддерживал эту команду, а North Star BASIC использовал .

ПЗУ Integer BASIC также включали монитор машинного кода, "мини-ассемблер" и дизассемблер для создания и отладки программ на языке ассемблера. Возняк собрал монитор вручную как первую программу Apple II, а затем использовал его для написания Integer BASIC.

Реализация

Integer BASIC читает строки, введенные пользователем из буфера, и пропускает их через парсер, который выдает серию токенов. В процессе этого обнаруживались и перечислялись простые синтаксические ошибки. Если парсинг был успешен, номер строки (если он присутствовал) преобразовывался из десятичного формата ASCII в 16-битное целое число, а ключевые слова – в 7-битный целочисленный токен. Некоторые ключевые слова представлялись несколькими токенами; например, там, где в Microsoft BASIC для ключевого слова был один токен, в Integer BASIC было три токена: один, если за ключевым словом не следовало аргументов, один, если за ним следовало арифметическое выражение, и один, если за ним следовала строковая литеральная константа. Числовые литералы, такие как значение 500, преобразовывались в их 16-битное (двухбайтовое) двоичное представление, в данном случае – в шестнадцатеричный формат. Чтобы указать, что это значение, а не ключевое слово, один байт между и вставлялся перед двухбайтовым значением. Строковые литералы, такие как "HELLO WORLD", преобразовывались иначе, путем установки старшего бита каждого символа, так что хранилось как . Имена переменных преобразовывались аналогичным образом: буквы преобразовывались так, чтобы их старший бит был установлен, а любые цифры в имени представлялись соответствующими значениями от до , так что переменная токенизировалась бы как . Если строка была введена без номера строки, код выполнялся непосредственно из буфера. Если же номер строки присутствовал, строка копировалась из буфера в область хранения программы. Интерпретатор во время выполнения использовал два стека: один для ключевых слов операторов, а другой – для вычисления параметров. Каждому оператору присваивались два приоритета: один определял его место в многошаговой операции, например, в цепочке математических операций для обеспечения порядка действий, а другой указывал, когда следует проводить вычисление, например, вычислять внутренние значения формулы в скобках. При обнаружении переменных их имя анализировалось и затем искалось в области хранения переменных. Если переменная не была найдена, она добавлялась в конец списка. Адрес хранилища переменной, возможно, только что созданный, помещался в стек вычислений.

СУДОТЬ16

В дополнение к Integer BASIC, микросхемы ROM Apple содержали собственный язык ассемблера под названием SWEET16. SWEET16 основан на байт-кодах, выполняемых в простой 16-битной виртуальной машине. Такая модель была применена для доступа к памяти через непрямые 16-битные указатели и вычисления 16-битных математических функций без необходимости их преобразования в базовый многоинструкционный 8-битный код 6502. Вся виртуальная машина была реализована всего в 300 байтах. Код может вызывать SWEET16 посредством вызова подпрограммы, а затем возвращаться к обычному коду 6502 после завершения 16-битных операций. SWEET16 не использовался в основном коде BASIC, но впоследствии применялся для реализации нескольких утилит. Среди них особенно выделяется подпрограмма перенумерации строк, которая была включена в ROM Programmer's Aid #1, добавленный в более поздние модели Apple II и доступный для установки пользователями на более ранних версиях.

Плавающая точка

Хотя Integer BASIC содержал свои собственные математические подпрограммы, ПЗУ Apple II также включали полную библиотеку операций с плавающей точкой, расположенную в памяти ПЗУ между адресами и . Исходный код был включен в руководство пользователя Apple II. Программы на BASIC, которым требовались вычисления с плавающей точкой, могли вызывать эти подпрограммы.