SoundBlaster

Drivers for sound cards
  • Вобще-то, Legacy SB это ни какая не эмуляция... Крутилась как-то, идея заюзать звуковуху напрямую через порты, используя фичу на некоторых МБ (со встроеными AC97 звучками) как legacy SB Pro, так как некоторые DOS игры (doom\quake1), шли со звуком, с этой опцией (включеной в BIOS), правда под Win9x (что давало, подозрения предпологать по поводу банальной 'эмуляцией' девайса). После того как, пара DOS примеров, c прямым 8-битным выводом в DAC, успешно отработали и в вариантах под Win95, я решил обкатать сиё, и на win2000. Как и следовало ожидать, результатом была тишина :) Разбор полётов показал, что WDM драйвер наглым образом, деактивировал настройки BIOS'а (ну понятно - нечего искать лёгких путей, когда за вас M$, подумали), однако простота и естественность юзабилити портов, всёж таки взяли вверх... Правда в этом деле ещё порулило курение pdf-ов на южные мосты и исходников драйверов из линукса. в итоге сей код, таки 'зашумел'...

    Code: Select all

    program   Sound; uses windows;
    const
                      BaseSB  = $220;
    
              ResetPort       = BaseSB + $6;
              ReadPort        = BaseSB + $A;
              WritePort       = BaseSB + $C;
    
              CmdDirectDAC    = $10;
              CmdDirectADC    = $20;
              CmdSpeakerOn    = $D1;
    
              PciCfgAddr      = $CF8;
              PciCfgData      = $CFC;
    var
              data:dword;
    
    procedure outb (val:integer; port:integer); asm  out dx, al end;
    procedure outl (val,port: integer);         asm  out dx, eax end;
    function  inb  (port:integer) :byte;        asm  mov edx, eax; in  al,dx end;
    function  inl  (val :integer) :integer;     asm  mov edx, eax; in eax,dx end;
    
    //Активация legacy SB на VТ686B (и наоборот)
    Procedure SetupLegacySBPro (Enabled:boolean);
    begin
    // Тип уст-ва: Звуковые, видео и игровые устройства
    // Размещение: PCI шина 0, устройство 7, функция 5
         data := $80000000 or (7 shl 11)  or (5 shl 8) or $40;//'хитрый' способ
         outl (data, PciCfgAddr);  //выбрать конфигурационный ($40) порт звуковухи
         data := inl  (PciCfgData);//считать текущее значение
         data := data or $00010100;// (SB_Enable=1, SB_AcLink_Enable=1)
     if  Enabled = false then data := data and not $00010100;
         outl (data, PciCfgData);  // установить необходимые флаги.
    end;
    
    procedure Thread (id:integer); stdcall;
    begin
     while true do 
      begin
         outb (CmdDirectDAC, WritePort);
         outb (random (255), WritePort);
         sleep (0);
      end;
    end;
    
    
    begin
         //разрешить использование портов =)
         CreateFile ('\\.\\GiveIO', $80000000, 0, NIL, 3, $80, 0);
    
         SetupLegacySBPro (true); //Активировать legacy SB 
    
         outb (ResetPort, 1); 
         sleep (5); 
         outb (ResetPort, 0);
         sleep (5);
         outb (CmdSpeakerOn, WritePort);
    
         CreateThread(nil,0,@Thread, nil,0,data);
         Readln; 
         SetupLegacySBPro (false); //Отключить legacy SB 
    end.
    
    Единственое с чем облом так это с прямым вводом (команда $20), из-за чего и затевалась вся эта интрига =((( Хотя в принципе, по выводу (8-бит/48000гц) результат, не самый плохой, хотябы в плане, альтернативы PC спикеру.. Правда, использование legacy SB, вовсе не исключает использование микшера на AC97-ом. По сути южный мост формирует необходимые сигналы для его замороченой шины...
  • Who is online

    Users browsing this forum: No registered users and 3 guests