Sinclair BASIC — диалект языка программирования BASIC, используемый в 8-битных домашних компьютерах от Sinclair Research , Timex Sinclair и Amstrad . Интерпретатор Sinclair BASIC был написан Nine Tiles Networks Ltd. [1]
Разработанная для работы всего в 1 КБ ОЗУ , система принимает ряд решений для снижения использования памяти. Это привело к одной из самых примечательных особенностей Sinclair BASIC, когда ключевые слова вводились с помощью одиночных нажатий клавиш; каждое из возможных ключевых слов было сопоставлено с клавишей на клавиатуре, при нажатии токен помещался в память, а все ключевое слово выводилось на экран. Это упростило ввод кода, одновременно упростив парсер .
Оригинальная версия ZX80 поддерживала только целочисленную математику, что частично компенсировало некоторые замечания по экономии памяти, которые негативно влияли на производительность. Когда система была перенесена на ZX81 в 1981 году, была добавлена полная реализация с плавающей точкой . Эта версия была очень медленной, среди самых медленных BASIC на рынке в то время, но, учитывая ограниченные возможности машины, это не было серьезной проблемой.
Производительность стала более серьезной проблемой с выпуском ZX Spectrum в 1983 году, который работал слишком медленно, чтобы в полной мере использовать новые возможности машины. Это привело к появлению совершенно нового BASIC для следующего Sinclair QL , а также ряда сторонних BASIC для Spectrum и его различных клонов. Оригинальная версия продолжала модифицироваться и портироваться в эпоху после Sinclair.
Клайв Синклер первоначально встретился с Джоном Грантом, владельцем Nine Tiles, в апреле 1979 года, чтобы обсудить BASIC для новой концепции компьютера Синклера. [2] Синклер был вдохновлен созданием новой машины, увидев, как его сын наслаждается своим TRS-80 , но цена этой машины в 500 фунтов стерлингов, по-видимому, была серьезным ограничением ее популярности. Он хотел новый комплект, который расширил бы их предыдущий MK14 и имел бы встроенный BASIC по целевой цене 79,95 фунтов стерлингов. Чтобы соответствовать этой цене, машина должна была поставляться всего с 1 КБ ОЗУ и 4 КБ ПЗУ. Грант предложил использовать вместо этого язык Форт , но бюджет не позволял этого. Грант написал интерпретатор BASIC между июнем и июлем 1979 года, но изначально код имел размер 5 КБ, и он потратил следующий месяц на его урезание. Первоначально это была неполная реализация стандарта Minimal BASIC Американского национального института стандартов (ANSI) 1978 года , включавшая только целочисленную арифметику и называвшаяся 4K BASIC . [3]
Еще до того, как в феврале 1980 года был представлен ZX80, постоянное ценовое давление в отрасли позволяло и без того недорогому дизайну еще больше упрощаться и снижать стоимость. В частности, многие из отдельных схем в ZX80 были повторно реализованы в единой нефиксированной логической матрице от Ferranti , что позволило снизить цену до всего лишь 49,95 фунтов стерлингов при увеличении размера ПЗУ до 8 КБ. Эта работа была поручена Стиву Викерсу , который присоединился к Nine Tiles в январе 1980 года. Пока Грант работал над интерфейсом кода с оборудованием, Викерс использовал большее пространство для внедрения арифметики с плавающей точкой и набора тригонометрических функций, которые ожидались от любого BASIC той эпохи, создавая 8K BASIC . [4] Первоначальная версия не поддерживала принтер ZX и имела ошибку в своей функции квадратного корня . Nine Tiles предоставили новую версию для решения этих проблем, но Sinclair не спешили включать новую версию в ROM. Новые ROM в конечном итоге были предложены владельцам более раннего ZX80. [5]
Когда Синклер проиграл конкурс на создание компьютера BBC , он приступил к реализации планов по производству недорогой цветной машины, которая появилась как ZX Spectrum в апреле 1982 года. Объем ПЗУ снова увеличился, на этот раз до 16 КБ. В соответствии со своей философией создания систем с минимальными возможными затратами, Синклер хотел внести абсолютный минимум изменений в существующий 8K BASIC. Хотя Nine Tiles считали, что для новой машины потребуется что-то гораздо лучшее, график не позволял этого, и было произведено еще одно расширение исходного кода. Из-за того, что объем ОЗУ также был увеличен до 48 КБ, эта версия стала известна как 48K BASIC и в конечном итоге 48 BASIC с появлением ZX Spectrum 128, в то время как 16 КБ Spectrum больше не продавались, а большинство существующих в использовании были обновлены до 48 КБ. [6] [7] Новая версия была доступна ближе к концу 1981 года, но она была «удручающе медленной» и «как улитка». Кроме того, поскольку до конца года не было никаких прототипов, она не поддерживала новую линейку периферийных устройств, которую планировал Синклер. [8]
В феврале 1982 года у Nine Tiles начались разногласия с Синклером по поводу причитающихся роялти за различные руководства, которые выпустила Nine Tiles. Примерно в то же время Викерс и его коллега из Синклера Ричард Альтвассер покинули свои компании, чтобы начать проект Jupiter Ace . [9] Когда Spectrum был запущен, ПЗУ все еще не было завершено, и хотя Nine Tiles продолжала работать над ним до апреля 1982 года, к тому моменту уже было продано 75 000 Spectrum, и проект был отменен. Недостающая функциональность была позже добавлена дополнительным кодом в ZX Interface 1. После того, как Nine Tiles и Синклер пошли своими путями, было создано несколько новых версий 48 BASIC.
В 1983 году, в рамках представления Spectrum на рынке США как TS2068, Timex модифицировала его как T/S 2000 BASIC . Новая версия была неспособна запускать многие программы Spectrum из-за перемещения памяти функций машины. Похожая, но несколько более совместимая версия была представлена как часть испанского Spectrum 128 1985 года, 128 BASIC . [7]
Amstrad приобрела Sinclair Research в 1986 году. Поскольку Sinclair никогда не владел авторскими правами на язык, Amstrad пришлось договориться о новой лицензии с Nine Tiles. Несколько других версий также появились в этот период, поскольку были введены различные расширения и клоны Spectrum. К ним относятся +3 BASIC , BASIC64 и Timex Extended Basic . [7] [6]
По состоянию на 2015 год существуют интерпретаторы для современных операционных систем [ 10] и более старых систем [11] , которые позволяют легко использовать Sinclair Basic.
Как и большинство BASIC для домашних компьютеров, Sinclair BASIC завязан на своем редакторе строк . Когда машина загружается, она запускает BASIC и отображает инверсное видео "K" в нижней части экрана, чтобы указать точку входа. Когда вводится строка и NEW LINEнажимается клавиша, она либо запускается немедленно, если у нее нет префикса номера строки , либо очищает экран и выполняет эквивалент команды LIST
, помещая курсор ">" после номера строки в последней введенной строке.
В отличие от большинства машин той эпохи, редактор не допускает свободного редактирования в любой точке экрана. Вместо этого, когда пользователь нажимает , текущая строка кода копируется обратно в нижнюю часть экрана. Пользователь может перемещаться по этой строке горизонтально с помощью клавиш курсора и подтверждать свои изменения повторным нажатием . Напротив, на таких машинах, как Commodore 64 или Atari 8-bit computers , клавиши вверх и вниз можно использовать для перемещения между строками в программе и редактирования их на месте.EDITNEW LINE
Наиболее примечательной особенностью редактора является то, что ключевые слова вводятся с помощью отдельных нажатий клавиш. Например, на ZX81 клавиша на клавиатуре приведет к вводу всего ключевого слова в текущую строку редактирования. После ввода ключевого слова курсор изменится на «L», чтобы указать, что последующее будет интерпретироваться как обычный текст. Например, повторное нажатие в этой точке введет одну букву «P».PPRINT
P
Клавишам обычно назначались два отдельных ключевых слова — одно над ними и одно под ними. Нажатие клавиши в режиме «K» вводило ключевое слово над клавишей, например, PRINT
для . Если система находилась в режиме «L», можно было вернуться в режим «K», нажав клавишу Shift — изначально системы не поддерживали строчные буквы, поэтому в противном случае Shift не требовался. Ключевые слова под клавишами требовали второго нажатия клавиши, + , что переводило редактор в «функциональный режим», меняя курсор на «F». Ввод общего кода часто приводил к значительному количеству нажатий клавиш.P⇧ ShiftNEW LINE
Система имеет преимущество представления всех многосимвольных ключевых слов как одного символа в памяти, что было значительной экономией на ранних машинах, которые поставлялись только с 1 КБ ОЗУ. Это односимвольное представление включало многосимвольные элементы, такие как <>
. Это имеет дополнительные преимущества упрощения времени выполнения, так как оно может немедленно определить, является ли символ в исходном коде ключевым словом или текстом, а также означает, что ключевые слова никогда не вводятся напрямую, то есть можно, например, иметь переменную с именем "PRINT", так как система может определить, что она не совпадает с ключевым словом.
По мере развития систем и добавления новых ключевых слов система ввода становилась все более сложной в использовании. 48 BASIC в Spectrum требовал, чтобы каждая клавиша содержала до четырех ключевых слов. Ввод ключевых слов был трудоемким процессом поиска соответствующей клавиши на относительно небольшом шрифте клавиатуры, а затем правильного ввода нескольких нажатий клавиш, необходимых для правильного ввода. Например, для ввода BEEP
требовалось нажать + для доступа к расширенному режиму (более поздние модели включают отдельную клавишу), удерживать нажатой, а затем и нажимать . Для улучшения сложного ввода в Spectrum ключевые слова были закодированы цветом, чтобы указать требуемый режим: [12]CAPS SHIFTSYMBOL SHIFTEXTENDED MODESYMBOL SHIFTZ
Эта концепция себя исчерпала, и более поздние машины, работающие на 128 BASIC (ZX Spectrum 128, +2, +3, +2A и +2B), имели более традиционный редактор, где пользователь вводил ключевое слово в виде отдельных символов, подобно другим домашним компьютерам той эпохи. Это потребовало нового токенизатора для преобразования строки в аналогичный внутренний формат.
Полученное в результате хранение программы в памяти в остальном было похоже на Microsoft BASIC , в котором только ключевые слова представлены как токены, в то время как не ключевые слова, такие как строковые и числовые константы и имена переменных, остаются в их исходном набранном формате. Однако этот набранный формат был не ASCII , а внутренним кодом символов, который содержит как печатные символы, так и токены ключевых слов. Хотя части таблицы, например, заглавные буквы от A до Z, находятся в том же порядке, что и в ASCII, их символы соответствуют разным числовым значениям, т. е. смещение их кодовых точек от нуля отличается от смещения ASCII, равного 65. Другие символы, такие как знаки препинания, могли быть перемещены еще больше. Набор символов ZX Spectrum является наиболее ярким примером такого кода символов. Связанные компьютеры, работающие под управлением Sinclair BASIC, использовали похожие варианты, например, наборы символов ZX80 или ZX81 . Все эти разные, но связанные наборы символов включали токены Sinclair BASIC.
Одной из необычных особенностей Sinclair BASIC является способ хранения переменных в памяти. Обычно интерпретаторы используют запись фиксированного размера для хранения данных, что упрощает сканирование таблицы переменных. Из-за крайне ограниченной памяти серии ZX приходилось избегать любого неиспользуемого пространства, и это привело к использованию формата переменной длины. Типы данных включали числа, хранящиеся в 5-байтовых значениях, строки с длиной, а затем символы, и массивы обоих этих типов. Данные хранились в самой таблице, что контрастирует с большинством BASIC той эпохи, где строки и записи массивов хранились в отдельной куче .
Первый байт для записи переменной всегда содержал тип в первых трех битах и первый символ имени в следующих пяти битах. Как и в большинстве диалектов микрокомпьютеров, A
, A$
, A()
и A$()
были разными переменными и могли хранить разные значения. Большинство переменных могли иметь только односимвольное имя; исключением являются числовые переменные (не массивы), где альтернативный формат содержал первый символ имени в тех же пяти битах, но затем следовали дополнительные символы, заканчивающиеся единицей с ее старшим набором битов. Длинные имена переменных не зависели от пробелов и не учитывали регистр в более поздних версиях, поэтому то же самое, что и ссылалось на ту же переменную.LET Number Of Apples = 5
LET numberofapples = 5
Недостатком этого подхода является то, что сканирование таблицы для поиска значения ссылки на переменную более сложно. В дополнение к проверке соответствия имени с использованием подмножества первого байта, если запись не та, которую ищут, тип должен быть прочитан из старших трех бит, а затем следующее местоположение переменной в хранилище вычисляется с использованием типа. Например, если программа встречает переменную "A", а таблица начинается с записи для "B$", она не может сопоставить A с B, затем считывает тип, чтобы увидеть, что это строка, а затем должна прочитать следующий байт длины и пропустить это количество байтов, чтобы найти следующую запись в таблице. Чтобы сделать это несколько проще, массивы также хранили двухбайтовую длину, поэтому всю структуру можно было пропустить более легко.
Уникальной особенностью был "short float" или целочисленный тип. Любая числовая переменная могла хранить любой тип, само хранение не менялось и использовало 5 байт в любом случае. Целые числа обозначались установкой байта экспоненты в ноль, в то время как значения с плавающей точкой хранились с экспонентой формата extra-128 . Это означало, что он не мог хранить ноль как float и терял одну возможную величину экспоненты. Он также не использовал меньше памяти, так как значения по-прежнему занимали 5 байт в памяти. Преимуществом этого формата является производительность; математическая библиотека включала тесты для поиска нулевой экспоненты, и если она была обнаружена, она не пыталась выполнять различные операции с оставшимися 3 байтами при определенных условиях.
ZX81 8K BASIC использовал более короткие формы GOTO
, GOSUB
, CONT
и RAND
, тогда как Spectrum 48 BASIC использовал более длинные формы GO TO
, GO SUB
, CONTINUE
и RANDOMIZE
. ZX80 4K BASIC также использовал эти более длинные формы, но отличался использованием написания RANDOMISE
. ZX81 8K BASIC был единственной версией, которая использовала FAST
, SCROLL
, SLOW
и UNPLOT
. ZX80 4K BASIC имел исключительную функцию TL$()
; она была эквивалентна строковому оператору (2 TO )
в более поздних версиях.
Уникальные кодовые точки назначаются в наборе символов ZX80 , наборе символов ZX81 и наборе символов ZX Spectrum для каждого ключевого слова или многосимвольного оператора, то есть <=
, >=
, <>
, ""
(токенизировано только на ZX81), **
(заменено на ↑
на Spectrum). Они расширяются путем ссылки на таблицу токенов в ПЗУ. Таким образом, ключевое слово использует только один байт памяти, что является значительной экономией по сравнению с традиционным побуквенным хранением. Это также означало, что интерпретатор BASIC мог быстро определить любую команду или функцию, оценив один байт, и что ключевые слова не должны быть зарезервированными словами, как в других диалектах BASIC или других языках программирования, например, разрешено определять переменную с именем PRINT
и выводить ее значение с помощью PRINT PRINT
. Это также связано с требованием синтаксиса, согласно которому каждая строка начинается с ключевого слова команды, и нажатие одной клавиши для этой команды в начале строки переводит редактор из командного режима в буквенный режим. Таким образом, назначение переменной требует LET
(то есть не только ). Эта практика также отличается от других диалектов BASIC. Кроме того, это означало, что в отличие от других диалектов BASIC, интерпретатору не нужны были скобки для идентификации функций; было достаточно, не нужно (хотя последнее допускалось). 4K BASIC ROM ZX80 имел короткий список исключений из этого: функции , , , , , и не имели однобайтовых токенов , но печатались побуквенно и требовали скобок. Они были перечислены как INTEGRAL FUNCTIONS на этикетке выше и справа от клавиатуры. [13]LET a=1
a=1
SIN x
SIN(x)
CHR$()
STR$()
TL$()
PEEK()
CODE()
RND()
USR()
ABS()
128 BASIC , представленный на ZX Spectrum 128, +2, +3, +2A и +2B, хранил ключевые слова внутри в однобайтовых кодовых точках, но использовал обычную систему ввода BASIC побуквенно. Он также представил две новые команды:
PLAY
, который управлял музыкальным чипом General Instrument AY-3-8910 моделей 128kSPECTRUM
, который переключил 128k Spectrum в режим совместимости с 48k SpectrumОригинальный испанский ZX Spectrum 128 включал четыре дополнительные команды редактора BASIC на испанском языке, [14] [15] одна из которых была недокументирована:
EDITAR
(для редактирования номера строки или вызова полноэкранного редактора строк)NUMERO
(перенумеровать строки программы)BORRAR
(для удаления строк программы)ANCHO
(для установки ширины столбца устройства RS-232 , но не документировано, так как код был взломан)В отличие от функций LEFT$()
, MID$()
и , RIGHT$()
используемых в вездесущих диалектах Microsoft BASIC для домашних компьютеров, доступ к частям строк в Sinclair BASIC осуществляется по числовому диапазону. Например, a$(5 TO 10)
дает подстроку, начинающуюся с 5-го и заканчивающуюся 10-м символом переменной a$
. Таким образом, можно заменить команды LEFT$()
и RIGHT$()
, просто опустив левую или правую позицию массива соответственно; например, a$( TO 5)
эквивалентно LEFT$(a$,5)
. Кроме того, a$(5)
одного достаточно для замены MID$(a$,5,1)
.
На 16K/48K ZX Spectrum ( 48 BASIC) в Sinclair BASIC имеется 88 ключевых слов, обозначающих команды (всего их 50), функции и логические операторы (31) и другие ключевые слова (16, включая 9, которые также являются командами или функциями):
4K BASIC для ZX80 [76] (названный так из-за размещения в 4 КБ постоянной памяти (ПЗУ)), был разработан Джоном Грантом из Nine Tiles для ZX80. Он имеет только целочисленную арифметику.
NEW
RUN
LIST
LOAD
SAVE
GOTO
IF
THEN
GOSUB
STOP
RETURN
FOR
TO
NEXT
CONTINUE
PRINT
INPUT
LET
CLEAR
CLS
DIM
REM
RANDOMIZE
POKE
ABS
CHR$
CODE
PEEK
RND
STR$
TL$
USR
8K BASIC — это ZX81 BASIC (также доступный в качестве обновления для ZX80 [5] ), обновленный с помощью арифметики с плавающей точкой Стивом Викерсом , названный так из-за размещения в ПЗУ объемом 8 КБ.
PRINT
RAND
LET
CLEAR
RUN
LIST
GOTO
CONT
INPUT
NEW
REM
PRINT
STOP
BREAK
IF
STOP
FOR
NEXT
TO
STEP
SLOW
FAST
GOSUB
RETURN
SAVE
LOAD
CLS
SCROLL
PLOT
UNPLOT
PAUSE
LPRINT
LLIST
COPY
DIM
POKE
NEW
ABS
SGN
SIN
COS
TAN
ASN
ACS
ATN
LN
EXP
SQR
INT
PI
RND
FUNCTION
LEN
VALSTR$
NOT
CODE
CHR$
INKEY$
AT
TAB
INKEY$
PEEK
USR
48 BASIC — это BASIC для оригинального 16/48 КБ ОЗУ ZX Spectrum (и клонов), с цветом и большим количеством периферийных устройств, добавленных Стивом Викерсом и Джоном Грантом. Он находится в 16 КБ ПЗУ и стал называться 48 BASIC с появлением ZX Spectrum 128, в то время как 16 КБ Spectrum больше не продавались, а большинство существующих были обновлены до 48 КБ. [6]
128 BASIC — это BASIC для ZX Spectrum 128. [7] Он предлагает дополнительные команды и использует побуквенный ввод.
LOAD !
SAVE !
MERGE !
ERASE !
PLAY
SPECTRUM
+3 BASIC — это BASIC с поддержкой дисков для ZX Spectrum +3 и +2A. [6]
FORMAT
COPY
T/S 2000 BASIC используется на Spectrum-совместимом Timex Sinclair 2068 (T/S 2068) и добавляет следующие шесть новых ключевых слов:
DELETE
удаляет диапазоны строк программы BASIC.FREE
— это функция, которая выдает объем свободной оперативной памяти. PRINT FREE
покажет, сколько оперативной памяти свободно.ON ERR
— функция обработки ошибок, в основном используемая как ON ERR GO TO
или ON ERR CONT
.RESET
может использоваться для сброса поведения ON ERR
. Он также был предназначен для сброса периферийных устройств.SOUND
управляет звуковой микросхемой AY-3-8192 .STICK
функция, которая определяет положение внутреннего джойстика (Timex Sinclair 2090).BASIC64 от Timex из Португалии — это программное расширение [77] , позволяющее улучшить базовое программирование с графическими режимами 512×192 и двухэкранных областей, доступными только на компьютерах Timex Sinclair. Это расширение добавляет команды и выполняет полную переадресацию памяти, чтобы избежать перезаписи системой расширенной области памяти экрана. Существуют две версии из-за различных карт памяти — версия для TC 2048 и версия для T/S 2068 и TC 2068 .
PRINT #
печатает на определенный выходной канал.LIST #
перечисляет программу на определенный выходной канал.CLS*
очищает обе области отображения.INK*
устанавливает цвет чернил для обеих областей отображенияPAPER*
задает цвет бумаги для обеих областей отображенияSCREEN$
выбирает режимы высокого/нормального разрешения.PLOT*
рисует пиксель и обновляет позицию рисунка.LINE
рисует линию от предыдущей позиции PLOT, поддерживая рисование дугиCIRCLE*
рисует круг или овал в зависимости от режима экрана.Timex Extended Basic от Timex из Португалии используется на компьютере Timex Computer 3256 , добавляя команды TEC – Timex Extended Commands, поддерживающие звуковой чип AY-3-8912, сеть RS-232 и графический режим с высоким разрешением 512x192 пикселей. [78] [79]
LOAD!
SAVE!
CAT!
MERGE!
ERASE!
CLEAR!
FORMAT!
LPRINT
LLIST
BEEP!
SCREEN$
DRAW!
PLOT!
CIRCLE!
Существует несколько интерпретаторов ZX Spectrum. [80]
Существует несколько компиляторов ZX Spectrum . [80]
AND
обычно возвращают первое из условий, предоставленных для истинного, или 1, если числовые значения не были указаны. Например, 6 AND 7
возвращает 6, в то время как NOT 6=7
возвращает 1.Во всех командах, связанных с цветом, число 8 может использоваться для обозначения «прозрачности» INK
, а PAPER
также может быть установлено на 9 для «контраста», то есть для автоматического нанесения темного цвета на светлый фон или наоборот.
INK
, PAPER
, FLASH
, BRIGHT
, OVER
и INVERSE
set атрибуты для вывода текста и графики на экран. Их можно использовать либо как команды, чтобы применить ко всему последующему выводу, пока не будут установлены снова, либо внутри оператора PRINT
, чтобы применить только с этой точки до конца оператора.CAT
, ERASE
, FORMAT
и MOVE
изначально были разработаны для использования с периферийными устройствами, но на момент запуска ZX Spectrum они не были полностью реализованы, так что их использование приводило к сообщению об ошибке (Invalid Stream). Позже с помощью теневого ПЗУ ZX Interface 1 они использовались для ZX Microdrive . (Теневое ПЗУ было выгружено, когда интерпретатор BASIC обнаруживал синтаксическую ошибку, поэтому большинство команд ZX Microdrive используют "*"
).ELSE
оператор в предложение IF
– THEN
[– ELSE
]. Обходным путем было бы использовать конструкцию IF
– THEN
– GO TO
вместо этого, обходя строки, которые были бы в предложении ELSE
сGO TO
стремится отдать должное [...], не в последнюю очередь Nine Tiles, компании, которая создала операционную систему Basic.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )