[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]
{
PB> It's me again. I need code to detect a SB/SB Compat. card. I have
PB> code which will detect the port, but I also need a way of detecting the
PB> SB's IRQ and DMA channel. Is there any such code available?
This code was just posted about 2 weeks ago (I believe)... }
Program DetectSoundBlaster;
Uses DOS, CRT;
Function hex(a : Word; b : Byte) : String;
Const digit : Array[$0..$F] Of Char = '0123456789ABCDEF';
Var i : Byte;
xstring : String;
Begin
xstring:='';
For i:=1 To b Do
Begin
Insert(digit[a And $000F], xstring, 1);
a:=a ShR 4
End;
hex:=xstring
End; {hex}
Procedure SoundPort;
Var xbyte1, xbyte2, xbyte3, xbyte4: Byte;
xword, xword1, xword2, temp, sbport: Word;
sbfound, portok: Boolean;
Begin
ClrScr;
Write('Sound Blaster: ');
sbfound:=False;
xbyte1:=1;
While (xbyte1 < 7) And (Not sbfound) Do
Begin
sbport:=$200 + ($10 * xbyte1);
xword1:=0;
portok:=False;
While (xword1 < $201) And (Not portok) Do
Begin
If (Port[sbport + $0C] And $80) = 0 Then
portok:=True;
Inc(xword1)
End;
If portok Then
Begin
xbyte3:=Port[sbport + $0C];
Port[sbport + $0C]:=$D3;
For xword2:=1 To $1000 Do {nothing};
xbyte4:=Port[sbport + 6];
Port[sbport + 6]:=1;
xbyte2:=Port[sbport + 6];
xbyte2:=Port[sbport + 6];
xbyte2:=Port[sbport + 6];
xbyte2:=Port[sbport + 6];
Port[sbport + 6]:=0;
xbyte2:=0;
Repeat
xword1:=0;
portok:=False;
While (xword1 < $201) And (Not portok) Do
Begin
If (Port[sbport + $0E] And $80) = $80 Then
portok:=True;
Inc(xword1)
End;
If portok Then
If Port[sbport + $0A] = $AA Then
sbfound:=True;
Inc(xbyte2);
Until (xbyte2 = $10) Or (portok);
If Not portok Then
Begin
Port[sbport + $0C]:=xbyte3;
Port[sbport + 6]:=xbyte4;
End;
End;
If sbfound Then
Begin
Write('Yes');
Write(' Port: ');
Write('$', Hex(sbport, 3));
End
Else
Inc(xbyte1);
End;
If Not sbfound Then
Write('No');
End;{soundport}
Begin
SoundPort;
End.
[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]