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 и его различных клонов. Первоначальная версия продолжала модифицироваться и портироваться в постсинклеровскую эпоху.
Клайв Синклер впервые встретился с Джоном Грантом, владельцем Nine Tiles, в апреле 1979 года, чтобы обсудить BASIC для новой компьютерной концепции Синклера. [2] Синклер был вдохновлен на создание новой машины после того, как увидел, как его сын наслаждается TRS-80 , но цена этой машины в 500 фунтов стерлингов оказалась серьезным ограничением ее популярности. Ему нужен был новый комплект, который расширил бы их предыдущий MK14 и имел встроенный BASIC по целевой цене 79,95 фунтов стерлингов. Чтобы соответствовать этой цене, машина будет поставляться только с 1 КБ ОЗУ и 4 КБ ПЗУ. Грант предложил вместо этого использовать язык Форт , но бюджет не позволял этого. Грант написал интерпретатор BASIC в период с июня по июль 1979 года, но изначально размер кода составлял 5 КБ, и следующий месяц он потратил на его сокращение. Первоначально это была неполная реализация стандарта Minimal BASIC Американского национального института стандартов (ANSI) 1978 года только с целочисленной арифметикой, называемого 4K BASIC . [3]
Еще до того, как ZX80 был представлен в феврале 1980 года, постоянное ценовое давление в отрасли позволяло еще больше снизить сложность и стоимость и без того недорогой конструкции. В частности, многие отдельные схемы в ZX80 были перереализованы в едином незафиксированном логическом массиве от Ferranti , что позволило снизить цену всего до 49,95 фунтов стерлингов при увеличении размера ПЗУ до 8 КБ. Эта работа была поручена Стиву Викерсу , который присоединился к Nine Tiles в январе 1980 года. Пока Грант работал над интерфейсом кода с аппаратным обеспечением, Викерс использовал большее пространство для введения арифметики с плавающей запятой и набора триггерных функций , которые ожидались от любого BASIC. с той эпохи, производя 8K BASIC . [4] Первоначальная версия не поддерживала принтер ZX и содержала ошибку в функции извлечения квадратного корня . Nine Tiles предоставила новую версию для решения этих проблем, но Синклер не спешил включать новую версию в ПЗУ. Новые ПЗУ в конечном итоге были предложены и владельцам более ранних ZX80. [5]
Когда Синклер проиграл конкурс на создание компьютера BBC , он приступил к реализации планов по созданию недорогой цветной машины, которая в апреле 1982 года появилась как ZX Spectrum . Объем ПЗУ снова будет увеличен, на этот раз до 16 КБ. В соответствии со своей философией создания систем с наименьшими затратами, Синклер хотел внести абсолютный минимум изменений в существующий 8K BASIC. Хотя Nine Tiles считали, что для новой машины потребуется что-то гораздо лучшее, график не позволял этого, и было создано еще одно расширение исходного кода. Из-за того, что объем оперативной памяти также был увеличен до 48 КБ, эта версия была известна как 48K BASIC и, в конечном итоге, 48 BASIC с появлением ZX Spectrum 128, когда Spectrum 16 КБ больше не продавался, и большинство существующих в использовании было увеличен до 48 КБ. [6] [7] Новая версия была доступна ближе к концу 1981 года, но она была «удручающе медленной» и «улиткоподобной». Кроме того, поскольку до конца года прототипов не было, отсутствовала поддержка новой линейки периферийных устройств, которую планировал Синклер. [8]
В феврале 1982 года у Nine Tiles начались разногласия с Синклером по поводу задолженности по гонорарам за различные руководства, выпущенные Nine Tiles. Примерно в то же время Викерс и его коллега из Синклера Ричард Альтвассер покинули свои компании, чтобы начать проект Jupiter Ace . [9] Когда Spectrum был запущен, ПЗУ еще не было завершено, и хотя Nine Tiles продолжали работать над ним до апреля 1982 года, к этому моменту уже было продано 75 000 Spectrums, и проект был отменен. Отсутствующая функциональность позже была добавлена дополнительным кодом в интерфейсе ZX 1 . После того, как Nine Tiles и Sinclair пошли своим путем, было создано несколько новых версий 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 400 , клавиши вверх и вниз можно было использовать для перемещения между строками программы и редактирования их на месте.EDITNEW LINE
Наиболее примечательной особенностью редактора было то, что ключевые слова вводились с помощью одиночных нажатий клавиш. Например, на ZX81 нажатие клавиши на клавиатуре приведет к вводу всего ключевого слова в текущую строку редактирования. После ввода ключевого слова курсор изменится на букву «L», указывая, что последующая информация будет интерпретироваться как обычный текст. Например, повторное нажатие в этот момент приведет к вводу одной буквы «P».PPRINT
P
Ключам обычно присваивались два отдельных ключевых слова — одно над ним и одно под ним. Нажатие клавиши в режиме «K» приведет к вводу ключевого слова над клавишей, например, PRINT
для . Если система находилась в режиме «L», можно было вернуться в режим «K», нажав клавишу Shift — системы изначально не поддерживали строчный текст, поэтому в противном случае сдвиг не требовался. Ключевые слова под клавишами требовали второго нажатия клавиши + , которое переводило редактор в «функциональный режим», изменяя курсор на «F». Ввод общего кода часто приводил к значительному количеству нажатий клавиш.P⇧ ShiftNEW LINE
Преимущество системы заключалось в том, что все многосимвольные ключевые слова представлялись в памяти как один символ, что было значительной экономией на первых машинах, поставлявшихся всего с 1 КБ ОЗУ. Это односимвольное представление включало в себя многосимвольные элементы, такие как <>
. Это имеет дополнительные преимущества, заключающиеся в упрощении среды выполнения, поскольку позволяет сразу определить, является ли символ в исходном коде ключевым словом или текстом, а также означает, что ключевые слова никогда не вводятся напрямую, а это означает, что можно, например, иметь переменную с именем «ПЕЧАТЬ», поскольку система может определить, что это не то же самое, что ключевое слово.
По мере развития систем и добавления новых ключевых слов использовать систему ввода становилось все сложнее. 48 BASIC в Spectrum требовал, чтобы каждый ключ содержал до четырех ключевых слов. Ввод ключевых слов был трудоемким процессом поиска соответствующей клавиши относительно небольшим шрифтом на клавиатуре, а затем правильного ввода нескольких нажатий клавиш, необходимых для правильного ввода. Например, для входа BEEP
необходимо ввести + , чтобы получить доступ к расширенному режиму (более поздние модели включают отдельную клавишу), удерживать ее нажатой, а затем нажать . Чтобы упростить сложную запись на Спектруме, ключевые слова были выделены цветом для обозначения требуемого режима: [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, затем считывает тип и видит, что это строка, а затем должна прочитать следующий байт длины и пропустите это количество байтов вперед, чтобы найти следующую запись в таблице. Чтобы сделать это несколько проще, массивы также сохраняют двухбайтовую длину, поэтому всю структуру можно было легче пропустить.
Уникальной особенностью был «короткий плавающий» или целочисленный тип. Любая числовая переменная могла хранить любой тип, само хранилище не менялось и в любом случае использовало 5 байт. Целые числа обозначались путем установки байта экспоненты на ноль, а значения с плавающей запятой сохранялись с экспонентой формата превышения 128 . Это означало, что он не мог хранить ноль как число с плавающей запятой и терял одну возможную величину показателя степени. Он также не использовал меньше памяти, поскольку значения по-прежнему находились в памяти по 5 байт. Преимущество этого формата — производительность; математическая библиотека включала тесты для поиска нулевого показателя степени, и если бы он был замечен, то не пытался бы выполнять различные операции с оставшимися 3 байтами при определенных условиях.
В ZX81 8K BASIC использовались более короткие формы GOTO
, и GOSUB
, тогда как в Spectrum 48 BASIC использовались более длинные формы , и . ZX80 4K BASIC также использовал эти более длинные формы, но отличался написанием . ZX81 8K BASIC был единственной версией, в которой использовались , и . ZX80 4K BASIC имел эксклюзивную функцию ; в более поздних версиях он был эквивалентен строковому оператору .CONT
RAND
GO TO
GO SUB
CONTINUE
RANDOMIZE
RANDOMISE
FAST
SCROLL
SLOW
UNPLOT
TL$()
(2 TO )
Уникальные кодовые точки назначаются в наборе символов ZX80 , наборе символов ZX81 и наборе символов ZX Spectrum для каждого ключевого слова или многосимвольного оператора, т. е <=
. >=
, , <>
, ""
(маркируется только в ZX81), **
(заменяется на ↑
в Spectrum). Они расширяются путем ссылки на таблицу токенов в ПЗУ. Таким образом, ключевое слово использует только один байт памяти, что является значительной экономией по сравнению с традиционным побуквенным хранением. Это также означало, что интерпретатор BASIC мог быстро определить любую команду или функцию, оценив один байт, и что ключевые слова не обязательно должны быть зарезервированными словами, как в других диалектах BASIC или других языках программирования, например, разрешено определять переменную с именем PRINT
и выводом . его значение с PRINT PRINT
. Это также связано с требованием синтаксиса, согласно которому каждая строка начинается с ключевого слова команды, и нажатие одной клавиши для этой команды в начале строки переводит редактор из командного режима в буквенный режим. Таким образом, присваивание переменных требует LET
(т.е. не только ). Эта практика также отличается от других диалектов BASIC. Кроме того, это означало, что, в отличие от других диалектов BASIC, переводчику не требовались круглые скобки для обозначения функций; было достаточно, но не нужно (хотя последнее и допускалось). Базовое ПЗУ 4K для ZX80 имело небольшой список исключений: функции , , , , , , и не имели однобайтовых токенов, но вводились побуквенно и требовали скобок. Они были указаны как ВСТРОЕННЫЕ ФУНКЦИИ на этикетке над клавиатурой справа. [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 моделей 128k.SPECTRUM
, который переключил Spectrum 128k в режим совместимости со Spectrum 48k.Оригинальный испанский 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, которые также являются командами). или функции):
NEW
RUN
LIST
LOAD
SAVE
GOTO
IF
THEN
GOSUB
STOP
RETURN
FOR
TO
NEXT
CONTINUE
PRINT
INPUT
LET
CLEAR
CLS
DIM
REM
RANDOMIZE
POKE
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
LOAD !
SAVE !
MERGE !
ERASE !
PLAY
SPECTRUM
FORMAT
COPY
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).PRINT #
Печатает на определенный выходной канал.LIST #
Перечисляет программу для определенного выходного канала.CLS*
Очищает обе области отображения.INK*
Устанавливает цвет чернил для обеих областей отображения.PAPER*
Устанавливает цвет бумаги в обеих областях отображения.SCREEN$
Выбор режимов высокого/нормального разрешения.PLOT*
Выводит пиксель и обновляет положение рисования.LINE
Рисует линию из предыдущей позиции PLOT, поддерживая рисование дуги.CIRCLE*
Рисует круг или овал, в зависимости от режима экрана.LOAD!
SAVE!
CAT!
MERGE!
ERASE!
CLEAR!
FORMAT!
LPRINT
LLIST
BEEP!
SCREEN$
DRAW!
PLOT!
CIRCLE!
Существует несколько интерпретаторов ZX Spectrum. [81]
Существует несколько компиляторов ZX Spectrum. [81]
AND
обычно возвращают первое из условий, предоставленных для истинности, или 1, если числовые значения не были заданы. Например, 6 AND 7
возвращает 6, а NOT 6=7
возвращает 1.Во всех командах, связанных с цветом, цифра 8 может использоваться для обозначения «прозрачности», а INK
также PAPER
может быть установлена на 9 для «контрастности», то есть для автоматического нанесения темного цвета на светлый фон или наоборот.
INK
, PAPER
, FLASH
, и установите атрибуты BRIGHT
для вывода текста и графики на экран. Их можно использовать либо как команды для применения ко всем последующим выводам до тех пор, пока они не будут установлены снова, либо внутри оператора , чтобы применяться только с этой точки до конца оператора.OVER
INVERSE
PRINT
CAT
, ERASE
и изначально были разработаны для использования с периферийными устройствами, но на момент запуска ZX Spectrum они не были полностью реализованы, поэтому их использование приводило к появлению сообщения об ошибке (Invalid Stream) FORMAT
. MOVE
Позже с помощью теневого ПЗУ ZX Interface 1 они использовались для ZX Microdrive . (Теневое ПЗУ было выгружено, когда интерпретатор BASIC обнаружил синтаксическую ошибку, поэтому большинство команд ZX Microdrive используют "*"
).ELSE
оператор в предложение IF
– THEN
[– ELSE
]. Обходным решением было бы использовать вместо этого конструкцию IF
– THEN
– GO TO
, минуя строки, которые были бы в ELSE
предложении сGO TO
Он стремится отдать должное [...], не в последнюю очередь Nine Tiles, компании, создавшей базовое операционное программное обеспечение.
{{cite web}}
: CS1 maint: unfit URL (link)