284 lines
6.2 KiB
C
284 lines
6.2 KiB
C
|
/*
|
||
|
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
|
||
|
See the GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
|
||
|
*/
|
||
|
/**********************************************************************
|
||
|
file: GUS.C
|
||
|
|
||
|
author: James R. Dose
|
||
|
date: September 7, 1994
|
||
|
|
||
|
Gravis Ultrasound initialization routines.
|
||
|
|
||
|
(c) Copyright 1994 James R. Dose. All Rights Reserved.
|
||
|
**********************************************************************/
|
||
|
|
||
|
#include <conio.h>
|
||
|
#include <dos.h>
|
||
|
#include <stdio.h>
|
||
|
#include <io.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#include "usrhooks.h"
|
||
|
#include "interrup.h"
|
||
|
#include "newgf1.h"
|
||
|
#include "gusmidi.h"
|
||
|
#include "guswave.h"
|
||
|
#include "_guswave.h"
|
||
|
|
||
|
#define TRUE ( 1 == 1 )
|
||
|
#define FALSE ( !TRUE )
|
||
|
|
||
|
// size of DMA buffer for patch loading
|
||
|
#define DMABUFFSIZE 2048U
|
||
|
|
||
|
struct gf1_dma_buff GUS_HoldBuffer;
|
||
|
static int HoldBufferAllocated = FALSE;
|
||
|
|
||
|
static int GUS_Installed = 0;
|
||
|
|
||
|
extern VoiceNode GUSWAVE_Voices[ VOICES ];
|
||
|
extern int GUSWAVE_Installed;
|
||
|
|
||
|
unsigned long GUS_TotalMemory;
|
||
|
int GUS_MemConfig;
|
||
|
|
||
|
int GUS_AuxError = 0;
|
||
|
|
||
|
int GUS_ErrorCode = GUS_Ok;
|
||
|
|
||
|
#define GUS_SetErrorCode( status ) \
|
||
|
GUS_ErrorCode = ( status );
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------
|
||
|
Function: GUS_ErrorString
|
||
|
|
||
|
Returns a pointer to the error message associated with an error
|
||
|
number. A -1 returns a pointer the current error.
|
||
|
---------------------------------------------------------------------*/
|
||
|
|
||
|
char *GUS_ErrorString
|
||
|
(
|
||
|
int ErrorNumber
|
||
|
)
|
||
|
|
||
|
{
|
||
|
char *ErrorString;
|
||
|
|
||
|
switch( ErrorNumber )
|
||
|
{
|
||
|
case GUS_Warning :
|
||
|
case GUS_Error :
|
||
|
ErrorString = GUS_ErrorString( GUS_ErrorCode );
|
||
|
break;
|
||
|
|
||
|
case GUS_Ok :
|
||
|
ErrorString = "Ultrasound music ok.";
|
||
|
break;
|
||
|
|
||
|
case GUS_OutOfMemory :
|
||
|
ErrorString = "Out of memory in GusMidi.";
|
||
|
break;
|
||
|
|
||
|
case GUS_OutOfDosMemory :
|
||
|
ErrorString = "Out of conventional (640K) memory in GusMidi.";
|
||
|
break;
|
||
|
|
||
|
case GUS_GF1Error :
|
||
|
ErrorString = gf1_error_str( GUS_AuxError );
|
||
|
break;
|
||
|
|
||
|
case GUS_InvalidIrq :
|
||
|
ErrorString = "Ultrasound IRQ must be 7 or less.";
|
||
|
break;
|
||
|
|
||
|
case GUS_ULTRADIRNotSet :
|
||
|
ErrorString = "ULTRADIR environment variable not set.";
|
||
|
break;
|
||
|
|
||
|
case GUS_MissingConfig :
|
||
|
// ErrorString = "Can't find GUSMIDI.INI file.";
|
||
|
ErrorString = "Can't find ULTRAMID.INI file.";
|
||
|
break;
|
||
|
|
||
|
case GUS_FileError :
|
||
|
ErrorString = strerror( GUS_AuxError );
|
||
|
break;
|
||
|
|
||
|
default :
|
||
|
ErrorString = "Unknown Ultrasound error code.";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return( ErrorString );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------
|
||
|
Function: D32DosMemAlloc
|
||
|
|
||
|
Allocate a block of Conventional memory.
|
||
|
---------------------------------------------------------------------*/
|
||
|
|
||
|
void *D32DosMemAlloc
|
||
|
(
|
||
|
unsigned size
|
||
|
)
|
||
|
|
||
|
{
|
||
|
union REGS r;
|
||
|
|
||
|
// DPMI allocate DOS memory
|
||
|
r.x.eax = 0x0100;
|
||
|
|
||
|
// Number of paragraphs requested
|
||
|
r.x.ebx = ( size + 15 ) >> 4;
|
||
|
int386( 0x31, &r, &r );
|
||
|
if ( r.x.cflag )
|
||
|
{
|
||
|
// Failed
|
||
|
return( NULL );
|
||
|
}
|
||
|
|
||
|
return( ( void * )( ( r.x.eax & 0xFFFF ) << 4 ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------
|
||
|
Function: GUS_Init
|
||
|
|
||
|
Initializes the Gravis Ultrasound for sound and music playback.
|
||
|
---------------------------------------------------------------------*/
|
||
|
|
||
|
int GUS_Init
|
||
|
(
|
||
|
void
|
||
|
)
|
||
|
|
||
|
{
|
||
|
struct load_os os;
|
||
|
int ret;
|
||
|
|
||
|
if ( GUS_Installed > 0 )
|
||
|
{
|
||
|
GUS_Installed++;
|
||
|
return( GUS_Ok );
|
||
|
}
|
||
|
|
||
|
GUS_SetErrorCode( GUS_Ok );
|
||
|
|
||
|
GUS_Installed = 0;
|
||
|
|
||
|
GetUltraCfg( &os );
|
||
|
|
||
|
if ( os.forced_gf1_irq > 7 )
|
||
|
{
|
||
|
GUS_SetErrorCode( GUS_InvalidIrq );
|
||
|
return( GUS_Error );
|
||
|
}
|
||
|
|
||
|
if ( !HoldBufferAllocated )
|
||
|
{
|
||
|
GUS_HoldBuffer.vptr = D32DosMemAlloc( DMABUFFSIZE );
|
||
|
if ( GUS_HoldBuffer.vptr == NULL )
|
||
|
{
|
||
|
GUS_SetErrorCode( GUS_OutOfDosMemory );
|
||
|
return( GUS_Error );
|
||
|
}
|
||
|
GUS_HoldBuffer.paddr = ( unsigned long )GUS_HoldBuffer.vptr;
|
||
|
|
||
|
HoldBufferAllocated = TRUE;
|
||
|
}
|
||
|
|
||
|
os.voices = 24;
|
||
|
ret = gf1_load_os( &os );
|
||
|
if ( ret )
|
||
|
{
|
||
|
GUS_AuxError = ret;
|
||
|
GUS_SetErrorCode( GUS_GF1Error );
|
||
|
return( GUS_Error );
|
||
|
}
|
||
|
|
||
|
GUS_TotalMemory = gf1_mem_avail();
|
||
|
GUS_MemConfig = ( GUS_TotalMemory - 1 ) >> 18;
|
||
|
|
||
|
GUS_Installed = 1;
|
||
|
return( GUS_Ok );
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------
|
||
|
Function: GUS_Shutdown
|
||
|
|
||
|
Ends use of the Gravis Ultrasound. Must be called the same number
|
||
|
of times as GUS_Init.
|
||
|
---------------------------------------------------------------------*/
|
||
|
|
||
|
void GUS_Shutdown
|
||
|
(
|
||
|
void
|
||
|
)
|
||
|
|
||
|
{
|
||
|
if ( GUS_Installed > 0 )
|
||
|
{
|
||
|
GUS_Installed--;
|
||
|
if ( GUS_Installed == 0 )
|
||
|
{
|
||
|
gf1_unload_os();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------
|
||
|
Function: GUSWAVE_Shutdown
|
||
|
|
||
|
Terminates use of the Gravis Ultrasound for digitized sound playback.
|
||
|
---------------------------------------------------------------------*/
|
||
|
|
||
|
void GUSWAVE_Shutdown
|
||
|
(
|
||
|
void
|
||
|
)
|
||
|
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
if ( GUSWAVE_Installed )
|
||
|
{
|
||
|
GUSWAVE_KillAllVoices();
|
||
|
|
||
|
// free memory
|
||
|
for ( i = 0; i < VOICES; i++ )
|
||
|
{
|
||
|
if ( GUSWAVE_Voices[ i ].mem != NULL )
|
||
|
{
|
||
|
gf1_free( GUSWAVE_Voices[ i ].mem );
|
||
|
GUSWAVE_Voices[ i ].mem = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GUS_Shutdown();
|
||
|
GUSWAVE_Installed = FALSE;
|
||
|
}
|
||
|
}
|