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

; wavdma<m:mathPr> <m:mathFont m:val=«Cambria Math»/> <m:brkBin m:val=«before»/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val=«off»/> <m:dispDef/> <m:lMargin m:val=«0»/> <m:rMargin m:val=«0»/> <m:defJc m:val=«centerGroup»/> <m:wrapIndent m:val=«1440»/> <m:intLim m:val=«subSup»/> <m:naryLim m:val=«undOvr»/> </m:mathPr>Федеральное агентство по науке и образованию

Российской Федерации.

Брянский государственный технический университет.

Кафедра информатики и программного обеспечения.

Курсоваяработа

по дисциплине

 «ОрганизацияЭВМ»

на тему:

«Программавоспроизведения произвольного звукового файла с использованием звуковогоадаптера (формат — wav)».

                                                                                     Студент:

                                                                                                Изотов И.Н.

                                                                           Группа:

                                                                             06ПО3(с)

                                                                                              Преподаватель:

                                                                                                     Статутов А.Г.      

Брянск 2007

Содержание

стр.

Введение---------------------------------------------------------------------------------------3

Устройство звуковойплаты  Sound Blaster---------------------------------------------4

ПрограммированиеDSP--------------------------------------------------------------------5

КомандыDSP---------------------------------------------------------------------------------7

Программирование  контроллера DMA------------------------------------------------12

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

Алгоритм и блок-схема--------------------------------------------------------------------18

Компиляция----------------------------------------------------------------------------------19

Код исходной  программы(начало)-----------------------------------------------------20

Заключение----------------------------------------------------------------------------------25

Литература-----------------------------------------------------------------------------------26

Введение

Программированиесовременных звуковых плат — весьма сложное занятие. В качестве примерарассмотрим одну часто применяемую операцию – воспроизведение оцифрованногозвука. Для вывода звука через звуковую плату может использоваться один из трехрежимов: пряной вывод (команда 10h),когда программа должна сама с нужной частотой посылать отдельные байты изоцифрованного звука в DSP;простой DMA-режим,когда выводится блок данных, после чего вызывается прерывания; и DMA савтоинициализацией, когда данные выводятся непрерывно и после вызова каждогоблока вызывается прерывание. Именно в этом порядке увеличивается качество воспроизводимого звука. В первом случаикачество звука будет очень плохим, поэтому будем реализовывать второй случай,благодаря чему мы сможем указать точную скорость оцифровки звука и выводить16-битный звук.  Данная программаработает только на звуковых платах  SoundBlaster.

 

Устройствозвуковой платы  Sound Blaster

Звуковыеплаты совместимые с теми или иными моделями Sound Blaster, выглядят как четыре независимых устройства:

1)     DSP(Digital Signal Processor)- устройство, позволяющее выводить и счи­тывать оцифрованный звук;

2)      Микшер (Mixer) — система регуляторовгромкости для всех каналов платы;

3)     DFM(Frequency Modulation)или AdLib (по названиюпервой звуковой пла­ты) — устройство, позволяющее синтезировать звук изсинусоидальных и треугольных волн. Слова типа OPL2 или OPL3 в описании платы — это и естьномера версии используемого FM-синтезатора;

4)      MIDI (Music InstrumentalDigital Interface)- стандартный интерфейс пере­дачи данных в музыкальной аппаратуре. Но в нашемслучае рассматривает­ся GMIDI(обобщенный MIDI) — более качественная система генерации му­зыки, в которой используются неискусственные синусоидальные сигналы, а образцы звучания различныхинструментов. К сожалению, качество этих образцов в большинстве дешевых платоставляет желать лучшего.

Номерапортов ввода-вывода, предоставляющих доступ ко всем этим устрой­ствам,отсчитываются от базового порта, обычно равного 220h, но допускаются также конфигурации с210h, 230h, 240h, 250h, 260h и280h. Кроме того,интерфейс — GMIDIиспользует другую серию портов, которая может начинаться как с 300h, так и с 330h. В описаниях портов мыбудем считать, что базовыми являются 220U и 300h.Область портов интерфейса с AdLibначинается с 388h.

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

