BETA BASIC
Первая версия Beta Basic (v. 1.0) фирмы
Betasoft появилась на свет в 1983 г. Она дополнила Spectrum-Бейсик
более чем 20 новыми операторами и функциями. Потом была написана версия
1.8 (1984 г.) и, наконец, появились самые мощные версии — 3.0 и 3.1 (1985 г.)79» которые поддерживают более 40
новых операторов, расширяют возможности некоторых «базовых»
операторов и вводят около 30 дополнительных функций. Мы будем описывать
версию 3.180.
В основном, Beta Basic ориентирован на решение
вычислительных задач и работу с данными и, пожалуй, представляет из
себя наиболее мощную версию Бейсика для ZX Spectrum.
Beta Basic имеет развитые средства структурного
программирования и управления программой (процедуры, циклы типа
DO...LOOP, оператор варианта и т. п.), что заметно упрощает составление
программ и сокращает время их разработки. Значительно расширен в нем
арсенал средств работы с памятью и реализован принципиально новый
подход к обработке массивов и строк символов: их копирование, склейка,
сортировка, поиск по образцу в произвольном сечении и т. д.
Beta Basic располагает богатым набором
операторов, обслуживающих вывод информации на экран. В нем возможна
организация многооконного режима работы программ (до 128 окон), вывод
символов произвольного размера без привязки к знакоместам. Все это в
сочетании с возможностью изменять масштаб координатной сетки и
перемещать центр координат в любое место экрана и даже за его пределы
(то есть организовывать работу непосредственно в математических
координатах) позволяет удобно оформлять результаты работы программ в
виде графиков, гистограмм и пр.
Несмотря на то, что Beta, Basic не
специализируется на работе с графикой, он, тем не менее, выполняет
многие операции обработки изображения: работу со спрайтами, быструю
замену цветовых атрибутов, скроллинг окна экрана, заливку замкнутого
контура и т. д.
Beta Basic имеет встроенные часы, средства обработки ошибочных ситуаций и пошаговой отладки программ (трассировки).
Важным достоинством Beta Basic является наличие
в нем удобного редактора программ, в котором реализованы автонумерация
и перенумерация строк, поиск и замена по образцу, быстрое удаление
фрагментов программы и многое другое.
Несмотря на значительное место, занимаемое в
памяти интерпретатором Beta Basic (около 19 килобайт), его расширенные
возможности с лихвой окупают этот недостаток и позволяют быстро
разрабатывать эффективные и компактные программы.
РЕДАКТОР_
KEYWORDS, DEF KEY, AUTO, EDIT, REF, ALTER, JOIN, SPLIT, RENUM, DELETE, LIST, MEM()
Beta Basic, в отличие от своих собратьев
— расширений Spectrum-Бейсика, в синтаксисе и способе ввода
операторов целиком сохраняет верность традициям, принятым в базовой
версии: в нем ключевые слова вводятся нажатием лишь одной-двух клавиш.
Для реализации этого использован стандартный режим курсора [G]
(Graphics), включаемый комбинацией клавиш CS/9. Например, после
перехода в режим [G] нажатие клавиши 8 приведет к выводу в строку редактора ключевого слова KEYWORDS81.
Однако сказанное вовсе не означает, что в Beta
Basic нельзя использовать псевдографику и символы, определяемые
пользователем (UDG). Режиму Graphics всегда можно вернуть его старый,
привычный смысл. Делается это с помощью уже упомянутой команды
KEYWORDS. Она имеет один числовой параметр. KEYWORDS 1 переводит
компьютер в режим ключевых слов Beta Basic, a KEYWORDS 0 — в
режим вывода псевдографических символов и символов UDG, который
отличается от стандартного синклеровского режима Graphics только тем,
что-в нем для удобства за клавишей 8 закреплен не пробел, а ключевое
слово KEYWORDS.
После загрузки Beta Basic устанавливается режим KEYWORDS 1.
Кроме синклеровского способа ввода ключевых
слов, Beta Basic допускает и посимвольный их ввод, причем безразлично,
прописными или строчными буквами (в режимах курсора [С] или [L]).
Редактор Spectrum-Бейсика — большой
интеллектуал: он, исходя из контекста, знает, в каком месте вводимой
строки должно появиться ключевое слово, и самостоятельно переводит
курсор в режим [К]. Избавиться от этого в стандартном Бейсике
невозможно. Зато Beta Basic это позволяет. Находясь в режиме ввода
ключевых слов JK], стоит нажать клавишу Space, и курсор превращается в
[С] или [L] (в зависимости от того, какой из этих режимов был
установлен ранее). Для того чтобы вернуться к режиму [К], достаточно
переместить курсор на прежнее место либо нажать клавиши SS/Enter. Таким
образом можно выбирать способ набора текста программы: целиком
ключевыми словами или посимвольно.
Закрепить способ ввода ключевых слов можно с
помощью той же команды KEYWORDS: KEYWORDS 2 отключит возможность
посимвольного ввода, KEYWORDS 4, наоборот, позволит набирать все
ключевые слова только посимвольно, a KEYWORDS 3 вернет редактор в
исходный режим «свободного выбора».
Посимвольно набранные операторы и функции после
нажатия Enter (даже если ввод строки не завершен) заменяются
соответствующими ключевыми словами. Этот эффект проявляется наглядно,
если ключевые слова набирать строчными буквами — после нажатия
Enter они заменятся на82
прописные. Если же редактор обнаружит ошибку и не захочет вводить
строку, найти причину будет легко: неправильно набранное ключевое слово
так и останется записанным строчными буквами. Отметим только, что
ошибка может быть не только в пропущенной или неправильной букве, но и
в отсутствии в нужном месте пробела. К примеру, запись CHR$A редактор
не поймет.
Однако возможны ситуации, когда набранное с
ошибкой ключевое слово будет интерпретировано как имя переменной и
пропущено редактором. Так, например, если вместо строки LET A=COS Т
набрать LET A=COST, то редактор сочтет это вполне приемлемым и спокойно
«проглотит», хотя программа будет работать неправильно.
Все же редактор Beta Basic делает все
возможное, чтобы обнаружить и исправить максимум ошибок. Например, если
между именем функции (оператором, другим служебным словом) и аргументом
отсутствует пробел, но аргумент не является именем переменной (то есть
начинается не с буквы), «ошибка» будет исправлена.
Beta Basic значительно (ровно вдвое!) расширяет
список функций языка. Разумеется, было бы бессмысленно пытаться каждой
новой функции приписать «персональную» клавишу компьютера,
и разработчики Beta Basic предложили оригинальный и по-своему удобный
метод ввода имен функций. Сразу оговорим, что он не исключает
возможность и посимвольного их ввода.
Все новые встроенные функции заданы с
использованием инструмента описания функций, определяемых пользователем
(DEF FN и FN)*. Соответственно, и обращаться к ним в тексте программы
нужно тоже стандартным способом — через ключевое слово FN,
добавляя однобуквенное имя функции. Таким образом, определенное число
однобуквенных имен функций пользователя Beta Basic занимает под имена
встроенных функций.
Для того чтобы в тексте программы встроенные
функции отличались от функций, определенных пользователем, применен
следующий прием: при наборе конструкции типа FN <имя функции), где
<имя функции> — зарезервированная буква, редактор заменяет
эту букву на полное название функции. Например, после ввода открывающей
скобки в строке
LET a=FN i(
сочетание FN i будет заменено одним служебным словом — именем новой функции:
LET a=INSTRING(
Преобразование в развернутую форму имен символьных функций
происходит после ввода символа $83.
Редактор Beta Basic при выводе листинга на
экран обеспечивает контекстное позиционирование программных строк, что
делает тексты программ более удобочитаемыми (рис. 21). При этом на
экран не выводятся двоеточия, разделяющие расположенные в одной строке
операторы — каждый оператор печатается с новой строки84.
Это свойство редактора, например, позволяет, набрав несколько двоеточий
подряд, отделить друг от друга пустыми строками логически завершенные
части программы (процедуры, DATA-списки и т. п.). Того же эффекта можно
добиться, нажимая одновременно CS и Enter85.
В режиме редактирования строки нетрадиционно
работают клавиши управления курсором. Если в Spectrum-Бейсике курсор
мог двигаться только в горизонтальном направлении, а клавишами
«курсор вверх» и «курсор вниз» перемещался
указатель текущей строки в листинге программы, то редактор Beta Basic
позволяет свободно «гулять» по редактируемой строке в любом
из четырех направлений. При попытке переместить курсор выше либо ниже
редактируемой строки он перебрасывается в ее конец. Управлять же
указателем текущей строки можно только при условии, что строка
редактора пуста и курсор находится в режиме [К].
Доступен в Beta Basic еще один способ набора программных строк — через программирование клавиатуры. Оператор
DEF KEY <"символ клавиши">[:<последовательность операторов>[:]]
DEF KEY < "символ клавиши">[;<строка символов[:]>]
приписывает любой клавише компьютера (кроме CS,
SS, Space и Enter) < последовательность операторов > или <
строку символов > — макроопределение. Макроопределение может
быть задано как последовательностью операторов, и тогда оно вводится
после двоеточия, так и символьной строкой, отделяемой от первого
параметра оператора точкой с запятой.
После определения макрокоманды оператором DEF KEY она выполняется нажатием указанной клавиши в специальном режиме курсора [86], введенном в дополнение к стандартным режимам курсора. Включается режим [*] нажатием клавиш SS/Space.
Выполним строку:
DEF KEY "Р": PRINT "Hello!": PRINT "How do you do?"
Теперь, если в режиме курсора [*] нажать клавишу Р, на экране появится.
Hello!
How do you doi
Пример можно переписать и так:
10 LET a$="PRINT ""Hello"": PRINT ""How do you do?"""
20 DEF KEY "P";a$
Если в конец последовательности, следующей за
DEF KEY, поместить двоеточие, то она не будет выполнена, а ее текст
выведется в строку редактора. Этим можно пользоваться для помещения в строку редактора часто повторяющихся при наборе программы фрагментов строк.
Макроопределение можно «снять» с
клавиши, выполнив оператор DEF KEY с символом данной клавиши без
следующего за ним набора инструкций, например, DEF KEY "Р".
Одновременно все макроопределения удаляются оператором DEF KEY ERASE.
Следует помнить, что, сохраняя в памяти созданные макроопределения, интерпретатор несколько опускает RAMTOP.
Beta Basic избавляет нас от необходимости при
вводе программы каждый раз набирать номер очередной строки. Включается
режим автонумерации командой
AUTO [<начальный номер> [,<шаг>]|
В ней параметр < начальный номер>* задает
номер первой добавляемой к программе строки, а параметр <шаг>
— шаг нумерации для последующих строк. Команда может не иметь ни
одного параметра либо иметь только один. В первом случае по умолчанию
предполагается, что оба параметра равны 10. Во втором —
единственный параметр определяет номер первой
«автонумеруемой» строки, а шаг также равен 10.
Отменить автонумерацию проще всего, нажав и
удерживая клавишу Break (CS/Space) в течение секунды. В момент
отключения режима AUTO появится сообщение 0 ОК: 0,1. Автонумерация
сбросится и по команде AUTO 0 или после выполнения любого оператора в
непосредственном режиме (для этого перед вводом оператора надо стереть
появившийся в строке редактора очередной номер).
После стирания выскочившего номера можно
перемещать указатель текущей строки. Следует только учитывать, что при
возврате к автонумерации редактор предложит уже не прежний номер, а
новый — на <шаг> больше номера строки, на которую
установлен указатель, хотя строка с таким номером уже может
существовать.
Продолжим рассмотрение команд редактора Beta Basic.
EDIT [ < номер строки > ]
Эта команда вызывает на редактирование строку
программы с номером, заданным в параметре, независимо от положения
указателя текущей строки. Если строки с заданным номером не существует,
на редактирование будет вызвана строка с ближайшим большим номером.
Набирается эта команда нетрадиционно, но просто: клавишей 0 после
любого нажатия Enter. Команда EDIT без параметра вызывает на
редактирование текущую строку программы. Впрочем, набрать EDIT можно и
обычным способом — в режиме курсора [G] или посимвольно.
Мощная команда редактора Beta Basic
REF <ключ для поиска >
последовательно вызывает на редактирование
строки программы, включающие в себя текст, заданный в параметре. Ключом
для поиска может быть имя переменной (массива, процедуры), числовая
константа (выражение) или символьная строка, заключенная в кавычки.
Различий между прописными и строчными буквами не делается.
Если в качестве ключа необходимо использовать
содержимое символьной переменной, а не ее имя, то последнюю необходимо
взять в скобки: REF (а$).
В случае, если образцом является строка
символов, на редактирование будут вызваны строки с любым включением
указанного набора символов, в том числе с полностью или частично
совпадающими именами переменных. Так, например, команда REF "org"
вызовет одну за другой на редактирование строки
78 LET Orgss55679 80 LET Forgo=22.51
510 INPUT "Organization number "; Num 640 REM ORGANIC
По завершении редактирования очередной найденной строки и ввода ее в программу повторное нажатие клавиши Enter
поместит в нижнюю часть экрана следующую строку, удовлетворяющую
условию поиска. Если строка программы содержит искомую подстроку в
нескольких экземплярах, она будет «вызвана на ковер»
соответствующее количество раз.
Выход из этого режима осуществляется так же, как и из режима AUTO.
С помощью команды
ALTER <ключ для поиска > ТО < образец для замены >
можно осуществлять автоматический поиск и
замену фрагментов текста программы. Для обоих параметров команды
справедливы соглашения, принятые для параметра команды REF. Второй
параметр может принимать значение «пустая строка».
Команда ALTER просматривает текст программы и
все найденные включения последовательностей символов или имен
переменных (массивов, процедур), заданные
< ключом для поиска>, заменяет на
< образец для замены >, указанный во втором параметре.
JOIN [ < номер строки > ]
Эта команда сцепляет через двоеточие две
соседние строки программы: строку с номером, указанным в параметре, и
следующую за ней. После выполнения команды номер присоединенной строки
освобождается. К примеру, фрагмент программы
151 FOR i=1 ТО 1000
152 PRINT PEEK i
153 NEXT i
после выполнения команды JOIN 151 будет выглядеть так:
151 FOR i=1 ТО 1000: PRINT PEEK i 153 NEXT i
Команда JOIN без параметра соединит текущую строку и строку, следующую за ней.
SPLIT
Эта команда обратна по действию команде JOIN:
она расщепляет строки, составленные из нескольких операторов. В отличие
от других команд редактора, SPLIT выполняется не введением ключевого
слова с параметрами, а совершением несложной операции в процессе
редактирования строк. Разделение производится введением символа
<> (клавиши SS/W) в следующую за «фантом-двоеточием»87
позицию редактируемой строки (в этой позиции курсор переходит в режим
[К]). После нажатия Enter часть строки до курсора возвращается с
прежним номером в текст программы, а остаток строки, словно хвост
ящерицы, оказывается в наших руках. Оставшийся в редакторе
«хвост» имеет тот же номер, что и его удравшая
«хозяйка». Поэтому, если номер не сменить, то после нажатия
Enter вторая часть строки перепишется в программу на место первой.
Будьте внимательны!
Без следующей команды не может обойтись любая мало-мальски уважающая себя версия Бейсика:
RENUM {<начало>] [ТО <конец>] [LINE <нов. начало)] [STEP <шэг>]
Она перенумеровывает (перебрасывает с одного
места программы в другое) блок строк, начиная с номера, заданного
параметром <начало>, по номер <конец>. Новое место (номер,
присваиваемый первой строке блока) и шаг перенумерации определяются
параметрами <нов. начало> и <шаг>88.
По умолчанию параметр <начало> принимает
значение номера первой строки программы, параметр <кснец> —
номера последней строки, <ное. начало) — 10 и <шаг>
— 10. Следовательно, использование команды RENUM без параметров
приведет к перенумерации всех строк программы, начиная с номера 10 и с
шагом 10.
Если при задании первых двух параметров будет
указан номер не существующей в программе строки, действие команды
прервется сообщением No such line — нет такой строки. В команде
предусмотрена «защита от дурака»: если от нее потребуют
присвоить строке уже существующий в программе номер, будет выдано
сообщение No room for line (нет места для строки).
Конечно, изменить номера строк в программе
— дело нехитрое, куда важнее другое: сохранить при этом
правильность всех ссылок в операторах GO ТО, GO SUB и других, задающих
переходы по номеру строки. В случае, если параметры в этих операторах
заданы в явном виде (числом), команда RENUM выполняет перенумерацию
этих параметров корректно. Номера строк, в которых содержатся операторы
перехода с параметрами, заданными выражением, после отработки команды
выводятся на экран в виде сообщений:
Failed at <номер строки>:<номер оператора в строке>
В этих операторах придется вручную откорректировать адреса переходов.
Для работы команды RENUM в качестве буфера используется экранная область памяти компьютера. Поэтому не пугайтесь, если
Значительно облегчает процесс редактирования программ команда
DELETE [< начало >] ТО [<конец>]
Она удаляет фрагмент программы со строки с
номером <начало> по строку <конец> включительно. В
редакторе Spectrum-Бейсик для этого пришлось бы вводить номер каждой
подлежащей удалению строки. По умолчанию параметр <начало>
принимает значение номера первой строки программы, <конец>
— последней строки.
Как и RENUM, команда DELETE «не
любит», когда в качестве параметров ей подставляют номера
несуществующих строк. В таких ситуациях она выдает сообщение No such
line (нет такой строки).
Использование DELETE в качестве оператора в тексте программ позволяет создавать так называемые оверлейные
программы, то есть программы, состоящие из небольшого блока, постоянно
находящегося в памяти компьютера, и фрагментов, подгружаемых по мере
необходимости с внешнего носителя. Отработавший фрагмент удаляется
оператором DELETE, а на его место (в эти же строки) с помощью MERGE
подгружается следующий. Таким образом можно писать программы
практически неограниченной длины.
Команда DELETE О ТО 0 позволяет при
необходимости избавиться от нулевой строки, в которой располагаются
описания расширенных функций Beta Basic.
Beta Basic не только вводит новые команды, но и совершенствует уже существующие. Одной из таких команд является
LIST [< начало>] ТО [<конец>]
Она выводит на экран фрагмент программы,
ограниченный строками с номерами, заданными значениями параметров <
начало > и <конец>.
Команда LIST REF <ключ для поиска>
выводит на экран список номеров строк, удовлетворяющих условию <
ключа>. Команда LIST DATA распечатает все переменные программы; LIST
VAL — только числовые, LIST VAL$ — символьные. Для массивов
будут выведены только их размерности.
При помощи команды LIST DEF KEY можно просмотреть список клавиш с приписанными им макросами. Вот такая многоплановая команда!
Завершим рассказ о редакторе Beta Basfb описанием очень полезной функции
MEMO
С ее помощью можно определить объем памяти в
байтах, доступный для бейсик-программ. Для иллюстрации работы функции
выполним программку:
10 PRINT МЕМ(): DIM >4(10.100): PRINT МЕМ()
В результате получим два числа, первое из
которых на 5008 больше второго. Это вполне естественно, ведь после
резервирования места под массив А() объем памяти, доступный
бейсик-прог-рамме, значительно уменьшится.
В заключение отметим, что некоторые из
описанных в этом разделе ключевых слов при использовании их в качестве
операторов в тексте программ могут иметь иной смысл, о чем мы расскажем
позже.