Программируем Sound Blaster
Управление звуковым каналом sound blaster осуществляется через следующие
регистры платы:
регистр 06h работает на запись.Предназначен для инициализации платы.
пишешь 1 в поpт БА + 6h , четыpе pаза из него читаешь
(на некотоpых каpтах можно меньше, это в качестве задеpжки) пишешь
0 в поpт БА + 6h ,читаешь из БА+0Ah пока не считаешь 0aah ,если после
ста считываний(слово-то какое :) не полyчишь 0aah значить ошибка.
регистр 0Ah работает на чтение.Предназначен для ввода звуковых данных.
регистр 0Ch - на запись - регистр данных и команд
- на чтение - статус буфера данных и команд
регистр 0Eh при чтении выдает статус данных и команд
При работе с регистрами необходимо
-для записи
-опрашивать регистр 0Ch до тех пор пока его старший бит не
станет равным 0.
-записать данные в порт 0Ch
-для чтения:
-опрашивать порт 0Eh до тех пор пока старший бит не станет
равен 1
-считать данные с порта 0Ah
Программа чтения данных Программа записи данных
-------------------------¬ -------------------------¬
¦ ReadFromDSP proc ¦ ¦ WriteToDSP proc ¦
¦ mov dx,0Eh ¦ ¦ mov dx,0Ch ¦
¦ add dx,sbaddr ¦ ¦ add dx,sbaddr ¦
¦ wait: ¦ ¦ wait1: ¦
¦ in al,dx ¦ ¦ in al,dx ¦
¦ or al,al ¦ ¦ or al,al ¦
¦ jns wait ¦ ¦ js wait1 ¦
¦ sub dx,4 ¦ ¦ mov al,data ¦
¦ in al,dx ¦ ¦ out dx,al ¦
¦ mov data,al ¦ ¦ ¦
¦ ret ¦ ¦ ret ¦
¦ sbaddr dw 220h ¦ ¦ sbaddr dw 220h ¦
¦ data db ? ¦ ¦ data db ? ¦
L------------------------- L-------------------------
Чтобы узнать установлена ли плата SB нужно записать число 1 в порт 06h
и подождать 3 мкс,записать число 0 в тот же порт.
Cчитать данные - если в течение 100 мкс значение порта не станет равным
0AAh то SB не установлен.
КОМАНДЫ.
10h - вывести данные на ЦАП - с ее помощью проще всего воспроизводить
звук.Но ее вызовы нужно синхронизировать по таймеру.
для использования нужно
- выдать команду 10h
- записать байт данных
- повторять до до окончания выдачи данных
14h - вывод на ЦАП в режиме ПДП(DMA).
для ee использования нужно :
- загрузить данные в память(1 сегмент)
- запрогроммировать контроллер ПДП
(для краткости приведены только команды без описания):
- записать 5 в порт 0Ah
- записать 0 в порт 0Ch
- записать 49h в порт 0Bh
- записать мл.байт базового адреса в порт 02h
- записать ст.байт базового адреса в порт 02h
- записать номер сегмента в порт 83h
- записать мл.байт (длины данных - 1) в порт 03h
- записать ст.байт (длины данных - 1) в порт 03h
- записать 1 в порт 0Ah
- задать частоту дискретизации(команда 40h)
- выдать команду 14h
- записать длину последовательности данных L
(в два этапа: lo,hi)
- обработать прерывание,при этом сбросить
зв.плату(считать регистр 0Eh)
- сбросить контроллер прерываний (out 20h,20h)
20h - ввод данных с AЦП (аналогична 10h но для записи)
24h - ввод с АЦП в режиме ПДП(аналогична 14h для записи)
40h - задать частоту дискретизации(после команды выдать
параметр Т = 256-(1 000 000/частота дискретизации)
0D0h - остановить ПДП
0D4h - возобновить ПДП
0D1h - отключить звук(ЦАП)
0D3h - включить звук
----------------------------------------------------------------------
ФУНКЦИИ ДРАЙВЕРА
получить номер версии драйвера : -> BX=0000
<- AX=номер версии
задать базовый адрес платы : -> BX=0001
AX=баз.адрес
<- нет
задать номер прерывания платы : -> BX=0002
AX=номер прерывания
<- нет
инициализация платы : -> BX=0003
<- AX=0000,если нет ошибок
подключить/отключить DAC от усил.: -> BX=0004
AX=0000 - отключить
AX<>000 - включить
Задать адрес слова состояния -> BX=0005
ES:DI=адрес слова состояния
начать воспроизведение звука : -> BX=0006
AX=T(см выше)
DX:CX=длина данных
ES:DI=адрес начала данных
<- нет
остановить воспроизведение звука : -> BX=0008
<- нет
завершить работу : -> BX=0009
<- нет
----------------------------------------------------------------------
A0h установить моно режим АЦП(по умолчанию), } только
A8h установить стерео режим АЦП } SB Pro
11h аналогична 10h но 16-битная . сначала посылается мл.байт,затем
старший
21h аналогична 11h но для ввода . сначала считывается мл.байт,затем
старший
41h Установить чатоту ЦАП (в секунду) (только SB16)
41h Установить чатоту АЦП (в секунду) (только SB16)
B2h режим DMA 1 16-bit ЦАП (только SB16)
B2h 00h [length-1] - моно
B2h 30h [length-1] - стерео
B6h режим DMA 2 16-bit ЦАП (только SB16)
B6h 00h [length-1] - моно
B6h 30h [length-1] - стерео
BAh режим DMA 1 16-bit АЦП (SB16)
BAh 00h [length-1] - моно
BAh 30h [length-1] - стерео
BEh режим DMA 2 16-bit АЦП (SB16)
BEh 00h [length-1] - моно
BEh 30h [length-1] - стерео
C2h режим DMA 1 8-bit ЦАП (SB16)
C2h 00h [length-1] - моно
C2h 20h [length-1] - стерео
C6h режим DMA 2 8-bit DAC (SB16)
C6h 00h [length-1] - mono
C6h 20h [length-1] - stereo
CAh режим DMA 1 8-bit ADC (SB16)
CAh 00h [length-1] - mono
CAh 20h [length-1] - stereo
CEh режим DMA 2 8-bit АЦП (SB16)
CEh 00h [length-1] - mono
CEh 20h [length-1] - стерео
D5h остановить 16-bit DMA аналогично D0h (SB16)
D6h продолжить 16-bit DMA (SB16)
D8h получить статус динамиков (возможно обратна командам D1h&D3h)
D9h Прервать текущую 16-битную передачу ПДП в конце блока (SB16)
E3h Получить информацию о производителе (только SB16)
Считать строку,заканчивающуюся нулем из DSP (max.80h байтов включая ноль)
для фирменного SB16 строка(после преобразования в верхний регистр)должна
содержать 'COPYRIGHT (C) CREATIVE TECHNOLOGY'(21h символов)
Режим 1 - птандартный ввод/вывод.
Режим 2 - ввод/вывод с автоинициализацией.
Вы должны читать порт 2xF для определения 16-битного прерывания.
MИКСЕР
Миксер управляется 2мя I/O портами, 2x4h и 2x5h.Возможные значения "х"
-2,4 для Sound Blaster Pro
-2,4,6,8 для Sound Blaster 16
2x4h адресный порт (write only), 2x5h - data port (read/write)
Программирование миксера осуществляется путем:
- записи адреса(номера) регистра в порт 2x4h
- записи/считывания значения регистра через 2x5h
Регистры миксера:
--------T-------------------------------------------------------¬
¦регистр¦ D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 ¦
+-------+-------------------------------------------------------+
¦ ¦ Data Reset ¦
¦ 00h ¦ вы должны записать любое 8-битное значение в этот ¦
¦ ¦ регистр для сброса миксера(все регистры миксера ¦
¦ ¦ примут начальные значения принятые по умолчанию) ¦
+-------+---------------------------T---------------------------+
¦ 04h ¦ Voice Volume L ¦ Voice Volume R ¦
+-------+------T------T------T------+------T--------------------+
¦ 0Ah ¦ x ¦ x ¦ x ¦ x ¦ x ¦ MIC Mixing ¦
+-------+------+------+------+------+------+-------------T------+
¦ ¦ x ¦ x ¦ In Filter ¦ ADC ¦ x ¦
¦ ¦ Выбор фильтра: АЦП - выбор источника: ¦ This
¦ ¦ D5 D4 D3 D2 D1 ¦ register
¦ 0Ch ¦ 0 x 0 слабый фильтр 0 0 микрофон ¦is not used
¦ ¦ (default) (default) ¦ in SB16
¦ ¦ 0 x 1 сильный фильтр 0 1 CD audio ¦
¦ ¦ 1 x x фильтр отключен 1 0 микрофон ¦
¦ ¦ 1 1 лин.вход ¦
+-------+------T------T------T------T------T------T------T------+
¦ ¦ x ¦ x ¦ DNFI ¦ x ¦ x ¦ x ¦ VSTC ¦ x ¦ This
¦ ¦ Этот регистр определяет режимы выходного сигнала . ¦ register
¦ 0Eh ¦ DNFI 0 фильтр на выходе включен(default) ¦ is not use
¦ ¦ 1 фильтр bypassed ¦ in SB16
¦ ¦ VSTC 0 моно режим (default) ¦
¦ ¦ 1 стерео режим ¦
+-------+------T------T------T------T------T------T------T------+
¦ ¦ x ¦ x ¦ x ¦ x ¦LINEIN¦ CD ¦ MIC ¦ x ¦ This
¦ +------+------+------+------+ OUT ¦ OUT ¦ OUT ¦ ¦ register
¦ 20h ¦ Этот регистр определяет, какой источник сигнала ¦is not used
¦ ¦ подключен к выходу. Если соответствующий бит включен ¦ in SB16
¦ ¦ источник выключен. ¦
+-------+---------------------------T---------------------------+
¦ 22h ¦ Master Volume L ¦ Master Volume R ¦
+-------+---------------------------+---------------------------+
¦ 26h ¦ FM Volume L ¦ FM Volume R ¦
+-------+---------------------------+---------------------------+
¦ 28h ¦ CD Volume L ¦ CD Volume R ¦
+-------+---------------------------+---------------------------+
¦ 2Eh ¦ Line Volume L ¦ Line Volume R ¦
+-------+---------------------------+------T------T------T------+
¦ 30h ¦ Master Volume L ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Биты 7 - 4 are the same as higher nibble of 22h ¦
+-------+----------------------------------+------+------+------+
¦ 31h ¦ Master Volume R ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as lower nibble of 22h ¦
+-------+------T------T------T------T------T------T------T------+
¦egister¦ D7 ¦ D6 ¦ D5 ¦ D4 ¦ D3 ¦ D2 ¦ D1 ¦ D0 ¦
+-------+------+------+------+------+------+------+------+------+
¦ 32h ¦ Voice Volume L ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as higher nibble of 04h ¦
+-------+----------------------------------+------+------+------+
¦ 33h ¦ Voice Volume R ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as lower nibble of 04h ¦
+-------+----------------------------------T------T------T------+
¦ 34h ¦ Midi Volume L ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as higher nibble of 26h ¦
+-------+----------------------------------+------+------+------+
¦ 35h ¦ Midi Volume R ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as lower nibble of 26h ¦
+-------+----------------------------------+------+------+------+
¦ 36h ¦ CD Volume L ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as higher nibble of 28h ¦
+-------+----------------------------------+------T------+------+
¦ 37h ¦ CD Volume R ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as lower nibble of 28h ¦
+-------+----------------------------------+------+------+------+
¦ 38h ¦ Line Volume L ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as higher nibble of 2Eh ¦
+-------+----------------------------------+------+------+------+
¦ 39h ¦ Line Volume R ¦ x ¦ x ¦ x ¦ SB16 only
¦ ¦ Bits 7 to 4 are the same as lower nibble of 2Eh ¦
+-------+----------------------------------+------+------+------+
¦ 3Ah ¦ MIC volume ¦ x ¦ x ¦ x ¦
L-------+----------------------------------+------+------+-------
--------------------------------------------------------------------------
Небольшое дополнение от Alexandra Lysanova - текст взят мной из журнала
МИР ПК N9/94 , если какие ОчеПятки - я не виноват , если кто больше
меня знает - напишите , плз :-)
Дополнения и исправления принимаются , если кому нужен ADLIB-синтезатор,
см. МИР ПК 5/94 или пишите мылом: Sasha Lysanov 2:5050/13@Fidonet
16-разрядные знания - взяты из FIDO и переведены (извините за неполный пере
вод-некогда было возиться со словарями).