нажатие на клавиши стрелок снимает два прерывания клавиатуры?(int 09h) - PullRequest
1 голос
/ 21 марта 2012

Я узнаю о прерываниях и аппаратных прерываниях клавиатуры, таких как прерывание 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.

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Ваш номер включен.

Вы фактически не распечатываете все коды сканирования, которые получаете.Вы печатаете только тогда, когда код меньше 128. Тем не менее, код сканирования может предшествовать 0xE0, чтобы указать расширенный код.

Microsoft имеет довольно хорошую запись накоды сканирования клавиатуры, которые имеют следующее описание:

                  Base Make   Base Break
Right Arrow       E0 4D       E0 CD
...
Num Lock ON       Precede Base            follow Base Break
                  Make code with          code with
Final Key only    E0 2A                   E0 AA

Итак, что вы на самом деле получаете, так это последовательность клавиш:

E0 2A E0 4D

Поскольку ваш код не печатает ничего выше 128(0xE0 - 224), вы видите отпечатки только для 0x2A (42) и 0x4D (77).

0 голосов
/ 21 марта 2012

Согласно http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html:

1.7 Added non-fake shifts

On my 121-key Nokia Data keyboard there are function keys F1, ..., F24, where F1, ..., F12
send the expected codes 3b, ..., 58, and F13, ..., F24 send the same codes together with
the LShift code 2a. Thus, F13 gives 2a 3b on press, and bb aa on release. Similarly, there 
are keys with added LCtrl code 1d. But there are also keys with added fake shifts e0 2a.

Delorie reports that the "Preh Commander AT" keyboard with additional F11-F22 keys treats 
F11-F20 as Shift-F1..Shift-F10 and F21/F22 as Ctrl-F1/Ctrl-F2; the Eagle PC-2 keyboard 
with F11-F24 keys treats those additional keys in the same way.

Это не совсем то, что вы описываете, но проливает некоторый свет на довольно странное поведение.Я бы сказал, попробуйте другую клавиатуру и посмотрите, что произойдет.

(я думаю, что это скорее комментарий, а не ответ, но я не вижу поле для комментариев ...)

...