SoundBlaster
-
У кого-то получалось запустить SoundBlaster-совместимую карту? У меня встренная AC97 (VIA AD1885) эмулирует SoundBlaster, но ни в ДОСе, ни в МеОС играть не захотела. Сейчас воткнул PCI-ную на чипе Avance Logic ALS40000. В ДОСе работает, в МеОС - молчит.
Вобще-то, Legacy SB это ни какая не эмуляция... Крутилась как-то, идея заюзать звуковуху напрямую через порты, используя фичу на некоторых МБ (со встроеными AC97 звучками) как legacy SB Pro, так как некоторые DOS игры (doom\quake1), шли со звуком, с этой опцией (включеной в BIOS), правда под Win9x (что давало, подозрения предпологать по поводу банальной 'эмуляцией' девайса). После того как, пара DOS примеров, c прямым 8-битным выводом в DAC, успешно отработали и в вариантах под Win95, я решил обкатать сиё, и на win2000. Как и следовало ожидать, результатом была тишина Разбор полётов показал, что WDM драйвер наглым образом, деактивировал настройки BIOS'а (ну понятно - нечего искать лёгких путей, когда за вас M$, подумали), однако простота и естественность юзабилити портов, всёж таки взяли вверх... Правда в этом деле ещё порулило курение pdf-ов на южные мосты и исходников драйверов из линукса. в итоге сей код, таки 'зашумел'...
Единственое с чем облом так это с прямым вводом (команда $20), из-за чего и затевалась вся эта интрига =((( Хотя в принципе, по выводу (8-бит/48000гц) результат, не самый плохой, хотябы в плане, альтернативы PC спикеру.. Правда, использование legacy SB, вовсе не исключает использование микшера на AC97-ом. По сути южный мост формирует необходимые сигналы для его замороченой шины...
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.
Who is online
Users browsing this forum: No registered users and 1 guest