Page 1 of 1

SoundBlaster

Posted: Fri Jul 29, 2005 2:16 pm
by ealex
У кого-то получалось запустить SoundBlaster-совместимую карту? У меня встренная AC97 (VIA AD1885) эмулирует SoundBlaster, но ни в ДОСе, ни в МеОС играть не захотела. Сейчас воткнул PCI-ную на чипе Avance Logic ALS40000. В ДОСе работает, в МеОС - молчит.

Posted: Sun Apr 01, 2007 10:47 pm
by N†OSKRNL
Вобще-то, 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-ом. По сути южный мост формирует необходимые сигналы для его замороченой шины...