(* Пример 4. Резидентная программа, которая при
нажатии клавиш Ctrl-Alt генерирует звук *)
{$M 3000,0,3000} (* Резервирование памяти *)
uses crt,dos;
program resident_example (input,output);
var
i:word;
ch:char;
int9:procedure;
logr:boolean;
{$F+}
(* РЕЗИДЕНТНАЯ ЧАСТЬ ПРОГРАММЫ *)
procedure pressbutton(flags,CS,IP,AX,BX,CX,DX,SI,DI,ES,DS,BP:word);interrupt;
var
b:byte;
i:word;
begin
inline($9c); (* Имитация прерывания (PUSHF) *)
int9; (* Вызов системной обработки *)
b:=mem[$0000:$0417]; (* Чтение флагов клавиатуры *)
if ((b and 12)=12) and (logr) then (* Проверка нажатия Ctrl-Alt *)
begin
logr:=false;
i:=500;
while i<=1000 do (* Программирование динамика *)
begin
sound(i);
delay(1);
inc(i,20);
end;
nosound;
logr:=true;
end;
if (b and 5)=5 then (* Проверка нажатия RightShift-Ctrl *)
setintvec($9,addr(int9)); (* Восстановление захваченного вектора *)
end;
(* Возврат управления *)
{$F-}
(* ВСПОМОГАТЕЛЬНАЯ ЧАСТЬ ПРОГРАММЫ *)
begin
getintvec($9,@int9); (* Сохранение вектора 09H *)
setintvec($9,addr(pressbutton)); (* Установка вектора 09H *)
logr:=true; (* Инициализация внутренней переменной *)
keep(0); (* Выход с сохранением памяти *)
end.
|