Языки программирования: Мега-Бейсик, Бета-Бейсик, Бета-Бейсик, Лазер-Бейсик, ZX-Форт, Паскаль HP4TM 1993 г.

BETA-BASIC - команды.


8. КОМАНДЫ

Команды приведены в алфавитном порядке.

ALTER <атрибуты> ТО атрибуты

Ключевое слово расположено на клавише "А".

Команда ALTER позволяет выполнять значительные манипуляции с
атрибутами экрана (INK, PAPER, BRIGHT и FLASH) для каждого зна-
коместа. В своей простейшей форме команда ALTER может изменять ат-
рибуты по всему экрану, не очищая его. Пример:

100 PRINT AT 10,10; "TEST":

PAUSE 50: ALTER TO PAPER 1

Эта строка изменит цвет PAPER всех символов на экране и сделает
его синим. Можно провести по всему экрану установку и какой-либо
комбинации атрибутов.

ALTER ТО PAPER 2, INK 7, FLASH 1

Можно производить и выборочную смену атрибутов. Для этого надо
перед ТО указать какие атрибуты Вы хотите поменять и на какие:

ALTER INK 7 ТО INK 0

В этом примере все, что написано на экране белым цветом INK
изменится на черный.

Перед Вами открывается возможность создавать оригинальные ви-
деоэффекты. Например, Вы можете изобразить что-либо одинаковым
цветом INK и PAPER и тогда изображение на экране будет не видно.
Теперь командой ALTER Вы меняете INK или PAPER и изображение про-
является перед Вами.

Попробуйте сделать вот такую головоломную комбинацию - она
тоже будет работать:

ALTER INK 3, BRIGHT 1, PAPER 7 TO INK 5, FLASH 1
- но затронет только те знакоместа, в которых установлены INK=3,
BRIGHT=1 и PAPER=7 одновременно.

Следующая программа продемонстрирует некоторые из эффектов
техники применения ALTER. Попробуйте в ней поэкспериментровать с
этим оператором. Скорость мигания полей на экране Вы можете изме-
нять в строках 170 и 220.
100 LET а=2, Ь=4
110 FOR 1=1 ТО 5
120 FOR п=1 ТО 16

130 PRINT INK a; PAPER b;"XXXX"; PAPER a; INK b;"0000";

140 NEXT n

150 LET c=a, a=b, b=c

160 NEXT 1

170 LET t=30

180 ALTER INK a TO INK b

PAUSE t
190 ALTER PAPER a TO INK a

PAUSE t
200 ALTER INK a TO PAPER b

PAUSE t
210 ALTER INK b TO PAPER a

PAUSE t
220 LET t=t - t/10 + 1
230 GO TO 180

ALTER <ссылка> TO ссылка

Ключевое слово расположено на клавише "А".

Это принципиально иная разновидность команды ALTER. По этой
команде программа ищет появление первого значения и заменяет его на
второе. Ссылкой здесь может быть имя переменной, число или строка
символов. Например:

ALTER а$ ТО Ь$ - заменит переменную а$ на Ь$;

ALTER count ТО с - заменит переменную count на переменную с, но
не затронет переменные accounts, counter и
т.п.

ALTER 1 ТО 2 3 - заменит число 1 на число 23, при этом, что
очень важно, изменится также и "невидимое"
пятибайтное представление числа, т.е. не
только на экране вместо единицы будет
изображено число 2 3, но ив расчетах тоже
будет участвовать число 23.

Однако:

ALTER 1 ТО "23" - заменит число 1 и его пятибайтное

представление на пару символов "23" и
расчеты в программе будут производиться
неправильно, хотя то, что Вы увидите на
экране в измененных строках, будет записано
вроде бы правильно.

Для всех вышеприведенных примеров по команде ALTER произво-
дится поиск по программе, при этом то, что стоит в кавычках, поиску
не подлежит (предполагается, что Вы ищете и заменяете название
процедуры, имя переменной или число). Но, в то же время, символьная
строка будет найдена в программе где угодно, даже внутри кавычек,
например:

ALTER "break to stop" TO "any key to stop"

Сами же кавычки при этом не разыскиваются. Если же Вам надо
вместо одной из символьных строк использовать имя переменной, то оно

должно быть заключено в скобки для того, чтобы команда ALTER
понимала, что Вы желаете изменить не имя переменной, а ее содержи-
мое . Например:

LET s$ = "execute": ALTER (s$) TO "execute"

Если же Вам надо использовать ALTER с символьными строками, со-
держащими ключевые слова, впечатайте их, воспользовавшись SYMBOL
SHIFT/ENTER для того, чтобы принудительно включить курсор "К".

Вы можете использовать ALTER для быстрого удаления чего-либо
из программы путем замены на пустую строку, например:

ALTER "word" ТО ""

Вы, наверное знаете (а в "ZX- РЕВЮ-91" мы этот вопрос обсужда-
ли), что числа требуют большого расхода памяти в БЕЙСИКЕ по срав-
нению с переменными и выражениями. Это происходит вследствие того,
что после символьного выражения числа следует еще его пятибайтный
аналог. И нередко в программах производят подмену, например вместо 1
употребляют SGN PI (экономятся 5 байтов) или, скажем вместо любого
числа применяют VAL "число" (экономятся 3 байта). Это можно легко
сделать с помощью ALTER. Например, для чисел от 1 до 100.

1 LET free = МЕМ()

2 FOR n=l ТО 100

3 ALTER (n) TO "VAL" + CHR$ 34 + STR$ n + CHR$ 34

4 NEXT n

5 PRINT "saved "; MEM() + 28 - free; " bytes"

Программа напечатает Вам сколько байтов ей удалось сэкономить.

Переменная п в строке 3 стоит в скобках для того, чтобы по ко-
манде ALTER изменялось не имя переменной "п", а то число, которое
она хранит.

Номера строк взяты минимальными - от 1 до 5 и это сделано
специально. Дело в том, что при такой работе ALTER возможны
сокращения расхода памяти в БЕЙСИК-области и все строки могут
"поехать" вниз в адресах памяти, а это недопустимо для циклов FOR...
NEXT. Так что нельзя допускать, чтобы до этого цикла в программе
могли бы быть какие-то строки, способные измениться по ALTER.

Число "28" в строке 5 введено для того, чтобы компенсировать те
затраты памяти, которые потребовались на создание нужных в этой
процедуре переменных free и п, т.е. чтобы эксперимент был чистым.

И последнее замечание. Будьте очень осторожны при использова-
нии команды ALTER в данной форме. Неаккуратной работой Вы можете
легко внести в программу неисправимые изменения. Например, если Вы
измените все переменные "apple" на "а", а потом сообразите, что "а"
уже использовалась в программе, то будет поздно. Вы не сможете сде-
лать обратный ход и снова поменять "а" на "apple", поскольку при
этом изменятся и те переменные "а", которые и должны быть "а". Мож-
но прежде, чем делать такие замены, убедиться, что "а" в программе
не использовалась - например командами REF или LIST REF (см. да-
лее) .

AUTO <номер строки> <,шаг>

Клавиша - "6".

AUTO - включает режим автоматической нумерации строк, что де-
лает более удобным написание программ. Если значение шага не ука-
зано, предполагается, что шаг равен 10. Если при этом не указан и
номер строки, с которого начнется автонумерация, то предполагается
номер текущей строки (строки, в которой установлен программный
курсор) плюс десять.

Режим AUTO отключается, когда номер строки менее 10 или более
9983 или при выдаче любого системного сообщения. Обычно принято
выходить из AUTO нажатием и удержанием BREAK продолжительностью

более секунды.

Если, находясь в режиме AUTO, Вы хотите выпустить некоторый
блок строк, сотрите предложенный программой номер строки и впишите
вместо него свой собственный. Тогда следующим номером, предложен-
ным Вам, будет тот, что Вы ввели, плюс величина шага. Примеры:

AUTO - от текущей строки + 10 с шагом через 10;

AUTO 100 - от строки с номером 100 и с шагом через 10;

AUTO 100,5 - от строки с номером 100 и с шагом через 5.

BREAK

Клавиши - CAPS SHIFT + SPACE в неграфическом режиме.

BREAK - не ключевое слово. Обычная команда BREAK из стандарт-
ного БЕЙСИКа вполне подходит для большинства приложений, но те, кто
программируют в машинных кодах, знают, как часто программа входит в
замкнутый цикл и не прерывается нажатием BREAK.

БЕТА-БЕЙСИК имеет резервную BREAK-систему. Если Вы нажмете и
удержите SHIFT + SPACE более, чем в течение 1 секунды, эта система
поймет, что Вы "зависли" и исполнит BREAK даже если обычная сис-
тема не работает. Этим методом можно выйти из затруднений, если Вы
неосторожно отключили "STOP in INPUT" или "BREAK into program"
посредством команды ON ERROR. Этот же прием выведет Вас из INPUT
LINE, EDIT и AUTO.

Примечания: 1) Если Вы "вывалились" в исходное "Синклеровское"
сообщение, этот метод Вам не поможет.
2) Программистам в машинных кодах, желающим
воспользоваться работой резервной BREAK-системы, не
следует отключать прерывания. Система работает на
прерываниях 2-го рода и они должны быть включены
постоянно.

CLEAR число.

