ропроцессором 80х86. Таким образом, важно выяснить сначала то,
как мы можем программировать 8259A.
Как вся аппаратура персонального компьютера, контроллер
8259A программируется посредством двух имен команд (регистров).
Они расположены в адресах 20h и 21h порта ввода/вывода соответс-
твенно (рисунок 8-6). Регистр с адресом 21h используется исключи-
тельно для маскирования прерываний. Прерывание маскируется (т.е.
не принимается) в том случае, если бит, соответствующий своему
IRQ (считая справа налево, причем самому правому биту присвоено
значение IRQ0), установлен в логическую единицу. Порт по адресу
20h используется для направления команды прерывания контроллеру
8259A. Как мы отметили ранее, в системах MS-DOS это делается за-
писью 20h в этот порт.
Прерывание к CPU ДДД¬
¦
Ъ Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д Д ДБД Д Д Д Д Д ¬
ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬ конец
¦ Порт 20h ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ прерывания ¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ EOI=20h
¦ АДДДД 20h ¦
8259A IRQ
¦ ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬ 1=a. ¦
¦ 0 ¦ 0 ¦ 0 ¦ 0 ¦ 3.¦ 4.¦ 5.¦ 6.¦ 0=b.
¦ АДДДБДДДБДДДБДВДБДВДБДДДБДДДБДДДЩ ¦
Программируемый контроллер прерываний
А Д Д Д Д Д Д Д Д Д Д Д Д Д Д † Д † Д Д Д Д Д Д Д Д Д Д Д Д Д Щ
¦ ¦ ¬ Последовательные
¦ АДДД COM2:¦ порты
АДДДДДДД COM1:¦ персонального
Щ компьютера
Рис.8-6. Программируемый контроллер прерываний 8259A
a. - замаскировать прерывание; b. - разрешить прерывание;
- 8-13 -
В системах MS-DOS первому последовательному порту (COM1)
присвоен номер IRQ4 (прерывание номер 12), в то время как второй
(COM2) имеет IRQ3 (прерывание 11). Как указывалось ранее, порты
COM3 и COM4 могут обрабатываться таким же образом, предполагая,
что известны номера IRQ, присвоенные этим портам во время уста-
новки (только порты COM1 и COM2 имеют заранее присвоенные номера
IRQ). Поэтому, контроллер 8259A может быть запрограммирован для
получения прерываний от порта COM1 чтением с порта 21h и обратной
записью содержания, логически умноженного на EFh. Прерывания пор-
та COM1 могут быть замаскированы не только повторением предыдущих
действий, но логическим сложением с 10h, вместо логического умно-
жения. Таким образом, контроллер 8259A может быть запрограммиро-
ван для разрешения прерываний порта COM1 с помощью следующего
фрагмента программы
IN AL,21H ;получить текущую маску прерывания
AND AL,EFH ;разрешить IRQ4
OUT 21H,AL ;снова записать его обратно
Когда прерывания порта COM1 снова выключаются, 8259A может
быть запрограммирован следующим образом
IN AL,21H ;получить текущую маску прерывания
OR AL,10H ;запретить IRQ4
OUT 21H,AL ;снова записать его обратно
Подобное программирование устройств, выполняемое считыванием
содержание регистра с последующей записью его обратно с соотвест-
вующе измененным битом, рекомендуется ввиду того, что мы не нару-
шаем предварительной установки битов.
Кроме разрешения и запрещения приема прерываний, контроллер
8259A должен быть проинформирован о завершении обработки обычного
прерывания. Как указывалось ранее, это выполняется направлением
20h в адрес 20h порта ввода/вывода следующим образом:
MOV AL,20H ;код конца прерывания
OUT 20H,AL ;в порт 20Н контроллера 8259A
Использование средств MS-DOS для программирования
последовательного порта
Если Вы знаете назначение каждого регистра последовательного
адаптера, программирование последовательного порта включает в се-
бя правильную установку регистров, разрешение прерываний и уста-
новку программы обработки прерываний. Мы уже рассказали о том,
как программировать контроллер прерываний. Теперь мы готовы к
рассмотрению остальных деталей программирования последовательного
адаптера.
Драйвер, TSR или автономная программа
Существует несколько способов получения доступа к последова-
тельному адаптеру в системе MS-DOS. Вы можете управлять последо-
вательным портом через устанавливаемый драйвер устройства, выпол-
няющий ввод/вывод через этот порт. В главе 6 "Устанавливаемые
- 8-14 -
драйверы устройств" рассматриваются детали разработки такого
драйвера. Главным недостатком такого подхода являются издержки,
связанные с доступом к драйверу через DOS, а достоинством то, что
любая программа, которая знает о Вашем драйвере, может его ис-
пользовать. Если Вы выбрали этот способ, то можете обеспечить в
драйвере возможности IOCTL таким образом, что связные параметры,
такие как скорость передачи в бодах и длина слова, могут быть ус-
тановлены вызовами DOS IOCTL (номер функции DOS 44h).
Вторым подходом является установка программы TSR (завершенная
и оставленная резидентно), которая используется с помощью преры-
вания BIOS RS-232C (14h) и расширяет свою функциональность обес-
печением управляемого прерываниями ввода/вывода. Этот метод также
дает любой программе доступ к последовательному порту посредством
Вашего драйвера TSR в то время как Вы подтверждаете необходимые
установки регистра при использовании новых коммуникационных функ-
ций TSR. Механизм доступа будет таким же, как вызов функции BIOS
RS-232C, который мы вскоре опишем.
Третий метод заключается в разработке автономной программы,
которая включает в себя служебную подпрограмму обработки прерыва-
ний последовательного порта. В этом случае, при запуске этой
прикладной программы, Вы можете установить обработчик прерываний
последовательного порта и сбросить его после прекращения работы
программы. Этот способ создает возможности организации высокоско-
ростного (9600 бод) последовательного ввода/вывода ввиду наличия
в нем меньшего количества недостатков по сравнению с двумя други-
ми методами.
Независимо от того, какой подход Вы выберите, управление
последовательным портом останется таким же. Далее мы уделим осо-
бое внимание деталям.
Использование BIOS для последовательной связи
Вы, вероятно, спросите, можно ли реализовать эффективный ввод
/вывод через BIOS. К сожалению, нет. BIOS не предоставляет эффек-
тивной возможности управления последовательным адаптером. Для
программирования последовательного адаптера BIOS имеет функцию
RS-232C, доступную через прерывание 14h. К сожаления, эта функция
поддерживает только упорядоченный ввод/вывод, который не очень
эффективен ввиду недостатков, изложенных ранее. Тем не менее, эта
функция идеальна для установки таких параметров коммуникационного
порта, как скорость передачи в бодах, длина слова и стоповый бит,
использующий прерывание 14h BIOS.
Установка коммуникационных параметров с использованием BIOS
Даже при использовании в последовательном вводе/выводе BIOS
не столь эффективна как управляемый прерываниями подход. Полезно
посмотреть, как коммуникационные параметры (скорость передачи в
бодах, длина слова, четность и стоповые биты) могут быть установ-
лены с использованием функций BIOS RS-232C, доступных по прерыва-
нию 14h.
Прерывание 14h с нулем в АН устанавливает параметры последо-
вательного порта. Номер порта должен находиться в DX. Нуль в DX
указывает на порт COM1, в то время, как единица указывает на
COM2. Выбранные коммуникационные параметры направляются в регистр
AL в упакованном формате, показанном на рисунке 8-7. Скорость пе-
редачи определяется 3-битовым значением, четность - 2-битовым
- 8-15 -
значением, число стоповых битов - одним битом и длина слова -
2-битовым значением. В таблице 8-2 показаны кодированные значения
каждого коммуникационного параметра. Учтите, что скорость переда-
чи драйверов через порт COM в системе DOS 3.3 может достигать
19200 бод, в то время, как ROM-BIOS ограничивается 9600 бодами.
Для достижения скорости передачи, не указанной в таблице 8-2, Вы
можете использовать возможность программирования скорости переда-
чи универсального асинхронного приемопередатчика, рассмотренную
ранее.
Скорость Длина
Ъпередачи в ВЧет-стьВ a.В слова ¬
¦ бодах ¦ ¦ ¦ ¦
ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
Боды Четность Стоп-биты Длина слова
ЪДДДДДВДДДДД¬ ЪДДВДД¬ ЪДДВДД¬ ЪДДДДВДДДД¬
¦ 000 ¦ 110 ¦ ¦00¦ ¦ ¦0 ¦ 1¦ ¦ 10 ¦ 7 ¦
ГДДДДД†ДДДДДґ ГДДґb.¦ ГДД†ДДґ ГДДДД†ДДДДґ
¦ 001 ¦ 150 ¦ ¦10¦ ¦ ¦1 ¦ 2¦ ¦ 11 ¦ 8 ¦
ГДДДДД†ДДДДДґ ГДД†ДДґ АДДБДДЩ АДДДДБДДДДЩ
¦ 010 ¦ 300 ¦ ¦01¦c.¦
ГДДДДД†ДДДДДґ ГДД†ДДґ
¦ 011 ¦ 600 ¦ ¦11¦d.¦
ГДДДДД†ДДДДДґ АДДБДДЩ
¦ 100 ¦1200 ¦
ГДДДДД†ДДДДДґ
¦ 101 ¦2400 ¦
ГДДДДД†ДДДДДґ
¦ 110 ¦9600 ¦
ГДДДДД†ДДДДДґ
¦ 111 ¦ ¦
АДДДДДБДДДДДЩ
Рис.8-7. Коммуникационные параметры, упакованные в одиночный
байт в формате, требуемом прерыванием 14h BIOS
a.- стоповые биты; b. - нет; c. - нечетность; d. - четность
Таблица 8-2
Кодированные значения коммуникационных
параметров для прерывания 14h
ДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
Имя параметра ¦ Фактическое значение ¦ Кодированное значение
ДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДД
Скорость пе- ¦ 110 ¦ 0
редачи в бодах¦ 150 ¦ 1
¦ 300 ¦ 2
¦ 600 ¦ 3
¦ 1200 ¦ 4