- SB- Sound Blaster 1.0;

 - SB2 — Sound Blaster 2.0;

- SBPro — Sound Blaster Pro;

- SBPro2 — Sound Blaster Pro2;

- SB16 — Sound Blaster 16;

- ASP — Sound Blaster 16 ASP;

- AWE — Sound Blaster AWE32.

ПрограммированиеDSP

Цифровойпроцессор — наиболее важная часть звуковой платы. Именно с его помощьюосуществляется вывод обычного оцифрованного звука, так же как и за­пись звукаиз внешнего источника в файл. Для своей работы, помимо описывае­мых в этомразделе портов, DSPиспользует прерывания и контроллер прямого доступа к памяти DMA. Программирование DMA мырассмотрим далее. DSPобслуживается при помощи следующих портов:

226h для записи: сброс DSP (SB)

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

Процедурасброса осуществляется следующим образом:

1.    В порт 226h записывается число 1 (началоинициализации).

2.    Выдерживается пауза как минимум 3,3 мкс.

3.    Впорт 226h записываетсячисло 0 (конец инициализации).

4.  Выдерживается пауза максимум 100 мкс. Втечение паузы можно выполнять чтение порта 22Eh. Когда в считываемом числе будет установлен бит 7 (дан­ныеготовы), можно сразу переходить к пункту 5. В противном случае имеет смыслповторить процедуру, используя другой базовый порт.

5.  Выполняется чтение из порта 22Ah. Если считанное числоравно 0AAh — DSP был успешно инициализирован.В противном случае допускается вернуться к пункту 4, но по истечении 100 мкспосле записи в 226hможно будет с уверен­ностью сказать, что DSP с базовым адресом 220h не существует или не работает.

22Ah для чтения: чтениеданных из DSP (SB)

Чтениеиз этого порта используется для передачи всех возможных данных от DSPпрограммам. Процедура чтения состоит из двух шагов;

1.  Выполнять цикл чтения порта 22Eh, пока бит 7 считываемогобайта не ока­жется равным единице.

2.   Выполнить чтение из порта 22Ah.

22CН для записи: записьданных и команд DSP(начиная с SB)

Этотединственный порт используется для передачи всего множества команд DSP и для пересылки в негоданных (аргументов команд). Процедура записи:

1. Выполнятьцикл чтения порта 22Ch,пока бит 7 считываемого байта не ока­жется равным нулю.

2.  Выполнить запись в порт 22Ch.

22Ch для чтения: готовностьDSP для приема команды(SB)

Еслипри чтении из этого порта бит 7 сброшен в ноль — DSP готов к приему оче­редного байта впорт 22Ch на запись.Значение остальных битов не определено.

22Eh для чтения: готовностьDSP для посылки данных(начиная с SB)

Еслипри чтении из этого порта бит 7 установлен в единицу — DSP готов к пере­даче через порт 22Ah очередного байта.

22Eh для чтения (тот же порт!):подтверждение обработки 8-битного прерыва­ния (SB)

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

22Fh для чтения:подтверждение обработки 16-битного прерывания (SB16)

Обработчикпрерывания, сгенерированного звуковой платой по окончании 16-битной операции,обязательно должен выполнить одно чтение из этого пор­та перед завершением(помимо обычной процедуры посылки сигнала ЕОI в со­ответствующий контроллер прерываний).

Теперьрассмотрим команды DSP.Все они пересылаются в звуковую плату че­рез порт 22Ch, как описано выше. После командымогут следовать аргументы которые передаются таким же образом (включая ожиданиеготовности к приему команды).

Команды DSP

04h: состояние DSP (устаревшая) (SB2 — SBPro2)

Возвращаетинформацию о текущей операции DSP:

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

бит 1:стерео АЦП включен

бит 2:всегда 0

бит 3:происходит прямое воспроизведение 8-битного РСМ

бит 4:происходит воспроизведение 2-битного ADPCM через DMA

бит 5:происходит воспроизведение 2,6-битного ADPCM через DMA

бит 6:происходит воспроизведение 4-битного ADPCM через DMA

