разрядным, то оно формирует сигнал IOCS16#
или MSC16#
, а разрешением буферов управляют сигналы SBHE#
и SA0
. В этом случае буфер линий SD[7:0]
разрешается только при SA0
=0, а буфер линий SD[15:8]
разрешается только при SBHE#
=L. Некорректное разрешение буферов может приводить к их конфликту с перестановщиком байтов системной платы и искажениям данных.
Восьмиразрядные устройства (например, микросхемы 8255, 8250, 8253 и т. п.) следует подключать только к линиям SD[7:0]
и при обращении к ним не формировать сигналы IOCS16#
или MSC16#
. Никакие «косые» буферы (перестановщики байтов) на интерфейсных картах не нужны.
В одном из источников описывается эффект перестановки байтов при обращении к порту ввода- вывода: «Если прочитать слово из порта по четному адресу, значение одно, а если по нечетному — старшие 8 бит предыдущего значения становятся младшими, а старшие нового = FFh». Первые подозрения падают на ошибку в логике управления буферами. На самом деле все объясняется гораздо проще. Пусть имеется устройство с двухбайтным регистром, младший байт которого имеет адрес R0 (четный), старший — R0+1, а по адресу R+2 устройство (и никакие другие) не откликается. Пусть в данный момент в нем записано число AA55h, тогда чтением порта по команде IN AX, R0
получим в регистрах процессора AL
=55h, AH
=AAh. Теперь если попытаться его «прочитать по нечетному адресу», то есть командой IN АХ, R0+1
, то получим AL
=AAh (содержимое R0+1, к которому мы на самом деле и адресовались!), a AH
=FFh (результат чтения «пустоты»). Так что это не «эффект перестановки», а просто незнание общего правила «интеловской» адресации: адресом слова (двойного, учетверенного…) является адрес его младшего байта. Если в нашем устройстве применяется неполная дешифрация адреса (линия SA1
не используется ни для дешифрации адреса, ни для выбора регистра), то мы увидим полную перестановку байт — в AH
=55h, результат чтения R0 по адресу-псевдониму R0+2. Логика работы контроллера шины вместе со всеми буферами делает обращение к любой ячейке памяти или порту инвариантным к способу программной адресации — что закажешь, то и получишь, но требуется учитывать особенности периферийных устройств, у которых в адресации портов нередко встречаются псевдонимы. Адреса- псевдонимы встречаются и в пространстве памяти (например, копии образов BIOS под границей 1-го и 16- го мегабайтами памяти в «классических» PC/AT).
6.1.2. Прямой доступ к памяти — DMA
Для интерфейса ПУ каждый канал DMA представляется парой сигналов: запрос обмена — DRQx
и подтверждение обмена — DACKx#
, где x
— номер используемого канала. На рис. 6.3 приведена диаграмма стандартного цикла передачи байта (для 8-битного канала) или слова (для 16-битного) от ПУ в память по каналу DMA. Цикл передачи блока байтов или слов в память будет выглядеть следующим образом.
1. По сигналу DRQx
контроллер DMA запрашивает управление шиной и дожидается его предоставления процессором (и другими контроллерами шины).
2. Контроллер выставляет адрес ячейки памяти и формирует в одном цикле шины сигналы IOR#
, DACKx#
и MEMW#
. Адрес на всех линиях, включая LA[23:17]
, действителен во время всего цикла (защелкивание не требуется), BALE
=H в течение всего цикла. Сигнал DACKx#
указывает на то, что операция выполняется для канала x, a IOR#
— на направление в канале (для пересылки из памяти в канал использовался бы сигнал IOW#
). Чтобы по сигналу IOR#
не было ложного чтения (по IOW#
— ложной записи) порта, адрес которого совпадает с адресом памяти, присутствующим в цикле DMA, контроллер высоким уровнем сигнала AEN
запрещает портам дешифрацию адреса. Байт, считанный из ПУ, в том же цикле шины записывается в ячейку памяти.
3. Контроллер модифицирует счетчик адреса и повторяет шаги 1–2 для каждого следующего сигнала DRQx
, пока не будет исчерпан счетчик циклов. В последнем цикле обмена контроллер формирует общий сигнал окончания TC
(Terminate Count), который может быть использован устройством для формирования сигнала аппаратного прерывания.

Рис. 6.3. Цикл обмена DMA
Диаграмма обратной пересылки (из памяти в ПУ) отличается только тем, что на месте сигнала IOR#
будет сигнал MEMR#
, а на месте MEMW#
— сигнал IOW#
. Направление обмена и параметры режима задаются программированием контроллера DMA.
Цикл DMA, и так довольно длинный, может быть растянут устройством с помощью сигнала IOCHRDY
(но сократить его сигналом 0WS#
невозможно). Запрашивать удлинение цикла может только адресованная память — подразумевается, что когда ПУ выставляет запрос DRQx
, оно уже должно быть готово к обмену.
На 16-битной шине ISA доступно 7 каналов DMA: четыре 8-битных (номера 0–3) и три 16-битных (5–7), подключенные к первичному и вторичному контроллерам соответственно. Канал 4 используется для каскадирования (соединения контроллеров). На 8-битном слоте доступны только четыре 8-битных канала (в XT только 3 — канал 0 требовался для регенерации памяти).
Кроме приведенного на рисунке режима одиночной передачи возможны и иные, описанные в п. 12.4.
Напомним, что по 8-битным каналам DMA за один сеанс настройки контроллера можно передавать не более 64К
6.1.3. Прямое управление шиной
В случае DRQx
(x=5…7), по которому