ZX-Ревю 1991 №7-8 1990 г.

Beta basic - Мы начинаем печать инструктивных материалов по работе с языком программирования БЕТА-БЕЙСИК, разработанным и выпущенным фирмой BETASOFT.


Темы статьи: Пресса  

BETA BASIC

Мы начинаем печать инструктивных материалов по работе с языком программирования БЕТА-БЕЙСИК, разработанным и выпущенным фирмой BETASOFT.

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

Вступление.

Бета-Бейсик (1.0) по сравнению со стандартным Бейсиком "Спектрума" имеет 26 новых ключевых слов и 10 новых функций. Кроме того, некоторые из существовавших команд были существенно улучшены. Введены также ряд возможностей повышающих удобство программирования, например, мигающий указатель строки и BREAK для процедур, записанных в машинных кодах.

Существуют две версии этого выпуска. Одна для 48K, другая для 16K. (Версия 16K будет работать и на 48K компьютере, но большая часть программы останется неиспользованной).

Загрузите программу:

LOAD "bb16" или "bb48".

По команде LOAD загрузятся и автостартуют две строки Бейсика (строка 0 и строка 1). Строка 0 содержит определение функции Бета-Бейсика, а строка 1 резервирует память для основной части Бета-Бейсика, которая выполнена в машинных кодах и имеет длину 5.3K, а затем ее загружает.

По команде CLEAR понижается RAMTOP до 27168 или до 59936, в зависимости от применяемой Вами версии. Загрузка закончена, когда на экране появляется сообщение "копирайт". Если это не так, значит произошла ошибка ввода попробуйте еще раз.

Строка 1 сама себя уничтожит после окончания загрузки, а строка 0 останется. Другим указанием на то, что Бета-Бейсик успешно загрузился, является мигающий указатель текущей строки. При нажатии клавиши воспроизводится звуковой сигнал. Если он Вам не нужен, то дайте команду POKE 23609,0.

Строка 0 - не проявляется по команде LIST, если в компьютере присутствуют другие строки Бейсик-программы. Теперь Вы можете загрузить (MERGE) любую Бейсик-программу. Нельзя давать LOAD, а только MERGE, если Вы хотите, чтобы новые функции работали. Имейте в виду, что вместо графики пользователя (UDG) будут воспроизводиться новые ключевые слова Бета-Бейсика. Чтобы вернуть графику UDG, Вам надо будет дать команду KEYWORDS 0 (см. ниже).

При работе Вы почувствуете некоторое увеличение скорости вычислений, особенно на длинных программах, в которых есть много операторов GO TO и GO SUB.

Команда RETURN также выполняется намного быстрее.

Команда NEW вычищает всю программу, кроме строки 0, и одновременно выполняет CLEAR.

После того, как Вы напишете программу, содержащую новые ключевые слова, Вы можете выгрузить ее на ленту обычным образом. Когда Вам понадобится ее загрузить, загрузите сначала Бета-Бейсик (если он уже не присутствует в компьютере), а затем загружайте Вашу программу. При выгрузке программы в нее вошла и строка 0, поэтому теперь Вам нет необходимости загружаться через MERGE, достаточно дать LOAD.

Если Вы забыли предварительно загрузить Бета-Бейсик, то новые ключевые слова будут изображены в виде одиночных символов и появится сообщение "NONSENCE IN BASIC".

Чтобы это исправить, дайте:

MERGE "bb48": GO TO 1.

Здесь GO TO 1 нужен, чтобы обеспечить автостарт, т.к. нормальный автостарт отменяется загрузкой через "MERGE".

Все новые ключевые слова, кроме EDIT берутся через графический режим (CAPS SHIFT+9). В графическом режиме клавиши дают эти ключевые слова, а не символы графики пользователя. Графический режим действует на одно нажатие и автоматически снимается. Правила синтаксиса для новых ключевых слов приведены ниже. То, что заключено между знаками "// //" (двойная косая черта), может быть при вводе опущено. При вводе, как и обычно, выполняется проверка синтаксиса. Если встречается ошибка, то может быть выдано одно из стандартных сообщений "Спектрума", а может быть выдано сообщение Бета-Бейсика.

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

TRАCE

РАСКЛАДКА КЛАВИАТУРЫ

DEFPROC PROC ENDPROC RENUM

АиТО DELETE KEYWORDS

EDIT

1

2

3

4

5

6

7

8

9

0

