(* Пример 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.
Hosted by uCoz