2014-11-30 2 views
0

Есть ли какое-либо значение или код, который я могу использовать для перехода к другой процедуре, когда нажата клавиша?Как прыгать, если клавиатура не нажата.

cmp ah,(value of no pressed key) 
je (next procedure) 

или есть прерывание можно использовать так, что, если он видит, что не существует ни одна клавиша клавиатуры нажата она будет UMP к следующей процедуре?

ответ

1

Примера с опросом клавиатуры состояния контроллера регистр:

in al,64h ; get status register 
test al,1 ; output buffer 
je NOKEY 
;----------- 

;----------- 
NOKEY: 

http://wiki.osdev.org/%228042%22_PS/2_Controller

Редактировать: В этом примере мы проверяем только первый бит байта состояния и, если он установлен, то выходной буфер заполняется одним или несколькими байтами, которые мы можем получить из порта данных (60h) со следующими инструкциями (портами) порта.

Дополнительно мы можем проверить байт состояния, если байт (ов) происходит от PS2-мыши (перемещение или щелчок мышью):

test al,20h 
jne NOKEY 

Edit 2: Байты, что мы можем получить из данных порт 60h - это так называемые «scancodes», и их можно разделить на make-коды, если нажата клавиша, тормоза-коды, если клавиша освобождена, и коды дополнительного кода связи.

http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html#ss1.1

Клавиатура службы прерываний (ISR) можно использовать IRQ1 и если IRQ1 произойдет, то он просто должен прочитать от IO Port 60h (нет необходимости проверять бит 0 в статусе Регистрируйте сначала, потому что мы знаем, что данные поступают из первого PS/2, если мы получаем IRQ1), переводим и эхо ASCII или что-то еще, отправляя EOI контроллеру прерываний и, наконец, возвращаемся из обработчика прерываний.

Но приведенный выше пример предназначен только для того, чтобы показать, как опросить порты клавиатуры. И для этого мы должны разогнать IRQ1 раньше, чтобы предотвратить, чтобы работающая клавиатура ISR получала байты выходного буфера порта данных 60h, прежде чем мы сможем это сделать.

+0

... однако это будет работать, только если прерывание клавиатуры отключено. В противном случае в регистре состояния всегда указывается «отсутствие данных ключа», потому что прерывание клавиатуры удалит все данные ключа с контроллера. –

+0

cli mov al, 2 out 21h, al sti –

0

Заменить:

test al, 1 
je nokey 

по:

or al, al 
jz nokey 

Таким образом, ваши программа проверяет, является ли регистр фактически равен нулю. Использование «test al, 1» будет проверять, не является ли ваш номер нечетным.

+0

Это не ответ на вопрос и как комментарий к ответу Дирка ** неправильно **. 'test al, 1' проверяет бит0. 'или al, al' проверяет все биты. См. Значение бит [здесь] (http://stanislavs.org/helppc/8042.html). – rkhb

0

Вы можете прочитать ввод с порта 60h. Если нажата клавиша AT MOMENT, порт будет содержать номер (а не код ascii) ключа. Иначе он равен нулю. Другой способ - использовать функцию ah = 1 из BIOS interupt 16h. Если нажата клавиша, которая не была прочитана, код ascii находится в al и scancode в ah. Если нажата клавиша, ZeroFlag не установлен, если не было нажата клавиша ZeroFlag. Если ключ не был нажат, тог не содержит полезного значения. После вызова этой функции буфер не будет очищен. Если пользователь нажал две клавиши, первый ключ будет считан первым. Другим способом является функция ah = 0bh DOS-прерывания 21h. Al будет 0, если не было нажата клавиша. al будет 255, если был нажат ключ.

+0

Что такое прерывание в 60h? –

+0

это не прерывание 60h, это порт 60h. С помощью «in al, 60h» вы можете прочитать scancode (scancode не ascii-код) ключа, который нажат в этот момент. –

+0

Порт 60h, кажется, содержит код последней нажатой или отпускаемой клавиши; это не 0, если не нажата ни одна клавиша (согласно информации в ws.exe osdev. Также невозможно проверить, нажата ли клавиша, просто прочитав порт 60h, коды «make» и «break» должны интерпретироваться проверьте, нажата ли клавиша! –

Смежные вопросы