Справочник программиста на персональном компьютере фирмы IBM. Клавиатура - Перепрограммирование клавиши PrtSc

ОГЛАВЛЕНИЕ

     3.2.9 Перепрограммирование клавиши PrtSc.


   Клавиша  PrtSc  выдает звездочку (ASCII 42),  если  нажать  ее
одну, она выдает  расширенный  код  114,  если нажать ее вместе с
клавишей  Ctrl.  Но комбинация <Shift> + <PrtSc> имеет совершенно
отдельный статус. Нажатие на другие клавиши заставляют прерывание
клавиатуры  помещать  их коды в буфер клавиатуры (или,  для  кла-
виш-переключателей,  записывать  их  состояние  [3.1.7]). Нажатие
клавиши не влияет на выполняемую программу, до тех пор пока прог-
рамма не станет считывать символ клавиши из буфера клавиатуры. Но
комбинация  <Shift>  + <PrtSc> заставляет  прерывание  клавиатуры
немедленно передать  управление  процедуре,  на которую указывает
вектор прерывания 5.  В некотьором смысле она работает как  аппа-
ратное прерывание.
   Прерывание  5  запрограммировано  таким  образом, чтобы выдать
содержимое  экрана на принтер.  Но вектор прерывания может указы-
вать на процедуру,  предназначенную  для  совершенно другой цели.
Например,  изощренная программа имитации, которой требуются  часы
для завершения своей работы, может  прервана в любое время комби-
нацией Shift + PrtSc, чтобы она выдала рапорт о текущем состоянии
расчетов. Вам может также захотеться, чтобы на принтер можно было
посылать копию графического экрана. Другая возможность, использо-
вать PrtSc как  способ  доступа  к  программе,  которая находится
резидентно в памяти во время загрузки MS DOS [1.3.4]. Такая стра-
тегия позволит Вам  написать  утилиту,  которая может работать из
другого программного обеспечения.
   Низкий уровень.
   Здесь приведена основная форма перепрограммирования процедуры.
Не   забудьте   восстановить   оригинальный   вектор   прерывания
(F000:FF54)  при завершении программы.  Если Вы забудете  сделать
это, то все будет идти нормально, до тех пор пока не будет нажата
комбинация Shift + PrtSc, а тогда произойдет крах системы  (более
полный пример программирования прерывания см. в [1.2.3]).

;---изменить вектор прерывания для PrtSc
   CLI                       ;запрет прерываний
   MOV  AX,SEG NEW_ROUTINE   ;получаем адрес процедуры
   MOV  DS,AX                ;
   MOV  DX,OFFSET NEW_ROUTINE   ;
   MOV  AL,5                 ;номер изменяемого вектора
   MOV  AH,25H               ;номер функции
   INT  21H                  ;изменяем вектор
   STI                       ;разрешаем прерывания
    .
    .
;---описание процедуры PrtSc
NEW_ROUTINE  PROC FAR
             STI             ;разрешаем прерывания
             PUSH AX         ;сохраняем регистры
              .
              .
             MOV  CX,100     ;Ваша процедура
              .
              .
             POP  AX         ;восстанавливаем регистры
             IRET            ;возврат из прерывания
NEW_ROUTINE  ENDP            ;