бит 7:происходит воспроизведение 8-битного РСМ через DMA

10h, NN: прямое воспроизведение 8-бйтногозвука (SB)

Выводиточередной байт (NN) изнесжатого 8-битного оцифрованного звука на воспроизведение. При использованииэтого способа воспроизведения сама про­грамма должна заботиться о том, чтобыновые данные всегда были наготове (то есть не считывать их с диска в ходеработы) и чтобы байты пересылались в DSP с необходимой частотой. (В этом режиме поддерживаются частотыдо 23 кГц.) Процедура вывода проста:

1.         Вывести в DSP команду 10h и очередной байт из оцифровки.

2.        Подождать необходимое время и вернутьсяк пункту 1.

Чтобывыполнять пересылку байтов с заданной частотой, обычно перепрог­раммируютсистемный таймер. Но из-за ограничений по качеству звука и высокойресурсоемкости такой способ вос­произведения практически не используется.

14h, LO, HI: прямоевоспроизведение 8-битного РСМ через DMA (SB).Начинает процесс воспроизведения данных, на которые настроен соответствую­щийканал DMA :

1. Установитьобработчик прерывания от звуковой платы (и разрешить его в контроллерепрерываний).

2.    Выполнить команду 40h или другим образом установить частотуоцифровки.

3.    Выполнить команду ODlh (включить динамик).

4.    Настроить DMA (режим 48h + номер канала).

5.   Выполнитькоманду 14h. Аргументы LO и HI — это младший и старший бай­ты длиныпроигрываемого участка минус один.

6.   Из обработчика прерывания подтвердить егочтением порта 22Е h ипосылкой байта 20h всоответствующий контроллер прерываний.

7.      Выполнить команду 0D3h (выключить динамик).

Наплатах, начиная с SB16,для этого режима рекомендуется пользоваться командами 0C?h.

16h, LO, HI: прямое воспроизведение 2-битногоADPCM через DMA (SB). Начинает процесс воспроизведенияданных аналогично команде 14h,но они долж­ны храниться в сжатом формате Creative ADPCM 2 bit. Длина, указываемая в каче­ствеаргументов этой команды, равна (число_6айтов + 2)/4. В качестве нулевого байтав процедуре распаковки ADPCMиспользуется значение, которое применя­лось последней командой 17h. В остальном процедуравоспроизведения аналогич­на команде 1 Ah.

17h, LO, HI: прямое воспроизведение 2-битногоADPCM через DMA с новым ну­левым бантом (SB).

То жесамое, что и 16h, нопервый байт из данных будет рассматриваться как ну­левой байт для процедурыраспаковки ADPCM.

1Ch: воспроизведение8-битного PСМ через DMA с автоинициализацией (SB2) Начинает режимвоспроизведения с автоинициализацией — лучший из режимов, предлагаемыхзвуковыми платами. В этом режиме DSP воспроизводит в цикле содержимое указанного участка памяти,мгновенно возвращаясь на начало, пока он не будет остановлен командой 0DAh или новой командойвоспроизведения через DMA.Весь секрет заключается в том, что плата генерирует прерывание не только придостижении конца блока, но и при достижении его середины. Таким образом, пока DSP проигрывает вторуюполовину буфера, мы можем прочитать следующие несколько килобайтов в первуюполовину, не останавливая воспроиз­ведение ни на миг:

1.               

    контроллере прерываний.

2.        Выполнить команду 40h или другим образом установить частотуоцифровки.

3.        Выполнить команду 48h (установить размер DMA-буфера — (число байтов +    

               1)/2 — 1).

4.        Выполнить команду 0Dlh (включить динамик).

5.        Настроить DMA (режим 58h + номер канала).

6.        Выполнить команду 1Ch

7.        В обработчике прерывания: заполнитьследующую половину буфера.

8.        В обработчике прерывания: подтвердитьпрерывание чтением из 22Ehи 

                записью 20h в контроллер прерываний.

9.        Подождать, пока не будут воспроизведенывсе данные.

10.      Выполнить команду 0D3h (выключить динамик).

11.      Выполнить команду 0D0h (остановить 8-битную DMA-передачу).

