87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
|
///////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// SDL_CheckSB() - Checks to see if a SoundBlaster resides at a
|
|||
|
// particular I/O location
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////
|
|||
|
static boolean
|
|||
|
SDL_CheckSB(int port)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
sbLocation = port << 4; // Initialize stuff for later use
|
|||
|
|
|||
|
sbOut(sbReset,true); // Reset the SoundBlaster DSP
|
|||
|
asm mov dx,0x388 // Wait >4usec
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
asm in al, dx
|
|||
|
|
|||
|
sbOut(sbReset,false); // Turn off sb DSP reset
|
|||
|
asm mov dx,0x388 // Wait >100usec
|
|||
|
asm mov cx,100
|
|||
|
usecloop:
|
|||
|
asm in al,dx
|
|||
|
asm loop usecloop
|
|||
|
|
|||
|
for (i = 0;i < 100;i++)
|
|||
|
{
|
|||
|
if (sbIn(sbDataAvail) & 0x80) // If data is available...
|
|||
|
{
|
|||
|
if (sbIn(sbReadData) == 0xaa) // If it matches correct value
|
|||
|
return(true);
|
|||
|
else
|
|||
|
{
|
|||
|
sbLocation = -1; // Otherwise not a SoundBlaster
|
|||
|
return(false);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
sbLocation = -1; // Retry count exceeded - fail
|
|||
|
return(false);
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////
|
|||
|
//
|
|||
|
// Checks to see if a SoundBlaster is in the system. If the port passed is
|
|||
|
// -1, then it scans through all possible I/O locations. If the port
|
|||
|
// passed is 0, then it uses the default (2). If the port is >0, then
|
|||
|
// it just passes it directly to SDL_CheckSB()
|
|||
|
//
|
|||
|
///////////////////////////////////////////////////////////////////////////
|
|||
|
static boolean
|
|||
|
SDL_DetectSoundBlaster(int port)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
if (port == 0) // If user specifies default, use 2
|
|||
|
port = 2;
|
|||
|
if (port == -1)
|
|||
|
{
|
|||
|
if (SDL_CheckSB(2)) // Check default before scanning
|
|||
|
return(true);
|
|||
|
|
|||
|
if (SDL_CheckSB(4)) // Check other SB Pro location before scan
|
|||
|
return(true);
|
|||
|
|
|||
|
for (i = 1;i <= 6;i++) // Scan through possible SB locations
|
|||
|
{
|
|||
|
if ((i == 2) || (i == 4))
|
|||
|
continue;
|
|||
|
|
|||
|
if (SDL_CheckSB(i)) // If found at this address,
|
|||
|
return(true); // return success
|
|||
|
}
|
|||
|
return(false); // All addresses failed, return failure
|
|||
|
}
|
|||
|
else
|
|||
|
return(SDL_CheckSB(port)); // User specified address or default
|
|||
|
}
|
|||
|
|
|||
|
|