BETA BASIC
Продолжение. (Начало см. на стр. 3).
Ознакомившись с общими чертами языка программирования БЕТА-БЕЙСИК 3.0, мы теперь можем перейти к подробному рассмотрению его команд и функций.
РАЗДЕЛ 2. КОМАНДЫ
Команды приведены в алфавитном порядке.
1. ALTER <атрибуты> ТО атрибуты
Ключевое слово расположено на клавише "А". Команда ALTER позволяет выполнять значительные манипуляции с атрибутами экрана (INK, PAPER, BRIGHT и FLASH) для каждого знакоместа. В своей простейшей форме команда ALTER может изменять атрибуты по всему экрану, не очищая его.
Пример.
100 PRINT AT 10,10: "TEST": PAUSE 50: ALTER TO PAPER 1
Эта строка изменит цвет PAPER всех символов на экране и сделает его синим. Можно провести по всему экрану установку и какой-либо комбинации атрибутов. ALTER TO 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 I=1 ТО 5 |
|
|
|
120 |
FOR n=1 ТО 16 |
|
|
|
130 |
PRINT INK a; PAPER |
b |
"ХХХХ"; |
PAPER a; INK b; "OOOO |
140 |
NEXT n |
|
|
|
150 |
LET c=a, a=b, b=c |
|
|
|
160 |
NEXT I |
|
|
|
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 |
|
|
|
2. ALTER <ссылка> ТО ссылка
Ключевое слово расположено на клавише "А". Это принципиально иная разновидность команды ALTER. По этой команде программа ищет появление первого значения и заменяет его на второе. Ссылкой здесь может быть имя переменной, число или
строка символов. Например:
ALTER а$ ТО b$
- заменит переменную а$ на b$;
ALTER count TO с
- заменит переменную count на переменную c, но не затронет переменные accounts, counter и т. п.
ALTER 1 TO 23
- заменит число 1 на число 23. При этом, что очень важно, изменится также и "невидимое" пятибайтное представление числа, т.е. не только на экране вместо единицы будет изображено число 23, но и в расчетах тоже будет участвовать число 23.
Однако:
ALTER 1 TO "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" TO ""
Вы, наверное знаете (а в "ZX-РЕВЮ-91" мы этот вопрос обсуждали) , что числа требуют большого расхода памяти в БЕЙСИКЕ по сравнению с переменными и выражениями. Это происходит вследствие того, что после символьного выражения числа следует еще его пятибайтный аналог. И нередко в программах производят подмену, например вместо 1 употребляют SGN PI (экономятся 5 байтов) или, скажем вместо любого числа применяют VAL "число" (экономятся 3 байта). Это можно легко сделать с помощью ALTER. Например, для чисел от 1 до 100.
1 LET free = MEM()
2 FOR n=1 TO 100
3 ALTER (n) TO "VAL" + CHR$ 34 + STR$ n + CHR$ 34
4 NEXT n
5 PRINT "saved "; MEM()+ 28 - free;" bytes"
Программа напечатает Вам сколько байтов ей удалось сэкономить. Переменная n в строке 5 стоит в скобках для того, чтобы по команде ALTER изменялось не имя переменной "n", а то число, которое она хранит. Номера строк взяты минимальными - от 1 до 5 и это сделано специально. Дело в том, что при такой работе ALTER возможны сокращения расхода памяти в БЕЙСИК-области и все строки могут "поехать" вниз в адресах памяти, а это недопустимо для циклов FOR... NEXT. Так что нельзя допускать, чтобы до этого цикла в программе могли бы быть какие то строки, способные измениться по ALTER.
Число "28" в строке 5 введено для того, чтобы компенсировать те затраты памяти, которые потребовались на создание нужных в этой процедуре переменных free и n, т.е. чтобы эксперимент был чистым.
И последнее замечание. Будьте очень осторожны при использовании команды ALTER в данной форме. Неаккуратной работой Вы можете легко внести в программу неисправимые изменения. Например, если Вы измените все переменные "apple" на "а", а потом сообразите, что "а" уже использовалась в программе, то будет поздно. Вы не сможете сделать обратный ход и снова поменять "а" на "apple", поскольку при этом изменятся и те переменные "а", которые и должны быть "а". Можно прежде, чем делать такие замены, убедиться, что "а" в программе не использовалась - например командами REF или LIST REF (см. далее).
3. AUTO <номер строки> <,шаг>
Клавиша - "6".
AUTO - включает режим автоматической нумерации строк, что делает более удобным написание программ. Если значение шага не указано, предполагается, что шаг равен 10. Если при этом не указан и номер строки, с которого начнется автонумерация, то предполагается номер текущей строки (строки, в которой установлен программный курсор) плюс десять.
Режим AUTO отключается, когда номер строки менее 10 или более 9983 или при выдаче любого системного сообщения. Обычно принято выходить из AUTO нажатием и удержанием BREAK продолжительностью более секунды.
Если, находясь в режиме AUTO, Вы хотите выпустить некоторый блок строк, сотрите предложенный программой номер строки и впишите вместо него свой собственный. Тогда следующим номером, предложенным Вам, будет тот, что Вы ввели, плюс величина шага.
Примеры.
AUTO - от текущей строки + 10 с шагом через 10;
AUTO 100 - от строки с номером 100 и с шагом через 10;
AUTO 100,5 - от строки с номером 100 и с шагом через 5.
4. 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-го рода и они должны быть включены постоянно.
5. CLEAR число.
Эта команда должна представлять большой интерес для тех, кто работает с машинным кодом. CLEAR с числом, меньшим чем 767 перемещает указатель 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)
6. 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 "xyz10"
Здесь XYZ будут восприняты как символы - разделители и проигнорированы, а "10" -как установка первых двух разрядов. В результате получится: "10:00:00". Символ "а", о котором мы упоминали, как об исключении, служит для установки таймера: "A06:20" -установит будильник на 6 часов 20 минут. По достижении этого времени включится звуковой сигнал, если его режим был включен командой CLOCK 2,3,6 или 7.
Можно сделать и так, что в данное время программа выполнит переход GOSUB к назначенной подпрограмме если режим был включен командой CLOCK 4,5,6 или 7. Правда такой переход возможен только в состоянии работающей программы. Если Вы в этот момент выполняете ввод или редактирование. Вашу работу прерывать компьютер не будет.
Подпрограмма, которая вызывается, может быть любой сложности и размера. Это может быть: 10 GO ТО 10 - а может быть текстовой редактор или игра. По достижении заданного времени компьютер закончит ту строку, с которой он работает, а потом только сделает переход. Завершение строки может занять определенное время, особенно если это INPUT или PAUSE.
Выбор и назначение подпрограммы, к которой выполняется переход GOSUB делается тоже оператором CLOCK число.
Здесь "число" - это номер строки, к которой делается переход. Это число должно быть в интервале от 8 до 9999. Нижний предел 8 назначен, чтобы отличать это назначение от выбора режима работы, в котором параметр может быть от 0 до 7.
Другой метод ввода подпрограммы для перехода по таймеру - прямой: CLOCK: оператор: оператор:... : RETURN
В подпрограмме обработки перехода по таймеру нельзя использовать те же имена переменных, что и в главной программе. Если Вы не хотите, чтобы их содержимое изменялось, Вы можете оформить эту подпрограмму как процедуру и назначить используемые в ней параметры как LOCAL. Если Вы хотите, чтобы эта подпрограмма выполняла сохранение данных, а в главной программе возможно использование RUN или CLEAR, то Вам надо сохранять эти данные посредством POKE в соответствующих областях памяти, неповреждаемых по RUN или CLEAR.
Возможные применения подпрограммы перехода по таймеру могут быть такими:
- Проигрывание музыкальной мелодии в заданное время (разновидность будильника);
- Перестроение экрана;
- Бой часов (чтобы узнать при этом сколько сейчас времени, т.е. сколько раз должны пробить ваши часы можно воспользоваться функцией TIME$ - см. далее)
Вы можете даже изменять масштаб времени с помощью внутренней переменной БЕТА-БЕЙСИКа, размещённой в адресе 56866. Исходно там установлен режим хода 1/50 секунды на каждый ход.
POKE 56866,58 сделает Вам режим 100 секунд в минуте, а POKE 56866,54 - вернет к нормальному режиму.
Специалисты в электронике могут организовать регулярный (скажем, каждый час или каждую минуту) прием данных от внешних устройств, например:
8999 STOP
9000 PRINT "Процедура включена"
9010 LET pointer=DPEEK (USR "a"): POKE pointer,IN 127
9020 LET pointer = pointer +1: IF pointer>65535 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+1, mins = 0
9060 CLOCK "a" USING$ ("00",hours) + USING$ ("00",mins): RETURN
He запускайте эту программу через RUN, а вместо этого дайте прямую команду: DPOKE USR "a", USR "а" +2 : CLOCK 9000: CLOCK 5
Эта прямая команда проинициализирует указатель (pointer), расположенный в адресах USR "а" и USR "а" + 1. Строка 9000 назначена как строка перехода по таймеру. Команда CLOCK 5 делает этот переход возможным.
Для проверки задайте время срабатывания таймера: CLOCK "AXXXX" - ХХХХ -установка времени.
Теперь запускайте некоторую программу через RUN. Подпрограмма CLOCK будет активироваться каждую минуту и считывать данные из внешнего порта 127.
Прочитанные данные сохраняются в области графики пользователя UDG в адресах, на которые указывает указатель (pointer). Указатель постоянно наращивается, а при достижении верхнего предела физической памяти 65535 возвращается в исходное положение. Если у Вас нет внешних устройств, подключенных к внешним портам, то можете организовать работу так, чтобы какое-нибудь другое полезное дело с помощью этой подпрограммы выполнялось через регулярные интервалы времени.
Строки 9040 - 9060 переустанавливают таймер на время, отстоящее на 1 минуту от текущего времени, потом выполняется возврат в главную программу.
7. CLS <номер окна>
Просто команда CLS без указания параметра выполняет очистку текущего окна. (Более подробно см. WINDOW). CLS с параметром, выполняет очистку окна с номером, равным параметру (если конечно это окно было задано). Если же Вы забыли определить это окно, то получите сообщение об ошибке:
"Invalid I/O device". (Неверно задано устройство ввода/вывода)
Команда CLS 0 - это то же самое, что и команда CLS стандартного БЕЙСИКа, т.е. она выполняет очистку экрана вне зависимости от того, какое окно в настоящий момент является активным.
8. CONTROL CODES (управляющие коды)
Управляющие коды - это специальные символы, употребляемые в командах печати PRINT и PLOT, но сами по себе они не печатаются, а служат для того, чтобы указывать где что печатать. Так что в отличие от обычных символов их нельзя увидеть - они не имеют графического изображения.
В БЕТА БЕЙСИКе есть две группы управляющих кодов. Первая служит для управления курсором и позицией печати по командам PRINT и PLOT, а вторая применяется при управлении специальными блоками экрана, обрабатываемыми по команде GET (см. ниже).
Коды управления курсором.
Коды |
Наименование |
Область действия |
CHR$ 2 |
Курсор влево |
экран |
CHR$ 3 |
Курсор вправо |
экран |
CHR$ 4 |
Курсор вниз |
экран |
CHR$ 5 |
Курсор вверх |
экран |
CHR$ 8 |
Курсор влево |
окно |
CHR$ 9 |
Курсор вправо |
окно |
CHR$ 10 |
Курсор вниз |
окно |
CHR$ 11 |
Курсор вверх |
окно |
CHR$ 12 |
DELETE |
окно |
CHR$ 15 |
Добавочный ENTER |
окно |
Разница между кодами с номерами 2...5 и 8...11 в том, что коды, предназначенные для работы в окне, не могут вывести курсор (позицию печати) за пределы текущего окна. Это бывает очень удобным во многих случаях, например при создании текстового редактора.
Коды 2...5 не имеют этого ограничения и применяются, как правило, с командой PLOT. Фактически же PLOT сама конвертирует коды 8...11 в коды 2...5 во время своей работы.
В стандартном БЕЙСИКЕ обработка кода CHR$ 8 имеет ошибку. Так, невозможно перемещением курсора влево поднять его с нижележащих строк на вышележащие, а если он находится на самой верхней строке, то таким перемещением можно его вообще вывести за пределы экрана и войти в распечатку программы.
Здесь эта ошибка исправлена.
Код CHR$ 9 в стандартном БЕЙСИКе тоже обрабатывается с ошибкой и здесь она тоже исправлена.
Стандартный БЕЙСИК распечатывает коды 10, 11, 12 в виде вопросительного знака,
что не очень полезно. Здесь они работают так, как это должно бы быть.
В качестве примера рассмотрим, как управляющие коды, включенные в текстовые строки, позволяют выводить на экран сложные формы через PRINT или PLOT.
10 LET a$ = "1235" + CHR$ 8 + CHR$ 10 + "5" + CHR$ 8 + CHR$ 10 +"678" + CHR$ 8 + CHR$ 11 + "9"
20 PRINT AT 10,10; a$ 30 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$ 0 или CHR$ 1, вставляет между сериями символы управления курсором и, тем самым, представляет область экрана в виде длинной строки символов, которую и запоминает в какой-то переменной.
Если хотите поэкспериментировать с управляющими кодами, создайте строку и напечатайте ее сразу всю целиком, а не по одному символу. 10 CSIZE 8
20 LET a$ = 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$
9. COPY строка COPY массив
Команда имеет очень близкое отношение к команде JOIN. Подробности см. в команде
JOIN.
10. CSIZE ширина <, высота>
Клавиша: SHIFT + 8.
CSIZE управляет размером символов при использовании операторов PLOT, PRINT и LIST. Аналогично INK и PAPER эта команда имеет глобальный характер, когда используется в качестве самостоятельного оператора и распространяется только на один оператор, если стоит в качестве элемента в списке PRINT.
Ширина и высота задаются в единицах пикселей. Если Вы не задаете параметр высоты, то по умолчанию высота принимается равной ширине. Нижеприведенный пример показывает символы, имеющие размеры в четыре раза больше, чем стандартные (CSIZE 32). Но Вы можете сделать и символы во весь экран - CSIZE 255,176. Правда, для очень больших символов придется нажимать BREAK, чтобы остановить автоматический скроллинг экрана.
10 FOR n=8 ТО 32 STEP 8 20 CSIZE n 30 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,1 используют стандартные символы экономят на пробелах между ними. Если Вам надо иметь 40 символов строке, делайте так:
OVER 1: CSIZE 6,8
После этого, с помощью команды WINDOW уменьшите размер экрана по ширине до 240 пикселей и у Вас будут точно 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 могут исчезать отдельные пиксели, но иногда для регулярных рисунков результат получается неплохим.
10. DEFAULT переменная = значение <,переменная = значение>...
Клавиша: SHIFT + 2.
DEFAULT в принципе работает, как и LET, но в отличие от него не изменяет значение переменной, если она уже существует.
10 LET а=10
20 DEFAULT a=20
30 DEFAULT b=30
40 PRINT а^
Строка 40 напечатает Вам, что a=10, поскольку DEFAULT в строке 20 будет проигнорирован, а b=30, т.к. DEFAULT в строке 30 сработает.
DEFAULT следует понимать как выражение принять значение, если иное не задано. Как и за LET, в БЕТА-БЕЙСИКе за DEFAULT могут идти множественные определения, причем обрабатываются они независимо, одно за другим.
100 DEFAULT a$="abedef",zx=123,q=0
Этот оператор можно использовать в программе где угодно, но наиболее широкое применение он имеет в определениях процедур для того, чтобы пользователь мог опускать те или иные параметры при вызове процедуры.
11. DEFAULT = устройство
Эта разновидность оператора DEFAULT позволяет задавать по умолчанию устройство ввода/вывода. Она рассчитана на работу с ИНТЕРФЕЙСОМ-1.
Команда позволяет использовать обычные команды SAVE/LOAD/MERGE/VERIFY при работе с микродрайвом, локальной сетью, глобальной сетью через порт RS232.
То есть, благодаря ей, упрощается синтаксис команд в работе с этими видами устройств.
В состоянии поставки БЕТА-БЕЙСИК имеет установку "t", то есть на магнитофон. Примеры прочих установок:
DEFAULT = m Микродрайв 1
DEFAULT = M1 Микродрайв 1
DEFAULT = M2 Микродрайв 2
DEFAULT = n5 Локальная сеть, станция N5
DEFAULT = B Порт RS232, канал "В"
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 x=2: DEFAULT mx
Но нельзя использовать для этой цели строковую переменную.
Даже если в качестве устройства ввода/вывода назначен магнитофон, такие команды как SAVE 1; "abc" или LOAD n,"prog" будут работать с микродрайвом, поскольку заданный параметр номера однозначно указывает на то, что речь не идет о магнитофоне. Текущие параметры установки устройства будут выгружены вместе с кодом БЕТА-БЕЙСИКа, если Вы захотите выгрузить свою программу и БЕТА-БЕЙСИК вместе с ней.
Примечание: БЕТА-БЕЙСИК разрешает в командах, связанных с микродрайвом использовать запятую "," вместо точки с запятой ";".
12. DEF KEY односимвольная строка; строка
или
DEF KEY односимвольная строка; оператор: оператор: ...
Клавиша: 1 (та же, что и DEF FN).
См.также LIST DEF KEY
БЕТА-БЕЙСИК позволяет присвоить любой цифровой или буквенной клавише значение символьной строки или программных строк. При этом символы могут вводиться в компьютер, а могут оставаться в нижней части экрана (в области редактирования) до нажатия ENTER.
Последний случай реализуется следующим образом: надо сделать так, чтобы последним символом Вашей строки стояло двоеточие ":" или чтобы последним оператором программной строки стоял оператор ":". Попробуйте: DEF KEY "1"; "HELLO: "
Теперь нажмите совместно SYMBOL SHIFT и SPACE. Курсор изменится и станет мигающей звездочкой. Если Вы теперь нажмете клавишу "1", в нижней части экрана появится надпись HELLO. Поскольку никакие другие клавиши не были переопределены, при их нажатии Вы получите их нормальные значения. DEF KEY "a":PRINT "Goodbye"
В этом примере часть программной строки, следующая после DEF KEY "а", присваивается клавише "а" (или "А", что одно и то же). Эта строка не исполняется после ее набора. После же того, как Вы нажмете SYMB SHIFT + SPACE и затем нажмете "а", она будет введена и исполнена, поскольку она не заканчивается двоеточием. DEF KEY "a"; "10 RЕМ hello"
Такая строка после нажатия на клавишу "а" будет реально введена в листинг программы после того, как пройдет проверку на синтаксис.
Клавише можно сделать переприсвоение в любое время. Старое значение при этом будет переписано. Если присвоить клавише пустую строку или если после задания клавиши нет ни одного оператора, клавиша не будет иметь определения. Оператор DEF KEY ERASE уничтожит все сделанные определения, в том числе и те, которые размещены выше RAMTOP и, тем самым, защищены даже от NEW. Процедура SAVE в загрузчике БЕТА БЕЙСИКа выгрузит все определения клавиш вместе с машиннокодовой частью БЕТА-БЕЙСИКа (она производит выгрузку кода от RAMTOP до конца БЕТА-БЕЙСИКа).
Чтобы просмотреть все определения клавиш, пользуйтесь командой LIST DEF KEY. Если желаете подредактировать определение, присвоенное клавише, то можете выполнить следующий прием. Наберите номер строки, затем нажмите номер желаемой клавиши и Вы получите редактируемую строку, которую Вы сможете оформить в оператор DEF KEY. RAMTOP автоматически понижается, когда Вы задаете клавиши. Если Вы воспользуетесь обычным CLEAR для изменения RAMTOP, то вполне может быть, что Ваши определения клавиш пропадут. С другой стороны, БЕТА-БЕЙСИК имеет другой вариант CLEAR (см. выше), с помощью которого можно без риска для определений клавиш выделять пространство для своего машинного кода выше уровня RAMTOP.
13. 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.
14. 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 нового блока на освободившееся место.
15. DELETE имя массива <пределы>
или
DELETE строка <пределы>
Клавиша 7 (та же, что и ERASE)
Кроме удаления программных строк, DELETE может удалять массивы полностью или частично и символьные строки.
10 LET a$ = "123456789" 20 DELETE a$ (4 ТО 7) 30 PRINT a$: REM Prints "12389" 40 DELETE a$
50 PRINT a$: 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 (1,"a$") 60 PRINT а$ (n) 70 NEXT n
В строке 50 использована функция LENGTH вместо числа 10 потому, что количество элементов в массиве будет изменяться. Теперь добавьте дополнительные строки:
45 DELETE a$ (3) 45 DELETE a$ (3 ТО) 45 DELETE a$ (ТО 4) 45 DELETE a$
Опять запустите программу командой RUN и посмотрите, какие элементы будут удаляться. В числовом массиве команда DELETE a(6) удалит шестой элемент, если массив одномерный или целую строку элементов, если массив двумерный.
DELETE а(3 TO 8) удалит "вырезку" из элементов одномерного массива или группу строк из двумерного. (В числовом двумерном массиве количество рядов задаете первым числом.)
Продолжение следует.
МИХАИЛЕНКО B.C.