Эта команда должна представлять большой интерес для тех, ki*
работает с машинным кодом. CLEAR с числом, меньшим чем 7 67 переме-
щает указатель RAMTOP вниз на заданное этим числом количество
байтов.

Почему 767? В этом числе всего три знака, поэтому Вы его никак
не спутает с обычной командой CLEAR, после которой, как известно
должен идти пятиразрядный адрес. Кроме того, это число легко
реализуется на Ассемблере.

На экран, переменные и на стеки GOSUB, DO-LOOP и PROC эта ко-
манда не влияет. Клавиши определенные пользователем, а также область
определения окон (расположенная непосредственно выше RAMTOP)
перемещаются вместе с RAMTOP. За этими определениями образуется
свободное пространство, простирающееся до начала кода БЕТА-БЕЙСИКа
47070. ОБРАТИТЕ ВНИМАНИЕ: это пространство не заполняется нулями.

Та же команда CLEAR с отрицательным числом передвинет RAMTOP, и
области определения клавиш пользователя и окон - вверх на заданной
число байтов.

Никаких проверок на перекрытие машинного кода БЕТА-БЕЙСИКа не
производится, поэтому будьте осторожны и вообще не надо пользо-
ваться этой командой, если Вы ранее не перемещали RAMTOP вниз.

МАЛЕНЬКИЙ НЮАНС. Когда Вы опускаете RAMTOP вниз на сколько-то
байтов, образуется свободная область размером столько же байтов.
Она образуется непосредственно под машинным кодом БЕТА-БЕЙСИКа и
вовсе не обязательно над RAMTOP, поскольку RAMTOP могла указывать в
совсем иное место. Пример позволяет Вам поэкспериментировать с этой

командой.

100 LET ramtop = 23730

110 PRINT DPEEK (ramtop)

120 CLEAR 100

130 PRINT DPEEK (ramtop)

140 CLEAR -50

150 PRINT DPEEK (ramtop)

CLOCK число или строка

Клавиша: "С"

Этот оператор позволяет управлять часами, показания которых
могут быть показаны в правом верхнем углу экрана. Показания со-
держат часы, минуты и секунды. Часы - в 24-часовом формате. Мо-
жет быть задействован режим таймера (будильника). В этом случае в
заданное время может быть выдан звуковой сигнал, а может быть
включена процедура GOSUB.

Часы работают от прерываний и потому счетчик работает и тогда,
когда Вы пишете программу и тогда, когда Вы ее запускаете. Един-
ственное, когда часы не работают - тогда, когда идет загрузка/вы-
грузка, исполняется ВЕЕР или работает теневая периферия типа
INTERFACE I.

Параметром, определяющим в каком режиме работают часы, являет-
ся число, стоящее после оператора. Это число может быть в диапа-
зоне от 0 до 7 и имеет следующее содержание:

Число

Переход

Звуковой

Экран

GOSUB

сигнал

0

НЕТ

ВЫКЛ

ВЫКЛ

1

НЕТ

ВЫКЛ

ВКЛ

2

НЕТ

ВКЛ

ВЫКЛ

3

НЕТ

ВКЛ

ВКЛ

4

ДА

ВЫКЛ

ВЫКЛ

5

ДА

ВЫКЛ

ВКЛ

6

ДА

ВКЛ

ВЫКЛ

7

ДА

ВКЛ

ВКЛ

Часы начнут работать сразу
после загрузки БЕТА-БЕЙСИКа.
Начальная установка - "00:00:00".

Выдать показание на экран
можно командой CLOCK 1. Установка
конечно не будет соответствовать
истинному времени, но поправить
дело можно командой CLOCK строка,
- например: CLOCK "09:29:55".

Здесь разряды отделены
двоеточием, хотя в этом нет
никакой необходимости.
При вводе времени для установки, компьютер воспринимает только
шесть цифр, а все символы-разделители (кроме символа "а")
игнорирует. Если в Вашем вводе будут только пять цифр или меньше, он
просто заменит недостающие нулем, например:
CLOCK "xyzlO"

Здесь xyz будут восприняты как символы-разделители и проигнори-
рованы, а "10" - как установка первых двух разрядов. В результате
получится: "10:00:00".

Символ "а", о котором мы упоминали, как об исключении, служит
для установки таймера: "А06:20" - установит будильник на 6 часов 20
минут. По достижении этого времени включится звуковой сигнал, если
его режим был включен командой CLOCK 2, 3, 6 или 7.

Можно сделать и так, что в данное время программа выполнит
переход GOSUB к назначенной подпрограмме, если режим был включен
CLOCK 4,5,6 или 7. Правда такой переход возможен только в состоя-
нии работающей программы. Если Вы в этот момент выполняете ввод или
редактирование, Вашу работу прерывать компьютер не будет.

Подпрограмма, которая вызывается, может быть любой сложности и
размера. Это может быть: 10 GO ТО 10, - а может быть текстовой
редактор или игра. По достижении заданного времени компьютер

закончит ту строку, с которой он работает, а потом только сделает
переход. Завершение строки может занять определенное время, особенно
если это INPUT или PAUSE.

Выбор и назначение подпрограммы, к которой выполняется переход
C50SUB делается тоже оператором CLOCK число.

Здесь "число" - это номер строки, к которой делается переход.
Это число должно быть в интервале от 8 до 9999. Нижний предел 8
назначен, чтобы отличать это назначение от выбора режима работы, в
котором параметр может быть от 0 до 7.

Другой метод ввода подпрограммы для перехода по таймеру -
прямой:

CLOCK: оператор: оператор:...: RETURN

В подпрограмме обработки перехода по таймеру нельзя исполь-
зовать те же имена переменных, что и в главной программе, если Вы не
хотите, чтобы их содержимое изменялось. Вы можете оформить эту
подпрограмму как процедуру и назначить используемые в ней па-
раметры как LOCAL. Если Вы хотите, чтобы эта подпрограмма выпол-
няла сохранение данных, а в главной программе возможно использо-
вание RUN или CLEAR, то Вам надо сохранять эти данные посредством
РОКЕ в соответствующих областях памяти, неповреждаемых по RUN или
CLEAR.

Возможные применения подпрограммы перехода по таймеру могут
быть такими:

- проигрывание музыкальной мелодии в заданное время
(разновидность будильника);

- перестроение экрана;

- бой часов (чтобы узнать при этом сколько сейчас времени, т.е.
сколько раз должны пробить Ваши часы, можно воспользоваться
функцией Т1МЕ$ - см. далее.)

Вы можете даже изменять масштаб времени с помощью внутренней
переменной БЕТА-БЕЙСИКа, размещенной в адресе 56866. Исходно там
установлен режим хода часов 1/50 секунды на каждый ход.

РОКЕ 56866,58 сделает Вам режим 100 секунд в минуте, а РОКЕ
56866,54 - вернет к нормальному режиму.

Специалисты в электронике могут организовать регулярный (ска-
жем, каждый час или каждую минуту) прием данных от внешних уст-
ройств, например:

8999 STOP

9000 PRINT "Процедура включена"
9010 LET pointer=DPEEK (USR "а"):

POKE pointer, IN 127
9020 LET pointer = pointer +1:
IF pointer>655 35 THEN
LET pointer = USR "a" + 2
9030 DPOKE USR "a",pointer:

LET z$ = TIME$()
9040 LET hours = VAL z$ (1 TO 2),

mins = VAL z$ (4 TO 5)
9050 LET mins = mins +1:
IF mins = 60 THEN
LET hours=hours+l, mins = 0
9060 CLOCK "a" USING$ ("00",hours) + USING$ ("00",mins):
RETURN

He запускайте эту программу через RUN, а вместо этого дайте
прямую команду:

DPOKE USR "а" , USR "а" +2:
CLOCK 9000: CLOCK 5

Эта прямая команда проинициализирует указатель (pointer),
расположенный в адресах USR "а" и USR "а" +1. Строка 9000 назначена

как строка перехода по таймеру. Команда CLOCK 5 делает этот переход
возможным. Для проверки задайте время срабатывания таймера:

CLOCK "АХХХХ" - ХХХХ - установка времени.

Теперь запускайте некоторую программу через RUN. Подпрограмма
CLOCK будет активироваться каждую минуту и считывать данные из вне-
шнего порта 127. Прочитанные данные сохраняются в области графики
пользователя UDG в адресах, на которые указывает указатель
(pointer). Указатель постоянно наращивается, а при достижении
верхнего предела физической памяти 65535 возвращается в исходное
положение. Если у Вас нет внешних устройств, подключенных к внешним
портам, то можете организовать работу так, чтобы какое-нибудь другое
полезное дело с помощью этой подпрограммы выполнялось через
регулярные интервалы времени.

Строки 9040 - 9060 переустанавливают таймер на время, отсто-
ящее на 1 минуту от текущего времени, потом выполняется возврат в
главную программу.

CLS сномер окна>

Просто команда CLS без указания параметра выполняет очистку
текущего окна. (Более подробно - см. WINDOW).

CLS с параметром, выполняет очистку окна с номером, равным
параметру (если конечно это окно было задано). Если же Вы забыли
определить это окно, то получите сообщение об ошибке:

"Invalid I/O device" (Неверно задано устройство ввода/вывода)

