ПЕРЕХВАТ ПРЕРЫВАНИЙ 1=ГО РОДА
(С) 19.02.2000 by Dr.Lion/RSM
-----------------------------------------
Сразу должен сказать, что я еще нигде
не видел информации о таком методе орга-
низации прерываний. Так что все автоские
права пренадлежат мне, т.е. Dr. Lion`у.
Суть метода заключается в следующем.
Есть такая интересная штука, как ПЗУ 128-
го бейсика, над которой сейчас всячески
извращаются, прошивая вместо него всякие
там Real Comander, NEOS и т.д. Так вот, в
ней сидит редактор BASIC 128, который для
чтения клавиатуры и инкремента системных
часов использует все тот же обработчик
прерываний из ПЗУ BASIC 48. При этом выб-
раным режимом прерываний является IM 1.
Сразу же возникает вопрос: А как же BASIC
128 запускает стандартный обработчик пре-
рываний из ПЗУ BASIC48? Давайте через STS
взглянем на процедуру обработки прерыва-
ний в ПЗУ 128-го BASIC`а:
#0038 PUSH HL ;сохраняем HL.
LD HL,#0048;адрес возврата в ПЗУ
PUSH HL ;BASIC 128.
LD HL,#5В00;адрес процедуры пере-
PUSH HL ;ключения страниц ПЗУ
LD HL,#0038;адрес вызываемой про-
PUSH HL ;цедуры в BASIC 48.
JP #5В00 ;собственно вызов.
#0048 РОР HL ;выход из обработчика
RET ;прерываний.
Что мы видим? Запуск стандартного обра-
ботчика прерываний происходит через рези-
дент, находящийся в буфере принтера по
адресу #5В00!!! Этот резидент инвертирует
4й бит #7FFD (страница ПЗУ) и делает RET.
Т. к. он находится в ОЗУ, то мы имеем ре-
альную возможность извращаться над ним.
Получается, что перехват прерываний из
ПЗУ 128-го бейсика в режиме IM 1 заключа-
ется в записи по адресу #5В00 команды JP
INTDRIV, где INTDRIV является адресом ва-
шего обработчика прерываний. Сам обработ-
чик должен быть приблизително таким:
INTDRIV DEC SP:DEC SP;корректируем стэк,
DEC SP:DEC SP;снимая лишние PUSH.
DEC SP:DEC SP;можно три РОР HL.
PUSH DE ;сохрамяем остальные
PUSH ВС ;регистры, при этом
PUSH AF ;HL уже сохранен!
... ;процедуры.
РОР AF ;восстанавливаем ре-
РОР ВС ;гистры и выход.
РОР DE
РОР HL
EI:RET
Вот и всё! У этого метода есть масса пре-
имуществ перед традиционным образом орга-
низации прерываний, а именно:
1. Не нужно создавать таблички векторов и
расчитывать адреса обработчика.
2. Ваш обработчик прерываний может сидеть
по любому адресу в ОЗУ.
3. Перед входом в TR-DOS не нужно запре-
щать прерывания командой DI.
4. Включать/выключать обработчик прерыва-
ний можно путем сброса/установки 4-го
бита порта #7FFD (вот где извращение;)
А теперь об недостатках:
========================
1. Если ПЗУ BASIC 128 не содержит по ад-
ресу #0038 обработчика, приведенного выше
то перехватчик работать не будет.
2. От возникновения прерывания до запуска
обработчика проходит приблизительно 100
тактов :(
3. Необходимость следить за состоянием 4-
го бита #7FFD. Для работы обработчика он
должен быть сброшен в 0.
Вот, пожалуй, все "за" и "против".
Взвешивайте и определяйтесь в своем выбо-
ре. Целью этой статьи было не навязывание
каких-то новых извратов для задолбаных
программистов СПЕКТРУМА, а лишь ознаком-
ление онных с новой, недавно обнаруженой
мною, особенностью нашего любимого Спека!
До встречи!
Other articles: