Курсовая работа: Программа воспроизведения произвольного звукового файла с использованием звукового адаптера (формат - wav)
Программирование контроллера DMA
Контроллер DMA используется для обмена данными между внешними устройствами и памятью. Он нужен в работе с жесткими дисками и дисководами, звуковыми платами и другими устройствами, работающими со значительными объемами данных. Начиная с PC AT, в компьютерах присутствуют два DMA-контроллера - 8-битный (с каналами 0, 1, 2 и 3) и 16-битный (с каналами 4, 5, 6 и 7). Канал 2 используется для обмена данными с дисководами, канал 3 - для жестких дисков, канал 4 теряется при каскадировании контроллеров, а назначение остальных каналов может варьироваться.
DMA позволяет выполнить чтение или запись блока данных, начинающегося с линейного адреса, который описывается как 20-битное число для первого DMA-контроллера и как 24-битное для второго, то есть данные для 8-битного DMA должны располагаться в пределах первого мегабайта памяти, а для второго - в пределах первых 16 Мб. Старшие четыре бита для 20-битных адресов и старшие 8 бит для 24-битных адресов хранятся в регистрах страниц DMA, адресуемых через порты 80h - 8Fh:
порт 81h: страничный адрес для канала 2 (биты 3-0 = биты 19-16 адреса)
порт 82h страничный адрес для канала 3 (биты 3-0 = биты 19-16 адреса)
порт 83h: страничный адрес для канала 1 (биты 3-0 = биты 19-16 адреса)
порт 87h: страничный адрес для канала 0 (биты 3-0 = биты 19-16 адреса)
порт 89h: страничный адрес для канала 6 (биты 7-0 = биты 23-17 адреса)
порт 8Аh: страничный адрес для канала 7 (биты 7-0 = биты 23-17 адреса)
порт 8Bh: страничный адрес для канала 5 (биты 7-0 = биты 23-17 адреса)
Страничный адрес определяет начало 64/128-килобайтного участка памяти, с которым будет работать данный канал, поэтому при передаче данных через DMA обязательно надо следить за тем, чтобы не было выхода за границы этого участка, то есть чтобы не было попытки пересечения адреса 1000h:0, 2000h:0, 3000h:0 для первого DMA или 2000h:0, 4000h:0, 6000h:0 для второго.
Младшие 16 бит адреса записывают в следующие порты:
00h: биты 15-0 адреса блока данных для канала 0
01h: счетчик переданных байт канала 0
02h - 03 h: аналогично для канала 1
04h - 05h: аналогично для канала 2
06h - 07h: аналогично для канала 3
(для этих портов используются две операции чтения/записи - сначала передаются
биты 7-0, затем биты 15-8)
0C0h: биты 8-1 адреса блока данных для канала 4 (бит 0 адреса всегда равен нулю)
0C1h: биты 16-9 адреса блока данных для канала4
0С2 h: младший байт счетчика переданных слов канала 4
0C3h: старший байт счетчика переданных слов канала 4
0C4h - 0C7h: аналогично для канала 5
0C8h - 0CBh: аналогично для канала 5
0CCh - 0CFh: аналогично для канала 5
(эти порты рассчитаны на чтение/запись целыми словами)
Каждый из указанных двух DMА-контроллеров также имеет собственный набор управляющих регистров - регистры первого контроллера адресуются через порты 08h - 0Fh, а второго - через 0D0 - 0DFh:
порт 08h/0D0h для чтения: регистр состояния DMA