2.3.3. Контроллер прерываний 8259А.
Контроллер 8259А своими 8-битными регистрами приписывается к пространству ввода/вывода и занимает 2 смежных адреса. Обмен с регистрами контроллеров должен производиться только однобайтными операциями ввода/вывода. В PC-совместимых компьютерах контроллеры имеют следующие адреса:
· 8259А#h, 021h;
· 8259А#2 - 0A0h, 0Alh (только для AT).
Контроллер имеет два режима работы: режим инициализации и операционный. После сброса контроллер инициализируется последовательностью команд длиной до 4 байт, после чего переходит в операционный режим (Operation Mode). В операционном режиме он может быть и реинициализирован. Признаком начала инициализации является единичное значение бита 4 в байте, записываемом по адресу 020h (0A0h).
Команды инициализации обозначаются ICW1-ICW4 (Initialization Command Words) и посылаются инструкциями 8-битного вывода в порты контроллеров. Байт ICW1 посылается по адресу 020h (0A0h для 8259#2), байты ICW2-ICW4 посылаются по адресу 021h (0Alh).
Байт ICW1 - конфигуратор контроллера:
· Биты [7:5]-0 (в PC не используются).
· Бит 4=1 — признак команды инициализации (в командах управления он нулевой).
· Бит 3 — чувствительность линий запроса:
0=прерывание по перепаду,
1=прерывание по уровню.
· Бит 2=0 (в PC не используется).
· Бит 1 — схема включения: 1
1=одиночный контроллер (XT),
0=каскадное включение (AT).
· Бит 0 — признак использования ICW4.
Байт ICW2 задает начальный номер векторов, генерируемых данным контроллером, в таблице прерываний. Биты [2:0] должны иметь нулевые значения.
Байт ICW3 используется только для каскадного включения (в XT пропускается).
Для ведущего (Master) контроллера биты [0:7] указывают на наличие ведомых контроллеров на линиях IRQO-IRQ7 соответственно.
Для ведомого (Slave) контроллера биты [2:0] содержат номер IRQ ведущего контроллера, к которому он подключен, биты [7:3]=0.
Байт ICW4 задает режим работы контроллера, его применение обязательно при начальной инициализации (в XT - третий байт инициализации).
· Биты [7:5] =0 - не используются.
· Бит 4 - SFNM (Special Fully Nested Mode) - включает режим вложенности приоритетов запросов ведущего и ведомого контроллеров.
· Бит 3 - BUF (Buffered) - признак буферизованности шины.
· Бит 2 - M/S (Master/Slave) - положение в каскаде:
1-ведущий, 0=ведомый.
· Бит 1 - AEOI (Auto End Of Interrupt) - разрешение автоматического завершения прерывания (которое не требует сброса бита маски по окончании обслуживания запроса).
· Бит 0 — тип используемого процессора:
1=8086/8088 и старше, 0=8080.
В операционном режиме контроллер воспринимает команды управления OCW1-OCW3 (Operation Control Words). OCW1 посылается по адресу 021h (0A1h), OCW2, OCW3 - по адресу 020h (0A0h).
Байт OCW1 - маски запросов, единичное значение бита означает маскирование запроса:
· Биты [0:7] 8259#1 - маски запросов IRQO-IRQ7.
Биты [0:7] 8259#2 - маски запросов IRQ8-IRQ15.
Байт OCW2 - завершение обслуживания (Е01), управление приоритетом.
· Биты [7:5] задают код операции:
001 - неспецифический Е01 (АЕ01=1 в ICW4),
Oil*— специфический Е01 для запроса LLL;
101— неспецифический Е01 с ротацией приоритета;
100 — установка режима ротации приоритета;
000 — сброс режима ротации приоритета;
111*— специфический Е01 с ротацией приоритета;
110* — установка низшего приоритета;
010— нет операции.
В операциях, помеченных звездочкой, используются биты 2-0 (поле LLL).
· Биты [4:3] =00 - признак OCW2
· Биты [2:0] — поле LLL — номер уровня, к которому относится команда.
Байт OCW3 — оперативное управление контроллером.
· Бит 7=0.
· Биты [6:5] — режим специального маскирования (в PC не используется):
11=установить;
10=сбросить;
· 00,01 —не изменять.
· Биты [4:3]=01 — признак OCW3.
· Бит 2=0 — запрещает режим полинга (в котором запрос прерывания к процессору не вырабатывается).
· Биты [1:0] — управление чтением регистров:
10=чтение IR — регистра масок;
11=чтение IS — регистра обслуживаемого прерывания;
00,01 —не изменять регистр.
Для чтения регистра маски или регистра обслуживаемого прерывания (в зависимости от бит [1:0] OCW3) используется порт 021h (OA1h 8259#2).
В IBM PC/XT/AT используется режим вложенных прерываний с фиксированным приоритетом и автоматическим неспецифическим завершением, байты инициализации и управления приведены в табл. 2.3.
Каждая процедура обработки аппаратного прерывания должна завершаться командой Е01 (End Of Interruption), посылаемой контроллеру:
· для 1-го контроллера — посылка байта 20h по адресу 020h.
· для 2-го контроллера - посылка байта 20h по адресу 0A0h; программный вызов прерывания 0Ah -~ завершение для ведущего контроллера; для некоторых старых версий BIOS необходим явный сброс маски запроса в рстистре 2-го контроллера.
Некорректно завершенная процедура не позволит повторно использовать данный или другие запросы прерываний.
Таблица 2.3. Байты инициализации контроллеров прерываний
Байт | XT | AT#1 | AT #2 |
ICWI | 12h | 10h | 10h |
ICW2 | 08h | 08h | 70h |
ICW3 | - | 04h | 02h |
ICW4 | 0Fh | 1Fh | 1Bh |
OCW3 | 0Ah | 0Ah | 0Ah |


