Младшие 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 о готовности к приему нового скан-кода.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.