12.         Выполнить команду 0DAh (завершить режим автоннициалиэации).

13.         Выполнить команду 0D0h (остановить 8-битную DMA-передачу).

На платах, начиная с SB16, для этого режимарекомендуется пользоваться ко­мандами 0С? h.  

1Fb: воспроизведение 2-битногоADPCM через DMA с автоинициализацией (SB2)

Аналог команды 1Ch, но данные хранятся в2-битном формате ADPCMс нуле­вым байтом. Длина блока рассчитывается так: длина = (число байтов + 3)/4+ 1 длина блока = (длина + 1)/2 — 1

20h: прямое чтение 8-битныхданных из АЦП (SB)

Команда предназначена длячтения оцифрованного звука из внешнего источни­ка. Используется следующаяпроцедура:

1.         Выполнить команду 20h.

2.         Прочитать очередной байт.

3.        Подождать необходимое время и вернутьсяк пункту 1

Проблемы с этой командойточно такие же, как и с 10h.

24h, LO, HI: чтение 8-битного РСМ через DMA (SB)

Аналог команды 14h, но выполняет невоспроизведение, а запись звука. Последо­вательность действий идентична случаюс 14h, но используемыйрежим DMA -44h + номер канала.

2Ch: запись 8-бнтного РСМчерез DМА савтоинициализацией (SB2)Аналог команды 1Ch, новыполняет не воспроизведении, а запись звука. Последо­вательность действийидентична случаю с 1Ch,но используемый режим DMA-54h + номер канала.

30h: прямое чтение MIDI (SB)

Выполняет чтениеочередного MIDI-события:

1.       Выполнить команду З0h.

2.        Прочитать MIDI-событие (до 64 байт).

31h: чтение MIDI с прерыванием (SB)

Включает генерациюпрерывания от звуковой платы при поступлении нового

MIDI-события. Для этого необходимо:

1.        Установить обработчик прерывания.

2.        Выполнить команду 31h.

3.        В обработчике прерывания: прочитать MIDI-событие.

4.        В обработчике прерывания: подтвердитьпрерывание чтением из 22Eh и  

                записью 20h в контроллер прерываний.

5.        Выполнить команду 31h еще раз, чтобы отменить генерациюпрерывания.

32h: прямое чтение MIDI-события с дельта временем(SB)

Выполняет чтениеочередного MJDI-событияи 24-битного дельта времени, то есть времени в микросекундах, наступившегопосле предшествующего MIDI-со­бытия.(Считываются данные в следующем порядке: младший байт времени, средний байтвремени, старший байт времени, MIDI-команда.)Именно в виде последовательности MIDI-событий, перед каждым из которых указано дельта-время, изаписывается музыка в MIDI-файлах.

32h: чтение MIDI-события с дельтавременем с прерыванием (SB).Включает/выключает генерацию прерываний от звуковой платы аналогично ко­манде31h, но при чтении MIDI-события передаютсявместе с дельта временами, как в команде 32h.

34h: режим прямого доступак UART (SB2).

Отключает DSP, после чего все командызаписи/чтения в его порты (используя тот же механизм проверки готовности)рассматриваются как MIDI-события.Вы­вести DSP из этогорежима можно только с помощью полной переинициализации.

37 h: режим прямого доступак UART с прерыванием (SB2)

Переключает порты DSP на UART аналогично команде 34h, но каждый раз, ког­дановое MIDI-событиеготово для чтения, вызывается прерывание звуковой платы.

38h: MIDI прямая запись MIDI (SB).

 Посылает одно MIDI-событие.

40 h, ТС: установитьвременную константу (SB)

Устанавливает частотуоцифровки, используя однобайтную константу, рассчиты­ваемую следующим образом:

ТС = 256 — (1000000 /(число_каналов * частота)), где число_каналов — 1 для моно и 2 для стерео.

41h, LO, HI: установить частоту оцифровки (SB16)

Аналогично 40h, но указывается истинноезначение частоты (сначала младший, потом старший байты). Число каналовопределяется автоматически. Реальная частота тем не менее округляется доближайшего возможного значения ТС.

