Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

9.1. Контроллер прямого доступа для IBM PC/XT

Контроллер прямого доступа для IBM PC/XT реализован на базе микросхемы Intel 8237A и содержит четыре канала. Эти каналы используются следующим образом:

0 обновление содержимого динамической памяти компьютера, этот канал имеет наивысший приоритет;
1 не используется;
2 адаптер накопителя на гибком магнитном диске (НГМД);
3 адаптер накопителя на магнитном диске (НМД) - этот канал имеет низший приоритет.

9.1.1. Регистры каналов DMA

Каждый канал содержит 16-разрядные регистры:

  • регистр текущего адреса CAR, содержит текущий адрес ячейки памяти при выполнении операции обмена данными с использованием DMA;
  • регистр циклов прямого доступа к памяти CWR, содержит число слов, предназначенных для передачи минус единица; при выполнении обмена данными регистр работает в режиме вычитания;
  • регистр хранения базового адреса BAR, используется для хранения базового адреса памяти, используемого при передачи данных; в процессе работы канала DMA содержимое этого регистра не изменяется;
  • регистр хранения базового числа циклов прямого доступа к памяти WCR; он хранит число циклов DMA, его содержимое также не изменяестя;
  • регистр режима MR, определяющий режим работы канала.

Приведем адреса регистров и их форматы для компьютеров IBM PC/XT.

Порты 00h - 07h

Эти регистры содержат базовые адреса и счетчики передаваемых данных каналов 0 - 3. Их назначение приводится в следующей таблице:

00h Запись: Базовый адрес канала 0
Чтение: Текущий адрес
01h Запись: Счетчик канала 0
Чтение: Текущий адрес
02h Запись: Базовый адрес канала 1
Чтение: Текущий адрес
03h Запись: Счетчик канала 1
Чтение: Текущий адрес
04h Запись: Базовый адрес канала 2
Чтение: Текущий адрес
05h Запись: Счетчик канала 2
Чтение: Текущий адрес
06h Запись: Базовый адрес канала 3
Чтение: Текущий адрес
07h Запись: Счетчик канала 3
Чтение: Текущий адрес

Порт 08h.

Этот порт используется при записи в качестве управляющего регистра и при чтении как регистр состояния.

Формат управляющего регистра:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
 ¦ ¦ ¦ ¦ ¦ ¦ ¦ L= 1 - использование режима память-память;
 ¦ ¦ ¦ ¦ ¦ ¦ ¦    0 - обычный режим работы;
 ¦ ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ ¦ L=== если используется режим память-память,
 ¦ ¦ ¦ ¦ ¦ ¦      то 1 в этом разряде разрешает захват 
 ¦ ¦ ¦ ¦ ¦ ¦      канала, 0 - запрещает;
 ¦ ¦ ¦ ¦ ¦ ¦      в обычном режиме работы состояние этого
 ¦ ¦ ¦ ¦ ¦ ¦      бита безразлично;
 ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ L===== 1 - запрет работы DMA;
 ¦ ¦ ¦ ¦ ¦        0 - разрешение работы DMA;
 ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ L======= 1 - использование сжатия во времени, если
 ¦ ¦ ¦ ¦              установлен бит обычного режима работы;
 ¦ ¦ ¦ ¦          0 - обычный режим работы;
 ¦ ¦ ¦ ¦
 ¦ ¦ ¦ L========= 1 - вращение приоритетов;
 ¦ ¦ ¦            0 - фиксированные приоритеты;
 ¦ ¦ ¦
 ¦ ¦ L=========== 1 - удлиненный цикл записи;
 ¦ ¦              0 - нормальный цикл записи;
 ¦ ¦
 ¦ L============= 1 - используется низкий уровень для
 ¦                    сигнала запроса на DMA DREQ;
 ¦                0 - используется высокий уровень;
 ¦
 L=============== 1 - используется высокий уровень для
                  сигнала подтверждения DMA DACK;
                  0 - используется низкий уровень;


Обычно этот регистр инициализируется BIOS в процессе тестирования системы и впоследствии изменять режим работы контроллера DMA не требуется. Ошибки при инициализации этого порта могут привести к "зависанию" системы.

При чтении из порта 08h программа получает слово состояния контроллера DMA:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦       ¦       ¦
LT+-+-+T+T+-+-+T-
 L==T==- L=====¦= биты 0-3 устанавливаются в 1 при
    ¦             достижении счетчиками каналов 0-3
    ¦             конечных значений;
    ¦
    L============ биты 4-7 установлены в 1, если
                  имеется разрешение на DMA
                  соответственно, каналов 0-3.


Порт 09h.

Регистр запроса. Предназначен для организации программного (а не аппаратного) запроса на DMA. Для использования программного запроса канал должен быть запрограммирован в режиме блочной передачи.

Формат регистра:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦         ¦ ¦   ¦
LT+-+-+-+T+T+T+T-
 L===T===- ¦ L=¦= номер используемого канала:
     ¦     ¦        00 - канал 0;
     ¦     ¦        01 - канал 1;
     ¦     ¦        10 - канал 2;
     ¦     ¦        11 - канал 3;
     ¦     ¦
     ¦     L===== 0 - установить запрос;
     ¦            1 - сбросить запрос;
     ¦
     L=========== не используются.