POP

ELSE

ROLL

USING EXITIF

ON

DPOKE

Q

W

E

R

T

Y

U

I

O

P

АLTER SCROLL DO

GET

WHILE UNTIL LOOP

А

S

D

F

G

H

J

К

L

CLOCK

ON ERROR SORT

Z

X

C

V

В

N

M

1. Команда ALTER.

Структура:

ALTER //описание атрибутов// TO описание атрибутов. Клавиша: A.

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

100 PRINT AT 10,10;"TEST":PAUSE 50:ALTER TO PAPER 1

По этой команде свет фона изменится на синий. Вы можете воспользоваться также комбинацией атрибутов:

ALTER TO PAPER 2, INK 7,FLASH 1

Можно сделать так, чтобы программа различала какие атрибуты заменять, а какие

нет:

ALTER INK 1 TO INK 7

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

ALTER INK 3, BRIGHT 1, PAPER 7 TO INK 5, FLASH 1

Например: 100 LET A=2: LET B=4 110 FOR L=1 TO 5

120 FOR N=1 TO 16: PRINT INK A;PAPER B; "XXXX"; PAPER A; INK B; "0000": NEXT N 130 LET temp = A: LET A=B: LET B=temp: NEXT L 140 LET t=30

150 ALTER INK A TO INK B: PAUSE t 160 ALTER PAPER A TO INK A: PAUSE t 170 ALTER IKK A TO PAPER B: PAUSE t 180 ALTER INK B TO PAPER A: PAUSE t 190 LET t=t-t/10+1: GO TO 150

2. Команда: AUTO

Структура:

AUTO //номер строки// //,величина шага// Клавиша: 6

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

AUTO - действует от текущей строки +10, шаг = 10 AUTO 100 - от строки 100, шаг равен 10 AUTO 100,5 - от строки 100, шаг = 5.

3. Команда BREAK

Клавиши: CAPS SHIFT + SPACE (не в графическом режиме) BREAK - это не ключевое слово.

Обычный BREAK, который поддерживается стандартным Бейсиком, вполне годится для многих целей, хотя те, кто занимаются программированием в машинных кодах, испытывают неудобства, когда их процедура оказывается замкнутой в бесконечном цикле, который нельзя прервать через BREAK и программа "зависает". Если Вы работаете в Бета-Бейсике и пользуетесь при этом функцией CLOCK (см. ниже), то Вы можете организовать систему для поддержки BREAK в машинных кодах. Так, например, если Вы нажмете CAPS SHIFT + SPACE на время большее 1 сек, то поддерживающая система решит, что Вы "зависли" и прервет работу, даже если программа работала правильно.

Замечание для программистов в машинных кодах: Если Вы хотите пользоваться этой функцией BREAK, не отключайте прерывания (команда АССЕМБЛЕРа DI - DISABLE INTERRUPTS).

4.Команда CLOCK

Структура: CLOCK число или

CLOCK строка Клавиша: C

Команда CLOCK управляет работой таймера, который действует от системы прерываний компьютера. CLOCK может изображать в правом верхнем углу текущее время в часах, минутах и секундах. Можно сделать так, что при достижении заданного времени компьютер будет издавать звуковой сигнал (будильник) или будет выполняться переход к какой-либо подпрограмме GO SUB. Часы работают и в то время, когда Вы пишете программу, и во время ее прогона (RUN). Они не работают только во время подачи звукового сигнала (BEEP) и во время операций с магнитной лентой. Чтобы указать какие именно возможности используются, после CLOCK нужно поставить число в диапазоне от 0 до 7, которое можно выбрать по нижеприведенной таблице:

Число

Переход по

Включение

Изображение

GO SUB

звукового

времени на

сигнала

экране

0

-

-

-

1

-

-

+

2

-

+

-

3

-

+

+

4

+

-

-

5

+

-

+

6

+

+

-

7

+

+

+

Часы начнут работать сразу после того, как один из этих режимов будет задан, начиная с "00:00:00". Дайте CLOCK 1, чтобы увидеть время. Чтобы установить правильное время, надо после CLOCK дать строку, например:

CLOCK "09:29:55"

В принципе, здесь двоеточие можно и не давать. Если строка содержит менее чем 6 цифр, все остальные полагаются равными нулю. Так,

CLOCK "xyz 10" дает "10:00:00".

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

