/* 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. */ /********************************************************************** module: _PAS16.H author: James R. Dose date: March 27, 1994 Private header for for PAS16.C (c) Copyright 1994 James R. Dose. All Rights Reserved. **********************************************************************/ #ifndef ___PAS16_H #define ___PAS16_H #define TRUE ( 1 == 1 ) #define FALSE ( !TRUE ) #define VALID ( 1 == 1 ) #define INVALID ( !VALID ) #define lobyte( num ) ( ( int )*( ( char * )&( num ) ) ) #define hibyte( num ) ( ( int )*( ( ( char * )&( num ) ) + 1 ) ) #define STEREO 1 #define SIXTEEN_BIT 2 #define MONO_8BIT 0 #define STEREO_8BIT ( STEREO ) #define MONO_16BIT ( SIXTEEN_BIT ) #define STEREO_16BIT ( STEREO | SIXTEEN_BIT ) #define PAS_MaxMixMode STEREO_16BIT #define MONO_8BIT_SAMPLE_SIZE 1 #define MONO_16BIT_SAMPLE_SIZE 2 #define STEREO_8BIT_SAMPLE_SIZE ( 2 * MONO_8BIT_SAMPLE_SIZE ) #define STEREO_16BIT_SAMPLE_SIZE ( 2 * MONO_16BIT_SAMPLE_SIZE ) #define PAS_RevisionBits 0xe0 #define AudioFilterControl 0xb8a #define InterruptControl 0xb8b #define InterruptStatus 0xb89 #define PCMDataRegister 0xf88 #define CrossChannelControl 0xf8a #define SampleRateTimer 0x1388 #define SampleBufferCount 0x1389 #define LocalSpeakerTimerCount 0x138a #define LocalTimerControl 0x138b #define SampleSizeConfiguration 0x8389 #define AudioMuteFlag 0x20 #define SampleRateTimerGateFlag 0x40 #define SampleBufferCountGateFlag 0x80 #define SampleRateInterruptFlag 0x04 #define SampleBufferInterruptFlag 0x08 #define PAS_SampleSizeMask 0xf3 #define PAS_SignedSampleMask 0xe3 #define PAS_16BitSampleFlag 0x04 #define PAS_UnsignedSampleFlag 0x10 //bSC2msbinv equ 00010000b ;; invert MSB from standard method #define PAS_OverSamplingMask 0xfc #define PAS_1xOverSampling 0x00 #define PAS_2xOverSampling 0x01 #define PAS_4xOverSampling 0x03 #define PAS_StereoFlag 0x20 #define PAS_AudioMuteFlag 0x20 #define DEFAULT_BASE ( 0x0388 ^ 0x388 ) /* default base I/O address */ #define ALT_BASE_1 ( 0x0384 ^ 0x388 ) /* first alternate address */ #define ALT_BASE_2 ( 0x038C ^ 0x388 ) /* second alternate address */ #define ALT_BASE_3 ( 0x0288 ^ 0x388 ) /* third alternate address */ #define PAS_DMAEnable 0x80 #define PAS_ChannelConnectMask 0x0f #define PAS_PCMStartDAC 0xD0 #define PAS_PCMStartADC 0xC0 #define PAS_PCMStopMask 0x3f #define RECORD 0 #define PLAYBACK 1 #define SelectSampleRateTimer 0x36 // 00110110b #define SelectSampleBufferCount 0x74 // 01110100b #define CalcTimeInterval( rate ) \ ( 1193180UL / ( rate ) ) #define CalcSamplingRate( interval ) \ ( 1193180UL / ( interval ) ) #define MV_Signature 0x4d56 #define MV_SoundInt 0x2f #define MV_CheckForDriver 0xbc00 #define MV_GetVersion 0xbc01 #define MV_GetPointerToStateTable 0xbc02 #define MV_GetPointerToFunctionTable 0xbc03 #define MV_GetDmaIrqInt 0xbc04 #define MV_SendCommandStructure 0xbc05 #define MV_GetDriverMessage 0xbc06 #define MV_SetHotkeyScanCodes 0xbc0a #define MV_GetPathToDriver 0xbc0b #define OUTPUTMIXER 0x00 /* output mixer H/W select */ #define INPUTMIXER 0x40 /* input mixer select */ #define DEFMIXER -1 /* use last mixer selected */ /* left channel values */ #define L_FM 0x01 #define L_IMIXER 0x02 #define L_EXT 0x03 #define L_INT 0x04 #define L_MIC 0x05 #define L_PCM 0x06 #define L_SPEAKER 0x07 #define L_FREE 0x00 #define L_SBDAC 0x00 /* right channel values */ #define R_FM 0x08 #define R_IMIXER 0x09 #define R_EXT 0x0A #define R_INT 0x0B #define R_MIC 0x0C #define R_PCM 0x0D #define R_SPEAKER 0x0E #define R_FREE 0x0F #define R_SBDAC 0x0F typedef struct { unsigned char sysspkrtmr; /* 42 System Speaker Timer Address */ unsigned char systmrctlr; /* 43 System Timer Control */ unsigned char sysspkrreg; /* 61 System Speaker Register */ unsigned char joystick; /* 201 Joystick Register */ unsigned char lfmaddr; /* 388 Left FM Synth Address */ unsigned char lfmdata; /* 389 Left FM Synth Data */ unsigned char rfmaddr; /* 38A Right FM Synth Address */ unsigned char rfmdata; /* 38B Right FM Synth Data */ unsigned char dfmaddr; /* 788 Dual FM Synth Address */ unsigned char dfmdata; /* 789 Dual FM Synth Data */ unsigned char RESRVD1[1]; /* reserved */ unsigned char paudiomixr; /* 78B Paralllel Audio Mixer Control*/ unsigned char audiomixr; /* B88 Audio Mixer Control */ unsigned char intrctlrst; /* B89 Interrupt Status */ unsigned char audiofilt; /* B8A Audio Filter Control */ unsigned char intrctlr; /* B8B Interrupt Control */ unsigned char pcmdata; /* F88 PCM Data I/O Register */ unsigned char RESRVD2; /* reserved */ unsigned char crosschannel; /* F8A Cross Channel */ unsigned char RESRVD3; /* reserved */ unsigned short samplerate; /* 1388 Sample Rate Timer */ unsigned short samplecnt; /* 1389 Sample Count Register */ unsigned short spkrtmr; /* 138A Shadow Speaker Timer Count */ unsigned char tmrctlr; /* 138B Shadow Speaker Timer Control */ unsigned char mdirqvect; /* 1788 MIDI IRQ Vector Register */ unsigned char mdsysctlr; /* 1789 MIDI System Control Register */ unsigned char mdsysstat; /* 178A MIDI IRQ Status Register */ unsigned char mdirqclr; /* 178B MIDI IRQ Clear Register */ unsigned char mdgroup1; /* 1B88 MIDI Group #1 Register */ unsigned char mdgroup2; /* 1B89 MIDI Group #2 Register */ unsigned char mdgroup3; /* 1B8A MIDI Group #3 Register */ unsigned char mdgroup4; /* 1B8B MIDI Group #4 Register */ } MVState; typedef struct { unsigned long SetMixer; unsigned long SetVolume; unsigned long SetFilter; unsigned long SetCrossChannel; unsigned long GetMixer; unsigned long GetVolume; unsigned long GetFilter; unsigned long GetCrossChannel; unsigned long ReadSound; unsigned long FMSplit; } MVFunc; int PAS_CheckForDriver( void ); MVState *PAS_GetStateTable( void ); MVFunc *PAS_GetFunctionTable( void ); int PAS_GetCardSettings( void ); void PAS_EnableInterrupt( void ); void PAS_DisableInterrupt( void ); void interrupt far PAS_ServiceInterrupt( void ); //void interrupt PAS_ServiceInterrupt( void ); void PAS_Write( int Register, int Data ); int PAS_Read( int Register ); void PAS_SetSampleRateTimer( void ); void PAS_SetSampleBufferCount( void ); int PAS_SetupDMABuffer( char *BufferPtr, int BufferSize, int mode ); int PAS_GetFilterSetting( int rate ); void PAS_BeginTransfer( int mode ); int PAS_TestAddress( int address ); int PAS_FindCard( void ); int PAS_CallMVFunction( unsigned long function, int ebx, int ecx, int edx ); void PAS_SaveState( void ); void PAS_RestoreState( void ); #pragma aux PAS_TestAddress = \ "mov dx, 0b8bh", \ "xor dx, ax", \ "in al, dx", \ "cmp al, 0ffh", \ "je TestExit", \ "mov ah, al", \ "xor al, 0e0h", \ "out dx, al", \ "jmp TestDelay1", \ "TestDelay1:", \ "jmp TestDelay2", \ "TestDelay2:", \ "in al, dx", \ "xchg al, ah", \ "out dx, al", \ "sub al, ah", \ "TestExit:", \ "and eax, 0ffh" \ parm [ eax ] modify exact [ eax dx ]; #endif