(Продолжение) Управление выполнением программы Процедуры.
Мега-Бейсик обеспечивает работу с процедурами, вызов которых осуществляется по их имени, точно так же, как и после команды, после имени процедуры может быть записана серия арифметических выражений или чисел. Эти выражения определяют необходимые переменные для работы в процедуре.
Недостатком процедур в Мега-Бейсике является то, что они не могут работать с локальными переменными: их переменные являются общими для всей программы.
Используя процедуры, можно разделить всю программу на ряд частных задач. Каждая процедура отлаживается отдельно, а затем все они объединяются в программу. Начало процедуры задается символом '@', следом за которым записывается имя процедуры. После имени процедуры записываются необходимые параметры. Окончание процедуры обозначается оператором 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 определяет начало цикла. После оператора 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. При этом выполнение программы будет приостановлено до тех пор, пока пользователь не нажмет любую клавишу.
Команды AUTO и DELETE.
При вводе больших программ весьма полезным может быть автоматический ввод номера следующей строки после нажатия клавиши ENTER. Такой режим работы возможен при применении команды AUTO_, после которой следует 2 числа, разделенных запятой. Первое число задает начальный номер строки, с которого начнется автоматическая нумерация, а второе - шаг нумерации.
Остановить режим автонумерации можно так: EXTEND SYMB.SHIFT 'L'. Часто бывает необходимо удалить целый блок программных строк. Эту задачу можно решить, используя команду DELETE_. После этой команды записывают два числа, являющиеся соответственно начальным и конечным номерами строк удаляемого блока.
Команды BRON_ и BROFF_.
Желающие защитить свои программы от любопытных глаз, найдут полезным возможность отключать клавишу BREAK. это может быть сделано при применении команды BROFF_. Возвращение клавише ее возможностей осуществляется по команде BRON_.
Команда RESTART. Многие версии языка Бейсик имеют команду ON ERROR GO TO, позволяющую не прерывать выполнение программы в случае обнаружения ошибки, а осуществлять обход строки с ошибкой. Аналогичная команда имеется и в Мега-Бейсике. Это команда RESTART_, после которой записывается номер строки, к которой осуществляется переход в случае обнаружения ошибки. По команде RESTART_OFF такой режим отменяется. После обработки ошибки с помощью команды RESTART, некоторая полезная информация сохраняется в ячейках памяти: 59873/4 - номер строки, в которой обнаружена ошибка; 59875 - номер оператора внутри строки с ошибкой; 59862 - код обнаруженной ошибки.
Звук.
Мега-Бейсик открывает для Вас новые возможности создания звуков на Вашем ZX SPECTRUM. Для этого необходимо использовать команду PLAY_ и генератор звука ISG
PLAY_n,l,s,d,f
Здесь:
n=0 - ноты;
n=1 - белый шум;
l - длительность звучания на каждом шаге; s - значение начальной звуковой частоты; d - число шагов;
f - изменение частоты после каждого шага.
ISG
Если команда 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
Машинные коды и МЕГА-БЕЙСИК
Команды DOKE и CALL.
Мега-Бейсик позволяет включать в текст основной программы и фрагменты в машинных кодах. Мега-Бейсик занимает в ОЗУ участок памяти, начиная с адреса 45000.
Поэтому все программы в машинных кодах должны быть размещены в ОЗУ до этого адреса. Для того, чтобы записать в память двухбайтное число, можно воспользоваться командой DOKE, которая поддерживается в Мега-Бейсике. После этой команды должны быть записаны два числа: первое определяет адрес, куда записываются данные, а второе -записываемое число.
Для вызова программ в машинных кодах в Мега-Бейсике используется команда CALL_. После этой команды записывается число, указывающее адрес вызываемой подпрограммы, а затем произвольные числа, которые передаются в машинный стек и затем используются как параметры в подпрограмме.
FRONT-PANEL.
Фронт-панель позволяет пользователю вносить изменения в ячейки памяти и регистры микропроцессора путем записи шестнадцатеричных чисел и является по сути встроенным монитором Мега-Бейсика.
Фронт-панель активизируется при выполнении команды 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 - эта команда используется для очистки окон. Если записаны два числа, то первое определяет, какое из окон очищается. Если же записано одно число, то очищается текущее окно.
(Окончание следует)