45h: продолжитьостановленное 8-битное воспроизведение через DMA (SB16)Продолжает остановленное командой 0DAh воспроизведение 8-битного звука через DMA с автоинициализацией.

47h: продолжитьостановленное 16-битное воспроизведение через DMA (SB16). Продолжает остановленное командой 0D9h воспроизведение 16-битного звука через DMA с автоинициализацией.

48h, LO, HI: установить размер буфера DMA (SB2)

Устанавливает число байтовминус один для следующей команды передачи через DMA (сначала младший байт, затемстарший).

74h, LO, HI: прямое воспроизведение 4-битногоADPCM через DMA (SB).

 Аналог 16h, но используется 4-битный вариант формата Creative ADPCM.

75h, LO, HI: прямое воспроизведение 4-битногоADPCM через DMA с новым ну­левым байтом (SB).

 Аналог 17h, но используется 4-битный вариант формата Creative ADPCM.

76h, LO, HI: прямое воспроизведение2,6-битного ADPCM черезDMA (SB).

 Аналог 16h, но используется 2,6-битный вариант формата Creative ADPCM.

77h, LO, HI: прямое воспроизведение2,6-битного ADPCM черезDMA с новым нулевымбайтом (SB).

Аналог 17h, но используется 2,6-битный вариантформата Creative ADPCM.

7Dh: воспроизведение4-битного ADPCM через DMA с автоинициализацией (SB2).

 Аналог lFh, но используется 4-битный вариант формата Creative ADPCM.

7Fh: воспроизведение2,6: битного ADPCM черезDMA с автоинициализацией (SB2).

 Аналог 1Fh, но используется 2,6-битный вариант формата Creative ADPCM.

80h, LO, HI: заглушить DSP (SB)

Вывести указанное числобайтов тишины с текущей частотой оцифровки. 

B?h/0C?h MODE, LO, HI: обобщенный интерфейс к DSP (SB16)

Команды 0B?h используются для 16-битных операций, команды 0C?h – для 8-битных. Младшие четыре битаопределяют режим:

бит 0:всегда 0

бит 1:используется FIFO

бит 2:используется автоинициализация DMA

бит 3:направление передачи (0 — воспроизведение, 1 — оцифровка)

Аргументы этой команды — режим, младший байт длины, старший байт дли­ны (перед указанной командой нетребуется устанавливать размер DMA-буфераспециально)

В байте режима определенывсего два бита (остальные должны быть равны нулю):

бит 4:данные рассматриваются как числа со знаком

бит 5:режим стерео

Длина во всех случаяхравна числу байтов минус один для 8-битных операций и числу слов минус один для16-битных.                                                                                  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

E1h: определение номера версии 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 данной платы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FDh: последняявыполненная команда (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,  

                    AL=0 – от начала файла

     mov  cx,0    ; CX:DX — новое значение указателя

     mov  dx,38h  ; по этому адресу начинаются данные вtada.wav

     int  21h     ; переместим файловый указатель 

     mov ah,3Fh       ; Чтение из файла AH=3Fh

     mov  cx,27459 ; считать 27459 байтов в файле tada.wav

     push ds       ; заносим считанные данные встек

     mov dx,ds     

     and  dx,0F000h; выровняем буфер на границу 4K-страницы

     add  dx,1000h; складываем dxи 1000h, необход. для DMA

     mov  ds,dx

     mov  dx,0    ; DS:DX — адрес буфера

     int  21h     ; чтение файла

     pop  ds        ; выгрузить из стека данные в ds

     ret

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

     mov  ah,9    ; AH=09h

     mov  dx,offset notopenmsg   ; DS:DX = адрес сообщения об 

                                 ; ошибке

     int  21h     ; вывод строки на экран

     int  20h     ; конец программы

notopenmsg    db   'Could not open file',0Dh,0Ah   ; сообщение об    

                                                 ; ошибке

         db   'Exiting',0Dh,0Ah,'$'

open_file endp

      Выход

<img src="/cache/referats/26913/image001.gif" v:shapes="_x0000_s1026 _x0000_s1027 _x0000_s1028">

      Начало

<img src="/cache/referats/26913/image002.gif" v:shapes="_x0000_s1029 _x0000_s1030 _x0000_s1031">Алгоритми блок-схема

   Инициализация

             DSP

1) В порт 226h записываем 1(начало инициализации)

