Помощь - Поиск - Пользователи - Календарь
Полная версия: прерывания
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Catty
Осуществить коррекцию прерывания Int 9 (от клавиатуры)
так, чтобы:
а) выполнялись все действия системного обработчика данного
прерывания;
б) при нажатии одной из клавиш-переключателей вывести на эк-
ран название этой клавиши.
клавиша-переключатель:
Печать копии экрана. Генерируется при нажатии на кла-
виатуре клавиши PrtScr. Обычно используется для печати
образа экрана. Для процессора 80286 генерируется при
выполнении машинной команды BOUND, если проверяемое
значение вышло за пределы заданного диапазона.

:flowers:
Altair
Catty , вот тебе для коррекции int9h, (программа Volvo).
Она работает но PrtScr ей не поймаешь, потому что в порт не пишется эта клавиша..


Код
uses dos, crt;
Var
 wasPrtScr: boolean; {признак нажатия принтс скрина}
 do_exit: boolean;{признак нажатия esc}
 Old_09: Pointer; {указатель на старую процедуру обработки}
 KbdIntVec: procedure;{процедура  - старый обработчик прерывания}

{$f+}
Procedure New9; Interrupt; {новая процедура обработки прерывания}
 Var
   Scan: Byte;{скэн код клавиши}
 Begin
   Scan := Port[ $60 ]; {читаем скэн код из порта клавы}

   { вот тут должна быть проверка на скэн-код PrtScr }
   wasPrtScr := (Scan = $14); {это не работает}

   do_exit := (scan = $01); { Это - Escape }
  { If wasPrtScr Then
   Else} Begin
     Inline( $9C );  {сохраняем регистры}
     KbdIntVec; {вызываем стандартный обработчки}
   End;
 End;
{$f-}

var
k:byte;

BEGIN
 GetIntVec($9, @KbdIntVec); {получаем вектор прерывания}
 GetIntVec($9, Old_09); {и указатель}
 SetIntVec($9, Addr(New9)); {ставим свой обработчик}

 repeat
   if wasPrtScr then
     begin
       writeln('Print Screen pressed');
       wasPrtScr := false;
     end;
   if keypressed then {нажата клавиша}
     begin
       k:=ord(readkey); {читаем клавишу}
       if k=0 then begin k:=ord(readkey); writeln('ext: ',k) end else  writeln(chr(k));
     end;
 until do_exit;

 SetIntVec($9, Old_09); {ставим старый вектор прерывания, убирая свой}
END.


Я тут посмотрел, и нашел как отличить CTRL+ALT+DEL..
вот так:
Код
procedure MyInt9; far; assembler;
asm
  push  ax
  in    al,60h
  cmp   al,53h {Є« ўЁи  Del}
  jne   @Exit
  push  ds
  xor   ax,ax
  mov   ds,ax
  mov   al,ds:[417h]
  and   al,0Ch
  cmp   al,0Ch {Ctrl+Alt ?}
  jne   @No
  in    al,61h
  mov   ah,al
  or    al,80h
  out   61h,al
  xchg  ah,al
  out   61h,al
  mov   al,20h
  out   20h,al
  pop   ds
  pop   ax
  iret
@No:
  pop   ds
@Exit:
  pop   ax
  push  seg JmpFar
  push  Offset JmpFar
end;

А клоню я к тому, что тебе к нашим ассемблерщикамнадо smile.gif
Catty
Ой спасибо Олежик! А можно какие то комментарии понаписывать, а то мне ёё всё таки объяснять надо преподу! :flowers:
Altair
Да не мне спасибо, а volvo! smile.gif
коменты напишу щас smile.gif
Altair
сделал.... читай тот пост
Catty
Спасибо ребята! Только вот вопрос, а почему прога ничего не выдает????
Ты говорил тут что-то не срабатывает?
Altair
как это не срабатывает? на нажатия принт скринатолько не срабатывает. Все остальное по заданию.
volvo
Catty,
попробуй вот эту программку (понажимай Ctrl, Alt, левый и правый Shift ...) Для выхода - Escape...
Catty
спасибо Volvo :flowers:
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.