Страница 20 из 26
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 ;
|