CLOCK "A06:20" выполнит установку будильника на двадцать минут седьмого. В установленное время прозвучит звуковой сигнал, если он был взведен после CLOCK числом 2,3,6 или 7 (см. таблицу выше).

Можно, если Вы задали число 4,5,6 или 7, в назначенное время выполнить переход к какой-либо подпрограмме GO SUB, но это возможно только при прогоне программы. Если Вы сидите и работаете над составлением программы, это произойти не может.

По достижении установленного времени оператор CLOCK ждет окончания вычисления последней строки, что может занять некоторое время, особенно если это INPUT или PAUSE и только после этого переходит к указанной подпрограмме. Никакого GO SUB из программы, написанной в машинных кодах здесь выполняться не может. Номер строки, к которой выполняется переход, должен стоять после CLOCK и должен быть в диапазоне от 8 до 9999. В подпрограмме надо использовать имена переменных, отличных от имен в главной программе, иначе эти переменные могут подвергнуться несанкционированным изменениям.

Если Вам нужно, чтобы подпрограмма хранила данные, а в программе есть CLEAR или RUN, то эти данные нужно перенести предварительно в соответствующую область памяти через POKE.

Возможные применения включают в себя различные вариации на тему будильника -включение мелодии, изображения на экране, отбивание часов и т.п. (Текущее время можно взять в качестве функции и использовать в подпрограмме - см. FN T$). Энтузиасты от электроники могут сделать так, что компьютер будет принимать данные через внешний порт, скажем один раз в час или в минуту и что-нибудь с ними делать. Пример: 8909 STOP

9010 LET pointer=PEEK 37000: POKE pointer+27001, IN 127

9020 LET pointer=pointer+1: IF pointer>100 THEN LET pointer = 0

9030 POKE 27000,pointer: LET Z$: FN T$( )

9040 LET hours = VAL Z$(1 TO 2): LET mins = VAL Z$(4 TO 5)

9050 LET mins = mins+1: IF mins = 60 THEN LET hours = hours+1:LET mins =0

9060 CLOCK "A"+STR$ hours+STR$ mins: RETURN

He делайте RUN. Вместо этого дайте прямую команду: CLEAR 26999: POKE 27000,0: CLOCK 9000: CLOCK 5

Установите "будильник" на какое-то время, чуть попозже текущего. CLOCK "A xxxx"

Теперь запустите (RUN) какую-либо программу. Процедура CLOCK активизируется каждую минуту: по ней считывается значение с порта 127 и отправляется на хранение в адрес, на который указывает непрерывно увеличивающийся указатель (он сбрасывается на нуль после превышении 100).

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

5. Команда: DEF PROC

Структура: DEF PROC имя процедуры Клавиша 1 (та же, что и DEF FN). См. также PROC, END PROC

По этой команде задается имя процедуры. DEF PROC должен быть первым ключевым словом в строке (хотя наличие пробелов или определений цвета разрешается).

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

6. Команда: DELETE

Структура: DELETE // номер строки// TO // номер строки// Клавиша: 7

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

DELETE TO 100 - устраняются все строки, начиная со строки, следующей за нулевой до строки 100 включительно.

DELETE 100 TO - удаляется строка 100 и все последующие. DELETE 100 TO 100 - удаляется только строка 100 DELETE 0 TO 0 - удаляется только нулевая строка. DELETE TO - удаляется вся программа, кроме нулевой строки.

Последний из примеров не эквивалентен NEW, т.к. в этом случае не вычищаются переменные. Удаляются только строки программной области PROG, но не переменные из области VARS.

Любой из указанных номеров должен реально существовать, иначе будет сообщение об ошибке:

U: NO SUCH LINE (такой строки нет).

DELETE можно включать в текст программы, хотя с определенной предусмотрительностью. Так, например, если DELETE входит в состав процедуры, подпрограммы или цикла и уничтожает строки, расположенные выше, то программа остановится, так как адреса перестанут соответствовать положение в программе. Если DELETE должен уничтожить сам себя, то он должен быть последней строкой удаляемого блока.

Одно из возможных практических приложений состоит в очистке данных DATA после их использования через READ, чтобы освободить память для переменных (каждое число в DATA занимает по меньшей мере 8 байтов).

7. Команда: DO

Структура:

DO или

DO WHILE условие или

DO UNTIL условие Клавиша: D

WHILE - клавиша J UNTIL - клавиша K См. также LOOP,EXIT IF

Команды DO и LOOP работают совместно и служат для организации циклов. Совместно со своими квалификаторами WHILE и UNTIL они обеспечивают управляющую структуру, значительно превосходящую возможности стандартного Бейсика. Сама по себе команда DO служит как бы маркером, которому передает управление соответствующий оператор LOOP. Пример: 10 DO

20 PRINT "HELLO";: PAUSE 50 30 LOOP

По этой программе будет печататься слово "HELLO" до тех пор, пока Вы не нажмете BREAK.

Цикл DO может управляться через WHILE и некоторое условие. Если указанное условие справедливо, то все строки между DO и LOOP будут выполняться, т.е. цикл работает, пока условие выполняется. Как только условие станет ложным, то управление сразу будет передано оператору, следующему за LOOP.

DO UNTIL - имеет прямо противоположное значение. Цикл DO LOOP выполняется, пока условие при операторе UNTIL ложно, то есть до тех пор, пока оно не станет справедливым. 10 LET total = 0 20 DO UNTIL total>100 30 INPUT "ENTER A NUMBER";x 40 LET total=total+x: PRINT total 50 LOOP

60 PRINT "THAT IS OVER A HUNDRED"

^року 20 можно заменить строкой: 20 DO WHILE total <=100

Пары DO LOOP можно вкладывать друг в друга так же, как это делается для циклов FOR-NEXT. (в нижележащем примере мы наметили буквами пары для наглядности, в программе же этого делать нельзя). DO(A):DO (B):LOOP (B):LOOP (A) Здесь один цикл (B) внутри другого (A). DO(A):DO(B):LOOP(B):DO(C): LOOP(C):LOOP(A) Здесь два цикла (B) и (C) внутри цикла (A).

Поскольку адреса цикла хранятся в памяти, "выйти" из середины цикла нельзя иначе, как с помощью операторов EXIT IF или POP, иначе нарушится работа стека.

Если в Вашей программе цикл DO не закрыт соответствующим оператором LOOP, компьютер выдаст сообщение:

S "MISSING LOOP" (S "Отсутствует LOOP").

Управляющие структуры, очень похожие на DO-LOOP существуют и в некоторых других алгоритмических языках и имеют различные названия. Например: REPEAT(выражение) UNTIL(условие) эквивалентно:

DO(выражение) LOOP UNTIL(условие) и

WHILE (Условие) (выражение) ENDWHILE (или WEND) эквивалентно:

DO WHILE(условие)(выражение) LOOP

8. Команда: DPOKE

Структура: DPOKE адрес, число Клавиша: P

См. также FN P (адрес).

DPOKE означает двойной POKE. Ему эквивалентна следующая конструкция обычного Бейсика:

POKE адрес, число - INT (число/256)*256

POKE адрес+1,^Т(число/256)

Другими словами, младший байт двухбайтного числа засылается (POKE) в определенный адрес, а старший байт - в следующий адрес. Таким образом хранятся коды от 0 до 65535. Многие системные переменные имеют такой двухбайтный формат и работа с ними через DPOKE значительно упрощается.

Эквивалентный двойной PEEK выполняется через FN P (адрес).

9. Команда EDIT.

Структура:

EDIT // номер строки//

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

Оператор EDIT не то же самое, что стандартное CAPS SHIFT + 1.

Это ключевое слово. Его цель состоит в отказе от утомительного процесса: LIST -BREAK - CAPS SHIFT + 1

Чтобы быть действительно усовершенствованием, EDIT должен быть ключевым словом, берущимся без регистра, но все буквенные клавиши уже заняты, а цифровые нужны для нумерации строк. Однако, поскольку обычно номер строки не начинается с нуля, то его можно использовать для этих целей. Ключевое слово EDIT вызывается, если клавиша 0 нажимается после предшествовавшего нажатия ENTER.

Если Вы даете EDIT+ номер строки + ENTER, то эта строка немедленно появляется, готовая к редактированию. Если номер строки опущен, то Вам будет подана текущая строка. Процесс редактирования был еще более упрощен путем задействования курсорных клавиш "вверх" и "вниз" для редактирования строки. Они позволят мгновенно перемещать курсор в начало или в конец строки.

Другой способ вызова EDIT - клавиша 5 в графическом режиме.

10. Команда: ELSE

Структура: ELSE (выражение)

Клавиша: E

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

