lim
Р а зд е л З
1*1111
Д И А Л О Г П Р О Г Р А М М И С Т О В
вызывается через JP, а не через CALL).
ABORT:
LD А, (ГУ)
LD (EXCNUM),A
RST 8
EXCNUM:
DEFB0
Идея этих подпрограмм была предложена К.Вышемирским и реа-
лизована автором. Позже эти подпрограммы были обнаружены в
ПЗУ “Spectrum”.
Рассмотрим конкретный пример использования исключений.
Пусть нужно вывести строку символов по адресу DE длиной ВС в по-
ток 2, то есть в верхнюю часть экрана. В процессе вывода возможно
прерывание пользователем по нажатию BREAK в ответ на запрос
Scroll? (исключение номер 12; генерируется драйвером канала S).
Также могут произойти исключения: Out of screen (номер
4)
, Invalid
Color (номер 19). Два последних исключения будем полагать про-
изошедшими либо по вине программиста, либо по вине пользовате-
ля, предложившего “ненормальную строку”. В любом случае они об-
рабатываются не здесь, а распостраняются по программе. Пусть мы
хотим не допустить прерывания программы по BREAK:
;Печать строки DE/ВС в потоке 2 с предохранением от BREAK
STRWRT:
ЕХХ
LD А, 2
;эти регистры нам еще пригодятся
CALL #1601
;текущий поток 2
LD DE,STRESS
;обработчик исключений
CALL MARK
•»создаем новый стек и
устанавливаем обработчик
EXX
;возврат регистров
CALL #203C
;вывод строки — здесь может
•»произойти исключение,
:тогда управление будет
;передано на ЗТИЕИИ
CALL UNMARK
;возврат старого стека
RET
успешное завершение
обработка исключений
STRERR:
CALL UNMARK
; возврат старого стека
LD A, 12
; номер исключения, которое
; перехватываем
CP (IY)
;ЕггМг — исключение, которое
произошло
RETZ
;да — игнорируем, исключение
; 12, вывод текста прекращен
JP ABORT
;нет — распостраняем ошибку
дальше
Теперь можно создать новый уровень программы: модуль выво-
да строки с перехватом исключений, вызванных ошибочными уп-
равляющими кодами в строке. Допустим, в случае появления та-
ких кодов нужно выдать звуковой сигнал и вернуться к подпрог-
рамме-предку.
;Печать строки DE/ВС в потоке 2 с предохранением от BREAK,
;а также с перехватом исключений 4, 19.
STRWR2:
ЕХХ
LD DE.STRER2
CALL MARK
ЕХХ
CALL STRWRT
CALL UNMARK
RET
;ранее написанный модуль
BEEPER:
EQU #3B5
;адрес подпрограммы
управления динамиком
; обработчик исключений
STRER2:
CALL UNMARK
LD A, (IY)
LD HL, 100
LD DE, 120
;параметры для Beeper
CP 4
;если это исключение 4 или 19,
JP Z,BEEPER
;то переход к Beeper
СР 19
JP Z,BEEPER
IP ABORT
;иначе — дальнейшее
распостранение ошибки
Примечание: вообще-то, чтобы завершить подпрограмму, устано-
вившую обработчик по исключению, обработчик должен размаркиро-
вать стек и передать управление “предку предка” командой RET. Но в
данном случае мы хотим перед этим выдать звуковой сигнал, т.е.
CALL BEEPER
RET
Легко видеть, что этому соответствует более простая запись:
JPBEEPER
Итак, любая подпрограмма, вызвавшая STRWR2, никак не заметит,
что произошли указанные выше исключения, чего и требовалось до-
биться в этом примере. По нажатию пользователем клавиши BREAK
вывод будет просто прерван, а при появлении неверных управляющих
кодов в строке, кроме прерывания вывода, будет дан звуковой сигнал.
Еще один пример использования исключений. Пусть в текстовом
редакторе реализованы модули копирования и удаления блока. Тре-
буется кратчайшим путем реализовать команду переноса блока, т.е.
копирования его в новое место и удаления старого экземпляра. По-
нятно, что придется учесть состояния: блок не отмечен, нет места
для копирования.
Вариантов реализации такого учета два. Первый заключается в
том, чтобы каждая подпрограмма выдавала флаг или код заверше-
ния. Это требует множества проверок после каждого вызова такой
подпрограммы, что ведет к разрастанию программы и к ошибкам.
Второй вариант, который мы сейчас рассмотрим — использование
механизма исключений.
Создается подпрограмма копирования блока COPY, которая завер-
шается нормально или через одно из исключений: 1
— “блок не отме-
чен” и 2 — “нет памяти для копии”, генерируя их командой RST 8.
Аналогично создается подпрограмма удаления блока
DELETE, которая может завершиться с исключением 1 (“блок
не отмечен”).
Основной цикл текстового редактора, который опрашивает клави-
атуру и запускает соответствующие подпрограммы, устанавливает
свой обработчик исключений, который осведомляет пользователя об
ошибках методом, принятым в данном редакторе.
В такой ситуации подпрограмма переноса блока становится край-
не простой:
MOVE:
CALL COPY
JP DELETE
Все особые ситуации оказываются учтенными как бы автоматиче-
ски.
А вот как бы выглядела эта подпрограмма при использовании ко-
дов или флагов завершения:
MOVE2:
CALL COPY
JP С,no block
;не отмечен блок
JP Z,out of memory недостаточно памяти
CALL DELETE
JP C,no block
;не отмечен блок
RET
Забавно отметить, что механизм исключений, существующий в
“ZX-Spectrum” с 1982 года, появился в компиляторе Borland С++
только в этом году в версии 4.0. Это, кстати, подтверждает эффек-
тивность и современность технологии исключений.
Заинтересованные лица могут писать автору по адресу, указанно-
му в начале статьи.
linn ш ни I я«in ini
11
и и на I наш ими
««111
11
it яш
НОВЫЕ ПРОГРАММЫ ДЛЯ ZX-SPECTRUM:
.
Текстовый редактор (4 языка в одном файле);
Система управления электронной картотекой (аналог MS
CfulFile).
Пришлите конверт с обратным адресом:
257010, Украина, г. Черкассы-10, а/я 1529, Б.Курицыну.
I lllllllllllllllflllllllllllllllllflllllllllllllllllltllH
Радиолюбитель 10/94
предыдущая страница 14 Радиолюбитель 1994-10 читать онлайн следующая страница 16 Радиолюбитель 1994-10 читать онлайн Домой Выключить/включить текст