С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12

Залипание клавиш

19.06.2018, 22:38. Показов 3065. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Продолжаю клавиатурную тему
Есть прога, которая показывает нажатые клавиши (т.е. жмём все 4 стрелки – видим, что все 4 нажаты, отпускаем по одной, видим 3, 2, 1, 0).
Так вот, если быстро стукнуть по нескольким клавишам (по тем же стрелкам, например), получаем генерацию IRQ 1 с нажатием 4-х клавиш и следом IRQ 1 с отпусканием... не всегда 4-х, а чаще 3-х или 2-х. Соответственно, 1 или 2 клавиши продолжают отображаться как нажатые.
Причём, при запуске из-под винды (DOSBox, VMware+FreeDOS) такого нет, только в чистом DOS'е.

Но тут есть один интересный момент. При таком же быстром ударе по Ctrl, Alt и Shift происходит то же самое (что неудивительно), при этом если я делаю это в каком-нибудь Volcov Commander, то вижу, что строка с помощью по функциональным клавишам остаётся в состоянии Shift или Alt, к примеру. Но! Если я нажму на букву, то эта буква будет воспроизведена как обычная буква, без Shift или Alt. Значит, BIOS каким-то образом понимает (в момент нажатия на букву, судя по всему), что Shift или Alt всё же отпущен.
Как он это понимает?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2018, 22:38
Ответы с готовыми решениями:

Написать программу включения выключения клавиш NumLock,CapsLock,ScrollLock,Ins нажатием клавиш f1,f2,f3,f4.
Текст программы есть, но где то допущена ошибка! помогите разобраться Ход. ; В зависимости от того, какая клавиша нажата...

Залипание клавиш
Добрый день, думаю тут помогут быстрее чем ТП skype. Я инвалид и использую залипание клавиш. Для удобства я установил программу...

Залипание клавиш
Вообще создал я в OnKeyDown ветвление типо если нажать на стрелку влево то картинка начнёт двигаться влево. всё работает только есть одна...

16
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
20.06.2018, 09:24
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Jin X Посмотреть сообщение
Соответственно, 1 или 2 клавиши продолжают отображаться как нажатые.
Думаю это привязано к интервалу автоповтора, тогда и реакция на нажатия будет быстрее.
Значит винда при своём запуске перенастраивает контроллёр клавы. Под чистым досом клава работает с настройками биоса - попробуй поиграться с ними, ..а точнее скоростью автоповтора.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
20.06.2018, 11:40  [ТС]
R71MT, а причем тут автоповтор?
До автоповтора дело даже не доходит, я просто бью по клавишам, они нажимаются на сотые доли секунды.
С какими настройками можно поиграться, кроме автоповтора?

Добавлено через 2 минуты
Вообще, всё это очень странно: как будто клава не успевает сгенерить сигнал или пропускает один из-за "одновременности" двух событий (нажатия и отпускания или отпускания 2-х клавиш).
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
20.06.2018, 13:54
Цитата Сообщение от Jin X Посмотреть сообщение
До автоповтора дело даже не доходит
На сколько мне известно, от кол-ва повторов зависит скорость нажатия между соседними клавишами - Typematic delay - т.е. какое время считать началом автоповтора. так-что зависимость у них прямая, хотя нужны эксперименты.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
21.06.2018, 13:59  [ТС]
R71MT, автоповтор же – это интервал между повторной генерацией IRQ 1 при удержании одной клавиши, так?
А здесь же речь о быстром нажатии и отпускании разных клавиш.

Добавлено через 13 секунд
Или может, я не совсем понимаю твою мысль...
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
21.06.2018, 14:31
Jin X, посмотри int 16h, AX = 0305h.
у этой fn. BH = задержка, BL = частота.
т.е. она выставляет именно задержку перед тем, как начинать повторять.
если эта задержка стоит маленькая (диапазон у неё от 250 до 1000 мс), то при быстром печатании некоторые клавиши будут заикаться.
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
21.06.2018, 17:15  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
если эта задержка стоит маленькая (диапазон у неё от 250 до 1000 мс), то при быстром печатании некоторые клавиши будут заикаться
Хм... поиграюсь, спасибо за идею. Не думал, что это как-то может быть взаимосвязано!