С другой стороны, если условие, стоящее после IF является справедливым, то все действия выполняются только до ELSE, а затем управление передается на строку, следующую за строкой, содержащей ELSE.

Например: 10 INPUT "Give me a number";X 20 PRINT "Does that number = 1?" 30 PAUSE 50

40 IF X = 1 THEN PRINT "True": ELSE PRINT "False" 50 GO TO 10

Заметьте, что перед оператором ELSE всегда должно стоять двоеточие. Ситуация усложняется, когда у Вас есть несколько IF и ELSE в одной строке. Примеры ниже показывают как сочетаются различные ELSE со своими IF. Буквенные метки в скобках служат только для наглядности.

IF-THEN (A):IF-THEN (B):ELSE (B)

IF-THEN (A):IF-THEN (B):ELSE (B):ELSE (A)

IF-THEN (A):ELSE (A):IFTHEN (B):ELSE (B)

11. Команда: END PROC

Клавиша: 3

См. также DEF PROC, PROC

Этим оператором отмечается конец именованной процедуры, что позволяет компьютеру избежать вычислений между ее началом DEF PROC и концом END PROC, если процедура не была вызвана командой PROC.

Когда процедура вызвана, то END PROC отмечает место конца вычислений и управление передается строке, стоящей после PROC. (Более подробно об этом см. PROC).

Использование END PROC, без предварительного задания DEF PROC вызывает сообщение об ошибке

W: "Missing DEF PROC" (W: "Отсутствует DEF PROC")

12. Команда: EXIT IF

Структура: EXIT IF (условие) Клавиша: i

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

100 DO: PRINT "Line 100":PAUSE 20 110 EXIT IF INKEY$="STOP" 120 PRINT "LINE 120":PAUSE 20:LOOP 130 PRINT "Out of loop"

Вы будете находиться в цикле, пока не нажмете STOP (SYMBOL SHIFT + A). Заметьте, что текст строки 120 не печатается, когда выполняется выход из цикла. Если в программе будет отсутствовать закрывающий оператор LOOP, то Вы получите сообщение об ошибке: S: "Missing LOOP" (S: "отсутствует LOOP")

13. Команда: GET

Структура:

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

Так же, как и INKEY$, GET позволяет читать клавиатуру без использования ENTER. Разница между GET и INKEY$ состоит в том, что GET ждет нажатия клавиши прежде, чем продолжить работу. Когда GET применяется со строковой переменной, он "снимает" символ.

10 GET A$: PRINT A$: GO TO 10

Теперь Ваш компьютер работает как пишущая машинка. Можете переключать регистры обычным порядком. CAPS SHIFT + 5 дает шаг назад без стирания, а ENTER эквивалентен PRINT. Более изощренная версия выглядит так:

10 GET A$: PRINT A$; FLASH 1;"B"; FLASH 0; " ";CHR$8;CHR$8;: GOTO 10

Если GET используется с числовой переменной, т.е. GET X или GET клавиша, то переменной присваивается 1, если будет нажата клавиша "1" и так далее до 9. Если будет нажата "A", то 10, если "B", то 11 и т.д.

Особенно полезен оператор GET в программах, где управление выполняется от меню. См. также ON.

14. Команда: KEYWORDS

Структура:

KEYWORDS 1 или KEYWORDS 0 Клавиша: 8

Эта команда позволяет делать выбор, что печатать - ключевые слова Бета-Бейсика или символы графики пользователя UDG. KEYVORDS 0 - символы UDG KEYWORDS 1 - ключевые слова Бета-Бейсика.

Несмотря на то, что распечатка Вашей программы будет выглядеть очень сомнительно, работать все будет нормально. Единственное ключевое слово, которое нельзя будет заменить графикой - это само слово "KEYWORDS". Да это собственно и не нужно, потому что графический символ на клавише 8 эквивалентен пробелу.

15. Команда: LOOP

Структура:

LOOP WHILE условие или LOOP UNTIL условие

Клавиша: L (UNTIL - клавиша K; WHILE - клавиша J) См. также DO, EXIT IF

LOOP - это часть структуры циклов DO-LOOP - см. сначала DO. Сам по себе оператор LOOP заставляет программу возвращаться к соответствующему DO. Квалификаторы WHILE (пока) и UNTIL (до тех пор) используются для того, чтобы возврат от LOOP к DO был условным.

LOOP WHILE условие - повторяет цикл только если условие справедливо. LOOP UNTIL условие - наоборот, если условие не выполняется.

