Введение

TI BASIC – это язык программирования для домашних компьютеров TI 99/4A, интерпретатор BASIC, встроенный в домашний компьютер Texas Instruments TI 99/4 1979 года выпуска и его улучшенную версию TI 99/4A 1981 года. В отличие от большинства версий BASIC, распространенных на современных микрокомпьютерах, TI BASIC не берет свое начало от Microsoft BASIC, а был разработан компанией TI как интерпретатор, соответствующий разрабатываемому стандарту Minimal BASIC, созданному организациями ANSI и ECMA. Этот стандарт, в свою очередь, основывался на оригинальном Dartmouth BASIC 1960-х годов. Существует ряд различий, иногда незначительных, между TI BASIC и более распространенными версиями MS BASIC. Minimal BASIC лишен многих функций, обычно встречающихся в BASIC того времени, поэтому компания Texas Instruments позже выпустила картридж TI Extended BASIC, расширяющий функциональность, доступную пользователям BASIC. Он включал в себя широкий спектр функций, присутствующих в других BASIC, а также новые системные функции для работы со спрайтами, звуком и другими особенностями платформы. Как и на большинстве домашних компьютеров, TI BASIC использовался не только для программирования, но и в качестве упрощенной операционной системы. Помимо Minimal BASIC, TI добавила команды для работы с текстом, графикой и базовыми операциями с файлами, такими как запись на кассету или другие носители информации. Благодаря особенностям платформы TI 99, TI BASIC отличался крайне низкой производительностью, примерно вдвое ниже, чем у распространенных машин, но при этом демонстрировал высокую точность вычислений.

Выступление

TI 99 был основан на микропроцессоре TMS9900 – 16-битной разработке, изначально созданной для обеспечения единого чипа центрального процессора (CPU) в моделях начального уровня линейки миникомпьютеров TI 990. TMS9900 также подходил для использования в микрокомпьютере, но в то время остальные необходимые для создания полноценного компьютера вспомогательные чипы неизменно были 8-битными, включая широкий ассортимент таких чипов от TI. В миникомпьютерах 16-битные системы поддержки строились из множества отдельных чипов, что было неприемлемо для недорогого продукта. Поэтому TI приняла решение сделать машину преимущественно 8-битной и подключить различные вспомогательные чипы к этой 8-битной шине, при этом TMS9900 считывал шину дважды для получения 16-битного значения. Архитектура набора инструкций TMS9900 была основана на 16-битных опкодах, что означало, что программы обычно занимали вдвое больше места, чем на 8-битной машине. В эпоху дорогой памяти это представляло собой значительные затраты. Чтобы решить эту проблему, TI создала 8-битную виртуальную машину со своим языком или промежуточным представлением, известным как "Язык графического программирования" (GPL), который позволял писать программы в более компактном формате. Недостатком такого подхода было то, что каждая инструкция GPL должна была преобразовываться "на лету" в одну или несколько базовых инструкций TMS9900. Сам код GPL хранился на 8-битной стороне машины, что еще больше снижало ее производительность. По всем этим причинам машина работала значительно медленнее, чем могла бы теоретически. Это особенно заметно проявлялось в BASIC. Каждая инструкция в программе пользователя должна была считываться из 8-битной памяти, интерпретироваться с использованием кода, написанного на GPL, а затем снова выводиться через 8-битную шину. В результате TI BASIC демонстрировал низкую производительность; по распространенным тестам того времени TI 99 обычно работал вдвое медленнее 8-битных машин, таких как Commodore PET или Apple II. Например, выполнение теста Byte Sieve в BASIC заняло 3960 секунд на TI BASIC, в то время как тот же тест в Applesoft BASIC на Apple II, которая считалась гораздо более медленной машиной, занял 2806 секунд, что примерно на 30% быстрее, чем на TI.

Редактирование и запуск