Добавлено через 50 минут
Странно, но ax=0305h не пашет почему-то, хотя в DOSBox работает... через порты пока не пробовал.
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
21.06.2018, 22:55
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

..чтоб не плодить темы, опишу здесь некоторые детали работы подсистемы ввода,
которая состоит из трёх узлов - непосредственно клавиатура, контроллёр и процессор.

Клава механически - это двумерная матрица строк и столбцов, точки пресечения которых играют роль кнопок. В "неактивном состоянии" на выводах и строк и столбцов присутствует логическая(1), а поступающий с внутреннего м/контроллёра строб, в непрерывном режиме сканирует каждую из строк логическим(0).



При нажатии любой клавиши в момент строба, состояние соответствующего столбца меняется с высокого на низкий уровень, и адреса строки/столбца запоминаются в регистрах-защёлках м/контроллёра клавы. Периодичность опроса строк нулём, можно менять - это и есть параметр(ВН) функции автоповтора АХ=0305h INT16h - задержка перед автоповтором.

Дальше, м/контроллёр клавы по последовательному транспорту DATA передаёт защёлкнутые строку/столбец нажатой клавиши на мат.плату контроллёру клавиатуры, принципиальная схема которого выглядит так:



Получив байт по шине 'Keyboard', контроллёр клавиатуры генерит на линии(KeybINT) запрос на прерывание IRQ1, а сам в это время достатёт из своего ПЗУ/ROM соответствующий 'Scan-Code' нажатой клавиши и запоминает его в выходном DATA-буфере. После того-как APIC оповестит ЦП о прерывании, процессор считывает с шины '8-bit DATA-Bus' подготовленный скан-код и передаёт его по вектору INT-9h, обработчик которого отправляет скан в клавиатурный буфер - кому нужно, берут потом коды из этого буфера.

Первые контроллёры(ХТ) собирались на м/схемах 8042, но начиная с процессоров i80282 эти чипы стали выпускать все-кому-не-лень. Сейчас КВС работают в двух режимах - устаревшем(АТ) и современном PS/2, который поддерживает как клаву, так и мышь (см.рис.выше). Помимо основных/своих обязанностей, они имеет 2-порта(А,В) и 3-регистра с базой(60h) в системной памяти. Порты служат для приёма/передачи данных, а регистры выстроены в порядке ниже:



При работе с портами клавиатуры, открывается доступ к состоянию контроллёра и некоторым его настройкам. Так, при чтении с порта(60h) мы читаем байт непосредственно из 8-битного буфера самого контроллёра, а не то-что записал обработчик INT-9 в клавиатурный буфер в системной памяти.

На данный момент м/схему КВС как отдельную сущность уже полностью выпилили из архитектуры мат.платы, и поместили её сперва внутрь ICH, а потом и системного хаба PCH в виде модуля SIO на шину LPC. Вот как его описывают в доках:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Устройство #5. Контроллёр клавиатуры
------------------------------------
• Соовместим с i8042 (2 Кб программируемым ПЗУ и 256 байт ОЗУ);
• Асинхронный доступ к двум регистрам данных и одному регистру статуса;
• Поддержка мыши PS/2 и порта 92h;
• Поддержка режимов прерывания и опроса;
• Fast Gate A20 и аппаратный сброс клавиатуры;
• Аппаратный сброс процессора для перехода из РМ в RM;
• 8-битный счетчик привязаный к WatchDog-таймеру;
• Поддержка BCD арифметики;
• Рабочая частота 6,8,12,16 МГц.
 