Если Вы используете окончание цикла (LOOP без его начала DO), то получите сообщение об ошибке:

T: "LOOP WITHOUT DO" (LOOP без DO)

16. Команда: ON

Структура:

GO TO ON число; номер строки, номер строки, номер строки.... или

GO SUB ON число; номер строки, номер строки, номер строки.... Клавиша: O (буква "O")

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

В принципе это возможно делать и в стандартном Бейсике, например, так:

10 INPUT a: GO TO a*100+100,

но здесь номера строк перехода являются членами одной закономерной последовательности. А если они произвольные, то: 10 INPUT a: GO TO ON a;90,135,60,40 20 PRINT "ENTER 1 TO 4": GO TO 10

В этом примере к строке 90 будет выполнен переход, если a=1; если a=2, то к строке 135 и т.д.

Если "a" не принадлежит диапазону от 1 до 4, то переход не состоится, управление будет передано следующей строке, которая вернет Вас назад и даст еще раз попробовать. INPUT здесь может быть заменен на GET, чтобы более элегантно организовать меню в программе.

17. Команда: ON ERROR

Структура:

ON ERROR номер строки Клавиша: N

Эта команда требует в случае появления ошибки перехода к строке, номер которой задан в команде. Такой переход возможен после любого сообщения об ошибке как от стандартного Бейсика, так и от Бета-Бейсика. Исключение составляют сообщения: 0, "OK" и 9, "Stop statement", которые конечно же ошибками не являются. Отключается такой режим подачей ON ERROR 0. Кроме того, он отключается во время работы подпрограммы, которой было передано управление в результате ошибки, но вновь включается после возврата в главную программу.

В подпрограмме могут быть использованы три переменные: line, stat и error.

line - номер строки, в которой произошла ошибка;

stat - номер выражения в строке;

error - код ошибки.

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

Ниже приведен пример фрагмента программы, который печатает точки. Подпрограмма работает так, что если точка выходит за пределы экрана, то программа ее пропускает.

100 ON ERROR 5000

110 FOR n=1 TO 10: INPUT "x coord ";x;"y coord ";у

120 PLOT x,y :NEXT n

4990 STOP

5000 IF ERROR = 11 AND line = 120 THEN RETURN: ELSE POP: CONTINUE

Примечания:

Команда STOP предназначена для того, чтобы предотвратить случайный вход в подпрограмму обработки ошибок. Номера строки и ошибки проверяются потому, что "INTEGER OUT OF RANGE" - довольно часто встречающаяся ошибка.

Возврат в главную программу из строки 5000 будет происходить в точку, следующую за тем местом, где произошла ошибка, поэтому RETURN будет выполняться к NEXT n. Если же номер ошибки не тот, который был оговорен, будет выполнен оператор CONTINUE.

Команда POP удаляет со стека адрес возврата в главную программу, иначе стек может оказаться запертый.

Есть одна "ошибка" с которой надо работать несколько иначе. Она связана с использованием команды BREAK и называется "BREAK INTO PROGRAM" (прерывание программы). Т.к. функция ON ERROR отключена во время работы подпрограммы обработки ошибок, то результатом нажатия BREAK будет то, что программа остановятся после первого же выражения подпрограммы, т.к. клавишу BREAK Вы еще не успели отпустить. Поэтому, если Вы хотите, чтобы после BREAK Ваша подпрограмма выполнила какие-то действия, то необходимо ввести какую-то задержку в первом же выражении в Вашей подпрограмме. За время этой задержки Вы успеете отпустить BREAK. В качестве задержки подойдет BEEP, причем Вы можете использовать частоту звукового сигнала, которая почти не слышна.

100 ON ERROR 5000

110 PRINT "round and";:PAUSE 10: GO TO 110

4990 STOP

5000 IF ERROR = 21 THEN BEEP 1,69: BORDER RND*7: RETURN: ELSE POP: CONTINUE

Если Вы забудете ограничить подпрограмму обработки ошибок каким-либо конкретным типом ошибки, то можете зависнуть в бесконечном цикле. Например, что делать, если Вы не сможете выйти из "STOP in input". В этом случае Вам может помочь система, поддерживающая BREAK в Бета-Бейсике, иначе можете выключать компьютер.

18. Команда: PLOT

Структура:

PLOT X координата, Y координата //: строка//

Клавиша: обычная клавиша для функции PLOT (не в графическом режиме!)