Команда CLS 0 - это то же самое, что и команда CLS стандарт-
ного БЕЙСИКа, т.е. она выполняет очистку экрана вне зависимости от
того, какое окно в настоящий момент является активным.

CONTROL CODES (УПРАВЛЯЮЩИЕ КОДЫ)

Управляющие коды - это специальные символы, употребляемые в
командах печати PRINT и PLOT, но сами по себе они не печатаются, а
служат для того, чтобы указывать где что печатать. Так что в отли-
чие от обычных символов их нельзя увидеть - они не имеют графичес-
кого изображения.

В БЕТА-БЕЙСИКе есть две группы управляющих кодов. Первая
служит для управления курсором и позицией печати по командам PRINT
и PLOT, а вторая применяется при управлении специальными блоками
экрана, обрабатываемыми по команде GET (см. ниже).

Разница между кодами с номера-
ми 2...5 и 8...11 в том, что ко-
ды, предназначенные для работы в
окне, не могут вывести курсор
(позицию печати) за пределы теку-
щего окна. Это бывает очень удоб-
ным во многих случаях, например
при создании текстового редакто-
ра.

Коды 2...5 не имеют этого ог-
раничения и применяются, как, пра-
вило, с командой PLOT. Фактически
же PLOT сама конвертирует коды
8... 11 в коды 2...5 во время сво-
ей работы.

В стандартном БЕЙСИКЕ обработ-
ка кода CHR$ 8 имеет ошибку.
Так, невозможно перемещением кур-
сора влево поднять его с нижеле-
жащих строк на вышележащие, а ее-

Коды управления курсором.

Коды управления курсором.

Коды

Наименование

Область
действия

CHR$

2

курсор

влево

экран

CHR$

3

курсор

вправо

экран

CHR$

4

курсор

вниз

экран

CHR$

5

курсор

вверх

экран

CHR$

8

курсор

влево

окно

CHR$

9

курсор

вправо

окно

CHR$

10

курсор

вниз

окно

CHR$

11

курсор

вверх

окно

CHR$

12

DELETE

окно

CHR$

15

Добавочный

окно

ENTER

ли он находится на самой верхней строке, то таким перемещением
можно его вообще вывести за пределы экрана и войти в распечатку
программы. Здесь эта ошибка исправлена.

Код CHR$ 9 в стандартном БЕЙСИКе тоже обрабатывается с ошиб-
кой и здесь она тоже исправлена.

Стандартный БЕЙСИК распечатывает коды 10, 11, 12 в виде во-
просительного знака, что не очень полезно. Здесь они работают так,
как это должно бы быть.

В качестве примера рассмотрим, как управляющие коды, включенные
в текстовые строки, позволяют выводить на экран сложные формы через
PRINT или PLOT.

10 LET а$ = "1234" + CHR$ 8 +
CHR$ 10 + "5" + CHR$ 8 +
CHR$ 10 + "678" + CHR$ 8 +
CHR$ 11 + "9"
20 PRINT AT 10,10; a$
3 0 PAUSE 100: CLS
40 FOR n= 32 TO 255
50 PLOT n, n/2: a$: NEXT n

Особенно полезным это может быть при работе с графикой поль-
зователя - эксперименты проведите сами.

CHR$ 15 работает, как ENTER в том смысле, что позволяет пре-
рвать строку в любом месте и продолжить ее набор в новой экранной
строке. Обычный ENTER послал бы строку при этом в листинг про-
граммы и работа бы с ней закончилась. Кроме того, CHR$ 15 можно
вставлять в текстовые строки, чтобы организовывать печать так, как
Вам это нравится. Вводится CHR 15 одновременным нажатием CAPS SHIFT
+ ENTER.

КОДЫ УПРАВЛЕНИЯ ЭКРАННЫМИ БЛОКАМИ.

Этих кодов два: CHR$ 0, CHR$ 1.

Код CHR$ 0 говорит о том, что за ним следуют восемь байтов,
определяющие графический образ элемента экрана.

Код CHR$ 1 говорит о том, что за ним следует байт атрибутов и
далее - восемь байтов, определяющие графический образ элемента
экрана.

Эти управляющие коды совместно с кодами CHR$ 8 и 10
используются командой GET для сохранения блока экрана в качестве
строковой переменной. Может быть Вам и не нужна нижеследующая
информация, но кому-то она покажется интересной.

Когда команда PLOT встречает символ CHR$ 0, она понимает, что
очередные 8 байтов не являются печатными символами, а задают рисунок
знакоместа размером 8X8 пикселов, который и должен быть
воспроизведен на экране. Это же относится и к команде PRINT, если
задан CSIZE, отличный от нуля. (Для нормального экрана следует
задавать CSIZE равным восьми.) Кодируется изображение знакоместа по
пиксельным строкам абсолютно также, как это делается для символов
графики пользователя. Изображается построенный шаблон в текущих
установленных цветах INK и PAPER. Все, как с графикой пользователя
UDG. Более того, Вы можете создать массив из 9-ти символьных строк,
начинающихся с CHR$ 0 и использовать каждый элемент массива, как
свой UDG-символ. Понятно, что при этом Вы можете иметь огромные
символьные наборы.

CHR$ 1 слегка отличается, т.к. за этим управляющим кодом идет

еще один байт, определяющий атрибуты. Поэтому при печати такого
шаблона принимаются не текущие цветовые установки, а то, что со-
держится в этом байте.

Команда GET во время своей работы снимает изображение заданной
области экрана, режет его на знакоместа, каждое знакоместо, кодирует
8-ью или 9-ью байтами, добавляет перед каждой серией байтов CHR$ О
или CHR$ 1, вставляет между сериями символы управления курсором и,
тем самым, представляет область экрана в виде длинной строки
символов, которую и запоминает в какой-то переменной.

Если хотите поэкспериментировать с управляющими кодами, соз-
дайте строку и напечатайте ее сразу всю, целиком, а не по одному
символу.

10 CSIZE 8

20 LET а$ = CHR$ 0 + CHR$ 255 + CHR$ 129 + CHR$ 129 + CHR$ 129
+ CHR$ 129 +CHR$ 129 + CHR$ 129 + CHR$ 255

30 PRINT a$: PRINT CSIZE 16; a$ :
PLOT 128,88; a$

COPY строка, COPY массив

Команда имеет очень близкое отношение к команде JOIN. Подроб-
ности см. в команде JOIN.

CSIZE ширина <, высота>

Клавиша: SHIFT + 8.

CSIZE управляет размером символов при использовании операто-
ров PLOT, PRINT и LIST. Аналогично INK и PAPER эта команда имеет
глобальный характер, когда используется в качестве самостоя-
тельного оператора и распространяется только на один оператор, если
стоит в качестве элемента в списке PRINT.

Ширина и высота задаются в единицах пикселов. Если Вы не за-
даете параметр высоты, то по умолчанию высота принимается равной
ширине. Нижеприведенный пример показывает символы, имеющие размеры в
четыре раза больше, чем стандартные (CSIZE 32), но Вы можете сделать
и символы во весь экран - CSIZE 255,176. Правда, для очень больших
символов придется нажимать BREAK, чтобы остановить автоматический
скроллинг экрана.

10 FOR п=8 ТО 32 STEP 8

20 CSIZE n

3 0 CLS

40 PRINT "CSIZE "; n

50 LIST

60 NEXT n

70 CSIZE 0

Символы больших размеров выполняются пропорциональным увели-
чением стандартных "Спектрумовских" символов. CSIZE 16 - увели-
чение в 2 раза, CSIZE 24 - в три раза и т.д. Небольшие изменения в
CSIZE могут повлиять на расстояние между символами при печати, не
влияя на размеры самих символов.

Попробуйте в приведенном примере в строке 10 удалить оператор
STEP 8 и посмотрите, что получится.

CSIZE с параметрами 8,9,10 и 11 работает с шрифтом 8X8, а
CSIZE с параметрами 12 ... 19 использует уже шрифт 16X16 и т.д.

Для некоторых параметров возможно, что при печати поля оче-
редного символа будут перекрывать (затирать) рядом лежащий символ.
Неплохой идеей борьбы с этим является использование при печати

режима OVER 1.

Для вышеприведенного примера можно получить интересные эффек-
ты, если перед командой LIST дать прямые команды:

INVERSE 1: CSIZE 9 или CSIZE 32,8 или CSIZE 8,32
Итак, мы рассмотрели работу с крупными символами, но можно по-
работать и с мелкими. CSIZE 3,8 позволит Вам иметь 85 символов в
строке, но это не очень зрелищно, разве что если Вы работаете толь-
ко с малыми буквами и имеете хороший монитор.

CSIZE 4,8 дает 64 символа в строке. CSIZE 6,8 и CSIZE 7,8
используют стандартные символы и экономят на пробелах между ними.
Если Вам надо иметь 40 символов в строке, делайте так:
OVER 1: CSIZE 6,8

После этого, с помощью команды WINDOW уменьшите размер экрана
по ширине до 24 0 пикселов и у Вас будут точно 40 символов в строке.

Подпрограмма, выполняющая печать, отличается большой ухищрен-
ностью. Она может печатать в любой точке экрана (с координацией
позиции печати до пиксела), в любом размере, согласует печать с
активным в данный момент окном. Поэтому она работает конечно мед-
леннее, чем стандартная PRINT-процедура. Для возврата к стан-
дартной процедуре Вы можете использовать специальную команду CSIZE
0. При этом в качестве активного окна выбирается WINDOW 0 (весь
экран). После загрузки БЕТА-БЕЙСИКа исходной является установка
CSIZE 0.