SYMBOL  PIN  FUNCTION
-----------------------------------
GA20M   59   Gate A20 output.
KBRST   60   Keyboard reset. 
KCLK    62   Keyboard Clock. 
KDAT    63   Keyboard Data.
MCLK    65   PS2 Mouse Clock.
MDAT    66   PS2 Mouse Data.
GP27    62   GPIO  port 2 bit 7.
GP26    63   GPIO  port 2 bit 6.
GP25    65   GPIO  port 2 bit 5.
GP24    66   GPIO  port 2 bit 4.
4
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
26.06.2018, 14:00
Цитата Сообщение от Jin X Посмотреть сообщение
как будто клава не успевает сгенерить сигнал или пропускает один из-за "одновременности" двух событий (нажатия и отпускания или отпускания 2-х клавиш).
Скорее Volkov Commander каким-то образом пропускает. Клава по идее ничего пропускать не должна. А если и пропустит, то комп никак этого заметить не должен. Клава-же занята единственной задачей и не событийно ориентированной, когда событие можно и прозевать или подавиться большим количеством событий, а тупым непрерывным опросом клавиатурной матрицы в главном цикле. У нее число нажатий _всегда_ должно оказаться равно числу отпусканий, после того как ты перестал по клавиатуре стучать.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
26.06.2018, 14:24  [ТС]
Ethereal, в каком "главном цикле"?
И как можно определить, нажата ли конкретная клавиша, кроме как через "события" (int 9)?
Элементарное нажатие стрелки генерит 2 или 4 вызова IRQ1 подряд, ты просто не успеешь прочитать их через какой бы то ни было цикл (хотя, повторюсь, не понимаю, о каком цикле, который может выполнять BIOS, ты говоришь) и соответственно определить – левая стрелка нажата или правая.
2
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
26.06.2018, 14:51
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Думаю дело происходит так : Волков перехватывает int 9 и внутри этого обработчика перерисовывает нижнюю строку с подсказками, если нажаты Ctrl или Shift. Поскольку это делается медленно, то внутри своего обработчика 9-го прерывания Волков прерывания разрешает, то есть разрешает вложенные прерывания, но чтобы одно и то-же не делалось дважды, свой обработчик прерывания засемафоривает. Думаю когда ты стучишь по клаве происходит именно вложенное прерывание - следующее прерывание int 9 происходит в тот момент, когда Волков обрабатывает предыдущее и перерисовывает нижнюю строку. Так-что прерывается обработчик прерывания у Волкова. В итоге для BIOS никакого пропуска нажатий нет (прерываний обработано два), а вот для Волкова как раз есть (обработано одно, а второе семафор не позволил, точнее оно обработано, только по этому поводу ничего в обработчике не делалось, т.е. оно было проигнорировано из-за того, что в содержательную часть обработчика семафор не пускает). В итоге Волков отжатие Shift или Ctrl проигнорировал, хотя BIOS об отжатии знает. Что и наблюдаем.

Добавлено через 2 минуты
Цитата Сообщение от Jin X Посмотреть сообщение
Ethereal, в каком "главном цикле"?
Контроллер клавиатуры в клавиатуре - это однокристалка (микроконтроллер) 8042. В любой программе для однокристалки неизбежно есть бесконечный главный цикл.

Добавлено через 1 минуту
Цитата Сообщение от Jin X Посмотреть сообщение
И как можно определить, нажата ли конкретная клавиша, кроме как через "события" (int 9)?
Внутри однокристалки нету irq 9. Там бесконечный главный цикл по опросу порта ввода-вывода к которому подключена матрица.

Добавлено через 10 минут
З.Ы. Если бы я писал Волокава, то именно так бы и сделал. Как начал обрабатывать прерывание, так выставил бы семафор и разрешил прерывания и только по окончании обработки семафор сбросил. Если произошло вложенное прерывание, то проигнорировал бы его раз семафор выставлен. А такая организация просто предполагает игнорирование части прерываний от клавиатуры если в обработчике совершать длительные действия, а по клаве быстро-быстро стучать. А если делать без семафора, то будет еще хуже - двойное выполнение каких-то операций при вложенном прерывании и крах Волкова, если обработчик прерывания нереентерабелен. А писать реентерабельно ... да ну его, куда проще семафор поставить.

Добавлено через 11 минут
Короче, мысль такая - я предположил, что Волков не опрашивает клаву по int 16h, а обрабатывает int 9. И в итоге происходит такая петрушка, что я выше описал. По крайней мере предположение наблюдаемую картинку объясняет.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
26.06.2018, 17:38  [ТС]
Я проверил сейчас.
В прогу, которая выводит постоянно скан-код (из порта 60h) я добавил постоянный вывод содержимого памяти 40h:17h (состояние shift-клавиш). Так вот, бью по Ctrl+Alt+Shift, там показывает залипание, т.е. будто какие-то клавиши нажаты. Нажимаю на любую другую клавишу (скажем, пробел), там появляется ноль.
Так что это не глюк VC. Но как это работает, не понятно. Интересно, хоть BIOS трассируй