Как Вы уже увидели из структуры команды, оператор PLOT в Бета-Бейсике имеет дело не только с включением и выключением пикселей, но и со строковыми данными.

Координаты выражения при PLOT указывают на левый верхний угол первого символа строки. Строки не должны превышать 32 символа. Если они длиннее, то напечатаны не будут. Могут быть использованы INVERSE, OVER, INK и т.д. Строки не должны содержать CHR$ 13 (управляющий код ENTER), иначе некоторые из них не смогут быть напечатаны. Если строка выходит за пределы правого поля экрана, то она "возвращается" с левой стороны. Если она выходит за пределы экрана сверху или снизу, то будет выдано сообщение "INTEGER OUT OF RANGE". Позиция точки, используемая для операции DRAW в качестве

стартовой не изменяется при помещении строки на экран.

Изменяя координаты тех точек, куда Вы будете помещать (PLOT) символы, Вы сможете добиться более гладкого перемещения, чем при использовании традиционного "PRINT AT".

100 FOR X=16 TO 224: PLOT X,X/2;"<>": NEXT X

Попробуйте в эту строку добавить STEP 2, или STEP 3 для получения различных эффектов. Поскольку "<>" имеет бордюр вокруг символа цвета PAPER шириной по крайней мере в один пиксел, то он автоматически будет стирать сам себя по мере перемещения на одни пиксел за один шаг. Некоторые буквы, например "T" имеют пикселя цвета "INK", достигающие краев элементарного символьного квадрата 8x8. Это означает, что при движении в некоторых направлениях они оставляют "след", если Вы не примете специальных мер для его стирания.

Если Вы будете конструировать свой собственный шрифт, то очень неплохо оставлять у символов бордюр в один пиксель со всех сторон.

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

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

100 LET A$="DO you know how many molecules/cm+3-Na-2+PO-4+has?" (Знаете ли Вы сколько

молекул/куб-см имеет Na2PO4 ?)

110 LET X = 0: LET Y = 160

120 FOR C=1 TO LEN A$

130 IF A$ (C) ="-" THEN LET Y=Y-3: NEXT C

140 IF A$ (C) ="+" THEN LET Y=Y+3: NEXT C

150 PLOT X,Y: A$(C): LET X=X+8

160 IF X>=248 THEN LET X=0:LET Y=Y-12

170 NEXT C

В программе знаки "+" и "-" играют роль непечатных управляющих кодов, которые сдвигают позицию печати вниз или вверх на три пикселя.

Поэкспериментируйте со строкой 150 с тем, чтобы X возрастало больше или меньше, чем на 8 пикселей. Можете при этом попробовать PLOT OVER 1.

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

19. Команда POP

Структура:

POP //числовая переменная//

Клавиша: Q

По этой команде устраняется адрес, находящийся на вершине программного стека. Это тот стек, который обслуживает GO SUB, DO-LOOP, PROC-ENDPROC (не путать с машинным стеком и со стеком калькулятора).

Указанный номер строки присваивается переменной, если она есть при POP. POP позволяет выходить из подпрограмм или циклов без их естественного завершения. Для этого POP снимает ставший ненужным адрес возврата со стека и предотвращает "зависание" программы. Просто POP уничтожает этот адрес, а POP с переменной, например "а" присваивает ей это значение. Тогда процедура или подпрограмма может "запомнить" откуда ее вызывали. Если Вы впоследствии пожалеете о том, что воспользовались POP, то сможете исправить положение: GO TO a+1

Хотя это и не эквивалентно RETURN, т.к. через GO TO можно войти только в первый оператор строки. 100 GO SUB 500 110 STOP 500 POP a

510 PRINT "Subroutine was called from line "; a (Подпрограмма вызывалась из строки "a"). 520 GO TO a+1

Если Вы замените строку 520 на 520 RETURN, то получите: "RETURN Without GO SUB", т.к. требуемый адрес возврата на стеке уже находится.

Использование POP, когда на стеке уже нет данных, дает сообщение об ошибке:

V: NO POP data

(Продолжение в следующем выпуске)




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Сплошные приколы - Сборник высказываний советских офицеров (продолжение).
Новости - В игре Черный Ворон нашей версии найден маленький баг.
Вступление - содержание номера.
Игрушки - Lone Wolf: Новелла по игре.
Железо - расширение для PROFI для подключения других устройств (T-Rex's Device 1.2)

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