Цитата Сообщение от asve79 Посмотреть сообщение
Barmaley_mВ модуле работы с клавиатурой есть код:
Физический смысл его это ожидания нажатия на клавишу, код которой в ULBUF, пришедший в буфер из ф-ции прерывания?
Да, смысл данного кода - это ожидание нажатия на клавишу. В данном драйвере используется буфер клавиатуры, в который подпрограмма INTKEY, работающая по прерываниям, помещает коды клавиш по мере их нажатия. Если подпрограмма CONIN (ожидание нажатия на клавишу) долго не вызывалась - то в буфере может быть несколько кодов. Они будут по одному извлечены из буфера за несколько вызовов CONIN. Переменные ULBUF и USBUF - это не коды клавиш, а указатели в пределах буфера. Сам буфер расположен в области памяти BUFKLA.

Устройство буфера - типичный кольцевой буфер (Ring buffer, Circular Buffer). Имеется два указателя - один на запись, второй на считывание. Тот, который на запись, изменяется только по прерываниям. Тот указатель, который на считывание, изменяется только в подпрограмме CONIN.

Замечу, что эта функция составлена неэффективно. Вероятно, авторы драйвера (и я в 1996г) не понимали, что кольцевой буфер относится к структурам данных с возможностью неблокирующего доступа (Lock-free data structure). Если подпрограмма CONIN составлена грамотно - то неважно, в каком месте она может быть прервана прерыванием, её работа будет в любом случае корректной. Иными словами, можно таким образом изменить функцию CONIN, чтобы в ней не надо было запрещать прерывания. Это устранит вероятность пропуска прерывания и сделает работу системы более отзывчивой.

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