dxx-rebirth/main/old/cdmix32.c
Bradley Bell 9bd1ba7c47 This commit was generated by cvs2svn to compensate for changes in r2,
which included commits to RCS files with non-trunk default branches.
2001-01-19 03:30:16 +00:00

191 lines
3.7 KiB
C

/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
char cdmix32_rcsid[] = "$Id: cdmix32.c,v 1.1.1.1 2001-01-19 03:30:14 bradleyb Exp $";
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include "inferno.h"
#include "sos.h"
#include "mono.h"
#include "error.h"
typedef struct
{
int id;
char *name;
} DigiDevices;
#define _AWE32_8_ST 0xe208
#define NUM_OF_CARDS 4
#ifndef WINDOWS
DigiDevices SBCards[NUM_OF_CARDS]={
{_SOUND_BLASTER_8_MONO , "Sound Blaster" },
{_SOUND_BLASTER_8_ST , "Sound Blaster Pro" },
{_SB16_8_ST , "Sound Blaster 16/AWE32" },
{_AWE32_8_ST , "Sound Blaster AWE32"}
};
#endif
int CD_blast_mixer ()
{
FILE *InFile;
char line[100],nosbcard=1;
char *ptr,*token,*value;
int i;
int digiport=0,digiboard=0;
short int DataPort=0,AddressPort=0;
char redvol=0;
#ifndef WINDOWS
InFile = fopen("descent.cfg", "rt");
if (InFile == NULL)
return (NULL);
while (!feof(InFile)) {
memset(line, 0, 80);
fgets(line, 80, InFile);
ptr = &(line[0]);
while (isspace(*ptr))
ptr++;
if (*ptr != '\0') {
token = strtok(ptr, "=");
value = strtok(NULL, "=");
if (value[strlen(value)-1] == '\n')
value[strlen(value)-1] = 0;
if (!strcmp(token, "DigiDeviceID8"))
digiboard = strtol(value, NULL, 16);
else if (!strncmp(token, "DigiPort",8))
{
digiport = strtol(value, NULL, 16);
}
else if (!strcmp(token, "RedbookVolume"))
redvol = strtol(value, NULL, 10);
}
}
mprintf ((0,"Digiport=0x%x\n",digiport));
mprintf ((0,"Digiboard=0x%x\n",digiboard));
mprintf ((0,"Redbook volume=%d\n",redvol));
for (nosbcard=1,i=0;i<NUM_OF_CARDS;i++)
{
if (SBCards[i].id==digiboard)
{
mprintf ((0,"Sound board=%s\n",SBCards[i].name));
digiboard=i;
nosbcard=0;
break;
}
}
fclose (InFile);
if (nosbcard)
{
mprintf ((0,"No Soundblaster type card was found!"));
return (0);
}
AddressPort=digiport+4;
DataPort=digiport+5;
if (digiboard==0) // Plain SB
SetRedSB(AddressPort,DataPort,redvol);
else if (digiboard==1) // SB Pro
SetRedSBPro(AddressPort,DataPort,redvol);
else if (digiboard==2 || digiboard==3) // Sound blaster 16/AWE 32
SetRedSB16 (AddressPort,DataPort,redvol);
else
Int3(); // What? Get Jason, this shouldn't have happened
#endif
return (1);
}
void SetRedSB16 (short aport,short dport,char vol)
{
char val;
if (vol>15)
vol=15;
outp (aport,0x36);
val=inp (dport);
if ((val>>3)==0)
{
val|=(25<<3);
outp (dport,val);
}
outp (aport,0x37);
val=inp (dport);
if ((val>>3)==0)
{
val|=(25<<3);
outp (dport,val);
}
}
void SetRedSB (short aport,short dport,char vol)
{
char val;
if (vol>15)
vol=15;
vol=11;
outp (aport,0x08);
val=inp (dport);
if ((val & 7)==0)
{
val|=0x05;
outp (dport,val);
}
}
void SetRedSBPro (short aport,short dport,char vol)
{
char val;
if (vol>15)
vol=15;
vol=11;
outp (aport,0x28);
val=inp (dport);
if ((val & 7)==0)
{
val|=0x55;
outp (dport,val);
}
}