Рефераты. Программа воспроизведения произвольного звукового файла с использованием звукового адаптера (формат ...

Разрешает работу выхода на динамик (колонки и т. д.).

После сброса DSP этот канал выключен.

0D3h: выключить динамик (SB)

Отключает выход на динамик (колонки и т.д.).

0D4h: продолжить 8-битную DMA-операцию (SB) Продолжает DM А-операцию, остановленную командой 0D0h.

0D5h: остановить 16-битную DMA-операцию (SB)

Останавливает простую (без автоинициалнзаци и) 16-битную DMA-операцию.

0D6h: продолжить 16-битную DMA-операцию (SB).

Продолжает DMA-операцию, остановленную командой 0D5h.

0D8h: определить состояние динамика (SB).

Возвращает 00h, если динамик выключен; 0FFh, если включен.

0D9h: завершить 16-битную DMA-операцию с автоинициализацией (SB16).

 Эта команда завершает операцию только после окончания воспроизведения теку­щего блока. Для немедленного прекращения воспроизведения необходимо выпол­нить последовательно команды 0D3h, 0D5h, 0D9h и 0D5h.

0DAh: завершить 8-битную DMA-операцию с автоиницианизацией (SB2) Аналог 0D9h, но для 8-битных операций.

0E0h, BYTE: проверка наличия DSP на этом порту (SB2)

Любой байт, посланный как аргумент к этой команде, возвращается при чтении из DSP в виде своего побитового дополнения (DSP выполняет над ним операцию NOT).

0E1h: определение номера версии DSP (SB) Возвращает последовательно старший и младший номера версии DSP:

1.? – SB

2.0 - SB2

3.0 - SBPro

3? - SBPro2

4.0? - SB16

4.11-SB16 SCSI-2

4.12 - AWE32

0E3h: чтение Copyright DSP (SBPro2)

Возвращает ASCIZ-строку с информацией Copyright данной платы.

0E4h, BYTE: запись в тестовый регистр (SB2)

Помещает байт в специальный неиспользуемый регистр, который сохраняется даже после переинициализацию DSP.

0E8h: чтение из тестового регистра (SB2)

Возвращает байт, помещенный ранее в тестовый регистр командой 0E1h 0F0h: генерация синусоидального сигнала (SB)

Запускает DSP на воспроизведение синусоидального сигнала с частотой около 2 кГц, который можно прервать только сбросом DSP.

0F2h: запрос на прерывание в 8-битном режиме (SB)

Генерирует прерывание от звуковой карты. В качестве подтверждения от обработ­чика ожидается чтение из порта 22Еh.

0F3h: запрос на прерывание в 16-битном режиме (SB)

Генерирует прерывание от звуковой карты. В качестве подтверждения от обработ­чика ожидается чтение из порта 22Fh.

 0FBh: состояние PSP (SB16) Возвращает байт состояния текущей DSP-операции:

           бит 0: 8-битное воспроизведение через DMA   

           бит 1: 8-битное чтение через DMA

           бит 2: 16-битное воспроизведение через DMA

           бит 3: 16-битное чтение через DMA

           бит 4: динамик включен

           биты 5-6: не определены

           бит 7: ТС модифицирована (может быть ноль, если предыдущая команда 40h пыталась  

                      установить неподдерживаемую частоту)

0FCh: дополнительная информация (SB16).

Возвращает дополнительный байт состояния текущей DMA-операции:

бит 1: синхронный режим (одновременная запись и воспроизведение)

бит 2:8-битный режим с автоинициализацией

бит 4: 16-битный режим с автоинициализацией

0FDh: последняя выполненная команда (SB16).

 Возвращает последнюю успешную команду DSP.











 

Программирование  контроллера 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

бит 7, 6,5, 4: установлен запрос на DMA на канале 3/7, 2/6,1/5,0/4

бит 3, 2, 1, 0; закончился DMA на канале 3/7, 2/6, 1/5, 0/4

порт 08h/D0h для записи: регистр команд DMA (устанавливается BIOS)

бит 7: сигнал DACK использует высокий уровень

бит 6: сигнал DREQ использует высокий уровень

бит 5: 1/0: расширенный/задержанный цикл записи

бит 4: 1/0: приоритеты сменяются циклически/фиксировано

бит 3: сжатие во времени

бит 2: DMА-контроллер отключен

бит 1: разрешен захват канала 0 (для режима память-память)

бит 0: включен режим память-память (канал 0 - канал 1)

порт O9h/0D2h для записи: регистр запроса DMA

бит 2: 1/0: установка/сброс запроса на DMA

биты 1-0: номер канала (00, 01, 10,11 - 0/4, 1/5, 2/6, 3/7)

порт 0Ah/0D4h для записи: регистр маски канала DMA

бит 2: 1/0: установка/сброс маскирующего бита

биты 1-0: номер канала (00,01, 10, И -0/4, 1/5,2/6,3/7)

порт 0Bh/OD6h для записи: регистр режима DMA

биты 7-6:

     00 - передача по запросу

     01 - одиночная передача (используется для звука)

     10 - блочная передача (используется для дисков)

     11 - канал занят для каскадирования

бит 5: 1/0: адреса уменьшаются/увеличиваются

бит 4: режим автоинициализации

биты 3-2:

       00  - проверка

       01 - запись

       10 - чтение

биты 1-0: номер канала (00, 01, 10, 11 - 0/4, 1/5, 2/6, 3/7)

порт 0Ch/0D8k для записи: сброс переключателя младший/старший байт

Для чтения/записи 16-биткых значений из/в 8-битные порты 00h-08h. Очередной байт, переданный в эти порты, будет считаться младшим, а сле­дующий за ним - старшим.

порт 0Dh/0DAh для записи: сброс контроллера DMA

Любая запись сюда приводит к полному сбросу DMA-контроллера, так что его надо инициализировать заново.

порт 0Dh/0DAh для чтения: последний переданный байт/слово.

порт 0Eh/0DCh для записи: любая запись снимает маскирующие биты со всех каналов

порт 0Fh/0DEh для записи: регистр маски всех каналов:

  биты 3-0: маскирующие биты каналов 3/7, 2/6, 1/5, 0/4

            Чаще всего внешнее устройство само инициализирует передачу данных, и все, что необходимо сделать программе, - это записать адрес начала буфера в порты, соответствующие используемому каналу, длину передаваемого блока данных ми­нус один в регистр счетчика нужного канала, установить режим работы канала и снять маскирующий бит.








Описание функции Open_file

open_file proc near

     mov  ax,3D00h ;Выполнить функцию DOS  3Dh: AH=3Dh,установим 

                     режим доступа AL=00 – открыть для чтения

                     

     mov  dx,offset filename ;Заносим в dx смещение filename и 

                               теперь в DS:DX –полный адрес ASCIZ-

                               строки с именем файла

     int  21h      ;Передать управление операц. системе и открыть  

                    файл для чтения

     jc   error_exit    ; если не удалось открыть файл,перейти на   

                           метку error_exit

     mov  bx,ax    ; заносим идентификатор файла в BX, 

                       необходимо для команды 42h

     mov ax,4200h ;Команда для перемещения указателя чтения/записи AH=42h,  

Страницы: 1, 2, 3, 4



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.