Все прочие коды управления печатью, такие как TAB, AT, запя-
тая PRINT, коды управления курсором - работают в соответствии с
установленным значением CSIZE. Например, для режима CSIZE 4,8 Вы
сможете дать такую команду, как TAB 63.

Внутри операторов PRINT и PLOT CSIZE используется для создания
временных эффектов.

10 PRINT CSIZE 8,16: "двойная высота"; CSIZE 8; "нормальная

высота"; CSIZE 4,8; "малая высота"
20 PLOT CSIZE 32,16; 100,100;"AS"

При печати символов графики пользователя есть небольшие
особенности. Если ширина задана меньше, чем 6 пикселов, печатается
только правая часть символа. Вы, конечно, можете подготовить свой
набор символов, учитывающий этот факт.

Символы блочной графики обрабатываются как обычные символы -
растягиваются, сжимаются и пр.в

Есть ограничения на печать блоков экрана, снятых по GET. Этот
блок, как мы говорили выше, представляет собой строковую пе-
ременную, определяющую конструкцию шаблона 8X8 и взаимосвязь между
соседними шаблонами. Поэтому при печати таких блоков желательно
использовать задания CSIZE, кратные восьми, в крайнем случае - 4.
Т.е. это 4,8,16,24 и т.д.

При использовании параметра 4 могут исчезать отдельные
пикселы, но иногда для регулярных рисунков результат получается
неплохим.

DEFAULT переменная = значение <, переменная = значение>...

Клавиша: SHIFT + 2.

DEFAULT в принципе работает, как и LET, но в отличие от него
не изменяет значение переменной, если она уже существует.
10 LET а=10
20 DEFAULT а=20
30 DEFAULT Ь=3 0
40 PRINT а,b

Строка 40 напечатает Вам, что а=10, поскольку DEFAULT в строке

20 будет проигнорирован, а Ь=30, т.к. DEFAULT в строке 30 сработа-
ет .

DEFAULT следует понимать как выражение "принять значение, если
иное не задано".

Как и за LET, в БЕТА-БЕЙСИКе за DEFAULT могут идти множествен-
ные определения, причем обрабатываются они независимо, одно за
другим.

100 DEFAULT a$="abcdef", zx=123, q=0

Этот оператор можно использовать в программе где угодно, но
наиболее широкое применение он имеет в определениях процедур для
того, чтобы пользователь мог опускать те или иные параметры при
вызове процедуры.

DEFAULT = устройство

Эта разновидность оператора DEFAULT позволяет задавать по
умолчанию устройство ввода/вывода.^ Она рассчитана на работу с
ИНТЕРФЕЙСОМ-1.

Команда позволяет использовать обычные команды SAVE/LOAD/MERGE/
VERIFY при работе с микродрайвом, локальной сетью, глобальной сетью
через порт RS232. То есть, благодаря ей, упрощается синтаксис ко-
манд в работе с этими видами устройств.

В состоянии поставки БЕТА-БЕЙСИК имеет установку "t", то есть
на магнитофон. Примеры прочих установок:
DEFAULT = m Микродрайв 1
DEFAULT = Ml Микродрайв 1
DEFAULT = ш2 Микродрайв 2
DEFAULT = п5 Локальная сеть, станция N5
DEFAULT = В Порт RS 2 32, канал "В"
DEFAULT = t Магнитофон

В качестве примера покажем, какие команды могут быть исполь-
зованы после того, как была проведена установка DEFAULT = m. Все они
будут работать с микродрайвом 1.
SAVE "test"
SAVE 1; "test"
SAVE *"m";1;"test"
SAVE 10 TO 100; "test"
LOAD "test"
VERIFY "test"
MERGE "test"
ERASE "test"
CAT

При этом, чтобы использовать микродрайв 2, можно либо задать
DEFAULT = m2, а можно и не задавать, а использовать:
SAVE 2, "test"
LOAD 2, "test"
ERASE 2, "test"
CAT 2

Вы можете вместо номера использовать переменную, например:

LET х=2: DEFAULT mx
Но нельзя использовать для этой цели строковую переменную.
Даже если в качестве устройства ввода/вывода назначен
магнитофон, такие команды как SAVE 1; "abc" или LOAD n, "prog" будут
работать с микродрайвом, поскольку заданный параметр номера
однозначно указывает на то, что речь не идет о магнитофоне.

Текущие параметры установки устройства будут выгружены вместе
с кодом БЕТА-БЕЙСИКа, если Вы захотите выгрузить свою программу и
БЕТА-БЕЙСИК вместе с ней.

Примечание: БЕТА-БЕЙСИК разрешает в командах, связанных с
микродрайвом использовать запятую "," вместо точки
с запятой ";м.

DEF KEY односимвольная строка; строка
или

DEF. KEY односимвольная строка; оператор: оператор: ...

Клавиша: 1 (та же, что и DEF FN, см. также LIST DEF KEY)

БЕТА-БЕЙСИК позволяет присвоить любой цифровой или буквенной
клавише значение символьной строки или программных строк. При этом
символы могут вводиться в компьютер, а могут оставаться в нижней
части экрана (в области редактирования) до нажатия ENTER.

Последний случай реализуется следующим образом: надо сделать
так, чтобы последним символом Вашей строки стояло двоеточие ":" или
чтобы последним оператором программной строки стоял оператор ":".
Попробуйте:

DEF KEY "1"; "HELLO:"

Теперь нажмите совместно SYMBOL SHIFT и SPACE. Курсор изме-
нится и станет мигающей звездочкой. Если Вы теперь нажмете клавишу
"1", в нижней части экрана появится надпись HELLO. Поскольку никакие
другие клавиши не были переопределены, при их нажатии Вы получите
их нормальные значения.

DEF KEY "а": PRINT "Goodbye"

В этом примере часть программной строки, следующая после DEF
KEY "а", присваивается клавише "а" (или "А", что одно и то же). Эта
строка не исполняется после ее набора. После же того, как Вы нажмете
SYMB.SHIFT + SPACE и затем нажмете "а", она будет введена и
исполнена, поскольку она не заканчивается двоеточием.

DEF KEY "а"; "10 REM hello"

Такая строка после нажатия на клавишу "а" будет реально введена
в листинг программы после того, как пройдет проверку на синтаксис.

Клавише можно сделать переприсвоение в любое время. Старое
значение при этом будет переписано. Если присвоить клавише пустую
строку или если после задания клавиши нет ни одного оператора,
клавиша не будет иметь определения. Оператор DEF KEY ERASE унич-
тожит все сделанные определения, в том числе и те, которые разме-
щены выше RAMTOP и, тем самым, защищены даже от NEW. Процедура SAVE
в загрузчике БЕТА-БЕЙСИКа выгрузит все определения клавиш
вместе с машиннокодовой частью БЕТА-БЕЙСИКа (она производит вы-
грузку кода от RAMTOP до конца БЕТА-БЕЙСИКа).

Чтобы просмотреть все определения клавиш, пользуйтесь командой
LIST DEF KEY. Если желаете подредактировать определение, присво-
енное клавише, то можете выполнить следующий прием. Наберите номер
строки, затем нажмите номер желаемой клавиши и Вы получите
редактируемую строку, которую Вы сможете оформить в оператор DEF
KEY.

RAMTOP автоматически понижается, когда Вы задаете клавиши. Ес-
ли Вы воспользуетесь обычным CLEAR для изменения RAMTOP, то вполне
может быть, что Ваши определения клавиш пропадут. С другой стороны,
БЕТА-БЕЙСИК имеет другой вариант CLEAR (см. выше), с помощью
которого можно без риска для определений клавиш выделять прос-
транство для своего машинного кода выше уровня RAMTOP.

DEF PROC имя процедуры <параметр> <,REF паранетр>...
или

DEF PROC ИМЯ процедуры <DATA>

Клавиша: 1 (та же, что и DEF FN). См. также PROC, END PROC,
LOCAL, DEFAULT, LIST PROC, REF, ITEM.

Оператор DEF PROC открывает определение процедуры. Он должен
быть первым оператором в программной строке (разрешаются только
ведущие пробелы или предшествующие управляющие цветовые коды). Имя
процедуры должно обязательно начинаться с буквы, а заканчиваться
может пробелом, двоеточием, REF, ENTER или DATA. Имя процедуры мо-
жет быть записано почти любыми символами, за исключением пробела,
но желательно, чтобы Вы использовали буквы, цифры, знак подчеркива-
ния "_" , и, пожалуй символы "#" и "$" . Буквы верхнего и нижнего ре-
гистров - эквивалентны. Процедура может иметь то же имя, что и пе-
ременная и путаница не произойдет.

За именем процедуры может идти список параметров или ключевое
слово DATA. Параметры, заданные в определении процедуры, называются
формальными параметрами. Это имена переменных. Когда процедура будет
вызвана, то все имеющиеся в ней переменные с именами, совпадающими с
формальными параметрами, будут защищены и только потом им будут
присвоены значения фактических параметров, присутствующих в вызове.
Когда же перед именем формального параметра стоит REF, все
происходит почти так же, но в добавок по окончании работы процедуры
значение формального параметра будет присвоено соответствующему
фактическому параметру. В процедуре могут участвовать и массивы, но
они обязательно должны быть оформлены, как ссылки, то есть перед
именем массива в определении процедуры обязательно должно стоять
REF.

