Black Crow
#04
01 сентября 2000 |
|
Программистам - Перехват IM 1
ПЕРЕХВАТ ПРЕРЫВАНИЙ 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. Вот, пожалуй, все "за" и "против". Взвешивайте и определяйтесь в своем выбо- ре. Целью этой статьи было не навязывание каких-то новых извратов для задолбаных программистов СПЕКТРУМА, а лишь ознаком- ление онных с новой, недавно обнаруженой мною, особенностью нашего любимого Спека! До встречи!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября