Системное программное обеспечение персональных ЭВМ


15.3. Условия активизации и обработка прерываний



15.3. Условия активизации и обработка прерываний

Два аспекта, вынесенные в заголовок этого раздела, настолько связаны между собой, что не могут рассматриваться порознь.

Мы определили, что TSR-программа должна активизироваться по нажатию "горячей клавиши". Следовательно, первым прерыванием, которое должна обрабатывать программа является прерывание 9 - от клавиатуры. Обработчик прерывания 9 в нашей программе - функция new_9. По этому прерыванию программа должна читать скан-код нажатой клавиши и состояние клавиш-переключателей и сравнивать со своей "горячей комбинацией" (в нашей программе "горячей" является комбинация Alt+1, определяемая начальными значениями переменных hot_scan и hot_status). Если опознана "горячая комбинация" то код клавиши удаляется из буфера клавиатуры, в противном случае вызывается системный обработчик прерывания 9. Но может оказаться, что немедленную активизацию TSR-программы производить нельзя. Это обусловлено тем, что функции DOS нереентерабельны. Если мы прервали выполнение функции DOS и активизируем TSR-программу, которая, в свою очередь, будет обра-щаться к функциям DOS, то это может привести к катастрофическим последствиям. Поэтому лучше всего не активизировать TSR-программу сразу же после распознавания "горячей комбинации", а отложить активизацию до тех пор, пока не будут выполнены условия, делающие активизацию возможной, а в обработчике прерывания от клавиатуры только установить признак (hot_key) того, что "горячая клавиша" была нажата. Флаг tsr_run, также анализируемый в обработчике этого прерывания, блокирует реентерабельный вызов TSR-программы: его значение 1 сигнализирует о том, что TSR-программа уже активизирована.

Проверку этих условий удобно производить по таймеру. Следовательно, второе прерывание, которое должна обрабатывать наша программа - 8 (или 0x1C) - от таймера. Обработчик прерывания 8 в нашей программе - функция new_8. При каждом прерывании от таймера проверяется прежде всего флаг hot_key.


- Начало -  - Назад -  - Вперед -