Когда вместо списка параметров стоит ключевое слово DATA, ника-
ких переприсвоений не делается, а список фактических параметров при
вызове процедуры может быть принят с использованием оператора READ
и функции ITEM.

DELETE <номер строки> ТО <номер строки>.

Клавиша 7 (та же, что и ERASE).

Команда удаляет все строки в указанном блоке программы. Если
номер начальной строки опущен, предполагается минимальный, от-
личный от нуля. Если опущен номер конечной строки удаления, прини-
мается номер последней строки программы. Примеры.

DELETE ТО 100 - удаляет все строки после нулевой и до строки 100
включительно;

DELETE 100 ТО - удаляет строку 100 и все последующие;
DELETE 100 ТО 100 - удаляет только строку 100;
-DELETE 0 ТО 0 - удаляет только нулевую строку;

DELETE ТО - удаляет всю программу, за исключением нулевой строки.

Последний пример отличается от NEW тем, что не вычищает
программные переменные. Все строки, явно указанные в операторе,
должны реально существовать, иначе Вы получите сообщение об ошибке:
U "No such line" (нет такой строки).

DELETE можно включать в текст программы, но с некоторыми предо-
сторожностями. Когда вышележащие строки программы удаляются опера-
тором DELETE, расположенным в подпрограмме, процедуре, в цикле
FOR...NEXT или DO...LOOP, программа обычно прекращает нормальную
работу, поскольку запомненный адрес возврата уже не соответствует
реальным новым адресам строк. Если же оператор DELETE применяется
для того, чтобы удалить самого себя из программы, он должен быть
последним оператором в строке.

Возможное применение DELETE в программе - это удаление строк

DATA после того, как они уже были прочитаны для того, чтобы освобо-
дить память для программных переменных, поскольку числа в строках
DATA очень сильно расходуют память - по крайней мере по 8 байтов на
каждое число. Программа может также удалять часть строк для того,
чтобы подзагрузкой выполнить MERGE нового блока на освободившееся
место.

DELETE имя массива <пределы> или DELETE строка <пределы>

Клавиша 7 (та же, что и ERASE)

Кроме удаления программных строк, DELETE может удалять мас-
сивы полностью или частично и символьные строки.
10 LET а$ ="123456789"
20 DELETE а$ (4 ТО 7)
30 PRINT а$: REM prints "12389"
40 DELETE а$

50 PRINT а$: REM переменная не найдена

Когда удаляется строковая переменная, то она перестает суще-
ствовать полностью, а не просто становится пустой строкой. Команда
работает одинаково для строк и для массивов. Создайте массив для
эксперимента и попробуйте:
10 DIM а$ (10,4)
20 FOR n= 1 ТО 10

30 LET a$(n)=CHR$(64+n)+"xxx"
40 NEXT n

50 FOR N=1 TO length (l,"a$")
60 PRINT a$ (n)
70 NEXT n

В строке 50 использована функция LENGTH вместо числа 10 пото-
му, что количество элементов в массиве будет изменяться. Теперь
добавьте дополнительные строки:
4 5 DELETE а$ (3)
4 5 DELETE а$ (3 ТО)
45 DELETE а$ (ТО 4)
45 DELETE а$

Опять запустите программу командой RUN и посмотрите, какие
элементы будут удаляться. В числовом массиве команда DELETE а(6)
удалит шестой элемент, если массив одномерный или целую строку
элементов, если массив двумерный.

DELETE а(3 ТО 8) удалит "вырезку" из элементов одномерного
массива или группу строк из двумерного. (В числовом двумерном
массиве количество рядов задается первым числом.)

DO или DO WHILE <условие> или DO UNTIL <условие>

Клавиша: D (Ключевое слово WHILE находится на клавише 0, а
ключевое слово UNTIL - на клавише К).

См. также LOOP, EXIT IF.

Конструкция DO - LOOP имеет ряд преимуществ по сравнению с
обычным способом организации циклов FOR - NEXT стандартного БЕЙ-
СИКа. Эти преимущества становятся еще более ощутимыми при использо-
вании квалификаторов WHILE и UNTIL.

Без них DO и LOOP являются просто маркерами, отмечающими на-
чало и конец цикла. После того, как программа встретит оператор
LOOP, управление передается на оператор DO и т.д. Пример:

10 DO

20 PRINT "HELLO ";

30 LOOP

Эта программа будет печатать бесконечное число раз слово
HELLO. Остановить ее можно будет только нажав BREAK.

Действие DO можно изменить с помощью квалификатора WHILE <ус-
ловие>. Его действие таково:

Если условие, стоящее после WHILE справедливо (имеет значение
"истина"), то выполняются операторы, стоящие после DO до тех пор,
пока не встретится оператор LOOP, после чего управление вновь пере-
дается на DO и вновь проверяется справедливость условия и т.д. Если
же условие "ложно", то вся часть программы, стоящая между DO и LOOP
игнорируется и управление передается к оператору, стоящему за LOOP.

Таким образом, та часть программы, которая стоит между DO WHILE
<условие> и LOOP выполняется раз за разом, пока <условие>
справедливо.

DO UNTIL <условие> имеет прямо противоположное значение. Часть
программы, заключенная между DO и LOOP выполняется, пока условие
"ложно". (Иными словами: до тех пор, пока условие не станет спра-
ведливым). Пример:

10 LET total = 0

20 DO UNTIL total > 100

30 INPUT "Введите число ";x

40 LET total = total + x

50 PRINT total

60 LOOP

70 PRINT "Получили число больше ста"

В этом примере строку 20 можно было бы заменить такой:

20 DO WHILE total <= 100.
Пары DO-LOOP могут вкладываться точно так же, как FOR - NEXT.
Например:

программе хранится
нельзя выходить из

Компьютер запоминает адрес, по которому в
оператор DO. Для запоминания служит стек, поэтому
цикла (перепрыгивать через LOOP), иначе как с помощью EXIT IF или
POP. Иначе может произойти "закупоривание" стека и сбой работы в
программе.

Если в программе для оператора DO не найден соответствующий
LOOP, выдается сообщение об ошибке: S, "Missing LOOP".

Аналогичные конструкции существуют и во многих других языках
программирования и могут иметь другое написание. Вот примеры
аналогичных конструкций:

DO DO

операторы операторы

LOOP UNTIL <условие> LOOP

DO WHILE <условие>
операторы

LOOP

DPOKE адрес, число

Клавиша: Р

См. также DPEEK (адрес),число
DPOKE означает "двойной" РОКЕ.

Этот оператор засылает двухбайтное число в две адресных ячейки.
Аналогичная конструкция а стандартом БЕЙСИКе имеет следующий вид:
РОКЕ а,п - INT(п/25 6)*25 6 Здесь: а - адрес

РОКЕ а+1,INT(n/256) п - число (О...65535)

Другими словами, младший байт засылается по указанному адресу,
а старший байт - в следующий за ним адрес.

Поскольку многие системные переменные "Спектрума" имеют именно
такой двухбайтный формат, то их очень удобно изменять с помощью
DPOKE. Аналогично функция DPEEK представляет "двойной" РЕЕК.

DRAW ТО х,у <,угол>

Здесь используются два ключевых слова стандартного БЕЙСИКа -
DRAW и ТО.

Этот оператор вычерчивает линию от текущей графической пози-
ции до точки, заданной координатами х,у. Часто это более удобно, чем
использовать стандартный DRAW, при котором задаются не абсолютные
координаты, а величина относительного "смещения" по горизонтали и
вертикали. Пример:

10 FOR п=1 ТО 100

20 DRAW ТО RND*255,RND*175

30 NEXT n

Если Вы зададите и третий параметр (угол), то сможете изоб-
ражать кривые.

После ТО Вы можете поставить оператор цвета PAPER, INK или
атрибут, например OVER и т.п.
DRAW ТО 10,10
DRAW ТО INK 2; 20,30
DRAW ТО 100,90,1

EDIT <номер строки>

Клавиша: 0 (в обычном, не графическом режиме).

Это не то же самое, что SHIFT + "1".EDIT - это ключевое слово.
Оно предназначено для того, чтобы избежать утомительной последова-
тельности: LIST - выбор строки - BREAK - SHIFT + "1".

Для того, чтобы быть по-настоящему полезным, EDIT должен
вызываться без нажатия SHIFT-клавиши. Но все буквенные клавиши уже
заняты, а цифровые клавиши нужны для ввода номеров строк. В то же
время, номера строк не начинаются с нуля, поэтому эту клавишу можно
использовать.

Вы закончили набор какой-либо строки. Нажали ENTER. Программа
ждет ввода номера очередной строки. Вы нажимает 0 и получаете
ключевое слово EDIT (если даже оно и не появится, все равно нуль в
начале строки означает EDIT). Если после EDIT (или нуля) набрать
номер нужной Вам строки и нажать ENTER, эта строка мгновенно будет
помещена в нижнюю часть экрана для последующего редактирования.

Если номер строки не указан, то на редактирование поступит
текущая строка. Дополнительно для упрощения редактирования введена
возможность перемещать курсор по экрану "вверх"/"вниз" в рамках
программной строки. Курсор не может вставать внутри ключевых слов,

а занимает ближайший пробел. Если Вы попытаетесь поднять его выше,
чем вершина строки или опустить ниже нижней строки экрана, он
автоматически "прыгнет" в конец программной строки. Самый простой
способ добавить что-то к концу строки - вызвать EDIT и затем нажать
"курсор вверх".

EDIT строковая переменная или EDIT ;числовая переменная

Клавиша: SHIFT + "5"

EDIT может применяться не только для удобного редактирования
строк, но и для простого изменения программных переменных. Для этих
целей нельзя использовать нуль в начале строки и введена возмож-
ность вызова EDIT нажатием SHIFT + "5" в графическом режиме. Можно
также набрать слово EDIT по буквам в режимах KEYWORDS 3 или 4. Ти-
пичное применение - внесение изменений в строковые переменные, нап-
ример для изменения фамилии, имени, отчества, адреса в массиве дан-
ных, представляющем из себя базу данных.

Такой массив мог быть заполнен, например с помощью INPUT. Если
теперь надо в нем что-то изменить, то это трудоемкая задача для
обычного БЕЙСИКа, а здесь с помощью EDIT а$ (п) Вы получаете
содержимое строки "п" в области редактирования. Рассмотрим пример:
10 LET а$ = "John Brown"
20 EDIT а$
30 PRINT а$
40 LET num=3 6 5.25 3
50 EDIT ;num
60 PRINT num

В строке 50 применен знак ";" для того, чтобы отличить режим
EDIT <числовая переменная> от режима EDIT сномер строки>. Можно
было бы, однако, вместо точки с запятой использовать и запятую, но в
этом случае редактируемая переменная была бы изображена, начиная с
16-ой позиции экрана.

EDIT имеет синтаксис, очень похожий на INPUT. Вы можете ис-
пользовать точку с запятой, запятую, AT, TAB, LINE и строковую
подсказку точно так же, как обычно это делают с оператором INPUT.
Отличие в том, что редактировать можно только одну переменную. Ес-
ли Вы попробуете редактировать несколько, то все прочие, кроме
первой, будут восприняты, как операторы INPUT. Нижеследующий пример
показывает, как можно создавать массивы и редактировать их:
10 DIM а$(10,15)
20 FOR п=1 ТО 10
30 INPUT а$(п)
40 NEXT п

50 PRINT "Редактирование"
60 FOR п=1 ТО 10

70 EDIT ("запись ";п;" ");а$(п)
80 NEXT п

Если переменная, подлежащая редактированию в EDIT не сущест-
вует, то команда полностью эквивалентна INPUT.

ELSE <оператор>

Клавиша: Е

ELSE - один из элементов конструкции IF - THEN. Обычно, если
условие, стоящее после IF несправедливо (ложно), то следующей вы-
полняется строка, стоящая за строкой, содержащей этот IF. Этот
порядок можно изменить. Если IF и THEN содержат еще и ELSE, то в

случае, когда условие не выполняется, управление передается опе-
ратору, стоящему после ELSE. С другой стороны, если условие
справедливо, то строка IF исполняется только до ELSE и затем
управление передается следующей строке (если THEN не передал его в
иное место). Например:

10 INPUT "Задайте число ";х
20 PRINT "Это число равно 1?"
30 PAUSE 50

40 IF Х=1 THEN PRINT "ДА": ELSE PRINT "НЕТ"
50 GO TO 10

Однако, ситуация может быть осложнена, если на одной строке у
Вас есть несколько IF THEN ELSE. Тогда может быть трудным опреде-
лить , что же к чему относится. Приведенные ниже примеры помогут Вам
разобраться.

Если ELSE используется без IF, например, когда ELSE стоит
первым оператором строки, то и ELSE и остальная часть строки
игнорируются.

END PROC

Клавиша: 3

См. также раздел, посвященный процедурам, PROCEDURES; DEF PROC.

Этот оператор отмечает конец процедуры. Благодаря этому ком-
пьютер не будет выполнять ничего, стоящего между DEF PROC и END
PROC, если процедура не была вызвана, он просто перепрыгнет через
нее за END PROC. Во время же исполнения процедуры, END PROC служит
концом ее исполнения. Удаляются локальные переменные (LOCAL)
восстанавливаются исходные значения глобальных (GLOBAL) переменных,
если они есть. Если в процедуру какие-то параметры передавались по
ссылке (перед формальным параметром стояло REF), то текущее значение
формального параметра присваивается фактическому параметру,
задействованному при вызове.

Если формальный параметр не найден, Вы получите сообщение
"Variable not found".

После исполнения процедуры управление передается оператору,
стоящему за вызовом процедуры.

Применение END PROC без соответствующего DEF PROC дает сооб-
щение об ошибке:

W, "Missing DEF PROC".

EXIT IF <условие>

Клавиша: I

См. также DO, LOOP

Этот оператор является элементом конструкции цикла DO-LOOP (см.
соответствующий раздел). EXIT IF используется для того, чтобы выйти
по своему желанию из середины цикла DO-LOOP, если условие

выполняется. После выхода из цикла управление передается оператору,
следующему за LOOP.

Если условие не выполняется, ничего не происходит. Пример:
100 DO

110 PRINT "строка 110"
120 PAUSE 20

130 EXIT IF INKEY$ = " STOP "
140 PRINT "строка 140"
150 PAUSE 20
160 LOOP

170 PRINT "Выход из цикла"

Программа будет работать до тех пор, пока не будет нажата
клавиша "STOP" (SYM.SHIFT + А).

Если в программе опущен оператор LOOP, выдается сообщение об
ошибке: S, "Missing LOOP".

FILL х,у ИЛИ FILL <INK число;> х,у
ИЛИ FILL <PAPER число;> х,у

Клавиша: F

Команда FILL или FILL INK закрашивает область экрана, окра-,
шенную цветом PAPER в цвет INK, начиная с координат х,у.

Команда FILL PAPER наоборот закрашивает область экрана, окра-
шенную цветом INK в цвет PAPER.

Закрашивание происходит от точки с координатами х,у во все
стороны до тех пор, пока не встретятся участки, уже окрашенные в INK
для команд FILL INK и FILL или в PAPER для команды FILL PAPER. Если
исходная точка и ее окрестности уже окрашены в требуемый цвет,
ничего не происходит.

В отличие от обычного БЕЙСИКа параметр цвета после INK или
PAPER может не указываться, в этом случае идет закрашивание текущим
цветом. Например, FILL PAPER; х,у - сработает. Пример:
10 FOR n= 1 ТО 6
20 CLS

30 CIRCLE INK n;128,88,n*10
40 FILL INK n; 128,88
50 NEXT n

Возможно и использование сложных конструкций FILL, таких как:
FILL INK 2; PAPER 1; FLASH l;x,y

В таких случаях первое ключевое слово после FILL указывает на
то, что используется при заполнении (INK или PAPER), а остальные
просто меняют атрибуты заполняемой области.

Поскольку, как Вы знаете, в пределах одного знакоместа невоз-
можно использование более двух цветов одновременно, техника работы с
цветом должна быть очень хорошо продуманной. Очень легко получить
неприемлемый результат, особенно в тех местах, где контактируют два
цвета INK. Обычно это обходят за счет того, что стык областей с
разными цветами проводят по границам знакомест.
10 LET х=128, у=88, rad=70
20 LET g= (SQR 2)*rad/2
30 CIRCLE x,у,rad
40 PLOT x,у: DRAW -g,-g
50 PLOT x,у: DRAW g,-g
60 PLOT x,у: DRAW 0,rad
70 FILL INK 2; x-5,y
80 FILL INK 4;x+5,у

FILL работает на областях любой геометрической формы. Для
примера попробуйте заполнить весь экран, за исключением того, что

находится внутри букв "Q".

PRINT STRINGS (7 04,"Q"): FILL 0,0

Метод работает быстро, если есть большое количество доступной
свободной памяти. Если Вы заполняете большую область, например весь
экран, то сможете увидеть очевидные паузы в те моменты, когда
компьютер проверяет не забыл ли он окрасить какие-то участки. Можно
рекомендовать делить сложную область на несколько более простых * и
заполнять их порознь.

Можно установить, какое количество пикселов было закрашено по
последней команде FILL. Для этого служит функция FILLED().

Прервать заполнение можно в любое время нажатием BREAK.

GET числовая переменная или GET строковая переменная

Клавиша: G

Это то же самое, что GET от клавиатуры. Как и INKEYS это спо-
соб чтения клавиатуры без использования ENTER. Отличие от INKEY$ в
том, что GET ждет нажатия клавиши. При использовании со строковой
переменной, GET вводит один символ:

10 GET а$: PRINT а$;: GO ТО 10
Работа этой строки похожа на работу пишущей машинки. Обычным
путем Вы можете переключаться на печать прописными и строчными
буквами. Курсор можно перемещать в нужном направлении, работает
стирание символов. ENTER дает переход к началу следующей строки.
Более изощренная версия выглядит так:

10 GET а$

20 PRINT CHR$ 8; " CHR$ 8; а$; INVERSE 1; "В"; INVERSE 0;

30 GO TO 10

