Справочник программиста на персональном компьютере фирмы 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 ;