Black Crow #04
01 сентября 2000

Программистам - Перехват IM 1

<b>Программистам</b> - Перехват 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.                 
                                         
   Вот,  пожалуй,  все  "за"  и "против".
Взвешивайте и определяйтесь в своем выбо-
ре. Целью этой статьи было не навязывание
каких-то  новых  извратов  для задолбаных
программистов  СПЕКТРУМА, а лишь ознаком-
ление онных с новой, недавно  обнаруженой
мною, особенностью нашего любимого Спека!
                                         
                    До встречи!



Другие статьи номера:

Программистам - Структура программ.

Программистам - Современные программы.

Программистам - Быстрый скроллер экрана с атрибутами.

Программистам - Перехват IM 1

Программистам - Теория: передача данных на компьютере.

Очумелые ручки - Набор схем, блуждающих в сетях.

Очумелые ручки - Gigascreen для Пентагона с интерлейсом.

Белый попугай - Интернет похметолог и его полезные советы.

Белый попугай - Выйди замуж за кодера.

Белый попугай - Советы молодожёнам (продолжение).

Белый попугай - Анекдоты о Штирлице.

Раскрутка - Soft из Харькова: PiFormat,

Раскрутка - Gluk Reset Service v5.2

Раскрутка - Обзор новых системок: BGE, Best Viewer, ExHummer, Selicon Player, SlangPro, Quick Commander,

Раскрутка - Crime Santa Claus-2

Игротека - В мире NETHER World.

Игротека - Сценарии будущих игр.

Игротека - Впечатление от "Чёрного Ворона".

Игротека - Super Laser Squad.

Игротека - Потрясающий шедевр: описание игры 8-й отдел.

Игротека - Обзор игрушек: Clickmania, Japan Contrast, Smagly 3, Worm World, Демониада, Towdie, Пасьянс Пирамида.

Разное - Intel outside.

Разное - Страшилка.

Разное - Реклама.

Трибуна - Рассуждения на тему.

Трибуна - Занимательные советы.

Трибуна - Украинский национализм.

Трибуна - Pidarsoft: реакция.

Трибуна - От редакции.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Юмор - рейнджер.
Юмор - фидошные приколы.
Система - обзор системных программ: МоdernWоrd v.1.02, Нrust 2.1, МicrоEditоr 3.40, Trick v2.0, Smаll Рlаyer v1.11, Мusic Cоmрiler v1.0, ChrРrint 1.0, Text Маker v1.10.
How it was in Leningrad - Year 1992-1993. Meeting Amiga
Методы - Тут вот статья Дениса Зодченко.

В этот день...   21 ноября