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