Думал в какой раздел поместить данную тему и решил в этот, все таки эта тема намного ближе к ассемблеру. Хотя я думаю, что администраторы простят меня за то, что я привожу примеры кода на 'C', т.к. код на 'C' более понятен и в меньшей степени затеняет смысл самого вопроса чем код на ассемблере.
Есть такая функция обрабатывающая прерывание от клавиатуры (IRQ 1):
void irq_keyboard(void)
{
char scan,tmp;
/* получаем сканкод */
scan = inb(0x60);
/* проводим его обработку */
...
/********************************/
/* вот эта часть мне не понятна */
/********************************/
/* через порт 0x61 отключают клавиатуру */
tmp = inb(0x61);
outb(tmp|0x80,0x61);
/* затем обратно включают */
outb(tmp,0x61);
/********************************/
/* сброс контроллера прерываний */
outb(0x20,0x20);
}
Вопрос вот в чем, зачем через порт 0x61 выключают а затем включают клавиатуру. (Основная цель использования порта 0x61 управление встроеным динамиком.) Ведь он позволяет управлять клавиатурой только для совместимости со старыми моделями. Сейчас для управления клавиатурой используется порт 0x64.
Да и вообще мне непонятна последовательность отключения с последующим включением клавиатуры при обработки полученного от нее прерывания. Я пробовал и без данной последовательности обрабатывать прерывания от нее и не каких различий и артифактов замеченно небыло (что отключай, что не отключай одно и тоже).
И что самое интересное, данная последовательность пресутствует во всех кодах которые я просматривал, даже в ядре Linux-2.4.x . У меня складывается впечетление, что все просто копируют то что видят в linux-0.01 и все.
А может я просто ошибаюсь и эту последовательность действительно желательно производить при обработке прерывания от клавиатуры. Кто знает где здесь истина, подскажите. Еще раз повторюсь, я пробовал обрабатывать прерывания от клавиатуры с отключением и последующим включение так и без онного, РАЗНИЦЫ НЕ КАКОЙ.