ГЛАВА 7
РАСШИРЕННЫЙ БЕЙСИК С ИНТЕРФЕЙСОМ 1
ВУТРИ БЭЙСИКа
При добавлении ИНТЕРФЕЙСА 1, любая команда БЕЙСИКа,
не прошедшая проверки на синтаксис СИНКЛЕРа, обычно возвра-
щается в программу обработки ошибок по адресу, содержащемуся в
новой системной переменной "VECTOR". Она может быть изменена
для указания адреса в ОЗУ. Это позволяет написать программу,
осуществляющую проверку и влияющую на команды, для обработки
которых она была написана. Перед тем, как использовать эту воз-
можность, необходимо понять метод проверки строк с тем, чтобы
добавленная программа могла делать аналогичные действия. Как
только нажата кнопка "ENTER", при вводе строки на БЕЙСИКе во
входной буфер, вызывается интерпретатор ПЗУ. Он обрабатывает
строку, но не выполняет команд, т.к. флаг синтаксиса (бит 7 в
"FLAG") сброшен. Если есть какая-либо ошибка, то об этом сигнали-
зируется символом "?" и ошибка должна быть исправлена до того, как
строка включена в программу.
Этот же процесс осуществляется и во время выполнения, но т.к.
флаг синтаксиса активен, команда выполняется. Помните, что когда
бы ни использовалась программа ОЗУ как часть интерпретатора
БЕЙСИКа, 8К ПЗУ будет подключена. В обеих ПЗУ есть программы
проверки флага синтаксиса и возврата в вызывающую программу во
время выполнения. Это очень полезно при добавлении любых команд
(смотри примеры в конце этой главы). Основные критерии для про-
верки синтаксиса даны ниже, а процедуры ПЗУ использовались на-
столько, насколько это было возможно. Адрес строки, в которой
синтаксис нарушен, будет размещен в системной переменной
"CH_ADD" до тех пор, пока используется ПЗУ, а затем из ОЗУ
вызывается расширенная программа проверки синтаксиса. Вследст-
вие этого очень важно быть уверенным, что первая строка расширен-
ной команды БЕЙСИКа не соблюдает нормальный синтаксис. Если
это не так, интерпретатор начнет исполнение и будет практически
невозможно восстановить контроль. По этой причине наиболее про-
сто использовать неалфавитный символ в начале дополнительной
строки, что выводит систему из режима «К» или режима команд,
гарантируя нарушение синтаксиса. Символы "*" и "!" подходят для
этого как нельзя лучше. Первое, что нужно проверить - строки
команд. Это делается поочередной загрузкой строк и поиском конца
рассматриваемой строки. Программа 16К ПЗУ в 24 (18Ю загрузит
строку в регистры. Программа с 32 (20Ю запросит следующую строку
и нарастит "CH_ADD" на единицу. Далее каждая строка может быть
проверена и, -если она некорректна, то вызывается обработчик оши-
бок переходом к исходному "VECTOR", адрес которого изначально
был 496 (lFOh). Далее:
1) Если затем идет численное выражение, может быть применена
16К подпрограмма с 7298 (1С82Ю. Если нет, то это приведет
к ошибке. При выполнении программа поместит значение
на стек калькулятора.
2) Если далее идут два численных выражения, разделенных за-
пятой, можно использовать программу 16К ПЗУ с 7290
(1С7АЮ. Она работает как и предыдущая, но при выполне-
нии помещает на стек оба значения.
% ......
3) Если далее идет строковое выражещ|&:1(шбо в кавычках, либо
со знаком доллара), то может быть применена программа
16К с 7308 (1С8СЮ. Опять-таки она рабШё*Йахпредыду-
щая, но генерирует ошибку, если это не строка^Вовремя
выполнения на стек помещаются параметры строки; как
описано в конце главы 8. Примечание?; .во всех трех приве-
денных выше программах первый код Щеяиваемяш выра-
жения должен быть в регистре «А» "й пф^ вызовом
"CH_ADD" должна содержать его адрес. После оценки ре-
гистр «А» будет содержать первый: j: вдущий после выра-
жения, a "CH_ADD" его адрес; При йсйользошшии симво-
лов переменных в оцениваемых выражениях допустимы
математические действия. Это можно использовать при на-
хождении параметров передгёшшх.;. Например выражение
A*(B+(C/(D+E))) будет вычислеш; ::а::результат помещен
на стек во время выполнения.
Когда оценка завершена, "СЩ^ЛАбЗ (5B7h)Tr проверит наличие
конца строки (код двоеточия или возврата: каретки 13 (ODh)) и осу-
ществит либо возврат к интерцретатору (для: проверки синтаксиса),
либо к вашей программе (для в&шолнения);; если конец строки най-
ден. Если он не н^вден - генерируется ошибка. При выполнении
ваша программа и ёшльзует команды, берущие информацию со стека
калькулятора, а затем возвращается к интерпретатору через команду
"JP 1473 (5С1Ю". "СН^АШЗ'-Нуказывает на следующую строку для
интерпретации.
Для демонстрации расширения'команд следующая программа
создает ICALL NN и !FRE. ICALL NN вызывает программу в машин-
ных кодах по адресу;после "ICALL".
IFRE ВЫЧ1*|пяе;|ШЩ СВОБОДНОЙ ПАМЯТИ.
JiiCALLRST
24 tmop, символа
JR ШШШО^ ;если не разрешен - ошибка
CALL ::.....^ввод следующего символа
CP "С" С
JR NZ,!FRE ;если нет, переход к про-
;верке, может быть это iFRE
CALL NEXT_CH
CP "A" ;каждый символ проверяется,
JR NZ,ERROR гесли нет совпадения, то
;просмотр продолжается
CALL NEXT_CH
CP "L"
JR NZ,ERROR
CALL NEXT_CH
CP L"
JR NZ,ERROR
JR ISCALL ;если дошли досюда - все
;слово совпадает
1FRE CP "F" ;то же самое для IFRE
JR NZ,ERROR
CALL NEXT_CH
CP " R"
JR NZrERROR
CALL NEXT_CH
CP "E"
JR NZ,ERROR
CALL NEXT_CH
JR ZrISFRE ;это !FRE
ERROR JP 496 ;обычный указатель
ISCALL CALL NEXT_CH
RST 16
DEFW 7298 ;оценивает следующее
;выражение как численное. -Если не так
; ошибка. При выполнении значение
;помещается на стек калькулятора.
CALL 1463 ;проверяет конец оператора
;на БЕЙСИКе
RST 16 ;делает возврат только
;при выполнении
DEFW 11682 ;помещает в "ВС"гсм.Главу 8
JR CrERROR ;перенос устанавливается,
;если больше 65535
LD (DESTKBC ; адрес для вызова RST 16
DEST DEFS 2 ; он помещается сюда
JR FINIS ;16К ПЗУ подключена при
;выполнении вызванной процедуры
ISFRE CALL 1463 ;это при синтаксисе
LD HL,00 ;очистим HL
ADD HLrSP ;добавим адрес в SP
LD DEr(23653) ; это STKEND
SBC HLrDE ;из адреса в SPr дает сво-
бодную память для БЕЙСИКа
PUSH HL
POP ВС ;результат теперь в ВС
RST 16
DEFW 11563 ;помещаем;:на стек BCr
; см • Главу:;
RST 16
DEFW 11747 ;выводит значёнйё::::на стек
FINIS JP 1473 ; возврат в БЕЙСИК i ii
NEXT _СН RST 16
DEFW 32 программа №ЕХТ_СН из ПЗУ
AND 223 ;обращение к;::вышеприведен-
;ному случаю :iRElj:::::::::;::::::np:
Обычно команды или функции расширенною БЁЙСИКа завер-
шаются переходом к основному интерпретатору как указано выше,
что очень важно, т.к. это 8 К ПЗУ, которая ^подключается, когда
делается этот переход, в противном случае пдощшод.ломается.