Введение
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/4A programming language
TI BASIC is an ANSI compliant interpreter for the BASIC programming language built into the 1979 Texas Instruments TI 99/4 home computer and its improved 1981 version, the TI 99/4A. In contrast to most BASICs found on contemporary microcomputers, TI BASIC does not trace its history to Microsoft BASIC, but was instead a TI developed interpreter following the emerging Minimal BASIC standard being created by ANSI and ECMA. This was, in turn, based on the original Dartmouth BASIC from the 1960s. There are a number of differences, sometimes subtle, between TI BASIC and the more common MS varieties. Minimal BASIC lacks a number of features that are commonly found on contemporary BASICs, and Texas Instruments later introduced the TI Extended BASIC cartridge that enhanced the functionality accessible to BASIC users. This included a wide variety of features found in other BASICs, as well as new system functions for sprite handling, sound, and other features of the platform. As was common on home computers, TI BASIC was used not only for programming but also as a thin operating system. On top of Minimal BASIC, TI added commands for text, graphics, and basic file operations like recording to tape or any other file system. Due to the specifics of the TI 99 platform, TI BASIC was most notable for its extremely slow performance, roughly half that of common machines, but conversely sported high numerical accuracy.
Выступление
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.
is not valid in TI BASIC. Instead, this would have to be performed using multiple lines:
This can easily lead to off by one errors if the conversion is not careful about changing the sense of the boolean comparison. TI BASIC did, however, support the clause:
The statement used colons to separate items on different lines, in addition to the more common comma or semicolon. This precluded its use as a statement separator, a concept that TI BASIC did not have. This means a line can have only a single statement. Due to the way BASIC interpreters work, based loops can be sped up significantly by combining code onto a single line, which avoids having to search through the program for line numbers. This seemingly minor missing feature may result in much slower code, and adding this feature was part of Extended BASIC. Extensions to the Minimal BASIC system were often not represented directly in BASIC, but were instead accessed via the command and a series of named GPL based subroutines. For instance, clears the screen, and returns the keycode of the currently pressed key on the keyboard. The language lacked PEEK and POKE so there was no official way to create new CALLable code within BASIC, to do this one would require the TI Editor/Assembler, the TI Mini Memory cartridge which included a small assembler, or by using Extended BASIC.
Расширенный BASIC
TI BASIC располагался во внутренних ПЗУ системы. В 1981 году TI выпустила подключаемый картридж ПЗУ, который добавил дополнительные функции к существующему коду, улучшив язык во многих отношениях. Известный как Extended BASIC, он стал долгожданным дополнением к платформе. Среди изменений было добавление возможности размещать несколько операторов на одной строке. Использование нескольких операторов может повысить производительность; циклы, реализованные в одной строке, выполняются значительно быстрее. Кроме того, операторы теперь могли занимать несколько строк. Поскольку базовый диалект уже использовал двоеточие в качестве разделителя строк, Extended BASIC использовал двойное двоеточие для этой цели. Сбивает с толку, что в TI BASIC также можно было использовать оператор с двумя двоеточиями, например, , который выводил "A", пустую строку, а затем "B", поэтому в Extended BASIC для таких операторов требовалось добавление пробела. Еще одним долгожданным дополнением стало то, что операторы теперь могли выполнять произвольные операторы, а не только . В Extended BASIC можно было написать простой оператор, например, . Это также работало в предложении , позволяя использовать операторы, такие как . Другие дополнения включают небольшой набор новых операторов, включая , , , , , , и . Последние три оператора используются для структурированного программирования, позволяя создавать именованные подпрограммы. Extended BASIC также включал в себя ряд новых функций и, особенно, вызываемые подпрограммы (CALLable routines). Среди последних была библиотека команд для спрайтов, включая команды, создающие автоматическое движение.
Another overdue addition was that statements could now perform arbitrary statements, rather than only a In Extended BASIC one could write a simple statement like This also worked in the clause, allowing statements like
Other additions include a small selection of new statements, including , , , , , , , and The last three statements are used for structured programming, allowing the creation of named subroutines. Extended BASIC also included a number of new functions and especially CALLable routines. Among the latter was a library of sprite commands, including ones that created motion that continued automatically.