Таблица 12.4. Регистры контроллера DMA 8237A
8237#1 |
8237#2 |
R/W, Назначение регистров |
000, 002, 004, 006 |
0C0, 0C4, 0C8, 0CC |
W — регистры начального адреса для каналов 0–3 (8237#1) и 4–7 (8237#2). R — регистры текущего адреса тех же каналов |
001, 003, 005, 007 |
0С2, 0C6, 0CA, 0СЕ |
W — начальное значение счетчика передач для каналов 0–3 (8237#1) и 4–7 (8237#2). R — текущее значение счетчика передач тех же каналов |
008 |
0D0 |
W, Command Register — конфигуратор контроллера . Бит 7: 1 — активный уровень (DACK# — высокий, 0 — низкий); бит 6: 1 — активный уровень (DRQ — низкий, 0 — высокий); бит 5: 1 — режим расширенной записи (должен быть 0); бит 4: 0 — фиксированный приоритет, 1 — циклический; бит 3: 1 — укороченный цикл обмена (должен быть 0); бит 2: 1 — запрет работы контроллера; бит 1: 1 — фиксация адреса 0 канала (должен быть 0); бит 0: 1 — передача память-память (в PC не используется, должен быть 0) |
008 |
0D0 |
R, Status Register — состояние каналов . Биты 4–7: запросы каналов 0–3; биты 0–3: завершение цикла каналов 0-3 |
009 |
0D2 |
W, Request Register — регистр программных запросов . Биты 7–3 не используются; бит 2: 1 — установка, 0 — сброс бита запроса; биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) |
00А |
0D4 |
W, Single Mask Bit Register — управление масками. Биты 7–3 не используются; бит 2:1 — установка, 0 — сброс бита маски; биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) |
00B |
0D6 |
W, Mode Register — режимы работы каналов . Биты 7–6: режим передачи (00 — по запросу, 01 — одиночный, 10 — блочный, 11 — каскадирование); бит 5: 0 — инкремент, 1 — декремент адреса; бит 4: 1 — разрешение автоматической реинициализации |
00B |
0D6 |
Биты 3–2; тип передачи (00 — холостой, проверка канала, 01 — запись в память, 10 — чтение памяти, 11 — недопустимо); биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) |
00C |
0D8 |
W, Clear Byte Pointer Flip/Flop — сброс триггера младшего/старшего байта |
00D |
0DA |
W, Master Clear — общий сброс 8237 (вывод любого байта в регистр вызывает сброс) |
00E |
0DC |
W, Clear Mask Register — общий сброс масок всех каналов (вывод любого байта в регистр вызывает сброс) |
00F |
0DE |
W, All Mask Register Bits — регистр масок всех каналов . Биты 0–3: маски каналов 0–3 (0 — канал разрешен, 1 — замаскирован); биты 4–7 не используются |
Программирование контроллера для каждого канала определяет начальный адрес, направление его модификации (инкремент/декремент), количество пересылаемых байт (слов), режим работы канала. Регистры адреса контроллеров 8237A — 16-разрядные, и для расширения разрядности адреса для каждого канала имеются специальные регистры страниц (DMA page register), внешние по отношению к контроллерам 8237A. В отличие от адресных регистров контроллера 8237A регистры страниц при выполнении циклов DMA не модифицируются — в них по команде процессора до начала обмена по каналу загружается требуемое значение. В PC/AT регистры страниц хранят биты A[23:16] для 8-битных каналов и A[23:17] — для 16-битных. В PC/XT регистры страниц хранили только 4 бита A[19:16]. Контроллер 16-битных каналов подключен к шине адреса со смещением на 1 бит, так что линией А0 он не управляет. При передаче по 16-битным каналам всегда А0=0 (передачи слов по четным адресам). Счетчики циклов каналов — 16-разрядные, что позволяет передавать блоки до 64 К байт (для 8-битных каналов) или слов (для 16-битных каналов). При инициализации в счетчик загружается число, на единицу меньшее требуемого числа циклов, так что FFFF соответствует 65 534 передачам (2 16). В последнем цикле передачи (когда счетчик отсчитает требуемое количество циклов) контроллер вырабатывает сигнал завершения TC
, общий для всех каналов. Этот сигнал устройство может использовать для выработки сигнала прерывания, а программа может определить, какой канал «отстрелялся», прочитав регистр состояния каналов в контроллере DMA. В зависимости от выбранного режима по окончании счета контроллер либо остановит работу данного канала, либо выполнит автоматическую реинициализацию (автозагрузку) — восстановит прежде записанные значения регистра адреса и счетчика циклов и будет снова готов к пересылке такого же блока данных.
ВНИМАНИЕ
При достижении регистром-счетчиком адреса значения FFFFh следующее его значение будет 0000h, а внешний регистр адреса страницы, естественно, останется неизменным. Таким образом, если блок начинается не с границы 64 Кбайт страницы памяти, возможно его «сворачивание» в кольцо. Но если для процессоров 80x86 в реальном режиме сегменты, также «сворачиваемые» в кольца, могут начинаться с адреса любого 16-байтного параграфа (границы кратны 10h), то при прямом доступе эти границы кратны 10000h. Этот эффект обязательно необходимо учитывать при программировании прямого доступа — блок, пересекающий данную границу, должен пересылаться за два сеанса циклов DMA, между которыми канал (включая и регистр страниц) должен быть реинициализирован. Эффект «сворачивания» сегментов в 16-битных каналах аналогичен, только для каналов. 5–7 эти «кольца» имеют размер 64 Кбайт слов и границы, кратные 20000h.
Читать дальше