Assembler - язык неограниченных возможностей


Команды инициализации


Чтобы инициализировать контроллер, BIOS посылает последовательность из команды ICW1 в порт 20h/A0h (она отличается от OCW своим битом 4) и трех команд инициализации ICW2, ICW3, ICW4 в порт 21h/ A1h сразу после этого.

    ICW1:

    биты 7 – 4: 0001

    бит 3: 1/0 — срабатывание по уровню/фронту сигнала IRQ (принято 0)

    бит 2: 1/0 — размер вектора прерывания 4 байта/8 байт (1 для 80x86)

    бит 1: каскадирования нет, ICW3 не будет послано

    бит 0: ICW4 будет послано

ICW2:

    номер обработчика прерывания для IRQ0/IRQ8 (кратный восьми) (08h — для первого контроллера, 70h — для второго. Некоторые операционные системы изменяют первый обработчик на 50h)

ICW3 для ведущего контроллера:

    биты 7 – 0: к выходу 7 – 0 присоединен подчиненный контроллер (0100b в PC)

ICW3 для подчиненного контроллера:

    биты 3 – 0: номер выхода ведущего контроллера, к которому подсоединен ведомый

ICW4:

    биты 7 – 5: 0

    бит 4: контроллер в режиме фиксированных приоритетов

    биты 3 – 2: режим:

    00, 01 — небуферированный

    10 — буферированный/подчиненный

    11 — буферированный/ведущий

бит 1: режим с автоматическим EOI (то есть обработчикам не надо посылать EOI в контроллер)

бит 0: 0 — режим совместимости с 8085, 1 — обычный

Повторив процедуру инициализации, программа может, например, изменить соответствие между обработчиками прерываний и реальными аппаратными прерываниями. Переместив базовый адрес первого контроллера на неиспользуемую область (например, 50h) и установив собственные обработчики на каждое из прерываний INT 50h – 58h, вызывающие обработчики INT 08h – 0Fh, вы сможете быть абсолютно уверены, что никакая программа не установит обработчик аппаратного прерывания, который получил бы управление раньше вашего.

; picinit.asm ; Выполняет полную инициализацию обоих контроллеров прерываний ; с отображением прерываний IRQ0 - IRQ7 на векторы INT 50h - 57h. ; Программа остается резидентной и издает короткий звук после каждого IRQ1. ; Восстановление старых обработчиков прерываний и переинициализация ; контроллера в прежнее состояние опущены




Начало  Назад  Вперед