Консультация № 193759
25.10.2018, 19:18
0.00 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Подскажите литературу, или сайт, где есть полные таблицы scancode'ов с комбинациями клавиш - alt/ctrl/shif и другие + любая клавиша. в книжках по ассемблеру, есть, но не полные. то что найденно Мной в гугле http://www.ee.bgu.ac.il/~microlab/MicroLab/Labs/ScanCodes.htm? эта таблица не полная. в идеале конечно же было, если бы существовала какая либо зависимость между номерами сканкодов, что бы на ходу можно было вычислить его. так как таблица не полная. даже не заморачивался с зависимостями. Хотя конечно же вывод сделан такой, что если нажат alt+w то скан код будет как у w, видимо что бы не придумывать новые значения. но видимо при комбинации с ctrl надо полагать будет другой код. Подскажите пожалуйста.

Обсуждение

давно
Старший Модератор
31795
6196
27.10.2018, 11:44
общий
Адресаты:
1)Какая цель - знание этой таблицы?
2)Как читаете скан-коды?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402218
66
27.10.2018, 12:27
общий
29.10.2018, 10:27
Здравствуйте.
2) считывание скан-кода
start:
.....
mov ah,1h
int 21h
cmp al,0 сравнение если нажата клавиша за которой не закреплено отображаемого символа.
je getscancode
.....
.....
getscancode:
mov ah,8
int 21h
cmp al,3bh
......
1) уверен Вы лучше знаете практична ли она, и видимо раз Вы спросили, она скорее всего не так уж и часто используется? Я интересовался для того что бы можно было быстро ориентироваться, хотя случая для этого не было. Так что основная цель, это, пока что, познавательная. Сделаю картинку подобную ascii.
давно
Старший Модератор
31795
6196
29.10.2018, 13:31
общий
Адресаты:
Если бы Вам нужно было обрабатывать комбинации нажатых клавиш, то тут больше подходит свой обработчик контролера клавиатуры. При изменении состояния клавиатуры(нажата/отпущена клавиша) будет вызван обработчик контролера клавиатуры. Вам нужно, только само событие клавиатуры. Все остальное пусть обрабатывает старый обработчик.
Читается порт контролера клавиатуры: старший бит - нажата/отпущена клавиша, биты 0-6 код клавиши на клавиатуре. Ставите массив 128-мь байт(биты 0-6 номер клавиши), если клавиша нажата записываете в него 1, если отпущена 0. Вся обработка выглядит так
[code lang=asm] mov al,keyMass[LCtrl]
and al,keyMass[LShft]
and al,keyMass[W-key]
jz next0
;Left-Control + Left-Shifr + W-key(она же ц,Ц,w)

. . .
next0: mov al,keyMass[LCtrl]
and al,keyMass[LAlt]
and al,keyMass[D-key]
jz next1
;Left-Control + Left-Alt + D-key(она же В,в,d)[/code]
Такой вариант больше подходит для игровых движков, когда одновременно может быть нажато несколько клавиш.

Вы используете функцию DOS, и она отображает скан-код, уже после обработки BIOS'ом, DOS'ом и возможно KEYRus'ом(драйвер-русификатор). Т.е. достоверность этого скан-кода под вопросом. Кроме этого есть разные типы клавиатур, и скан-коды отличаются для стрелок, для Num-Pad и остальных дополнительных клавиш.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
03.11.2018, 13:22
общий
это ответ
Здравствуйте, Kdsfofwe21!

Чтобы Вам понять логику образования скан-кодов, которые делают BIOS -DOS, Вам нужно понять всю цепочку, как все происходит.

Нажимается клавиша на клавиатуре, контролер сообщает об этом событии, с помощью IRQ1(
int 09h). Получив это прерывание, процессор читает порт клавиатуры(60h), сбрасывает контролер клавиатуры(порт 61h), анализирует, что было нажато, до этого, т.е. CTRL, ALT, SHFT, NumLock и т.д., это все фиксируется BIOS'ом -DOS'ом, в системных переменных 0х0040:0х0017(байт состояния клавиатуры), 0х0040:0х001А(голова очереди буфера клавиатуры) и 0х0040:0х001С(хвост очереди буфера клавиатуры), заносит в хвост буфера клавиатуры скан-код и полученный символ(к примеру: "Ф"-"ф"(ru)-"A"-"a"(en)). Сбрасывает аппаратное прерывание.

Функции ввода BIOS -DOS читают символ и скан-код из буфера клавиатуры и выдают его в качестве результата.

Самым оптимальным вариантом будет - написать свой не большой обработчик клавиатуры, который прочитает код нажатой клавиши, проанализирует старший бит(нажата или отпущена) и запишет нужное значение(0/1) в массив из 128 байт, а потом передаст управление старому обработчику. В программе поиск сочетания клавиш будет в виде:
[code lang=asm]next0: mov al,keyMass[LCtrl]
and al,keyMass[LAlt]
and al,keyMass[D-key]
jz next1
;Left-Control + Left-Alt + D-key(она же В,в,d)[/code]

Удачи!
5
спасибо
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа