таймер,который генерирует прерывания 18,2 раза в секунду и обеспе-
чивает механизм для планирования периодических действий. Утилита
DOS PRINT использует таймер для поддержания цикла принтера неза-
висимо от происходящего в системе.
Горячие ключи и таймер прерывают работу центрального процес-
сора, когда им необходимо его внимание. Процессор обслуживает
прерывание и возвращается к прерванной задаче. Персональные
компьютеры имеют специальные аппаратные средства для обработки
прерываний. И клавиатура, и таймер взаимодействуют с ними; если
Вы хотите использовать клавиатуру и таймер, то необходимо знать,
как аппаратные средства и программное обеспечение обрабатывают
системные прерывания.
Аппаратные прерывания
На уровне аппаратных средств, поддерживающих MS-DOS, есть
система прерываний от аппаратных средств, каждое из которых ассо-
циировано с конкретным устройством. Каждое устройство, ожидающее
обслуживания процессором, посылает контроллеру прерываний 8259A,
который планирует обработку прерываний, запрос на прерывание, или
IRQ. Каждое устройство имеет некоторый приоритет. Устройство с
высшим приоритетом первым получает доступ к процессору раньше
менее важных устройств. (Контроллер прерываний 8259A может быть
запрограммирован и по-другому, но другие способы обработки менее
выгодны для использования). Когда контроллер прерываний решает,
что прерывание может быть обработано, он посылает на устройство
сообщение "подтверждение приема прерывания", блокирует все ос-
тальные прерывания и генерирует прерывание.
В ответ на конкретное аппаратное прерывание, процессор ищет
адрес обработки прерывания в таблице векторов прерываний (IVT).
Эта таблица занимает 256 двойных слов (1024 байта) памяти. Каждая
ее строка содержит адрес подпрограммы обработки прерывания (ISR).
Процессор запоминает текущие флаги и программный счетчик (CS:IP)
и начинает обслуживание прерывания.
ISR делает все необходимое для обслуживания прерываний. В
некоторый момент ISR посылает сообщение о конце прерывания (EOI)
контроллеру 8259, означающее, что он готов принять запрос на об-
служивание следующего прерывания. Контроллер прерываний не будет
принимать прерывания от этого или других устройств с более низким
приоритетом, пока не получит этого сообщения. После того, как ISR
сделала свою работу, она выполняет команду IRET, которая восста-
навливает флаги и первоначальный CS:IP.
- 4-4 -
Программные прерывания
Для процессоров 80х86 механизм программных прерываний обеспе-
чивает команда INT (обработка прерываний). Процессор одинаково об-
рабатывает программные и аппаратные прерывания. При исполнении ко-
манда INT передает управление ISR, специфицированной операндом ко-
манды. Например, команда int 60h вызывает подпрограмму обработки
прерываний, адрес которой записан в IVT со смещением 180h (4х60h).
Контроллер прерываний не включается и ISR не посылает EOI контрол-
леру прерываний. DOS широко использует программные прерывания.
Поскольку все обращения к ISR осуществляются через IVT, заменить
подпрограмму обработки прерываний несложно. Вы будете часто иметь
повод для модификации IVT при написании резидентных программ.
Прерывания от таймера
PC использует один канал интегральной схемы 8253 счетчи-
ка/таймера для запроса прерываний 18,2 раза в секунду. Контроллер
8259A в ответ на этот запрос генерирует прерывание int 8h. Это
прерывание по таймеру имеет высший приоритет и будет вытеснять
любые другие прерывания до тех пор, пока не будут заблокированы
все прерывания командой CLI (очистка прерываний).
Это прерывание обычно обслуживает программа ROM-BIOS. После
обновления времени суток и выполнения некоторых других служебных
задач, программа ROM-BIOS выполняет команду int 1Ch. Программы,
которые должны выполняться периодически, могут установить свою
собственную подпрограмму обработки прерывания int 1Сh. По умолча-
нию подпрограмма обработки прерывания int 1Сh ROM-BIOS содержит
команду IRET.
Клавиатура
Стандартная клавиатура PC содержит свой собственный микроп-
роцессор (Intel 8048 или его эквивалент). Нажатие или освобожде-
ние клавиши посылает сигнал IRQ1 контроллеру прерываний, который
вызывает подпрограмму обслуживания прерывания int 9 для обработки
этого запроса. Приоритет прерываний от клавиатуры второй после
прерываний от таймера.
ROM (постоянное запоминающее устройство) на системной плате
по умолчанию содержит ISR int 9. Это достаточно сложная програм-
ма. Она читает и декодирует считываемый код, отслеживает наличие
специальных клавиш (Control,Shift,Alt и др.) и преобразует скани-
руемые коды во внутренние. Каждое нажатие клавиши вырабатывает
два сканируемых кода - для нажатой и отпущенной клавиши. Выбор
сканируемого кода зависит от информации о состоянии клавиатуры.
Например, нажатие клавиши A производит сканируемый код 61h (код
ASCII строчной буквы а). Если при нажатии клавиши A нажата управ-
ляющая клавиша, сканируемый код трансформируется в 01h (код ASCII
для Control-A). Если при нажатии клавиши A нажата клавиша Shift,
сканируемый код получается 41h (ASCII для заглавной буквы A).
В результате нажатия таких клавиш как Shift и Alt,int 9 ISR
обновляет байт состояния клавиатуры внутри сегмента данных BIOS и
обращается к IRET. Сегмент данных BIOS начинается с параграфа 40h
и содержит множество динамических переменных, используемых раз-
личными подпрограммами ROM-BIOS. Листинг 4-1 описывает часть этой
области данных.
- 4-5 -
Листинг 4-1. Сегмент данных BIOS
----------------------------------------------------------------
KB_M_RShift EQU 01h ; установка правой клавиши сдвига
KB_M_LShift EQU 02h ; установка левой клавиши сдвига
KB_M_Control EQU 04h ; установка управляющей клавиши
KB_M_Alt EQU 08h ; установка клавиши "Alt"
KB_M_Scroll EQU 10h ; нажатие клавиши "Scroll Lock"
KB_M_Num EQU 20h ; нажатие клавиши "Num Lock"
KB_M_Caps EQU 40h ; нажатие клавиши "Caps Lock"
KB_M_InsState EQU 80h ; режим вставки
KB_C_BufSize EQU 10h ; размер буфера клавиатуры
BIOS SEGMENT at 40h
ORG 17h ; не существенно для др. данных BIOS
KB_B_Flag DB 0 ; флаг состояния клавиатуры
ORG 1ah ; не существенно для 18h и 19h
KB_W_BufHead DW 0 ; начало буфера клавиатуры
KB_W_BufTail DW 0 ; оставшаяся часть буфера клавиатуры
KB_T_Buffer DW KB_C_BufSize DUP(0)
BIOS ENDS
----------------------------------------------------------------
Определенные комбинации клавиш имеют специальные значения.
Подпрограмма обработки прерываний от клавиатуры выполняет команду
int 1Bh, когда она видит сканируемый код, соответствующий клавише
прерывания. По умолчанию ISR int 1Bh содержит IRET, но обычно
драйвер консоли устанавливает свою собственною ISR 1Bh, что дает
ему возможность обрабатывать его прерывания специальным образом.
(Этот вопрос обсуждается в главе об обработке прерываний).
В конечном счете страшная Cntrl-Alt-Del выдает int 19h.
Дальнейшее обсуждение int 19h и комбинации клавиш Cntrl-Alt-Del
необязательно.
Если код клавиши не имеет специального значения, ISR int 9
сохраняет его в буфере клавиатуры. Этот буфер начинается со сме-
щения 1h внутри сегмента данных BIOS и представляет собой цирку-
лярный буфер из 16 слов. Смещения 1Ah и 1h в этом сегменте указы-
вают, соответственно, на начало и конец буфера. Если буфер полон,
ISR int 9 выдает звуковой сигнал и отвергает символ; в противном
случае символ вставляется в конец буфера.
Длина каждого элемента буфера 2 байта; его формат зависит от
того, как ISR int 9 интерпретирует нажатие клавиши.
С помощью определенных комбинаций клавиш (например, Alt плюс
буква или цифра) и специальных клавиш (например, функциональных
клавиш) воспроизводятся символы расширенного ASCII; остальные
клавиши воспроизводят обычный ASCII. Нулевой байт записи подпрог-
раммы обработки прерываний int 9 содержит числовой идентификатор
для расширенных символов ASCII, запись кода символа ASCII и ска-
нируемый код для всех других. Программное обеспечение доступно
аппаратным средствам клавиатуры через ROM-BIOS. Int 16h позволяет
удалять символ из буфера клавиатуры, взглянув на первый символ в
буфере, и изменять статус клавиатуры. Фактически, любой доступ к
клавиатуре осуществляется через int 16h. Любой драйвер консоли
использует для ввода символов и изменения статуса клавиатуры
int 16h.
Аппаратура отображения
Имеется большое количество различных дисплеев, доступных
компьютерам семейства PC. Одноцветный дисплейный адаптер (MDA) и
цветной графический адаптер (CGA) наиболее общеизвестны. Некото-
рые другие аппаратные средства могут заменять один или оба из
них, предоставляя дополнительные возможности (больше цветов, луч-
шая разрешающая способность и т. д.). Это описание ограничивается
MDA и CGA.
Аппаратные средства отображения PC имеют аналоговые и цифро-
вые компоненты. Экран и ассоциированная с ним логика управления
составляют аналоговую часть. Поверхность экрана покрыта фосфором,
который светится, когда об нее ударяется пучок электронов. Анало-
говые схемы управления пересекают пучком электронов экран и опус-
кают его вниз. Другие части схемы включают и выключают его.
Этот процесс начинается с верхнего левого угла экрана. Пучок
передвигается горизонтально через экран слева направо. Когда он
достигнет правой стороны экрана, управляющая электроника выключа-
ет его и возвращает его в левый угол и вниз на одну позицию. Вре-
мя, когда пучок выключен, известно, как горизонтальный интервал
гашения. Процесс продолжается до тех пор, пока пучок не пересечет
нижнюю строку экрана. Когда пучок электронов достигнет низа экра-
на, схема управления выключает его и возвращает в верхний левый
угол экрана для повторения всего процесса. Время, необходимое для
этого, называется вертикальным интервалом возвращения. Горизон-
тальный интервал гашения и вертикальный интервал возвращения важ-