А зачем Волкову вообще перехватывать int 9, когда можно просто читать в холостом цикле состояние shift-клавиш из BIOS Data Area (40h:17h) и всё?
2
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 852
27.06.2018, 17:43
Цитата Сообщение от Jin X Посмотреть сообщение
А зачем Волкову вообще перехватывать int 9, когда можно просто читать в холостом цикле состояние shift-клавиш из BIOS Data Area (40h:17h) и всё?
Это также неправильно, как, например, оставлять на парковке авто со включенным двигателем на ночь. Для ПК может быть всё равно, а вот для ноута может быть критично (по питанию).
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
27.06.2018, 18:54
Цитата Сообщение от Jin X Посмотреть сообщение
Интересно, хоть BIOS трассируй
INT-9 трассировать под отладчиком бесполезно, он его перехватывает.
Например AVPUtil имеет спец.функцию трассировки прерываний, но на скрине видно, что IRQ1 он сам-же и перехватил. Поэтому только дизассемблировать биос, а там ничего путного не увидишь, т.к. это просто статика - регистры не меняются:
Миниатюры
Залипание клавиш  
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
27.06.2018, 18:55  [ТС]
Argogo, в те мохнатые годы (1994) мало кто заботился на эти темы (да и ноутбуков было мало).
Там всё равно холостой цикл крутится. Можно между опросами вставить hlt и всё, проблема решена.
К тому же, это DOS, в которой энергосбережение как таковое отсутствует. Не буду утверждать (не трассировал), но наверняка даже функции ah=0/int 16h (BIOS) и ah=1/int 21h (DOS) тупо крутит цикл (безо всяких hlt) в ожидании нажатия на клавишу...
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.06.2018, 22:15
Цитата Сообщение от Argogo Посмотреть сообщение
Для ПК может быть всё равно, а вот для ноута может быть критично (по питанию).
Аппаратная функция энергосбережения при остановке процессора впервые появилась в 80486 в последней модели DX4, да и то поначалу в багнутом виде. Было это дело в 94-м. А до этого процессоры никогда ничего не энергосберегали. Win-95 появилась в 95-м. А до этого была Win 3.x. В общем энергосбережения в MS-DOS-оскую эру не существовало и к MS-DOS-овскому программированию оно никаким боком. Только в MS-DOS 6.0 (а последняя версия у дос-а была 6.22) появился драйвер POWER.EXE, но он не был частью самой MS-DOS, а был подключаемым драйвером и в итоге сберегал всего 5%.

Ну а в итоге, я выше предложил рабочую гипотезу, она оказалась неверной. Пока у меня подозрение, что у JinX BIOS со странностями, но ... JinX, а интересно, а этот эффект под совершенно голым MS-DOS (без волчары) у тебя все равно наблюдается ?
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
30.06.2018, 10:46  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
а этот эффект под совершенно голым MS-DOS (без волчары) у тебя все равно наблюдается ?
Я попробую. И с ноута заодно.
Ну и ты попробуй
Вложения
Тип файла: zip scan.zip (888 байт, 3 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.06.2018, 10:46
Помогаю со студенческими работами здесь

Залипание клавиш
Всем привет, помогите с таким вопросом, хочу сделать глобальное залипание клавиш "Shift" и "W" как можно реализовать...

Залипание клавиш
Ребята ,помогите пожалуйста с таким вопросом: Вот проект:http://rghost.ru/39610610 Значит,вот нажмите нопку плэй(она мигает после...

Залипание некоторых клавиш
Проблема такая: время от времени происходит залипание клавиш само по себе. Например ctrl или WIN, когда в браузере прокручиваю страницу...

Включается залипание клавиш
в панели управления полностью отключено любое залипание клавиш, но к примеру когда я играю или пишу текст начинает случайно пикать клава (...

Как откючить залипание клавиш?
При пятикратном нажатии на shift появляется окошко настройки залипания клавиш мне необходимо его программно убрать. То есть мне по сути...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru