Подробное исследование работы клавиатуры ПК и обслуживающих ее прерываний, страница 7

Младшие 3 бита 8-битного кода EOI, посылаемого в порт 20Н, используются PIC для определения уровня приоритета обработчика прерывания, посылающего EOI. Так как PIC автоматически определяет уровень, то этот специфичный тип EOI не нужен и не используется. Поэтому младшие 3 бита устанавливаются в 0. Верхние 3 бита используются для индикации типа EOI; неспецифичный для данного режима тип кодируется как 001В. Средние два бита не используются и всегда устанавливаются в 0. В результате получаем код 00100000В или 20Н. Адрес порта 20Н — это место подключения схемы 8259А — чисто случайно имеет то же значение, что и посылаемый сигнал EOI.

При вызове прерывания ЦПУ использует номер прерывания как указатель в таблице векторов, содержащей адрес программы прерывания (как это было рассмотрено ранее). Так как таблица векторов расположена внизу памяти, то вектор прерывания INT 00Н размещается в четырех байтах, начиная с самого первого байта памяти (0000:0000). Каждый адрес (вектор) занимает 4 байта — 2 для сегмента и 2 для смещения. Для поиска вектора, связанного с прерыванием, ЦПУ умножает номер прерывания на 4 и использует результат как индекс в таблице векторов. Выбранный адрес загружается в пару регистров CS:IP ЦПУ, эффективно передавая управление программе обслуживания прерывания. В случае клавиатурного прерывания — это обработчик INT 09H.

Первое, что выполняет INT 09H — получает скан-код. Вспомним, что скан-код находится в регистре сдвига LS322, INT 09H не имеет прямого доступа к этой схеме и к скан-коду. Но LS322 посылает скан-код по 8 параллельным линиям (а не по последовательной линии) в порт В (адрес 60Н) другой микросхемы, называемой Программируемым Параллельным Интерфейсом (PPI) 8255-À.

Помимо обслуживания функций клавиатуры PPI считывает значения переключателей на системной плате компьютера и управляет динамиком. Для прерывания INT 09H PPI служит источником скан-кодов. Программа INT 09H считывает скан-код из порта А, преобразует его в символ ASCII и запоминает скан-код и символ в буфере клавиатуры. Обратите внимание на то, что INT 09H — не единственная программа, способная считывать из порта А. Так как считывание данных из этого порта, в отличие от многих других, не уничтожает их, то любая программа может спокойно считывать скан-код.

IN AL,20H      ;Ввести текущее состояние порта В

OR AL,80H      ;Установить старший бит

JMP $ + 2      ;Переход на задержку

;для быстрых машин

OUT 20H,AL     ;Сброс клавиатуры

AND AL,NOT 80Н ;Сбросить старший бит

JMP $ + 2      ;Задержка

OUT 20H,AL     ;Восстановить состояние порта В

Рисунок 2


После того, как программа INT 09H прочитает скан-код, можно дать "зеленый свет" на посылку нового скан-кода. Это выполняется путем кратковременной установки бита 7 порта В в 1 (см. 9 и рис. 2 — команды на ассемблере). Бит 7 соединен с линией очистки как LS322, так и S74. LS322 обнуляет выходы сдвигающего регистра, подготавливая его к приему следующего скан-кода. S74 сбрасывает линию IRQ1, информируя процессор клавиатуры 8048 о готовности к приему нового скан-кода.