Я узнаю о прерываниях и аппаратных прерываниях клавиатуры, таких как прерывание 9 (в дос).и я заметил, что если я нажму на клавишу со стрелкой (влево, вправо, вверх, вниз), то будет два последовательных прерывания.первая - это прерывание кнопки «Shift», а вторая - нажатая клавиша со стрелкой.
Я заметил это, поскольку переписал и настроил прерывание № 9 на клавиатуре для запроса кода сканирования нажатой кнопки.кнопка.
например, когда я нажму на клавишу со стрелкой вправо, я увижу, что прерывание кнопки «Shift» произошло (отображается на экране код сканирования 42), а затем клавиша со стрелкой, которую янажали (клавиша со стрелкой вправо) и отправьте прерывание (код сканирования 77).
Мой вопрос: почему это происходит?
Мой код для int 9:
void interrupt interrupt_9_Implementation{
unsigned char scanCode;
asm{
in al, 60h // read the keyboard input from port 60h ( 96 Decimal ) into al;
mov scanCode, al // save the keyboard input into 'scanCode' varaible
in al, 61h // read 8255 port 61h ( 97 Decimal ) into al
or al, 128 // set the MSB - the keyboard acknowlege signal
out 61h, al // send the keyboard acknowlege signal from al
xor al, 128 // unset the MSB - the keyboard acknowlege signal
out 61h, al // send the keyboard acknowlege signal from al
}
if( 128 > scanCode ){ // if the button is being pressed or being released. if the button is being pressed then the MSb isn't set and therfore it must be smaller than 128
printf("You pressed key assigned scan code = %d\n", scanCode );
if( EscScanCode == scanCode )
EscPressed = _True;
else
printf( "Press any key (almost)\n:" );
}
// send EOI
asm{
mov al, 20h
out 20h, al
}
}
после того, как я нажму клавишу со стрелкой (например, клавишу со стрелкой вправо), я получу:
Press any key (almost)
:You pressed key assigned scan code = 42 // the 'shift' key scan code
Press any key (almost)
:You pressed key assigned scan code = 77 // the right arrow button scan code
Пока что это происходит только с помощью клавиш со стрелками.и «Shift» не нажимается.Я использую клавиатуру Logitech Wave.