Порт 0Ah

Регистр маски. Используется для маскирования запросов на прямой доступ для отдельных каналов:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦         ¦ ¦   ¦
LT+-+-+-+T+T+T+T-
 L===T===- ¦ L=¦= номер канала:
     ¦     ¦        00 - канал 0;
     ¦     ¦        01 - канал 1;
     ¦     ¦        10 - канал 2;
     ¦     ¦        11 - канал 3;
     ¦     ¦
     ¦     L===== 0 - установить маску;
     ¦            1 - сбросить маску;
     ¦
     L=========== не используются.


Порт 0Bh

Регистр режима. Служит для определения режимов работы каналов контроллера DMA:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦   ¦ ¦ ¦   ¦   ¦
LT+T+T+T+T+T+T+T-
 L=¦ ¦ ¦ L=¦ L=¦= номер канала:
   ¦ ¦ ¦   ¦        00 - канал 0;
   ¦ ¦ ¦   ¦        01 - канал 1;
   ¦ ¦ ¦   ¦        10 - канал 2;
   ¦ ¦ ¦   ¦        11 - канал 3;
   ¦ ¦ ¦   ¦
   ¦ ¦ ¦   L===== тип цикла DMA:
   ¦ ¦ ¦            00 - цикл проверки;
   ¦ ¦ ¦            01 - цикл записи;
   ¦ ¦ ¦            10 - цикл чтения;
   ¦ ¦ ¦            11 - запрещенная комбинация;
   ¦ ¦ ¦
   ¦ ¦ L========= 1 - режим автоинициализации;
   ¦ ¦
   ¦ L=========== приращение адреса:
   ¦                0 - инкрементирование;
   ¦                1 - декрементирование;
   ¦
   L============= режим обслуживания:
                    00 - передача по требованию;
                    01 -    одиночная передача;
                    10 -    блочная передача;
                    11 -    каскадироание.


Порт 0Ch

Сброс триггера байтов. Для загрузки внутренних 16-разрядных регистров контроллера используется последовательный вывод младшего, затем старшего байтов слова. После сброса триггера байтов можно начинать загрузку 16-разрядных регистров.

Порт 0Dh

Запись в этот порт вызывает сброс контроллера. Для дальнейшего использования контроллер должен быть заново проинициализирован.

Порт 0Eh

Сброс регистра маски. После записи в этот регистр любого значения разрешается работа всех четырех каналов прямого доступа.

Порт 0Fh

Маскирование/размаскирование каналов. С помощью этого порта можно выполнить одновременное маскирование или размаскирование нескольких каналов:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦       ¦ ¦ ¦ ¦ ¦
LT+-+-+T+T+T+T+T-
 L==T==- ¦ ¦ ¦ L= 1 - маскирование канала 0;
    ¦    ¦ ¦ ¦    0 - разрешение канала 0;
    ¦    ¦ ¦ ¦
    ¦    ¦ ¦ L=== 1 - маскирование канала 1;
    ¦    ¦ ¦      0 - разрешение канала 1;
    ¦    ¦ ¦
    ¦    ¦ L===== 1 - маскирование канала 2;
    ¦    ¦        0 - разрешение канала 2;
    ¦    ¦
    ¦    L======= 1 - маскирование канала 3;
    ¦             0 - разрешение канала 3;
    ¦
    L============ не используются.



Порты 81h-8Fh

Это порты регистров страниц.

Для работы с памятью контроллер прямого доступа использует 20-разрядные физические адреса. Шестнадцать младших битов адреса необходимо записать в регистр базового адреса канала. Старшие четыре бита - биты 16-19 - должны быть записаны в соответствующие порты регистров страниц.

При инициализации регистров базового адреса и регистра страниц необходимо следить за тем, чтобы в процессе передачи данных не происходил переход за границу 64 килобайта.

Для адресации регистров страниц можно использовать следующие порты:

81h Регистр страниц канала 2
82h Регистр страниц канала 3
83h Регистр страниц канала 1

9.1.2. Инициализация канала DMA

Для инициализации канала программа должна выполнить следующие шаги:

  • сбросить триггер байтов командой записи в регистр 0Ch;
  • задать режим работы канала, выполнив запись по адресу 0Bh в регистр режима MR;
  • заслать младшие 16 битов 20-битового адреса области памяти, которая будет использована для передачи данных, в регистр базового адеса (адрес порта зависит от номера канала: 0 канал использует адрес 00h, 1 канал - 02h, 2 канал - 04h, 3 канал - 06h);
  • заслать номер страницы (старшие 4 бита 20-битового адреса) в регистр страниц 81h;
  • загрузить регистр циклов прямого доступа к памяти CWR значением, на 1 меньше требуемого количества передаваемых байтов (адреса этих портов для каналов 0...3, соответственно, 01h, 03h, 05h, 07h;
  • разрешить работу канала, выполнив запись в регистр маски каналов по адресу 0Ah.

Сразу после разрешения канал начинает передачу данных. После окончания передачи данных устройство обычно вырабатывает прерывание, которое служит признаком окончания передачи данных.

[Назад] [Содеожание] [Дальше]