2) Держим паузу не менее 3,3 мкс

3) В порт 226h записываем 0(конец инициализации)

4) Считываем порт 22Eh:

              если бит7=1, то можно считать с порта 22Ah;

              иначе повторить попытку 100 раз;

5) Считываем порт 22Ah:

              если значение=0AAh –D SP успешно  

                   инициализирован CF=0;

              иначе вернёмся к  пункту 4;

6) Через 100 попыток: если результат отрицательный, 

     значит DSP с портом 220h не существует CF=1.  

В bl заносим 0D1h – команда включить звук

Если CF=1

Если CF=0

не удалось считать

<img src="/cache/referats/26913/image003.gif" v:shapes="_x0000_s1033 _x0000_s1032"> <img src="/cache/referats/26913/image004.gif" " v:shapes="_x0000_s1038" " v:dpi=«96»><img src="/cache/referats/26913/image005.gif" CF=«1» " v:shapes="_x0000_s1041" v:dpi=«96»><img src="/cache/referats/26913/image006.gif" " v:shapes="_x0000_s1042" v:dpi=«96»><img src="/cache/referats/26913/image007.gif" v:shapes="_x0000_s1036 _x0000_s1037 _x0000_s1039 _x0000_s1047 _x0000_s1040 _x0000_s1044 _x0000_s1035 _x0000_s1043 _x0000_s1045 _x0000_s1046 _x0000_s1048 _x0000_s1034">


<img src="/cache/referats/26913/image008.gif" v:shapes="_x0000_s1049">

Функция dsp_write

посылает байт из bl в DSP

1) установить порт 22Ch;

2) Проверить готовность:

      — считываем и проверяем 7 бит

      — если значен. >0 – DSP готов к  

         записи

      — если знач. = 0 – повторить  

        попытку

3) Посылаем данные из bl в DSP

 

<img src="/cache/referats/26913/image009.gif" v:shapes="_x0000_s1050 _x0000_s1051 _x0000_s1052"><div v:shape="_x0000_s1053">

Считываем данные из файла

<img src="/cache/referats/26913/image010.gif" v:shapes="_x0000_s1054">                                             

удалось считать

Перехватываем прерывание звуковой карты и разрешаем его

В bl заносим 40h – установить скорость передачи

В bl заносим 0B2h – определить  константу 11025/Stereo

DMA передача данных

1) Замаскируем канал 1(рабочий канал1)

2) Устанавливаем режим передачи (49h=48h+1, где 48h-команда установки буфера DMA, 1-номер используемого канала)

3) Запишем в порт 02h(канал 1) 16 младших бит адреса блока данных

4) Старшие 4 бита адреса записываем в порт 83h.

5) В порт 03h запис. длину данных минус 1.

6) Скинуть маску с канала 1.

7)Выполнить команду 14h – прямое воспроизведения 8-байтного PCM через DMA.

8) Отправляем на DSP младшие и старшие байты длинны проигрываемого участка минус 1.

Восстановить прерывание

<img src="/cache/referats/26913/image011.gif" v:shapes="_x0000_s1057"> <img src="/cache/referats/26913/image012.gif" v:shapes="_x0000_s1070" " v:dpi=«96»><img src="/cache/referats/26913/image013.gif" v:shapes="_x0000_s1056 _x0000_s1055 _x0000_s1058 _x0000_s1060 _x0000_s1064 _x0000_s1061 _x0000_s1065 _x0000_s1068 _x0000_s1069 _x0000_s1071 _x0000_s1067 _x0000_s1059 _x0000_s1066 _x0000_s1063 _x0000_s1062"> <img src="/cache/referats/26913/image014.gif" v:shapes="_x0000_s1073 _x0000_s1072 _x0000_s1074">

еще рефераты
Еще работы по компьютерам. программированию