Может быть, Вы захотите изменить размер символов, воспользо-
вавшись командой CSIZE.

Если GET применяется с числовой переменной, то при нажатии
клавиш от "1" до "9" вводится число от 1 до 9. При нажатии "А" или
"а" вводится число 10, при нажатии "В" или "Ь" вводится число 11 и
т.д. Это очень удобно для организации разного рода экранных меню при
написании меню-управляемых программ (см. также ON).

GET строковая переменная, х,у <ширина, длинах;тип>

Это как бы GET с экрана. Применяется для того, чтобы какой-то
прямоугольный блок экрана присвоить некоей строковой переменной и
впоследствии печатать его на экране с помощью PRINT или PLOT в тех
позициях экрана, в каких захотите. (Если Вы будете применять PRINT,
то необходимо учесть, что установка CSIZE не должна быть нулевой.
Так, например, CSIZE 8 даст печать сохраненного в строковой
переменной изображения в натуральную величину.)

Размер задается в знакоместах, а координаты - в пикселах. В
простейшем случае за именем строковой переменной следуют коорди-
наты левого верхнего угла.

10 PRINT "QWE"

20 GET а$,4,175

30 PLOT 100, 100; а$

Т.к. размеры снимаемого с экрана блока не указаны, то по
умолчанию предполагается, что длина и ширина равны по одному
знакоместу.

В этом примере на экране будет напечатано "QWE", а затем правая
половина буквы Q и левая половина буквы W будут сохранены в пере-
менной а$. С помощью усовершенствованной команды БЕТА-БЕЙСИКа PLOT

Вы сможете напечатать полученное изображение в любом месте экрана
(см. PLOT), причем сделать это можно с разным увеличением (см.
CSIZE).

Здесь есть один нюанс. Как может строковая переменная содер-
жать часть графики экрана? Если Вам это не интересно, пропустите
несколько следующих абзацев.

Поставим маленький эксперимент. Узнаем длину строковой пе-
ременной а$. Это можно сделать PRINT LEN а$. Вы увидите, что длина
этой переменной равна 9 символам. Первый содержит управляющий код,
который говорит о том, что в последующих 8 символах идет графический
образ. Если Вы сняли блок большего размера, а не одно знакоместо, то
в него вставлены там, где это надо, коды управления курсором (см.
раздел "УПРАВЛЯЮЩИЕ КОДЫ").

Нижеприведенный пример изображает на экране блок размером 3X3
знакоместа, запоминает его в переменной а$ и затем печатает в
случайно выбранных позициях экрана, причем делает это гораздо бы-
стрее, чем это можно было бы сделать повторным его перестроением.
10 CIRCLE 10,165,10
20 CIRCLE 13,165,5
30 FILL 5,165
40 GET a$,0,175,3,3
50 PLOT RND*2 30, RND*150 + 20;a$
60 GO TO 50

Если Вы используете OVER 0, то увидите, что поля рисунка затрут
цветом PAPER то, что лежит под ними. Для получения других ре-
зультатов попробуйте использовать OVER 1 или OVER 2 и запустите
пример еще раз. (OVER 2 это режим не стандартного БЕЙСИКа, а
БЕТА-БЕЙСИКа, позволяющий Вам рисовать и без затирания и без
инвертирования того, что лежит под Вашим изображением.)

Если Вы хотите нарисовать много окружностей одного размера, то
гораздо быстрее работают GET и PLOT, чем CIRCLE. Попробуйте уда-
лить строки 20 и 30 и введите OVER 2 (или используйте в строке 50
PLOT OVER 2; RND * ...).

Эти рассмотренные примеры относятся к нулевому типу. Если Вы не
указываете при команде GET параметр <тип>, то предполагается, что он
равен нулю. Нулевой тип команды GET - "бесцветный". То есть рисунок
снимается с экрана без цветовых атрибутов и воспроизводится командой
PLOT в текущих установленных цветах или в локальных цветах,
указанных в команде PLOT или PRINT.

Вы можете использовать команду GET и другого типа. Это тип-1.
Для его использования после команды поставьте точку с запятой и
поставьте 1. В этом случае изображение снимается с экрана в
строковую переменную вместе с цветовыми атрибутами. Точно так же
оно будет и изображено по команде PLOT или PRINT. Принципиально
важно, что если графический блок, с которым Вы работаете, имеет
несколько цветов, то все их можно будет воспроизвести только при
работе с первым типом GET. Ни глобальные, ни локальные установки
цвета не повлияют. Изображение будет воспроизведено так, как было
снято.

10 PRINT INK 2; "ABC"
20 PRINT: PRINT INK 4; "DEF"
30 GET s$,0,175,3,3;l
40 PLOT 100,100;s$

Как обычно, Вы не должны забывать, что для "Спектрума" в
пределах одного знакоместа возможны только 2 цвета (INK и PAPER),
поэтому тщательно планируйте, куда Вы помещаете изображение, снятое
по GET вместе с цветами. При неаккуратной печати его на экране, Вам
не избежать проблем с атрибутами ("клэшинг" атрибутов).

JOIN <номер строки>

Клавиша: SHIFT + 6 (то же, что и "&")

См. также SPLIT.

Объединяются вместе две строки. Первая строка - номер которой
задан (если не задан - то та строка, на которой стоит курсор) и
следующая за ней строка.

Совместно используя SPLIT и JOIN Вы получаете возможность
"отрезать" часть строки и "пристегнуть" ее к другой.

JOIN строковый массив или числовой массив.

Клавиша: SHIFT + 6 (то же, что и "&")

См. также главу "Обработка данных", с. 8.

Эта команда позволяет переместить часть символьной строки или
массива в любую позицию другой символьной строки или числового
массива. С командой JOIN тесно связана еще команда COPY. Пос-
кольку они очень похожи друг на друга, то и обсуждаться здесь будут
совместно. Разница их действия состоит в том, что если команда JOIN
перемещает данные, то команда COPY - копирует их. Разница очевидна.
При копировании исходный материал не уничтожается, а при перемещении
он пропадает.

а) Работа с символьными массивами.

Образец синтаксиса: JOIN а$ <n ТО m> ТО b$ <к>
COPY а$ <n ТО ш> ТО Ь$ <к>

Здесь: а$ - исходная символьная строка;
Ь$ - строка назначения;
п,ш - параметры выделения
подстроки из строки;
к - позиция в строке назначения.

Пример: 10 LET а$="12345"

2 0 LET b$ = "ABCDEFG"
30 JOIN a$ TO b$
40 PRINT b$:

REM печатается ABCDEFG12 345
50 PRINT a$:

REM: a$ не найдено.

Поскольку мы применяли JOIN и не указывали параметров п,ш, то
вся переменная а$ целиком перешла в Ь$ и печать а$ в строке 50 ни-
чего не даст. Если же теперь Вы в строке 30 замените JOIN на COPY,
то сможете убедиться в строке 50, что а$ не пострадало.

Вариант применения COPY, тем самым, похож на то же, что мы
имеем просто работая с LET:

LET b$ = b$ + a$

Но зато и JOIN и COPY работает даже тогда, когда а$ и Ь$ такие
огромные, что заполняют всю память компьютера, a LET в этом случае
работать не сможет. Например LET а$ = а$ + "х" не сможет работать,
если а$ длиннее, чем одна треть свободной памяти компьютера.

С помощью параметров выделения подстроки из строки Вы можете
работать не только со строками, но и с подстроками. Их можно
вставлять в строку назначения в заданное место, указав параметр
позиции вставки.

Если не заданы параметры подстроки, то принимается по умол-
чанию вся строка.

Если не задан параметр позиции вставки в строку назначения, то

вставка выполняется после последней позиции.

Попробуйте поэкспериментировать с вышеприведенным примером,
заменяя строку 30:

30 JOIN а$ (2) ТО Ь$ 30 COPY а$ ТО Ь$(3)

REM: а$ = "1345", b$ = "ABCDEFG2" REM: а$="12345", b$="АВ12 34CDEFG"

30 JOIN а$ (3 ТО) ТО Ь$ 30 JOIN а$(2ТОЗ) ТО b$(LEl^ b$ + l)

REM: а$ = "12", b$ =мABCDEFG3 45" REM: а$="145", b$ = "ABCDEFG23"
А теперь рассмотрим конкретный практический пример. Вам надо
просмотреть символьную строку t$ и всякий раз, как в ней встретит-
ся слово "Spectrum" заменить его на "ZX". Для этого можно исполь-
зовать COPY, DELETE и INSTRING.

10 LET t$="The Spectrum is a versatile computer, but Spectrum
owners may feel it should have better editing."

20 PRINT t$

30 LET n$="ZX", o$="Spectrum"
40 LET p=l

50 LET p=INSTRING (p,t$,o$)
60 IF p<>0 THEN

DELETE t$( p TO p+LEN o$-l)
COPY n$ TO t$(p)
GO TO 50
70 PRINT t$

b) работа с символьными массивами.
Образец синтаксиса: JOIN a <n ТО m> ТО b <k>
COPY a <n ТО т> ТО b <k>
Здесь: а - исходный массив;

b - массив назначения;