В отличие от большинства BASIC того времени, TI BASIC не предоставлял полноэкранный редактор. Вместо этого использовался редактор строк, позволявший пользователю добавлять или редактировать по одной строке за раз. Каждая строка идентифицировалась явным номером. Система использовала приглашение для указания текущей новой строки в непосредственном режиме, в отличие от более распространенной системы нумерации строк. Диапазон номеров строк составлял от 1 до 32767 включительно, и ввод строки за пределами этого диапазона приводил к ошибке "BAD LINE NUMBER". Ввод строк облегчался командой, доступной только в непосредственном режиме, которая автоматически присваивала возрастающие номера строк, и командой, которая перенумеровывала существующую программу. TI BASIC также включал ряд команд отладки. Работала примерно так, останавливая выполнение на определенных строках. В отличие от , выход в непосредственный режим происходил не на строке, где встречалась команда , а на строке, указанной в ней. Например, заставит программу выйти в непосредственный режим при переходе на строку 130. Это можно было использовать, например, вставив одну команду в начало программы для управления выполнением, вместо того чтобы вставлять ее в середину кода. отключала существующие точки останова. Кроме того, команда выводила номер текущей выполняемой строки в угловых скобках: и т.д., а команда отключала эту функцию.

Заявления

ANSI-совместимые операторы TI BASIC. Большинство из них работают аналогично своим аналогам в MS BASIC, с двумя дополнениями: перезапуск генератора случайных чисел с заданного "зародышевого" значения и установка первого элемента в массивах в 0 или 1, в то время как MS BASIC всегда использует нулевую индексацию. К этому стандартному набору были добавлены операторы CALL, CLOSE, DISPLAY и OPEN. В соответствии со стандартом Minimal BASIC, операторы могли выполнять только переходы, они не могли выполнять произвольные операторы, как это было принято в большинстве других версий BASIC того времени. Например, код вида: не является допустимым в TI BASIC. Вместо этого это необходимо выполнять, используя несколько строк: Это может легко привести к ошибкам "на единицу", если при преобразовании не соблюдается осторожность в отношении изменения смысла булевого сравнения. Однако TI BASIC поддерживал конструкцию: Оператор использовал двоеточия для разделения элементов на разных строках, в дополнение к более распространенным запятой или точке с запятой. Это исключало его использование в качестве разделителя операторов, концепции, которой не было в TI BASIC. Это означает, что строка может содержать только один оператор. Благодаря принципу работы интерпретаторов BASIC, циклы FOR…NEXT могут быть значительно ускорены путем объединения кода в одну строку, что позволяет избежать поиска номеров строк в программе. Эта, казалось бы, незначительная отсутствующая функция может привести к значительно более медленному коду, и добавление этой функции было реализовано в Extended BASIC. Расширения системы Minimal BASIC часто не были представлены непосредственно в BASIC, а вместо этого были доступны через команду и серию именованных подпрограмм на основе GPL. Например, очищает экран, а возвращает код нажатой клавиши. Языку не хватало операторов PEEK и POKE, поэтому не было официального способа создания нового кода, вызываемого через CALL, непосредственно в BASIC. Для этого требовался TI Editor/Assembler, картридж TI Mini Memory, который включал небольшой ассемблер, или использование Extended BASIC.

Расширенный BASIC

TI BASIC располагался во внутренних ПЗУ системы. В 1981 году TI выпустила подключаемый картридж ПЗУ, который добавил дополнительные функции к существующему коду, улучшив язык во многих отношениях. Известный как Extended BASIC, он стал долгожданным дополнением к платформе. Среди изменений было добавление возможности размещать несколько операторов на одной строке. Использование нескольких операторов может повысить производительность; циклы, реализованные в одной строке, выполняются значительно быстрее. Кроме того, операторы теперь могли занимать несколько строк. Поскольку базовый диалект уже использовал двоеточие в качестве разделителя строк, Extended BASIC использовал двойное двоеточие для этой цели. Сбивает с толку, что в TI BASIC также можно было использовать оператор с двумя двоеточиями, например, , который выводил "A", пустую строку, а затем "B", поэтому в Extended BASIC для таких операторов требовалось добавление пробела. Еще одним долгожданным дополнением стало то, что операторы теперь могли выполнять произвольные операторы, а не только . В Extended BASIC можно было написать простой оператор, например, . Это также работало в предложении , позволяя использовать операторы, такие как . Другие дополнения включают небольшой набор новых операторов, включая , , , , , , и . Последние три оператора используются для структурированного программирования, позволяя создавать именованные подпрограммы. Extended BASIC также включал в себя ряд новых функций и, особенно, вызываемые подпрограммы (CALLable routines). Среди последних была библиотека команд для спрайтов, включая команды, создающие автоматическое движение.