¹ Указана максимальная пропускная способность. Реальная примерно в 2 раза ниже за счет прерываний, регенерации и протокольных процедур.
² Поддержка автоматического конфигурирования. Для ISA PnP является позднейшей надстройкой, реализуемой адаптерами и ПО.
6.1. Шины ISA, EISA и PC/104
ISA Bus (Industry Standard Architecture) — шина расширения, применявшаяся с первых моделей PC и ставшая промышленным стандартом, В компьютере XT использовалась шина с разрядностью данных 8 бит и адреса — 20 бит. В компьютерах AT ее расширили до 16 бит данных и 24 бит адреса. Конструктивно, как показано на рис. 6.1, шина выполнена в виде двух щелевых разъемов с шагом выводов 2,54 мм (0,1 дюйма). В подмножестве ISA-8 используется только 62-контактный слот (ряды А, В), в ISA-16 применяется дополнительный 36-контактный слот (ряды С, D). Шина PC/104, разработанная для встраиваемых контроллеров на базе PC, отличается от обычной ISA только конструктивно. В шине EISA — дорогом 32-разрядном расширении ISA — используется «двухэтажный» слот, позволяющий устанавливать и обычные карты ISA.
Рис. 6.1. Слот ISA
Для шины ISA выпущено (и продолжает выпускаться) огромное количество разнообразных карт расширения. Ряд фирм выпускает карты-прототипы (Prototype Card), представляющие собой печатные платы полного или уменьшенного формата с крепежной скобой. На платах установлены обязательные интерфейсные цепи — буфер данных, дешифратор адреса и некоторые другие. Остальная часть платы свободна, и здесь разработчик может разместить макетный вариант своего устройства. Эти платы удобны для проверки нового изделия, а также для монтажа единичных экземпляров устройства, когда разработка и изготовление печатной платы нерентабельно.
В каждый момент времени шиной может управлять только одно устройство-А[15:10] устройствами игнорировались. Таким образом, диапазон адресов устройств шины ISA ограничивается областью 100h–3FFh. Впоследствии стали применять 12-битную адресацию (диапазон 100h-FFFh). При этом приходится учитывать возможность присутствия на шине старых 10-битных адаптеров, которые «отзовутся» на адрес с подходящими ему битами А[9:0] во всей допустимой области 12-битного адреса четыре раза (у каждого 10-битного адреса будет еще по три 12-битных псевдонима). Полный 16-битный адрес используется только в шинах EISA и PCI.
Шина ISA-8 может предоставить до 6 линий запросов прерываний, ISА-16 — 11. Часть из них могут «отобрать» устройства системной платы или шина PCI.
Шина ISA-8 позволяет использовать до трех 8-битных каналов DMA. На 16-битной шине доступны еще три 16-битных и один 8-битный канал.
Все перечисленные ресурсы шины должны быть бесконфликтно распределены. Бесконфликтность подразумевает выполнение перечисленных ниже условий.
♦ Каждое устройство-исполнитель должно управлять шиной данных только при чтении по его адресам или по используемому им каналу DMA. Области адресов, по которым выполняется чтение регистров различных устройств, не должны пересекаться. Поскольку при записи шиной данных управляет лишь текущий задатчик, возможность конфликтов, приводящих к искажениям данных, исключена. «Подсматривать» операции записи, адресованные не данному устройству, не возбраняется.
♦ Назначенную линию IRQx или DRQx устройство должно держать на низком уровне в пассивном состоянии и переводить в высокий уровень для активации запроса. Неиспользуемыми линиями запросов устройство управлять не имеет права, они должны электрически отсоединяться или подключаться к буферу, находящемуся в третьем состоянии. Одной линией запроса может пользоваться только одно устройство. Такая нелепость (с точки зрения схемотехники ТТЛ) была допущена в первых PC и из требований совместимости тиражируется до сих пор.
Задача распределения ресурсов для старых адаптеров решалась с помощью джамперов, затем появились программно конфигурируемые устройства, которые вытесняются автоматически конфигурируемыми платами PnP.
Назначение контактов слотов шин ISA и EISA приведено в табл. 6.2 и 6.3.
Таблица 6.2. Основной разъем шин ISA-8, ISA-16 и EISA
| Ряд В | № | Ряд А |
|---|---|---|
| GND | 1 | IOCHK# |
| Reset | 2 | SD7 |
| +5 В | 3 | SD6 |
| IRQ2/9¹ | 4 | SD5 |
| -5 В | 5 | SD4 |
| DRQ2 | 6 | SD3 |
| -12 В | 7 | SD2 |
| 0WS#² | 8 | SD1 |
| +12 В | 9 | SD0 |
| GND | 10 | IOCHRDY |
| SMEMW# | 11 | AEN |
| SMEMR# | 12 | SA19 |
| IOWR# | 13 | SA18 |
| IORD# | 14 | SA17 |
| DACK3# | 15 | SA16 |
| DRQ3 | 16 | SA15 |
| DACK1# | 17 | SA14 |
| DRQ1 | 18 | SA13 |
| REFRESH# | 19 | SA12 |
| BCLK | 20 | SA11 |
| IRQ7 | 21 | SA10 |
| IRQ6 | 22 | SA9 |
| IRQ5 | 23 | SA8 |
| IRQ4 | 24 | SA7 |
| IRQ3 | 25 | SA6 |
| DACK2# | 26 | SA5 |
| TC | 27 | SA4 |
| BALE | 28 | SA3 |
| +5 В | 29 | SA2 |
| Osc | 30 | SA1 |
| GND | 31 | SA0 |
¹ B4: XT=IRQ2, AT=IRQ9.
² B8: XT-Card Selected.
Таблица 6.3. Дополнительный разъем шин ISA-16 и EISA
| Ряд D | № | Ряд С |
|---|---|---|
| MEMCS16# | 1 | SBHE# |
| IOCS16# | 2 | LA23 |
| IRQ10 | 3 | LA22 |
| IRQ 11 | 4 | LA21 |
| IRQ12 | 5 | LA20 |
| IRQ 15 | 6 | LA19 |
| IRQ14 | 7 | LA18 |
| DACK0# | 8 | LA17 |
| DRQ0 | 9 | MEMR# |
| DACK5# | 10 | MEMW# |
| DRQ5 | 11 | SD8 |
| DACK6# | 12 | SD9 |
| DRQ6 | 13 | SD10 |
| DACK7# | 14 | SD11 |
| DRQ7 | 15 | SD12 |
| +5 B | 16 | SD13 |
| MASTER# | 17 | SD14 |
| GND | 18 | SD15 |
Сигналы шины ISA естественны для периферийных микросхем фирмы Intel (в стиле семейства 8080).
♦ SD[7:0] — шина данных. Иное название сигналов — Data или D.
♦ SA[19:0] (Addr[19:0], A[19:0]) — шина адреса.
♦ AEN — разрешение адресации портов (запрещает ложную дешифрацию адреса в цикле DMA).
♦ IOW# (IOWC#, IOWR#) — запись в порт.
♦ IOR# (IORC#, IORD#) — чтение порта.
♦ SMEMW# (SMEMWR#, SMWTC#) — запись в системную память (в диапазоне адресов 0-FFFFFh).
♦ SMEMR# (SMEMRD#, SMRDC#) — чтение системной памяти (в диапазоне адресов 0-FFFFFh).
Ниже перечислены сигналы, относящиеся к сигналам запросов прерывания и каналам прямого доступа к памяти.
♦ IRQ2/9, IRQ[3:7] — запросы прерываний. Положительный перепад сигнала вызывает запрос аппаратного прерывания. Для идентификации источника высокий уровень должен сохраняться до подтверждения прерывания процессором, что затрудняет разделение (совместное использование) прерываний. Линия IRQ2/9 в шинах XT вызывает аппаратное прерывание с номером 2, а в AT — с номером 9.
♦ DRQ[1:3] — запросы 8-битных каналов DMA (положительным перепадом).
♦ DACK[1:3]# — подтверждение запросов 8-битных каналов DMA.
♦ TC — признак завершения счетчика циклов DMA.
Шина имеет и несколько служебных сигналов синхронизации, сброса и регенерации памяти, установленной на адаптерах.
♦ IOCHRDY (CHRDY, I/OCHRDY) — готовность устройства, низкий уровень удлиняет текущий цикл (не более 15 икс).
♦ BALE (ALE) — разрешение защелки адреса. После его спада в каждом цикле процессора линии SA[0:19] гарантированно содержат действительный адрес.
♦ REFRESH# (REF#) — цикл регенерации памяти (в XT называется DACK0#). Сигнал появляется каждые 15 мкс, при этом шина адреса указывает на очередную регенерируемую строку памяти.
♦ IOCHK# — контроль канала, низкий уровень вызывает NMI CPU (разрешение и индикация в системных портах 061h, 062h).
♦ RESET (RESDRV, RESETDRV) — сигнал аппаратного сброса (активный уровень — высокий).
♦ BCLK (CLK) — синхронизация шины с частотой около 8 МГц. ПУ могут не использовать этот сигнал, работая только по управляющим сигналам записи и чтения.
♦ OSC — несинхронизированная с шиной частота 14,431818 МГц (использовалась старыми дисплейными адаптерами).
Кроме логических сигналов шина имеет контакты для разводки питания +5, -5, +12 и -12 В.
♦ SD[15:8] — шина данных.
♦ SBHE# — признак наличия данных на линиях SD[15:8].
♦ LA[23:17] — нефиксированные сигналы адреса, требующие защелкивания по спаду сигнала BALE. Такой способ подачи адреса позволяет сократить задержку. Кроме того, схемы дешифратора адреса памяти плат расширения начинают декодирование несколько раньше спада BALE.
♦ IRQ[10:12], IRQ[14:15] — дополнительные запросы прерываний.
♦ DRQ[5:7] — запросы 16-битных каналов DMA (положительным перепадом).
♦ DACK[5:7]# — подтверждение запросов 16-битных каналов DMA.
♦ DRQ0 и DACK0# — запрос и подтверждение 8-битного канала DMA, освободившегося от регенерации памяти.
Перечисленные ниже сигналы связаны с переключением разрядности данных.
♦ МEMCS16# (M16#) — адресуемое устройство поддерживает 16-битные обращения к памяти.
♦ IOCS16# (I/OCS16#, IO16#) — адресуемое устройство поддерживает 16-битные обращения к портам.
К новым управляющим сигналам относятся следующие.
♦ MEMW# (MWTC#) — запись в память в любой области до 16 Мбайт.
♦ MEMR# (MRDC#) — чтение памяти в любой области до 16 Мбайт.
♦ OWS# (SRDY#, NOWS#, ENDXFR) — укорочение текущего цикла по инициативе адресованного устройства.
♦ MASTER# (MASTER16#) — запрос от устройства, использующего 16-битный канал DMA на управление шиной. При получении подтверждения DACK[5:7] Bus-Master может захватить шину.
В шине EISA на дополнительных контактах слотов (недоступных картам ISA) располагается расширение шин данных и адреса до 32 бит, а также набор сигналов, обеспечивающих передачу данных в синхронном режиме с возможностью пакетных циклов.
6.1.1. Обычная передача данных
Для передачи данных от исполнителя к задатчику предназначены циклы чтения ячейки памяти или порта ввода-вывода, для передачи данных от задатчика к исполнителю — циклы записи ячейки памяти или порта ввода-вывода. В каждом цикле текущий (на время данного цикла) задатчик формирует адрес обращения и управляющие сигналы, а в циклах записи еще и данные на шине. Адресуемое устройство-исполнитель в соответствии с полученными управляющими сигналами принимает (в цикле записи) или формирует (в цикле чтения) данные. Также оно может, при необходимости, управлять длительностью цикла и разрядностью передачи. Обобщенные временные диаграммы циклов чтения или записи памяти или ввода-вывода приведены на рис. 6.2. Здесь условный сигнал CMD* изображает один из следующих сигналов:
♦ SMEMR#, MEMR# — в цикле чтения памяти;
♦ SMEMW#, MEMW# — в цикле записи памяти;
♦ IOR# — в цикле чтения порта ввода-вывода;
♦ IOW# — в цикле записи порта ввода-вывода.
Рис. 6.2. Временные диаграммы циклов чтения или записи на шине ISA
В каждом из рассматриваемых циклов активными (с низким уровнем) могут быть только сигналы лишь из одной строки данного списка, и во время всего цикла сигнал AEN имеет низкий уровень. Цикл прямого доступа к памяти, в котором это правило не соблюдается, рассмотрен ниже, и в таком цикле сигнал AEN будет иметь высокий уровень. Сигналы SMEMR# и SMEMW# вырабатываются из сигналов MEMR# и MEMW# соответственно, когда адрес принадлежит диапазону 0-FFFFFh. Поэтому сигналы SMEMR# и SMEMW# задержаны относительно MEMR# и MEMW# на 5-10 нс.
В начале каждого цикла контроллер шины устанавливает адрес обращения: на линиях SA[19:0] и SBHE# действительный адрес сохраняется на время всего текущего цикла; на линиях LA[23:17] адрес действителен только в начале цикла, так что требуется его «защелкивание». Каждое устройство имеет дешифратор адреса — комбинационную схему, срабатывающую только тогда, когда на шине присутствует адрес, относящийся к данному устройству. В фазе адресации устройства еще «не знают», к какому из пространств (памяти или ввода-вывода) относится выставленный адрес. Но дешифраторы адресов уже срабатывают, и, когда в следующей фазе шина управления сообщает тип операции, адресуемое устройство уже оказывается готовым к ее исполнению. Если устройство использует линии LA[23:17] (они нужны лишь для обращений к памяти выше границы FFFFFh), то они на дешифратор адреса должны проходить через регистр-защелку, «прозрачный» во время действия сигнала BALE и фиксирующий состояние выходов по его спаду. Это позволяет дешифратору, всегда вносящему некоторую задержку, начинать работу раньше, чем поступит управляющий сигнал чтения или записи. При обращении к портам ввода-вывода сигналы LA[32:17] не используются.
Если устройство имеет более одного регистра (ячейки), то для выбора конкретного регистра (ячейки) ему требуется несколько линий адреса. Как правило, старшие биты шины адреса поступают на вход дешифраторов адреса, формирующих сигналы выборки устройств, а младшие биты — на адресные входы самих устройств. Тогда каждое устройство в пространстве будет занимать наиболее компактную область смежных адресов размером в 2n байт, где n — номер младшей линии адреса, поступающей на дешифратор. Из них реально необходимы 2m адресов, где m — номер самой старшей линии адреса, участвующей в выборе регистра устройства. В идеале должно быть n=m+1: при большем значении n отведенное (по дешифратору) пространство адресов не будет использовано полностью и регистры устройства будут повторяться в отведенной области 2n-m-1 раз, то есть у них появятся адреса-псевдонимы (alias). Адреса-псевдонимы будут отличаться от истинного адреса (минимального из всех псевдонимов) на K×2m+1, где K — целое число. Меньшее значение n недопустимо, поскольку тогда не все регистры устройства будут доступны задатчику. В принципе можно использовать дешифратор адреса, срабатывающий только на какой-то части адресов из области 2n (не кратной степени двойки), если устройству требуется «неудобное» количество регистров. Однако на практике «фигурное выпиливание» областей из пространства адресов обычно не делают, так что часть адресов может пропадать бесполезно.
SBHE#, SA0, IOCS16# и MEMCS16#. Поддержка 16-разрядных передач сообщается адресуемым исполнителем сигналами IOCS16# и MEMCS16# при срабатывании его дешифратора адреса. Сигнал IOCS16# влияет только на разрядность обращений к портам, MEMCS16# — к памяти. Все операции обмена (транзакции) начинаются задатчиком единообразно, поскольку он еще не «знает» возможностей исполнителя. Развитие событий зависит от намерений задатчика и полученных сигналов разрешения 16-битных передач. В чисто 16-разрядных машинах начальный адрес однозначно соответствует передаваемому байту или младшему байту передаваемого слова[3]. В машинах с 32-разрядными процессорами начальный адрес, выставляемый на шине в начале транзакции, зависит от разрядности данных, запланированной задатчиком, и может зависеть от положения адресуемых данных относительно границы двойного слова (32 битного). 16-разрядные передачи выполняются за 1 цикл только при условии передачи по четному адресу (A0=0) и при ответе исполнителя сигналом IOCS16# или MEMCS16#, в иных случаях они разбиваются на два цикла. 32-разрядные передачи будут разбиваться на 2 (16+16), 3 (8+16+8) или 4 (8+8+8+8) цикла, в зависимости от возможностей исполнителя и четности адреса. Порядок, в котором передаются байты (во времени), неоднозначен (возможен как инкремент, так и декремент адреса), но в адресном пространстве они раскладываются по своим местам однозначно.
В табл. 6.4 приводятся состояния сигналов шины ISA для различных вариантов записи в порты ввода-вывода, проверенные экспериментальным путем. Вывод 16-разрядных данных выполнялся командой OUT DX, AX (в DX — адрес порта, в АХ — данные; AL содержит младший байт, АН — старший), вывод 8-разрядных — командой OUT DX, AL. Несколько неожиданные (для автора) варианты 3 и 6 с декрементом адреса, возможно, будут иметь место не на всех системных платах, но их следует иметь в виду при проектировании устройств, претендующих на глобальную совместимость. Правда на практике 16-битных передач по нечетным адресам обычно избегают (даже чисто подсознательно), и побочные эффекты от такого порядка маловероятны.
Таблица 6.4. Состояние сигналов при 8- и 16-битных обращениях к устройству ISA
| Сигнал (шина) | 1 цикл | 2 цикл |
|---|---|---|
| 1. Вывод 16-разрядных данных в 16-битное устройство по четному адресу | ||
| SBHE# | L | - |
| SA | DX(A0=0) | - |
| D[15:8] | АН | - |
| D[7:0] | AL | - |
| IOCS16# | L | - |
| 2. Вывод 16-разрядных данных в 16-битное устройство по нечетному адресу ххх1, ххх5, xxx9, xxxD | ||
| SBHE# | L | H |
| SA | DX(A0=1) | DX+1 (A0=0) |
| D[15:8] | AL | 0 |
| D[7:0] | AL | AH |
| IOCS16# | L | L |
| 3. Вывод 16-разрядных данных в 16-битное устройство | ||
| SBHE# | H | L |
| SA | DX+1 (A0=0) | DX (A0=1) |
| D[15:8] | 0 | AL |
| D[7:0] | AH | 0 |
| IOCS16# | L | L |
| 4. Вывод 16-разрядных данных в 8-битное устройство по четному адресу | ||
| SBHE# | L | L |
| SA[1:0] | DX(A0=0) | DX+1 (A0=1) |
| D[15:8] | AH | AH |
| D[7:0] | AL | AH |
| IOCS16# | H | H |
| 5. Вывод 16-разрядных данных в 8-битное устройство по нечетному адресу ххх1, ххх5, xxx9, xxxD | ||
| SBHE# | L | H |
| SA[1:0] | DX(A0=1) | DX+1 (A0=0) |
| D[15:8] | AL | 0 |
| D[7:0] | AL | AH |
| IOCS16# | H | H |
| 6. Вывод 16-разрядных данных в 8-битное устройство по нечетному адресу xxx3, ххх7, xxxB, xxxF | ||
| SBHE# | H | L |
| SA[1:0] | DX+1(A0=0) | DX(A0=1) |
| D[15:8] | 0 | AL |
| D[7:0] | AH | AL |
| IOCS16# | H | H |
| 7. Вывод 8-разрядных данных в 16-битное устройство по четному адресу | ||
| SBHE# | H | - |
| SA[1:0] | DX(A0=0) | - |
| D[15:8] | 0 | - |
| D[7:0] | AL | - |
| IOCS16# | L | - |
| 8. Вывод 8-разрядных данных в 16-битное устройство по нечетному адресу | ||
| SBHE# | L | - |
| SA[1:0] | DX(A0=1) | - |
| D[15:8] | AL | - |
| D[7:0] | 0(AL?) | - |
| IOCS16# | L | - |
Момент помещения действительных данных на линии SD[15:0] определяется управляющими сигналами чтения/записи, так что исполнителю не требуется синхронизация с тактовым сигналом шины. IOR#, MEMR#, SMEMR#) и удерживать их до конца действия сигнала (пока не произойдет подъем сигнала). В циклах записи IOW#, MEMW#, SMEMW#). Устройство-исполнитель должно фиксировать для себя эти данные в конце цикла по подъему сигнала записи. От устройства-исполнителя не предусматривается никаких подтверждений исполнения циклов; длительность цикла устанавливает задатчик, но исполнитель может потребовать удлинения или укорочения циклов. С помощью сигнала IOCHRDY исполнитель может удлинить цикл на произвольное число тактов, при этом задатчик будет вводить дополнительные такты ожидания (wait states). Обычно контроллер шины следит за длительностью цикла и по достижении критического времени принудительно его завершает (по тайм-ауту, возможно, и не сообщая об этом событии). Слишком длинные циклы тормозят работу компьютера, а превышение длительности 15 мкс может привести к сбою регенерации и потере данных в ОЗУ. С помощью сигнала 0W# исполнитель предлагает задатчику укоротить цикл, исключив такты ожидания. Реакция задатчика на одновременное использование сигналов IOCHRDY и 0WS# непредсказуема, этой ситуации следует избегать.
Некорректное управление сигналом IOCHRDY (его «залипание» на низком уровне) тормозит работу компьютера.
Номинальная длительность цикла определяется чипсетом и может программироваться в BIOS Setup заданием числа тактов ожидания (wait states). При этом циклы обращения к памяти, как правило, короче циклов обращения к портам ввода-вывода. Для управления длительностью цикла используются также сигналы управления разрядностью передачи: если устройство поддерживает 16-битные передачи, предполагается, что оно может работать с меньшим количеством тактов ожидания. Этим объясняется, что в BIOS Setup длительности циклов ISA задаются раздельно как для памяти и ввода-вывода, так и для 8- и 16-битных операций.
Кроме длительности цикла, устройства могут быть критичны к времени восстановления (recovery time) — длительности пассивного состояния управляющих сигналов чтения-записи между циклами. Этот параметр также может программироваться в BIOS Setup и тоже раздельно для 8- и 16-разрядных операций.
Карты расширения для подключения к шине данных, как правило, используют буферные микросхемы, раздельные для линий SD[7:0] и SD[15:8]. Здесь широко применяются микросхемы 74ALS245 (1533АП6) — 8-разрядные двунаправленные приемопередатчики. Буфер должен открываться сигналом ОЕ# (Output Enable — разрешение выхода), когда на шине адреса присутствует адрес, относящийся к диапазону адресов подключаемого устройства. «Дежурным» является направление передачи «от шины — к устройству»; переключение в обратную сторону производится по сигналу IOR#, если устройство представляет порты ввода-вывода, или MEMRD#, если устройство приписано к пространству памяти. Таким образом, буферы имеют право передавать данные на шину (управлять шиной данных) только во время действия сигнала чтения, относящегося к зоне адресов данного устройства. Карта расширения может являться комбинацией 8- и 16-битных устройств; например, некогда популярные мультикарты содержали 16-битный адаптер ATA и набор 8-битных контроллеров портов COM, LPT, GAME и контроллера НГМД. В таких картах логика управления буферами и сигналами IOCS16# и MSC16# управляется сигналами от дешифратора адреса. Если устройство по данному адресу является 8-разрядным (не формирует сигналы IOCS16# или MSC16#), то оно имеет право разрешать чтение только через буфер линий SD[7:0], а буфер старших линий SD[15:8] (если он имеется на карте) должен быть переведен в третье состояние. Если устройство по данному адресу является 16-разрядным, то оно формирует сигнал 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), по которому контроллер DMA запрашивает управление шиной у центрального процессора. Получив подтверждение от процессора, контроллер устанавливает сигнал AEN (для блокировки дешифрации адреса портов) и формирует сигнал DACKx. Получив этот сигнал, устройство устанавливает низкий уровень на линии MASTER#, по которому контроллер шины DMA снимает сигнал AEN и освобождает линии командных сигналов. Таким образом, управление шиной переходит к данному устройству до тех пор, пока оно не снимет запрос DRQx. В режиме прямого управления шиной ISA устройство становится полновластным и бесконтрольным хозяином как самой шины, так и системы в целом (через мост шины). Если шина захватывается более чем на 15 мкс, контроллер устройства должен заботиться о регенерации памяти (см. ниже). Устройства (и память), к которым обращается задатчик шины, могут потребовать введения тактов ожидания сигналом IOCHRDY, и это требование должно удовлетворяться.