п,т - параметры выделения подмассива из массива;
к - позиция в массиве назначения.
Массивы - это удобный метод работы с большим количеством дан-
ных, но обычно они имеют много серьезных ограничений. Наверное
самое существенное из них - то, что массивы имеют фиксированный
размер, объявленный в момент назначения массива. Вы можете нера-
ционально расходовать память, назначив (DIM) массив больше, чем Вам
на самом деле необходимо, и Вам может не хватать памяти, например,
для создания еще одного массива.

БЕТА-БЕЙСИК позволяет более гибко манипулировать с массивами.
Команды JOIN и COPY позволяют перемещать или копировать весь массив
или его часть. Пространство для нового материала создается внутри
назначенного массива, поэтому ничего не будет перезатерто. Можно
обслуживать не только одномерные, но и двумерные массивы, а этого
бывает достаточно для большинства приложений. Одномерные массивы
трактуются, как двумерные, имеющие вторую размерность, равную
единице. Нет никакой необходимость, чтобы совпадали размерности
исходного массива и массива назначения.

Нет также никакой необходимости, чтобы оба массива имели строго
одинаковое количество рядов и йх длину. Когда Вы работаете со
строковыми массивами, строки исходного массива "подрезаются" в
соответствии с длиной строк массива назначения, если они длиннее
или, наоборот, "подбиваются пробелами", если они короче. Число- вые
массивы обрабатываются так же, за исключением того, что вместо
пробелов используются нули.

Предположим, что Вы имеете массив а$(100,30) и он полностью
заполнен. Чтобы добавить к нему еще 20 символьных строк, Вы мо-
жете действовать например так:

DIM b$(20,30): JOIN b$ TO a$
Поскольку мы использовали JOIN, все строки будут реально удалены

из массива b$ и помещены в а$, а не просто скопированы, как это было
бы при применении COPY. Поскольку никаких параметров вырезки после
имени исходного массива не было указано, то все его символьные
строки будут перемещены и массив перестанет существовать. При
использовании COPY он остался бы нетронутым.

Позиция вставки в массив назначения не была указана. По умол-
чанию будет принято, что это позиция номер 101, то есть следующая за
последней. Первая символьная строка из массива Ь$ станет сто первой
в массиве а$, а последняя станет строкой номер 120.

Т.к. в БЕТА-БЕЙСИКе массивы могут часто менять свой размер, то
Вам может потребоваться неоднократное применение функции LENGTH
чтобы определить размер массива. В вышеприведенном примере LENGTH
(1,"а$") дало бы величину 120.

Если Вы примените DIM b$(20,3) или DIM b$ (20,50), а затем сде-
лаете JOIN b$ ТО а$, то в результате строки массива Ь$ будут
"подбиты" пробелами или, наоборот "подрезаны" так, чтобы они укла-
дывались в строки массива а$, имеющие 30-символьную длину.

Если у Вас уже есть готовый массив и Вы решите, что в нем
надо сделать строки подлиннее, Вы можете это сделать, задав через
DIM массив с желаемой длиной только с одним элементом, а потом
переместить (JOIN) свой массив в него:

DIM b$(1,40): JOIN а$ ТО b$

Единственный недостаток, к сожалению, состоит в том, что теперь
все наши данные будут находиться в Ь$, а а$ не будет существовать.
Чтобы восстановить его, можно сделать обратный ход:

DIM а$(1,40): JOIN b$ ТО а$

До сих пор мы имели дело с полными массивами, но и JOIN и COPY
могут работать много гибче. Вы можете указать какие символьные
строки или какие ряды исходного числового массива Вы хотите
использовать с помощью выделяющих параметров, а также позицию, в
которую произойдет вставка.

Следующие примеры написаны для JOIN, но соответственно они
могут работать и с COPY.

JOIN а$ ТО Ь$(4)

- введет весь массив а$ в Ь$ таким образом, что первая символьная
строка будет вставлена после четвертой символьной строки в
увеличенном массиве Ь$.

JOIN а$(2 ТО 5) ТО b$(1)

- переместит 4 символьных строки из а$ в начало массива Ь$. После
этого массив а$ станет на четыре строки короче, чем был, а массив Ь$
станет на четыре строки длиннее.

JOIN а$(10) ТО Ь$
переместит десятую символьную строку из а$ в конец Ь$.

с) числовые массивы.

Одномерные и двумерные числовые массивы обрабатываются спосо-
бом, похожим на символьные массивы. После имени массива должны
обязательно стоять скобки, чтобы отличать массивы от простых пере-
менных .

Нижеприведенный пример создает два массива, а затем объединяет
их между собой.

10 DIM а(8)
20 FOR п=1 ТО 8
30 LET а(п)=п
40 NEXT п
50 DIM b(5)
60 FOR n=l TO 5
70 LET b(n)=n*10
80 NEXT П

90 JOIN b() TO a()

100 FOR n=l TO LENGTH (l,"a(M)
110 PRINT a(n)

120 NEXT n

130 REM печать 1 2 3 4 5 6 7 8 10 20 30 40 50

140 REM b() - не существует

KEYIN строковая переменная

Клавиша: SHIFT + 4

KEYIN вводит строковую переменную так, как если бы Вы впеча-
тали ее с клавиатуры. Таким образом, есть возможность сделать
программу самосоздающейся, хотя это и выходит за пределы, рас-
сматриваемые в данной инструкции. Можно рассмотреть пример автома-
тического создания строк DATA.

10 LET а$ = "100 DATA"

20 FOR n=0 TO 9

30 LET a$ = a$ +STR$ (PEEK N)
+ " , »

40 NEXT N

50 LET A$ = A$ (1 TO LEN A$ -1):
REM удаление последней запятой

60 KEYIN A$

После запуска данного фрагмента Вы увидите, что к программе
добавилась еще одна строка.

В режимах KEYWORDS 3 и 4 ключевые слова, набранные по симво-
лам, будут преобразованы в односимвольные токены.

KEYWORDS ЧИСЛО.

Клавиша: 8

Оператор KEYWORDS управляет тем, как вводятся и как изобража-
ются на экране ключевые слова стандартного БЕЙСИКА, БЕТА-БЕЙСИКа и
символов графики пользователя (UDG).

KEYWORDS 0.

В этом режиме за клавишами в графическом режиме (курсор G)
закреплены символы графики пользователя, как в стандартном БЕЙСИКе
Вашего "Спектрума".

KEYWORDS 1.

В этом режиме за клавишами в графическом режиме закреплены
ключевые слова БЕТА-БЕЙСИКА.

В исходном состоянии после загрузки система находится в режиме
KEYWORDS 1. А если Вам надо воспользоваться символами графики
пользователя, дайте команду KEYWORDS 0.

Выбранный Вами режим KEYWORDS 1 или KEYWORDS 0 не влияет на то,
как вводятся ключевые слова - по буквам или как токены, целиком,
т.е. выбор режима 0 или 1 не влияет на установки режимов KEYWORDS
2,3 и 4. После загрузки компьютер находится в состоянии KEYWORDS 3.
Текущий режим ввода сохраняется вместе с Вашей программой, если Вы
отгружаете вместе с ней код (CODE) самого БЕТА-БЕЙСИКА.

KEYWORDS 2.

В этом режиме все ключевые слова вводятся одним нажатием
клавиш, при необходимости с одновременным нажатием шифтов. Ключе-
вые слова стандартного БЕЙСИКа берутся, как обычно. Ключевые слова

БЕТА-БЕЙСИКа вводятся в графическом режиме (курсор G), а функции
БЕТА-БЕЙСИКа вводятся в порядке FN, буква, знак "$" или "(".

KEYWORDS 3.

Этот режим - тот же, что и KEYWORDS 2, за исключением того, что
вводимая строка, прежде чем пойти в память компьютера, сначала
проверяется на наличие в ней набранных по буквам ключевых слов и,
если они найдены, происходит их замена на токены ключевых слов.
По-видимому, это самый удобный режим, т.к. в нем можно работать и с
вводом ключевых слов одним нажатием клавиш и со вводом их по буквам.
Если нужно выйти из курсора "К", Вы можете использовать ведущий
пробел.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
IS-DOS - програмно-аппаратный комплекс поддержки IDE HDD для ZX Spectrum.
Статья - 2035.
Пeрвыe рyлeзы нoвoй пaти Дзeржинcкa - 21-22 aвгycтa 1999 гoдa в гoрoдe Дзeржинcкe бyдeт прoвoдитьcя party, цeликom и пoлнocтью пocвящeннoe лyчшemy в mирe кomпьютeрy, a иmeннo ZХ-Spectrum.
Виртуальный Спекки - Эмуляторы ZX-SPECTRUM на PC: Где взять последнии версии FAQ по эмуляции ZX-Spectrum, Какие эмуляторы наиболее удобны - эмулятор Лунтера, UKV v1.2, Шалаева. Что за файлы с расширением *.$b,*.$c,*.$s,*.$z,*.$w ? Как прочесть формат "hobeta". Как и в каком эмуляторе можно работать в iS-DOS. Конвертация файлов .z80 в .$ и обратно. Файлы с расширением .fdi. Проблемы с эмулятором UKV. Как получить чистый файл образа диска (.trd) для эмулятора Шалаева. Существует ли Российский ZX-ориентированный FTP или WWW сервер? Hobeta отказывается читать/писать диски 3.5" - что делать?
Будущее Спектрума - О необязательности развития аппаратного обеспечения.

В этот день...   23 ноября