Программируем 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 и переведены (извините за неполный пере
  вод-некогда было возиться со словарями).