(Продолжение) Управление выполнением программы Процедуры.
Мега-Бейсик обеспечивает работу с процедурами, вызов которых осуществляется по их имени, точно так же, как и после команды, после имени процедуры может быть записана серия арифметических выражений или чисел. Эти выражения определяют необходимые переменные для работы в процедуре.
Недостатком процедур в Мега-Бейсике является то, что они не могут работать с локальными переменными: их переменные являются общими для всей программы.
Используя процедуры, можно разделить всю программу на ряд частных задач. Каждая процедура отлаживается отдельно, а затем все они объединяются в программу. Начало процедуры задается символом '@', следом за которым записывается имя процедуры. После имени процедуры записываются необходимые параметры. Окончание процедуры обозначается оператором ENDPROC_. Как только будет достигнут этот оператор, управление выполнением программы будет передано оператору, записанному за оператором вызова процедуры.
После оператора ENDFROC_ можно записать имя процедуры: 9000 @DISPLAY_A,A$ 9010 PAPER A: INK 9 9020 MODE_4: STIPPLE_5 9030 PRINT A$ 9040 ENDPROC_DISPLAY
Это пример процедуры. В строке 9010 определяется имя процедуры DISPLAY и, как видно, для ее работы необходимо определить две переменные - A и A$. В строке 9030 определяется размер и оттенок символов, выводимых на экран. Для вызова процедуры необходимо записать, например:
DISPLAY_2,"MEGABASIC"
Процедуры могут вызываться и из процедур.
Мега-Бейсик обеспечивает работу с циклами типа REPEAT-UNTIL. Оператор REPEAT определяет начало цикла. После оператора UNTIL должна быть записана односимвольная переменная. Если значение этой переменной равно нулю, то цикл прерывается и выполнение программы переходит к оператору, записанному после последнего оператора REPEAT, если же эта переменная отлична от 0, то выполняется следующий оператор программы. Допускается вложение до 10 циклов типа REPEAT-UNTIL.
Для хранения номеров строк операторов, к которым выполняется возврат после использования процедур и циклов REPEAT-UNTIL, применяется специальный стек. Когда вызывается процедура, номер строки, следующий за оператором вызова, записывается в стек, что позволяет системе знать адрес возврата после окончания процедуры.
Аналогично и для циклов типа REPEAT-UNTIL. Здесь также в стек записываются номера строки и оператора, к которым осуществляется возврат после оператора UNTIL.
После выполнения оператора ENDPROC_ и перехода к строке, номер которой хранился в стеке, этот номер удаляется со стека. Любая попытка записать в стек больше 10 номеров заканчивается сообщением "PROC STACK OVERFLOW" (Процедурный стек переполнен).
Команды POP и PUSH. Оператор POP_ служит для "выталкивания" значений со стека, оператор PUSH_ для записи значения в стек. За оператором PUSH_ следуют 2 числа: номер оператора в строке и номер строки. Для очистки стека перед началом выполнения программ необходимо записать команду PCLEAR.
Команда BRANCH_. По этой команде после выполнения каждой программной строки будет вызываться подпрограмма, записанная в строках основной программы. Начальная строка этой подпрограммы указывается после команды BRANCH, а конец подпрограммы определяется оператором ENDPROC_.
Оператор MTASK_. Это оператор многозадачного режима. Он позволяет выполнять программу одновременно из двух разных мест. Считается, что программа как бы разделена на две части: первая начинается после строки, где записан оператор MTASK_, а вторая - со строки, номер которой записан после оператора MTASK_. Мега-Бейсик выполняет поочередно строки из каждой части программы.
Отладка и редактирование программ
Операторы BRANCH_, TRON_, TROFF_ и SPEED.
Оператор BRANCH_ оказывается весьма полезным при отладке программ. Если, к примеру, Вас интересует какая-то переменная, то Вы можете с помощью этой команды вызывать подпрограмму печати значения этой переменной после каждой программной строки. Другой способ проверить выполнение программы - выводить на экран номер выполняемой строки, что возможно по команде TRON_. При этом номер выполняемой строки программы будет выведен в нижний угол экрана, команда TROFF_ отменяет такой режим. Связана с этими двумя командами также команда SPEED_, после которой записано число, определяющее скорость выполнения программных строк. Максимально возможное число - 255. При этом выполнение программы будет приостановлено до тех пор, пока пользователь не нажмет любую клавишу.
При вводе больших программ весьма полезным может быть автоматический ввод номера следующей строки после нажатия клавиши ENTER. Такой режим работы возможен при применении команды AUTO_, после которой следует 2 числа, разделенных запятой. Первое число задает начальный номер строки, с которого начнется автоматическая нумерация, а второе - шаг нумерации.
Остановить режим автонумерации можно так: EXTEND SYMB.SHIFT 'L'. Часто бывает необходимо удалить целый блок программных строк. Эту задачу можно решить, используя команду DELETE_. После этой команды записывают два числа, являющиеся соответственно начальным и конечным номерами строк удаляемого блока.
Желающие защитить свои программы от любопытных глаз, найдут полезным возможность отключать клавишу BREAK. это может быть сделано при применении команды BROFF_. Возвращение клавише ее возможностей осуществляется по команде BRON_.
Команда RESTART. Многие версии языка Бейсик имеют команду ON ERROR GO TO, позволяющую не прерывать выполнение программы в случае обнаружения ошибки, а осуществлять обход строки с ошибкой. Аналогичная команда имеется и в Мега-Бейсике. Это команда RESTART_, после которой записывается номер строки, к которой осуществляется переход в случае обнаружения ошибки. По команде RESTART_OFF такой режим отменяется. После обработки ошибки с помощью команды RESTART, некоторая полезная информация сохраняется в ячейках памяти: 59873/4 - номер строки, в которой обнаружена ошибка; 59875 - номер оператора внутри строки с ошибкой; 59862 - код обнаруженной ошибки.
Мега-Бейсик открывает для Вас новые возможности создания звуков на Вашем ZX SPECTRUM. Для этого необходимо использовать команду PLAY_ и генератор звука ISG
Здесь:
n=0 - ноты;
n=1 - белый шум;
l - длительность звучания на каждом шаге; s - значение начальной звуковой частоты; d - число шагов;
f - изменение частоты после каждого шага.
Если команда PLAY_ только улучшает возможности команды BEEP, то использование звукового генератора ISG позволит получить новые эффекты. Дело в том, что при выполнении программы в ZX SPECTRUM происходят прерывания 50 раз в секунду. Во время обслуживания прерывания специальная программа в машинных кодах производит сканирование клавиатуры. В это же время и работает ISG. В Мега-Бейсике имеется ряд команд, которые могут управлять этим генератором.
SOUND_n,a,b,c,d - команда для работы с звуковым буфером. Здесь:
n=0 очистка звукового буфера перед очередной загрузкой;
n=1 добавление новой информации в звуковой буфер;
a=0 воспроизведение нот;
а=1 воспроизведение шума;
b - шаг звуковой частоты;
c - число шагов в последовательности нот;
d - число повторений последовательности нот.
Другие команды: SOFF - отключение ISG; SON - включение ISG;
SREP_n - количество повторений звуковой последовательности; если n=0, то данные, записанные в звуковом буфере будут использоваться только один раз, в противном случае -многократно.
Когда выполняется команда PLAY, ISG автоматически отключается. Для включения ISG применяйте команду SON. Более сложные звуковые эффекты можно получить, если замедлить выполнение программы. Этот короткий фрагмент программы демонстрирует работу ISG:
10 SOUND_ 0,0,1,20,255 20 SREP_1 30 SON
40 MODE_4: STIPPLE_6: FONT_2 50 VDU_(128+RND*15) 60 PAPER RND*7: INK 9 70 GO TO 50
Мега-Бейсик позволяет включать в текст основной программы и фрагменты в машинных кодах. Мега-Бейсик занимает в ОЗУ участок памяти, начиная с адреса 45000.
Поэтому все программы в машинных кодах должны быть размещены в ОЗУ до этого адреса. Для того, чтобы записать в память двухбайтное число, можно воспользоваться командой DOKE, которая поддерживается в Мега-Бейсике. После этой команды должны быть записаны два числа: первое определяет адрес, куда записываются данные, а второе -записываемое число.
Для вызова программ в машинных кодах в Мега-Бейсике используется команда CALL_. После этой команды записывается число, указывающее адрес вызываемой подпрограммы, а затем произвольные числа, которые передаются в машинный стек и затем используются как параметры в подпрограмме.
Фронт-панель позволяет пользователю вносить изменения в ячейки памяти и регистры микропроцессора путем записи шестнадцатеричных чисел и является по сути встроенным монитором Мега-Бейсика.
Фронт-панель активизируется при выполнении команды MON, либо после 'SPACE F' при выполнении программы.
Фронт-панель использует окно 3, в котором после активизации фронт-панели Вы увидите столбцы HEX-чисел. Слева - регистры процессора и их значения, а справа -распечатка участка ОЗУ. Звездочка указывает на текущий регистр, а инверсная полоса -текущую ячейку памяти. Все изменения производятся с помощью однобуквенных команд, после которых могут быть записаны до трех шестнадцатеричных чисел:
SPACE - возврат в Бейсик;
R nn - запись в текущий регистр 16-битового HEX-числа;
L nn nn nn - перемещение участка памяти. Здесь:
1-е число определяет начальный адрес перемещаемого блока;
2-е число задает новый начальный адрес;
3-е число определяет длину перемещаемого блока в байтах;
M nn - смещение указателя ячейки памяти на адрес nn;
S - установка точки выхода в программе для текущей ячейки;
K - продолжение выполнения программы после S;
U - восстановление точки выхода;
I nn nn nn - заполнение блока ОЗУ. Здесь:
1-е число - начальный адрес блока;
2-е число - длина блока;
3-е число - байт, которым заполняется блок;
J nn - вызов подпрограммы в машинных кодах, расположенной по адресу nn;
ENTER - смещение указателя ячейки памяти на один байт вперед;
"-" - смещение указателя ячейки памяти на один байт назад.
Ниже приводится перечень новых команд Мега-Бейсика. Здесь литера после команды определяет число или числовое выражение, а литера со знаком $ - символьное выражение.
AUTO_a, b - автоматическая нумерация вводимых строк. Для выключения такого режима необходимо нажать "=" и ENTER.
BACKUP - эта команда используется для копирования файлов. После ввода этой команды на экране появляется сообщение "START TAPE"
Как только на входе EAR появится сигнал, оно сменится новым сообщением "OK searching" и будет идти загрузка очередного файла с кассеты. После окончания загрузки на экране появляется сообщение:
"Start tape, then press any key".
Когда Вы будете готовы записать этот файл на кассету, нажмите любую клавишу и файл перепишется. После этого система запросит Вас о еще одной копии. Если Вам она нужна, то нажмите клавишу "Y", если же нет, то нажмите "N". После этой команды необходимо выполнить команду NEW.
BRANCH_n - по этой команде будет вызываться подпрограмма после выполнения каждой программной строки.
BROFF - выключение клавиши BREAK.
BRON - включение клавиши BREAK после команды BROFF.
CALL_a(n,n...) - вызов программы в машинных кодах, по адресу 'a'.
После адреса в скобках могут быть записаны числа, которые записываются на машинный стек для использования в подпрограмме.
CHANGE_a,b - это команда для изменения атрибутного файла. Здесь 'a'- маска, a 'b'-данные.
CLW_(n),h - эта команда используется для очистки окон. Если записаны два числа, то первое определяет, какое из окон очищается. Если же записано одно число, то очищается текущее окно.
(Окончание следует)