shithub: rott

Download patch

ref: c0dba8a8dc8c813ebdfbe85228df8ee1b20366b4
parent: 516fc276f112baf0bd4508596598aed49929bde9
parent: 6081ce685cd2a789e0a516825b185dd15004da15
author: LTCHIPS <ltchips994@gmail.com>
date: Thu Jul 26 17:46:10 EDT 2018

Merge pull request #13 from LTCHIPS/unused_files_cleanup

Removing unused files.

--- a/src/audiolib/_al_midi.h
+++ /dev/null
@@ -1,172 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef ___AL_MIDI_H
-#define ___AL_MIDI_H
-
-#define NO_ADLIB_DETECTION    "NOAL"
-
-#define STEREO_DETUNE 5
-
-#define lobyte( num )   ( ( unsigned )*( ( char * )&( num ) ) )
-#define hibyte( num )   ( ( unsigned )*( ( ( char * )&( num ) ) + 1 ) )
-
-#define AL_VoiceNotFound -1
-
-#define  alFreqH     0xb0
-#define  alEffects   0xbd
-
-/* Number of slots for the voices on the chip */
-#define NumChipSlots 18
-
-#define NUM_VOICES      9
-#define NUM_CHANNELS    16
-
-#define NOTE_ON         0x2000  /* Used to turn note on or toggle note */
-#define NOTE_OFF        0x0000
-
-#define MAX_VELOCITY   0x7f
-#define MAX_OCTAVE     7
-#define MAX_NOTE       ( MAX_OCTAVE * 12 + 11 )
-#define FINETUNE_MAX   31
-#define FINETUNE_RANGE ( FINETUNE_MAX + 1 )
-
-#define PITCHBEND_CENTER 1638400
-
-#define note_off             0x80
-#define note_on              0x90
-#define poly_aftertouch      0xa0
-#define control_change       0xb0
-#define program_chng         0xc0
-#define channel_aftertouch   0xd0
-#define pitch_wheel          0xe0
-
-#define MIDI_VOLUME          7
-#define MIDI_PAN             10
-#define MIDI_DETUNE          94
-#define MIDI_ALL_NOTES_OFF   0x7B
-#define MIDI_RESET_ALL_CONTROLLERS 0x79
-#define MIDI_RPN_MSB               100
-#define MIDI_RPN_LSB               101
-#define MIDI_DATAENTRY_MSB         6
-#define MIDI_DATAENTRY_LSB         38
-#define MIDI_PITCHBEND_RPN         0
-
-enum cromatic_scale
-   {
-   C       = 0x157,
-   C_SHARP = 0x16B,
-   D_FLAT  = 0x16B,
-   D       = 0x181,
-   D_SHARP = 0x198,
-   E_FLAT  = 0x198,
-   E       = 0x1B0,
-   F_FLAT  = 0x1B0,
-   E_SHARP = 0x1CA,
-   F       = 0x1CA,
-   F_SHARP = 0x1E5,
-   G_FLAT  = 0x1E5,
-   G       = 0x202,
-   G_SHARP = 0x220,
-   A_FLAT  = 0x220,
-   A       = 0x241,
-   A_SHARP = 0x263,
-   B_FLAT  = 0x263,
-   B       = 0x287,
-   C_FLAT  = 0x287,
-   B_SHARP = 0x2AE,
-   };
-
-/* Definition of octave information to be ORed onto F-Number */
-
-enum octaves
-   {
-   OCTAVE_0 = 0x0000,
-   OCTAVE_1 = 0x0400,
-   OCTAVE_2 = 0x0800,
-   OCTAVE_3 = 0x0C00,
-   OCTAVE_4 = 0x1000,
-   OCTAVE_5 = 0x1400,
-   OCTAVE_6 = 0x1800,
-   OCTAVE_7 = 0x1C00
-   };
-
-typedef struct VOICE
-   {
-   struct VOICE *next;
-   struct VOICE *prev;
-
-   unsigned num;
-   unsigned key;
-   unsigned velocity;
-   unsigned channel;
-   unsigned pitchleft;
-   unsigned pitchright;
-   int      timbre;
-   int      port;
-   unsigned status;
-   } VOICE;
-
-typedef struct
-   {
-   VOICE *start;
-   VOICE *end;
-   } VOICELIST;
-
-typedef struct
-   {
-   VOICELIST Voices;
-   int       Timbre;
-   int       Pitchbend;
-   int       KeyOffset;
-   unsigned  KeyDetune;
-   unsigned  Volume;
-   unsigned  EffectiveVolume;
-   int       Pan;
-   int       Detune;
-   unsigned  RPN;
-   short     PitchBendRange;
-   short     PitchBendSemiTones;
-   short     PitchBendHundreds;
-   } CHANNEL;
-
-typedef struct
-   {
-   unsigned char SAVEK[ 2 ];
-   unsigned char Level[ 2 ];
-   unsigned char Env1[ 2 ];
-   unsigned char Env2[ 2 ];
-   unsigned char Wave[ 2 ];
-   unsigned char Feedback;
-   signed   char Transpose;
-   signed   char Velocity;
-   } TIMBRE;
-
-extern TIMBRE ADLIB_TimbreBank[ 256 ];
-
-static void AL_ResetVoices( void );
-static void AL_CalcPitchInfo( void );
-static void AL_SetVoiceTimbre( int voice );
-static void AL_SetVoiceVolume( int voice );
-static int  AL_AllocVoice( void );
-static int  AL_GetVoice( int channel, int key );
-static void AL_SetVoicePitch( int voice );
-static void AL_SetChannelVolume( int channel, int volume );
-static void AL_SetChannelPan( int channel, int pan );
-static void AL_SetChannelDetune( int channel, int detune );
-
-#endif
--- a/src/audiolib/_blaster.h
+++ /dev/null
@@ -1,131 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: _BLASTER.H
-
-   author: James R. Dose
-   date:   February 4, 1994
-
-   Private header for for BLASTER.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef ___BLASTER_H
-#define ___BLASTER_H
-
-#define VALID   ( 1 == 1 )
-#define INVALID ( !VALID )
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-#define YES ( 1 == 1 )
-#define NO  ( !YES )
-
-#define lobyte( num )   ( ( int )*( ( char * )&( num ) ) )
-#define hibyte( num )   ( ( int )*( ( ( char * )&( num ) ) + 1 ) )
-
-#define BLASTER_MixerAddressPort  0x04
-#define BLASTER_MixerDataPort     0x05
-#define BLASTER_ResetPort         0x06
-#define BLASTER_ReadPort          0x0A
-#define BLASTER_WritePort         0x0C
-#define BLASTER_DataAvailablePort 0x0E
-#define BLASTER_Ready             0xAA
-#define BLASTER_16BitDMAAck       0x0F
-
-#define MIXER_DSP4xxISR_Ack       0x82
-#define MIXER_DSP4xxISR_Enable    0x83
-#define MIXER_MPU401_INT          0x4
-#define MIXER_16BITDMA_INT        0x2
-#define MIXER_8BITDMA_INT         0x1
-#define MIXER_DisableMPU401Interrupts 0xB
-#define MIXER_SBProOutputSetting  0x0E
-#define MIXER_SBProStereoFlag     0x02
-#define MIXER_SBProVoice          0x04
-#define MIXER_SBProMidi           0x26
-#define MIXER_SB16VoiceLeft       0x32
-#define MIXER_SB16VoiceRight      0x33
-#define MIXER_SB16MidiLeft        0x34
-#define MIXER_SB16MidiRight       0x35
-
-#define DSP_Version1xx            0x0100
-#define DSP_Version2xx            0x0200
-#define DSP_Version201            0x0201
-#define DSP_Version3xx            0x0300
-#define DSP_Version4xx            0x0400
-#define DSP_SB16Version           DSP_Version4xx
-
-#define DSP_MaxNormalRate         22000
-#define DSP_MaxHighSpeedRate      44000
-
-#define DSP_8BitAutoInitRecord        0x2c
-#define DSP_8BitHighSpeedAutoInitRecord 0x98
-#define DSP_Old8BitADC                0x24
-#define DSP_8BitAutoInitMode          0x1c
-#define DSP_8BitHighSpeedAutoInitMode 0x90
-#define DSP_SetBlockLength            0x48
-#define DSP_Old8BitDAC                0x14
-#define DSP_16BitDAC                  0xB6
-#define DSP_8BitDAC                   0xC6
-#define DSP_8BitADC                   0xCe
-#define DSP_SetTimeConstant           0x40
-#define DSP_Set_DA_Rate               0x41
-#define DSP_Set_AD_Rate               0x42
-#define DSP_Halt8bitTransfer          0xd0
-#define DSP_Continue8bitTransfer      0xd4
-#define DSP_Halt16bitTransfer         0xd5
-#define DSP_Continue16bitTransfer     0xd6
-#define DSP_SpeakerOn                 0xd1
-#define DSP_SpeakerOff                0xd3
-#define DSP_GetVersion                0xE1
-#define DSP_Reset                     0xFFFF
-
-#define DSP_SignedBit                 0x10
-#define DSP_StereoBit                 0x20
-
-#define DSP_UnsignedMonoData      0x00
-#define DSP_SignedMonoData        ( DSP_SignedBit )
-#define DSP_UnsignedStereoData    ( DSP_StereoBit )
-#define DSP_SignedStereoData      ( DSP_SignedBit | DSP_StereoBit )
-
-#define BlasterEnv_Address    'A'
-#define BlasterEnv_Interrupt  'I'
-#define BlasterEnv_8bitDma    'D'
-#define BlasterEnv_16bitDma   'H'
-#define BlasterEnv_Type       'T'
-#define BlasterEnv_Midi       'P'
-#define BlasterEnv_EmuAddress 'E'
-
-#define CalcTimeConstant( rate, samplesize ) \
-   ( ( 65536L - ( 256000000L / ( ( samplesize ) * ( rate ) ) ) ) >> 8 )
-
-#define CalcSamplingRate( tc ) \
-   ( 256000000L / ( 65536L - ( tc << 8 ) ) )
-
-typedef struct
-   {
-   int IsSupported;
-   int HasMixer;
-   int MaxMixMode;
-   int MinSamplingRate;
-   int MaxSamplingRate;
-   } CARD_CAPABILITY;
-
-#endif
--- a/src/audiolib/_guswave.h
+++ /dev/null
@@ -1,162 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   file:   _GUSWAVE.H
-
-   author: James R. Dose
-   date:   March 23, 1994
-
-   Private header for GUSWAVE.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef ___GUSWAVE_H
-#define ___GUSWAVE_H
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-#define LOADDS _loadds
-
-#define VOC_8BIT            0x0
-#define VOC_CT4_ADPCM       0x1
-#define VOC_CT3_ADPCM       0x2
-#define VOC_CT2_ADPCM       0x3
-#define VOC_16BIT           0x4
-#define VOC_ALAW            0x6
-#define VOC_MULAW           0x7
-#define VOC_CREATIVE_ADPCM  0x200
-
-#define MAX_BLOCK_LENGTH 0x8000
-
-#define GF1BSIZE   896L   /* size of buffer per wav on GUS */
-//#define GF1BSIZE   512L   /* size of buffer per wav on GUS */
-
-//#define VOICES     8      /* maximum amount of concurrent wav files */
-#define VOICES     2      /* maximum amount of concurrent wav files */
-#define MAX_VOICES 32     /* This should always be 32 */
-#define MAX_VOLUME 4095
-#define BUFFER     2048U  /* size of DMA buffer for patch loading */
-
-typedef enum
-   {
-   Raw,
-   VOC,
-   DemandFeed,
-   WAV
-   } wavedata;
-
-typedef enum
-   {
-   NoMoreData,
-   KeepPlaying,
-   SoundDone
-   } playbackstatus;
-
-
-typedef volatile struct VoiceNode
-   {
-   struct VoiceNode *next;
-   struct VoiceNode *prev;
-
-   wavedata      wavetype;
-   int           bits;
-   playbackstatus ( *GetSound )( struct VoiceNode *voice );
-
-   int num;
-
-   unsigned long  mem;           /* location in ultrasound memory */
-   int            Active;        /* this instance in use */
-   int            GF1voice;      /* handle to active voice */
-
-   char          *NextBlock;
-   char          *LoopStart;
-   char          *LoopEnd;
-   unsigned       LoopCount;
-   unsigned long  LoopSize;
-   unsigned long  BlockLength;
-
-   unsigned long  PitchScale;
-
-   unsigned char *sound;
-   unsigned long  length;
-   unsigned long  SamplingRate;
-   unsigned long  RateScale;
-   int            Playing;
-
-   int    handle;
-   int    priority;
-
-   void          ( *DemandFeed )( char **ptr, unsigned long *length );
-
-   unsigned long callbackval;
-
-   int    Volume;
-   int    Pan;
-   }
-VoiceNode;
-
-typedef struct
-   {
-   VoiceNode *start;
-   VoiceNode *end;
-   }
-voicelist;
-
-typedef volatile struct voicestatus
-   {
-   VoiceNode *Voice;
-   int playing;
-   }
-voicestatus;
-
-typedef struct
-   {
-   char          RIFF[ 4 ];
-   unsigned long file_size;
-   char          WAVE[ 4 ];
-   char          fmt[ 4 ];
-   unsigned long format_size;
-   } riff_header;
-
-typedef struct
-   {
-   unsigned short wFormatTag;
-   unsigned short nChannels;
-   unsigned long  nSamplesPerSec;
-   unsigned long  nAvgBytesPerSec;
-   unsigned short nBlockAlign;
-   unsigned short nBitsPerSample;
-   } format_header;
-
-typedef struct
-   {
-   unsigned char DATA[ 4 ];
-   unsigned long size;
-   } data_header;
-
-playbackstatus GUSWAVE_GetNextVOCBlock( VoiceNode *voice );
-VoiceNode *GUSWAVE_GetVoice( int handle );
-
-int GUSWAVE_Play( VoiceNode *voice, int angle, int volume, int channels );
-
-VoiceNode *GUSWAVE_AllocVoice( int priority );
-static int GUSWAVE_InitVoices( void );
-
-#endif
--- a/src/audiolib/_midi.h
+++ /dev/null
@@ -1,288 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: _MIDI.H
-
-   author: James R. Dose
-   date:   May 25, 1994
-
-   Private header for MIDI.C.  Midi song file playback routines.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef ___MIDI_H
-#define ___MIDI_H
-
-#define RELATIVE_BEAT( measure, beat, tick ) \
-   ( ( tick ) + ( ( beat ) << 9 ) + ( ( measure ) << 16 ) )
-
-//Bobby Prince thinks this may be 100
-//#define GENMIDI_DefaultVolume 100
-#define GENMIDI_DefaultVolume 90
-
-#define MAX_FORMAT            1
-
-#define NUM_MIDI_CHANNELS     16
-
-#define TIME_PRECISION        16
-
-#define MIDI_HEADER_SIGNATURE 0x6468544d    // "MThd"
-#define MIDI_TRACK_SIGNATURE  0x6b72544d    // "MTrk"
-
-#define MIDI_VOLUME                7
-#define MIDI_PAN                   10
-#define MIDI_DETUNE                94
-#define MIDI_RHYTHM_CHANNEL        9
-#define MIDI_RPN_MSB               100
-#define MIDI_RPN_LSB               101
-#define MIDI_DATAENTRY_MSB         6
-#define MIDI_DATAENTRY_LSB         38
-#define MIDI_PITCHBEND_MSB         0
-#define MIDI_PITCHBEND_LSB         0
-#define MIDI_RUNNING_STATUS        0x80
-#define MIDI_NOTE_OFF              0x8
-#define MIDI_NOTE_ON               0x9
-#define MIDI_POLY_AFTER_TCH        0xA
-#define MIDI_CONTROL_CHANGE        0xB
-#define MIDI_PROGRAM_CHANGE        0xC
-#define MIDI_AFTER_TOUCH           0xD
-#define MIDI_PITCH_BEND            0xE
-#define MIDI_SPECIAL               0xF
-#define MIDI_SYSEX                 0xF0
-#define MIDI_SYSEX_CONTINUE        0xF7
-#define MIDI_META_EVENT            0xFF
-#define MIDI_END_OF_TRACK          0x2F
-#define MIDI_TEMPO_CHANGE          0x51
-#define MIDI_TIME_SIGNATURE        0x58
-#define MIDI_RESET_ALL_CONTROLLERS 0x79
-#define MIDI_ALL_NOTES_OFF         0x7b
-#define MIDI_MONO_MODE_ON          0x7E
-#define MIDI_SYSTEM_RESET          0xFF
-
-#define GET_NEXT_EVENT( track, data ) \
-   ( data ) = *( track )->pos; \
-   ( track )->pos += 1
-
-#define GET_MIDI_CHANNEL( event )       ( ( event ) & 0xf )
-#define GET_MIDI_COMMAND( event )       ( ( event ) >> 4 )
-
-#define EMIDI_INFINITE          -1
-#define EMIDI_END_LOOP_VALUE    127
-#define EMIDI_ALL_CARDS         127
-#define EMIDI_INCLUDE_TRACK     110
-#define EMIDI_EXCLUDE_TRACK     111
-#define EMIDI_PROGRAM_CHANGE    112
-#define EMIDI_VOLUME_CHANGE     113
-#define EMIDI_CONTEXT_START     114
-#define EMIDI_CONTEXT_END       115
-#define EMIDI_LOOP_START        116
-#define EMIDI_LOOP_END          117
-#define EMIDI_SONG_LOOP_START   118
-#define EMIDI_SONG_LOOP_END     119
-
-#define EMIDI_GeneralMIDI       0
-#define EMIDI_SoundCanvas       1
-#define EMIDI_AWE32             2
-#define EMIDI_WaveBlaster       3
-#define EMIDI_SoundBlaster      4
-#define EMIDI_ProAudio          5
-#define EMIDI_SoundMan16        6
-#define EMIDI_Adlib             7
-#define EMIDI_Soundscape        8
-#define EMIDI_Ultrasound        9
-
-#define EMIDI_AffectsCurrentCard( c, type ) \
-   ( ( ( c ) == EMIDI_ALL_CARDS ) || ( ( c ) == ( type ) ) )
-
-
-#define EMIDI_NUM_CONTEXTS      7
-typedef struct
-   {
-   unsigned char *pos;
-   unsigned char *loopstart;
-   short          loopcount;
-   short          RunningStatus;
-   unsigned       time;
-   long           FPSecondsPerTick;
-   short          tick;
-   short          beat;
-   short          measure;
-   short          BeatsPerMeasure;
-   short          TicksPerBeat;
-   short          TimeBase;
-   long           delay;
-   short          active;
-   } songcontext;
-
-typedef struct
-   {
-   unsigned char *start;
-   unsigned char *pos;
-
-   long           delay;
-   short          active;
-   short          RunningStatus;
-
-   short          currentcontext;
-   songcontext    context[ EMIDI_NUM_CONTEXTS ];
-
-   char           EMIDI_IncludeTrack;
-   char           EMIDI_ProgramChange;
-   char           EMIDI_VolumeChange;
-   } track;
-
-static long _MIDI_ReadNumber( void *from, size_t size );
-static long _MIDI_ReadDelta( track *ptr );
-static void _MIDI_ResetTracks( void );
-static void _MIDI_AdvanceTick( void );
-static void _MIDI_MetaEvent( track *Track );
-static void _MIDI_SysEx( track *Track );
-static int  _MIDI_InterpretControllerInfo( track *Track, int TimeSet,
-   int channel, int c1, int c2 );
-//static
-   void _MIDI_ServiceRoutine( task *Task );
-static int  _MIDI_SendControlChange( int channel, int c1, int c2 );
-static void _MIDI_SetChannelVolume( int channel, int volume );
-static void _MIDI_SendChannelVolumes( void );
-static int  _MIDI_ProcessNextTick( void );
-static void _MIDI_InitEMIDI( void );
-
-/*
-               if ( c1 == EMIDI_LOOP_START )
-                  {
-                  if ( c2 == 0 )
-                     {
-                     Track->context[ 0 ].loopcount = EMIDI_INFINITE;
-                     }
-                  else
-                     {
-                     Track->context[ 0 ].loopcount = c2;
-                     }
-
-                  Track->context[ 0 ].pos              = Track->pos;
-                  Track->context[ 0 ].loopstart        = Track->pos;
-                  Track->context[ 0 ].RunningStatus    = Track->RunningStatus;
-                  Track->context[ 0 ].time             = _MIDI_Time;
-                  Track->context[ 0 ].FPSecondsPerTick = _MIDI_FPSecondsPerTick;
-                  Track->context[ 0 ].tick             = _MIDI_Tick;
-                  Track->context[ 0 ].beat             = _MIDI_Beat;
-                  Track->context[ 0 ].measure          = _MIDI_Measure;
-                  Track->context[ 0 ].BeatsPerMeasure  = _MIDI_BeatsPerMeasure;
-                  Track->context[ 0 ].TicksPerBeat     = _MIDI_TicksPerBeat;
-                  Track->context[ 0 ].TimeBase         = _MIDI_TimeBase;
-                  break;
-                  }
-
-               if ( ( c1 == EMIDI_LOOP_END ) &&
-                  ( c2 == EMIDI_END_LOOP_VALUE ) )
-                  {
-                  if ( ( Track->context[ 0 ].loopstart != NULL ) &&
-                     ( Track->context[ 0 ].loopcount != 0 ) )
-                     {
-                     if ( Track->context[ 0 ].loopcount != EMIDI_INFINITE )
-                        {
-                        Track->context[ 0 ].loopcount--;
-                        }
-
-                     Track->pos           = Track->context[ 0 ].loopstart;
-                     Track->RunningStatus = Track->context[ 0 ].RunningStatus;
-
-                     if ( !TimeSet )
-                        {
-                        _MIDI_Time             = Track->context[ 0 ].time;
-                        _MIDI_FPSecondsPerTick = Track->context[ 0 ].FPSecondsPerTick;
-                        _MIDI_Tick             = Track->context[ 0 ].tick;
-                        _MIDI_Beat             = Track->context[ 0 ].beat;
-                        _MIDI_Measure          = Track->context[ 0 ].measure;
-                        _MIDI_BeatsPerMeasure  = Track->context[ 0 ].BeatsPerMeasure;
-                        _MIDI_TicksPerBeat     = Track->context[ 0 ].TicksPerBeat;
-                        _MIDI_TimeBase         = Track->context[ 0 ].TimeBase;
-                        TimeSet = TRUE;
-                        }
-                     }
-                  break;
-                  }
-
-               if ( c1 == MIDI_MONO_MODE_ON )
-                  {
-                  Track->pos++;
-                  }
-
-               if ( ( c1 == MIDI_VOLUME ) && ( !Track->EMIDI_VolumeChange ) )
-                  {
-                  _MIDI_SetChannelVolume( channel, c2 );
-                  break;
-                  }
-               else if ( ( c1 == EMIDI_VOLUME_CHANGE ) &&
-                  ( Track->EMIDI_VolumeChange ) )
-                  {
-                  _MIDI_SetChannelVolume( channel, c2 );
-                  break;
-                  }
-
-               if ( ( c1 == EMIDI_PROGRAM_CHANGE ) &&
-                  ( Track->EMIDI_ProgramChange ) )
-                  {
-                  _MIDI_Funcs->ProgramChange( channel, MIDI_PatchMap[ c2 & 0x7f ] );
-                  break;
-                  }
-
-               if ( c1 == EMIDI_CONTEXT_START )
-                  {
-                  break;
-                  }
-
-               if ( c1 == EMIDI_CONTEXT_END )
-                  {
-                  if ( ( Track->currentcontext != _MIDI_Context ) ||
-                     ( Track->context[ _MIDI_Context ].pos == NULL )
-                     {
-                     break;
-                     }
-
-                  Track->currentcontext = _MIDI_Context;
-                  Track->context[ 0 ].loopstart = Track->context[ _MIDI_Context ].loopstart;
-                  Track->context[ 0 ].loopcount = Track->context[ _MIDI_Context ].loopcount;
-                  Track->pos           = Track->context[ _MIDI_Context ].pos;
-                  Track->RunningStatus = Track->context[ _MIDI_Context ].RunningStatus;
-
-                  if ( TimeSet )
-                     {
-                     break;
-                     }
-
-                  _MIDI_Time             = Track->context[ _MIDI_Context ].time;
-                  _MIDI_FPSecondsPerTick = Track->context[ _MIDI_Context ].FPSecondsPerTick;
-                  _MIDI_Tick             = Track->context[ _MIDI_Context ].tick;
-                  _MIDI_Beat             = Track->context[ _MIDI_Context ].beat;
-                  _MIDI_Measure          = Track->context[ _MIDI_Context ].measure;
-                  _MIDI_BeatsPerMeasure  = Track->context[ _MIDI_Context ].BeatsPerMeasure;
-                  _MIDI_TicksPerBeat     = Track->context[ _MIDI_Context ].TicksPerBeat;
-                  _MIDI_TimeBase         = Track->context[ _MIDI_Context ].TimeBase;
-                  TimeSet = TRUE;
-                  break;
-                  }
-
-               if ( _MIDI_Funcs->ControlChange )
-                  {
-                  _MIDI_Funcs->ControlChange( channel, c1, c2 );
-                  }
- */
-
-#endif
--- a/src/audiolib/_pas16.h
+++ /dev/null
@@ -1,248 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   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
--- a/src/audiolib/_sndscap.h
+++ /dev/null
@@ -1,134 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: _SNDSCAP.H
-
-   author: James R. Dose
-   date:   October 26, 1994
-
-   Private header for SNDSCAPE.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef ___SNDSCAP_H
-#define ___SNDSCAP_H
-
-#define VALID   ( 1 == 1 )
-#define INVALID ( !VALID )
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-#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 SOUNDSCAPE_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 SOUNDSCAPE_DefaultSampleRate 11000
-#define SOUNDSCAPE_DefaultMixMode    MONO_8BIT
-#define SOUNDSCAPE_MaxIrq            15
-
-/* Ensoniq gate-array chip defines ... */
-#define ODIE            0       /* ODIE gate array */
-#define OPUS            1       /* OPUS gate array */
-#define MMIC            2       /* MiMIC gate array */
-
-/* relevant direct register defines - offsets from base address */
-#define GA_HOSTCSTAT    2       /* host port ctrl/stat reg */
-#define GA_HOSTDATA     3       /* host port data reg */
-#define GA_REGADDR      4       /* indirect address reg */
-#define GA_REGDATA      5       /* indirect data reg */
-#define SB_IACK      0x22e /* SoundBlaster IACK register */
-
-/* relevant indirect register defines */
-#define GA_DMACHB       3       /* DMA chan B assign reg */
-#define GA_INTCFG       4       /* interrupt configuration reg */
-#define GA_DMACFG       5       /* DMA config reg */
-#define GA_CDCFG        6       /* CD-ROM (AD-1848) config reg */
-#define GA_HMCTL  9  /* host master control reg */
-#define GA_CHIPSEL      10      /* programmable external chip select */
-
-/* AD-1848 chip defines ... */
-/* relevant direct register defines */
-#define AD_REGADDR      0       /* indirect address reg */
-#define AD_REGDATA      1       /* indirect data reg */
-#define AD_STATUS       2       /* status register */
-#define AD_OFFSET       8       /* for some boards, a fixed BasePort offset */
-
-/* relevant indirect register defines */
-#define AD_LEFTOUT      6       /* left DAC output control reg */
-#define AD_RIGHTOUT     7       /* right DAC output control reg */
-#define AD_FORMAT       8       /* clock and data format reg */
-#define AD_CONFIG       9       /* interface config register */
-#define AD_PINCTRL      10      /* external pin control reg */
-#define AD_UCOUNT       14      /* upper count reg */
-#define AD_LCOUNT       15      /* lower count reg */
-
-/* some firmware command and communication defines */
-#define SET_CTL      0x88  /* set a control value */
-#define GET_CTL      0x89  /* get a control value */
-#define SET_REV      0xb0  /* set synth reverb */
-#define SYNTH_VOL 0x04  /* Synth Vol control number */
-#define RXRDY     0x01  /* Receive-Ready bit mask */
-#define TXRDY     0x02  /* Transmit-Ready bit mask */
-
-/* some miscellaneous defines ... soundscape reg values, sytem int regs, ... */
-#define INTCONT1        0x20    /* Interrupt Controller 1 control register */
-#define INTCONT2        0xa0    /* Interrupt Controller 2 control register */
-#define INTMASK1        0x21    /* Interrupt Controller 1 mask register */
-#define INTMASK2        0xa1    /* Interrupt Controller 2 mask register */
-#define VECTBASE1       0x08    /* vector base for XT interrupts */
-#define VECTBASE2       0x70    /* vector base for AT extended interrupts */
-#define EOI             0x20    /* End Of Interrupt command */
-#define AUTO_OUT        0x58    /* DMA controller mode */
-
-static void SOUNDSCAPE_EnableInterrupt( void );
-static void SOUNDSCAPE_DisableInterrupt( void );
-static void __interrupt __far SOUNDSCAPE_ServiceInterrupt( void );
-static int  ga_read( int rnum );
-static void ga_write( int rnum, int value );
-static int  ad_read( int rnum );
-static void ad_write( int rnum, int value );
-static void tdelay( void );
-static void pcm_format( void );
-static int  SOUNDSCAPE_SetupDMABuffer( char *BufferPtr, int BufferSize, int mode );
-static int  SOUNDSCAPE_BeginPlayback( int length );
-static void SOUNDSCAPE_LockEnd( void );
-static void SOUNDSCAPE_UnlockMemory( void );
-static int  SOUNDSCAPE_LockMemory( void );
-static unsigned short allocateTimerStack( unsigned short size );
-static void deallocateTimerStack( unsigned short selector );
-static int  parse( char *val, char *str, FILE *p1 );
-static int  SOUNDSCAPE_FindCard( void );
-static int  SOUNDSCAPE_Setup( void );
-
-#endif
--- a/src/audiolib/adlibfx.c
+++ /dev/null
@@ -1,550 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: ADLIBFX.C
-
-   author: James R. Dose
-   date:   April 1, 1994
-
-   Low level routines to support Adlib sound effects created by Muse.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <stdlib.h>
-#include <conio.h>
-#include "dpmi.h"
-#include "task_man.h"
-#include "interrup.h"
-#include "al_midi.h"
-#include "adlibfx.h"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-static void ADLIBFX_SendOutput( int reg, int data );
-static void ADLIBFX_Service( task *Task );
-
-static long     ADLIBFX_LengthLeft;
-static int      ADLIBFX_Block;
-static ALSound *ADLIBFX_Sound = NULL;
-static char    *ADLIBFX_SoundPtr = NULL;
-static int      ADLIBFX_Priority;
-static unsigned long ADLIBFX_CallBackVal;
-static void     ( *ADLIBFX_CallBackFunc )( unsigned long ) = NULL;
-static int      ADLIBFX_SoundVolume;
-static int      ADLIBFX_TotalVolume = ADLIBFX_MaxVolume;
-static task    *ADLIBFX_ServiceTask = NULL;
-static int      ADLIBFX_VoiceHandle = ADLIBFX_MinVoiceHandle;
-
-int ADLIBFX_Installed = FALSE;
-
-int ADLIBFX_ErrorCode = ADLIBFX_Ok;
-
-#define ADLIBFX_SetErrorCode( status ) \
-   ADLIBFX_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *ADLIBFX_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case ADLIBFX_Warning :
-      case ADLIBFX_Error :
-         ErrorString = ADLIBFX_ErrorString( ADLIBFX_ErrorCode );
-         break;
-
-      case ADLIBFX_Ok :
-         ErrorString = "Adlib FX ok.";
-         break;
-
-      case ADLIBFX_NoVoices :
-         ErrorString = "No free voices available in Adlib FX.";
-         break;
-
-      case ADLIBFX_VoiceNotFound :
-         ErrorString = "No voice with matching handle found.";
-         break;
-
-      case ADLIBFX_DPMI_Error :
-         ErrorString = "DPMI Error in AdlibFX.";
-         break;
-
-      default :
-         ErrorString = "Unknown Adlib FX error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define ADLIBFX_LockStart ADLIBFX_SendOutput
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_SendOutput
-
-   Writes a byte of data to the specified register on the Adlib card.
----------------------------------------------------------------------*/
-
-static void ADLIBFX_SendOutput
-   (
-   int reg,
-   int data
-   )
-
-   {
-   int i;
-   int adlib_port = 0x388;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   outp( adlib_port, reg );
-
-   for( i = 6; i ; i-- )
-      {
-      inp( adlib_port );
-      }
-
-   outp( adlib_port + 1, data );
-
-   for( i = 35; i ; i-- )
-      {
-      inp( adlib_port );
-      }
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_Stop
-
-   Halts playback of the currently playing sound effect.
----------------------------------------------------------------------*/
-
-int ADLIBFX_Stop
-   (
-   int handle
-   )
-
-   {
-   unsigned flags;
-
-   if ( ( handle != ADLIBFX_VoiceHandle ) || ( ADLIBFX_Sound == NULL ) )
-      {
-      ADLIBFX_SetErrorCode( ADLIBFX_VoiceNotFound );
-      return( ADLIBFX_Warning );
-      }
-
-   flags = DisableInterrupts();
-
-   ADLIBFX_SendOutput( 0xb0, 0 );
-
-   ADLIBFX_Sound      = NULL;
-   ADLIBFX_SoundPtr   = NULL;
-   ADLIBFX_LengthLeft = 0;
-   ADLIBFX_Priority   = 0;
-
-   RestoreInterrupts( flags );
-
-   if ( ADLIBFX_CallBackFunc )
-      {
-      ADLIBFX_CallBackFunc( ADLIBFX_CallBackVal );
-      }
-
-   return( ADLIBFX_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_Service
-
-   Task Manager routine to perform the playback of a sound effect.
----------------------------------------------------------------------*/
-
-static void ADLIBFX_Service
-   (
-   task *Task
-   )
-
-   {
-   int value;
-
-   if ( ADLIBFX_SoundPtr )
-      {
-      value = *ADLIBFX_SoundPtr++;
-      if ( value != 0 )
-         {
-         ADLIBFX_SendOutput( 0xa0, value );
-         ADLIBFX_SendOutput( 0xb0, ADLIBFX_Block );
-         }
-      else
-         {
-         ADLIBFX_SendOutput( 0xb0, 0 );
-         }
-
-      ADLIBFX_LengthLeft--;
-      if ( ADLIBFX_LengthLeft <= 0 )
-         {
-         ADLIBFX_Stop( ADLIBFX_VoiceHandle );
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_SetVolume
-
-   Sets the volume of the currently playing sound effect.
----------------------------------------------------------------------*/
-
-int ADLIBFX_SetVolume
-   (
-   int handle,
-   int volume
-   )
-
-   {
-   unsigned flags;
-   int      carrierlevel;
-
-   flags = DisableInterrupts();
-   if ( ( handle != ADLIBFX_VoiceHandle ) || ( ADLIBFX_Sound == NULL ) )
-      {
-      RestoreInterrupts( flags );
-      ADLIBFX_SetErrorCode( ADLIBFX_VoiceNotFound );
-      return( ADLIBFX_Warning );
-      }
-
-   volume  = min( volume, ADLIBFX_MaxVolume );
-   volume  = max( volume, 0 );
-   ADLIBFX_SoundVolume = volume;
-
-   volume *= ADLIBFX_TotalVolume;
-   volume /= ADLIBFX_MaxVolume;
-
-   carrierlevel  = ADLIBFX_Sound->cScale & 0x3f;
-   carrierlevel ^= 0x3f;
-   carrierlevel *= ( volume / 2 ) + 0x80;
-   carrierlevel /= ADLIBFX_MaxVolume;
-   carrierlevel ^= 0x3f;
-   carrierlevel |= ADLIBFX_Sound->cScale & 0xc0;
-
-   ADLIBFX_SendOutput( 0x43, carrierlevel );
-
-   RestoreInterrupts( flags );
-   return( ADLIBFX_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_SetTotalVolume
-
-   Sets the total volume of the sound effect.
----------------------------------------------------------------------*/
-
-int ADLIBFX_SetTotalVolume
-   (
-   int volume
-   )
-
-   {
-   volume = max( volume, 0 );
-   volume = min( volume, ADLIBFX_MaxVolume );
-
-   ADLIBFX_TotalVolume = volume;
-   ADLIBFX_SetVolume( ADLIBFX_VoiceHandle, ADLIBFX_SoundVolume );
-
-   return( ADLIBFX_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_GetTotalVolume
-
-   Returns the total volume of the sound effect.
----------------------------------------------------------------------*/
-
-int ADLIBFX_GetTotalVolume
-   (
-   void
-   )
-
-   {
-   return( ADLIBFX_TotalVolume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_VoiceAvailable
-
-   Checks if a voice can be play at the specified priority.
----------------------------------------------------------------------*/
-
-int ADLIBFX_VoiceAvailable
-   (
-   int priority
-   )
-
-   {
-   if ( priority < ADLIBFX_Priority )
-      {
-      return( FALSE );
-      }
-
-   return( TRUE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_Play
-
-   Starts playback of a Muse sound effect.
----------------------------------------------------------------------*/
-
-int ADLIBFX_Play
-   (
-   ALSound *sound,
-   int volume,
-   int priority,
-   unsigned long callbackval
-   )
-
-   {
-   unsigned flags;
-   int      carrierlevel;
-
-   if ( priority < ADLIBFX_Priority )
-      {
-      ADLIBFX_SetErrorCode( ADLIBFX_NoVoices );
-      return( ADLIBFX_Warning );
-      }
-
-   ADLIBFX_Stop( ADLIBFX_VoiceHandle );
-
-   ADLIBFX_VoiceHandle++;
-   if ( ADLIBFX_VoiceHandle < ADLIBFX_MinVoiceHandle )
-      {
-      ADLIBFX_VoiceHandle = ADLIBFX_MinVoiceHandle;
-      }
-
-   flags = DisableInterrupts();
-
-   ADLIBFX_LengthLeft  = sound->length;
-   ADLIBFX_Priority    = priority;
-   ADLIBFX_Sound       = sound;
-   ADLIBFX_SoundPtr    = &sound->data;
-   ADLIBFX_CallBackVal = callbackval;
-
-   ADLIBFX_Block = ( ( sound->block & 7 ) << 2 ) | 0x20;
-
-   volume = min( volume, ADLIBFX_MaxVolume );
-   volume = max( volume, 0 );
-   ADLIBFX_SoundVolume = volume;
-
-   volume *= ADLIBFX_TotalVolume;
-   volume /= ADLIBFX_MaxVolume;
-
-   carrierlevel  = sound->cScale & 0x3f;
-   carrierlevel ^= 0x3f;
-   carrierlevel *= ( volume / 2 ) + 0x80;
-   carrierlevel /= ADLIBFX_MaxVolume;
-   carrierlevel ^= 0x3f;
-   carrierlevel |= sound->cScale & 0xc0;
-
-   ADLIBFX_SendOutput( 0x20, sound->mChar );
-   ADLIBFX_SendOutput( 0x40, sound->mScale );
-   ADLIBFX_SendOutput( 0x60, sound->mAttack );
-   ADLIBFX_SendOutput( 0x80, sound->mSus );
-   ADLIBFX_SendOutput( 0xe0, sound->mWave );
-
-   ADLIBFX_SendOutput( 0x23, sound->cChar );
-   ADLIBFX_SendOutput( 0x43, carrierlevel );
-   ADLIBFX_SendOutput( 0x63, sound->cAttack );
-   ADLIBFX_SendOutput( 0x83, sound->cSus );
-   ADLIBFX_SendOutput( 0xe3, sound->cWave );
-
-   ADLIBFX_SendOutput( 0xc0, 0 );
-
-   RestoreInterrupts( flags );
-
-   return( ADLIBFX_VoiceHandle );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_SoundPlaying
-
-   Checks if a sound effect is currently playing.
----------------------------------------------------------------------*/
-
-int ADLIBFX_SoundPlaying
-   (
-   int handle
-   )
-
-   {
-   int status;
-
-   status = FALSE;
-   if ( ( handle == ADLIBFX_VoiceHandle ) && ( ADLIBFX_LengthLeft > 0 ) )
-      {
-      status = TRUE;
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void ADLIBFX_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_SetCallBack
-
-   Set the function to call when a voice stops.
----------------------------------------------------------------------*/
-
-void ADLIBFX_SetCallBack
-   (
-   void ( *function )( unsigned long )
-   )
-
-   {
-   ADLIBFX_CallBackFunc = function;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_Init
-
-   Initializes the sound effect engine.
----------------------------------------------------------------------*/
-
-int ADLIBFX_Init
-   (
-   void
-   )
-
-   {
-   int status;
-
-   if ( ADLIBFX_Installed )
-      {
-      ADLIBFX_Shutdown();
-      }
-
-   status  = DPMI_LockMemoryRegion( ADLIBFX_LockStart, ADLIBFX_LockEnd );
-   status |= DPMI_Lock( ADLIBFX_VoiceHandle );
-   status |= DPMI_Lock( ADLIBFX_Sound );
-   status |= DPMI_Lock( ADLIBFX_ErrorCode );
-   status |= DPMI_Lock( ADLIBFX_SoundPtr );
-   status |= DPMI_Lock( ADLIBFX_LengthLeft );
-   status |= DPMI_Lock( ADLIBFX_Priority );
-   status |= DPMI_Lock( ADLIBFX_CallBackFunc );
-   status |= DPMI_Lock( ADLIBFX_Block );
-
-   if ( status != DPMI_Ok )
-      {
-      ADLIBFX_SetErrorCode( ADLIBFX_DPMI_Error );
-      return( ADLIBFX_Error );
-      }
-
-//JIM
-//   AL_ReserveVoice( 0 );
-   ADLIBFX_Stop( ADLIBFX_VoiceHandle );
-   ADLIBFX_ServiceTask = TS_ScheduleTask( &ADLIBFX_Service, 140, 2, NULL );
-   TS_Dispatch();
-   ADLIBFX_Installed = TRUE;
-   ADLIBFX_CallBackFunc = NULL;
-
-   ADLIBFX_SetErrorCode( ADLIBFX_Ok );
-   return( ADLIBFX_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ADLIBFX_Shutdown
-
-   Ends the use of the sound effect engine.
----------------------------------------------------------------------*/
-
-int ADLIBFX_Shutdown
-   (
-   void
-   )
-
-   {
-   if ( ADLIBFX_Installed )
-      {
-      ADLIBFX_Stop( ADLIBFX_VoiceHandle );
-      TS_Terminate( ADLIBFX_ServiceTask );
-      ADLIBFX_ServiceTask = NULL;
-//JIM
-//      AL_ReleaseVoice( 0 );
-      ADLIBFX_Installed = FALSE;
-
-      DPMI_UnlockMemoryRegion( ADLIBFX_LockStart, ADLIBFX_LockEnd );
-      DPMI_Unlock( ADLIBFX_VoiceHandle );
-      DPMI_Unlock( ADLIBFX_Sound );
-      DPMI_Unlock( ADLIBFX_ErrorCode );
-      DPMI_Unlock( ADLIBFX_SoundPtr );
-      DPMI_Unlock( ADLIBFX_LengthLeft );
-      DPMI_Unlock( ADLIBFX_Priority );
-      DPMI_Unlock( ADLIBFX_CallBackFunc );
-      DPMI_Unlock( ADLIBFX_Block );
-      }
-
-   ADLIBFX_SetErrorCode( ADLIBFX_Ok );
-   return( ADLIBFX_Ok );
-   }
--- a/src/audiolib/adlibfx.h
+++ /dev/null
@@ -1,78 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: ADLIBFX.H
-
-   author: James R. Dose
-   date:   April 1, 1994
-
-   Public header for ADLIBFX.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __ADLIBFX_H
-#define __ADLIBFX_H
-
-enum ADLIBFX_Errors
-   {
-   ADLIBFX_Warning = -2,
-   ADLIBFX_Error   = -1,
-   ADLIBFX_Ok      = 0,
-   ADLIBFX_NoVoices,
-   ADLIBFX_VoiceNotFound,
-   ADLIBFX_DPMI_Error
-   };
-
-typedef	struct
-   {
-   unsigned long  length;
-   short int      priority;
-   char           mChar, cChar;
-   char           mScale, cScale;
-   char           mAttack, cAttack;
-   char           mSus, cSus;
-   char           mWave, cWave;
-   char           nConn;
-   char           voice;
-   char           mode;
-   char           unused[ 3 ];
-   char           block;
-   char           data[];
-   } ALSound;
-
-#define ADLIBFX_MaxVolume      255
-#define ADLIBFX_MinVoiceHandle 1
-
-char *ADLIBFX_ErrorString( int ErrorNumber );
-int   ADLIBFX_Stop( int handle );
-int   ADLIBFX_SetVolume( int handle, int volume );
-int   ADLIBFX_SetTotalVolume( int volume );
-int   ADLIBFX_GetTotalVolume( void );
-int   ADLIBFX_VoiceAvailable( int priority );
-int   ADLIBFX_Play( ALSound *sound, int volume, int priority, unsigned long callbackval );
-int   ADLIBFX_SoundPlaying( int handle );
-void  ADLIBFX_SetCallBack( void ( *function )( unsigned long ) );
-int   ADLIBFX_Init( void );
-int   ADLIBFX_Shutdown( void );
-   #pragma aux ADLIBFX_Shutdown frame;
-void  PCFX_UnlockMemory( void );
-   #pragma aux ADLIBFX_UnlockMemory frame;
-int   PCFX_LockMemory( void );
-
-#endif
--- a/src/audiolib/al_midi.c
+++ /dev/null
@@ -1,1508 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: AL_MIDI.C
-
-   author: James R. Dose
-   date:   April 1, 1994
-
-   Low level routines to support General MIDI music on Adlib compatible
-   cards.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <conio.h>
-#include <dos.h>
-#include <stddef.h>
-#include <stdlib.h>
-//#include <math.h>
-#include "dpmi.h"
-#include "interrup.h"
-#include "sndcards.h"
-#include "blaster.h"
-#include "user.h"
-#include "al_midi.h"
-#include "_al_midi.h"
-#include "ll_man.h"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-static unsigned OctavePitch[ MAX_OCTAVE + 1 ] =
-   {
-   OCTAVE_0, OCTAVE_1, OCTAVE_2, OCTAVE_3,
-   OCTAVE_4, OCTAVE_5, OCTAVE_6, OCTAVE_7,
-   };
-
-static unsigned NoteMod12[ MAX_NOTE + 1 ];
-static unsigned NoteDiv12[ MAX_NOTE + 1 ];
-
-// Pitch table
-
-//static unsigned NotePitch[ FINETUNE_MAX + 1 ][ 12 ] =
-//   {
-//      { C, C_SHARP, D, D_SHARP, E, F, F_SHARP, G, G_SHARP, A, A_SHARP, B },
-//   };
-
-static unsigned NotePitch[ FINETUNE_MAX + 1 ][ 12 ] =
-   {
-      { 0x157, 0x16b, 0x181, 0x198, 0x1b0, 0x1ca, 0x1e5, 0x202, 0x220, 0x241, 0x263, 0x287 },
-      { 0x157, 0x16b, 0x181, 0x198, 0x1b0, 0x1ca, 0x1e5, 0x202, 0x220, 0x242, 0x264, 0x288 },
-      { 0x158, 0x16c, 0x182, 0x199, 0x1b1, 0x1cb, 0x1e6, 0x203, 0x221, 0x243, 0x265, 0x289 },
-      { 0x158, 0x16c, 0x183, 0x19a, 0x1b2, 0x1cc, 0x1e7, 0x204, 0x222, 0x244, 0x266, 0x28a },
-      { 0x159, 0x16d, 0x183, 0x19a, 0x1b3, 0x1cd, 0x1e8, 0x205, 0x223, 0x245, 0x267, 0x28b },
-      { 0x15a, 0x16e, 0x184, 0x19b, 0x1b3, 0x1ce, 0x1e9, 0x206, 0x224, 0x246, 0x268, 0x28c },
-      { 0x15a, 0x16e, 0x185, 0x19c, 0x1b4, 0x1ce, 0x1ea, 0x207, 0x225, 0x247, 0x269, 0x28e },
-      { 0x15b, 0x16f, 0x185, 0x19d, 0x1b5, 0x1cf, 0x1eb, 0x208, 0x226, 0x248, 0x26a, 0x28f },
-      { 0x15b, 0x170, 0x186, 0x19d, 0x1b6, 0x1d0, 0x1ec, 0x209, 0x227, 0x249, 0x26b, 0x290 },
-      { 0x15c, 0x170, 0x187, 0x19e, 0x1b7, 0x1d1, 0x1ec, 0x20a, 0x228, 0x24a, 0x26d, 0x291 },
-      { 0x15d, 0x171, 0x188, 0x19f, 0x1b7, 0x1d2, 0x1ed, 0x20b, 0x229, 0x24b, 0x26e, 0x292 },
-      { 0x15d, 0x172, 0x188, 0x1a0, 0x1b8, 0x1d3, 0x1ee, 0x20c, 0x22a, 0x24c, 0x26f, 0x293 },
-      { 0x15e, 0x172, 0x189, 0x1a0, 0x1b9, 0x1d4, 0x1ef, 0x20d, 0x22b, 0x24d, 0x270, 0x295 },
-      { 0x15f, 0x173, 0x18a, 0x1a1, 0x1ba, 0x1d4, 0x1f0, 0x20e, 0x22c, 0x24e, 0x271, 0x296 },
-      { 0x15f, 0x174, 0x18a, 0x1a2, 0x1bb, 0x1d5, 0x1f1, 0x20f, 0x22d, 0x24f, 0x272, 0x297 },
-      { 0x160, 0x174, 0x18b, 0x1a3, 0x1bb, 0x1d6, 0x1f2, 0x210, 0x22e, 0x250, 0x273, 0x298 },
-      { 0x161, 0x175, 0x18c, 0x1a3, 0x1bc, 0x1d7, 0x1f3, 0x211, 0x22f, 0x251, 0x274, 0x299 },
-      { 0x161, 0x176, 0x18c, 0x1a4, 0x1bd, 0x1d8, 0x1f4, 0x212, 0x230, 0x252, 0x276, 0x29b },
-      { 0x162, 0x176, 0x18d, 0x1a5, 0x1be, 0x1d9, 0x1f5, 0x212, 0x231, 0x254, 0x277, 0x29c },
-      { 0x162, 0x177, 0x18e, 0x1a6, 0x1bf, 0x1d9, 0x1f5, 0x213, 0x232, 0x255, 0x278, 0x29d },
-      { 0x163, 0x178, 0x18f, 0x1a6, 0x1bf, 0x1da, 0x1f6, 0x214, 0x233, 0x256, 0x279, 0x29e },
-      { 0x164, 0x179, 0x18f, 0x1a7, 0x1c0, 0x1db, 0x1f7, 0x215, 0x235, 0x257, 0x27a, 0x29f },
-      { 0x164, 0x179, 0x190, 0x1a8, 0x1c1, 0x1dc, 0x1f8, 0x216, 0x236, 0x258, 0x27b, 0x2a1 },
-      { 0x165, 0x17a, 0x191, 0x1a9, 0x1c2, 0x1dd, 0x1f9, 0x217, 0x237, 0x259, 0x27c, 0x2a2 },
-      { 0x166, 0x17b, 0x192, 0x1aa, 0x1c3, 0x1de, 0x1fa, 0x218, 0x238, 0x25a, 0x27e, 0x2a3 },
-      { 0x166, 0x17b, 0x192, 0x1aa, 0x1c3, 0x1df, 0x1fb, 0x219, 0x239, 0x25b, 0x27f, 0x2a4 },
-      { 0x167, 0x17c, 0x193, 0x1ab, 0x1c4, 0x1e0, 0x1fc, 0x21a, 0x23a, 0x25c, 0x280, 0x2a6 },
-      { 0x168, 0x17d, 0x194, 0x1ac, 0x1c5, 0x1e0, 0x1fd, 0x21b, 0x23b, 0x25d, 0x281, 0x2a7 },
-      { 0x168, 0x17d, 0x194, 0x1ad, 0x1c6, 0x1e1, 0x1fe, 0x21c, 0x23c, 0x25e, 0x282, 0x2a8 },
-      { 0x169, 0x17e, 0x195, 0x1ad, 0x1c7, 0x1e2, 0x1ff, 0x21d, 0x23d, 0x260, 0x283, 0x2a9 },
-      { 0x16a, 0x17f, 0x196, 0x1ae, 0x1c8, 0x1e3, 0x1ff, 0x21e, 0x23e, 0x261, 0x284, 0x2ab },
-      { 0x16a, 0x17f, 0x197, 0x1af, 0x1c8, 0x1e4, 0x200, 0x21f, 0x23f, 0x262, 0x286, 0x2ac }
-   };
-
-// Slot numbers as a function of the voice and the operator.
-// ( melodic only)
-
-static int slotVoice[ NUM_VOICES ][ 2 ] =
-   {
-      { 0, 3 },    // voice 0
-      { 1, 4 },    // 1
-      { 2, 5 },    // 2
-      { 6, 9 },    // 3
-      { 7, 10 },   // 4
-      { 8, 11 },   // 5
-      { 12, 15 },  // 6
-      { 13, 16 },  // 7
-      { 14, 17 },  // 8
-   };
-
-static int VoiceLevel[ NumChipSlots ][ 2 ];
-static int VoiceKsl[ NumChipSlots ][ 2 ];
-
-// This table gives the offset of each slot within the chip.
-// offset = fn( slot)
-
-static char offsetSlot[ NumChipSlots ] =
-   {
-    0,  1,  2,  3,  4,  5,
-    8,  9, 10, 11, 12, 13,
-   16, 17, 18, 19, 20, 21
-   };
-
-static int VoiceReserved[ NUM_VOICES * 2 ] =
-   {
-   FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
-   FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
-   };
-
-static VOICE     Voice[ NUM_VOICES * 2 ];
-static VOICELIST Voice_Pool;
-
-static CHANNEL   Channel[ NUM_CHANNELS ];
-
-static int AL_LeftPort   = 0x388;
-static int AL_RightPort  = 0x388;
-static int AL_Stereo     = FALSE;
-static int AL_SendStereo = FALSE;
-static int AL_OPL3       = FALSE;
-static int AL_MaxMidiChannel = 16;
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define AL_LockStart AL_SendOutputToPort
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SendOutputToPort
-
-   Sends data to the Adlib using a specified port.
----------------------------------------------------------------------*/
-
-void AL_SendOutputToPort
-   (
-   int  port,
-   int  reg,
-   int  data
-   )
-
-   {
-   int delay;
-
-   outp( port, reg );
-
-   for( delay = 6; delay > 0 ; delay-- )
-//   for( delay = 2; delay > 0 ; delay-- )
-      {
-      inp( port );
-      }
-
-   outp( port + 1, data );
-
-//   for( delay = 35; delay > 0 ; delay-- )
-   for( delay = 27; delay > 0 ; delay-- )
-//   for( delay = 2; delay > 0 ; delay-- )
-      {
-      inp( port );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SendOutput
-
-   Sends data to the Adlib.
----------------------------------------------------------------------*/
-
-void AL_SendOutput
-   (
-   int  voice,
-   int  reg,
-   int  data
-   )
-
-   {
-   int port;
-
-   if ( AL_SendStereo )
-      {
-      AL_SendOutputToPort( AL_LeftPort, reg, data );
-      AL_SendOutputToPort( AL_RightPort, reg, data );
-      }
-   else
-      {
-      port = ( voice == 0 ) ? AL_RightPort : AL_LeftPort;
-      AL_SendOutputToPort( port, reg, data );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetVoiceTimbre
-
-   Programs the specified voice's timbre.
----------------------------------------------------------------------*/
-
-static void AL_SetVoiceTimbre
-   (
-   int voice
-   )
-
-   {
-   int    off;
-   int    slot;
-   int    port;
-   int    voc;
-   int    patch;
-   int    channel;
-   TIMBRE *timbre;
-
-   channel = Voice[ voice ].channel;
-
-   if ( channel == 9 )
-      {
-      patch = Voice[ voice ].key + 128;
-      }
-   else
-      {
-      patch = Channel[ channel ].Timbre;
-      }
-
-   if ( Voice[ voice ].timbre == patch )
-      {
-      return;
-      }
-
-   Voice[ voice ].timbre = patch;
-   timbre = &ADLIB_TimbreBank[ patch ];
-
-   port = Voice[ voice ].port;
-   voc  = ( voice >= NUM_VOICES ) ? voice - NUM_VOICES : voice;
-   slot = slotVoice[ voc ][ 0 ];
-   off  = offsetSlot[ slot ];
-
-   VoiceLevel[ slot ][ port ] = 63 - ( timbre->Level[ 0 ] & 0x3f );
-   VoiceKsl[ slot ][ port ]   = timbre->Level[ 0 ] & 0xc0;
-
-   AL_SendOutput( port, 0xA0 + voc, 0 );
-   AL_SendOutput( port, 0xB0 + voc, 0 );
-
-   // Let voice clear the release
-   AL_SendOutput( port, 0x80 + off, 0xff );
-
-   AL_SendOutput( port, 0x60 + off, timbre->Env1[ 0 ] );
-   AL_SendOutput( port, 0x80 + off, timbre->Env2[ 0 ] );
-   AL_SendOutput( port, 0x20 + off, timbre->SAVEK[ 0 ] );
-   AL_SendOutput( port, 0xE0 + off, timbre->Wave[ 0 ] );
-
-   AL_SendOutput( port, 0x40 + off, timbre->Level[ 0 ] );
-   slot = slotVoice[ voc ][ 1 ];
-
-   if ( AL_SendStereo )
-      {
-      AL_SendOutputToPort( AL_LeftPort, 0xC0 + voice,
-         ( timbre->Feedback & 0x0f ) | 0x20 );
-      AL_SendOutputToPort( AL_RightPort, 0xC0 + voice,
-         ( timbre->Feedback & 0x0f ) | 0x10 );
-      }
-   else
-      {
-      if ( AL_OPL3 )
-         {
-         AL_SendOutput( port, 0xC0 + voc, ( timbre->Feedback & 0x0f ) |
-            0x30 );
-         }
-      else
-         {
-         AL_SendOutputToPort( ADLIB_PORT, 0xC0 + voice, timbre->Feedback );
-         }
-      }
-
-   off = offsetSlot[ slot ];
-
-   VoiceLevel[ slot ][ port ] = 63 - ( timbre->Level[ 1 ] & 0x3f );
-   VoiceKsl[ slot ][ port ]   = timbre->Level[ 1 ] & 0xc0;
-   AL_SendOutput( port, 0x40 + off, 63 );
-
-   // Let voice clear the release
-   AL_SendOutput( port, 0x80 + off, 0xff );
-
-   AL_SendOutput( port, 0x60 + off, timbre->Env1[ 1 ] );
-   AL_SendOutput( port, 0x80 + off, timbre->Env2[ 1 ] );
-   AL_SendOutput( port, 0x20 + off, timbre->SAVEK[ 1 ] );
-   AL_SendOutput( port, 0xE0 + off, timbre->Wave[ 1 ] );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetVoiceVolume
-
-   Sets the volume of the specified voice.
----------------------------------------------------------------------*/
-
-static void AL_SetVoiceVolume
-   (
-   int voice
-   )
-
-   {
-   int channel;
-   int velocity;
-   int slot;
-   int port;
-   int voc;
-   unsigned long t1;
-   unsigned long t2;
-   unsigned long volume;
-   TIMBRE *timbre;
-
-   channel = Voice[ voice ].channel;
-
-   timbre = &ADLIB_TimbreBank[ Voice[ voice ].timbre ];
-
-   velocity = Voice[ voice ].velocity + timbre->Velocity;
-   velocity = min( velocity, MAX_VELOCITY );
-
-   voc  = ( voice >= NUM_VOICES ) ? voice - NUM_VOICES : voice;
-   slot = slotVoice[ voc ][ 1 ];
-   port = Voice[ voice ].port;
-
-   // amplitude
-   t1  = ( unsigned )VoiceLevel[ slot ][ port ];
-   t1 *= ( velocity + 0x80 );
-   t1  = ( Channel[ channel ].Volume * t1 ) >> 15;
-
-   if ( !AL_SendStereo )
-      {
-      volume  = t1 ^ 63;
-      volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-      AL_SendOutput( port, 0x40 + offsetSlot[ slot ], volume );
-
-      // Check if this timbre is Additive
-      if ( timbre->Feedback & 0x01 )
-         {
-         slot = slotVoice[ voc ][ 0 ];
-
-         // amplitude
-         t2  = ( unsigned )VoiceLevel[ slot ][ port ];
-         t2 *= ( velocity + 0x80 );
-         t2  = ( Channel[ channel ].Volume * t1 ) >> 15;
-
-         volume  = t2 ^ 63;
-         volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-         AL_SendOutput( port, 0x40 + offsetSlot[ slot ], volume );
-         }
-      }
-   else
-      {
-      // Set left channel volume
-      volume = t1;
-      if ( Channel[ channel ].Pan < 64 )
-         {
-         volume *= Channel[ channel ].Pan;
-         volume >>= 6;
-         }
-
-      volume ^= 63;
-      volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-      AL_SendOutputToPort( AL_LeftPort, 0x40 + offsetSlot[ slot ], volume );
-
-      // Set right channel volume
-      volume = t1;
-      if ( Channel[ channel ].Pan > 64 )
-         {
-         volume *= 127 - Channel[ channel ].Pan;
-         volume >>= 6;
-         }
-
-      volume ^= 63;
-      volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-      AL_SendOutputToPort( AL_RightPort, 0x40 + offsetSlot[ slot ], volume );
-
-      // Check if this timbre is Additive
-      if ( timbre->Feedback & 0x01 )
-         {
-         // amplitude
-         t2  = ( unsigned )VoiceLevel[ slot ][ port ];
-         t2 *= ( velocity + 0x80 );
-         t2  = ( Channel[ channel ].Volume * t1 ) >> 15;
-
-         slot = slotVoice[ voc ][ 0 ];
-
-         // Set left channel volume
-         volume = t2;
-         if ( Channel[ channel ].Pan < 64 )
-            {
-            volume *= Channel[ channel ].Pan;
-            volume >>= 6;
-            }
-
-         volume ^= 63;
-         volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-         AL_SendOutputToPort( AL_LeftPort, 0x40 + offsetSlot[ slot ], volume );
-
-         // Set right channel volume
-         volume = t2;
-         if ( Channel[ channel ].Pan > 64 )
-            {
-            volume *= 127 - Channel[ channel ].Pan;
-            volume >>= 6;
-            }
-
-         volume ^= 63;
-         volume |= ( unsigned )VoiceKsl[ slot ][ port ];
-
-         AL_SendOutputToPort( AL_RightPort, 0x40 + offsetSlot[ slot ], volume );
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_AllocVoice
-
-   Retrieves a free voice from the voice pool.
----------------------------------------------------------------------*/
-
-static int AL_AllocVoice
-   (
-   void
-   )
-
-   {
-   int voice;
-
-   if ( Voice_Pool.start )
-      {
-      voice = Voice_Pool.start->num;
-      LL_Remove( VOICE, &Voice_Pool, &Voice[ voice ] );
-      return( voice );
-      }
-
-   return( AL_VoiceNotFound );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_GetVoice
-
-   Determines which voice is associated with a specified note and
-   MIDI channel.
----------------------------------------------------------------------*/
-
-static int AL_GetVoice
-   (
-   int channel,
-   int key
-   )
-
-   {
-   VOICE *voice;
-
-   voice = Channel[ channel ].Voices.start;
-
-   while( voice != NULL )
-      {
-      if ( voice->key == key )
-         {
-         return( voice->num );
-         }
-      voice = voice->next;
-      }
-
-   return( AL_VoiceNotFound );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetVoicePitch
-
-   Programs the pitch of the specified voice.
----------------------------------------------------------------------*/
-
-static void AL_SetVoicePitch
-   (
-   int voice
-   )
-
-   {
-   int note;
-   int channel;
-   int patch;
-   int detune;
-   int ScaleNote;
-   int Octave;
-   int pitch;
-   int port;
-   int voc;
-
-   port = Voice[ voice ].port;
-   voc  = ( voice >= NUM_VOICES ) ? voice - NUM_VOICES : voice;
-   channel = Voice[ voice ].channel;
-
-   if ( channel == 9 )
-      {
-      patch = Voice[ voice ].key + 128;
-      note  = ADLIB_TimbreBank[ patch ].Transpose;
-      }
-   else
-      {
-      patch = Channel[ channel ].Timbre;
-      note  = Voice[ voice ].key + ADLIB_TimbreBank[ patch ].Transpose;
-      }
-
-   note += Channel[ channel ].KeyOffset - 12;
-   if ( note > MAX_NOTE )
-      {
-      note = MAX_NOTE;
-      }
-   if ( note < 0 )
-      {
-      note = 0;
-      }
-
-   detune = Channel[ channel ].KeyDetune;
-
-   ScaleNote = NoteMod12[ note ];
-   Octave    = NoteDiv12[ note ];
-
-   pitch = OctavePitch[ Octave ] | NotePitch[ detune ][ ScaleNote ];
-
-   Voice[ voice ].pitchleft = pitch;
-
-   pitch |= Voice[ voice ].status;
-
-   if ( !AL_SendStereo )
-      {
-      AL_SendOutput( port, 0xA0 + voc, pitch );
-      AL_SendOutput( port, 0xB0 + voc, pitch >> 8 );
-      }
-   else
-      {
-      AL_SendOutputToPort( AL_LeftPort, 0xA0 + voice, pitch );
-      AL_SendOutputToPort( AL_LeftPort, 0xB0 + voice, pitch >> 8 );
-
-      if ( channel != 9 )
-         {
-         detune += STEREO_DETUNE;
-         }
-
-      if ( detune > FINETUNE_MAX )
-         {
-         detune -= FINETUNE_RANGE;
-         if ( note < MAX_NOTE )
-            {
-            note++;
-            ScaleNote = NoteMod12[ note ];
-            Octave    = NoteDiv12[ note ];
-            }
-         }
-
-      pitch = OctavePitch[ Octave ] | NotePitch[ detune ][ ScaleNote ];
-
-      Voice[ voice ].pitchright = pitch;
-
-      pitch |= Voice[ voice ].status;
-
-      AL_SendOutputToPort( AL_RightPort, 0xA0 + voice, pitch );
-      AL_SendOutputToPort( AL_RightPort, 0xB0 + voice, pitch >> 8 );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetChannelVolume
-
-   Sets the volume of the specified MIDI channel.
----------------------------------------------------------------------*/
-
-static void AL_SetChannelVolume
-   (
-   int channel,
-   int volume
-   )
-
-   {
-   VOICE *voice;
-
-   volume = max( 0, volume );
-   volume = min( volume, AL_MaxVolume );
-   Channel[ channel ].Volume = volume;
-
-   voice = Channel[ channel ].Voices.start;
-   while( voice != NULL )
-      {
-      AL_SetVoiceVolume( voice->num );
-      voice = voice->next;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetChannelPan
-
-   Sets the pan position of the specified MIDI channel.
----------------------------------------------------------------------*/
-
-static void AL_SetChannelPan
-   (
-   int channel,
-   int pan
-   )
-
-   {
-   // Don't pan drum sounds
-   if ( channel != 9 )
-      {
-      Channel[ channel ].Pan = pan;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetChannelDetune
-
-   Sets the stereo voice detune of the specified MIDI channel.
----------------------------------------------------------------------*/
-
-static void AL_SetChannelDetune
-   (
-   int channel,
-   int detune
-   )
-
-   {
-   Channel[ channel ].Detune = detune;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_ResetVoices
-
-   Sets all voice info to the default state.
----------------------------------------------------------------------*/
-
-static void AL_ResetVoices
-   (
-   void
-   )
-
-   {
-   int index;
-   int numvoices;
-
-   Voice_Pool.start = NULL;
-   Voice_Pool.end = NULL;
-
-   numvoices = NUM_VOICES;
-   if ( ( AL_OPL3 ) && ( !AL_Stereo ) )
-      {
-      numvoices = NUM_VOICES * 2;
-      }
-   for( index = 0; index < numvoices; index++ )
-      {
-      if ( VoiceReserved[ index ] == FALSE )
-         {
-         Voice[ index ].num = index;
-         Voice[ index ].key = 0;
-         Voice[ index ].velocity = 0;
-         Voice[ index ].channel = -1;
-         Voice[ index ].timbre = -1;
-         Voice[ index ].port = ( index < NUM_VOICES ) ? 0 : 1;
-         Voice[ index ].status = NOTE_OFF;
-         LL_AddToTail( VOICE, &Voice_Pool, &Voice[ index ] );
-         }
-      }
-
-   for( index = 0; index < NUM_CHANNELS; index++ )
-      {
-      Channel[ index ].Voices.start    = NULL;
-      Channel[ index ].Voices.end      = NULL;
-      Channel[ index ].Timbre          = 0;
-      Channel[ index ].Pitchbend       = 0;
-      Channel[ index ].KeyOffset       = 0;
-      Channel[ index ].KeyDetune       = 0;
-      Channel[ index ].Volume          = AL_DefaultChannelVolume;
-      Channel[ index ].Pan             = 64;
-      Channel[ index ].RPN             = 0;
-      Channel[ index ].PitchBendRange     = AL_DefaultPitchBendRange;
-      Channel[ index ].PitchBendSemiTones = AL_DefaultPitchBendRange / 100;
-      Channel[ index ].PitchBendHundreds  = AL_DefaultPitchBendRange % 100;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_CalcPitchInfo
-
-   Calculates the pitch table.
----------------------------------------------------------------------*/
-
-static void AL_CalcPitchInfo
-   (
-   void
-   )
-
-   {
-   int    note;
-//   int    finetune;
-//   double detune;
-
-   for( note = 0; note <= MAX_NOTE; note++ )
-      {
-      NoteMod12[ note ] = note % 12;
-      NoteDiv12[ note ] = note / 12;
-      }
-
-//   for( finetune = 1; finetune <= FINETUNE_MAX; finetune++ )
-//      {
-//      detune = pow( 2, ( double )finetune / ( 12.0 * FINETUNE_RANGE ) );
-//      for( note = 0; note < 12; note++ )
-//         {
-//         NotePitch[ finetune ][ note ] = ( ( double )NotePitch[ 0 ][ note ] * detune );
-//         }
-//      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_FlushCard
-
-   Sets all voices to a known (quiet) state.
----------------------------------------------------------------------*/
-
-void AL_FlushCard
-   (
-   int port
-   )
-
-   {
-   int i;
-   unsigned slot1;
-   unsigned slot2;
-
-   for( i = 0 ; i < NUM_VOICES; i++ )
-      {
-      if ( VoiceReserved[ i ] == FALSE )
-         {
-         slot1 = offsetSlot[ slotVoice[ i ][ 0 ] ];
-         slot2 = offsetSlot[ slotVoice[ i ][ 1 ] ];
-
-         AL_SendOutputToPort( port, 0xA0 + i, 0 );
-         AL_SendOutputToPort( port, 0xB0 + i, 0 );
-
-         AL_SendOutputToPort( port, 0xE0 + slot1, 0 );
-         AL_SendOutputToPort( port, 0xE0 + slot2, 0 );
-
-         // Set the envelope to be fast and quiet
-         AL_SendOutputToPort( port, 0x60 + slot1, 0xff );
-         AL_SendOutputToPort( port, 0x60 + slot2, 0xff );
-         AL_SendOutputToPort( port, 0x80 + slot1, 0xff );
-         AL_SendOutputToPort( port, 0x80 + slot2, 0xff );
-
-         // Maximum attenuation
-         AL_SendOutputToPort( port, 0x40 + slot1, 0xff );
-         AL_SendOutputToPort( port, 0x40 + slot2, 0xff );
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_StereoOn
-
-   Sets the card send info in stereo.
----------------------------------------------------------------------*/
-
-void AL_StereoOn
-   (
-   void
-   )
-
-   {
-   if ( ( AL_Stereo ) && ( !AL_SendStereo ) )
-      {
-      AL_SendStereo = TRUE;
-      if ( AL_OPL3 )
-         {
-         // Set card to OPL3 operation
-         AL_SendOutputToPort( AL_RightPort, 0x5, 1 );
-         }
-      }
-   else if ( AL_OPL3 )
-      {
-      // Set card to OPL3 operation
-      AL_SendOutputToPort( AL_RightPort, 0x5, 1 );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_StereoOff
-
-   Sets the card send info in mono.
----------------------------------------------------------------------*/
-
-void AL_StereoOff
-   (
-   void
-   )
-
-   {
-   if ( ( AL_Stereo ) && ( AL_SendStereo ) )
-      {
-      AL_SendStereo = FALSE;
-      if ( AL_OPL3 )
-         {
-         // Set card back to OPL2 operation
-         AL_SendOutputToPort( AL_RightPort, 0x5, 0 );
-         }
-      }
-   else if ( AL_OPL3 )
-      {
-      // Set card back to OPL2 operation
-      AL_SendOutputToPort( AL_RightPort, 0x5, 0 );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_Reset
-
-   Sets the card to a known (quiet) state.
----------------------------------------------------------------------*/
-
-void AL_Reset
-   (
-   void
-   )
-
-   {
-   AL_SendOutputToPort( ADLIB_PORT, 1, 0x20 );
-   AL_SendOutputToPort( ADLIB_PORT, 0x08, 0 );
-
-   // Set the values: AM Depth, VIB depth & Rhythm
-   AL_SendOutputToPort( ADLIB_PORT, 0xBD, 0 );
-
-   AL_StereoOn();
-
-   if ( ( AL_SendStereo ) || ( AL_OPL3 ) )
-      {
-      AL_FlushCard( AL_LeftPort );
-      AL_FlushCard( AL_RightPort );
-      }
-   else
-      {
-      AL_FlushCard( ADLIB_PORT );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_ReserveVoice
-
-   Marks a voice as being not available for use.  This allows the
-   driver to use the rest of the card while another driver uses the
-   reserved voice.
----------------------------------------------------------------------*/
-
-int AL_ReserveVoice
-   (
-   int voice
-   )
-
-   {
-   unsigned flags;
-
-   if ( ( voice < 0 ) || ( voice >= NUM_VOICES ) )
-      {
-      return( AL_Error );
-      }
-
-   if ( VoiceReserved[ voice ] )
-      {
-      return( AL_Warning );
-      }
-
-   flags = DisableInterrupts();
-
-   if ( Voice[ voice ].status == NOTE_ON )
-      {
-      AL_NoteOff( Voice[ voice ].channel, Voice[ voice ].key, 0 );
-      }
-
-   VoiceReserved[ voice ] = TRUE;
-   LL_Remove( VOICE, &Voice_Pool, &Voice[ voice ] );
-
-   RestoreInterrupts( flags );
-   return( AL_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_ReleaseVoice
-
-   Marks a previously reserved voice as being free to use.
----------------------------------------------------------------------*/
-
-int AL_ReleaseVoice
-   (
-   int voice
-   )
-
-   {
-   unsigned flags;
-
-   if ( ( voice < 0 ) || ( voice >= NUM_VOICES ) )
-      {
-      return( AL_Error );
-      }
-
-   if ( !VoiceReserved[ voice ] )
-      {
-      return( AL_Warning );
-      }
-
-   flags = DisableInterrupts();
-
-   VoiceReserved[ voice ] = FALSE;
-   LL_AddToTail( VOICE, &Voice_Pool, &Voice[ voice ] );
-
-   RestoreInterrupts( flags );
-   return( AL_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_NoteOff
-
-   Turns off a note on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void AL_NoteOff
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   int voice;
-   int port;
-   int voc;
-
-   // We only play channels 1 through 10
-   if ( channel > AL_MaxMidiChannel )
-      {
-      return;
-      }
-
-   voice = AL_GetVoice( channel, key );
-
-   if ( voice == AL_VoiceNotFound )
-      {
-      return;
-      }
-
-   Voice[ voice ].status = NOTE_OFF;
-
-   port = Voice[ voice ].port;
-   voc  = ( voice >= NUM_VOICES ) ? voice - NUM_VOICES : voice;
-
-   if ( AL_SendStereo )
-      {
-      AL_SendOutputToPort( AL_LeftPort, 0xB0 + voice,
-         hibyte( Voice[ voice ].pitchleft ) );
-      AL_SendOutputToPort( AL_RightPort, 0xB0 + voice,
-         hibyte( Voice[ voice ].pitchright ) );
-      }
-   else
-      {
-      AL_SendOutput( port, 0xB0 + voc, hibyte( Voice[ voice ].pitchleft ) );
-      }
-
-   LL_Remove( VOICE, &Channel[ channel ].Voices, &Voice[ voice ] );
-   LL_AddToTail( VOICE, &Voice_Pool, &Voice[ voice ] );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_NoteOn
-
-   Plays a note on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void AL_NoteOn
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   int voice;
-
-   // We only play channels 1 through 10
-   if ( channel > AL_MaxMidiChannel )
-      {
-      return;
-      }
-
-   if ( velocity == 0 )
-      {
-      AL_NoteOff( channel, key, velocity );
-      return;
-      }
-
-   voice = AL_AllocVoice();
-
-   if ( voice == AL_VoiceNotFound )
-      {
-      if ( Channel[ 9 ].Voices.start )
-         {
-         AL_NoteOff( 9, Channel[ 9 ].Voices.start->key, 0 );
-         voice = AL_AllocVoice();
-         }
-      if ( voice == AL_VoiceNotFound )
-         {
-         return;
-         }
-      }
-
-   Voice[ voice ].key      = key;
-   Voice[ voice ].channel  = channel;
-   Voice[ voice ].velocity = velocity;
-   Voice[ voice ].status   = NOTE_ON;
-
-   LL_AddToTail( VOICE, &Channel[ channel ].Voices, &Voice[ voice ] );
-
-   AL_SetVoiceTimbre( voice );
-   AL_SetVoiceVolume( voice );
-   AL_SetVoicePitch( voice );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_AllNotesOff
-
-   Turns off all currently playing voices.
----------------------------------------------------------------------*/
-
-void AL_AllNotesOff
-   (
-   int channel
-   )
-
-   {
-   while( Channel[ channel ].Voices.start != NULL )
-      {
-      AL_NoteOff( channel, Channel[ channel ].Voices.start->key, 0 );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_ControlChange
-
-   Sets the value of a controller on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void AL_ControlChange
-   (
-   int channel,
-   int type,
-   int data
-   )
-
-   {
-   // We only play channels 1 through 10
-   if ( channel > AL_MaxMidiChannel )
-      {
-      return;
-      }
-
-   switch( type )
-      {
-      case MIDI_VOLUME :
-         AL_SetChannelVolume( channel, data );
-         break;
-
-      case MIDI_PAN :
-         AL_SetChannelPan( channel, data );
-         break;
-
-      case MIDI_DETUNE :
-         AL_SetChannelDetune( channel, data );
-         break;
-
-      case MIDI_ALL_NOTES_OFF :
-         AL_AllNotesOff( channel );
-         break;
-
-      case MIDI_RESET_ALL_CONTROLLERS :
-         AL_ResetVoices();
-         AL_SetChannelVolume( channel, AL_DefaultChannelVolume );
-         AL_SetChannelPan( channel, 64 );
-         AL_SetChannelDetune( channel, 0 );
-         break;
-
-      case MIDI_RPN_MSB :
-         Channel[ channel ].RPN &= 0x00FF;
-         Channel[ channel ].RPN |= ( data & 0xFF ) << 8;
-         break;
-
-      case MIDI_RPN_LSB :
-         Channel[ channel ].RPN &= 0xFF00;
-         Channel[ channel ].RPN |= data & 0xFF;
-         break;
-
-      case MIDI_DATAENTRY_MSB :
-         if ( Channel[ channel ].RPN == MIDI_PITCHBEND_RPN )
-            {
-            Channel[ channel ].PitchBendSemiTones = data;
-            Channel[ channel ].PitchBendRange     =
-               Channel[ channel ].PitchBendSemiTones * 100 +
-               Channel[ channel ].PitchBendHundreds;
-            }
-         break;
-
-      case MIDI_DATAENTRY_LSB :
-         if ( Channel[ channel ].RPN == MIDI_PITCHBEND_RPN )
-            {
-            Channel[ channel ].PitchBendHundreds = data;
-            Channel[ channel ].PitchBendRange    =
-               Channel[ channel ].PitchBendSemiTones * 100 +
-               Channel[ channel ].PitchBendHundreds;
-            }
-         break;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_ProgramChange
-
-   Selects the instrument to use on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void AL_ProgramChange
-   (
-   int channel,
-   int patch
-   )
-
-   {
-   // We only play channels 1 through 10
-   if ( channel > AL_MaxMidiChannel )
-      {
-      return;
-      }
-
-   Channel[ channel ].Timbre  = patch;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetPitchBend
-
-   Sets the pitch bend amount on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void AL_SetPitchBend
-   (
-   int channel,
-   int lsb,
-   int msb
-   )
-
-   {
-   int            pitchbend;
-   unsigned long  TotalBend;
-   VOICE         *voice;
-
-   // We only play channels 1 through 10
-   if ( channel > AL_MaxMidiChannel )
-      {
-      return;
-      }
-
-   pitchbend = lsb + ( msb << 8 );
-   Channel[ channel ].Pitchbend = pitchbend;
-
-   TotalBend  = pitchbend * Channel[ channel ].PitchBendRange;
-   TotalBend /= ( PITCHBEND_CENTER / FINETUNE_RANGE );
-
-   Channel[ channel ].KeyOffset  = ( int )( TotalBend / FINETUNE_RANGE );
-   Channel[ channel ].KeyOffset -= Channel[ channel ].PitchBendSemiTones;
-
-   Channel[ channel ].KeyDetune = ( unsigned )( TotalBend % FINETUNE_RANGE );
-
-   voice = Channel[ channel ].Voices.start;
-   while( voice != NULL )
-      {
-      AL_SetVoicePitch( voice->num );
-      voice = voice->next;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_DetectFM
-
-   Determines if an Adlib compatible card is installed in the machine.
----------------------------------------------------------------------*/
-
-int AL_DetectFM
-   (
-   void
-   )
-
-   {
-   int status1;
-   int status2;
-   int i;
-
-   if ( USER_CheckParameter( NO_ADLIB_DETECTION ) )
-      {
-      return( FALSE );
-      }
-
-   AL_SendOutputToPort( ADLIB_PORT, 4, 0x60 );   // Reset T1 & T2
-   AL_SendOutputToPort( ADLIB_PORT, 4, 0x80 );   // Reset IRQ
-
-   status1 = inp( ADLIB_PORT );
-
-   AL_SendOutputToPort( ADLIB_PORT, 2, 0xff );   // Set timer 1
-   AL_SendOutputToPort( ADLIB_PORT, 4, 0x21 );   // Start timer 1
-
-   for( i = 100; i > 0; i-- )
-      {
-      inp( ADLIB_PORT );
-      }
-
-   status2 = inp( ADLIB_PORT );
-
-   AL_SendOutputToPort( ADLIB_PORT, 4, 0x60 );
-   AL_SendOutputToPort( ADLIB_PORT, 4, 0x80 );
-
-   return( ( ( status1 & 0xe0 ) == 0x00 ) && ( ( status2 & 0xe0 ) == 0xc0 ) );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void AL_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_Shutdown
-
-   Ends use of the sound card and resets it to a quiet state.
----------------------------------------------------------------------*/
-
-void AL_Shutdown
-   (
-   void
-   )
-
-   {
-   AL_StereoOff();
-
-   AL_OPL3 = FALSE;
-   AL_ResetVoices();
-   AL_Reset();
-
-   DPMI_UnlockMemoryRegion( AL_LockStart, AL_LockEnd );
-   DPMI_Unlock( slotVoice );
-   DPMI_Unlock( VoiceLevel );
-   DPMI_Unlock( VoiceKsl );
-   DPMI_Unlock( offsetSlot );
-   DPMI_Unlock( NotePitch );
-   DPMI_Unlock( OctavePitch );
-   DPMI_Unlock( NoteMod12 );
-   DPMI_Unlock( NoteDiv12 );
-   DPMI_Unlock( VoiceReserved );
-   DPMI_Unlock( Voice );
-   DPMI_Unlock( Voice_Pool );
-   DPMI_Unlock( Channel );
-   DPMI_Unlock( AL_LeftPort );
-   DPMI_Unlock( AL_RightPort );
-   DPMI_Unlock( AL_Stereo );
-   DPMI_Unlock( AL_SendStereo );
-   DPMI_Unlock( AL_OPL3 );
-   DPMI_Unlock( AL_MaxMidiChannel );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_SetMaxMidiChannel
-
-   Sets the maximum MIDI channel that FM cards respond to.
----------------------------------------------------------------------*/
-
-void AL_SetMaxMidiChannel
-   (
-   int channel
-   )
-
-   {
-   AL_MaxMidiChannel = channel - 1;
-   }
-
-/*---------------------------------------------------------------------
-   Function: AL_Init
-
-   Begins use of the sound card.
----------------------------------------------------------------------*/
-
-int AL_Init
-   (
-   int soundcard
-   )
-
-   {
-   BLASTER_CONFIG Blaster;
-   int status;
-
-   status  = DPMI_LockMemoryRegion( AL_LockStart, AL_LockEnd );
-   status |= DPMI_Lock( slotVoice );
-   status |= DPMI_Lock( VoiceLevel );
-   status |= DPMI_Lock( VoiceKsl );
-   status |= DPMI_Lock( offsetSlot );
-   status |= DPMI_Lock( NotePitch );
-   status |= DPMI_Lock( OctavePitch );
-   status |= DPMI_Lock( NoteMod12 );
-   status |= DPMI_Lock( NoteDiv12 );
-   status |= DPMI_Lock( VoiceReserved );
-   status |= DPMI_Lock( Voice );
-   status |= DPMI_Lock( Voice_Pool );
-   status |= DPMI_Lock( Channel );
-   status |= DPMI_Lock( AL_LeftPort );
-   status |= DPMI_Lock( AL_RightPort );
-   status |= DPMI_Lock( AL_Stereo );
-   status |= DPMI_Lock( AL_SendStereo );
-   status |= DPMI_Lock( AL_OPL3 );
-   status |= DPMI_Lock( AL_MaxMidiChannel );
-
-   if ( status != DPMI_Ok )
-      {
-      return( AL_Error );
-      }
-
-   AL_Stereo = FALSE;
-   AL_OPL3   = FALSE;
-   AL_LeftPort = 0x388;
-   AL_RightPort = 0x388;
-
-   switch( soundcard )
-      {
-      case ProAudioSpectrum :
-      case SoundMan16 :
-         AL_OPL3 = TRUE;
-         AL_LeftPort = 0x388;
-         AL_RightPort = 0x38A;
-         break;
-
-      case SoundBlaster :
-         status = BLASTER_GetCardSettings( &Blaster );
-         if ( status != BLASTER_Ok )
-            {
-            status = BLASTER_GetEnv( &Blaster );
-            if ( status != BLASTER_Ok )
-               {
-               break;
-               }
-            }
-
-         switch( Blaster.Type )
-            {
-            case SBPro2 :
-            case SB16 :
-               AL_OPL3 = TRUE;
-               AL_LeftPort  = Blaster.Address;
-               AL_RightPort = Blaster.Address + 2;
-               break;
-            }
-         break;
-      }
-// Temporarally commented out for ROTT.
-// Stereo FM seems to take too long on some computers and
-// causes the mouse driver to miss interrupts.
-
-/*
-   switch( soundcard )
-      {
-      case ProAudioSpectrum :
-      case SoundMan16 :
-         AL_OPL3 = TRUE;
-         AL_Stereo = TRUE;
-         AL_LeftPort  = 0x388;
-         AL_RightPort = 0x38A;
-         break;
-
-      case SoundBlaster :
-         status = BLASTER_GetCardSettings( &Blaster );
-         if ( status != BLASTER_Ok )
-            {
-            status = BLASTER_GetEnv( &Blaster );
-            if ( status != BLASTER_Ok )
-               {
-               break;
-               }
-            }
-
-         switch( Blaster.Type )
-            {
-            case SBPro2 :
-            case SB16 :
-               AL_OPL3 = TRUE;
-               AL_Stereo = TRUE;
-               AL_LeftPort  = Blaster.Address;
-               AL_RightPort = Blaster.Address + 2;
-               break;
-
-            case SBPro :
-               AL_Stereo = TRUE;
-               AL_LeftPort  = Blaster.Address;
-               AL_RightPort = Blaster.Address + 2;
-               break;
-            }
-         break;
-      }
-*/
-
-   AL_CalcPitchInfo();
-   AL_Reset();
-   AL_ResetVoices();
-
-   return( AL_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AL_RegisterTimbreBank
-
-   Copies user supplied timbres over the default timbre bank.
----------------------------------------------------------------------*/
-
-void AL_RegisterTimbreBank
-   (
-   unsigned char *timbres
-   )
-
-   {
-   int i;
-
-   for( i = 0; i < 256; i++ )
-      {
-      ADLIB_TimbreBank[ i ].SAVEK[ 0 ] = *( timbres++ );
-      ADLIB_TimbreBank[ i ].SAVEK[ 1 ] = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Level[ 0 ] = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Level[ 1 ] = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Env1[ 0 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Env1[ 1 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Env2[ 0 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Env2[ 1 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Wave[ 0 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Wave[ 1 ]  = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Feedback   = *( timbres++ );
-      ADLIB_TimbreBank[ i ].Transpose  = *( signed char * )( timbres++ );
-      ADLIB_TimbreBank[ i ].Velocity   = *( signed char * )( timbres++ );
-      }
-   }
--- a/src/audiolib/al_midi.h
+++ /dev/null
@@ -1,56 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef __AL_MIDI_H
-#define __AL_MIDI_H
-
-enum AL_Errors
-   {
-   AL_Warning  = -2,
-   AL_Error    = -1,
-   AL_Ok       = 0,
-   };
-
-#define AL_MaxVolume             127
-#define AL_DefaultChannelVolume  90
-//#define AL_DefaultPitchBendRange 2
-#define AL_DefaultPitchBendRange 200
-
-#define ADLIB_PORT 0x388
-
-void AL_SendOutputToPort( int port, int reg, int data );
-void AL_SendOutput( int  voice, int reg, int data );
-void AL_StereoOn( void );
-void AL_StereoOff( void );
-int  AL_ReserveVoice( int voice );
-int  AL_ReleaseVoice( int voice );
-void AL_Shutdown( void );
-int  AL_Init( int soundcard );
-void AL_SetMaxMidiChannel( int channel );
-void AL_Reset( void );
-void AL_NoteOff( int channel, int key, int velocity );
-void AL_NoteOn( int channel, int key, int vel );
-//Turned off to test if it works with Watcom 10a
-//   #pragma aux AL_NoteOn frame;
-void AL_AllNotesOff( int channel );
-void AL_ControlChange( int channel, int type, int data );
-void AL_ProgramChange( int channel, int patch );
-void AL_SetPitchBend( int channel, int lsb, int msb );
-int  AL_DetectFM( void );
-void AL_RegisterTimbreBank( unsigned char *timbres );
-
-#endif
--- a/src/audiolib/assert.h
+++ /dev/null
@@ -1,43 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef    __ASSERT_H
-
-    #define    __ASSERT_H
-
-    #ifdef NDEBUG
-
-        #define ASSERT(f)
-
-    #else
-
-        #pragma aux _Assert aborts;          /* _Assert will not return */
-        extern void _Assert( char *strFile, unsigned  uLine ); /*prototype */
-
-        #define ASSERT(f)          \
-            if (f)                 \
-                ;                  \
-            else                   \
-                _Assert( __FILE__, __LINE__ )
-
-    #endif
-
-#else
-
-    #error Multiple definition of ASSERT()
-
-#endif
--- a/src/audiolib/awe32.c
+++ /dev/null
@@ -1,538 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: AWE32.C
-
-   author: James R. Dose
-   date:   August 23, 1994
-
-   Cover functions for calling the AWE32 low-level library.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <conio.h>
-#include <string.h>
-#include "dpmi.h"
-#include "blaster.h"
-#include "ctaweapi.h"
-#include "awe32.h"
-
-#define _inp    inp
-#define _outp   outp
-
-/*  DSP defines  */
-#define MPU_ACK_OK          0xfe
-#define MPU_RESET_CMD       0xff
-#define MPU_ENTER_UART      0x3f
-
-static WORD wSBCBaseAddx;            /* Sound Blaster base address */
-static WORD wEMUBaseAddx;            /* EMU8000 subsystem base address */
-static WORD wMpuBaseAddx;            /* MPU401 base address */
-
-static unsigned short NoteFlags[ 128 ];
-
-/*  macros  */
-#define SBCPort( x )  ( ( x ) + wSBCBaseAddx )
-#define MPUPort( x )  ( ( x ) + wMpuBaseAddx )
-
-static SOUND_PACKET spSound =
-   {
-   0
-   };
-
-static LONG lBankSizes[ MAXBANKS ] =
-   {
-   0
-   };
-
-unsigned SetES( void );
-#pragma aux SetES = \
-        "xor eax, eax" \
-        "mov ax, es" \
-        "mov bx, ds" \
-        "mov es, bx" \
-        modify [ eax ebx ];
-
-void RestoreES( unsigned num );
-#pragma aux RestoreES = \
-        "mov  es, ax" \
-        parm [ eax ];
-
-int AWE32_ErrorCode = AWE32_Ok;
-
-#define AWE32_SetErrorCode( status ) \
-   AWE32_ErrorCode = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: AWE32_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *AWE32_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case AWE32_Warning :
-      case AWE32_Error :
-         ErrorString = AWE32_ErrorString( AWE32_ErrorCode );
-         break;
-
-      case AWE32_Ok :
-         ErrorString = "AWE32 ok.";
-         break;
-
-      case AWE32_SoundBlasterError :
-         ErrorString = BLASTER_ErrorString( BLASTER_Error );
-         break;
-
-      case AWE32_NotDetected :
-         ErrorString = "Could not detect AWE32.";
-         break;
-
-      case AWE32_UnableToInitialize :
-         ErrorString = "Unable to initialize AWE32.";
-
-      case AWE32_MPU401Error :
-         ErrorString = "MPU-401 initialization failed in AWE32.";
-         break;
-
-      case AWE32_DPMI_Error :
-         ErrorString = "DPMI Error in AWE32.";
-         break;
-
-      default :
-         ErrorString = "Unknown AWE32 error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define AWE32_LockStart AWE32_NoteOff
-
-
-void AWE32_NoteOff
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32NoteOff( channel, key, velocity );
-   RestoreES( temp );
-   NoteFlags[ key ] ^= ( 1 << channel );
-   }
-
-void AWE32_NoteOn
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32NoteOn( channel, key, velocity );
-   RestoreES( temp );
-   NoteFlags[ key ] |= ( 1 << channel );
-   }
-
-void AWE32_PolyAftertouch
-   (
-   int channel,
-   int key,
-   int pressure
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32PolyKeyPressure( channel, key, pressure );
-   RestoreES( temp );
-   }
-
-void AWE32_ChannelAftertouch
-   (
-   int channel,
-   int pressure
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32ChannelPressure( channel, pressure );
-   RestoreES( temp );
-   }
-
-void AWE32_ControlChange
-   (
-   int channel,
-   int number,
-   int value
-   )
-
-   {
-   unsigned temp;
-   int i;
-   unsigned channelmask;
-
-   temp = SetES();
-
-   if ( number == 0x7b )
-      {
-      channelmask = 1 << channel;
-      for( i = 0; i < 128; i++ )
-         {
-         if ( NoteFlags[ i ] & channelmask )
-            {
-            awe32NoteOff( channel, i, 0 );
-            NoteFlags[ i ] ^= channelmask;
-            }
-         }
-      }
-   else
-      {
-      awe32Controller( channel, number, value );
-      }
-   RestoreES( temp );
-   }
-
-void AWE32_ProgramChange
-   (
-   int channel,
-   int program
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32ProgramChange( channel, program );
-   RestoreES( temp );
-   }
-
-void AWE32_PitchBend
-   (
-   int channel,
-   int lsb,
-   int msb
-   )
-
-   {
-   unsigned temp;
-
-   temp = SetES();
-   awe32PitchBend( channel, lsb, msb );
-   RestoreES( temp );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: AWE32_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void AWE32_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*
-static int InitMPU
-   (
-   void
-   )
-
-   {
-   volatile DWORD dwCount;
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x40) --dwCount;
-   _outp(MPUPort(1), MPU_RESET_CMD);
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x80) --dwCount;
-   _inp(MPUPort(0));
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x40) --dwCount;
-   _outp(MPUPort(1), MPU_RESET_CMD);
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x80) --dwCount;
-   _inp(MPUPort(0));
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x40) --dwCount;
-   _outp(MPUPort(1), MPU_ENTER_UART);
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x80) --dwCount;
-   if (!dwCount) return TRUE;
-   if (_inp(MPUPort(0)) != MPU_ACK_OK) return TRUE;
-
-   // mask MPU-401 interrupt
-   _outp(SBCPort(0x4), 0x83);
-   _outp(SBCPort(0x5), _inp(SBCPort(0x5)) & ~0x04);
-
-   return FALSE;
-   }
-*/
-
-/*������������������������������������������������������������������������͸*/
-/*� ShutdownMPU                                                    �*/
-/*� Cleans up Sound Blaster to normal state.                               �*/
-/*������������������������������������������������������������������������;*/
-
-static void ShutdownMPU
-   (
-   void
-   )
-
-   {
-   volatile DWORD dwCount;
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x40) --dwCount;
-   _outp(MPUPort(1), MPU_RESET_CMD);
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   _inp(MPUPort(0));
-
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   dwCount = 0x2000;
-   while (dwCount && _inp(MPUPort(1)) & 0x40) --dwCount;
-   _outp(MPUPort(1), MPU_RESET_CMD);
-   for (dwCount=0; dwCount<0x2000; dwCount++) ;
-   _inp(MPUPort(0));
-   }
-
-
-/*������������������������������������������������������������������������͸*/
-/*� LoadSBK                                                                �*/
-/*������������������������������������������������������������������������;*/
-
-static void LoadSBK
-   (
-   void
-   )
-
-   {
-   /* use embeded preset objects */
-   spSound.bank_no = 0;            /* load as Bank 0 */
-   spSound.total_banks = 1;        /* use 1 bank first */
-   lBankSizes[ 0 ] = 0;            /* ram is not needed */
-
-   spSound.banksizes = lBankSizes;
-   awe32DefineBankSizes( &spSound );
-   awe32SoundPad.SPad1 = awe32SPad1Obj;
-   awe32SoundPad.SPad2 = awe32SPad2Obj;
-   awe32SoundPad.SPad3 = awe32SPad3Obj;
-   awe32SoundPad.SPad4 = awe32SPad4Obj;
-   awe32SoundPad.SPad5 = awe32SPad5Obj;
-   awe32SoundPad.SPad6 = awe32SPad6Obj;
-   awe32SoundPad.SPad7 = awe32SPad7Obj;
-   }
-
-
-int AWE32_Init
-   (
-   void
-   )
-
-   {
-   int status;
-   BLASTER_CONFIG Blaster;
-
-   wSBCBaseAddx = 0x220;
-   wEMUBaseAddx = 0x620;
-   wMpuBaseAddx = 0x330;
-
-   status = BLASTER_GetCardSettings( &Blaster );
-   if ( status != BLASTER_Ok )
-      {
-      status = BLASTER_GetEnv( &Blaster );
-      if ( status != BLASTER_Ok )
-         {
-         AWE32_SetErrorCode( AWE32_SoundBlasterError );
-         return( AWE32_Error );
-         }
-      }
-
-   wSBCBaseAddx = Blaster.Address;
-   if ( wSBCBaseAddx == UNDEFINED )
-      {
-      wSBCBaseAddx = 0x220;
-      }
-
-   wMpuBaseAddx = Blaster.Midi;
-   if ( wMpuBaseAddx == UNDEFINED )
-      {
-      wMpuBaseAddx = 0x330;
-      }
-
-   wEMUBaseAddx = Blaster.Emu;
-   if ( wEMUBaseAddx <= 0 )
-      {
-      wEMUBaseAddx = wSBCBaseAddx + 0x400;
-      }
-
-   status = awe32Detect( wEMUBaseAddx );
-   if ( status )
-      {
-      AWE32_SetErrorCode( AWE32_NotDetected );
-      return( AWE32_Error );
-      }
-
-   status = awe32InitHardware();
-   if ( status )
-      {
-      AWE32_SetErrorCode( AWE32_UnableToInitialize );
-      return( AWE32_Error );
-      }
-
-
-   status = awe32InitMIDI();
-   if ( status )
-      {
-      AWE32_Shutdown();
-      AWE32_SetErrorCode( AWE32_MPU401Error )
-      return( AWE32_Error );
-      }
-
-/*
-    status = InitMPU();
-   if ( status )
-      {
-      ShutdownMPU();
-      status = InitMPU();
-      if ( status )
-         {
-         ShutdownMPU();
-         status = InitMPU();
-         if ( status )
-            {
-            AWE32_Shutdown();
-            AWE32_SetErrorCode( AWE32_MPU401Error )
-            return( AWE32_Error );
-            }
-         }
-      }
-*/
-   status  = DPMI_LockMemoryRegion( AWE32_LockStart, AWE32_LockEnd );
-   status |= DPMI_Lock( wSBCBaseAddx );
-   status |= DPMI_Lock( wEMUBaseAddx );
-   status |= DPMI_Lock( wMpuBaseAddx );
-   status |= DPMI_Lock( spSound );
-   status |= DPMI_Lock( lBankSizes );
-   status |= DPMI_LockMemory( NoteFlags, sizeof( NoteFlags ) );
-
-   // Lock awe32 library
-   status  = DPMI_LockMemoryRegion( __midieng_code, __midieng_ecode );
-   status  = DPMI_LockMemoryRegion( __midieng_code(), __midieng_ecode() );
-   status  = DPMI_LockMemoryRegion( __nrpn_code, __nrpn_ecode );
-   status  = DPMI_LockMemoryRegion( __nrpn_code(), __nrpn_ecode() );
-   status  = DPMI_LockMemoryRegion( &__midivar_data, &__midivar_edata );
-   status  = DPMI_LockMemoryRegion( &__nrpnvar_data, &__nrpnvar_edata );
-   status  = DPMI_LockMemoryRegion( &__embed_data, &__embed_edata );
-
-   if ( status != DPMI_Ok )
-      {
-      ShutdownMPU();
-      awe32Terminate();
-      AWE32_SetErrorCode( AWE32_DPMI_Error );
-      return( AWE32_Error );
-      }
-
-   // Set the number of voices to use to 32
-   awe32NumG = 32;
-
-   awe32TotalPatchRam(&spSound);
-
-   LoadSBK();
-   awe32InitMIDI();
-   awe32InitNRPN();
-
-   memset( NoteFlags, 0, sizeof( NoteFlags ) );
-
-   return( AWE32_Ok );
-   }
-
-void AWE32_Shutdown
-   (
-   void
-   )
-
-   {
-   ShutdownMPU();
-   awe32Terminate();
-
-   DPMI_UnlockMemoryRegion( AWE32_LockStart, AWE32_LockEnd );
-   DPMI_Unlock( wSBCBaseAddx );
-   DPMI_Unlock( wEMUBaseAddx );
-   DPMI_Unlock( wMpuBaseAddx );
-   DPMI_Unlock( spSound );
-   DPMI_Unlock( lBankSizes );
-   DPMI_UnlockMemory( NoteFlags, sizeof( NoteFlags ) );
-
-   // Unlock awe32 library
-   DPMI_UnlockMemoryRegion( __midieng_code, __midieng_ecode );
-   DPMI_UnlockMemoryRegion( __midieng_code(), __midieng_ecode() );
-   DPMI_UnlockMemoryRegion( __nrpn_code, __nrpn_ecode );
-   DPMI_UnlockMemoryRegion( __nrpn_code(), __nrpn_ecode() );
-   DPMI_UnlockMemoryRegion( &__midivar_data, &__midivar_edata );
-   DPMI_UnlockMemoryRegion( &__nrpnvar_data, &__nrpnvar_edata );
-   DPMI_UnlockMemoryRegion( &__embed_data, &__embed_edata );
-   }
--- a/src/audiolib/awe32.h
+++ /dev/null
@@ -1,56 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: AWE32.H
-
-   author: James R. Dose
-   date:   August 23, 1994
-
-   Public header for AWE32.C  Cover functions for calling the
-   AWE32 low-level library.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __AWE32_H
-#define __AWE32_H
-
-enum AWE32_ERRORS
-   {
-   AWE32_Warning = -2,
-   AWE32_Error = -1,
-   AWE32_Ok = 0,
-   AWE32_SoundBlasterError,
-   AWE32_NotDetected,
-   AWE32_UnableToInitialize,
-   AWE32_MPU401Error,
-   AWE32_DPMI_Error
-   };
-
-char *AWE32_ErrorString( int ErrorNumber );
-int  AWE32_Init( void );
-void AWE32_Shutdown( void );
-void AWE32_NoteOff( int channel, int key, int velocity );
-void AWE32_NoteOn( int channel, int key, int velocity );
-void AWE32_PolyAftertouch( int channel, int key, int pressure );
-void AWE32_ChannelAftertouch( int channel, int pressure );
-void AWE32_ControlChange( int channel, int number, int value );
-void AWE32_ProgramChange( int channel, int program );
-void AWE32_PitchBend( int channel, int lsb, int msb );
-
-#endif
--- a/src/audiolib/blaster.c
+++ /dev/null
@@ -1,2328 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: BLASTER.C
-
-   author: James R. Dose
-   date:   February 4, 1994
-
-   Low level routines to support Sound Blaster, Sound Blaster Pro,
-   Sound Blaster 16, and compatible sound cards.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <conio.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include "dpmi.h"
-#include "dma.h"
-#include "irq.h"
-#include "blaster.h"
-#include "_blaster.h"
-
-#define USESTACK
-
-const int BLASTER_Interrupts[ BLASTER_MaxIrq + 1 ]  =
-   {
-   INVALID, INVALID,     0xa,     0xb,
-   INVALID,     0xd, INVALID,     0xf,
-   INVALID, INVALID,    0x72,    0x73,
-      0x74, INVALID, INVALID,    0x77
-   };
-
-const int BLASTER_SampleSize[ BLASTER_MaxMixMode + 1 ] =
-   {
-   MONO_8BIT_SAMPLE_SIZE,  STEREO_8BIT_SAMPLE_SIZE,
-   MONO_16BIT_SAMPLE_SIZE, STEREO_16BIT_SAMPLE_SIZE
-   };
-
-const CARD_CAPABILITY BLASTER_CardConfig[ BLASTER_MaxCardType + 1 ] =
-   {
-      { FALSE, INVALID,      INVALID, INVALID, INVALID }, // Unsupported
-      {  TRUE,      NO,    MONO_8BIT,    4000,   23000 }, // SB 1.0
-      {  TRUE,     YES,  STEREO_8BIT,    4000,   44100 }, // SBPro
-      {  TRUE,      NO,    MONO_8BIT,    4000,   23000 }, // SB 2.xx
-      {  TRUE,     YES,  STEREO_8BIT,    4000,   44100 }, // SBPro 2
-      { FALSE, INVALID,      INVALID, INVALID, INVALID }, // Unsupported
-      {  TRUE,     YES, STEREO_16BIT,    5000,   44100 }, // SB16
-   };
-
-CARD_CAPABILITY BLASTER_Card;
-
-static void    ( __interrupt __far *BLASTER_OldInt )( void );
-
-BLASTER_CONFIG BLASTER_Config =
-   {
-   UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED
-   };
-
-static int BLASTER_Installed = FALSE;
-
-int BLASTER_Version;
-
-static char   *BLASTER_DMABuffer;
-static char   *BLASTER_DMABufferEnd;
-static char   *BLASTER_CurrentDMABuffer;
-static int     BLASTER_TotalDMABufferSize;
-
-static int      BLASTER_TransferLength   = 0;
-static int      BLASTER_MixMode          = BLASTER_DefaultMixMode;
-static int      BLASTER_SamplePacketSize = MONO_16BIT_SAMPLE_SIZE;
-static unsigned BLASTER_SampleRate       = BLASTER_DefaultSampleRate;
-
-static unsigned BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-
-volatile int   BLASTER_SoundPlaying;
-volatile int   BLASTER_SoundRecording;
-
-void ( *BLASTER_CallBack )( void );
-
-static int  BLASTER_IntController1Mask;
-static int  BLASTER_IntController2Mask;
-
-static int BLASTER_MixerAddress = UNDEFINED;
-static int BLASTER_MixerType    = 0;
-static int BLASTER_OriginalMidiVolumeLeft   = 255;
-static int BLASTER_OriginalMidiVolumeRight  = 255;
-static int BLASTER_OriginalVoiceVolumeLeft  = 255;
-static int BLASTER_OriginalVoiceVolumeRight = 255;
-
-static int BLASTER_WaveBlasterState = 0x0F;
-
-// adequate stack size
-#define kStackSize 2048
-
-static unsigned short StackSelector = NULL;
-static unsigned long  StackPointer;
-
-static unsigned short oldStackSelector;
-static unsigned long  oldStackPointer;
-
-// This is defined because we can't create local variables in a
-// function that switches stacks.
-static int GlobalStatus;
-
-// These declarations are necessary to use the inline assembly pragmas.
-
-extern void GetStack(unsigned short *selptr,unsigned long *stackptr);
-extern void SetStack(unsigned short selector,unsigned long stackptr);
-
-// This function will get the current stack selector and pointer and save
-// them off.
-#pragma aux GetStack =  \
-   "mov  [edi],esp"     \
-   "mov  ax,ss"         \
-   "mov  [esi],ax"      \
-   parm [esi] [edi]     \
-   modify [eax esi edi];
-
-// This function will set the stack selector and pointer to the specified
-// values.
-#pragma aux SetStack =  \
-   "mov  ss,ax"         \
-   "mov  esp,edx"       \
-   parm [ax] [edx]      \
-   modify [eax edx];
-
-int BLASTER_DMAChannel;
-
-int BLASTER_ErrorCode = BLASTER_Ok;
-
-#define BLASTER_SetErrorCode( status ) \
-   BLASTER_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *BLASTER_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case BLASTER_Warning :
-      case BLASTER_Error :
-         ErrorString = BLASTER_ErrorString( BLASTER_ErrorCode );
-         break;
-
-      case BLASTER_Ok :
-         ErrorString = "Sound Blaster ok.";
-         break;
-
-      case BLASTER_EnvNotFound :
-         ErrorString = "BLASTER environment variable not set.";
-         break;
-
-      case BLASTER_AddrNotSet :
-         ErrorString = "Sound Blaster address not set.";
-         break;
-
-      case BLASTER_DMANotSet :
-         ErrorString = "Sound Blaster 8-bit DMA channel not set.";
-         break;
-
-      case BLASTER_DMA16NotSet :
-         ErrorString = "Sound Blaster 16-bit DMA channel not set.";
-         break;
-
-      case BLASTER_InvalidParameter :
-         ErrorString = "Invalid parameter in BLASTER environment variable.";
-         break;
-
-      case BLASTER_CardNotReady :
-         ErrorString = "Sound Blaster not responding on selected port.";
-         break;
-
-      case BLASTER_NoSoundPlaying :
-         ErrorString = "No sound playing on Sound Blaster.";
-         break;
-
-      case BLASTER_InvalidIrq :
-         ErrorString = "Invalid Sound Blaster Irq.";
-         break;
-
-      case BLASTER_UnableToSetIrq :
-         ErrorString = "Unable to set Sound Blaster IRQ.  Try selecting an IRQ of 7 or below.";
-         break;
-
-      case BLASTER_DmaError :
-         ErrorString = DMA_ErrorString( DMA_Error );
-         break;
-
-      case BLASTER_NoMixer :
-         ErrorString = "Mixer not available on selected Sound Blaster card.";
-         break;
-
-      case BLASTER_DPMI_Error :
-         ErrorString = "DPMI Error in Blaster.";
-         break;
-
-      case BLASTER_OutOfMemory :
-         ErrorString = "Out of conventional memory in Blaster.";
-         break;
-
-      default :
-         ErrorString = "Unknown Sound Blaster error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define BLASTER_LockStart BLASTER_EnableInterrupt
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_EnableInterrupt
-
-   Enables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-void BLASTER_EnableInterrupt
-   (
-   void
-   )
-
-   {
-   int Irq;
-   int mask;
-
-   // Unmask system interrupt
-   Irq  = BLASTER_Config.Interrupt;
-   if ( Irq < 8 )
-      {
-      mask = inp( 0x21 ) & ~( 1 << Irq );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask = inp( 0xA1 ) & ~( 1 << ( Irq - 8 ) );
-      outp( 0xA1, mask  );
-
-      mask = inp( 0x21 ) & ~( 1 << 2 );
-      outp( 0x21, mask  );
-      }
-
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DisableInterrupt
-
-   Disables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-void BLASTER_DisableInterrupt
-   (
-   void
-   )
-
-   {
-   int Irq;
-   int mask;
-
-   // Restore interrupt mask
-   Irq  = BLASTER_Config.Interrupt;
-   if ( Irq < 8 )
-      {
-      mask  = inp( 0x21 ) & ~( 1 << Irq );
-      mask |= BLASTER_IntController1Mask & ( 1 << Irq );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask  = inp( 0x21 ) & ~( 1 << 2 );
-      mask |= BLASTER_IntController1Mask & ( 1 << 2 );
-      outp( 0x21, mask  );
-
-      mask  = inp( 0xA1 ) & ~( 1 << ( Irq - 8 ) );
-      mask |= BLASTER_IntController2Mask & ( 1 << ( Irq - 8 ) );
-      outp( 0xA1, mask  );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ServiceInterrupt
-
-   Handles interrupt generated by sound card at the end of a voice
-   transfer.  Calls the user supplied callback function.
----------------------------------------------------------------------*/
-
-void __interrupt __far BLASTER_ServiceInterrupt
-   (
-   void
-   )
-
-   {
-   #ifdef USESTACK
-   // save stack
-   GetStack( &oldStackSelector, &oldStackPointer );
-
-   // set our stack
-   SetStack( StackSelector, StackPointer );
-   #endif
-
-   // Acknowledge interrupt
-   // Check if this is this an SB16 or newer
-   if ( BLASTER_Version >= DSP_Version4xx )
-      {
-      outp( BLASTER_Config.Address + BLASTER_MixerAddressPort,
-         MIXER_DSP4xxISR_Ack );
-
-      GlobalStatus = inp( BLASTER_Config.Address + BLASTER_MixerDataPort );
-
-      // Check if a 16-bit DMA interrupt occurred
-      if ( GlobalStatus & MIXER_16BITDMA_INT )
-         {
-         // Acknowledge 16-bit transfer interrupt
-         inp( BLASTER_Config.Address + BLASTER_16BitDMAAck );
-         }
-      else if ( GlobalStatus & MIXER_8BITDMA_INT )
-         {
-         inp( BLASTER_Config.Address + BLASTER_DataAvailablePort );
-         }
-      else
-         {
-         #ifdef USESTACK
-         // restore stack
-         SetStack( oldStackSelector, oldStackPointer );
-         #endif
-
-         // Wasn't our interrupt.  Call the old one.
-         _chain_intr( BLASTER_OldInt );
-         }
-      }
-   else
-      {
-      // Older card - can't detect if an interrupt occurred.
-      inp( BLASTER_Config.Address + BLASTER_DataAvailablePort );
-      }
-
-   // Keep track of current buffer
-   BLASTER_CurrentDMABuffer += BLASTER_TransferLength;
-
-   if ( BLASTER_CurrentDMABuffer >= BLASTER_DMABufferEnd )
-      {
-      BLASTER_CurrentDMABuffer = BLASTER_DMABuffer;
-      }
-
-   // Continue playback on cards without autoinit mode
-   if ( BLASTER_Version < DSP_Version2xx )
-      {
-      if ( BLASTER_SoundPlaying )
-         {
-         BLASTER_DSP1xx_BeginPlayback( BLASTER_TransferLength );
-         }
-
-      if ( BLASTER_SoundRecording )
-         {
-         BLASTER_DSP1xx_BeginRecord( BLASTER_TransferLength );
-         }
-      }
-
-   // Call the caller's callback function
-   if ( BLASTER_CallBack != NULL )
-      {
-      BLASTER_CallBack();
-      }
-
-   #ifdef USESTACK
-   // restore stack
-   SetStack( oldStackSelector, oldStackPointer );
-   #endif
-
-   // send EOI to Interrupt Controller
-   if ( BLASTER_Config.Interrupt > 7 )
-      {
-      outp( 0xA0, 0x20 );
-      }
-
-   outp( 0x20, 0x20 );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_WriteDSP
-
-   Writes a byte of data to the sound card's DSP.
----------------------------------------------------------------------*/
-
-int BLASTER_WriteDSP
-   (
-   unsigned data
-   )
-
-   {
-   int      port;
-   unsigned count;
-   int      status;
-
-   port = BLASTER_Config.Address + BLASTER_WritePort;
-
-   status = BLASTER_Error;
-
-   count = 0xFFFF;
-
-   do
-      {
-      if ( ( inp( port ) & 0x80 ) == 0 )
-         {
-         outp( port, data );
-         status = BLASTER_Ok;
-         break;
-         }
-
-      count--;
-      }
-   while( count > 0 );
-
-   if ( status != BLASTER_Ok )
-      {
-      BLASTER_SetErrorCode( BLASTER_CardNotReady );
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ReadDSP
-
-   Reads a byte of data from the sound card's DSP.
----------------------------------------------------------------------*/
-
-int BLASTER_ReadDSP
-   (
-   void
-   )
-
-   {
-   int      port;
-   unsigned count;
-   int      status;
-
-   port = BLASTER_Config.Address + BLASTER_DataAvailablePort;
-
-   status = BLASTER_Error;
-
-   count = 0xFFFF;
-
-   do
-      {
-      if ( inp( port ) & 0x80 )
-         {
-         status = inp( BLASTER_Config.Address + BLASTER_ReadPort );
-         break;
-         }
-
-      count--;
-      }
-   while( count > 0 );
-
-   if ( status == BLASTER_Error )
-      {
-      BLASTER_SetErrorCode( BLASTER_CardNotReady );
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ResetDSP
-
-   Sends a reset command to the sound card's Digital Signal Processor
-   (DSP), causing it to perform an initialization.
----------------------------------------------------------------------*/
-
-int BLASTER_ResetDSP
-   (
-   void
-   )
-
-   {
-   volatile int count;
-   int port;
-   int status;
-
-   port = BLASTER_Config.Address + BLASTER_ResetPort;
-
-   status = BLASTER_CardNotReady;
-
-   outp( port, 1 );
-
-/* What the hell am I doing here?
-   count = 100;
-
-   do
-      {
-      if ( inp( port ) == 255 )
-         {
-         break;
-         }
-
-      count--;
-      }
-   while( count > 0 );
-*/
-
-   count = 0x100;
-   do
-      {
-      count--;
-      }
-   while( count > 0 );
-
-   outp( port, 0 );
-
-   count = 100;
-
-   do
-      {
-      if ( BLASTER_ReadDSP() == BLASTER_Ready )
-         {
-         status = BLASTER_Ok;
-         break;
-         }
-
-      count--;
-      }
-   while( count > 0 );
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetDSPVersion
-
-   Returns the version number of the sound card's DSP.
----------------------------------------------------------------------*/
-
-int BLASTER_GetDSPVersion
-   (
-   void
-   )
-
-   {
-   int MajorVersion;
-   int MinorVersion;
-   int version;
-
-   BLASTER_WriteDSP( DSP_GetVersion );
-
-   MajorVersion   = BLASTER_ReadDSP();
-   MinorVersion   = BLASTER_ReadDSP();
-
-   if ( ( MajorVersion == BLASTER_Error ) ||
-      ( MinorVersion == BLASTER_Error ) )
-      {
-      BLASTER_SetErrorCode( BLASTER_CardNotReady );
-      return( BLASTER_Error );
-      }
-
-   version = ( MajorVersion << 8 ) + MinorVersion;
-
-   if ( version >= DSP_Version4xx )
-      {
-      BLASTER_Card.IsSupported     = TRUE;
-      BLASTER_Card.HasMixer        = YES;
-      BLASTER_Card.MaxMixMode      = STEREO_16BIT;
-      BLASTER_Card.MinSamplingRate = 5000;
-      BLASTER_Card.MaxSamplingRate = 44100;
-      BLASTER_MixerType = SB16;
-      }
-   else if ( version >= DSP_Version3xx )
-      {
-      BLASTER_Card.IsSupported     = TRUE;
-      BLASTER_Card.HasMixer        = YES;
-      BLASTER_Card.MaxMixMode      = STEREO_8BIT;
-      BLASTER_Card.MinSamplingRate = 4000;
-      BLASTER_Card.MaxSamplingRate = 44100;
-      BLASTER_MixerType = SBPro;
-      }
-   else if ( version >= DSP_Version2xx )
-      {
-      BLASTER_Card.IsSupported     = TRUE;
-      BLASTER_Card.HasMixer        = NO;
-      BLASTER_Card.MaxMixMode      = MONO_8BIT;
-      BLASTER_Card.MinSamplingRate = 4000;
-      BLASTER_Card.MaxSamplingRate = 23000;
-      BLASTER_MixerType = 0;
-      }
-   else
-      {
-      // DSP_Version1xx
-      BLASTER_Card.IsSupported     = TRUE;
-      BLASTER_Card.HasMixer        = NO;
-      BLASTER_Card.MaxMixMode      = MONO_8BIT;
-      BLASTER_Card.MinSamplingRate = 4000;
-      BLASTER_Card.MaxSamplingRate = 23000;
-      BLASTER_MixerType = 0;
-      }
-
-   return( version );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SpeakerOn
-
-   Enables output from the DAC.
----------------------------------------------------------------------*/
-
-void BLASTER_SpeakerOn
-   (
-   void
-   )
-
-   {
-   BLASTER_WriteDSP( DSP_SpeakerOn );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SpeakerOff
-
-   Disables output from the DAC.
----------------------------------------------------------------------*/
-
-void BLASTER_SpeakerOff
-   (
-   void
-   )
-
-   {
-   BLASTER_WriteDSP( DSP_SpeakerOff );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetPlaybackRate
-
-   Sets the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-void BLASTER_SetPlaybackRate
-   (
-   unsigned rate
-   )
-
-   {
-   int LoByte;
-   int HiByte;
-
-   if ( BLASTER_Version < DSP_Version4xx )
-      {
-      int  timeconstant;
-      long ActualRate;
-
-      // Send sampling rate as time constant for older Sound
-      // Blaster compatible cards.
-
-      ActualRate = rate * BLASTER_SamplePacketSize;
-      if ( ActualRate < BLASTER_Card.MinSamplingRate )
-         {
-         rate = BLASTER_Card.MinSamplingRate / BLASTER_SamplePacketSize;
-         }
-
-      if ( ActualRate > BLASTER_Card.MaxSamplingRate )
-         {
-         rate = BLASTER_Card.MaxSamplingRate / BLASTER_SamplePacketSize;
-         }
-
-      timeconstant = ( int )CalcTimeConstant( rate, BLASTER_SamplePacketSize );
-
-      // Keep track of what the actual rate is
-      BLASTER_SampleRate  = ( unsigned )CalcSamplingRate( timeconstant );
-      BLASTER_SampleRate /= BLASTER_SamplePacketSize;
-
-      BLASTER_WriteDSP( DSP_SetTimeConstant );
-      BLASTER_WriteDSP( timeconstant );
-      }
-   else
-      {
-      // Send literal sampling rate for cards with DSP version
-      // 4.xx (Sound Blaster 16)
-
-      BLASTER_SampleRate = rate;
-
-      if ( BLASTER_SampleRate < BLASTER_Card.MinSamplingRate )
-         {
-         BLASTER_SampleRate = BLASTER_Card.MinSamplingRate;
-         }
-
-      if ( BLASTER_SampleRate > BLASTER_Card.MaxSamplingRate )
-         {
-         BLASTER_SampleRate = BLASTER_Card.MaxSamplingRate;
-         }
-
-      HiByte = hibyte( BLASTER_SampleRate );
-      LoByte = lobyte( BLASTER_SampleRate );
-
-      // Set playback rate
-      BLASTER_WriteDSP( DSP_Set_DA_Rate );
-      BLASTER_WriteDSP( HiByte );
-      BLASTER_WriteDSP( LoByte );
-
-      // Set recording rate
-      BLASTER_WriteDSP( DSP_Set_AD_Rate );
-      BLASTER_WriteDSP( HiByte );
-      BLASTER_WriteDSP( LoByte );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetPlaybackRate
-
-   Returns the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-unsigned BLASTER_GetPlaybackRate
-   (
-   void
-   )
-
-   {
-   return( BLASTER_SampleRate );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetMixMode
-
-   Sets the sound card to play samples in mono or stereo.
----------------------------------------------------------------------*/
-
-int BLASTER_SetMixMode
-   (
-   int mode
-   )
-
-   {
-   int   port;
-   int   data;
-   int   CardType;
-
-   CardType = BLASTER_Config.Type;
-
-   mode &= BLASTER_MaxMixMode;
-
-   if ( !( BLASTER_Card.MaxMixMode & STEREO ) )
-      {
-      mode &= ~STEREO;
-      }
-
-   if ( !( BLASTER_Card.MaxMixMode & SIXTEEN_BIT ) )
-      {
-      mode &= ~SIXTEEN_BIT;
-      }
-
-   BLASTER_MixMode = mode;
-   BLASTER_SamplePacketSize = BLASTER_SampleSize[ mode ];
-
-   // For the Sound Blaster Pro, we have to set the mixer chip
-   // to play mono or stereo samples.
-
-   if ( ( CardType == SBPro ) || ( CardType == SBPro2 ) )
-      {
-      port = BLASTER_Config.Address + BLASTER_MixerAddressPort;
-      outp( port, MIXER_SBProOutputSetting );
-
-      port = BLASTER_Config.Address + BLASTER_MixerDataPort;
-
-      // Get current mode
-      data = inp( port );
-
-      // set stereo mode bit
-      if ( mode & STEREO )
-         {
-         data |= MIXER_SBProStereoFlag;
-         }
-      else
-         {
-         data &= ~MIXER_SBProStereoFlag;
-         }
-
-      // set the mode
-      outp( port, data );
-
-      BLASTER_SetPlaybackRate( BLASTER_SampleRate );
-      }
-
-   return( mode );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_StopPlayback
-
-   Ends the DMA transfer of digitized sound to the sound card.
----------------------------------------------------------------------*/
-
-void BLASTER_StopPlayback
-   (
-   void
-   )
-
-   {
-   int DmaChannel;
-
-   // Don't allow anymore interrupts
-   BLASTER_DisableInterrupt();
-
-   if ( BLASTER_HaltTransferCommand == DSP_Reset )
-      {
-      BLASTER_ResetDSP();
-      }
-   else
-      {
-      BLASTER_WriteDSP( BLASTER_HaltTransferCommand );
-      }
-
-   // Disable the DMA channel
-   if ( BLASTER_MixMode & SIXTEEN_BIT )
-      {
-      DmaChannel = BLASTER_Config.Dma16;
-      }
-   else
-      {
-      DmaChannel = BLASTER_Config.Dma8;
-      }
-   DMA_EndTransfer( DmaChannel );
-
-   // Turn off speaker
-   BLASTER_SpeakerOff();
-
-   BLASTER_SoundPlaying = FALSE;
-   BLASTER_SoundRecording = FALSE;
-
-   BLASTER_DMABuffer = NULL;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetupDMABuffer
-
-   Programs the DMAC for sound transfer.
----------------------------------------------------------------------*/
-
-int BLASTER_SetupDMABuffer
-   (
-   char *BufferPtr,
-   int   BufferSize,
-   int   mode
-   )
-
-   {
-   int DmaChannel;
-   int DmaStatus;
-   int errorcode;
-
-   if ( BLASTER_MixMode & SIXTEEN_BIT )
-      {
-      DmaChannel = BLASTER_Config.Dma16;
-      errorcode  = BLASTER_DMA16NotSet;
-      }
-   else
-      {
-      DmaChannel = BLASTER_Config.Dma8;
-      errorcode  = BLASTER_DMANotSet;
-      }
-
-   if ( DmaChannel == UNDEFINED )
-      {
-      BLASTER_SetErrorCode( errorcode );
-      return( BLASTER_Error );
-      }
-
-   DmaStatus = DMA_SetupTransfer( DmaChannel, BufferPtr, BufferSize, mode );
-   if ( DmaStatus == DMA_Error )
-      {
-      BLASTER_SetErrorCode( BLASTER_DmaError );
-      return( BLASTER_Error );
-      }
-
-   BLASTER_DMAChannel = DmaChannel;
-
-   BLASTER_DMABuffer          = BufferPtr;
-   BLASTER_CurrentDMABuffer   = BufferPtr;
-   BLASTER_TotalDMABufferSize = BufferSize;
-   BLASTER_DMABufferEnd       = BufferPtr + BufferSize;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetCurrentPos
-
-   Returns the offset within the current sound being played.
----------------------------------------------------------------------*/
-
-int BLASTER_GetCurrentPos
-   (
-   void
-   )
-
-   {
-   char *CurrentAddr;
-   int   DmaChannel;
-   int   offset;
-
-   if ( !BLASTER_SoundPlaying )
-      {
-      BLASTER_SetErrorCode( BLASTER_NoSoundPlaying );
-      return( BLASTER_Error );
-      }
-
-   if ( BLASTER_MixMode & SIXTEEN_BIT )
-      {
-      DmaChannel = BLASTER_Config.Dma16;
-      }
-   else
-      {
-      DmaChannel = BLASTER_Config.Dma8;
-      }
-
-   if ( DmaChannel == UNDEFINED )
-      {
-      BLASTER_SetErrorCode( BLASTER_DMANotSet );
-      return( BLASTER_Error );
-      }
-
-   CurrentAddr = DMA_GetCurrentPos( DmaChannel );
-
-   offset = ( int )( ( ( unsigned long )CurrentAddr ) -
-      ( ( unsigned long )BLASTER_CurrentDMABuffer ) );
-
-   if ( BLASTER_MixMode & SIXTEEN_BIT )
-      {
-      offset >>= 1;
-      }
-
-   if ( BLASTER_MixMode & STEREO )
-      {
-      offset >>= 1;
-      }
-
-   return( offset );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP1xx_BeginPlayback
-
-   Starts playback of digitized sound on cards compatible with DSP
-   version 1.xx.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP1xx_BeginPlayback
-   (
-   int length
-   )
-
-   {
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   SampleLength = length - 1;
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   // Program DSP to play sound
-   BLASTER_WriteDSP( DSP_Old8BitDAC );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-
-   BLASTER_SoundPlaying = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP2xx_BeginPlayback
-
-   Starts playback of digitized sound on cards compatible with DSP
-   version 2.xx.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP2xx_BeginPlayback
-   (
-   int length
-   )
-
-   {
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   SampleLength = length - 1;
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   BLASTER_WriteDSP( DSP_SetBlockLength );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   if ( ( BLASTER_Version >= DSP_Version201 ) && ( DSP_MaxNormalRate <
-      ( BLASTER_SampleRate * BLASTER_SamplePacketSize ) ) )
-      {
-      BLASTER_WriteDSP( DSP_8BitHighSpeedAutoInitMode );
-      BLASTER_HaltTransferCommand = DSP_Reset;
-      }
-   else
-      {
-      BLASTER_WriteDSP( DSP_8BitAutoInitMode );
-      BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-      }
-
-   BLASTER_SoundPlaying = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP4xx_BeginPlayback
-
-   Starts playback of digitized sound on cards compatible with DSP
-   version 4.xx, such as the Sound Blaster 16.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP4xx_BeginPlayback
-   (
-   int length
-   )
-
-   {
-   int TransferCommand;
-   int TransferMode;
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   if ( BLASTER_MixMode & SIXTEEN_BIT )
-      {
-      TransferCommand = DSP_16BitDAC;
-      SampleLength = ( length / 2 ) - 1;
-      BLASTER_HaltTransferCommand = DSP_Halt16bitTransfer;
-      if ( BLASTER_MixMode & STEREO )
-         {
-         TransferMode = DSP_SignedStereoData;
-         }
-      else
-         {
-         TransferMode = DSP_SignedMonoData;
-         }
-      }
-   else
-      {
-      TransferCommand = DSP_8BitDAC;
-      SampleLength = length - 1;
-      BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-      if ( BLASTER_MixMode & STEREO )
-         {
-         TransferMode = DSP_UnsignedStereoData;
-         }
-      else
-         {
-         TransferMode = DSP_UnsignedMonoData;
-         }
-      }
-
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   // Program DSP to play sound
-   BLASTER_WriteDSP( TransferCommand );
-   BLASTER_WriteDSP( TransferMode );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   BLASTER_SoundPlaying = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_BeginBufferedPlayback
-
-   Begins multibuffered playback of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-int BLASTER_BeginBufferedPlayback
-   (
-   char    *BufferStart,
-   int      BufferSize,
-   int      NumDivisions,
-   unsigned SampleRate,
-   int      MixMode,
-   void  ( *CallBackFunc )( void )
-   )
-
-   {
-   int DmaStatus;
-   int TransferLength;
-
-//JIM
-//   if ( BLASTER_SoundPlaying || BLASTER_SoundRecording )
-      {
-      BLASTER_StopPlayback();
-      }
-
-   BLASTER_SetMixMode( MixMode );
-
-   DmaStatus = BLASTER_SetupDMABuffer( BufferStart, BufferSize, DMA_AutoInitRead );
-   if ( DmaStatus == BLASTER_Error )
-      {
-      return( BLASTER_Error );
-      }
-
-   BLASTER_SetPlaybackRate( SampleRate );
-
-   BLASTER_SetCallBack( CallBackFunc );
-
-   BLASTER_EnableInterrupt();
-
-   // Turn on speaker
-   BLASTER_SpeakerOn();
-
-   TransferLength = BufferSize / NumDivisions;
-   BLASTER_TransferLength = TransferLength;
-
-   //  Program the sound card to start the transfer.
-   if ( BLASTER_Version < DSP_Version2xx )
-      {
-      BLASTER_DSP1xx_BeginPlayback( TransferLength );
-      }
-   else if ( BLASTER_Version < DSP_Version4xx )
-      {
-      BLASTER_DSP2xx_BeginPlayback( TransferLength );
-      }
-   else
-      {
-      BLASTER_DSP4xx_BeginPlayback( TransferLength );
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP4xx_BeginRecord
-
-   Starts recording of digitized sound on cards compatible with DSP
-   version 4.xx, such as the Sound Blaster 16.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP4xx_BeginRecord
-   (
-   int length
-   )
-
-   {
-   int TransferCommand;
-   int TransferMode;
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   TransferCommand = DSP_8BitADC;
-   SampleLength = length - 1;
-   BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-
-   TransferMode = DSP_UnsignedMonoData;
-
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   // Program DSP to play sound
-   BLASTER_WriteDSP( TransferCommand );
-   BLASTER_WriteDSP( TransferMode );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   BLASTER_SoundRecording = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP2xx_BeginRecord
-
-   Starts recording of digitized sound on cards compatible with DSP
-   version 2.xx.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP2xx_BeginRecord
-   (
-   int length
-   )
-
-   {
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   SampleLength = length - 1;
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   BLASTER_WriteDSP( DSP_SetBlockLength );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   if ( ( BLASTER_Version >= DSP_Version201 ) && ( DSP_MaxNormalRate <
-      ( BLASTER_SampleRate * BLASTER_SamplePacketSize ) ) )
-      {
-      BLASTER_WriteDSP( DSP_8BitHighSpeedAutoInitRecord );
-      BLASTER_HaltTransferCommand = DSP_Reset;
-      }
-   else
-      {
-      BLASTER_WriteDSP( DSP_8BitAutoInitRecord );
-      BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-      }
-
-   BLASTER_SoundRecording = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_DSP1xx_BeginRecord
-
-   Starts recording of digitized sound on cards compatible with DSP
-   version 1.xx.
----------------------------------------------------------------------*/
-
-int BLASTER_DSP1xx_BeginRecord
-   (
-   int length
-   )
-
-   {
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   SampleLength = length - 1;
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-
-   // Program DSP to play sound
-   BLASTER_WriteDSP( DSP_Old8BitADC );
-   BLASTER_WriteDSP( LoByte );
-   BLASTER_WriteDSP( HiByte );
-
-   BLASTER_HaltTransferCommand = DSP_Halt8bitTransfer;
-
-   BLASTER_SoundRecording = TRUE;
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_BeginBufferedRecord
-
-   Begins multibuffered recording of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-int BLASTER_BeginBufferedRecord
-   (
-   char    *BufferStart,
-   int      BufferSize,
-   int      NumDivisions,
-   unsigned SampleRate,
-   int      MixMode,
-   void  ( *CallBackFunc )( void )
-   )
-
-   {
-   int DmaStatus;
-   int TransferLength;
-
-//JIM
-//   if ( BLASTER_SoundPlaying || BLASTER_SoundRecording )
-      {
-      BLASTER_StopPlayback();
-      }
-
-   BLASTER_SetMixMode( MixMode );
-
-   DmaStatus = BLASTER_SetupDMABuffer( BufferStart, BufferSize, DMA_AutoInitWrite );
-   if ( DmaStatus == BLASTER_Error )
-      {
-      return( BLASTER_Error );
-      }
-
-   BLASTER_SetPlaybackRate( SampleRate );
-
-   BLASTER_SetCallBack( CallBackFunc );
-
-   BLASTER_EnableInterrupt();
-
-   // Turn off speaker
-   BLASTER_SpeakerOff();
-
-   TransferLength = BufferSize / NumDivisions;
-   BLASTER_TransferLength = TransferLength;
-
-   //  Program the sound card to start the transfer.
-   if ( BLASTER_Version < DSP_Version2xx )
-      {
-      BLASTER_DSP1xx_BeginRecord( TransferLength );
-      }
-   else if ( BLASTER_Version < DSP_Version4xx )
-      {
-      BLASTER_DSP2xx_BeginRecord( TransferLength );
-      }
-   else
-      {
-      BLASTER_DSP4xx_BeginRecord( TransferLength );
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_WriteMixer
-
-   Writes a byte of data to the Sound Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-void BLASTER_WriteMixer
-   (
-   int reg,
-   int data
-   )
-
-   {
-   outp( BLASTER_MixerAddress + BLASTER_MixerAddressPort, reg );
-   outp( BLASTER_MixerAddress + BLASTER_MixerDataPort, data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ReadMixer
-
-   Reads a byte of data from the Sound Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-int BLASTER_ReadMixer
-   (
-   int reg
-   )
-
-   {
-   int data;
-
-   outp( BLASTER_MixerAddress + BLASTER_MixerAddressPort, reg );
-   data = inp( BLASTER_MixerAddress + BLASTER_MixerDataPort );
-   return( data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetVoiceVolume
-
-   Reads the average volume of the digitized sound channel from the
-   Sound Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-int BLASTER_GetVoiceVolume
-   (
-   void
-   )
-
-   {
-   int volume;
-   int left;
-   int right;
-
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         left   = BLASTER_ReadMixer( MIXER_SBProVoice );
-         right  = ( left & 0x0f ) << 4;
-         left  &= 0xf0;
-         volume = ( left + right ) / 2;
-         break;
-
-      case SB16 :
-         left  = BLASTER_ReadMixer( MIXER_SB16VoiceLeft );
-         right = BLASTER_ReadMixer( MIXER_SB16VoiceRight );
-         volume = ( left + right ) / 2;
-         break;
-
-      default :
-         BLASTER_SetErrorCode( BLASTER_NoMixer );
-         volume = BLASTER_Error;
-      }
-
-   return( volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetVoiceVolume
-
-   Sets the volume of the digitized sound channel on the Sound
-   Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-int BLASTER_SetVoiceVolume
-   (
-   int volume
-   )
-
-   {
-   int data;
-   int status;
-
-   volume = min( 255, volume );
-   volume = max( 0, volume );
-
-   status = BLASTER_Ok;
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         data = ( volume & 0xf0 ) + ( volume >> 4 );
-         BLASTER_WriteMixer( MIXER_SBProVoice, data );
-         break;
-
-      case SB16 :
-         BLASTER_WriteMixer( MIXER_SB16VoiceLeft, volume & 0xf8 );
-         BLASTER_WriteMixer( MIXER_SB16VoiceRight, volume & 0xf8 );
-         break;
-
-      default :
-         BLASTER_SetErrorCode( BLASTER_NoMixer );
-         status = BLASTER_Error;
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetMidiVolume
-
-   Reads the average volume of the Midi sound channel from the
-   Sound Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-int BLASTER_GetMidiVolume
-   (
-   void
-   )
-
-   {
-   int volume;
-   int left;
-   int right;
-
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         left   = BLASTER_ReadMixer( MIXER_SBProMidi );
-         right  = ( left & 0x0f ) << 4;
-         left  &= 0xf0;
-         volume = ( left + right ) / 2;
-         break;
-
-      case SB16 :
-         left  = BLASTER_ReadMixer( MIXER_SB16MidiLeft );
-         right = BLASTER_ReadMixer( MIXER_SB16MidiRight );
-         volume = ( left + right ) / 2;
-         break;
-
-      default :
-         BLASTER_SetErrorCode( BLASTER_NoMixer );
-         volume = BLASTER_Error;
-      }
-
-   return( volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetMidiVolume
-
-   Sets the volume of the Midi sound channel on the Sound
-   Blaster's mixer chip.
----------------------------------------------------------------------*/
-
-int BLASTER_SetMidiVolume
-   (
-   int volume
-   )
-
-   {
-   int data;
-   int status;
-
-   volume = min( 255, volume );
-   volume = max( 0, volume );
-
-   status = BLASTER_Ok;
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         data = ( volume & 0xf0 ) + ( volume >> 4 );
-         BLASTER_WriteMixer( MIXER_SBProMidi, data );
-         break;
-
-      case SB16 :
-         BLASTER_WriteMixer( MIXER_SB16MidiLeft, volume & 0xf8 );
-         BLASTER_WriteMixer( MIXER_SB16MidiRight, volume & 0xf8 );
-         break;
-
-      default :
-         BLASTER_SetErrorCode( BLASTER_NoMixer );
-         status = BLASTER_Error;
-      }
-
-   return( status );
-   }
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_CardHasMixer
-
-   Checks if the selected Sound Blaster card has a mixer.
----------------------------------------------------------------------*/
-
-int BLASTER_CardHasMixer
-   (
-   void
-   )
-
-   {
-   return( BLASTER_Card.HasMixer );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SaveVoiceVolume
-
-   Saves the user's voice mixer settings.
----------------------------------------------------------------------*/
-
-void BLASTER_SaveVoiceVolume
-   (
-   void
-   )
-
-   {
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         BLASTER_OriginalVoiceVolumeLeft =
-            BLASTER_ReadMixer( MIXER_SBProVoice );
-         break;
-
-      case SB16 :
-         BLASTER_OriginalVoiceVolumeLeft =
-            BLASTER_ReadMixer( MIXER_SB16VoiceLeft );
-         BLASTER_OriginalVoiceVolumeRight =
-            BLASTER_ReadMixer( MIXER_SB16VoiceRight );
-         break;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_RestoreVoiceVolume
-
-   Restores the user's voice mixer settings.
----------------------------------------------------------------------*/
-
-void BLASTER_RestoreVoiceVolume
-   (
-   void
-   )
-
-   {
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         BLASTER_WriteMixer( MIXER_SBProVoice,
-            BLASTER_OriginalVoiceVolumeLeft );
-         break;
-
-      case SB16 :
-         BLASTER_WriteMixer( MIXER_SB16VoiceLeft,
-            BLASTER_OriginalVoiceVolumeLeft );
-         BLASTER_WriteMixer( MIXER_SB16VoiceRight,
-            BLASTER_OriginalVoiceVolumeRight );
-         break;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SaveMidiVolume
-
-   Saves the user's FM mixer settings.
----------------------------------------------------------------------*/
-
-void BLASTER_SaveMidiVolume
-   (
-   void
-   )
-
-   {
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         BLASTER_OriginalMidiVolumeLeft =
-            BLASTER_ReadMixer( MIXER_SBProMidi );
-         break;
-
-      case SB16 :
-         BLASTER_OriginalMidiVolumeLeft =
-            BLASTER_ReadMixer( MIXER_SB16MidiLeft );
-         BLASTER_OriginalMidiVolumeRight =
-            BLASTER_ReadMixer( MIXER_SB16MidiRight );
-         break;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_RestoreMidiVolume
-
-   Restores the user's FM mixer settings.
----------------------------------------------------------------------*/
-
-void BLASTER_RestoreMidiVolume
-   (
-   void
-   )
-
-   {
-   switch( BLASTER_MixerType )
-      {
-      case SBPro :
-      case SBPro2 :
-         BLASTER_WriteMixer( MIXER_SBProMidi,
-            BLASTER_OriginalMidiVolumeLeft );
-         break;
-
-      case SB16 :
-         BLASTER_WriteMixer( MIXER_SB16MidiLeft,
-            BLASTER_OriginalMidiVolumeLeft );
-         BLASTER_WriteMixer( MIXER_SB16MidiRight,
-            BLASTER_OriginalMidiVolumeRight );
-         break;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetEnv
-
-   Retrieves the BLASTER environment settings and returns them to
-   the caller.
----------------------------------------------------------------------*/
-
-int BLASTER_GetEnv
-   (
-   BLASTER_CONFIG *Config
-   )
-
-   {
-   char *Blaster;
-   char parameter;
-
-   Config->Address   = UNDEFINED;
-   Config->Type      = UNDEFINED;
-   Config->Interrupt = UNDEFINED;
-   Config->Dma8      = UNDEFINED;
-   Config->Dma16     = UNDEFINED;
-   Config->Midi      = UNDEFINED;
-   Config->Emu       = UNDEFINED;
-
-   Blaster = getenv( "BLASTER" );
-   if ( Blaster == NULL )
-      {
-      BLASTER_SetErrorCode( BLASTER_EnvNotFound );
-      return( BLASTER_Error );
-      }
-
-   while( *Blaster != 0 )
-      {
-      if ( *Blaster == ' ' )
-         {
-         Blaster++;
-         continue;
-         }
-
-      parameter = toupper( *Blaster );
-      Blaster++;
-
-      if ( !isxdigit( *Blaster ) )
-         {
-         BLASTER_SetErrorCode( BLASTER_InvalidParameter );
-         return( BLASTER_Error );
-         }
-
-      switch( parameter )
-         {
-         case BlasterEnv_Address :
-            sscanf( Blaster, "%x", &Config->Address );
-            break;
-         case BlasterEnv_Interrupt :
-            sscanf( Blaster, "%d", &Config->Interrupt );
-            break;
-         case BlasterEnv_8bitDma :
-            sscanf( Blaster, "%d", &Config->Dma8 );
-            break;
-         case BlasterEnv_Type :
-            sscanf( Blaster, "%d", &Config->Type );
-            break;
-         case BlasterEnv_16bitDma :
-            sscanf( Blaster, "%d", &Config->Dma16 );
-            break;
-         case BlasterEnv_Midi :
-            sscanf( Blaster, "%x", &Config->Midi );
-            break;
-         case BlasterEnv_EmuAddress :
-            sscanf( Blaster, "%x", &Config->Emu );
-            break;
-         default  :
-            // Skip the offending data
-            // sscanf( Blaster, "%*s" );
-            break;
-         }
-
-      while( isxdigit( *Blaster ) )
-         {
-         Blaster++;
-         }
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetCardSettings
-
-   Sets up the sound card's parameters.
----------------------------------------------------------------------*/
-
-int BLASTER_SetCardSettings
-   (
-   BLASTER_CONFIG Config
-   )
-
-   {
-   if ( BLASTER_Installed )
-      {
-      BLASTER_Shutdown();
-      }
-
-   BLASTER_Config.Address   = Config.Address;
-   BLASTER_Config.Type      = Config.Type;
-   BLASTER_Config.Interrupt = Config.Interrupt;
-   BLASTER_Config.Dma8      = Config.Dma8;
-   BLASTER_Config.Dma16     = Config.Dma16;
-   BLASTER_Config.Midi      = Config.Midi;
-   BLASTER_Config.Emu       = Config.Emu;
-   BLASTER_MixerAddress     = Config.Address;
-   BLASTER_MixerType        = Config.Type;
-
-   if ( BLASTER_Config.Emu == UNDEFINED )
-      {
-      BLASTER_Config.Emu = BLASTER_Config.Address + 0x400;
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetCardSettings
-
-   Sets up the sound card's parameters.
----------------------------------------------------------------------*/
-
-int BLASTER_GetCardSettings
-   (
-   BLASTER_CONFIG *Config
-   )
-
-   {
-   if ( BLASTER_Config.Address == UNDEFINED )
-      {
-      return( BLASTER_Warning );
-      }
-   else
-      {
-      Config->Address   = BLASTER_Config.Address;
-      Config->Type      = BLASTER_Config.Type;
-      Config->Interrupt = BLASTER_Config.Interrupt;
-      Config->Dma8      = BLASTER_Config.Dma8;
-      Config->Dma16     = BLASTER_Config.Dma16;
-      Config->Midi      = BLASTER_Config.Midi;
-      Config->Emu       = BLASTER_Config.Emu;
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_GetCardInfo
-
-   Returns the maximum number of bits that can represent a sample
-   (8 or 16) and the number of channels (1 for mono, 2 for stereo).
----------------------------------------------------------------------*/
-
-int BLASTER_GetCardInfo
-   (
-   int *MaxSampleBits,
-   int *MaxChannels
-   )
-
-   {
-   if ( BLASTER_Card.MaxMixMode & STEREO )
-      {
-      *MaxChannels = 2;
-      }
-   else
-      {
-      *MaxChannels = 1;
-      }
-
-   if ( BLASTER_Card.MaxMixMode & SIXTEEN_BIT )
-      {
-      *MaxSampleBits = 16;
-      }
-   else
-      {
-      *MaxSampleBits = 8;
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetCallBack
-
-   Specifies the user function to call at the end of a sound transfer.
----------------------------------------------------------------------*/
-
-void BLASTER_SetCallBack
-   (
-   void ( *func )( void )
-   )
-
-   {
-   BLASTER_CallBack = func;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void BLASTER_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-void BLASTER_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( BLASTER_LockStart, BLASTER_LockEnd );
-   DPMI_UnlockMemory( ( void * )&BLASTER_Interrupts[ 0 ],
-      sizeof( BLASTER_Interrupts ) );
-   DPMI_UnlockMemory( ( void * )&BLASTER_SampleSize[ 0 ],
-      sizeof( BLASTER_SampleSize ) );
-   DPMI_Unlock( BLASTER_Card );
-   DPMI_Unlock( BLASTER_OldInt );
-   DPMI_Unlock( BLASTER_Config );
-   DPMI_Unlock( BLASTER_Installed );
-   DPMI_Unlock( BLASTER_Version );
-   DPMI_Unlock( BLASTER_DMABuffer );
-   DPMI_Unlock( BLASTER_DMABufferEnd );
-   DPMI_Unlock( BLASTER_CurrentDMABuffer );
-   DPMI_Unlock( BLASTER_TotalDMABufferSize );
-   DPMI_Unlock( BLASTER_TransferLength );
-   DPMI_Unlock( BLASTER_MixMode );
-   DPMI_Unlock( BLASTER_SamplePacketSize );
-   DPMI_Unlock( BLASTER_SampleRate );
-   DPMI_Unlock( BLASTER_HaltTransferCommand );
-   DPMI_Unlock( ( int )BLASTER_SoundPlaying );
-   DPMI_Unlock( ( int )BLASTER_SoundRecording );
-   DPMI_Unlock( BLASTER_CallBack );
-   DPMI_Unlock( BLASTER_IntController1Mask );
-   DPMI_Unlock( BLASTER_IntController2Mask );
-   DPMI_Unlock( BLASTER_MixerAddress );
-   DPMI_Unlock( BLASTER_MixerType );
-   DPMI_Unlock( BLASTER_OriginalMidiVolumeLeft );
-   DPMI_Unlock( BLASTER_OriginalMidiVolumeRight );
-   DPMI_Unlock( BLASTER_OriginalVoiceVolumeLeft );
-   DPMI_Unlock( BLASTER_OriginalVoiceVolumeRight );
-   DPMI_Unlock( GlobalStatus );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int BLASTER_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( BLASTER_LockStart, BLASTER_LockEnd );
-   status |= DPMI_LockMemory( ( void * )&BLASTER_Interrupts[ 0 ],
-      sizeof( BLASTER_Interrupts ) );
-   status |= DPMI_LockMemory( ( void * )&BLASTER_SampleSize[ 0 ],
-      sizeof( BLASTER_SampleSize ) );
-   status |= DPMI_Lock( BLASTER_Card );
-   status |= DPMI_Lock( BLASTER_OldInt );
-   status |= DPMI_Lock( BLASTER_Config );
-   status |= DPMI_Lock( BLASTER_Installed );
-   status |= DPMI_Lock( BLASTER_Version );
-   status |= DPMI_Lock( BLASTER_DMABuffer );
-   status |= DPMI_Lock( BLASTER_DMABufferEnd );
-   status |= DPMI_Lock( BLASTER_CurrentDMABuffer );
-   status |= DPMI_Lock( BLASTER_TotalDMABufferSize );
-   status |= DPMI_Lock( BLASTER_TransferLength );
-   status |= DPMI_Lock( BLASTER_MixMode );
-   status |= DPMI_Lock( BLASTER_SamplePacketSize );
-   status |= DPMI_Lock( BLASTER_SampleRate );
-   status |= DPMI_Lock( BLASTER_HaltTransferCommand );
-   status |= DPMI_Lock( ( ( int )BLASTER_SoundPlaying ) );
-   status |= DPMI_Lock( ( ( int )BLASTER_SoundRecording ) );
-   status |= DPMI_Lock( BLASTER_CallBack );
-   status |= DPMI_Lock( BLASTER_IntController1Mask );
-   status |= DPMI_Lock( BLASTER_IntController2Mask );
-   status |= DPMI_Lock( BLASTER_MixerAddress );
-   status |= DPMI_Lock( BLASTER_MixerType );
-   status |= DPMI_Lock( BLASTER_OriginalMidiVolumeLeft );
-   status |= DPMI_Lock( BLASTER_OriginalMidiVolumeRight );
-   status |= DPMI_Lock( BLASTER_OriginalVoiceVolumeLeft );
-   status |= DPMI_Lock( BLASTER_OriginalVoiceVolumeRight );
-   status |= DPMI_Lock( GlobalStatus );
-
-   if ( status != DPMI_Ok )
-      {
-      BLASTER_UnlockMemory();
-      BLASTER_SetErrorCode( BLASTER_DPMI_Error );
-      return( BLASTER_Error );
-      }
-
-   return( BLASTER_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: allocateTimerStack
-
-   Allocate a block of memory from conventional (low) memory and return
-   the selector (which can go directly into a segment register) of the
-   memory block or 0 if an error occured.
----------------------------------------------------------------------*/
-
-static unsigned short allocateTimerStack
-   (
-   unsigned short size
-   )
-
-   {
-   union REGS regs;
-
-   // clear all registers
-   memset( &regs, 0, sizeof( regs ) );
-
-   // DPMI allocate conventional memory
-   regs.w.ax = 0x100;
-
-   // size in paragraphs
-   regs.w.bx = ( size + 15 ) / 16;
-
-   int386( 0x31, &regs, &regs );
-   if (!regs.w.cflag)
-      {
-      // DPMI call returns selector in dx
-      // (ax contains real mode segment
-      // which is ignored here)
-
-      return( regs.w.dx );
-      }
-
-   // Couldn't allocate memory.
-   return( NULL );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: deallocateTimerStack
-
-   Deallocate a block of conventional (low) memory given a selector to
-   it.  Assumes the block was allocated with DPMI function 0x100.
----------------------------------------------------------------------*/
-
-static void deallocateTimerStack
-   (
-   unsigned short selector
-   )
-
-   {
-   union REGS regs;
-
-   if ( selector != NULL )
-      {
-      // clear all registers
-      memset( &regs, 0, sizeof( regs ) );
-
-      regs.w.ax = 0x101;
-      regs.w.dx = selector;
-      int386( 0x31, &regs, &regs );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_SetupWaveBlaster
-
-   Allows the WaveBlaster to play music while the Sound Blaster 16
-   plays digital sound.
----------------------------------------------------------------------*/
-
-void BLASTER_SetupWaveBlaster
-   (
-   void
-   )
-
-   {
-
-   if ( BLASTER_MixerType == SB16 )
-      {
-      // Disable MPU401 interrupts.  If they are not disabled,
-      // the SB16 will not produce sound or music.
-      BLASTER_WaveBlasterState = BLASTER_ReadMixer( MIXER_DSP4xxISR_Enable );
-      BLASTER_WriteMixer( MIXER_DSP4xxISR_Enable, MIXER_DisableMPU401Interrupts );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_ShutdownWaveBlaster
-
-   Restores WaveBlaster mixer to original state.
----------------------------------------------------------------------*/
-
-void BLASTER_ShutdownWaveBlaster
-   (
-   void
-   )
-
-   {
-   if ( BLASTER_MixerType == SB16 )
-      {
-      // Restore the state of MPU401 interrupts.  If they are not disabled,
-      // the SB16 will not produce sound or music.
-      BLASTER_WriteMixer( MIXER_DSP4xxISR_Enable, BLASTER_WaveBlasterState );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_Init
-
-   Initializes the sound card and prepares the module to play
-   digitized sounds.
----------------------------------------------------------------------*/
-
-int BLASTER_Init
-   (
-   void
-   )
-
-   {
-   int Irq;
-   int Interrupt;
-   int status;
-
-   if ( BLASTER_Installed )
-      {
-      BLASTER_Shutdown();
-      }
-
-   if ( BLASTER_Config.Address == UNDEFINED )
-      {
-      BLASTER_SetErrorCode( BLASTER_AddrNotSet );
-      return( BLASTER_Error );
-      }
-
-   // Save the interrupt masks
-   BLASTER_IntController1Mask = inp( 0x21 );
-   BLASTER_IntController2Mask = inp( 0xA1 );
-
-   status = BLASTER_ResetDSP();
-   if ( status == BLASTER_Ok )
-      {
-      BLASTER_SaveVoiceVolume();
-
-      BLASTER_SoundPlaying = FALSE;
-
-      BLASTER_SetCallBack( NULL );
-
-      BLASTER_DMABuffer = NULL;
-
-      BLASTER_Version = BLASTER_GetDSPVersion();
-
-      BLASTER_SetPlaybackRate( BLASTER_DefaultSampleRate );
-      BLASTER_SetMixMode( BLASTER_DefaultMixMode );
-
-      if ( BLASTER_Config.Dma16 != UNDEFINED )
-         {
-         status = DMA_VerifyChannel( BLASTER_Config.Dma16 );
-         if ( status == DMA_Error )
-            {
-            BLASTER_SetErrorCode( BLASTER_DmaError );
-            return( BLASTER_Error );
-            }
-         }
-
-      if ( BLASTER_Config.Dma8 != UNDEFINED )
-         {
-         status = DMA_VerifyChannel( BLASTER_Config.Dma8 );
-         if ( status == DMA_Error )
-            {
-            BLASTER_SetErrorCode( BLASTER_DmaError );
-            return( BLASTER_Error );
-            }
-         }
-
-      // Install our interrupt handler
-      Irq = BLASTER_Config.Interrupt;
-      if ( !VALID_IRQ( Irq ) )
-         {
-         BLASTER_SetErrorCode( BLASTER_InvalidIrq );
-         return( BLASTER_Error );
-         }
-
-      Interrupt = BLASTER_Interrupts[ Irq ];
-      if ( Interrupt == INVALID )
-         {
-         BLASTER_SetErrorCode( BLASTER_InvalidIrq );
-         return( BLASTER_Error );
-         }
-
-      status = BLASTER_LockMemory();
-      if ( status != BLASTER_Ok )
-         {
-         BLASTER_UnlockMemory();
-         return( status );
-         }
-
-      StackSelector = allocateTimerStack( kStackSize );
-      if ( StackSelector == NULL )
-         {
-         BLASTER_UnlockMemory();
-         BLASTER_SetErrorCode( BLASTER_OutOfMemory );
-         return( BLASTER_Error );
-         }
-
-      // Leave a little room at top of stack just for the hell of it...
-      StackPointer = kStackSize - sizeof( long );
-
-      BLASTER_OldInt = _dos_getvect( Interrupt );
-      if ( Irq < 8 )
-         {
-         _dos_setvect( Interrupt, BLASTER_ServiceInterrupt );
-         }
-      else
-         {
-         status = IRQ_SetVector( Interrupt, BLASTER_ServiceInterrupt );
-         if ( status != IRQ_Ok )
-            {
-            BLASTER_UnlockMemory();
-            deallocateTimerStack( StackSelector );
-            StackSelector = NULL;
-            BLASTER_SetErrorCode( BLASTER_UnableToSetIrq );
-            return( BLASTER_Error );
-            }
-         }
-
-      BLASTER_Installed = TRUE;
-      status = BLASTER_Ok;
-      }
-
-   BLASTER_SetErrorCode( status );
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: BLASTER_Shutdown
-
-   Ends transfer of sound data to the sound card and restores the
-   system resources used by the card.
----------------------------------------------------------------------*/
-
-void BLASTER_Shutdown
-   (
-   void
-   )
-
-   {
-   int Irq;
-   int Interrupt;
-
-   // Halt the DMA transfer
-   BLASTER_StopPlayback();
-
-   BLASTER_RestoreVoiceVolume();
-
-   // Reset the DSP
-   BLASTER_ResetDSP();
-
-   // Restore the original interrupt
-   Irq = BLASTER_Config.Interrupt;
-   Interrupt = BLASTER_Interrupts[ Irq ];
-   if ( Irq >= 8 )
-      {
-      IRQ_RestoreVector( Interrupt );
-      }
-   _dos_setvect( Interrupt, BLASTER_OldInt );
-
-   BLASTER_SoundPlaying = FALSE;
-
-   BLASTER_DMABuffer = NULL;
-
-   BLASTER_SetCallBack( NULL );
-
-   BLASTER_UnlockMemory();
-
-   deallocateTimerStack( StackSelector );
-   StackSelector = NULL;
-
-   BLASTER_Installed = FALSE;
-   }
--- a/src/audiolib/blaster.h
+++ /dev/null
@@ -1,146 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: BLASTER.H
-
-   author: James R. Dose
-   date:   February 4, 1994
-
-   Public header for BLASTER.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __BLASTER_H
-#define __BLASTER_H
-
-typedef struct
-   {
-   unsigned Address;
-   unsigned Type;
-   unsigned Interrupt;
-   unsigned Dma8;
-   unsigned Dma16;
-   unsigned Midi;
-   unsigned Emu;
-   } BLASTER_CONFIG;
-
-extern BLASTER_CONFIG BLASTER_Config;
-extern int BLASTER_DMAChannel;
-
-#define UNDEFINED -1
-
-enum BLASTER_ERRORS
-   {
-   BLASTER_Warning = -2,
-   BLASTER_Error = -1,
-   BLASTER_Ok = 0,
-   BLASTER_EnvNotFound,
-   BLASTER_AddrNotSet,
-   BLASTER_DMANotSet,
-   BLASTER_DMA16NotSet,
-   BLASTER_InvalidParameter,
-   BLASTER_CardNotReady,
-   BLASTER_NoSoundPlaying,
-   BLASTER_InvalidIrq,
-   BLASTER_UnableToSetIrq,
-   BLASTER_DmaError,
-   BLASTER_NoMixer,
-   BLASTER_DPMI_Error,
-   BLASTER_OutOfMemory
-   };
-
-enum BLASTER_Types
-   {
-   SB     = 1,
-   SBPro  = 2,
-   SB20   = 3,
-   SBPro2 = 4,
-   SB16   = 6
-   };
-
-#define BLASTER_MinCardType    SB
-#define BLASTER_MaxCardType    SB16
-
-#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 BLASTER_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 BLASTER_DefaultSampleRate 11000
-#define BLASTER_DefaultMixMode    MONO_8BIT
-#define BLASTER_MaxIrq            15
-
-char *BLASTER_ErrorString( int ErrorNumber );
-void  BLASTER_EnableInterrupt( void );
-void  BLASTER_DisableInterrupt( void );
-int   BLASTER_WriteDSP( unsigned data );
-int   BLASTER_ReadDSP( void );
-int   BLASTER_ResetDSP( void );
-int   BLASTER_GetDSPVersion( void );
-void  BLASTER_SpeakerOn( void );
-void  BLASTER_SpeakerOff( void );
-void  BLASTER_SetPlaybackRate( unsigned rate );
-unsigned BLASTER_GetPlaybackRate( void );
-int   BLASTER_SetMixMode( int mode );
-void  BLASTER_StopPlayback( void );
-int   BLASTER_SetupDMABuffer( char *BufferPtr, int BufferSize, int mode );
-int   BLASTER_GetCurrentPos( void );
-int   BLASTER_DSP1xx_BeginPlayback( int length );
-int   BLASTER_DSP2xx_BeginPlayback( int length );
-int   BLASTER_DSP4xx_BeginPlayback( int length );
-int   BLASTER_BeginBufferedRecord( char *BufferStart, int BufferSize,
-          int NumDivisions, unsigned SampleRate, int MixMode,
-          void ( *CallBackFunc )( void ) );
-int   BLASTER_BeginBufferedPlayback( char *BufferStart,
-         int BufferSize, int NumDivisions, unsigned SampleRate,
-         int MixMode, void ( *CallBackFunc )( void ) );
-void  BLASTER_WriteMixer( int reg, int data );
-int   BLASTER_ReadMixer( int reg );
-int   BLASTER_GetVoiceVolume( void );
-int   BLASTER_SetVoiceVolume( int volume );
-int   BLASTER_GetMidiVolume( void );
-int   BLASTER_SetMidiVolume( int volume );
-int   BLASTER_CardHasMixer( void );
-void  BLASTER_SaveVoiceVolume( void );
-void  BLASTER_RestoreVoiceVolume( void );
-void  BLASTER_SaveMidiVolume( void );
-void  BLASTER_RestoreMidiVolume( void );
-int   BLASTER_GetEnv( BLASTER_CONFIG *Config );
-int   BLASTER_SetCardSettings( BLASTER_CONFIG Config );
-int   BLASTER_GetCardSettings( BLASTER_CONFIG *Config );
-int   BLASTER_GetCardInfo( int *MaxSampleBits, int *MaxChannels );
-void  BLASTER_SetCallBack( void ( *func )( void ) );
-void  BLASTER_SetupWaveBlaster( void );
-void  BLASTER_ShutdownWaveBlaster( void );
-int   BLASTER_Init( void );
-void  BLASTER_Shutdown( void );
-void  BLASTER_UnlockMemory( void );
-int   BLASTER_LockMemory( void );
-
-#endif
--- a/src/audiolib/ctaweapi.h
+++ /dev/null
@@ -1,350 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/****************************************************************************\
-*                                                                            *
-* CTAWEAPI.H SB AWE32 DOS API header                                         *
-*                                                                            *
-* (C) Copyright Creative Technology Ltd. 1992-94. All rights reserved        *
-* worldwide.                                                                 *
-*                                                                            *
-* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY      *
-* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE        *
-* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR      *
-* PURPOSE.                                                                   *
-*                                                                            *
-* You have a royalty-free right to use, modify, reproduce and                *
-* distribute the Sample Files (and/or any modified version) in               *
-* any way you find useful, provided that you agree to                        *
-* the Creative's Software Licensing Aggreement and you also agree that       *
-* Creative has no warranty obligations or liability for any Sample Files.    *
-*                                                                            *
-\****************************************************************************/
-
-/****************************************************************************\
-*      File name       : CTAWEAPI.H                                          *
-*                                                                            *
-*      Programmer      : Creative SB AWE32 Team                              *
-*                        Creative Technology Ltd, 1994. All rights reserved. *
-*                                                                            *
-*      Version         : 2.0b                                                *
-*                                                                            *
-\****************************************************************************/
-
-#ifndef _CTAWEAPI
-#define _CTAWEAPI
-
-
-#define MAXBANKS            64      /* maximum number of banks */
-#define MAXNRPN             32      /* maximum number of NRPN */
-
-
-#if defined(__FLAT__) || defined(__HIGHC__) || defined(DOS386)
-#define PACKETSIZE      8192        /* packet size for 32bit libraries */
-#else
-#define PACKETSIZE      512         /* packet size for real mode libraries */
-#endif
-
-
-#if defined(__FLAT__)
-    #define NEAR
-    #define FAR
-#endif
-
-
-#if defined(__SC__)
-    #pragma pack(1)
-    #if defined(DOS386)
-        #define NEAR
-        #define FAR
-    #endif
-#endif
-
-
-#if defined(__WATCOMC__)
-    #pragma pack(1)
-#endif
-
-
-#if defined(__HIGHC__)
-    #define NEAR
-    #define FAR
-    #define PASCAL  _DCC((_DEFAULT_CALLING_CONVENTION|_CALLEE_POPS_STACK) & \
-                         ~ (_REVERSE_PARMS|_OVERLOADED))
-    #pragma Push_align_members(1)
-    #pragma Global_aliasing_convention("_%r")
-#endif
-
-
-typedef int                     BOOL;
-#define FALSE                   0
-#define TRUE                    1
-
-typedef unsigned char		BYTE;
-typedef unsigned short		WORD;
-typedef unsigned long		DWORD;
-
-typedef short int               SHORT;
-typedef unsigned int		UINT;
-typedef signed long 		LONG;
-
-#ifndef FAR
-#define FAR                     __far
-#endif
-
-#ifndef HUGE
-#define HUGE                    __huge
-#endif
-
-#ifndef PASCAL
-#define PASCAL                  __pascal
-#endif
-
-typedef void FAR*               LPVOID;
-typedef BYTE FAR*               LPBYTE;
-typedef WORD FAR*               LPWORD;
-typedef DWORD FAR*              LPDWORD;
-
-#define LOBYTE(w)               ((BYTE)(w))
-#define HIBYTE(w)               ((BYTE)(((UINT)(w) >> 8) & 0xFF))
-
-#define LOWORD(l)               ((WORD)(DWORD)(l))
-#define HIWORD(l)               ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-
-/* Start of modules */
-extern int* __midieng_code(void);
-extern int* __hardware_code(void);
-extern int* __sbkload_code(void);
-extern int* __nrpn_code(void);
-extern int __midivar_data;
-extern int __nrpnvar_data;
-extern int __embed_data;
-
-
-typedef char SCRATCH[702];
-typedef char SOUNDFONT[124];
-typedef char GCHANNEL[20];
-typedef char MIDICHANNEL[32];
-typedef char NRPNCHANNEL[96];
-
-typedef struct {
-    SHORT bank_no;          /* Slot number being used */
-    SHORT total_banks;      /* Total number of banks */
-    LONG FAR* banksizes;    /* Pointer to a list of bank sizes */
-    LONG file_size;         /* exact size of the sound font file */
-    char FAR* data;         /* Address of buffer of size >= PACKETSIZE */
-    char FAR* presets;      /* Allocated memory for preset data */
-
-    LONG total_patch_ram;   /* Total patch ram available */
-    SHORT no_sample_packets;/* Number of packets of sound sample to stream */
-    LONG sample_seek;       /* Start file location of sound sample */
-    LONG preset_seek;       /* Address of preset_seek location */
-    LONG preset_read_size;  /* Number of bytes from preset_seek to allocate and read */
-    LONG preset_size;       /* Preset actual size */
-} SOUND_PACKET;
-
-typedef struct {
-    SHORT tag;              /* Must be 0x100 or 0x101 */
-    SHORT preset_size;      /* Preset table of this size is required */
-    SHORT no_wave_packets;  /* Number of packets of Wave sample to stream. */
-    LONG reserved;
-
-    SHORT bank_no;          /* bank number */
-    char FAR* data;         /* Address of packet of size PACKETSIZE */
-    char FAR* presets;      /* Allocated memory for preset data */
-    LONG sample_size;       /* Sample size, i.e. number of samples */
-    LONG samples_per_sec;   /* Samples per second */
-    SHORT bits_per_sample;  /* Bits per sample, 8 or 16 */
-    SHORT no_channels;      /* Number of channels, 1=mono, 2=stereo */
-    SHORT looping;          /* Looping? 0=no, 1=yes */
-    LONG startloop;         /* if looping, then these are the addresses */
-    LONG endloop;
-    SHORT release;          /* release time, 0=24ms, 8191=23.78s */
-} WAVE_PACKET;
-
-typedef struct {
-    LPBYTE SPad1;
-    LPBYTE SPad2;
-    LPBYTE SPad3;
-    LPBYTE SPad4;
-    LPBYTE SPad5;
-    LPBYTE SPad6;
-    LPBYTE SPad7;
-} SOUNDPAD;
-
-/* AWE32 variables */
-extern WORD         awe32NumG;
-extern WORD         awe32BaseAddx;
-extern DWORD        awe32DramSize;
-
-/* MIDI variables */
-extern SCRATCH      awe32Scratch;
-extern SOUNDFONT    awe32SFont[4];
-extern GCHANNEL     awe32GChannel[32];
-extern MIDICHANNEL  awe32MIDIChannel[16];
-extern SOUNDPAD     awe32SoundPad;
-
-/* NRPN variables */
-extern NRPNCHANNEL  awe32NRPNChannel[16];
-
-/* SoundFont objects */
-extern BYTE awe32SPad1Obj[];
-extern BYTE awe32SPad2Obj[];
-extern BYTE awe32SPad3Obj[];
-extern BYTE awe32SPad4Obj[];
-extern BYTE awe32SPad5Obj[];
-extern BYTE awe32SPad6Obj[];
-extern BYTE awe32SPad7Obj[];
-
-/* AWE register functions */
-extern void PASCAL awe32RegW(WORD, WORD);
-extern WORD PASCAL awe32RegRW(WORD);
-extern void PASCAL awe32RegDW(WORD, DWORD);
-extern DWORD PASCAL awe32RegRDW(WORD);
-
-/* MIDI support functions */
-extern WORD PASCAL awe32InitMIDI(void);
-extern WORD PASCAL awe32NoteOn(WORD, WORD, WORD);
-extern WORD PASCAL awe32NoteOff(WORD, WORD, WORD);
-extern WORD PASCAL awe32ProgramChange(WORD, WORD);
-extern WORD PASCAL awe32Controller(WORD, WORD, WORD);
-extern WORD PASCAL awe32PolyKeyPressure(WORD, WORD, WORD);
-extern WORD PASCAL awe32ChannelPressure(WORD, WORD);
-extern WORD PASCAL awe32PitchBend(WORD, WORD, WORD);
-extern WORD PASCAL awe32Sysex(WORD, LPBYTE, WORD);
-extern WORD PASCAL __awe32NoteOff(WORD, WORD, WORD, WORD);
-extern WORD PASCAL __awe32IsPlaying(WORD, WORD, WORD, WORD);
-
-/* NRPN support functions */
-extern WORD PASCAL awe32InitNRPN(void);
-
-/* Hardware support functions */
-extern WORD PASCAL awe32Detect(WORD);
-extern WORD PASCAL awe32InitHardware(void);
-extern WORD PASCAL awe32Terminate(void);
-
-/* SoundFont support functions */
-extern WORD PASCAL awe32TotalPatchRam(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32DefineBankSizes(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32SFontLoadRequest(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32StreamSample(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32SetPresets(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32ReleaseBank(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32ReleaseAllBanks(SOUND_PACKET FAR*);
-extern WORD PASCAL awe32WPLoadRequest(WAVE_PACKET FAR*);
-extern WORD PASCAL awe32WPLoadWave(WAVE_PACKET FAR*);
-extern WORD PASCAL awe32WPStreamWave(WAVE_PACKET FAR*);
-extern WORD PASCAL awe32WPBuildSFont(WAVE_PACKET FAR*);
-
-/* End of modules */
-extern int* __midieng_ecode(void);
-extern int* __hardware_ecode(void);
-extern int* __sbkload_ecode(void);
-extern int* __nrpn_ecode(void);
-extern int __midivar_edata;
-extern int __nrpnvar_edata;
-extern int __embed_edata;
-
-
-#if defined(__cplusplus)
-}
-#endif
-
-
-#if defined(__SC__)
-    #pragma pack()
-#endif
-
-
-#if defined(__HIGHC__)
-    #pragma Pop_align_members
-    #pragma Global_aliasing_convention()
-    #pragma Alias(awe32RegW,"AWE32REGW")
-    #pragma Alias(awe32RegRW,"AWE32REGRW")
-    #pragma Alias(awe32RegDW,"AWE32REGDW")
-    #pragma Alias(awe32RegRDW,"AWE32REGRDW")
-    #pragma Alias(awe32InitMIDI,"AWE32INITMIDI")
-    #pragma Alias(awe32NoteOn,"AWE32NOTEON")
-    #pragma Alias(awe32NoteOff,"AWE32NOTEOFF")
-    #pragma Alias(awe32ProgramChange,"AWE32PROGRAMCHANGE")
-    #pragma Alias(awe32Controller,"AWE32CONTROLLER")
-    #pragma Alias(awe32PolyKeyPressure,"AWE32POLYKEYPRESSURE")
-    #pragma Alias(awe32ChannelPressure,"AWE32CHANNELPRESSURE")
-    #pragma Alias(awe32PitchBend,"AWE32PITCHBEND")
-    #pragma Alias(awe32Sysex,"AWE32SYSEX")
-    #pragma Alias(__awe32NoteOff,"__AWE32NOTEOFF")
-    #pragma Alias(__awe32IsPlaying,"__AWE32ISPLAYING")
-    #pragma Alias(awe32InitNRPN,"AWE32INITNRPN")
-    #pragma Alias(awe32Detect,"AWE32DETECT")
-    #pragma Alias(awe32InitHardware,"AWE32INITHARDWARE")
-    #pragma Alias(awe32Terminate,"AWE32TERMINATE")
-    #pragma Alias(awe32TotalPatchRam,"AWE32TOTALPATCHRAM")
-    #pragma Alias(awe32DefineBankSizes,"AWE32DEFINEBANKSIZES")
-    #pragma Alias(awe32SFontLoadRequest,"AWE32SFONTLOADREQUEST")
-    #pragma Alias(awe32StreamSample,"AWE32STREAMSAMPLE")
-    #pragma Alias(awe32SetPresets,"AWE32SETPRESETS")
-    #pragma Alias(awe32ReleaseBank,"AWE32RELEASEBANK")
-    #pragma Alias(awe32ReleaseAllBanks,"AWE32RELEASEALLBANKS")
-    #pragma Alias(awe32WPLoadRequest,"AWE32WPLOADREQUEST")
-    #pragma Alias(awe32WPLoadWave,"AWE32WPLOADWAVE")
-    #pragma Alias(awe32WPStreamWave,"AWE32WPSTREAMWAVE")
-    #pragma Alias(awe32WPBuildSFont,"AWE32WPBUILDSFONT")
-#endif
-
-
-#if defined(__WATCOMC__)
-    #pragma pack()
-    #pragma aux awe32NumG "_*"
-    #pragma aux awe32BaseAddx "_*"
-    #pragma aux awe32DramSize "_*"
-    #pragma aux awe32Scratch "_*"
-    #pragma aux awe32SFont "_*"
-    #pragma aux awe32GChannel "_*"
-    #pragma aux awe32MIDIChannel "_*"
-    #pragma aux awe32SoundPad "_*"
-    #pragma aux awe32NRPNChannel "_*"
-    #pragma aux awe32SPad1Obj "_*"
-    #pragma aux awe32SPad2Obj "_*"
-    #pragma aux awe32SPad3Obj "_*"
-    #pragma aux awe32SPad4Obj "_*"
-    #pragma aux awe32SPad5Obj "_*"
-    #pragma aux awe32SPad6Obj "_*"
-    #pragma aux awe32SPad7Obj "_*"
-    #pragma aux __midieng_code "_*"
-    #pragma aux __midieng_ecode "_*"
-    #pragma aux __hardware_code "_*"
-    #pragma aux __hardware_ecode "_*"
-    #pragma aux __sbkload_code "_*"
-    #pragma aux __sbkload_ecode "_*"
-    #pragma aux __nrpn_code "_*"
-    #pragma aux __nrpn_ecode "_*"
-    #pragma aux __midivar_data "_*"
-    #pragma aux __midivar_edata "_*"
-    #pragma aux __nrpnvar_data "_*"
-    #pragma aux __nrpnvar_edata "_*"
-    #pragma aux __embed_data "_*"
-    #pragma aux __embed_edata "_*"
-#endif
-
-
-#endif      /* _CTAWEAPI */
--- a/src/audiolib/debugio.c
+++ /dev/null
@@ -1,249 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include "debugio.h"
-
-static unsigned short disp_offset = 160 * 24;
-static void myutoa( unsigned num, char *string, int radix );
-static void myitoa( int num, char *string, int radix );
-
-void DB_SetXY
-   (
-   int x,
-   int y
-   )
-
-   {
-   disp_offset = ( x * 2 ) + ( y * 160 );
-   }
-
-void DB_PutChar
-   (
-   char ch
-   )
-
-   {
-   int j;
-   char *disp_start = (char *)( 0xb0000 );
-
-   if ( disp_offset >= 160 * 24 )
-      {
-      for ( j = 160; j < 160 * 24; j += 2 )
-         {
-         *( disp_start + j - 160 ) = *( disp_start + j );
-         }
-
-      disp_offset = 160 * 23;
-
-      for ( j = disp_offset; j < ( 160 * 24 ); j += 2 )
-         {
-         *( disp_start + j ) = ' ';
-         }
-      }
-
-   if ( ch >= 32 )
-      {
-      *( disp_start + disp_offset ) = ch;
-      disp_offset = disp_offset + 2;
-      }
-
-   if ( ch == '\r' )
-      {
-      disp_offset = disp_offset / 160;
-      disp_offset = disp_offset * 160;
-      }
-
-   if ( ch == '\n' )
-      {
-      disp_offset = disp_offset + 160;
-      if ( disp_offset < 160 * 24 )
-         {
-         for ( j = disp_offset; j < ( ( ( disp_offset / 160 ) + 1 ) *
-            160 ); j += 2 )
-            {
-            *( disp_start + j ) = ' ';
-            }
-         }
-      }
-   }
-
-int DB_PrintString
-   (
-   char *string
-   )
-
-   {
-   int count;
-   char *ptr;
-
-   ptr = string;
-   count = 0;
-
-   while ( *ptr )
-      {
-      DB_PutChar( *ptr );
-      count++;
-      ptr++;
-      }
-
-   return( count );
-   }
-
-static void myutoa
-   (
-   unsigned num,
-   char *string,
-   int radix
-   )
-
-   {
-   int val;
-   int length;
-   int pos;
-   char temp[ 100 ];
-
-   length = 0;
-   do
-      {
-      val = num % radix;
-      if ( val < 10 )
-         {
-         temp[ length ] = '0' + val;
-         }
-      else
-         {
-         temp[ length ] = 'A' + val - 10;
-         }
-      num /= radix;
-      length++;
-      }
-   while( num > 0 );
-
-   pos = 0;
-   while( length > 0 )
-      {
-      length--;
-      string[ length ] = temp[ pos ];
-      pos++;
-      }
-   string[ pos ] = 0;
-   }
-
-static void myitoa
-   (
-   int num,
-   char *string,
-   int radix
-   )
-
-   {
-   if ( num < 0 )
-      {
-      *string++ = '-';
-      num = -num;
-      }
-
-   myutoa( num, string, radix );
-   }
-
-int DB_PrintNum
-   (
-   int number
-   )
-
-   {
-   char string[ 100 ];
-   int  count;
-
-   myitoa( number, &string[ 0 ], 10 );
-   count = DB_PrintString( &string[ 0 ] );
-
-   return( count );
-   }
-
-int DB_PrintUnsigned
-   (
-   unsigned long number,
-   int radix
-   )
-
-   {
-   char string[ 100 ];
-   int  count;
-
-   myutoa( number, &string[ 0 ], radix );
-   count = DB_PrintString( &string[ 0 ] );
-
-   return( count );
-   }
-
-int DB_printf
-   (
-   char *fmt,
-   ...
-   )
-
-   {
-   va_list argptr;
-   int     count;
-   char    *ptr;
-
-   va_start( argptr, fmt );
-   ptr = fmt;
-   count = 0;
-
-   while( *ptr != 0 )
-      {
-      if ( *ptr == '%' )
-         {
-         ptr++;
-         switch( *ptr )
-            {
-            case 0 :
-               return( EOF );
-               break;
-            case 'd' :
-               count += DB_PrintNum( va_arg( argptr, int ) );
-               break;
-            case 's' :
-               count += DB_PrintString( va_arg( argptr, char * ) );
-               break;
-            case 'u' :
-               count += DB_PrintUnsigned( va_arg( argptr, int ), 10 );
-               break;
-            case 'x' :
-            case 'X' :
-               count += DB_PrintUnsigned( va_arg( argptr, int ), 16 );
-               break;
-            }
-         ptr++;
-         }
-      else
-         {
-         DB_PutChar( *ptr );
-         count++;
-         ptr++;
-         }
-      }
-
-   va_end( argptr );
-
-   return( count );
-   }
--- a/src/audiolib/dma.c
+++ /dev/null
@@ -1,377 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: DMA.C
-
-   author: James R. Dose
-   date:   February 4, 1994
-
-   Low level routines to for programming the DMA controller for 8 bit
-   and 16 bit transfers.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <conio.h>
-#include <stdlib.h>
-#include "dma.h"
-
-#define DMA_MaxChannel 7
-
-#define VALID   ( 1 == 1 )
-#define INVALID ( !VALID )
-
-#define BYTE 0
-#define WORD 1
-
-typedef struct
-   {
-   int Valid;
-   int Width;
-   int Mask;
-   int Mode;
-   int Clear;
-   int Page;
-   int Address;
-   int Length;
-   } DMA_PORT;
-
-static const DMA_PORT DMA_PortInfo[ DMA_MaxChannel + 1 ] =
-   {
-      {   VALID, BYTE,  0xA,  0xB,  0xC, 0x87,  0x0,  0x1 },
-      {   VALID, BYTE,  0xA,  0xB,  0xC, 0x83,  0x2,  0x3 },
-      { INVALID, BYTE,  0xA,  0xB,  0xC, 0x81,  0x4,  0x5 },
-      {   VALID, BYTE,  0xA,  0xB,  0xC, 0x82,  0x6,  0x7 },
-      { INVALID, WORD, 0xD4, 0xD6, 0xD8, 0x8F, 0xC0, 0xC2 },
-      {   VALID, WORD, 0xD4, 0xD6, 0xD8, 0x8B, 0xC4, 0xC6 },
-      {   VALID, WORD, 0xD4, 0xD6, 0xD8, 0x89, 0xC8, 0xCA },
-      {   VALID, WORD, 0xD4, 0xD6, 0xD8, 0x8A, 0xCC, 0xCE },
-   };
-
-int DMA_ErrorCode = DMA_Ok;
-
-#define DMA_SetErrorCode( status ) \
-   DMA_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *DMA_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case DMA_Error :
-         ErrorString = DMA_ErrorString( DMA_ErrorCode );
-         break;
-
-      case DMA_Ok :
-         ErrorString = "DMA channel ok.";
-         break;
-
-      case DMA_ChannelOutOfRange :
-         ErrorString = "DMA channel out of valid range.";
-         break;
-
-      case DMA_InvalidChannel :
-         ErrorString = "Unsupported DMA channel.";
-         break;
-
-      default :
-         ErrorString = "Unknown DMA error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_VerifyChannel
-
-   Verifies whether a DMA channel is available to transfer data.
----------------------------------------------------------------------*/
-
-int DMA_VerifyChannel
-   (
-   int channel
-   )
-
-   {
-   int      status;
-   int      Error;
-
-   status = DMA_Ok;
-   Error  = DMA_Ok;
-
-   if ( ( channel < 0 ) || ( DMA_MaxChannel < channel ) )
-      {
-      Error = DMA_ChannelOutOfRange;
-      status = DMA_Error;
-      }
-   else if ( DMA_PortInfo[ channel ].Valid == INVALID )
-      {
-      Error = DMA_InvalidChannel;
-      status = DMA_Error;
-      }
-
-   DMA_SetErrorCode( Error );
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_SetupTransfer
-
-   Programs the specified DMA channel to transfer data.
----------------------------------------------------------------------*/
-
-int DMA_SetupTransfer
-   (
-   int  channel,
-   char *address,
-   int  length,
-   int  mode
-   )
-
-   {
-   DMA_PORT *Port;
-   int      addr;
-   int      ChannelSelect;
-   int      Page;
-   int      HiByte;
-   int      LoByte;
-   int      TransferLength;
-   int      status;
-
-   status = DMA_VerifyChannel( channel );
-
-   if ( status == DMA_Ok )
-      {
-      Port = &DMA_PortInfo[ channel ];
-      ChannelSelect = channel & 0x3;
-
-      addr = ( int )address;
-
-      if ( Port->Width == WORD )
-         {
-         Page   = ( addr >> 16 ) & 255;
-         HiByte = ( addr >> 9 ) & 255;
-         LoByte = ( addr >> 1 ) & 255;
-
-         // Convert the length in bytes to the length in words
-         TransferLength = ( length + 1 ) >> 1;
-
-         // The length is always one less the number of bytes or words
-         // that we're going to send
-         TransferLength--;
-         }
-      else
-         {
-         Page   = ( addr >> 16 ) & 255;
-         HiByte = ( addr >> 8 ) & 255;
-         LoByte = addr & 255;
-
-         // The length is always one less the number of bytes or words
-         // that we're going to send
-         TransferLength = length - 1;
-         }
-
-      // Mask off DMA channel
-      outp( Port->Mask, 4 | ChannelSelect );
-
-      // Clear flip-flop to lower byte with any data
-      outp( Port->Clear, 0 );
-
-      // Set DMA mode
-      switch( mode )
-         {
-         case DMA_SingleShotRead :
-            outp( Port->Mode, 0x48 | ChannelSelect );
-            break;
-
-         case DMA_SingleShotWrite :
-            outp( Port->Mode, 0x44 | ChannelSelect );
-            break;
-
-         case DMA_AutoInitRead :
-            outp( Port->Mode, 0x58 | ChannelSelect );
-            break;
-
-         case DMA_AutoInitWrite :
-            outp( Port->Mode, 0x54 | ChannelSelect );
-            break;
-         }
-
-      // Send address
-      outp( Port->Address, LoByte );
-      outp( Port->Address, HiByte );
-
-      // Send page
-      outp( Port->Page, Page );
-
-      // Send length
-      outp( Port->Length, TransferLength );
-      outp( Port->Length, TransferLength >> 8 );
-
-      // enable DMA channel
-      outp( Port->Mask, ChannelSelect );
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_EndTransfer
-
-   Ends use of the specified DMA channel.
----------------------------------------------------------------------*/
-
-int DMA_EndTransfer
-   (
-   int channel
-   )
-
-   {
-   DMA_PORT *Port;
-   int       ChannelSelect;
-   int       status;
-
-   status = DMA_VerifyChannel( channel );
-   if ( status == DMA_Ok )
-      {
-      Port = &DMA_PortInfo[ channel ];
-      ChannelSelect = channel & 0x3;
-
-      // Mask off DMA channel
-      outp( Port->Mask, 4 | ChannelSelect );
-
-      // Clear flip-flop to lower byte with any data
-      outp( Port->Clear, 0 );
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_GetCurrentPos
-
-   Returns the position of the specified DMA transfer.
----------------------------------------------------------------------*/
-
-char *DMA_GetCurrentPos
-   (
-   int channel
-   )
-
-   {
-   DMA_PORT      *Port;
-   unsigned long addr;
-   int           status;
-
-   addr   = NULL;
-   status = DMA_VerifyChannel( channel );
-
-   if ( status == DMA_Ok )
-      {
-      Port = &DMA_PortInfo[ channel ];
-
-      if ( Port->Width == WORD )
-         {
-         // Get address
-         addr  = inp( Port->Address ) << 1;
-         addr |= inp( Port->Address ) << 9;
-
-         // Get page
-         addr |= inp( Port->Page ) << 16;
-         }
-      else
-         {
-         // Get address
-         addr = inp( Port->Address );
-         addr |= inp( Port->Address ) << 8;
-
-         // Get page
-         addr |= inp( Port->Page ) << 16;
-         }
-      }
-
-   return( ( char * )addr );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DMA_GetTransferCount
-
-   Returns how many bytes are left in the DMA's transfer.
----------------------------------------------------------------------*/
-
-int DMA_GetTransferCount
-   (
-   int channel
-   )
-
-   {
-   DMA_PORT      *Port;
-   int           count;
-   int           status;
-
-   status = DMA_Ok;
-
-   count = 0;
-
-   if ( ( channel < 0 ) || ( DMA_MaxChannel < channel ) )
-      {
-      status = DMA_ChannelOutOfRange;
-      }
-   else if ( DMA_PortInfo[ channel ].Valid == INVALID )
-      {
-      status = DMA_InvalidChannel;
-      }
-
-   if ( status == DMA_Ok )
-      {
-      Port = &DMA_PortInfo[ channel ];
-
-      outp( Port->Clear, 0 );
-      count  = inp( Port->Length );
-      count += inp( Port->Length ) << 8;
-
-      if ( Port->Width == WORD )
-         {
-         count <<= 1;
-         }
-      }
-
-   DMA_SetErrorCode( status );
-
-   return( count );
-   }
--- a/src/audiolib/dpmi.c
+++ /dev/null
@@ -1,248 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: DPMI.C
-
-   author: James R. Dose
-   date:   April 8, 1994
-
-   Functions for performing DPMI calls.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <string.h>
-#include "dpmi.h"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-static union  REGS  Regs;
-static struct SREGS SegRegs;
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_GetRealModeVector
-
-   Returns the vector of a real mode interrupt.
----------------------------------------------------------------------*/
-
-unsigned long DPMI_GetRealModeVector
-   (
-   int num
-   )
-
-   {
-   unsigned long vector;
-
-   Regs.x.eax = 0x0200;
-   Regs.h.bl  = num;
-   int386( 0x31, &Regs, &Regs );
-
-   vector   = Regs.w.cx & 0xffff;
-   vector <<= 16;
-   vector  |= Regs.w.dx & 0xffff;
-
-   return( vector );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_SetRealModeVector
-
-   Sets the vector of a real mode interrupt.
----------------------------------------------------------------------*/
-
-void DPMI_SetRealModeVector
-   (
-   int num,
-   unsigned long vector
-   )
-
-   {
-   Regs.x.eax = 0x0201;
-   Regs.h.bl  = num;
-   Regs.w.dx = vector & 0xffff;
-   Regs.w.cx = ( vector >> 16 ) & 0xffff;
-
-   int386( 0x31, &Regs, &Regs );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_CallRealModeFunction
-
-   Performs a call to a real mode function.
----------------------------------------------------------------------*/
-
-int DPMI_CallRealModeFunction
-   (
-   dpmi_regs *callregs
-   )
-
-   {
-   // Setup our registers to call DPMI
-   Regs.w.ax = 0x0301;
-   Regs.h.bl = 0;
-   Regs.h.bh = 0;
-   Regs.w.cx = 0;
-
-   SegRegs.es = FP_SEG( callregs );
-   Regs.x.edi = FP_OFF( callregs );
-
-   // Call Real-mode procedure with Far Return Frame
-   int386x( 0x31, &Regs, &Regs, &SegRegs );
-
-   if ( Regs.x.cflag )
-      {
-      return( DPMI_Error );
-      }
-
-   return( DPMI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_LockMemory
-
-   Locks a region of memory to keep the virtual memory manager from
-   paging the region out.
----------------------------------------------------------------------*/
-
-int DPMI_LockMemory
-   (
-   void *address,
-   unsigned length
-   )
-
-   {
-   unsigned linear;
-
-   // Thanks to DOS/4GW's zero-based flat memory model, converting
-   // a pointer of any type to a linear address is trivial.
-
-   linear = (unsigned) address;
-
-   // DPMI Lock Linear Region
-   Regs.w.ax = 0x600;
-
-   // Linear address in BX:CX
-   Regs.w.bx = (linear >> 16);
-   Regs.w.cx = (linear & 0xFFFF);
-
-   // Length in SI:DI
-   Regs.w.si = (length >> 16);
-   Regs.w.di = (length & 0xFFFF);
-
-   int386 (0x31, &Regs, &Regs);
-
-   // Return 0 if can't lock
-   if ( Regs.w.cflag )
-      {
-      return( DPMI_Error );
-      }
-
-   return ( DPMI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_LockMemoryRegion
-
-   Locks a region of memory to keep the virtual memory manager from
-   paging the region out.
----------------------------------------------------------------------*/
-
-int DPMI_LockMemoryRegion
-   (
-   void *start,
-   void *end
-   )
-
-   {
-   int status;
-
-   status = DPMI_LockMemory( start, ( char * )end - ( char * )start );
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_UnlockMemory
-
-   Unlocks a region of memory that was previously locked.
----------------------------------------------------------------------*/
-
-int DPMI_UnlockMemory
-   (
-   void *address,
-   unsigned length
-   )
-
-   {
-   unsigned linear;
-
-   // Thanks to DOS/4GW's zero-based flat memory model, converting
-   // a pointer of any type to a linear address is trivial.
-
-   linear = (unsigned) address;
-
-   // DPMI Unlock Linear Region
-   Regs.w.ax = 0x601;
-
-   // Linear address in BX:CX
-   Regs.w.bx = (linear >> 16);
-   Regs.w.cx = (linear & 0xFFFF);
-
-   // Length in SI:DI
-   Regs.w.si = (length >> 16);
-   Regs.w.di = (length & 0xFFFF);
-
-   int386 (0x31, &Regs, &Regs);
-
-   // Return 0 if can't unlock
-   if ( Regs.w.cflag )
-      {
-      return( DPMI_Error );
-      }
-
-   return ( DPMI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: DPMI_UnlockMemoryRegion
-
-   Unlocks a region of memory that was previously locked.
----------------------------------------------------------------------*/
-
-int DPMI_UnlockMemoryRegion
-   (
-   void *start,
-   void *end
-   )
-
-   {
-   int status;
-
-   status = DPMI_UnlockMemory( start, ( char * )end - ( char * )start );
-
-   return( status );
-   }
--- a/src/audiolib/gmtimbre.c
+++ /dev/null
@@ -1,288 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-typedef struct
-   {
-   unsigned char SAVEK[ 2 ];
-   unsigned char Level[ 2 ];
-   unsigned char Env1[ 2 ];
-   unsigned char Env2[ 2 ];
-   unsigned char Wave[ 2 ];
-   unsigned char Feedback;
-   signed   char Transpose;
-   signed   char Velocity;
-   } TIMBRE;
-
-TIMBRE ADLIB_TimbreBank[ 256 ] =
-   {
-      { { 33, 33 }, { 143, 6 }, { 242, 242 }, { 69, 118 }, { 0, 0 }, 8, 0 },
-      { { 49, 33 }, { 75, 0 }, { 242, 242 }, { 84, 86 }, { 0, 0 }, 8, 0 },
-      { { 49, 33 }, { 73, 0 }, { 242, 242 }, { 85, 118 }, { 0, 0 }, 8, 0 },
-      { { 177, 97 }, { 14, 0 }, { 242, 243 }, { 59, 11 }, { 0, 0 }, 6, 0 },
-      { { 1, 33 }, { 87, 0 }, { 241, 241 }, { 56, 40 }, { 0, 0 }, 0, 0 },
-      { { 1, 33 }, { 147, 0 }, { 241, 241 }, { 56, 40 }, { 0, 0 }, 0, 0 },
-      { { 33, 54 }, { 128, 14 }, { 162, 241 }, { 1, 213 }, { 0, 0 }, 8, 0 },
-      { { 1, 1 }, { 146, 0 }, { 194, 194 }, { 168, 88 }, { 0, 0 }, 10, 0 },
-      { { 12, 129 }, { 92, 0 }, { 246, 243 }, { 84, 181 }, { 0, 0 }, 0, 0 },
-      { { 7, 17 }, { 151, 128 }, { 246, 245 }, { 50, 17 }, { 0, 0 }, 2, 0 },
-      { { 23, 1 }, { 33, 0 }, { 86, 246 }, { 4, 4 }, { 0, 0 }, 2, 0 },
-      { { 24, 129 }, { 98, 0 }, { 243, 242 }, { 230, 246 }, { 0, 0 }, 0, 0 },
-      { { 24, 33 }, { 35, 0 }, { 247, 229 }, { 85, 216 }, { 0, 0 }, 0, 0 },
-      { { 21, 1 }, { 145, 0 }, { 246, 246 }, { 166, 230 }, { 0, 0 }, 4, 0 },
-      { { 69, 129 }, { 89, 128 }, { 211, 163 }, { 130, 227 }, { 0, 0 }, 12, 0 },
-      { { 3, 129 }, { 73, 128 }, { 116, 179 }, { 85, 5 }, { 1, 0 }, 4, 0 },
-      { { 113, 49 }, { 146, 0 }, { 246, 241 }, { 20, 7 }, { 0, 0 }, 2, 0 },
-      { { 114, 48 }, { 20, 0 }, { 199, 199 }, { 88, 8 }, { 0, 0 }, 2, 0 },
-      { { 112, 177 }, { 68, 0 }, { 170, 138 }, { 24, 8 }, { 0, 0 }, 4, 0 },
-      { { 35, 177 }, { 147, 0 }, { 151, 85 }, { 35, 20 }, { 1, 0 }, 4, 0 },
-      { { 97, 177 }, { 19, 128 }, { 151, 85 }, { 4, 4 }, { 1, 0 }, 0, 0 },
-      { { 36, 177 }, { 72, 0 }, { 152, 70 }, { 42, 26 }, { 1, 0 }, 12, 0 },
-      { { 97, 33 }, { 19, 0 }, { 145, 97 }, { 6, 7 }, { 1, 0 }, 10, 0 },
-      { { 33, 161 }, { 19, 137 }, { 113, 97 }, { 6, 7 }, { 0, 0 }, 6, 0 },
-      { { 2, 65 }, { 156, 128 }, { 243, 243 }, { 148, 200 }, { 1, 0 }, 12, 0 },
-      { { 3, 17 }, { 84, 0 }, { 243, 241 }, { 154, 231 }, { 1, 0 }, 12, 0 },
-      { { 35, 33 }, { 95, 0 }, { 241, 242 }, { 58, 248 }, { 0, 0 }, 0, 0 },
-      { { 3, 33 }, { 135, 128 }, { 246, 243 }, { 34, 243 }, { 1, 0 }, 6, 0 },
-      { { 3, 33 }, { 71, 0 }, { 249, 246 }, { 84, 58 }, { 0, 0 }, 0, 0 },
-      { { 35, 33 }, { 72, 0 }, { 149, 132 }, { 25, 25 }, { 1, 0 }, 8, 0 },
-      { { 35, 33 }, { 74, 0 }, { 149, 148 }, { 25, 25 }, { 1, 0 }, 8, 0 },
-      { { 9, 132 }, { 161, 128 }, { 32, 209 }, { 79, 248 }, { 0, 0 }, 8, 0 },
-      { { 33, 162 }, { 30, 0 }, { 148, 195 }, { 6, 166 }, { 0, 0 }, 2, 0 },
-      { { 49, 49 }, { 18, 0 }, { 241, 241 }, { 40, 24 }, { 0, 0 }, 10, 0 },
-      { { 49, 49 }, { 141, 0 }, { 241, 241 }, { 232, 120 }, { 0, 0 }, 10, 0 },
-      { { 49, 50 }, { 91, 0 }, { 81, 113 }, { 40, 72 }, { 0, 0 }, 12, 0 },
-      { { 1, 33 }, { 139, 64 }, { 161, 242 }, { 154, 223 }, { 0, 0 }, 8, 0 },
-      { { 1, 33 }, { 137, 64 }, { 161, 242 }, { 154, 223 }, { 0, 0 }, 8, 0 },
-      { { 49, 49 }, { 139, 0 }, { 244, 241 }, { 232, 120 }, { 0, 0 }, 10, 0 },
-      { { 49, 49 }, { 18, 0 }, { 241, 241 }, { 40, 24 }, { 0, 0 }, 10, 0 },
-      { { 49, 33 }, { 21, 0 }, { 221, 86 }, { 19, 38 }, { 1, 0 }, 8, 0 },
-      { { 49, 33 }, { 22, 0 }, { 221, 102 }, { 19, 6 }, { 1, 0 }, 8, 0 },
-      { { 113, 49 }, { 73, 0 }, { 209, 97 }, { 28, 12 }, { 1, 0 }, 8, 0 },
-      { { 33, 35 }, { 77, 128 }, { 113, 114 }, { 18, 6 }, { 1, 0 }, 2, 0 },
-      { { 241, 225 }, { 64, 0 }, { 241, 111 }, { 33, 22 }, { 1, 0 }, 2, 0 },
-      { { 2, 1 }, { 26, 128 }, { 245, 133 }, { 117, 53 }, { 1, 0 }, 0, 0 },
-      { { 2, 1 }, { 29, 128 }, { 245, 243 }, { 117, 244 }, { 1, 0 }, 0, 0 },
-      { { 16, 17 }, { 65, 0 }, { 245, 242 }, { 5, 195 }, { 1, 0 }, 2, 0 },
-      { { 33, 162 }, { 155, 1 }, { 177, 114 }, { 37, 8 }, { 1, 0 }, 14, 0 },
-      { { 161, 33 }, { 152, 0 }, { 127, 63 }, { 3, 7 }, { 1, 1 }, 0, 0 },
-      { { 161, 97 }, { 147, 0 }, { 193, 79 }, { 18, 5 }, { 0, 0 }, 10, 0 },
-      { { 33, 97 }, { 24, 0 }, { 193, 79 }, { 34, 5 }, { 0, 0 }, 12, 0 },
-      { { 49, 114 }, { 91, 131 }, { 244, 138 }, { 21, 5 }, { 0, 0 }, 0, 0 },
-      { { 161, 97 }, { 144, 0 }, { 116, 113 }, { 57, 103 }, { 0, 0 }, 0, 0 },
-      { { 113, 114 }, { 87, 0 }, { 84, 122 }, { 5, 5 }, { 0, 0 }, 12, 0 },
-      { { 144, 65 }, { 0, 0 }, { 84, 165 }, { 99, 69 }, { 0, 0 }, 8, 0 },
-      { { 33, 33 }, { 146, 1 }, { 133, 143 }, { 23, 9 }, { 0, 0 }, 12, 0 },
-      { { 33, 33 }, { 148, 5 }, { 117, 143 }, { 23, 9 }, { 0, 0 }, 12, 0 },
-      { { 33, 97 }, { 148, 0 }, { 118, 130 }, { 21, 55 }, { 0, 0 }, 12, 0 },
-      { { 49, 33 }, { 67, 0 }, { 158, 98 }, { 23, 44 }, { 1, 1 }, 2, 0 },
-      { { 33, 33 }, { 155, 0 }, { 97, 127 }, { 106, 10 }, { 0, 0 }, 2, 0 },
-      { { 97, 34 }, { 138, 6 }, { 117, 116 }, { 31, 15 }, { 0, 0 }, 8, 0 },
-      { { 161, 33 }, { 134, 13 }, { 114, 113 }, { 85, 24 }, { 1, 0 }, 0, 0 },
-      { { 33, 33 }, { 77, 0 }, { 84, 166 }, { 60, 28 }, { 0, 0 }, 8, 0 },
-      { { 49, 97 }, { 143, 0 }, { 147, 114 }, { 2, 11 }, { 1, 0 }, 8, 0 },
-      { { 49, 97 }, { 142, 0 }, { 147, 114 }, { 3, 9 }, { 1, 0 }, 8, 0 },
-      { { 49, 97 }, { 145, 0 }, { 147, 130 }, { 3, 9 }, { 1, 0 }, 10, 0 },
-      { { 49, 97 }, { 142, 0 }, { 147, 114 }, { 15, 15 }, { 1, 0 }, 10, 0 },
-      { { 33, 33 }, { 75, 0 }, { 170, 143 }, { 22, 10 }, { 1, 0 }, 8, 0 },
-      { { 49, 33 }, { 144, 0 }, { 126, 139 }, { 23, 12 }, { 1, 1 }, 6, 0 },
-      { { 49, 50 }, { 129, 0 }, { 117, 97 }, { 25, 25 }, { 1, 0 }, 0, 0 },
-      { { 50, 33 }, { 144, 0 }, { 155, 114 }, { 33, 23 }, { 0, 0 }, 4, 0 },
-      { { 225, 225 }, { 31, 0 }, { 133, 101 }, { 95, 26 }, { 0, 0 }, 0, 0 },
-      { { 225, 225 }, { 70, 0 }, { 136, 101 }, { 95, 26 }, { 0, 0 }, 0, 0 },
-      { { 161, 33 }, { 156, 0 }, { 117, 117 }, { 31, 10 }, { 0, 0 }, 2, 0 },
-      { { 49, 33 }, { 139, 0 }, { 132, 101 }, { 88, 26 }, { 0, 0 }, 0, 0 },
-      { { 225, 161 }, { 76, 0 }, { 102, 101 }, { 86, 38 }, { 0, 0 }, 0, 0 },
-      { { 98, 161 }, { 203, 0 }, { 118, 85 }, { 70, 54 }, { 0, 0 }, 0, 0 },
-      { { 98, 161 }, { 153, 0 }, { 87, 86 }, { 7, 7 }, { 0, 0 }, 11, 0 },
-      { { 98, 161 }, { 147, 0 }, { 119, 118 }, { 7, 7 }, { 0, 0 }, 11, 0 },
-      { { 34, 33 }, { 89, 0 }, { 255, 255 }, { 3, 15 }, { 2, 0 }, 0, 0 },
-      { { 33, 33 }, { 14, 0 }, { 255, 255 }, { 15, 15 }, { 1, 1 }, 0, 0 },
-      { { 34, 33 }, { 70, 128 }, { 134, 100 }, { 85, 24 }, { 0, 0 }, 0, 0 },
-      { { 33, 161 }, { 69, 0 }, { 102, 150 }, { 18, 10 }, { 0, 0 }, 0, 0 },
-      { { 33, 34 }, { 139, 0 }, { 146, 145 }, { 42, 42 }, { 1, 0 }, 0, 0 },
-      { { 162, 97 }, { 158, 64 }, { 223, 111 }, { 5, 7 }, { 0, 0 }, 2, 0 },
-      { { 32, 96 }, { 26, 0 }, { 239, 143 }, { 1, 6 }, { 0, 2 }, 0, 0 },
-      { { 33, 33 }, { 143, 128 }, { 241, 244 }, { 41, 9 }, { 0, 0 }, 10, 0 },
-      { { 119, 161 }, { 165, 0 }, { 83, 160 }, { 148, 5 }, { 0, 0 }, 2, 0 },
-      { { 97, 177 }, { 31, 128 }, { 168, 37 }, { 17, 3 }, { 0, 0 }, 10, 0 },
-      { { 97, 97 }, { 23, 0 }, { 145, 85 }, { 52, 22 }, { 0, 0 }, 12, 0 },
-      { { 113, 114 }, { 93, 0 }, { 84, 106 }, { 1, 3 }, { 0, 0 }, 0, 0 },
-      { { 33, 162 }, { 151, 0 }, { 33, 66 }, { 67, 53 }, { 0, 0 }, 8, 0 },
-      { { 161, 33 }, { 28, 0 }, { 161, 49 }, { 119, 71 }, { 1, 1 }, 0, 0 },
-      { { 33, 97 }, { 137, 3 }, { 17, 66 }, { 51, 37 }, { 0, 0 }, 10, 0 },
-      { { 161, 33 }, { 21, 0 }, { 17, 207 }, { 71, 7 }, { 1, 0 }, 0, 0 },
-      { { 58, 81 }, { 206, 0 }, { 248, 134 }, { 246, 2 }, { 0, 0 }, 2, 0 },
-      { { 33, 33 }, { 21, 0 }, { 33, 65 }, { 35, 19 }, { 1, 0 }, 0, 0 },
-      { { 6, 1 }, { 91, 0 }, { 116, 165 }, { 149, 114 }, { 0, 0 }, 0, 0 },
-      { { 34, 97 }, { 146, 131 }, { 177, 242 }, { 129, 38 }, { 0, 0 }, 12, 0 },
-      { { 65, 66 }, { 77, 0 }, { 241, 242 }, { 81, 245 }, { 1, 0 }, 0, 0 },
-      { { 97, 163 }, { 148, 128 }, { 17, 17 }, { 81, 19 }, { 1, 0 }, 6, 0 },
-      { { 97, 161 }, { 140, 128 }, { 17, 29 }, { 49, 3 }, { 0, 0 }, 6, 0 },
-      { { 164, 97 }, { 76, 0 }, { 243, 129 }, { 115, 35 }, { 1, 0 }, 4, 0 },
-      { { 2, 7 }, { 133, 3 }, { 210, 242 }, { 83, 246 }, { 0, 1 }, 0, 0 },
-      { { 17, 19 }, { 12, 128 }, { 163, 162 }, { 17, 229 }, { 1, 0 }, 0, 0 },
-      { { 17, 17 }, { 6, 0 }, { 246, 242 }, { 65, 230 }, { 1, 2 }, 4, 0 },
-      { { 147, 145 }, { 145, 0 }, { 212, 235 }, { 50, 17 }, { 0, 1 }, 8, 0 },
-      { { 4, 1 }, { 79, 0 }, { 250, 194 }, { 86, 5 }, { 0, 0 }, 12, 0 },
-      { { 33, 34 }, { 73, 0 }, { 124, 111 }, { 32, 12 }, { 0, 1 }, 6, 0 },
-      { { 49, 33 }, { 133, 0 }, { 221, 86 }, { 51, 22 }, { 1, 0 }, 10, 0 },
-      { { 32, 33 }, { 4, 129 }, { 218, 143 }, { 5, 11 }, { 2, 0 }, 6, 0 },
-      { { 5, 3 }, { 106, 128 }, { 241, 195 }, { 229, 229 }, { 0, 0 }, 6, 0 },
-      { { 7, 2 }, { 21, 0 }, { 236, 248 }, { 38, 22 }, { 0, 0 }, 10, 0 },
-      { { 5, 1 }, { 157, 0 }, { 103, 223 }, { 53, 5 }, { 0, 0 }, 8, 0 },
-      { { 24, 18 }, { 150, 0 }, { 250, 248 }, { 40, 229 }, { 0, 0 }, 10, 0 },
-      { { 16, 0 }, { 134, 3 }, { 168, 250 }, { 7, 3 }, { 0, 0 }, 6, 0 },
-      { { 17, 16 }, { 65, 3 }, { 248, 243 }, { 71, 3 }, { 2, 0 }, 4, 0 },
-      { { 1, 16 }, { 142, 0 }, { 241, 243 }, { 6, 2 }, { 2, 0 }, 14, 0 },
-      { { 14, 192 }, { 0, 0 }, { 31, 31 }, { 0, 255 }, { 0, 3 }, 14, 0 },
-      { { 6, 3 }, { 128, 136 }, { 248, 86 }, { 36, 132 }, { 0, 2 }, 14, 0 },
-      { { 14, 208 }, { 0, 5 }, { 248, 52 }, { 0, 4 }, { 0, 3 }, 14, 0 },
-      { { 14, 192 }, { 0, 0 }, { 246, 31 }, { 0, 2 }, { 0, 3 }, 14, 0 },
-      { { 213, 218 }, { 149, 64 }, { 55, 86 }, { 163, 55 }, { 0, 0 }, 0, 0 },
-      { { 53, 20 }, { 92, 8 }, { 178, 244 }, { 97, 21 }, { 2, 0 }, 10, 0 },
-      { { 14, 208 }, { 0, 0 }, { 246, 79 }, { 0, 245 }, { 0, 3 }, 14, 0 },
-      { { 38, 228 }, { 0, 0 }, { 255, 18 }, { 1, 22 }, { 0, 1 }, 14, 0 },
-      { { 0, 0 }, { 0, 0 }, { 243, 246 }, { 240, 201 }, { 0, 2 }, 14, 0 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 0, 0 }, { 0, 0 }, { 252, 250 }, { 5, 23 }, { 2, 0 }, 14, 52 },
-      { { 0, 1 }, { 2, 0 }, { 255, 255 }, { 7, 8 }, { 0, 0 }, 0, 48 },
-      { { 0, 0 }, { 0, 0 }, { 252, 250 }, { 5, 23 }, { 2, 0 }, 14, 58 },
-      { { 0, 0 }, { 0, 0 }, { 246, 246 }, { 12, 6 }, { 0, 0 }, 4, 60 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 47 },
-      { { 0, 0 }, { 3, 0 }, { 248, 246 }, { 42, 69 }, { 0, 1 }, 4, 43 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 49 },
-      { { 0, 0 }, { 3, 0 }, { 248, 246 }, { 42, 69 }, { 0, 1 }, 4, 43 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 51 },
-      { { 0, 0 }, { 3, 0 }, { 248, 246 }, { 42, 69 }, { 0, 1 }, 4, 43 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 54 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 57 },
-      { { 0, 0 }, { 3, 0 }, { 248, 246 }, { 42, 69 }, { 0, 1 }, 4, 72 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 60 },
-      { { 14, 208 }, { 0, 10 }, { 245, 159 }, { 48, 2 }, { 0, 0 }, 14, 76 },
-      { { 14, 7 }, { 10, 93 }, { 228, 245 }, { 228, 229 }, { 3, 1 }, 6, 84 },
-      { { 2, 5 }, { 3, 10 }, { 180, 151 }, { 4, 247 }, { 0, 0 }, 14, 36 },
-      { { 78, 158 }, { 0, 0 }, { 246, 159 }, { 0, 2 }, { 0, 3 }, 14, 76 },
-      { { 17, 16 }, { 69, 8 }, { 248, 243 }, { 55, 5 }, { 2, 0 }, 8, 84 },
-      { { 14, 208 }, { 0, 0 }, { 246, 159 }, { 0, 2 }, { 0, 3 }, 14, 83 },
-      { { 128, 16 }, { 0, 13 }, { 255, 255 }, { 3, 20 }, { 3, 0 }, 12, 84 },
-      { { 14, 7 }, { 8, 81 }, { 248, 244 }, { 66, 228 }, { 0, 3 }, 14, 24 },
-      { { 14, 208 }, { 0, 10 }, { 245, 159 }, { 48, 2 }, { 0, 0 }, 14, 77 },
-      { { 1, 2 }, { 0, 0 }, { 250, 200 }, { 191, 151 }, { 0, 0 }, 7, 60 },
-      { { 1, 1 }, { 81, 0 }, { 250, 250 }, { 135, 183 }, { 0, 0 }, 6, 65 },
-      { { 1, 2 }, { 84, 0 }, { 250, 248 }, { 141, 184 }, { 0, 0 }, 6, 59 },
-      { { 1, 2 }, { 89, 0 }, { 250, 248 }, { 136, 182 }, { 0, 0 }, 6, 51 },
-      { { 1, 0 }, { 0, 0 }, { 249, 250 }, { 10, 6 }, { 3, 0 }, 14, 45 },
-      { { 0, 0 }, { 128, 0 }, { 249, 246 }, { 137, 108 }, { 3, 0 }, 14, 71 },
-      { { 3, 12 }, { 128, 8 }, { 248, 246 }, { 136, 182 }, { 3, 0 }, 15, 60 },
-      { { 3, 12 }, { 133, 0 }, { 248, 246 }, { 136, 182 }, { 3, 0 }, 15, 58 },
-      { { 14, 0 }, { 64, 8 }, { 118, 119 }, { 79, 24 }, { 0, 2 }, 14, 53 },
-      { { 14, 3 }, { 64, 0 }, { 200, 155 }, { 73, 105 }, { 0, 2 }, 14, 64 },
-      { { 215, 199 }, { 220, 0 }, { 173, 141 }, { 5, 5 }, { 3, 0 }, 14, 71 },
-      { { 215, 199 }, { 220, 0 }, { 168, 136 }, { 4, 4 }, { 3, 0 }, 14, 61 },
-      { { 128, 17 }, { 0, 0 }, { 246, 103 }, { 6, 23 }, { 3, 3 }, 14, 61 },
-      { { 128, 17 }, { 0, 9 }, { 245, 70 }, { 5, 22 }, { 2, 3 }, 14, 48 },
-      { { 6, 21 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 0, 0 }, 1, 48 },
-      { { 6, 18 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 3, 0 }, 0, 69 },
-      { { 6, 18 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 0, 0 }, 1, 68 },
-      { { 1, 2 }, { 88, 0 }, { 103, 117 }, { 231, 7 }, { 0, 0 }, 0, 63 },
-      { { 65, 66 }, { 69, 8 }, { 248, 117 }, { 72, 5 }, { 0, 0 }, 0, 74 },
-      { { 10, 30 }, { 64, 78 }, { 224, 255 }, { 240, 5 }, { 3, 0 }, 8, 60 },
-      { { 10, 30 }, { 124, 82 }, { 224, 255 }, { 240, 2 }, { 3, 0 }, 8, 80 },
-      { { 14, 0 }, { 64, 8 }, { 122, 123 }, { 74, 27 }, { 0, 2 }, 14, 64 },
-      { { 14, 7 }, { 10, 64 }, { 228, 85 }, { 228, 57 }, { 3, 1 }, 6, 69 },
-      { { 5, 4 }, { 5, 64 }, { 249, 214 }, { 50, 165 }, { 3, 0 }, 14, 73 },
-      { { 2, 21 }, { 63, 0 }, { 0, 247 }, { 243, 245 }, { 3, 0 }, 8, 75 },
-      { { 1, 2 }, { 79, 0 }, { 250, 248 }, { 141, 181 }, { 0, 0 }, 7, 68 },
-      { { 0, 0 }, { 0, 0 }, { 246, 246 }, { 12, 6 }, { 0, 0 }, 4, 48 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 53 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 35 }
-   };
--- a/src/audiolib/gus.c
+++ /dev/null
@@ -1,281 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   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;
-      }
-   }
--- a/src/audiolib/gusmidi.c
+++ /dev/null
@@ -1,559 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   file:   GUSMIDI.C
-
-   author: James R. Dose
-   date:   March 23, 1994
-
-   General MIDI playback functions for the Gravis Ultrasound
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-// Module MUST be compiled with structure allignment set to a maximum
-// of 1 byte ( zp1 ).
-
-#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"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-// size of DMA buffer for patch loading
-#define DMABUFFSIZE 2048U
-
-#define MAX_MEM_CONFIG   3
-
-// size of patch array (128 perc, 128 melodic)
-#define NUM_PATCHES 256
-
-// size of largest patch name
-#define BIGGEST_NAME 9
-
-#define UNUSED_PATCH -1
-
-static struct patch   Patch[ NUM_PATCHES ];
-static unsigned char *PatchWaves[ NUM_PATCHES ];
-
-static int   PatchMap[ NUM_PATCHES ][ MAX_MEM_CONFIG + 1 ];
-static char  ProgramName[ NUM_PATCHES ][ BIGGEST_NAME ];
-static char  PatchLoaded[ NUM_PATCHES ];
-
-static char  ConfigFileName[] = "ULTRAMID.INI";
-static char  ConfigDirectory[ 80 ] = { '\0' };
-
-// The name of the configuration directory
-static char  InstrumentDirectory[ 80 ];
-
-extern struct gf1_dma_buff GUS_HoldBuffer;
-
-extern unsigned long GUS_TotalMemory;
-extern int           GUS_MemConfig;
-
-static int GUSMIDI_Volume = 255;
-
-extern int GUS_AuxError;
-extern int GUS_ErrorCode;
-
-int GUSMIDI_Installed = FALSE;
-
-#define GUS_SetErrorCode( status ) \
-   GUS_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: GUS_GetPatchMap
-
-   Reads the patch map from disk.
----------------------------------------------------------------------*/
-
-int GUS_GetPatchMap
-   (
-   char *name
-   )
-
-   {
-   char text[ 80 ];
-   char *ud;
-   int  index;
-   int  ignore;
-   FILE *fp;
-
-   for( index = 0; index < NUM_PATCHES; index++ )
-      {
-      PatchMap[ index ][ 0 ] = UNUSED_PATCH;
-      PatchMap[ index ][ 1 ] = UNUSED_PATCH;
-      PatchMap[ index ][ 2 ] = UNUSED_PATCH;
-      PatchMap[ index ][ 3 ] = UNUSED_PATCH;
-      ProgramName[ index ][ 0 ] = 0;
-      }
-
-   ud = getenv( "ULTRADIR" );
-   if ( ud == NULL )
-      {
-      GUS_SetErrorCode( GUS_ULTRADIRNotSet );
-      return( GUS_Error );
-      }
-
-   strcpy( InstrumentDirectory, ud );
-   strcat( InstrumentDirectory, "\\midi\\" );
-   strcpy( ConfigDirectory, ud );
-   strcat( ConfigDirectory, "\\midi\\" );
-   strcpy( text, name );
-
-   fp = fopen( text, "r" );
-   if ( fp == NULL )
-      {
-      strcpy( text, InstrumentDirectory );
-      strcat( text, name );
-
-      fp = fopen( text, "r" );
-      if ( fp == NULL )
-         {
-         GUS_SetErrorCode( GUS_MissingConfig );
-         return( GUS_Error );
-         }
-      }
-
-   while( 1 )
-      {
-      if ( fgets( text, 80, fp ) == NULL )
-         {
-         break;
-         }
-
-      if ( text[ 0 ] == '#' )
-         {
-         continue;
-         }
-
-      if ( sscanf( text, "%d", &index ) != 1 )
-         {
-         continue;
-         }
-
-      sscanf( text, "%d, %d, %d, %d, %d, %s\n", &ignore,
-         &PatchMap[ index ][ 0 ],
-         &PatchMap[ index ][ 1 ],
-         &PatchMap[ index ][ 2 ],
-         &PatchMap[ index ][ 3 ],
-         ProgramName[ index ] );
-      }
-
-   fclose( fp );
-
-   return( GUS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_UnloadPatch
-
-   Unloads a patch from the GUS's memory.
----------------------------------------------------------------------*/
-
-int GUSMIDI_UnloadPatch
-   (
-   int prognum
-   )
-
-   {
-   int      prog;
-   unsigned flags;
-
-   prog = PatchMap[ prognum ][ GUS_MemConfig ];
-
-   if ( PatchLoaded[ prog ] )
-      {
-      flags = DisableInterrupts();
-
-      gf1_unload_patch( &Patch[ prog ] );
-      if ( PatchWaves[ prog ] != NULL )
-         {
-         USRHOOKS_FreeMem( PatchWaves[ prog ] );
-         PatchWaves[ prog ] = NULL;
-         }
-
-      // just in case sequence is still playing
-      Patch[ prog ].nlayers = 0;
-      PatchLoaded[ prog ]   = FALSE;
-
-      RestoreInterrupts( flags );
-      }
-
-   return( GUS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_LoadPatch
-
-   Loads a patch into the GUS's memory.
----------------------------------------------------------------------*/
-
-int GUSMIDI_LoadPatch
-   (
-   int prognum
-   )
-
-   {
-   int  prog;
-   char text[ 80 ];
-   int  ret;
-   unsigned char *wave_buff;
-   struct patchinfo  patchi;
-   int  status;
-
-   prog = PatchMap[ prognum ][ GUS_MemConfig ];
-
-   if ( ( PatchLoaded[ prog ] ) || ( prog == UNUSED_PATCH ) )
-      {
-      return( GUS_Ok );
-      }
-
-   if ( !ProgramName[ prog ][ 0 ] )
-      {
-      return( GUS_Ok );
-      }
-
-   strcpy( text, InstrumentDirectory );
-   strcat( text, ProgramName[ prog ] );
-   strcat( text, ".pat" );
-
-   ret = gf1_get_patch_info( text, &patchi );
-   if ( ret != OK )
-      {
-      GUS_AuxError = ret;
-      GUS_SetErrorCode( GUS_GF1Error );
-      return( GUS_Error );
-      }
-
-   status = USRHOOKS_GetMem( &wave_buff, patchi.header.wave_forms *
-      sizeof( struct wave_struct ) );
-   if ( status != USRHOOKS_Ok )
-      {
-      GUS_SetErrorCode( GUS_OutOfMemory );
-      return( GUS_Error );
-      }
-
-   ret = gf1_load_patch( text, &patchi, &Patch[ prog ], &GUS_HoldBuffer,
-      DMABUFFSIZE, ( unsigned char * )wave_buff, PATCH_LOAD_8_BIT );
-
-   if ( ret != OK )
-      {
-      USRHOOKS_FreeMem( wave_buff );
-      GUS_AuxError = ret;
-      GUS_SetErrorCode( GUS_GF1Error );
-      return( GUS_Error );
-      }
-
-   PatchWaves[ prog ] = wave_buff;
-   PatchLoaded[ prog ] = TRUE;
-
-   return( GUS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_ProgramChange
-
-   Selects the instrument to use on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void GUSMIDI_ProgramChange
-   (
-   int channel,
-   int prognum
-   )
-
-   {
-   int  prog;
-
-   prog = PatchMap[ prognum ][ GUS_MemConfig ];
-
-   if ( PatchLoaded[ prog ] )
-      {
-      gf1_midi_change_program( &Patch[ prog ], channel );
-      }
-   else
-      {
-      gf1_midi_change_program( NULL, channel );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_NoteOn
-
-   Plays a note on the specified channel.
----------------------------------------------------------------------*/
-
-void GUSMIDI_NoteOn
-   (
-   int chan,
-   int note,
-   int velocity
-   )
-
-   {
-   int prog;
-
-   if ( chan == 9 )
-      {
-      prog = PatchMap[ note + 128 ][ GUS_MemConfig ];
-
-      if ( PatchLoaded[ prog ] )
-         {
-         gf1_midi_note_on( &Patch[ note + 128 ], 1,
-            note, velocity, 9 );
-         }
-      }
-   else
-      {
-      gf1_midi_note_on( 0L, 1, note, velocity, chan );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_NoteOff
-
-   Turns off a note on the specified channel.
----------------------------------------------------------------------*/
-#pragma warn -par
-void GUSMIDI_NoteOff
-   (
-   int chan,
-   int note,
-   int velocity
-   )
-
-   {
-   gf1_midi_note_off( note, chan );
-   }
-#pragma warn .par
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_ControlChange
-
-   Sets the value of a controller on the specified channel.
----------------------------------------------------------------------*/
-
-void GUSMIDI_ControlChange
-   (
-   int channel,
-   int number,
-   int value
-   )
-
-   {
-   gf1_midi_parameter( channel, number, value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_PitchBend
-
-   Sets the pitch bend on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void GUSMIDI_PitchBend
-   (
-   int channel,
-   int lsb,
-   int msb
-   )
-
-   {
-   gf1_midi_pitch_bend( channel, lsb, msb );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_ReleasePatches
-
-   Removes all the instruments from the GUS's memory.
----------------------------------------------------------------------*/
-
-void GUSMIDI_ReleasePatches
-   (
-   void
-   )
-
-   {
-   int i;
-
-   for( i = 0; i < 256; i++ )
-      {
-      GUSMIDI_UnloadPatch( i );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_SetVolume
-
-   Sets the total music volume.
----------------------------------------------------------------------*/
-
-void GUSMIDI_SetVolume
-   (
-   int volume
-   )
-
-   {
-   // Set the minimum to 2 because 0 has a tremolo problem
-   volume = max( 2, volume );
-   volume = min( volume, 255 );
-
-   GUSMIDI_Volume = volume;
-
-   // range = 0 to 127
-   gf1_midi_synth_volume( 0, volume >> 1 );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_GetVolume
-
-   Returns the total music volume.
----------------------------------------------------------------------*/
-
-int GUSMIDI_GetVolume
-   (
-   void
-   )
-
-   {
-   return( GUSMIDI_Volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_Init
-
-   Initializes the Gravis Ultrasound for music playback.
----------------------------------------------------------------------*/
-
-int GUSMIDI_Init
-   (
-   void
-   )
-
-   {
-   int ret;
-   int i;
-   int startmem;
-//   unsigned long mem;
-   extern int GUSWAVE_Installed;
-
-   if ( GUSMIDI_Installed )
-      {
-      GUSMIDI_Shutdown();
-      }
-
-   ret = GUS_Init();
-   if ( ret != GUS_Ok )
-      {
-      return( ret );
-      }
-
-   if ( GUS_MemConfig < 0 )
-      {
-      GUS_MemConfig = 0;
-      }
-
-   if ( GUS_MemConfig > MAX_MEM_CONFIG )
-      {
-      GUS_MemConfig = MAX_MEM_CONFIG;
-      }
-
-   for( i = 0; i < NUM_PATCHES; i++ )
-      {
-      ProgramName[ i ][ 0 ] = '\0';
-      PatchWaves[ i ]       = NULL;
-      PatchLoaded[ i ]      = FALSE;
-      }
-
-   GUSMIDI_SetVolume( 255 );
-
-   GUSMIDI_Installed = TRUE;
-
-   ret = GUS_GetPatchMap( ConfigFileName );
-   if ( ret != GUS_Ok )
-      {
-      GUSMIDI_Shutdown();
-      return( ret );
-      }
-
-//   if ( !GUSWAVE_Installed )
-//      {
-//      mem = gf1_malloc( 8192 );
-//      }
-
-   startmem = gf1_mem_avail();
-   for( i = 0; i < NUM_PATCHES; i++ )
-      {
-      ret = GUSMIDI_LoadPatch( i );
-      if ( ret != GUS_Ok )
-         {
-         }
-//      if ( ret != GUS_Ok )
-//         {
-//         return( ret );
-//         }
-      }
-
-//   if ( !GUSWAVE_Installed )
-//      {
-//      gf1_free( mem );
-//      }
-
-   GUSMIDI_Installed = TRUE;
-
-   return( GUS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSMIDI_Shutdown
-
-   Ends use of the Gravis Ultrasound for music playback.
----------------------------------------------------------------------*/
-
-void GUSMIDI_Shutdown
-   (
-   void
-   )
-
-   {
-   GUSMIDI_ReleasePatches();
-   GUS_Shutdown();
-   GUSMIDI_Installed = FALSE;
-   }
--- a/src/audiolib/gusmidi.h
+++ /dev/null
@@ -1,57 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef __GUSMIDI_H
-#define __GUSMIDI_H
-
-extern struct gf1_dma_buff GUS_HoldBuffer;
-
-enum GUS_Errors
-   {
-   GUS_Warning        = -2,
-   GUS_Error          = -1,
-   GUS_Ok             = 0,
-   GUS_OutOfMemory,
-   GUS_OutOfDosMemory,
-   GUS_OutOfDRAM,
-   GUS_GF1Error,
-   GUS_InvalidIrq,
-   GUS_ULTRADIRNotSet,
-   GUS_MissingConfig,
-   GUS_FileError
-   };
-
-char *GUS_ErrorString( int ErrorNumber );
-int   GUS_GetPatchMap( char *name );
-int   GUSMIDI_UnloadPatch( int prog );
-int   GUSMIDI_LoadPatch( int prog );
-void  GUSMIDI_ProgramChange( int channel, int prog );
-void  GUSMIDI_NoteOn( int chan, int note, int velocity );
-void  GUSMIDI_NoteOff( int chan, int note, int velocity );
-void  GUSMIDI_ControlChange( int channel, int number, int value );
-void  GUSMIDI_PitchBend( int channel, int lsb, int msb );
-void  GUSMIDI_ReleasePatches( void );
-void  GUSMIDI_SetVolume( int volume );
-int   GUSMIDI_GetVolume( void );
-int   GUS_Init( void );
-void  GUS_Shutdown( void );
-#pragma aux GUS_Shutdown frame;
-int   GUSMIDI_Init( void );
-void  GUSMIDI_Shutdown( void );
-void *D32DosMemAlloc( unsigned size );
-
-#endif
--- a/src/audiolib/guswave.c
+++ /dev/null
@@ -1,1771 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   file:   GUSWAVE.C
-
-   author: James R. Dose
-   date:   March 23, 1994
-
-   Digitized sound playback routines for the Gravis Ultrasound.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <stdlib.h>
-#include <conio.h>
-#include <dos.h>
-#include <stdio.h>
-#include <io.h>
-#include <string.h>
-#include "debugio.h"
-#include "interrup.h"
-#include "ll_man.h"
-#include "pitch.h"
-#include "user.h"
-#include "multivoc.h"
-#include "_guswave.h"
-#include "newgf1.h"
-#include "gusmidi.h"
-#include "guswave.h"
-
-#define ATR_INDEX               0x3c0
-#define STATUS_REGISTER_1       0x3da
-
-#define SetBorderColor(color) \
-   { \
-   inp  (STATUS_REGISTER_1); \
-   outp (ATR_INDEX,0x31);    \
-   outp (ATR_INDEX,color);   \
-   }
-
-static const int GUSWAVE_PanTable[ 32 ] =
-   {
-      8,  9, 10, 11, 11, 12, 13, 14,
-     15, 14, 13, 12, 11, 10,  9,  8,
-      7,  6,  5,  4,  4,  3,  2,  1,
-      0,  1,  2,  3,  4,  5,  6,  7
-   };
-
-static voicelist VoiceList;
-static voicelist VoicePool;
-
-static voicestatus VoiceStatus[ MAX_VOICES ];
-//static
-VoiceNode GUSWAVE_Voices[ VOICES ];
-
-static int GUSWAVE_VoiceHandle  = GUSWAVE_MinVoiceHandle;
-static int GUSWAVE_MaxVoices = VOICES;
-//static
-int GUSWAVE_Installed = FALSE;
-
-static void ( *GUSWAVE_CallBackFunc )( unsigned long ) = NULL;
-
-// current volume for dig audio - from 0 to 4095
-static int GUSWAVE_Volume = MAX_VOLUME;
-
-static int GUSWAVE_SwapLeftRight = FALSE;
-
-static int GUS_Debug = FALSE;
-
-extern int GUSMIDI_Installed;
-
-int GUSWAVE_ErrorCode = GUSWAVE_Ok;
-
-#define GUSWAVE_SetErrorCode( status ) \
-   GUSWAVE_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *GUSWAVE_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case GUSWAVE_Warning :
-      case GUSWAVE_Error :
-         ErrorString = GUSWAVE_ErrorString( GUSWAVE_ErrorCode );
-         break;
-
-      case GUSWAVE_Ok :
-         ErrorString = "GUSWAVE ok.";
-         break;
-
-      case GUSWAVE_GUSError :
-         ErrorString = GUS_ErrorString( GUS_Error );
-         break;
-
-      case GUSWAVE_NotInstalled :
-         ErrorString = "GUSWAVE not installed.";
-         break;
-
-      case GUSWAVE_NoVoices :
-         ErrorString = "No free voices available to GUSWAVE.";
-         break;
-
-      case GUSWAVE_UltraNoMem :
-         ErrorString = "Not enough Ultrasound memory available for GUSWAVE.";
-         break;
-
-      case GUSWAVE_UltraNoMemMIDI :
-         ErrorString = "Not enough Ultrasound memory available for GUSWAVE.  "
-            "Try initializing Sound FX before Music.";
-         break;
-
-      case GUSWAVE_VoiceNotFound :
-         ErrorString = "No voice with matching handle found.";
-         break;
-
-      case GUSWAVE_InvalidVOCFile :
-         ErrorString = "Invalid VOC file passed in to GUSWAVE.";
-         break;
-
-      case GUSWAVE_InvalidWAVFile :
-         ErrorString = "Invalid WAV file passed in to GUSWAVE.";
-         break;
-
-      default :
-         ErrorString = "Unknown GUSWAVE error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_CallBack
-
-   GF1 callback service routine.
----------------------------------------------------------------------*/
-
-char GUS_Silence8[ 1024 ] = //256 ] =
-   {
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
-   0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
-
-
-   };
-
-//unsigned short GUS_Silence16[ 128 ] =
-unsigned short GUS_Silence16[ 512 ] =
-   {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-
-
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-   };
-
-static int LOADDS GUSWAVE_CallBack
-   (
-   int reason,
-   int voice,
-   unsigned char **buf,
-   unsigned long *size
-   )
-
-   {
-   VoiceNode *Voice;
-   playbackstatus status;
-
-   // this function is called from an interrupt
-   // remember not to make any DOS or BIOS calls from here
-   // also don't call any C library functions unless you are sure that
-   // they are reentrant
-   // restore our DS register
-
-   if ( VoiceStatus[ voice ].playing == FALSE )
-      {
-      return( DIG_DONE );
-      }
-
-   if ( reason == DIG_MORE_DATA )
-      {
-//      SetBorderColor(16);
-      Voice = VoiceStatus[ voice ].Voice;
-
-      if ( ( Voice != NULL ) && ( Voice->Playing ) )
-/*
-         {
-         *buf = ( unsigned char * )GUS_Silence16;
-         *size = 1024;
-
-         SetBorderColor(0);
-         return( DIG_MORE_DATA );
-         }
- */
-         {
-         status = Voice->GetSound( Voice );
-         if ( status != SoundDone )
-            {
-            if ( ( Voice->sound == NULL ) || ( status == NoMoreData ) )
-               {
-               if ( Voice->bits == 8 )
-                  {
-                  *buf = GUS_Silence8;
-                  }
-               else
-                  {
-                  *buf = ( unsigned char * )GUS_Silence16;
-                  }
-               *size = 256;
-               }
-            else
-               {
-               *buf  = Voice->sound;
-               *size = Voice->length;
-               }
-            return( DIG_MORE_DATA );
-            }
-         }
-//      SetBorderColor(16);
-      return( DIG_DONE );
-      }
-
-   if ( reason == DIG_DONE )
-      {
-      Voice = VoiceStatus[ voice ].Voice;
-      VoiceStatus[ voice ].playing = FALSE;
-
-      if ( Voice != NULL )
-         {
-         Voice->Active   = FALSE;
-         Voice->Playing  = FALSE;
-
-// I'm commenting this out because a -1 could cause a crash if it
-// is sent to the GF1 code.  This shouldn't be necessary since
-// Active should be false when GF1voice is -1, but this is just
-// a precaution.  Adjust the pan on the wrong voice is a lot
-// more pleasant than a crash!
-//         Voice->GF1voice = -1;
-
-         LL_Remove( VoiceNode, &VoiceList, Voice );
-         LL_AddToTail( VoiceNode, &VoicePool, Voice );
-         }
-
-      if ( GUSWAVE_CallBackFunc )
-         {
-         GUSWAVE_CallBackFunc( Voice->callbackval );
-         }
-      }
-
-   return( DIG_DONE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_DebugCallBack
-
-   GF1 callback service routine with debugging info.
----------------------------------------------------------------------*/
-
-static int LOADDS GUSWAVE_DebugCallBack
-   (
-   int reason,
-   int voice,
-   unsigned char **buf,
-   unsigned long *size
-   )
-
-   {
-   VoiceNode *Voice;
-
-   // this function is called from an interrupt
-   // remember not to make any DOS or BIOS calls from here
-   // also don't call any C library functions unless you are sure that
-   // they are reentrant
-   // restore our DS register
-
-   if ( VoiceStatus[ voice ].playing == FALSE )
-      {
-//      DB_printf( "GUS Voice %d not playing.\n", voice );
-      DB_printf( "GUS Voice " );
-      DB_PrintNum( voice );
-      DB_printf( " not playing.\n" );
-      return( DIG_DONE );
-         }
-
-      if ( reason == DIG_MORE_DATA )
-         {
-         Voice = VoiceStatus[ voice ].Voice;
-
-//         DB_printf( "Voice %d : More data -- ", Voice );
-         DB_printf( "Voice " );
-         DB_PrintNum( voice );
-         DB_printf( " : More data -- " );
-         if ( Voice != NULL )
-            {
-            if ( Voice->Playing )
-               {
-               GUSWAVE_GetNextVOCBlock( Voice );
-               if ( Voice->Playing )
-                  {
-//                  DB_printf( "More data -- size = %u blocklength = %u\n",
-//                     Voice->length, Voice->BlockLength );
-                  DB_printf( "More data -- size = " );
-                  DB_PrintNum( Voice->length );
-                  DB_printf( " blocklength = " );
-                  DB_PrintNum( Voice->BlockLength );
-                  DB_printf( "\n" );
-                  *buf  = Voice->sound;
-                  *size = Voice->length;
-                  return( DIG_MORE_DATA );
-                  }
-               else
-                  {
-                  DB_printf( "Voice done.\n" );
-                  }
-               }
-            else
-               {
-               DB_printf( "Voice not active.\n" );
-               }
-            }
-         else
-            {
-            DB_printf( " NULL Voice\n" );
-            }
-
-         return( DIG_DONE );
-         }
-
-      if ( reason == DIG_DONE )
-         {
-         VoiceStatus[ voice ].playing = FALSE;
-         Voice = VoiceStatus[ voice ].Voice;
-//         DB_printf( "Voice %d : Done -- ", Voice );
-         DB_printf( "Voice " );
-         DB_PrintNum( voice );
-         DB_printf( " : Done -- " );
-
-         if ( Voice != NULL )
-            {
-            DB_printf( "Ok\n" );
-
-            Voice->Active   = FALSE;
-            Voice->Playing  = FALSE;
-
-// I'm commenting this out because a -1 could cause a crash if it
-// is sent to the GF1 code.  This shouldn't be necessary since
-// Active should be false when GF1voice is -1, but this is just
-// a precaution.  Adjust the pan on the wrong voice is a lot
-// more pleasant than a crash!
-//         Voice->GF1voice = -1;
-
-         LL_Remove( VoiceNode, &VoiceList, Voice );
-         LL_AddToTail( VoiceNode, &VoicePool, Voice );
-         }
-      else
-         {
-         DB_printf( "Null voice\n" );
-         }
-
-      if ( GUSWAVE_CallBackFunc )
-         {
-         GUSWAVE_CallBackFunc( Voice->callbackval );
-         }
-      }
-
-   return( DIG_DONE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetVoice
-
-   Locates the voice with the specified handle.
----------------------------------------------------------------------*/
-
-static VoiceNode *GUSWAVE_GetVoice
-   (
-   int handle
-   )
-
-   {
-   VoiceNode *voice;
-   unsigned  flags;
-
-   flags = DisableInterrupts();
-
-   voice = VoiceList.start;
-
-   while( voice != NULL )
-      {
-      if ( handle == voice->handle )
-         {
-         break;
-         }
-
-      voice = voice->next;
-      }
-
-   RestoreInterrupts( flags );
-
-   if ( voice == NULL )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_VoiceNotFound );
-      }
-
-   return( voice );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_VoicePlaying
-
-   Checks if the voice associated with the specified handle is
-   playing.
----------------------------------------------------------------------*/
-
-int GUSWAVE_VoicePlaying
-   (
-   int handle
-   )
-
-   {
-   VoiceNode   *voice;
-
-   voice = GUSWAVE_GetVoice( handle );
-   if ( voice != NULL )
-      {
-      return( voice->Active );
-      }
-
-   return( FALSE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_VoicesPlaying
-
-   Determines the number of currently active voices.
----------------------------------------------------------------------*/
-
-int GUSWAVE_VoicesPlaying
-   (
-   void
-   )
-
-   {
-   int         index;
-   int         NumVoices = 0;
-   unsigned    flags;
-
-   flags = DisableInterrupts();
-
-   for( index = 0; index < GUSWAVE_MaxVoices; index++ )
-      {
-      if ( GUSWAVE_Voices[ index ].Active )
-         {
-         NumVoices++;
-         }
-      }
-
-   RestoreInterrupts( flags );
-
-   if ( GUS_Debug )
-      {
-      DB_printf( "Number of voices = %d.\n", NumVoices );
-      }
-
-   return( NumVoices );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_Kill
-
-   Stops output of the voice associated with the specified handle.
----------------------------------------------------------------------*/
-
-int GUSWAVE_Kill
-   (
-   int handle
-   )
-
-   {
-   VoiceNode *voice;
-   unsigned  flags;
-
-   flags = DisableInterrupts();
-
-   voice = GUSWAVE_GetVoice( handle );
-
-   if ( voice == NULL )
-      {
-      RestoreInterrupts( flags );
-      GUSWAVE_SetErrorCode( GUSWAVE_VoiceNotFound );
-
-      if ( GUS_Debug )
-         {
-         DB_printf( "Could not find voice to kill.\n" );
-         }
-
-      return( GUSWAVE_Warning );
-      }
-
-   RestoreInterrupts( flags );
-
-   if ( !GUS_Debug )
-      {
-      if ( voice->Active )
-         {
-         gf1_stop_digital( voice->GF1voice );
-         }
-      }
-   else
-      {
-      DB_printf( "Kill - GUS Voice %d ", voice->GF1voice );
-      if ( voice->Active )
-         {
-         DB_printf( "active\n" );
-         gf1_stop_digital( voice->GF1voice );
-         }
-      else
-         {
-         DB_printf( "inactive\n" );
-         }
-      }
-
-//   RestoreInterrupts( flags );
-
-   return( GUSWAVE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_KillAllVoices
-
-   Stops output of all currently active voices.
----------------------------------------------------------------------*/
-
-int GUSWAVE_KillAllVoices
-   (
-   void
-   )
-
-   {
-   int i;
-   unsigned  flags;
-
-   if ( !GUSWAVE_Installed )
-      {
-      return( GUSWAVE_Ok );
-      }
-
-   if ( GUS_Debug )
-      {
-      DB_printf( "Kill All Voices\n" );
-      }
-
-   flags = DisableInterrupts();
-
-   // Remove all the voices from the list
-   for( i = 0; i < GUSWAVE_MaxVoices; i++ )
-      {
-      if ( GUSWAVE_Voices[ i ].Active )
-         {
-//         GUSWAVE_Kill( GUSWAVE_Voices[ i ].handle );
-
-         gf1_stop_digital( GUSWAVE_Voices[ i ].GF1voice );
-         }
-      }
-
-   for( i = 0; i < MAX_VOICES; i++ )
-      {
-      VoiceStatus[ i ].playing = FALSE;
-      VoiceStatus[ i ].Voice   = NULL;
-      }
-
-   VoicePool.start = NULL;
-   VoicePool.end   = NULL;
-   VoiceList.start = NULL;
-   VoiceList.end   = NULL;
-
-   for( i = 0; i < GUSWAVE_MaxVoices; i++ )
-      {
-      GUSWAVE_Voices[ i ].Active = FALSE;
-      if ( GUSWAVE_Voices[ i ].mem != NULL )
-         {
-         LL_AddToTail( VoiceNode, &VoicePool, &GUSWAVE_Voices[ i ] );
-         }
-      }
-
-   RestoreInterrupts( flags );
-
-   return( GUSWAVE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_SetPitch
-
-   Sets the pitch for the voice associated with the specified handle.
----------------------------------------------------------------------*/
-
-int GUSWAVE_SetPitch
-   (
-   int handle,
-   int pitchoffset
-   )
-
-   {
-   VoiceNode *voice;
-   unsigned  flags;
-
-   flags = DisableInterrupts();
-
-   voice = GUSWAVE_GetVoice( handle );
-
-   if ( voice == NULL )
-      {
-      RestoreInterrupts( flags );
-
-      GUSWAVE_SetErrorCode( GUSWAVE_VoiceNotFound );
-      return( GUSWAVE_Warning );
-      }
-
-   if ( voice->Active )
-      {
-      voice->PitchScale  = PITCH_GetScale( pitchoffset );
-      voice->RateScale   = ( voice->SamplingRate * voice->PitchScale ) >> 16;
-      gf1_dig_set_freq( voice->GF1voice, voice->RateScale );
-      }
-
-   RestoreInterrupts( flags );
-
-   return( GUSWAVE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_SetPan3D
-
-   Sets the pan position of the voice with the specified handle.
----------------------------------------------------------------------*/
-
-int GUSWAVE_SetPan3D
-   (
-   int handle,
-   int angle,
-   int distance
-   )
-
-   {
-   VoiceNode *voice;
-   int        pan;
-   unsigned  flags;
-
-   flags = DisableInterrupts();
-
-   voice = GUSWAVE_GetVoice( handle );
-
-   if ( voice == NULL )
-      {
-      RestoreInterrupts( flags );
-
-      GUSWAVE_SetErrorCode( GUSWAVE_VoiceNotFound );
-      return( GUSWAVE_Warning );
-      }
-
-   if ( voice->Active )
-      {
-      angle &= 31;
-
-      pan = GUSWAVE_PanTable[ angle ];
-      if ( GUSWAVE_SwapLeftRight )
-         {
-         pan = 15 - pan;
-         }
-
-      distance = max( 0, distance );
-      distance = min( 255, distance );
-
-      voice->Volume = 255 - distance;
-      voice->Pan    = pan;
-
-      gf1_dig_set_pan( voice->GF1voice, pan );
-      gf1_dig_set_vol( voice->GF1voice, GUSWAVE_Volume - distance * 4 );
-      }
-
-   RestoreInterrupts( flags );
-
-   return( GUSWAVE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_SetVolume
-
-   Sets the total volume of the digitized sounds.
----------------------------------------------------------------------*/
-
-void GUSWAVE_SetVolume
-   (
-   int volume
-   )
-
-   {
-   int i;
-
-   volume = max( 0, volume );
-   volume = min( 255, volume );
-   GUSWAVE_Volume = MAX_VOLUME - ( 255 - volume ) * 4;
-
-   for( i = 0; i < GUSWAVE_MaxVoices; i++ )
-      {
-      if ( GUSWAVE_Voices[ i ].Active )
-         {
-         gf1_dig_set_vol( GUSWAVE_Voices[ i ].GF1voice,
-            GUSWAVE_Volume - ( 255 - GUSWAVE_Voices[ i ].Volume ) * 4 );
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetVolume
-
-   Returns the total volume of the digitized sounds.
----------------------------------------------------------------------*/
-
-int GUSWAVE_GetVolume
-   (
-   void
-   )
-
-   {
-   return( 255 - ( ( MAX_VOLUME - GUSWAVE_Volume ) / 4 ) );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_AllocVoice
-
-   Retrieve an inactive or lower priority voice for output.
----------------------------------------------------------------------*/
-
-static VoiceNode *GUSWAVE_AllocVoice
-   (
-   int priority
-   )
-
-   {
-   VoiceNode   *voice;
-   VoiceNode   *node;
-   unsigned    flags;
-
-   // If we don't have any free voices, check if we have a higher
-   // priority than one that is playing.
-   if ( GUSWAVE_VoicesPlaying() >= GUSWAVE_MaxVoices )
-      {
-      flags = DisableInterrupts();
-
-      node = VoiceList.start;
-      voice = node;
-      while( node != NULL )
-         {
-         if ( node->priority < voice->priority )
-            {
-            voice = node;
-            }
-
-         node = node->next;
-         }
-
-      RestoreInterrupts( flags );
-
-      if ( priority >= voice->priority )
-         {
-         GUSWAVE_Kill( voice->handle );
-         }
-      }
-
-   // Check if any voices are in the voice pool
-   flags = DisableInterrupts();
-
-   voice = VoicePool.start;
-   if ( voice != NULL )
-      {
-      LL_Remove( VoiceNode, &VoicePool, voice );
-      }
-
-   RestoreInterrupts( flags );
-
-   if ( voice != NULL )
-      {
-      do
-         {
-         GUSWAVE_VoiceHandle++;
-         if ( GUSWAVE_VoiceHandle < GUSWAVE_MinVoiceHandle )
-            {
-            GUSWAVE_VoiceHandle = GUSWAVE_MinVoiceHandle;
-            }
-         }
-      while( GUSWAVE_VoicePlaying( GUSWAVE_VoiceHandle ) );
-
-      voice->handle = GUSWAVE_VoiceHandle;
-      }
-
-   return( voice );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_VoiceAvailable
-
-   Checks if a voice can be play at the specified priority.
----------------------------------------------------------------------*/
-
-int GUSWAVE_VoiceAvailable
-   (
-   int priority
-   )
-
-   {
-   VoiceNode   *voice;
-   VoiceNode   *node;
-   unsigned    flags;
-
-   if ( GUSWAVE_VoicesPlaying() < GUSWAVE_MaxVoices )
-      {
-      return( TRUE );
-      }
-
-   flags = DisableInterrupts();
-
-   node = VoiceList.start;
-   voice = node;
-   while( node != NULL )
-      {
-      if ( node->priority < voice->priority )
-         {
-         voice = node;
-         }
-
-      node = node->next;
-      }
-
-   RestoreInterrupts( flags );
-
-   if ( priority >= voice->priority )
-      {
-      return( TRUE );
-      }
-
-   return( FALSE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetNextVOCBlock
-
-   Interperate the information of a VOC format sound file.
----------------------------------------------------------------------*/
-
-playbackstatus GUSWAVE_GetNextVOCBlock
-   (
-   VoiceNode *voice
-   )
-
-   {
-   unsigned char *ptr;
-   int            blocktype;
-   int            lastblocktype;
-   unsigned long  blocklength;
-   unsigned long  samplespeed;
-   unsigned int   tc;
-   int            packtype;
-   int            voicemode;
-   int            done;
-   unsigned       BitsPerSample;
-   unsigned       Channels;
-   unsigned       Format;
-
-   if ( voice->BlockLength > 0 )
-      {
-      voice->sound       += MAX_BLOCK_LENGTH;
-      voice->length       = min( voice->BlockLength, MAX_BLOCK_LENGTH );
-      voice->BlockLength -= voice->length;
-      return( KeepPlaying );
-      }
-
-   ptr = ( unsigned char * )voice->NextBlock;
-
-   voice->Playing = TRUE;
-
-   voicemode = 0;
-   lastblocktype = 0;
-   packtype = 0;
-
-   done = FALSE;
-   while( !done )
-      {
-      // Stop playing if we get a NULL pointer
-      if ( ptr == NULL )
-         {
-         voice->Playing = FALSE;
-         done = TRUE;
-         break;
-         }
-
-      blocktype = ( int )*ptr;
-      blocklength = ( *( unsigned long * )( ptr + 1 ) ) & 0x00ffffff;
-      ptr += 4;
-
-      switch( blocktype )
-         {
-         case 0 :
-            // End of data
-            voice->Playing = FALSE;
-            done = TRUE;
-            break;
-
-         case 1 :
-            // Sound data block
-            voice->bits = 8;
-            if ( lastblocktype != 8 )
-               {
-               tc = ( unsigned int )*ptr << 8;
-               packtype = *( ptr + 1 );
-               }
-
-            ptr += 2;
-            blocklength -= 2;
-
-            samplespeed = 256000000L / ( 65536 - tc );
-
-            // Skip packed or stereo data
-            if ( ( packtype != 0 ) || ( voicemode != 0 ) )
-               {
-               ptr += blocklength;
-               }
-            else
-               {
-               done = TRUE;
-               }
-            voicemode = 0;
-            break;
-
-         case 2 :
-            // Sound continuation block
-            samplespeed = voice->SamplingRate;
-            done = TRUE;
-            break;
-
-         case 3 :
-            // Silence
-            // Not implimented.
-            ptr += blocklength;
-            break;
-
-         case 4 :
-            // Marker
-            // Not implimented.
-            ptr += blocklength;
-            break;
-
-         case 5 :
-            // ASCII string
-            // Not implimented.
-            ptr += blocklength;
-            break;
-
-         case 6 :
-            // Repeat begin
-            voice->LoopCount = *( unsigned short * )ptr;
-            ptr += blocklength;
-            voice->LoopStart = ptr;
-            break;
-
-         case 7 :
-            // Repeat end
-            ptr += blocklength;
-            if ( lastblocktype == 6 )
-               {
-               voice->LoopCount = 0;
-               }
-            else
-               {
-               if ( ( voice->LoopCount > 0 ) && ( voice->LoopStart != NULL ) )
-                  {
-                  ptr = voice->LoopStart;
-                  if ( voice->LoopCount < 0xffff )
-                     {
-                     voice->LoopCount--;
-                     if ( voice->LoopCount == 0 )
-                        {
-                        voice->LoopStart = NULL;
-                        }
-                     }
-                  }
-               }
-            break;
-
-         case 8 :
-            // Extended block
-            voice->bits = 8;
-            tc = *( unsigned short * )ptr;
-            packtype = *( ptr + 2 );
-            voicemode = *( ptr + 3 );
-            ptr += blocklength;
-            break;
-
-         case 9 :
-            // New sound data block
-            samplespeed = *( unsigned long * )ptr;
-            BitsPerSample = ( unsigned )*( ptr + 4 );
-            Channels = ( unsigned )*( ptr + 5 );
-            Format = ( unsigned )*( unsigned short * )( ptr + 6 );
-
-            if ( ( BitsPerSample == 8 ) && ( Channels == 1 ) &&
-               ( Format == VOC_8BIT ) )
-               {
-               ptr += 12;
-               blocklength -= 12;
-               voice->bits  = 8;
-               done = TRUE;
-               }
-            else if ( ( BitsPerSample == 16 ) && ( Channels == 1 ) &&
-               ( Format == VOC_16BIT ) )
-               {
-               ptr         += 12;
-               blocklength -= 12;
-               voice->bits  = 16;
-               done         = TRUE;
-               }
-            else
-               {
-               ptr += blocklength;
-               }
-            break;
-
-         default :
-            // Unknown data.  Probably not a VOC file.
-            voice->Playing = FALSE;
-            done = TRUE;
-            break;
-         }
-
-      lastblocktype = blocktype;
-      }
-
-   if ( voice->Playing )
-      {
-      voice->NextBlock    = ptr + blocklength;
-      voice->sound        = ptr;
-
-      voice->SamplingRate = samplespeed;
-      voice->RateScale    = ( voice->SamplingRate * voice->PitchScale ) >> 16;
-
-      voice->length       = min( blocklength, MAX_BLOCK_LENGTH );
-      voice->BlockLength  = blocklength - voice->length;
-
-      return( KeepPlaying );
-      }
-
-   return( SoundDone );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetNextWAVBlock
-
-   Controls playback of demand fed data.
----------------------------------------------------------------------*/
-
-playbackstatus GUSWAVE_GetNextWAVBlock
-   (
-   VoiceNode *voice
-   )
-
-   {
-   if ( voice->BlockLength <= 0 )
-      {
-      if ( voice->LoopStart == NULL )
-         {
-         voice->Playing = FALSE;
-         return( SoundDone );
-         }
-
-      voice->BlockLength = voice->LoopSize;
-      voice->NextBlock   = voice->LoopStart;
-      voice->length      = 0;
-      }
-
-   voice->sound        = voice->NextBlock;
-   voice->length       = min( voice->BlockLength, 0x8000 );
-   voice->NextBlock   += voice->length;
-   voice->BlockLength -= voice->length;
-
-   return( KeepPlaying );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetNextDemandFeedBlock
-
-   Controls playback of demand fed data.
----------------------------------------------------------------------*/
-
-playbackstatus GUSWAVE_GetNextDemandFeedBlock
-   (
-   VoiceNode *voice
-   )
-
-   {
-   if ( voice->BlockLength > 0 )
-      {
-      voice->sound       += voice->length;
-      voice->length       = min( voice->BlockLength, 0x8000 );
-      voice->BlockLength -= voice->length;
-
-      return( KeepPlaying );
-      }
-
-   if ( voice->DemandFeed == NULL )
-      {
-      return( SoundDone );
-      }
-
-   ( voice->DemandFeed )( &voice->sound, &voice->BlockLength );
-//   voice->sound = GUS_Silence16;
-//   voice->BlockLength = 256;
-
-   voice->length       = min( voice->BlockLength, 0x8000 );
-   voice->BlockLength -= voice->length;
-
-   if ( ( voice->length > 0 ) && ( voice->sound != NULL ) )
-      {
-      return( KeepPlaying );
-      }
-   return( NoMoreData );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_Play
-
-   Begins playback of digitized sound.
----------------------------------------------------------------------*/
-
-int GUSWAVE_Play
-   (
-   VoiceNode *voice,
-   int angle,
-   int volume,
-   int channels
-   )
-
-   {
-   int      VoiceNumber;
-   int      type;
-   int      pan;
-   unsigned flags;
-   int ( *servicefunction )( int reason, int voice, unsigned char **buf, unsigned long *size );
-
-   type = 0;
-   if ( channels != 1 )
-      {
-      type |= TYPE_STEREO;
-      }
-
-   if ( voice->bits == 8 )
-      {
-      type |= TYPE_8BIT;
-      type |= TYPE_INVERT_MSB;
-      }
-
-   voice->GF1voice  = -1;
-
-   angle &= 31;
-   pan = GUSWAVE_PanTable[ angle ];
-   if ( GUSWAVE_SwapLeftRight )
-      {
-      pan = 15 - pan;
-      }
-
-   voice->Pan = pan;
-
-   volume = max( 0, volume );
-   volume = min( 255, volume );
-   voice->Volume = volume;
-
-   if ( !GUS_Debug )
-      {
-      servicefunction = GUSWAVE_CallBack;
-      }
-   else
-      {
-      servicefunction = GUSWAVE_DebugCallBack;
-      }
-
-   VoiceNumber = gf1_play_digital( 0, voice->sound, voice->length,
-      voice->mem, GUSWAVE_Volume - ( 255 - volume ) * 4, pan,
-      voice->RateScale, type, &GUS_HoldBuffer, servicefunction );
-
-   if ( VoiceNumber == NO_MORE_VOICES )
-      {
-      if ( GUS_Debug )
-         {
-         DB_printf( "Out of voices.\n" );
-         }
-
-      flags = DisableInterrupts();
-      LL_AddToTail( VoiceNode, &VoicePool, voice );
-      RestoreInterrupts( flags );
-
-      GUSWAVE_SetErrorCode( GUSWAVE_NoVoices );
-      return( GUSWAVE_Warning );
-      }
-
-   flags = DisableInterrupts();
-   voice->GF1voice = VoiceNumber;
-   voice->Active   = TRUE;
-   LL_AddToTail( VoiceNode, &VoiceList, voice );
-   VoiceStatus[ VoiceNumber ].playing = TRUE;
-   VoiceStatus[ VoiceNumber ].Voice   = voice;
-
-   if ( GUS_Debug )
-      {
-      DB_printf( "GUS voice %d playing\n", VoiceNumber );
-      }
-
-   RestoreInterrupts( flags );
-
-   return( voice->handle );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_PlayVOC
-
-   Begins playback of digitized sound.
----------------------------------------------------------------------*/
-
-int GUSWAVE_PlayVOC
-   (
-   char *sample,
-   int   pitchoffset,
-   int   angle,
-   int   volume,
-   int   priority,
-   unsigned long callbackval
-   )
-
-   {
-   int handle;
-   int status;
-   playbackstatus soundstatus;
-   VoiceNode *voice;
-   unsigned flags;
-
-   // Make sure it's a valid VOC file.
-   status = strncmp( sample, "Creative Voice File", 19 );
-   if ( status != 0 )
-      {
-      // Tell multivoc that we had a bad VOC file
-      MV_ErrorCode = MV_InvalidVOCFile;
-
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidVOCFile );
-      return( GUSWAVE_Error );
-      }
-
-   // Request a voice from the voice pool
-   voice = GUSWAVE_AllocVoice( priority );
-   if ( voice == NULL )
-      {
-      if ( GUS_Debug )
-         {
-         DB_printf( "No more voices.  Skipping sound.\n" );
-         }
-      GUSWAVE_SetErrorCode( GUSWAVE_NoVoices );
-      return( GUSWAVE_Warning );
-      }
-
-   voice->NextBlock   = sample + *( unsigned short int * )( sample + 0x14 );
-   voice->LoopStart   = NULL;
-   voice->LoopCount   = 0;
-   voice->BlockLength = 0;
-   voice->PitchScale  = PITCH_GetScale( pitchoffset );
-   voice->wavetype    = VOC;
-   voice->bits        = 8;
-   voice->GetSound    = GUSWAVE_GetNextVOCBlock;
-   voice->length      = 0;
-   voice->next        = NULL;
-   voice->prev        = NULL;
-   voice->priority    = priority;
-   voice->callbackval = callbackval;
-
-   soundstatus = GUSWAVE_GetNextVOCBlock( voice );
-   if ( soundstatus == SoundDone )
-      {
-      flags = DisableInterrupts();
-      LL_AddToTail( VoiceNode, &VoicePool, voice );
-      RestoreInterrupts( flags );
-
-      if ( GUS_Debug )
-         {
-         DB_printf( "Voice ended before playback.\n" );
-         }
-
-      // Tell multivoc that we had a bad VOC file
-      MV_ErrorCode = MV_InvalidVOCFile;
-
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidVOCFile );
-      return( GUSWAVE_Error );
-      }
-
-   handle = GUSWAVE_Play( voice, angle, volume, 1 );
-   return( handle );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_PlayWAV
-
-   Begins playback of digitized sound.
----------------------------------------------------------------------*/
-
-int GUSWAVE_PlayWAV
-   (
-   char *sample,
-   int   pitchoffset,
-   int   angle,
-   int   volume,
-   int   priority,
-   unsigned long callbackval
-   )
-
-   {
-   VoiceNode *voice;
-   int        handle;
-   int        channels;
-   int        bits;
-   int        length;
-   riff_header   *riff;
-   format_header *format;
-   data_header   *data;
-
-   riff = ( riff_header * )sample;
-
-   if ( ( strncmp( riff->RIFF, "RIFF", 4 ) != 0 ) ||
-      ( strncmp( riff->WAVE, "WAVE", 4 ) != 0 ) ||
-      ( strncmp( riff->fmt, "fmt ", 4) != 0 ) )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidWAVFile );
-      return( GUSWAVE_Error );
-      }
-
-   format = ( format_header * )( riff + 1 );
-   data   = ( data_header * )( ( ( char * )format ) + riff->format_size );
-
-   if ( format->wFormatTag != 1 )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidWAVFile );
-      return( GUSWAVE_Error );
-      }
-
-   channels = format->nChannels;
-   if ( ( channels != 1 ) && ( channels != 2 ) )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidWAVFile );
-      return( GUSWAVE_Error );
-      }
-
-   bits = format->nBitsPerSample;
-   if ( ( bits != 8 ) && ( bits != 16 ) )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidWAVFile );
-      return( GUSWAVE_Error );
-      }
-
-   if ( strncmp( data->DATA, "data", 4 ) != 0 )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_InvalidWAVFile );
-      return( GUSWAVE_Error );
-      }
-
-   // Request a voice from the voice pool
-   voice = GUSWAVE_AllocVoice( priority );
-   if ( voice == NULL )
-      {
-      if ( GUS_Debug )
-         {
-         DB_printf( "No more voices.  Skipping sound.\n" );
-         }
-      GUSWAVE_SetErrorCode( GUSWAVE_NoVoices );
-      return( GUSWAVE_Warning );
-      }
-
-   voice->wavetype    = WAV;
-   voice->bits        = bits;
-   voice->GetSound    = GUSWAVE_GetNextWAVBlock;
-
-   length = data->size;
-
-   voice->Playing     = TRUE;
-   voice->DemandFeed  = NULL;
-   voice->LoopStart   = NULL;
-   voice->LoopCount   = 0;
-   voice->length      = min( length, 0x8000 );
-   voice->BlockLength = length - voice->length;//  min( loopend + 1, data->size );
-   voice->sound       = ( char * )( data + 1 );
-   voice->NextBlock   = voice->sound + voice->length;
-   voice->next        = NULL;
-   voice->prev        = NULL;
-   voice->priority    = priority;
-   voice->callbackval = callbackval;
-   voice->LoopStart   = NULL;// voice->NextBlock + loopstart;
-   voice->LoopEnd     = NULL;//voice->NextBlock + min( loopend, data->size - 1 );
-   voice->LoopSize    = 0;//( voice->LoopEnd - voice->LoopStart ) + 1;
-   voice->PitchScale  = PITCH_GetScale( pitchoffset );
-   voice->SamplingRate = format->nSamplesPerSec;
-   voice->RateScale   = ( voice->SamplingRate * voice->PitchScale ) >> 16;
-
-   handle = GUSWAVE_Play( voice, angle, volume, channels );
-
-   return( handle );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_StartDemandFeedPlayback
-
-   Begins playback of digitized sound.
----------------------------------------------------------------------*/
-
-int GUSWAVE_StartDemandFeedPlayback
-   (
-   void ( *function )( char **ptr, unsigned long *length ),
-   int   channels,
-   int   bits,
-   int   rate,
-   int   pitchoffset,
-   int   angle,
-   int   volume,
-   int   priority,
-   unsigned long callbackval
-   )
-
-   {
-   VoiceNode *voice;
-   int        handle;
-
-   // Request a voice from the voice pool
-   voice = GUSWAVE_AllocVoice( priority );
-   if ( voice == NULL )
-      {
-      if ( GUS_Debug )
-         {
-         DB_printf( "No more voices.  Skipping sound.\n" );
-         }
-      GUSWAVE_SetErrorCode( GUSWAVE_NoVoices );
-      return( GUSWAVE_Warning );
-      }
-
-   voice->wavetype    = DemandFeed;
-   voice->bits        = bits;
-   voice->GetSound    = GUSWAVE_GetNextDemandFeedBlock;
-   voice->Playing     = TRUE;
-   voice->DemandFeed  = function;
-   voice->LoopStart   = NULL;
-   voice->LoopCount   = 0;
-   voice->BlockLength = 0;
-   voice->length      = 256;
-   voice->sound       = ( bits == 8 ) ? GUS_Silence8 : ( char * )GUS_Silence16;
-   voice->NextBlock   = NULL;
-   voice->next        = NULL;
-   voice->prev        = NULL;
-   voice->priority    = priority;
-   voice->callbackval = callbackval;
-   voice->PitchScale  = PITCH_GetScale( pitchoffset );
-   voice->SamplingRate = rate;
-   voice->RateScale   = ( voice->SamplingRate * voice->PitchScale ) >> 16;
-
-   handle = GUSWAVE_Play( voice, angle, volume, channels );
-
-   return( handle );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_SetReverseStereo
-
-   Set the orientation of the left and right channels.
----------------------------------------------------------------------*/
-
-void GUSWAVE_SetReverseStereo
-   (
-   int setting
-   )
-
-   {
-   GUSWAVE_SwapLeftRight = setting;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_GetReverseStereo
-
-   Returns the orientation of the left and right channels.
----------------------------------------------------------------------*/
-
-int GUSWAVE_GetReverseStereo
-   (
-   void
-   )
-
-   {
-   return( GUSWAVE_SwapLeftRight );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_InitVoices
-
-   Begins playback of digitized sound.
----------------------------------------------------------------------*/
-
-static int GUSWAVE_InitVoices
-   (
-   void
-   )
-
-   {
-   int i;
-
-   for( i = 0; i < MAX_VOICES; i++ )
-      {
-      VoiceStatus[ i ].playing = FALSE;
-      VoiceStatus[ i ].Voice   = NULL;
-      }
-
-   VoicePool.start = NULL;
-   VoicePool.end   = NULL;
-   VoiceList.start = NULL;
-   VoiceList.end   = NULL;
-
-   for( i = 0; i < VOICES; i++ )
-      {
-      GUSWAVE_Voices[ i ].num      = -1;
-      GUSWAVE_Voices[ i ].Active   = FALSE;
-      GUSWAVE_Voices[ i ].GF1voice = -1;
-      GUSWAVE_Voices[ i ].mem      = NULL;
-      }
-
-   for( i = 0; i < VOICES; i++ )
-      {
-      GUSWAVE_Voices[ i ].num      = i;
-      GUSWAVE_Voices[ i ].Active   = FALSE;
-      GUSWAVE_Voices[ i ].GF1voice = 0;
-
-      GUSWAVE_Voices[ i ].mem = gf1_malloc( GF1BSIZE );
-      if ( GUSWAVE_Voices[ i ].mem == NULL )
-         {
-         GUSWAVE_MaxVoices = i;
-         if ( i < 1 )
-            {
-            if ( GUSMIDI_Installed )
-               {
-               GUSWAVE_SetErrorCode( GUSWAVE_UltraNoMemMIDI );
-               }
-            else
-               {
-               GUSWAVE_SetErrorCode( GUSWAVE_UltraNoMem );
-               }
-            return( GUSWAVE_Error );
-            }
-
-         break;
-         }
-
-      LL_AddToTail( VoiceNode, &VoicePool, &GUSWAVE_Voices[ i ] );
-      }
-
-   return( GUSWAVE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_SetCallBack
-
-   Set the function to call when a voice stops.
----------------------------------------------------------------------*/
-
-void GUSWAVE_SetCallBack
-   (
-   void ( *function )( unsigned long )
-   )
-
-   {
-   GUSWAVE_CallBackFunc = function;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: GUSWAVE_Init
-
-   Initializes the Gravis Ultrasound for digitized sound playback.
----------------------------------------------------------------------*/
-
-int GUSWAVE_Init
-   (
-   int numvoices
-   )
-
-   {
-   int status;
-
-   if ( GUSWAVE_Installed )
-      {
-      GUSWAVE_Shutdown();
-      }
-
-   GUSWAVE_SetErrorCode( GUSWAVE_Ok );
-
-   status = GUS_Init();
-   if ( status != GUS_Ok )
-      {
-      GUSWAVE_SetErrorCode( GUSWAVE_GUSError );
-      return( GUSWAVE_Error );
-      }
-
-   GUS_Debug = USER_CheckParameter( "DEBUGGUS" );
-
-   GUSWAVE_MaxVoices = min( numvoices, VOICES );
-   GUSWAVE_MaxVoices = max( GUSWAVE_MaxVoices, 0 );
-
-   status = GUSWAVE_InitVoices();
-   if ( status != GUSWAVE_Ok )
-      {
-      GUS_Shutdown();
-      return( status );
-      }
-
-   GUSWAVE_SetReverseStereo( FALSE );
-
-   GUSWAVE_CallBackFunc = NULL;
-   GUSWAVE_Installed = TRUE;
-
-   return( GUSWAVE_Ok );
-   }
--- a/src/audiolib/guswave.h
+++ /dev/null
@@ -1,73 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: GUSWAVE.H
-
-   author: James R. Dose
-   date:   March 23, 1994
-
-   Public header for for GUSWAVE.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __GUSWAVE_H
-#define __GUSWAVE_H
-
-#define GUSWAVE_MinVoiceHandle 1
-
-enum GUSWAVE_Errors
-   {
-   GUSWAVE_Warning  = -2,
-   GUSWAVE_Error    = -1,
-   GUSWAVE_Ok       = 0,
-   GUSWAVE_GUSError,
-   GUSWAVE_NotInstalled,
-   GUSWAVE_NoVoices,
-   GUSWAVE_UltraNoMem,
-   GUSWAVE_UltraNoMemMIDI,
-   GUSWAVE_VoiceNotFound,
-   GUSWAVE_InvalidVOCFile,
-   GUSWAVE_InvalidWAVFile
-   };
-
-char *GUSWAVE_ErrorString( int ErrorNumber );
-int   GUSWAVE_VoicePlaying( int handle );
-int   GUSWAVE_VoicesPlaying( void );
-int   GUSWAVE_Kill( int handle );
-int   GUSWAVE_KillAllVoices( void );
-int   GUSWAVE_SetPitch( int handle, int pitchoffset );
-int   GUSWAVE_SetPan3D( int handle, int angle, int distance );
-void  GUSWAVE_SetVolume( int volume );
-int   GUSWAVE_GetVolume( void );
-int   GUSWAVE_VoiceAvailable( int priority );
-int   GUSWAVE_PlayVOC( char *sample, int pitchoffset, int angle, int volume,
-         int priority, unsigned long callbackval );
-int   GUSWAVE_PlayWAV( char *sample, int pitchoffset, int angle, int volume,
-         int priority, unsigned long callbackval );
-int   GUSWAVE_StartDemandFeedPlayback( void ( *function )( char **ptr, unsigned long *length ),
-         int channels, int bits, int rate, int pitchoffset, int angle,
-         int volume, int priority, unsigned long callbackval );
-void  GUSWAVE_SetCallBack( void ( *function )( unsigned long ) );
-void  GUSWAVE_SetReverseStereo( int setting );
-int   GUSWAVE_GetReverseStereo( void );
-int   GUSWAVE_Init( int numvoices );
-void  GUSWAVE_Shutdown( void );
-#pragma aux GUSWAVE_Shutdown frame;
-
-#endif
--- a/src/audiolib/irq.c
+++ /dev/null
@@ -1,323 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: IRQ.C
-
-   author: James R. Dose
-   date:   August 26, 1994
-
-   Low level routines to set and restore IRQ's through DPMI.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <stdlib.h>
-#include "irq.h"
-
-#define D32RealSeg(P) ( ( ( ( unsigned long )( P ) ) >> 4 ) & 0xFFFF )
-#define D32RealOff(P) ( ( ( unsigned long )( P ) ) & 0xF )
-
-typedef struct
-   {
-   unsigned long  drdi;
-   unsigned long  drsi;
-   unsigned long  drbp;
-   unsigned long  drxx;
-   unsigned long  drbx;
-   unsigned long  drdx;
-   unsigned long  drcx;
-   unsigned long  drax;
-
-   unsigned short drflags;
-   unsigned short dres;
-   unsigned short drds;
-   unsigned short drfs;
-   unsigned short drgs;
-   unsigned short drip;
-   unsigned short drcs;
-   unsigned short drsp;
-   unsigned short drss;
-   } DPMI_REGS;
-
-static DPMI_REGS rmregs = { 0 };
-static void ( __interrupt __far *IRQ_Callback )( void ) = NULL;
-
-static char *IRQ_RealModeCode = NULL;
-
-static unsigned short IRQ_CallBackSegment;
-static unsigned short IRQ_CallBackOffset;
-static unsigned short IRQ_RealModeSegment;
-static unsigned short IRQ_RealModeOffset;
-static unsigned long  IRQ_ProtectedModeOffset;
-static unsigned short IRQ_ProtectedModeSelector;
-
-static union  REGS  Regs;
-static struct SREGS SegRegs;
-
-static void *D32DosMemAlloc
-   (
-   unsigned long size
-   )
-
-   {
-   // DPMI allocate DOS memory
-   Regs.x.eax = 0x0100;
-
-   // Number of paragraphs requested
-   Regs.x.ebx = ( size + 15 ) >> 4;
-
-   int386( 0x31, &Regs, &Regs );
-
-   if ( Regs.x.cflag != 0 )
-      {
-      // Failed
-      return ( ( unsigned long )0 );
-      }
-
-   return( ( void * )( ( Regs.x.eax & 0xFFFF ) << 4  ) );
-   }
-
-// Intermediary function: DPMI calls this, making it
-// easier to write in C
-// handle 16-bit incoming stack
-
-void fixebp
-   (
-   void
-   );
-
-#pragma aux fixebp = \
-        "mov   bx,  ss" \
-        "lar   ebx, ebx" \
-        "bt    ebx, 22" \
-        "jc    bigstk" \
-        "movzx esp, sp" \
-        "mov   ebp, esp" \
-        "bigstk:" \
-modify exact [ ebx ];
-
-#pragma aux rmcallback parm [];
-
-void rmcallback
-   (
-   unsigned short _far *stkp
-   )
-
-   {
-   // "Pop" the real mode return frame so we
-   // can resume where we left off
-   rmregs.drip = *stkp++;
-   rmregs.drcs = *stkp++;
-
-   rmregs.drsp = FP_OFF(stkp);
-
-   // Call protected-mode handler
-   IRQ_Callback();
-   }
-
-static void _interrupt _cdecl callback_x
-   (
-   // regs pushed in this order by prologue
-
-   int rgs,
-   int rfs,
-   int res,
-   int rds,
-   int rdi,
-   int rsi,
-   int rbp,
-   int rsp,
-   int rbx,
-   int rdx,
-   int rcx,
-   int rax
-   )
-
-   {
-//   unsigned short _far *stkp;
-//   return;
-
-   fixebp();
-   rmcallback (MK_FP(rds, rsi));
-   }
-
-/*
-static void _interrupt _cdecl callback_x
-   (
-   // regs pushed in this order by prologue
-
-   int rgs,
-   int rfs,
-   int res,
-   int rds,
-   int rdi,
-   int rsi,
-   int rbp,
-   int rsp,
-   int rbx,
-   int rdx,
-   int rcx,
-   int rax
-   )
-
-   {
-   unsigned short _far *stkp;
-
-   fixebp();
-   stkp = MK_FP(rds, rsi);
-
-   // "Pop" the real mode return frame so we
-   // can resume where we left off
-   rmregs.drip = *stkp++;
-   rmregs.drcs = *stkp++;
-
-   rmregs.drsp = FP_OFF(stkp);
-
-   // Call protected-mode handler
-   IRQ_Callback();
-   }
-*/
-
-
-int IRQ_SetVector
-   (
-   int vector,
-   void ( __interrupt __far *function )( void )
-   )
-
-   {
-   void far *fp;
-
-   IRQ_Callback = function;
-
-   // Save the starting real-mode and protected-mode handler addresses
-
-   // DPMI get protected mode vector */
-   Regs.w.ax = 0x0204;
-   Regs.w.bx = vector;
-   int386( 0x31, &Regs, &Regs );
-   IRQ_ProtectedModeSelector = Regs.w.cx;
-   IRQ_ProtectedModeOffset = Regs.x.edx;
-
-   // DPMI get real mode vector
-   Regs.w.ax = 0x0200;
-   Regs.w.bx = vector;
-   int386( 0x31, &Regs, &Regs );
-   IRQ_RealModeSegment = Regs.w.cx;
-   IRQ_RealModeOffset = Regs.w.dx;
-
-   // Set up callback
-   // DPMI allocate real mode callback
-   Regs.w.ax = 0x0303;
-   fp = ( void far * )callback_x;
-   SegRegs.ds   = FP_SEG( fp );
-   Regs.x.esi = FP_OFF( fp );
-   fp      = ( void _far * )&rmregs;
-   SegRegs.es   = FP_SEG( fp );
-   Regs.x.edi = FP_OFF( fp );
-   int386x( 0x31, &Regs, &Regs, &SegRegs );
-
-   IRQ_CallBackSegment = Regs.w.cx;
-   IRQ_CallBackOffset = Regs.w.dx;
-
-   if ( Regs.x.cflag != 0 )
-      {
-      return( IRQ_Error );
-      }
-
-   if ( IRQ_RealModeCode == NULL )
-      {
-      // Allocate 6 bytes of low memory for real mode interrupt handler
-      IRQ_RealModeCode = D32DosMemAlloc( 6 );
-      if ( IRQ_RealModeCode == NULL )
-         {
-         // Free callback
-         Regs.w.ax = 0x304;
-         Regs.w.cx = IRQ_CallBackSegment;
-         Regs.w.dx = IRQ_CallBackOffset;
-         int386x( 0x31, &Regs, &Regs, &SegRegs );
-
-         return( IRQ_Error );
-         }
-      }
-
-   // Poke code (to call callback) into real mode handler
-
-   // CALL FAR PTR (callback)
-   IRQ_RealModeCode[ 0 ] = '\x9A';
-   *( ( unsigned short * )&IRQ_RealModeCode[ 1 ] ) = IRQ_CallBackOffset;
-   *( ( unsigned short * )&IRQ_RealModeCode[ 3 ] ) = IRQ_CallBackSegment;
-
-   // IRET
-   IRQ_RealModeCode[ 5 ] = '\xCF';
-
-   // Install protected mode handler
-   // DPMI set protected mode vector
-   Regs.w.ax = 0x0205;
-   Regs.w.bx = vector;
-   fp = function;
-
-   Regs.w.cx  = FP_SEG( fp );
-   Regs.x.edx = FP_OFF( fp );
-   int386( 0x31, &Regs, &Regs );
-
-   // Install callback address as real mode handler
-   // DPMI set real mode vector
-   Regs.w.ax = 0x0201;
-   Regs.w.bx = vector;
-   Regs.w.cx = D32RealSeg( IRQ_RealModeCode );
-   Regs.w.dx = D32RealOff( IRQ_RealModeCode );
-   int386( 0x31, &Regs, &Regs );
-
-   return( IRQ_Ok );
-   }
-
-int IRQ_RestoreVector
-   (
-   int vector
-   )
-
-   {
-   // Restore original interrupt handlers
-   // DPMI set real mode vector
-   Regs.w.ax = 0x0201;
-   Regs.w.bx = vector;
-   Regs.w.cx = IRQ_RealModeSegment;
-   Regs.w.dx = IRQ_RealModeOffset;
-   int386( 0x31, &Regs, &Regs );
-
-   Regs.w.ax = 0x0205;
-   Regs.w.bx = vector;
-   Regs.w.cx = IRQ_ProtectedModeSelector;
-   Regs.x.edx = IRQ_ProtectedModeOffset;
-   int386( 0x31, &Regs, &Regs );
-
-   // Free callback
-   Regs.w.ax = 0x304;
-   Regs.w.cx = IRQ_CallBackSegment;
-   Regs.w.dx = IRQ_CallBackOffset;
-   int386x( 0x31, &Regs, &Regs, &SegRegs );
-
-   if ( Regs.x.cflag )
-      {
-      return( IRQ_Error );
-      }
-
-   return( IRQ_Ok );
-   }
--- a/src/audiolib/irq.h
+++ /dev/null
@@ -1,52 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: IRQ.H
-
-   author: James R. Dose
-   date:   August 8, 1994
-
-   Public header for IRQ.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __IRQ_H
-#define __IRQ_H
-
-enum IRQ_ERRORS
-   {
-   IRQ_Warning = -2,
-   IRQ_Error = -1,
-   IRQ_Ok = 0,
-   };
-
-#define VALID_IRQ( irq )  ( ( ( irq ) >= 0 ) && ( ( irq ) <= 15 ) )
-
-int IRQ_SetVector
-   (
-   int vector,
-   void ( __interrupt *function )( void )
-   );
-int IRQ_RestoreVector
-   (
-   int vector
-   );
-
-
-#endif
--- a/src/audiolib/leetimbr.c
+++ /dev/null
@@ -1,288 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-typedef struct
-   {
-   unsigned char SAVEK[ 2 ];
-   unsigned char Level[ 2 ];
-   unsigned char Env1[ 2 ];
-   unsigned char Env2[ 2 ];
-   unsigned char Wave[ 2 ];
-   unsigned char Feedback;
-   signed   char Transpose;
-   signed   char Velocity;
-   } TIMBRE;
-
-TIMBRE ADLIB_TimbreBank[ 256 ] =
-   {
-      { { 33, 49 }, { 79, 0 }, { 242, 210 }, { 82, 115 }, { 0, 0 }, 6, 0 },
-      { { 19, 17 }, { 198, 10 }, { 242, 241 }, { 245, 245 }, { 1, 0 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 3, 18 }, { 48, 16 }, { 246, 242 }, { 25, 244 }, { 0, 0 }, 15, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 24, 129 }, { 98, 0 }, { 243, 242 }, { 230, 246 }, { 0, 0 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 23, 2 }, { 79, 16 }, { 242, 242 }, { 96, 114 }, { 0, 0 }, 8, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 178, 176 }, { 192, 134 }, { 159, 148 }, { 6, 15 }, { 1, 1 }, 9, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 178, 176 }, { 192, 128 }, { 159, 148 }, { 6, 15 }, { 1, 1 }, 9, 0 },
-      { { 130, 128 }, { 192, 134 }, { 145, 145 }, { 246, 246 }, { 1, 1 }, 9, 0 },
-      { { 36, 49 }, { 79, 27 }, { 242, 82 }, { 11, 11 }, { 0, 0 }, 14, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 35, 33 }, { 72, 0 }, { 149, 132 }, { 25, 25 }, { 1, 0 }, 8, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 19, 49 }, { 150, 128 }, { 254, 242 }, { 33, 148 }, { 0, 0 }, 10, 0 },
-      { { 1, 17 }, { 77, 0 }, { 242, 245 }, { 83, 116 }, { 1, 1 }, 8, 0 },
-      { { 33, 40 }, { 1, 9 }, { 148, 148 }, { 25, 9 }, { 0, 0 }, 6, 0 },
-      { { 33, 40 }, { 1, 19 }, { 148, 148 }, { 25, 9 }, { 0, 0 }, 6, 0 },
-      { { 36, 194 }, { 138, 3 }, { 250, 145 }, { 111, 248 }, { 0, 0 }, 8, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 33 }, { 26, 0 }, { 241, 246 }, { 207, 72 }, { 0, 0 }, 10, 0 },
-      { { 1, 34 }, { 29, 0 }, { 183, 196 }, { 34, 55 }, { 0, 0 }, 14, 0 },
-      { { 49, 34 }, { 30, 0 }, { 242, 241 }, { 239, 104 }, { 0, 0 }, 14, 0 },
-      { { 49, 34 }, { 30, 0 }, { 242, 245 }, { 239, 120 }, { 0, 0 }, 14, 0 },
-      { { 49, 34 }, { 30, 0 }, { 242, 245 }, { 239, 120 }, { 0, 0 }, 14, 0 },
-      { { 17, 49 }, { 5, 9 }, { 249, 241 }, { 37, 52 }, { 0, 0 }, 10, 0 },
-      { { 17, 49 }, { 5, 0 }, { 249, 241 }, { 37, 52 }, { 0, 0 }, 10, 0 },
-      { { 49, 114 }, { 138, 0 }, { 213, 97 }, { 25, 27 }, { 0, 0 }, 12, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 17, 17 }, { 150, 128 }, { 165, 245 }, { 85, 179 }, { 2, 1 }, 12, 0 },
-      { { 1, 17 }, { 156, 128 }, { 128, 240 }, { 5, 6 }, { 0, 0 }, 0, 0 },
-      { { 17, 17 }, { 150, 128 }, { 165, 245 }, { 85, 179 }, { 2, 1 }, 12, 0 },
-      { { 2, 1 }, { 153, 128 }, { 245, 246 }, { 85, 83 }, { 0, 0 }, 0, 0 },
-      { { 192, 0 }, { 13, 0 }, { 165, 212 }, { 67, 35 }, { 2, 1 }, 0, 0 },
-      { { 33, 32 }, { 88, 0 }, { 194, 97 }, { 227, 22 }, { 1, 3 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 34 }, { 22, 0 }, { 176, 179 }, { 129, 44 }, { 0, 1 }, 12, 0 },
-      { { 49, 114 }, { 91, 131 }, { 244, 138 }, { 21, 5 }, { 0, 0 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 33 }, { 29, 0 }, { 113, 129 }, { 174, 158 }, { 0, 0 }, 14, 0 },
-      { { 49, 97 }, { 28, 128 }, { 65, 146 }, { 11, 59 }, { 0, 0 }, 14, 0 },
-      { { 49, 241 }, { 28, 0 }, { 65, 146 }, { 11, 27 }, { 0, 0 }, 10, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 33 }, { 155, 0 }, { 97, 127 }, { 106, 10 }, { 0, 0 }, 2, 0 },
-      { { 225, 226 }, { 21, 3 }, { 113, 129 }, { 174, 158 }, { 0, 0 }, 14, 0 },
-      { { 33, 33 }, { 29, 0 }, { 113, 129 }, { 174, 158 }, { 0, 0 }, 14, 0 },
-      { { 33, 33 }, { 77, 0 }, { 84, 166 }, { 60, 28 }, { 0, 0 }, 8, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 50 }, { 79, 0 }, { 113, 82 }, { 83, 76 }, { 0, 0 }, 10, 0 },
-      { { 33, 50 }, { 79, 0 }, { 113, 82 }, { 83, 76 }, { 0, 0 }, 10, 0 },
-      { { 32, 49 }, { 78, 0 }, { 113, 82 }, { 104, 94 }, { 0, 0 }, 10, 0 },
-      { { 33, 33 }, { 75, 0 }, { 170, 143 }, { 22, 10 }, { 1, 0 }, 8, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 50, 97 }, { 154, 130 }, { 81, 162 }, { 27, 59 }, { 0, 0 }, 12, 0 },
-      { { 50, 33 }, { 192, 0 }, { 155, 114 }, { 33, 7 }, { 0, 0 }, 4, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 162 }, { 131, 141 }, { 116, 101 }, { 23, 23 }, { 0, 0 }, 7, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 225, 98 }, { 236, 0 }, { 110, 101 }, { 143, 42 }, { 0, 0 }, 14, 0 },
-      { { 50, 33 }, { 144, 0 }, { 155, 114 }, { 33, 23 }, { 0, 0 }, 4, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 245, 242 }, { 154, 128 }, { 12, 96 }, { 199, 165 }, { 0, 0 }, 13, 0 },
-      { { 98, 161 }, { 147, 0 }, { 119, 118 }, { 7, 7 }, { 0, 0 }, 11, 0 },
-      { { 34, 33 }, { 89, 8 }, { 255, 255 }, { 3, 15 }, { 2, 0 }, 0, 0 },
-      { { 33, 33 }, { 29, 0 }, { 113, 129 }, { 14, 14 }, { 0, 0 }, 14, 0 },
-      { { 34, 33 }, { 70, 128 }, { 134, 100 }, { 85, 24 }, { 0, 0 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 113, 114 }, { 93, 0 }, { 84, 106 }, { 1, 3 }, { 0, 0 }, 0, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 0, 17 }, { 13, 128 }, { 241, 80 }, { 255, 255 }, { 0, 0 }, 6, 0 },
-      { { 33, 97 }, { 137, 3 }, { 17, 66 }, { 51, 37 }, { 0, 0 }, 10, 0 },
-      { { 0, 49 }, { 16, 128 }, { 17, 176 }, { 239, 15 }, { 0, 0 }, 10, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 164, 97 }, { 76, 16 }, { 243, 129 }, { 115, 35 }, { 1, 0 }, 4, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 1, 1 }, { 0, 0 }, { 255, 255 }, { 7, 7 }, { 0, 0 }, 7, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 1, 221 }, { 0, 0 }, { 246, 31 }, { 0, 6 }, { 2, 3 }, 12, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 36 },
-      { { 16, 17 }, { 68, 0 }, { 248, 243 }, { 119, 6 }, { 2, 0 }, 8, 36 },
-      { { 3, 15 }, { 0, 0 }, { 251, 245 }, { 43, 11 }, { 2, 0 }, 15, 36 },
-      { { 33, 0 }, { 128, 0 }, { 255, 249 }, { 7, 7 }, { 0, 1 }, 14, 36 },
-      { { 240, 229 }, { 192, 0 }, { 255, 251 }, { 255, 240 }, { 3, 0 }, 14, 48 },
-      { { 33, 0 }, { 128, 0 }, { 255, 248 }, { 10, 25 }, { 0, 1 }, 14, 36 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 48 },
-      { { 12, 18 }, { 0, 0 }, { 246, 251 }, { 8, 71 }, { 0, 2 }, 10, 69 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 52 },
-      { { 14, 0 }, { 64, 8 }, { 118, 119 }, { 79, 24 }, { 0, 2 }, 14, 48 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 55 },
-      { { 2, 5 }, { 3, 10 }, { 180, 151 }, { 4, 247 }, { 0, 0 }, 14, 57 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 58 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 60 },
-      { { 1, 221 }, { 12, 0 }, { 246, 159 }, { 0, 2 }, { 0, 3 }, 12, 62 },
-      { { 1, 0 }, { 0, 0 }, { 250, 242 }, { 124, 4 }, { 0, 0 }, 0, 63 },
-      { { 12, 18 }, { 0, 0 }, { 246, 203 }, { 2, 67 }, { 0, 2 }, 10, 70 },
-      { { 12, 18 }, { 0, 0 }, { 246, 203 }, { 2, 19 }, { 0, 2 }, 10, 70 },
-      { { 14, 7 }, { 6, 68 }, { 248, 244 }, { 66, 228 }, { 3, 3 }, 14, 53 },
-      { { 14, 0 }, { 64, 8 }, { 150, 183 }, { 79, 24 }, { 0, 2 }, 14, 48 },
-      { { 1, 221 }, { 0, 0 }, { 246, 159 }, { 0, 2 }, { 2, 3 }, 12, 84 },
-      { { 2, 9 }, { 27, 0 }, { 245, 246 }, { 118, 214 }, { 2, 0 }, 4, 43 },
-      { { 0, 223 }, { 9, 0 }, { 246, 147 }, { 0, 67 }, { 0, 2 }, 14, 56 },
-      { { 128, 144 }, { 13, 0 }, { 248, 159 }, { 0, 4 }, { 2, 3 }, 14, 24 },
-      { { 12, 18 }, { 0, 0 }, { 246, 203 }, { 2, 67 }, { 0, 2 }, 10, 65 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 1, 2 }, { 84, 0 }, { 250, 248 }, { 141, 184 }, { 0, 0 }, 6, 48 },
-      { { 1, 2 }, { 84, 0 }, { 250, 248 }, { 141, 184 }, { 0, 0 }, 6, 51 },
-      { { 1, 2 }, { 84, 0 }, { 250, 248 }, { 141, 184 }, { 0, 0 }, 6, 54 },
-      { { 2, 4 }, { 0, 0 }, { 250, 200 }, { 191, 151 }, { 0, 0 }, 11, 42 },
-      { { 2, 4 }, { 0, 0 }, { 250, 200 }, { 191, 151 }, { 0, 0 }, 11, 39 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 14, 0 }, { 64, 8 }, { 118, 119 }, { 79, 24 }, { 0, 2 }, 14, 64 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 128, 17 }, { 0, 0 }, { 255, 111 }, { 6, 22 }, { 3, 0 }, 14, 52 },
-      { { 128, 17 }, { 0, 0 }, { 255, 79 }, { 6, 22 }, { 3, 0 }, 14, 52 },
-      { { 6, 21 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 0, 0 }, 1, 60 },
-      { { 6, 21 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 0, 0 }, 1, 66 },
-      { { 6, 21 }, { 63, 0 }, { 0, 247 }, { 244, 245 }, { 0, 0 }, 1, 59 },
-      { { 65, 66 }, { 69, 0 }, { 252, 105 }, { 69, 5 }, { 0, 0 }, 0, 91 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 23, 2 }, { 79, 16 }, { 242, 242 }, { 96, 114 }, { 0, 0 }, 8, 109 },
-      { { 14, 0 }, { 64, 8 }, { 118, 119 }, { 79, 24 }, { 0, 2 }, 14, 64 },
-      { { 133, 132 }, { 5, 64 }, { 249, 214 }, { 50, 165 }, { 3, 0 }, 14, 79 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 },
-      { { 33, 17 }, { 17, 0 }, { 163, 196 }, { 67, 34 }, { 2, 0 }, 13, 0 }
-   };
--- a/src/audiolib/midi.c
+++ /dev/null
@@ -1,2263 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: MIDI.C
-
-   author: James R. Dose
-   date:   May 25, 1994
-
-   Midi song file playback routines.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <stdlib.h>
-#include <time.h>
-#include <dos.h>
-#include <string.h>
-#include "sndcards.h"
-#include "interrup.h"
-#include "dpmi.h"
-#include "standard.h"
-#include "task_man.h"
-#include "ll_man.h"
-#include "usrhooks.h"
-#include "music.h"
-#include "_midi.h"
-#include "midi.h"
-#include "debugio.h"
-
-extern int MUSIC_SoundDevice;
-
-static const int _MIDI_CommandLengths[ NUM_MIDI_CHANNELS ] =
-   {
-   0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 2, 0
-   };
-
-static int cdecl ( *_MIDI_RerouteFunctions[ NUM_MIDI_CHANNELS ] )
-   (
-   int event,
-   int c1,
-   int c2
-   ) = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
-
-static track *_MIDI_TrackPtr = NULL;
-static int    _MIDI_TrackMemSize;
-static int    _MIDI_NumTracks;
-
-static int _MIDI_SongActive = FALSE;
-static int _MIDI_SongLoaded = FALSE;
-static int _MIDI_Loop = FALSE;
-
-static task *_MIDI_PlayRoutine = NULL;
-
-static int  _MIDI_Division;
-static int  _MIDI_Tick    = 0;
-static int  _MIDI_Beat    = 1;
-static int  _MIDI_Measure = 1;
-static unsigned _MIDI_Time;
-static int  _MIDI_BeatsPerMeasure;
-static int  _MIDI_TicksPerBeat;
-static int  _MIDI_TimeBase;
-static long _MIDI_FPSecondsPerTick;
-static unsigned _MIDI_TotalTime;
-static int  _MIDI_TotalTicks;
-static int  _MIDI_TotalBeats;
-static int  _MIDI_TotalMeasures;
-
-static unsigned long _MIDI_PositionInTicks;
-
-static int  _MIDI_Context;
-
-static int _MIDI_ActiveTracks;
-static int _MIDI_TotalVolume = MIDI_MaxVolume;
-
-static int _MIDI_ChannelVolume[ NUM_MIDI_CHANNELS ];
-static int _MIDI_UserChannelVolume[ NUM_MIDI_CHANNELS ] =
-   {
-   256, 256, 256, 256, 256, 256, 256, 256,
-   256, 256, 256, 256, 256, 256, 256, 256
-   };
-
-static midifuncs *_MIDI_Funcs = NULL;
-
-static int Reset = FALSE;
-
-int MIDI_Tempo = 120;
-
-char MIDI_PatchMap[ 128 ];
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define MIDI_LockStart _MIDI_ReadNumber
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_ReadNumber
-
-   Reads a variable length number from a MIDI track.
----------------------------------------------------------------------*/
-
-static long _MIDI_ReadNumber
-   (
-   void *from,
-   size_t size
-   )
-
-   {
-   unsigned char *FromPtr;
-   long          value;
-
-   if ( size > 4 )
-      {
-      size = 4;
-      }
-
-   FromPtr = ( unsigned char * )from;
-
-   value = 0;
-   while( size-- )
-      {
-      value <<= 8;
-      value += *FromPtr++;
-      }
-
-   return( value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_ReadDelta
-
-   Reads a variable length encoded delta delay time from the MIDI data.
----------------------------------------------------------------------*/
-
-static long _MIDI_ReadDelta
-   (
-   track *ptr
-   )
-
-   {
-   long          value;
-   unsigned char c;
-
-   GET_NEXT_EVENT( ptr, value );
-
-   if ( value & 0x80 )
-      {
-      value &= 0x7f;
-      do
-         {
-         GET_NEXT_EVENT( ptr, c );
-         value = ( value << 7 ) + ( c & 0x7f );
-         }
-      while ( c & 0x80 );
-      }
-
-   return( value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_ResetTracks
-
-   Sets the track pointers to the beginning of the song.
----------------------------------------------------------------------*/
-
-static void _MIDI_ResetTracks
-   (
-   void
-   )
-
-   {
-   int    i;
-   track *ptr;
-
-   _MIDI_Tick = 0;
-   _MIDI_Beat = 1;
-   _MIDI_Measure = 1;
-   _MIDI_Time = 0;
-   _MIDI_BeatsPerMeasure = 4;
-   _MIDI_TicksPerBeat = _MIDI_Division;
-   _MIDI_TimeBase = 4;
-
-   _MIDI_PositionInTicks = 0;
-   _MIDI_ActiveTracks    = 0;
-   _MIDI_Context         = 0;
-
-   ptr = _MIDI_TrackPtr;
-   for( i = 0; i < _MIDI_NumTracks; i++ )
-      {
-      ptr->pos                    = ptr->start;
-      ptr->delay                  = _MIDI_ReadDelta( ptr );
-      ptr->active                 = ptr->EMIDI_IncludeTrack;
-      ptr->RunningStatus          = 0;
-      ptr->currentcontext         = 0;
-      ptr->context[ 0 ].loopstart = ptr->start;
-      ptr->context[ 0 ].loopcount = 0;
-
-      if ( ptr->active )
-         {
-         _MIDI_ActiveTracks++;
-         }
-
-      ptr++;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_AdvanceTick
-
-   Increment tick counters.
----------------------------------------------------------------------*/
-
-static void _MIDI_AdvanceTick
-   (
-   void
-   )
-
-   {
-   _MIDI_PositionInTicks++;
-   _MIDI_Time += _MIDI_FPSecondsPerTick;
-
-   _MIDI_Tick++;
-   while( _MIDI_Tick > _MIDI_TicksPerBeat )
-      {
-      _MIDI_Tick -= _MIDI_TicksPerBeat;
-      _MIDI_Beat++;
-      }
-   while( _MIDI_Beat > _MIDI_BeatsPerMeasure )
-      {
-      _MIDI_Beat -= _MIDI_BeatsPerMeasure;
-      _MIDI_Measure++;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_SysEx
-
-   Interpret SysEx Event.
----------------------------------------------------------------------*/
-
-static void _MIDI_SysEx
-   (
-   track *Track
-   )
-
-   {
-   int length;
-
-   length = _MIDI_ReadDelta( Track );
-   Track->pos += length;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_MetaEvent
-
-   Interpret Meta Event.
----------------------------------------------------------------------*/
-
-static void _MIDI_MetaEvent
-   (
-   track *Track
-   )
-
-   {
-   int   command;
-   int   length;
-   int   denominator;
-   long  tempo;
-
-   GET_NEXT_EVENT( Track, command );
-   GET_NEXT_EVENT( Track, length );
-
-   switch( command )
-      {
-      case MIDI_END_OF_TRACK :
-         Track->active = FALSE;
-
-         _MIDI_ActiveTracks--;
-         break;
-
-      case MIDI_TEMPO_CHANGE :
-         tempo = 60000000L / _MIDI_ReadNumber( Track->pos, 3 );
-         MIDI_SetTempo( tempo );
-         break;
-
-      case MIDI_TIME_SIGNATURE :
-         if ( ( _MIDI_Tick > 0 ) || ( _MIDI_Beat > 1 ) )
-            {
-            _MIDI_Measure++;
-            }
-
-         _MIDI_Tick = 0;
-         _MIDI_Beat = 1;
-
-         _MIDI_BeatsPerMeasure = (int)*Track->pos;
-         denominator = (int)*( Track->pos + 1 );
-         _MIDI_TimeBase = 1;
-         while( denominator > 0 )
-            {
-            _MIDI_TimeBase += _MIDI_TimeBase;
-            denominator--;
-            }
-         _MIDI_TicksPerBeat = ( _MIDI_Division * 4 ) / _MIDI_TimeBase;
-         break;
-      }
-
-   Track->pos += length;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_InterpretControllerInfo
-
-   Interprets the MIDI controller info.
----------------------------------------------------------------------*/
-
-static int _MIDI_InterpretControllerInfo
-   (
-   track *Track,
-   int   TimeSet,
-   int   channel,
-   int   c1,
-   int   c2
-   )
-
-   {
-   track *trackptr;
-   int tracknum;
-   int loopcount;
-
-   switch( c1 )
-      {
-      case MIDI_MONO_MODE_ON :
-         Track->pos++;
-         break;
-
-      case MIDI_VOLUME :
-         if ( !Track->EMIDI_VolumeChange )
-            {
-            _MIDI_SetChannelVolume( channel, c2 );
-            }
-         break;
-
-      case EMIDI_INCLUDE_TRACK :
-      case EMIDI_EXCLUDE_TRACK :
-         break;
-
-      case EMIDI_PROGRAM_CHANGE :
-         if ( Track->EMIDI_ProgramChange )
-            {
-            _MIDI_Funcs->ProgramChange( channel, MIDI_PatchMap[ c2 & 0x7f ] );
-            }
-         break;
-
-      case EMIDI_VOLUME_CHANGE :
-         if ( Track->EMIDI_VolumeChange )
-            {
-            _MIDI_SetChannelVolume( channel, c2 );
-            }
-         break;
-
-      case EMIDI_CONTEXT_START :
-         break;
-
-      case EMIDI_CONTEXT_END :
-         if ( ( Track->currentcontext == _MIDI_Context ) ||
-            ( _MIDI_Context < 0 ) ||
-            ( Track->context[ _MIDI_Context ].pos == NULL ) )
-            {
-            break;
-            }
-
-         Track->currentcontext = _MIDI_Context;
-         Track->context[ 0 ].loopstart = Track->context[ _MIDI_Context ].loopstart;
-         Track->context[ 0 ].loopcount = Track->context[ _MIDI_Context ].loopcount;
-         Track->pos           = Track->context[ _MIDI_Context ].pos;
-         Track->RunningStatus = Track->context[ _MIDI_Context ].RunningStatus;
-
-         if ( TimeSet )
-            {
-            break;
-            }
-
-         _MIDI_Time             = Track->context[ _MIDI_Context ].time;
-         _MIDI_FPSecondsPerTick = Track->context[ _MIDI_Context ].FPSecondsPerTick;
-         _MIDI_Tick             = Track->context[ _MIDI_Context ].tick;
-         _MIDI_Beat             = Track->context[ _MIDI_Context ].beat;
-         _MIDI_Measure          = Track->context[ _MIDI_Context ].measure;
-         _MIDI_BeatsPerMeasure  = Track->context[ _MIDI_Context ].BeatsPerMeasure;
-         _MIDI_TicksPerBeat     = Track->context[ _MIDI_Context ].TicksPerBeat;
-         _MIDI_TimeBase         = Track->context[ _MIDI_Context ].TimeBase;
-         TimeSet = TRUE;
-         break;
-
-      case EMIDI_LOOP_START :
-      case EMIDI_SONG_LOOP_START :
-         if ( c2 == 0 )
-            {
-            loopcount = EMIDI_INFINITE;
-            }
-         else
-            {
-            loopcount = c2;
-            }
-
-         if ( c1 == EMIDI_SONG_LOOP_START )
-            {
-            trackptr = _MIDI_TrackPtr;
-            tracknum = _MIDI_NumTracks;
-            }
-         else
-            {
-            trackptr = Track;
-            tracknum = 1;
-            }
-
-         while( tracknum > 0 )
-            {
-            trackptr->context[ 0 ].loopcount        = loopcount;
-            trackptr->context[ 0 ].pos              = trackptr->pos;
-            trackptr->context[ 0 ].loopstart        = trackptr->pos;
-            trackptr->context[ 0 ].RunningStatus    = trackptr->RunningStatus;
-            trackptr->context[ 0 ].active           = trackptr->active;
-            trackptr->context[ 0 ].delay            = trackptr->delay;
-            trackptr->context[ 0 ].time             = _MIDI_Time;
-            trackptr->context[ 0 ].FPSecondsPerTick = _MIDI_FPSecondsPerTick;
-            trackptr->context[ 0 ].tick             = _MIDI_Tick;
-            trackptr->context[ 0 ].beat             = _MIDI_Beat;
-            trackptr->context[ 0 ].measure          = _MIDI_Measure;
-            trackptr->context[ 0 ].BeatsPerMeasure  = _MIDI_BeatsPerMeasure;
-            trackptr->context[ 0 ].TicksPerBeat     = _MIDI_TicksPerBeat;
-            trackptr->context[ 0 ].TimeBase         = _MIDI_TimeBase;
-            trackptr++;
-            tracknum--;
-            }
-         break;
-
-      case EMIDI_LOOP_END :
-      case EMIDI_SONG_LOOP_END :
-         if ( ( c2 != EMIDI_END_LOOP_VALUE ) ||
-            ( Track->context[ 0 ].loopstart == NULL ) ||
-            ( Track->context[ 0 ].loopcount == 0 ) )
-            {
-            break;
-            }
-
-         if ( c1 == EMIDI_SONG_LOOP_END )
-            {
-            trackptr = _MIDI_TrackPtr;
-            tracknum = _MIDI_NumTracks;
-            _MIDI_ActiveTracks = 0;
-            }
-         else
-            {
-            trackptr = Track;
-            tracknum = 1;
-            _MIDI_ActiveTracks--;
-            }
-
-         while( tracknum > 0 )
-            {
-            if ( trackptr->context[ 0 ].loopcount != EMIDI_INFINITE )
-               {
-               trackptr->context[ 0 ].loopcount--;
-               }
-
-            trackptr->pos           = trackptr->context[ 0 ].loopstart;
-            trackptr->RunningStatus = trackptr->context[ 0 ].RunningStatus;
-            trackptr->delay         = trackptr->context[ 0 ].delay;
-            trackptr->active        = trackptr->context[ 0 ].active;
-            if ( trackptr->active )
-               {
-               _MIDI_ActiveTracks++;
-               }
-
-            if ( !TimeSet )
-               {
-               _MIDI_Time             = trackptr->context[ 0 ].time;
-               _MIDI_FPSecondsPerTick = trackptr->context[ 0 ].FPSecondsPerTick;
-               _MIDI_Tick             = trackptr->context[ 0 ].tick;
-               _MIDI_Beat             = trackptr->context[ 0 ].beat;
-               _MIDI_Measure          = trackptr->context[ 0 ].measure;
-               _MIDI_BeatsPerMeasure  = trackptr->context[ 0 ].BeatsPerMeasure;
-               _MIDI_TicksPerBeat     = trackptr->context[ 0 ].TicksPerBeat;
-               _MIDI_TimeBase         = trackptr->context[ 0 ].TimeBase;
-               TimeSet = TRUE;
-               }
-
-            trackptr++;
-            tracknum--;
-            }
-         break;
-
-      default :
-         if ( _MIDI_Funcs->ControlChange )
-            {
-            _MIDI_Funcs->ControlChange( channel, c1, c2 );
-            }
-      }
-
-   return TimeSet;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_ServiceRoutine
-
-   Task that interperates the MIDI data.
----------------------------------------------------------------------*/
-// NOTE: We have to use a stack frame here because of a strange bug
-// that occurs with Watcom.  This means that we cannot access Task!
-//Turned off to test if it works with Watcom 10a
-//#pragma aux _MIDI_ServiceRoutine frame;
-/*
-static void test
-   (
-   task *Task
-   )
-   {
-   _MIDI_ServiceRoutine( Task );
-   _MIDI_ServiceRoutine( Task );
-   _MIDI_ServiceRoutine( Task );
-   _MIDI_ServiceRoutine( Task );
-   }
-*/
-static void _MIDI_ServiceRoutine
-   (
-   task *Task
-   )
-
-   {
-   int   event;
-   int   channel;
-   int   command;
-   track *Track;
-   int   tracknum;
-   int   status;
-   int   c1;
-   int   c2;
-   int   TimeSet = FALSE;
-
-   if ( !_MIDI_SongActive )
-      {
-      return;
-      }
-
-   Track = _MIDI_TrackPtr;
-   tracknum = 0;
-   while( tracknum < _MIDI_NumTracks )
-      {
-      while ( ( Track->active ) && ( Track->delay == 0 ) )
-         {
-         GET_NEXT_EVENT( Track, event );
-
-         if ( GET_MIDI_COMMAND( event ) == MIDI_SPECIAL )
-            {
-            switch( event )
-               {
-               case MIDI_SYSEX :
-               case MIDI_SYSEX_CONTINUE :
-                  _MIDI_SysEx( Track );
-                  break;
-
-               case MIDI_META_EVENT :
-                  _MIDI_MetaEvent( Track );
-                  break;
-               }
-
-            if ( Track->active )
-               {
-               Track->delay = _MIDI_ReadDelta( Track );
-               }
-
-            continue;
-            }
-
-         if ( event & MIDI_RUNNING_STATUS )
-            {
-            Track->RunningStatus = event;
-            }
-         else
-            {
-            event = Track->RunningStatus;
-            Track->pos--;
-            }
-
-         channel = GET_MIDI_CHANNEL( event );
-         command = GET_MIDI_COMMAND( event );
-
-         if ( _MIDI_CommandLengths[ command ] > 0 )
-            {
-            GET_NEXT_EVENT( Track, c1 );
-            if ( _MIDI_CommandLengths[ command ] > 1 )
-               {
-               GET_NEXT_EVENT( Track, c2 );
-               }
-            }
-
-         if ( _MIDI_RerouteFunctions[ channel ] != NULL )
-            {
-            status = _MIDI_RerouteFunctions[ channel ]( event, c1, c2 );
-
-            if ( status == MIDI_DONT_PLAY )
-               {
-               Track->delay = _MIDI_ReadDelta( Track );
-               continue;
-               }
-            }
-
-         switch ( command )
-            {
-            case MIDI_NOTE_OFF :
-               if ( _MIDI_Funcs->NoteOff )
-                  {
-                  _MIDI_Funcs->NoteOff( channel, c1, c2 );
-                  }
-               break;
-
-            case MIDI_NOTE_ON :
-               if ( _MIDI_Funcs->NoteOn )
-                  {
-                  _MIDI_Funcs->NoteOn( channel, c1, c2 );
-                  }
-               break;
-
-            case MIDI_POLY_AFTER_TCH :
-               if ( _MIDI_Funcs->PolyAftertouch )
-                  {
-                  _MIDI_Funcs->PolyAftertouch( channel, c1, c2 );
-                  }
-               break;
-
-            case MIDI_CONTROL_CHANGE :
-               TimeSet = _MIDI_InterpretControllerInfo( Track, TimeSet,
-                  channel, c1, c2 );
-               break;
-
-            case MIDI_PROGRAM_CHANGE :
-               if ( ( _MIDI_Funcs->ProgramChange ) &&
-                  ( !Track->EMIDI_ProgramChange ) )
-                  {
-                  _MIDI_Funcs->ProgramChange( channel, MIDI_PatchMap[ c1 & 0x7f ] );
-                  }
-               break;
-
-            case MIDI_AFTER_TOUCH :
-               if ( _MIDI_Funcs->ChannelAftertouch )
-                  {
-                  _MIDI_Funcs->ChannelAftertouch( channel, c1 );
-                  }
-               break;
-
-            case MIDI_PITCH_BEND :
-               if ( _MIDI_Funcs->PitchBend )
-                  {
-                  _MIDI_Funcs->PitchBend( channel, c1, c2 );
-                  }
-               break;
-
-            default :
-               break;
-            }
-
-         Track->delay = _MIDI_ReadDelta( Track );
-         }
-
-      Track->delay--;
-      Track++;
-      tracknum++;
-
-      if ( _MIDI_ActiveTracks == 0 )
-         {
-         _MIDI_ResetTracks();
-         if ( _MIDI_Loop )
-            {
-            tracknum = 0;
-            Track = _MIDI_TrackPtr;
-            }
-         else
-            {
-            _MIDI_SongActive = FALSE;
-            break;
-            }
-         }
-      }
-
-   _MIDI_AdvanceTick();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_SendControlChange
-
-   Sends a control change to the proper device
----------------------------------------------------------------------*/
-
-static int _MIDI_SendControlChange
-   (
-   int channel,
-   int c1,
-   int c2
-   )
-
-   {
-   int status;
-
-   if ( _MIDI_RerouteFunctions[ channel ] != NULL )
-      {
-      status = _MIDI_RerouteFunctions[ channel ]( 0xB0 + channel,
-         c1, c2 );
-      if ( status == MIDI_DONT_PLAY )
-         {
-         return( MIDI_Ok );
-         }
-      }
-
-   if ( _MIDI_Funcs == NULL )
-      {
-      return( MIDI_Error );
-      }
-
-   if ( _MIDI_Funcs->ControlChange == NULL )
-      {
-      return( MIDI_Error );
-      }
-
-   _MIDI_Funcs->ControlChange( channel, c1, c2 );
-
-   return( MIDI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_RerouteMidiChannel
-
-   Sets callback function to reroute MIDI commands from specified
-   function.
----------------------------------------------------------------------*/
-
-void MIDI_RerouteMidiChannel
-   (
-   int channel,
-   int cdecl ( *function )( int event, int c1, int c2 )
-   )
-
-   {
-   if ( ( channel >= 1 ) && ( channel <= 16 ) )
-      {
-      _MIDI_RerouteFunctions[ channel - 1 ] = function;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_AllNotesOff
-
-   Sends all notes off commands on all midi channels.
----------------------------------------------------------------------*/
-
-int MIDI_AllNotesOff
-   (
-   void
-   )
-
-   {
-   int channel;
-
-   for( channel = 0; channel < NUM_MIDI_CHANNELS; channel++ )
-      {
-      _MIDI_SendControlChange( channel, 0x40, 0 );
-      _MIDI_SendControlChange( channel, MIDI_ALL_NOTES_OFF, 0 );
-      _MIDI_SendControlChange( channel, 0x78, 0 );
-      }
-
-   return( MIDI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_SetChannelVolume
-
-   Sets the volume of the specified midi channel.
----------------------------------------------------------------------*/
-
-static void _MIDI_SetChannelVolume
-   (
-   int channel,
-   int volume
-   )
-
-   {
-   int status;
-   int remotevolume;
-
-   _MIDI_ChannelVolume[ channel ] = volume;
-
-   if ( _MIDI_RerouteFunctions[ channel ] != NULL )
-      {
-      remotevolume = volume * _MIDI_TotalVolume;
-      remotevolume *= _MIDI_UserChannelVolume[ channel ];
-      remotevolume /= MIDI_MaxVolume;
-      remotevolume >>= 8;
-
-      status = _MIDI_RerouteFunctions[ channel ]( 0xB0 + channel,
-         MIDI_VOLUME, remotevolume );
-      if ( status == MIDI_DONT_PLAY )
-         {
-         return;
-         }
-      }
-
-   if ( _MIDI_Funcs == NULL )
-      {
-      return;
-      }
-
-   if ( _MIDI_Funcs->ControlChange == NULL )
-      {
-      return;
-      }
-
-   // For user volume
-   volume *= _MIDI_UserChannelVolume[ channel ];
-
-   if ( _MIDI_Funcs->SetVolume == NULL )
-      {
-      volume *= _MIDI_TotalVolume;
-      volume /= MIDI_MaxVolume;
-      }
-
-   // For user volume
-   volume >>= 8;
-
-   _MIDI_Funcs->ControlChange( channel, MIDI_VOLUME, volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetUserChannelVolume
-
-   Sets the volume of the specified midi channel.
----------------------------------------------------------------------*/
-
-void MIDI_SetUserChannelVolume
-   (
-   int channel,
-   int volume
-   )
-
-   {
-   // Convert channel from 1-16 to 0-15
-   channel--;
-
-   volume = max( 0, volume );
-   volume = min( volume, 256 );
-
-   if ( ( channel >= 0 ) && ( channel < NUM_MIDI_CHANNELS ) )
-      {
-      _MIDI_UserChannelVolume[ channel ] = volume;
-      _MIDI_SetChannelVolume( channel, _MIDI_ChannelVolume[ channel ] );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_ResetUserChannelVolume
-
-   Sets the volume of the specified midi channel.
----------------------------------------------------------------------*/
-
-void MIDI_ResetUserChannelVolume
-   (
-   void
-   )
-
-   {
-   int channel;
-
-   for( channel = 0; channel < NUM_MIDI_CHANNELS; channel++ )
-      {
-      _MIDI_UserChannelVolume[ channel ] = 256;
-      }
-
-   _MIDI_SendChannelVolumes();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_SendChannelVolumes
-
-   Sets the volume on all the midi channels.
----------------------------------------------------------------------*/
-
-static void _MIDI_SendChannelVolumes
-   (
-   void
-   )
-
-   {
-   int channel;
-
-   for( channel = 0; channel < NUM_MIDI_CHANNELS; channel++ )
-      {
-      _MIDI_SetChannelVolume( channel, _MIDI_ChannelVolume[ channel ] );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_Reset
-
-   Resets the MIDI device to General Midi defaults.
----------------------------------------------------------------------*/
-
-int MIDI_Reset
-   (
-   void
-   )
-
-   {
-   int channel;
-   long time;
-   unsigned flags;
-
-   MIDI_AllNotesOff();
-
-   flags = DisableInterrupts();
-   _enable();
-   time = clock() + CLOCKS_PER_SEC/24;
-   while(clock() < time)
-      ;
-
-   RestoreInterrupts( flags );
-
-   for( channel = 0; channel < NUM_MIDI_CHANNELS; channel++ )
-      {
-      _MIDI_SendControlChange( channel, MIDI_RESET_ALL_CONTROLLERS, 0 );
-      _MIDI_SendControlChange( channel, MIDI_RPN_MSB, MIDI_PITCHBEND_MSB );
-      _MIDI_SendControlChange( channel, MIDI_RPN_LSB, MIDI_PITCHBEND_LSB );
-      _MIDI_SendControlChange( channel, MIDI_DATAENTRY_MSB, 2 ); /* Pitch Bend Sensitivity MSB */
-      _MIDI_SendControlChange( channel, MIDI_DATAENTRY_LSB, 0 ); /* Pitch Bend Sensitivity LSB */
-      _MIDI_ChannelVolume[ channel ] = GENMIDI_DefaultVolume;
-      }
-
-   _MIDI_SendChannelVolumes();
-
-   Reset = TRUE;
-
-   return( MIDI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetVolume
-
-   Sets the total volume of the music.
----------------------------------------------------------------------*/
-
-int MIDI_SetVolume
-   (
-   int volume
-   )
-
-   {
-   int i;
-
-   if ( _MIDI_Funcs == NULL )
-      {
-      return( MIDI_NullMidiModule );
-      }
-
-   volume = min( MIDI_MaxVolume, volume );
-   volume = max( 0, volume );
-
-   _MIDI_TotalVolume = volume;
-
-   if ( _MIDI_Funcs->SetVolume )
-      {
-      _MIDI_Funcs->SetVolume( volume );
-
-      for( i = 0; i < NUM_MIDI_CHANNELS; i++ )
-         {
-         if ( _MIDI_RerouteFunctions[ i ] != NULL )
-            {
-            _MIDI_SetChannelVolume( i, _MIDI_ChannelVolume[ i ] );
-            }
-         }
-      }
-   else
-      {
-      _MIDI_SendChannelVolumes();
-      }
-
-   return( MIDI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_GetVolume
-
-   Returns the total volume of the music.
----------------------------------------------------------------------*/
-
-int MIDI_GetVolume
-   (
-   void
-   )
-
-   {
-   int volume;
-
-   if ( _MIDI_Funcs == NULL )
-      {
-      return( MIDI_NullMidiModule );
-      }
-
-   if ( _MIDI_Funcs->GetVolume )
-      {
-      volume = _MIDI_Funcs->GetVolume();
-      }
-   else
-      {
-      volume = _MIDI_TotalVolume;
-      }
-
-   return( volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetContext
-
-   Sets the song context.
----------------------------------------------------------------------*/
-
-void MIDI_SetContext
-   (
-   int context
-   )
-
-   {
-   if ( ( context > 0 ) && ( context < EMIDI_NUM_CONTEXTS ) )
-      {
-      _MIDI_Context = context;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_GetContext
-
-   Returns the current song context.
----------------------------------------------------------------------*/
-
-int MIDI_GetContext
-   (
-   void
-   )
-
-   {
-   return _MIDI_Context;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetLoopFlag
-
-   Sets whether the song should loop when finished or not.
----------------------------------------------------------------------*/
-
-void MIDI_SetLoopFlag
-   (
-   int loopflag
-   )
-
-   {
-   _MIDI_Loop = loopflag;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_ContinueSong
-
-   Continues playback of a paused song.
----------------------------------------------------------------------*/
-
-void MIDI_ContinueSong
-   (
-   void
-   )
-
-   {
-   if ( _MIDI_SongLoaded )
-      {
-      _MIDI_SongActive = TRUE;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_PauseSong
-
-   Pauses playback of the current song.
----------------------------------------------------------------------*/
-
-void MIDI_PauseSong
-   (
-   void
-   )
-
-   {
-   if ( _MIDI_SongLoaded )
-      {
-      _MIDI_SongActive = FALSE;
-      MIDI_AllNotesOff();
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SongPlaying
-
-   Returns whether a song is playing or not.
----------------------------------------------------------------------*/
-
-int MIDI_SongPlaying
-   (
-   void
-   )
-
-   {
-   return( _MIDI_SongActive );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetMidiFuncs
-
-   Selects the routines that send the MIDI data to the music device.
----------------------------------------------------------------------*/
-
-void MIDI_SetMidiFuncs
-   (
-   midifuncs *funcs
-   )
-
-   {
-   _MIDI_Funcs = funcs;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_StopSong
-
-   Stops playback of the currently playing song.
----------------------------------------------------------------------*/
-
-void MIDI_StopSong
-   (
-   void
-   )
-
-   {
-   if ( _MIDI_SongLoaded )
-      {
-      TS_Terminate( _MIDI_PlayRoutine );
-
-      _MIDI_PlayRoutine = NULL;
-      _MIDI_SongActive = FALSE;
-      _MIDI_SongLoaded = FALSE;
-
-      MIDI_Reset();
-      _MIDI_ResetTracks();
-
-      if ( _MIDI_Funcs->ReleasePatches )
-         {
-         _MIDI_Funcs->ReleasePatches();
-         }
-
-      DPMI_UnlockMemory( _MIDI_TrackPtr, _MIDI_TrackMemSize );
-      USRHOOKS_FreeMem( _MIDI_TrackPtr );
-
-      _MIDI_TrackPtr     = NULL;
-      _MIDI_NumTracks    = 0;
-      _MIDI_TrackMemSize = 0;
-
-      _MIDI_TotalTime     = 0;
-      _MIDI_TotalTicks    = 0;
-      _MIDI_TotalBeats    = 0;
-      _MIDI_TotalMeasures = 0;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_PlaySong
-
-   Begins playback of a MIDI song.
----------------------------------------------------------------------*/
-
-int MIDI_PlaySong
-   (
-   unsigned char *song,
-   int loopflag
-   )
-
-   {
-   int    numtracks;
-   int    format;
-   long   headersize;
-   long   tracklength;
-   track *CurrentTrack;
-   unsigned char *ptr;
-   int    status;
-
-   if ( _MIDI_SongLoaded )
-      {
-      MIDI_StopSong();
-      }
-
-   _MIDI_Loop = loopflag;
-
-   if ( _MIDI_Funcs == NULL )
-      {
-      return( MIDI_NullMidiModule );
-      }
-
-   if ( *( unsigned long * )song != MIDI_HEADER_SIGNATURE )
-      {
-      return( MIDI_InvalidMidiFile );
-      }
-
-   song += 4;
-
-   headersize      = _MIDI_ReadNumber( song, 4 );
-   song += 4;
-   format          = _MIDI_ReadNumber( song, 2 );
-   _MIDI_NumTracks = _MIDI_ReadNumber( song + 2, 2 );
-   _MIDI_Division  = _MIDI_ReadNumber( song + 4, 2 );
-   if ( _MIDI_Division < 0 )
-      {
-      // If a SMPTE time division is given, just set to 96 so no errors occur
-      _MIDI_Division = 96;
-      }
-
-   if ( format > MAX_FORMAT )
-      {
-      return( MIDI_UnknownMidiFormat );
-      }
-
-   ptr = song + headersize;
-
-   if ( _MIDI_NumTracks == 0 )
-      {
-      return( MIDI_NoTracks );
-      }
-
-   _MIDI_TrackMemSize = _MIDI_NumTracks  * sizeof( track );
-   status = USRHOOKS_GetMem( &_MIDI_TrackPtr, _MIDI_TrackMemSize );
-   if ( status != USRHOOKS_Ok )
-      {
-      return( MIDI_NoMemory );
-      }
-
-   status = DPMI_LockMemory( _MIDI_TrackPtr, _MIDI_TrackMemSize );
-   if ( status != DPMI_Ok )
-      {
-      USRHOOKS_FreeMem( _MIDI_TrackPtr );
-
-      _MIDI_TrackPtr     = NULL;
-      _MIDI_TrackMemSize = 0;
-      _MIDI_NumTracks    = 0;
-//      MIDI_SetErrorCode( MIDI_DPMI_Error );
-      return( MIDI_Error );
-      }
-
-   CurrentTrack = _MIDI_TrackPtr;
-   numtracks    = _MIDI_NumTracks;
-   while( numtracks-- )
-      {
-      if ( *( unsigned long * )ptr != MIDI_TRACK_SIGNATURE )
-         {
-         DPMI_UnlockMemory( _MIDI_TrackPtr, _MIDI_TrackMemSize );
-
-         USRHOOKS_FreeMem( _MIDI_TrackPtr );
-
-         _MIDI_TrackPtr = NULL;
-         _MIDI_TrackMemSize = 0;
-
-         return( MIDI_InvalidTrack );
-         }
-
-      tracklength = _MIDI_ReadNumber( ptr + 4, 4 );
-      ptr += 8;
-      CurrentTrack->start = ptr;
-      ptr += tracklength;
-      CurrentTrack++;
-      }
-
-   if ( _MIDI_Funcs->GetVolume != NULL )
-      {
-      _MIDI_TotalVolume = _MIDI_Funcs->GetVolume();
-      }
-
-   _MIDI_InitEMIDI();
-
-   if ( _MIDI_Funcs->LoadPatch )
-      {
-      MIDI_LoadTimbres();
-      }
-
-   _MIDI_ResetTracks();
-
-   if ( !Reset )
-      {
-      MIDI_Reset();
-      }
-
-   Reset = FALSE;
-
-   _MIDI_PlayRoutine = TS_ScheduleTask( _MIDI_ServiceRoutine, 100, 1, NULL );
-//   _MIDI_PlayRoutine = TS_ScheduleTask( test, 100, 1, NULL );
-   MIDI_SetTempo( 120 );
-   TS_Dispatch();
-
-   _MIDI_SongLoaded = TRUE;
-   _MIDI_SongActive = TRUE;
-
-   return( MIDI_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetTempo
-
-   Sets the song tempo.
----------------------------------------------------------------------*/
-
-void MIDI_SetTempo
-   (
-   int tempo
-   )
-
-   {
-   long tickspersecond;
-
-   MIDI_Tempo = tempo;
-   tickspersecond = ( tempo * _MIDI_Division ) / 60;
-   if ( _MIDI_PlayRoutine != NULL )
-      {
-      TS_SetTaskRate( _MIDI_PlayRoutine, tickspersecond );
-//      TS_SetTaskRate( _MIDI_PlayRoutine, tickspersecond / 4 );
-      }
-   _MIDI_FPSecondsPerTick = ( 1 << TIME_PRECISION ) / tickspersecond;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_GetTempo
-
-   Returns the song tempo.
----------------------------------------------------------------------*/
-
-int MIDI_GetTempo
-   (
-   void
-   )
-
-   {
-   return( MIDI_Tempo );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: _MIDI_ProcessNextTick
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-static int _MIDI_ProcessNextTick
-   (
-   void
-   )
-
-   {
-   int   event;
-   int   channel;
-   int   command;
-   track *Track;
-   int   tracknum;
-   int   status;
-   int   c1;
-   int   c2;
-   int   TimeSet = FALSE;
-
-   Track = _MIDI_TrackPtr;
-   tracknum = 0;
-   while( ( tracknum < _MIDI_NumTracks ) && ( Track != NULL ) )
-      {
-      while ( ( Track->active ) && ( Track->delay == 0 ) )
-         {
-         GET_NEXT_EVENT( Track, event );
-
-         if ( GET_MIDI_COMMAND( event ) == MIDI_SPECIAL )
-            {
-            switch( event )
-               {
-               case MIDI_SYSEX :
-               case MIDI_SYSEX_CONTINUE :
-                  _MIDI_SysEx( Track );
-                  break;
-
-               case MIDI_META_EVENT :
-                  _MIDI_MetaEvent( Track );
-                  break;
-               }
-
-            if ( Track->active )
-               {
-               Track->delay = _MIDI_ReadDelta( Track );
-               }
-
-            continue;
-            }
-
-         if ( event & MIDI_RUNNING_STATUS )
-            {
-            Track->RunningStatus = event;
-            }
-         else
-            {
-            event = Track->RunningStatus;
-            Track->pos--;
-            }
-
-         channel = GET_MIDI_CHANNEL( event );
-         command = GET_MIDI_COMMAND( event );
-
-         if ( _MIDI_CommandLengths[ command ] > 0 )
-            {
-            GET_NEXT_EVENT( Track, c1 );
-            if ( _MIDI_CommandLengths[ command ] > 1 )
-               {
-               GET_NEXT_EVENT( Track, c2 );
-               }
-            }
-
-         if ( _MIDI_RerouteFunctions[ channel ] != NULL )
-            {
-            status = _MIDI_RerouteFunctions[ channel ]( event, c1, c2 );
-
-            if ( status == MIDI_DONT_PLAY )
-               {
-               Track->delay = _MIDI_ReadDelta( Track );
-               continue;
-               }
-            }
-
-         switch ( command )
-            {
-            case MIDI_NOTE_OFF :
-               break;
-
-            case MIDI_NOTE_ON :
-               break;
-
-            case MIDI_POLY_AFTER_TCH :
-               if ( _MIDI_Funcs->PolyAftertouch )
-                  {
-                  _MIDI_Funcs->PolyAftertouch( channel, c1, c2 );
-                  }
-               break;
-
-            case MIDI_CONTROL_CHANGE :
-               TimeSet = _MIDI_InterpretControllerInfo( Track, TimeSet,
-                  channel, c1, c2 );
-               break;
-
-            case MIDI_PROGRAM_CHANGE :
-               if ( ( _MIDI_Funcs->ProgramChange ) &&
-                  ( !Track->EMIDI_ProgramChange ) )
-                  {
-                  _MIDI_Funcs->ProgramChange( channel, c1 );
-                  }
-               break;
-
-            case MIDI_AFTER_TOUCH :
-               if ( _MIDI_Funcs->ChannelAftertouch )
-                  {
-                  _MIDI_Funcs->ChannelAftertouch( channel, c1 );
-                  }
-               break;
-
-            case MIDI_PITCH_BEND :
-               if ( _MIDI_Funcs->PitchBend )
-                  {
-                  _MIDI_Funcs->PitchBend( channel, c1, c2 );
-                  }
-               break;
-
-            default :
-               break;
-            }
-
-         Track->delay = _MIDI_ReadDelta( Track );
-         }
-
-      Track->delay--;
-      Track++;
-      tracknum++;
-
-      if ( _MIDI_ActiveTracks == 0 )
-         {
-         break;
-         }
-      }
-
-   _MIDI_AdvanceTick();
-
-   return( TimeSet );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetSongTick
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MIDI_SetSongTick
-   (
-   unsigned long PositionInTicks
-   )
-
-   {
-   if ( !_MIDI_SongLoaded )
-      {
-      return;
-      }
-
-   MIDI_PauseSong();
-
-   if ( PositionInTicks < _MIDI_PositionInTicks )
-      {
-      _MIDI_ResetTracks();
-      MIDI_Reset();
-      }
-
-   while( _MIDI_PositionInTicks < PositionInTicks )
-      {
-      if ( _MIDI_ProcessNextTick() )
-         {
-         break;
-         }
-      if ( _MIDI_ActiveTracks == 0 )
-         {
-         _MIDI_ResetTracks();
-         if ( !_MIDI_Loop )
-            {
-            return;
-            }
-         break;
-         }
-      }
-
-   MIDI_SetVolume( _MIDI_TotalVolume );
-   MIDI_ContinueSong();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetSongTime
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MIDI_SetSongTime
-   (
-   unsigned long milliseconds
-   )
-
-   {
-   unsigned long mil;
-   unsigned long sec;
-   unsigned long newtime;
-
-   if ( !_MIDI_SongLoaded )
-      {
-      return;
-      }
-
-   MIDI_PauseSong();
-
-   mil = ( ( milliseconds % 1000 ) << TIME_PRECISION ) / 1000;
-   sec = ( milliseconds / 1000 ) << TIME_PRECISION;
-   newtime = sec + mil;
-
-   if ( newtime < _MIDI_Time )
-      {
-      _MIDI_ResetTracks();
-      MIDI_Reset();
-      }
-
-   while( _MIDI_Time < newtime )
-      {
-      if ( _MIDI_ProcessNextTick() )
-         {
-         break;
-         }
-      if ( _MIDI_ActiveTracks == 0 )
-         {
-         _MIDI_ResetTracks();
-         if ( !_MIDI_Loop )
-            {
-            return;
-            }
-         break;
-         }
-      }
-
-   MIDI_SetVolume( _MIDI_TotalVolume );
-   MIDI_ContinueSong();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_SetSongPosition
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MIDI_SetSongPosition
-   (
-   int measure,
-   int beat,
-   int tick
-   )
-
-   {
-   unsigned long pos;
-
-   if ( !_MIDI_SongLoaded )
-      {
-      return;
-      }
-
-   MIDI_PauseSong();
-
-   pos = RELATIVE_BEAT( measure, beat, tick );
-
-   if ( pos < RELATIVE_BEAT( _MIDI_Measure, _MIDI_Beat, _MIDI_Tick ) )
-      {
-      _MIDI_ResetTracks();
-      MIDI_Reset();
-      }
-
-   while( RELATIVE_BEAT( _MIDI_Measure, _MIDI_Beat, _MIDI_Tick ) < pos )
-      {
-      if ( _MIDI_ProcessNextTick() )
-         {
-         break;
-         }
-      if ( _MIDI_ActiveTracks == 0 )
-         {
-         _MIDI_ResetTracks();
-         if ( !_MIDI_Loop )
-            {
-            return;
-            }
-         break;
-         }
-      }
-
-   MIDI_SetVolume( _MIDI_TotalVolume );
-   MIDI_ContinueSong();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_GetSongPosition
-
-   Returns the position of the song pointer in Measures, beats, ticks.
----------------------------------------------------------------------*/
-
-void MIDI_GetSongPosition
-   (
-   songposition *pos
-   )
-
-   {
-   unsigned long mil;
-   unsigned long sec;
-
-   mil = ( _MIDI_Time & ( ( 1 << TIME_PRECISION ) - 1 ) ) * 1000;
-   sec = _MIDI_Time >> TIME_PRECISION;
-   pos->milliseconds = ( mil >> TIME_PRECISION ) + ( sec * 1000 );
-   pos->tickposition = _MIDI_PositionInTicks;
-   pos->measure      = _MIDI_Measure;
-   pos->beat         = _MIDI_Beat;
-   pos->tick         = _MIDI_Tick;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_GetSongLength
-
-   Returns the length of the song.
----------------------------------------------------------------------*/
-
-void MIDI_GetSongLength
-   (
-   songposition *pos
-   )
-
-   {
-   unsigned long mil;
-   unsigned long sec;
-
-   mil = ( _MIDI_TotalTime & ( ( 1 << TIME_PRECISION ) - 1 ) ) * 1000;
-   sec = _MIDI_TotalTime >> TIME_PRECISION;
-
-   pos->milliseconds = ( mil >> TIME_PRECISION ) + ( sec * 1000 );
-   pos->measure      = _MIDI_TotalMeasures;
-   pos->beat         = _MIDI_TotalBeats;
-   pos->tick         = _MIDI_TotalTicks;
-   pos->tickposition = 0;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_InitEMIDI
-
-   Sets up the EMIDI
----------------------------------------------------------------------*/
-
-static void _MIDI_InitEMIDI
-   (
-   void
-   )
-
-   {
-   int    event;
-   int    command;
-   int    channel;
-   int    length;
-   int    IncludeFound;
-   track *Track;
-   int    tracknum;
-   int    type;
-   int    c1;
-   int    c2;
-
-   type = EMIDI_GeneralMIDI;
-   switch( MUSIC_SoundDevice )
-      {
-      case SoundBlaster :
-         type = EMIDI_SoundBlaster;
-         break;
-
-      case ProAudioSpectrum :
-         type = EMIDI_ProAudio;
-         break;
-
-      case SoundMan16 :
-         type = EMIDI_SoundMan16;
-         break;
-
-      case Adlib :
-         type = EMIDI_Adlib;
-         break;
-
-      case GenMidi :
-         type = EMIDI_GeneralMIDI;
-         break;
-
-      case SoundCanvas :
-         type = EMIDI_SoundCanvas;
-         break;
-
-      case Awe32 :
-         type = EMIDI_AWE32;
-         break;
-
-      case WaveBlaster :
-         type = EMIDI_WaveBlaster;
-         break;
-
-      case SoundScape :
-         type = EMIDI_Soundscape;
-         break;
-
-      case UltraSound :
-         type = EMIDI_Ultrasound;
-         break;
-      }
-
-   _MIDI_ResetTracks();
-
-   _MIDI_TotalTime     = 0;
-   _MIDI_TotalTicks    = 0;
-   _MIDI_TotalBeats    = 0;
-   _MIDI_TotalMeasures = 0;
-
-   Track = _MIDI_TrackPtr;
-   tracknum = 0;
-   while( ( tracknum < _MIDI_NumTracks ) && ( Track != NULL ) )
-      {
-      _MIDI_Tick = 0;
-      _MIDI_Beat = 1;
-      _MIDI_Measure = 1;
-      _MIDI_Time = 0;
-      _MIDI_BeatsPerMeasure = 4;
-      _MIDI_TicksPerBeat = _MIDI_Division;
-      _MIDI_TimeBase = 4;
-
-      _MIDI_PositionInTicks = 0;
-      _MIDI_ActiveTracks    = 0;
-      _MIDI_Context         = -1;
-
-      Track->RunningStatus = 0;
-      Track->active        = TRUE;
-
-      Track->EMIDI_ProgramChange = FALSE;
-      Track->EMIDI_VolumeChange  = FALSE;
-      Track->EMIDI_IncludeTrack  = TRUE;
-
-      memset( Track->context, 0, sizeof( Track->context ) );
-
-      while( Track->delay > 0 )
-         {
-         _MIDI_AdvanceTick();
-         Track->delay--;
-         }
-
-      IncludeFound = FALSE;
-      while ( Track->active )
-         {
-         GET_NEXT_EVENT( Track, event );
-
-         if ( GET_MIDI_COMMAND( event ) == MIDI_SPECIAL )
-            {
-            switch( event )
-               {
-               case MIDI_SYSEX :
-               case MIDI_SYSEX_CONTINUE :
-                  _MIDI_SysEx( Track );
-                  break;
-
-               case MIDI_META_EVENT :
-                  _MIDI_MetaEvent( Track );
-                  break;
-               }
-
-            if ( Track->active )
-               {
-               Track->delay = _MIDI_ReadDelta( Track );
-               while( Track->delay > 0 )
-                  {
-                  _MIDI_AdvanceTick();
-                  Track->delay--;
-                  }
-               }
-
-            continue;
-            }
-
-         if ( event & MIDI_RUNNING_STATUS )
-            {
-            Track->RunningStatus = event;
-            }
-         else
-            {
-            event = Track->RunningStatus;
-            Track->pos--;
-            }
-
-         channel = GET_MIDI_CHANNEL( event );
-         command = GET_MIDI_COMMAND( event );
-         length = _MIDI_CommandLengths[ command ];
-
-         if ( command == MIDI_CONTROL_CHANGE )
-            {
-            if ( *Track->pos == MIDI_MONO_MODE_ON )
-               {
-               length++;
-               }
-            GET_NEXT_EVENT( Track, c1 );
-            GET_NEXT_EVENT( Track, c2 );
-            length -= 2;
-
-            switch( c1 )
-               {
-               case EMIDI_LOOP_START :
-               case EMIDI_SONG_LOOP_START :
-                  if ( c2 == 0 )
-                     {
-                     Track->context[ 0 ].loopcount = EMIDI_INFINITE;
-                     }
-                  else
-                     {
-                     Track->context[ 0 ].loopcount = c2;
-                     }
-
-                  Track->context[ 0 ].pos              = Track->pos;
-                  Track->context[ 0 ].loopstart        = Track->pos;
-                  Track->context[ 0 ].RunningStatus    = Track->RunningStatus;
-                  Track->context[ 0 ].time             = _MIDI_Time;
-                  Track->context[ 0 ].FPSecondsPerTick = _MIDI_FPSecondsPerTick;
-                  Track->context[ 0 ].tick             = _MIDI_Tick;
-                  Track->context[ 0 ].beat             = _MIDI_Beat;
-                  Track->context[ 0 ].measure          = _MIDI_Measure;
-                  Track->context[ 0 ].BeatsPerMeasure  = _MIDI_BeatsPerMeasure;
-                  Track->context[ 0 ].TicksPerBeat     = _MIDI_TicksPerBeat;
-                  Track->context[ 0 ].TimeBase         = _MIDI_TimeBase;
-                  break;
-
-               case EMIDI_LOOP_END :
-               case EMIDI_SONG_LOOP_END :
-                  if ( c2 == EMIDI_END_LOOP_VALUE )
-                     {
-                     Track->context[ 0 ].loopstart = NULL;
-                     Track->context[ 0 ].loopcount = 0;
-                     }
-                  break;
-
-               case EMIDI_INCLUDE_TRACK :
-                  if ( EMIDI_AffectsCurrentCard( c2, type ) )
-                     {
-                     //printf( "Include track %d on card %d\n", tracknum, c2 );
-                     IncludeFound = TRUE;
-                     Track->EMIDI_IncludeTrack = TRUE;
-                     }
-                  else if ( !IncludeFound )
-                     {
-                     //printf( "Track excluded %d on card %d\n", tracknum, c2 );
-                     IncludeFound = TRUE;
-                     Track->EMIDI_IncludeTrack = FALSE;
-                     }
-                  break;
-
-               case EMIDI_EXCLUDE_TRACK :
-                  if ( EMIDI_AffectsCurrentCard( c2, type ) )
-                     {
-                     //printf( "Exclude track %d on card %d\n", tracknum, c2 );
-                     Track->EMIDI_IncludeTrack = FALSE;
-                     }
-                  break;
-
-               case EMIDI_PROGRAM_CHANGE :
-                  if ( !Track->EMIDI_ProgramChange )
-                     //printf( "Program change on track %d\n", tracknum );
-                  Track->EMIDI_ProgramChange = TRUE;
-                  break;
-
-               case EMIDI_VOLUME_CHANGE :
-                  if ( !Track->EMIDI_VolumeChange )
-                     //printf( "Volume change on track %d\n", tracknum );
-                  Track->EMIDI_VolumeChange = TRUE;
-                  break;
-
-               case EMIDI_CONTEXT_START :
-                  if ( ( c2 > 0 ) && ( c2 < EMIDI_NUM_CONTEXTS ) )
-                     {
-                     Track->context[ c2 ].pos              = Track->pos;
-                     Track->context[ c2 ].loopstart        = Track->context[ 0 ].loopstart;
-                     Track->context[ c2 ].loopcount        = Track->context[ 0 ].loopcount;
-                     Track->context[ c2 ].RunningStatus    = Track->RunningStatus;
-                     Track->context[ c2 ].time             = _MIDI_Time;
-                     Track->context[ c2 ].FPSecondsPerTick = _MIDI_FPSecondsPerTick;
-                     Track->context[ c2 ].tick             = _MIDI_Tick;
-                     Track->context[ c2 ].beat             = _MIDI_Beat;
-                     Track->context[ c2 ].measure          = _MIDI_Measure;
-                     Track->context[ c2 ].BeatsPerMeasure  = _MIDI_BeatsPerMeasure;
-                     Track->context[ c2 ].TicksPerBeat     = _MIDI_TicksPerBeat;
-                     Track->context[ c2 ].TimeBase         = _MIDI_TimeBase;
-                     }
-                  break;
-
-               case EMIDI_CONTEXT_END :
-                  break;
-               }
-            }
-
-         Track->pos += length;
-         Track->delay = _MIDI_ReadDelta( Track );
-
-         while( Track->delay > 0 )
-            {
-            _MIDI_AdvanceTick();
-            Track->delay--;
-            }
-         }
-
-      _MIDI_TotalTime = max( _MIDI_TotalTime, _MIDI_Time );
-      if ( RELATIVE_BEAT( _MIDI_Measure, _MIDI_Beat, _MIDI_Tick ) >
-         RELATIVE_BEAT( _MIDI_TotalMeasures, _MIDI_TotalBeats,
-         _MIDI_TotalTicks ) )
-         {
-         _MIDI_TotalTicks    = _MIDI_Tick;
-         _MIDI_TotalBeats    = _MIDI_Beat;
-         _MIDI_TotalMeasures = _MIDI_Measure;
-         }
-
-      Track++;
-      tracknum++;
-      }
-
-   _MIDI_ResetTracks();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_LoadTimbres
-
-   Preloads the timbres on cards that use patch-caching.
----------------------------------------------------------------------*/
-
-void MIDI_LoadTimbres
-   (
-   void
-   )
-
-   {
-   int    event;
-   int    command;
-   int    channel;
-   int    length;
-   int    Finished;
-   track *Track;
-   int    tracknum;
-
-   Track = _MIDI_TrackPtr;
-   tracknum = 0;
-   while( ( tracknum < _MIDI_NumTracks ) && ( Track != NULL ) )
-      {
-      Finished = FALSE;
-      while ( !Finished )
-         {
-         GET_NEXT_EVENT( Track, event );
-
-         if ( GET_MIDI_COMMAND( event ) == MIDI_SPECIAL )
-            {
-            switch( event )
-               {
-               case MIDI_SYSEX :
-               case MIDI_SYSEX_CONTINUE :
-                  length = _MIDI_ReadDelta( Track );
-                  Track->pos += length;
-                  break;
-
-               case MIDI_META_EVENT :
-                  GET_NEXT_EVENT( Track, command );
-                  GET_NEXT_EVENT( Track, length );
-
-                  if ( command == MIDI_END_OF_TRACK )
-                     {
-                     Finished = TRUE;
-                     }
-
-                  Track->pos += length;
-                  break;
-               }
-
-            if ( !Finished )
-               {
-               _MIDI_ReadDelta( Track );
-               }
-
-            continue;
-            }
-
-         if ( event & MIDI_RUNNING_STATUS )
-            {
-            Track->RunningStatus = event;
-            }
-         else
-            {
-            event = Track->RunningStatus;
-            Track->pos--;
-            }
-
-         channel = GET_MIDI_CHANNEL( event );
-         command = GET_MIDI_COMMAND( event );
-         length = _MIDI_CommandLengths[ command ];
-
-         if ( command == MIDI_CONTROL_CHANGE )
-            {
-            if ( *Track->pos == MIDI_MONO_MODE_ON )
-               {
-               length++;
-               }
-
-            if ( *Track->pos == EMIDI_PROGRAM_CHANGE )
-               {
-               _MIDI_Funcs->LoadPatch( *( Track->pos + 1 ) );
-               }
-            }
-
-         if ( channel == MIDI_RHYTHM_CHANNEL )
-            {
-            if ( command == MIDI_NOTE_ON )
-               {
-               _MIDI_Funcs->LoadPatch( 128 + *Track->pos );
-               }
-            }
-         else
-            {
-            if ( command == MIDI_PROGRAM_CHANGE )
-               {
-               _MIDI_Funcs->LoadPatch( *Track->pos );
-               }
-            }
-         Track->pos += length;
-         _MIDI_ReadDelta( Track );
-         }
-      Track++;
-      tracknum++;
-      }
-
-   _MIDI_ResetTracks();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void MIDI_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-void MIDI_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( MIDI_LockStart, MIDI_LockEnd );
-   DPMI_UnlockMemory( ( void * )&_MIDI_CommandLengths[ 0 ],
-      sizeof( _MIDI_CommandLengths ) );
-   DPMI_Unlock( _MIDI_TrackPtr );
-   DPMI_Unlock( _MIDI_NumTracks );
-   DPMI_Unlock( _MIDI_SongActive );
-   DPMI_Unlock( _MIDI_SongLoaded );
-   DPMI_Unlock( _MIDI_Loop );
-   DPMI_Unlock( _MIDI_PlayRoutine );
-   DPMI_Unlock( _MIDI_Division );
-   DPMI_Unlock( _MIDI_ActiveTracks );
-   DPMI_Unlock( _MIDI_TotalVolume );
-   DPMI_Unlock( _MIDI_ChannelVolume );
-   DPMI_Unlock( _MIDI_Funcs );
-   DPMI_Unlock( _MIDI_PositionInTicks );
-   DPMI_Unlock( _MIDI_Division );
-   DPMI_Unlock( _MIDI_Tick );
-   DPMI_Unlock( _MIDI_Beat );
-   DPMI_Unlock( _MIDI_Measure );
-   DPMI_Unlock( _MIDI_Time );
-   DPMI_Unlock( _MIDI_BeatsPerMeasure );
-   DPMI_Unlock( _MIDI_TicksPerBeat );
-   DPMI_Unlock( _MIDI_TimeBase );
-   DPMI_Unlock( _MIDI_FPSecondsPerTick );
-   DPMI_Unlock( _MIDI_Context );
-   DPMI_Unlock( _MIDI_TotalTime );
-   DPMI_Unlock( _MIDI_TotalTicks );
-   DPMI_Unlock( _MIDI_TotalBeats );
-   DPMI_Unlock( _MIDI_TotalMeasures );
-   DPMI_Unlock( MIDI_Tempo );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MIDI_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int MIDI_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( MIDI_LockStart, MIDI_LockEnd );
-   status |= DPMI_LockMemory( ( void * )&_MIDI_CommandLengths[ 0 ],
-      sizeof( _MIDI_CommandLengths ) );
-   status |= DPMI_Lock( _MIDI_TrackPtr );
-   status |= DPMI_Lock( _MIDI_NumTracks );
-   status |= DPMI_Lock( _MIDI_SongActive );
-   status |= DPMI_Lock( _MIDI_SongLoaded );
-   status |= DPMI_Lock( _MIDI_Loop );
-   status |= DPMI_Lock( _MIDI_PlayRoutine );
-   status |= DPMI_Lock( _MIDI_Division );
-   status |= DPMI_Lock( _MIDI_ActiveTracks );
-   status |= DPMI_Lock( _MIDI_TotalVolume );
-   status |= DPMI_Lock( _MIDI_ChannelVolume );
-   status |= DPMI_Lock( _MIDI_Funcs );
-   status |= DPMI_Lock( _MIDI_PositionInTicks );
-   status |= DPMI_Lock( _MIDI_Division );
-   status |= DPMI_Lock( _MIDI_Tick );
-   status |= DPMI_Lock( _MIDI_Beat );
-   status |= DPMI_Lock( _MIDI_Measure );
-   status |= DPMI_Lock( _MIDI_Time );
-   status |= DPMI_Lock( _MIDI_BeatsPerMeasure );
-   status |= DPMI_Lock( _MIDI_TicksPerBeat );
-   status |= DPMI_Lock( _MIDI_TimeBase );
-   status |= DPMI_Lock( _MIDI_FPSecondsPerTick );
-   status |= DPMI_Lock( _MIDI_Context );
-   status |= DPMI_Lock( _MIDI_TotalTime );
-   status |= DPMI_Lock( _MIDI_TotalTicks );
-   status |= DPMI_Lock( _MIDI_TotalBeats );
-   status |= DPMI_Lock( _MIDI_TotalMeasures );
-   status |= DPMI_Lock( MIDI_Tempo );
-
-   if ( status != DPMI_Ok )
-      {
-      MIDI_UnlockMemory();
-//      MIDI_SetErrorCode( MIDI_DPMI_Error );
-      return( MIDI_Error );
-      }
-
-   return( MIDI_Ok );
-   }
--- a/src/audiolib/midi.h
+++ /dev/null
@@ -1,96 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: MIDI.H
-
-   author: James R. Dose
-   date:   May 25, 1994
-
-   Public header for MIDI.C.  Midi song file playback routines.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __MIDI_H
-#define __MIDI_H
-
-enum MIDI_Errors
-   {
-   MIDI_Warning = -2,
-   MIDI_Error   = -1,
-   MIDI_Ok      = 0,
-   MIDI_NullMidiModule,
-   MIDI_InvalidMidiFile,
-   MIDI_UnknownMidiFormat,
-   MIDI_NoTracks,
-   MIDI_InvalidTrack,
-   MIDI_NoMemory,
-   MIDI_DPMI_Error
-   };
-
-
-#define MIDI_PASS_THROUGH 1
-#define MIDI_DONT_PLAY    0
-
-#define MIDI_MaxVolume 255
-
-extern char MIDI_PatchMap[ 128 ];
-
-typedef struct
-   {
-   void ( *NoteOff )( int channel, int key, int velocity );
-   void ( *NoteOn )( int channel, int key, int velocity );
-   void ( *PolyAftertouch )( int channel, int key, int pressure );
-   void ( *ControlChange )( int channel, int number, int value );
-   void ( *ProgramChange )( int channel, int program );
-   void ( *ChannelAftertouch )( int channel, int pressure );
-   void ( *PitchBend )( int channel, int lsb, int msb );
-   void ( *ReleasePatches )( void );
-   void ( *LoadPatch )( int number );
-   void ( *SetVolume )( int volume );
-   int  ( *GetVolume )( void );
-   } midifuncs;
-
-void MIDI_RerouteMidiChannel( int channel, int cdecl ( *function )( int event, int c1, int c2 ) );
-int  MIDI_AllNotesOff( void );
-void MIDI_SetUserChannelVolume( int channel, int volume );
-void MIDI_ResetUserChannelVolume( void );
-int  MIDI_Reset( void );
-int  MIDI_SetVolume( int volume );
-int  MIDI_GetVolume( void );
-void MIDI_SetMidiFuncs( midifuncs *funcs );
-void MIDI_SetContext( int context );
-int  MIDI_GetContext( void );
-void MIDI_SetLoopFlag( int loopflag );
-void MIDI_ContinueSong( void );
-void MIDI_PauseSong( void );
-int  MIDI_SongPlaying( void );
-void MIDI_StopSong( void );
-int  MIDI_PlaySong( unsigned char *song, int loopflag );
-void MIDI_SetTempo( int tempo );
-int  MIDI_GetTempo( void );
-void MIDI_SetSongTick( unsigned long PositionInTicks );
-void MIDI_SetSongTime( unsigned long milliseconds );
-void MIDI_SetSongPosition( int measure, int beat, int tick );
-void MIDI_GetSongPosition( songposition *pos );
-void MIDI_GetSongLength( songposition *pos );
-void MIDI_LoadTimbres( void );
-void MIDI_UnlockMemory( void );
-int  MIDI_LockMemory( void );
-
-#endif
--- a/src/audiolib/mpu401.c
+++ /dev/null
@@ -1,449 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: MPU401.C
-
-   author: James R. Dose
-   date:   January 1, 1994
-
-   Low level routines to support sending of MIDI data to MPU401
-   compatible MIDI interfaces.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <conio.h>
-#include <dos.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "dpmi.h"
-#include "user.h"
-#include "mpu401.h"
-
-#define MIDI_NOTE_OFF         0x80
-#define MIDI_NOTE_ON          0x90
-#define MIDI_POLY_AFTER_TCH   0xA0
-#define MIDI_CONTROL_CHANGE   0xB0
-#define MIDI_PROGRAM_CHANGE   0xC0
-#define MIDI_AFTER_TOUCH      0xD0
-#define MIDI_PITCH_BEND       0xE0
-#define MIDI_META_EVENT       0xFF
-#define MIDI_END_OF_TRACK     0x2F
-#define MIDI_TEMPO_CHANGE     0x51
-#define MIDI_MONO_MODE_ON     0x7E
-#define MIDI_ALL_NOTES_OFF    0x7B
-
-int MPU_BaseAddr = MPU_DefaultAddress;
-
-//unsigned MPU_Delay = 500;
-//unsigned MPU_Delay = 5000;
-unsigned MPU_Delay = 0x5000;
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define MPU_LockStart MPU_SendMidi
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_SendMidi
-
-   Sends a byte of MIDI data to the music device.
----------------------------------------------------------------------*/
-
-void MPU_SendMidi
-   (
-   int data
-   )
-
-   {
-   int      port = MPU_BaseAddr + 1;
-   unsigned count;
-
-   count = MPU_Delay;
-   while( count > 0 )
-      {
-      // check if status port says we're ready for write
-      if ( !( inp( port ) & MPU_ReadyToWrite ) )
-         {
-         break;
-         }
-
-      count--;
-      }
-
-   port--;
-
-   // Send the midi data
-   outp( port, data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_NoteOff
-
-   Sends a full MIDI note off event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_NoteOff
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   MPU_SendMidi( MIDI_NOTE_OFF | channel );
-   MPU_SendMidi( key );
-   MPU_SendMidi( velocity );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_NoteOn
-
-   Sends a full MIDI note on event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_NoteOn
-   (
-   int channel,
-   int key,
-   int velocity
-   )
-
-   {
-   MPU_SendMidi( MIDI_NOTE_ON | channel );
-   MPU_SendMidi( key );
-   MPU_SendMidi( velocity );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_PolyAftertouch
-
-   Sends a full MIDI polyphonic aftertouch event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_PolyAftertouch
-   (
-   int channel,
-   int key,
-   int pressure
-   )
-
-   {
-   MPU_SendMidi( MIDI_POLY_AFTER_TCH | channel );
-   MPU_SendMidi( key );
-   MPU_SendMidi( pressure );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_ControlChange
-
-   Sends a full MIDI control change event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_ControlChange
-   (
-   int channel,
-   int number,
-   int value
-   )
-
-   {
-   MPU_SendMidi( MIDI_CONTROL_CHANGE | channel );
-   MPU_SendMidi( number );
-   MPU_SendMidi( value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_ProgramChange
-
-   Sends a full MIDI program change event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_ProgramChange
-   (
-   int channel,
-   int program
-   )
-
-   {
-   MPU_SendMidi( MIDI_PROGRAM_CHANGE | channel );
-   MPU_SendMidi( program );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_ChannelAftertouch
-
-   Sends a full MIDI channel aftertouch event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_ChannelAftertouch
-   (
-   int channel,
-   int pressure
-   )
-
-   {
-   MPU_SendMidi( MIDI_AFTER_TOUCH | channel );
-   MPU_SendMidi( pressure );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_PitchBend
-
-   Sends a full MIDI pitch bend event out to the music device.
----------------------------------------------------------------------*/
-
-void MPU_PitchBend
-   (
-   int channel,
-   int lsb,
-   int msb
-   )
-
-   {
-   MPU_SendMidi( MIDI_PITCH_BEND | channel );
-   MPU_SendMidi( lsb );
-   MPU_SendMidi( msb );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_SendCommand
-
-   Sends a command to the MPU401 card.
----------------------------------------------------------------------*/
-
-void MPU_SendCommand
-   (
-   int data
-   )
-
-   {
-   int      port = MPU_BaseAddr + 1;
-   unsigned count;
-
-   count = 0xffff;
-   while( count > 0 )
-      {
-      // check if status port says we're ready for write
-      if ( !( inp( port ) & MPU_ReadyToWrite ) )
-         {
-         break;
-         }
-      count--;
-      }
-
-   outp( port, data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_Reset
-
-   Resets the MPU401 card.
----------------------------------------------------------------------*/
-
-int MPU_Reset
-   (
-   void
-   )
-
-   {
-   int      port = MPU_BaseAddr + 1;
-   unsigned count;
-
-   // Output "Reset" command via Command port
-   MPU_SendCommand( MPU_CmdReset );
-
-   // Wait for status port to be ready for read
-   count = 0xffff;
-   while( count > 0 )
-      {
-      if ( !( inp( port ) & MPU_ReadyToRead ) )
-         {
-         port--;
-
-         // Check for a successful reset
-         if ( inp( port ) == MPU_CmdAcknowledge )
-            {
-            return( MPU_Ok );
-            }
-
-         port++;
-         }
-      count--;
-      }
-
-   // Failed to reset : MPU-401 not detected
-   return( MPU_NotFound );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_EnterUART
-
-   Sets the MPU401 card to operate in UART mode.
----------------------------------------------------------------------*/
-
-int MPU_EnterUART
-   (
-   void
-   )
-
-   {
-   int      port = MPU_BaseAddr + 1;
-   unsigned count;
-
-   // Output "Enter UART" command via Command port
-   MPU_SendCommand( MPU_CmdEnterUART );
-
-   // Wait for status port to be ready for read
-   count = 0xffff;
-   while( count > 0 )
-      {
-      if ( !( inp( port ) & MPU_ReadyToRead ) )
-         {
-         port--;
-
-         // Check for a successful reset
-         if ( inp( port ) == MPU_CmdAcknowledge )
-            {
-            return( MPU_Ok );
-            }
-
-         port++;
-         }
-      count--;
-      }
-
-   // Failed to reset : MPU-401 not detected
-   return( MPU_UARTFailed );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_Init
-
-   Detects and initializes the MPU401 card.
----------------------------------------------------------------------*/
-
-int MPU_Init
-   (
-   int addr
-   )
-
-   {
-   int status;
-   int count;
-   char *ptr;
-
-   ptr = USER_GetText( "MPUDELAY" );
-   if ( ptr != NULL )
-      {
-      MPU_Delay = ( unsigned )atol( ptr );
-      }
-
-   MPU_BaseAddr = addr;
-
-   count = 4;
-   while( count > 0 )
-      {
-      status = MPU_Reset();
-      if ( status == MPU_Ok )
-         {
-         return( MPU_EnterUART() );
-         }
-      count--;
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void MPU_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_UnlockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-void MPU_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( MPU_LockStart, MPU_LockEnd );
-   DPMI_Unlock( MPU_BaseAddr );
-   DPMI_Unlock( MPU_Delay );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MPU_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int MPU_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( MPU_LockStart, MPU_LockEnd );
-   status |= DPMI_Lock( MPU_BaseAddr );
-   status |= DPMI_Lock( MPU_Delay );
-
-   if ( status != DPMI_Ok )
-      {
-      MPU_UnlockMemory();
-      return( MPU_Error );
-      }
-
-   return( MPU_Ok );
-   }
--- a/src/audiolib/mpu401.h
+++ /dev/null
@@ -1,59 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef __MPU401_H
-#define __MPU401_H
-
-#define MPU_DefaultAddress 0x330
-
-enum MPU_ERRORS
-   {
-   MPU_Warning = -2,
-   MPU_Error = -1,
-   MPU_Ok = 0,
-   MPU_DPMI_Error
-   };
-
-#define MPU_NotFound       -1
-#define MPU_UARTFailed     -2
-
-#define MPU_ReadyToWrite   0x40
-#define MPU_ReadyToRead    0x80
-#define MPU_CmdEnterUART   0x3f
-#define MPU_CmdReset       0xff
-#define MPU_CmdAcknowledge 0xfe
-
-extern int MPU_BaseAddr;
-extern unsigned MPU_Delay;
-
-void MPU_SendCommand( int data );
-void MPU_SendMidi( int data );
-int  MPU_Reset( void );
-int  MPU_EnterUART( void );
-int  MPU_Init( int addr );
-void MPU_ResetMidi( void );
-void MPU_NoteOff( int channel, int key, int velocity );
-void MPU_NoteOn( int channel, int key, int velocity );
-void MPU_PolyAftertouch( int channel, int key, int pressure );
-void MPU_ControlChange( int channel, int number, int value );
-void MPU_ProgramChange( int channel, int program );
-void MPU_ChannelAftertouch( int channel, int pressure );
-void MPU_PitchBend( int channel, int lsb, int msb );
-void MPU_UnlockMemory( void );
-int  MPU_LockMemory( void );
-
-#endif
--- a/src/audiolib/music.c
+++ /dev/null
@@ -1,1033 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: MUSIC.C
-
-   author: James R. Dose
-   date:   March 25, 1994
-
-   Device independant music playback routines.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "task_man.h"
-#include "sndcards.h"
-#include "music.h"
-#include "midi.h"
-#include "al_midi.h"
-#include "pas16.h"
-#include "blaster.h"
-#include "gusmidi.h"
-#include "mpu401.h"
-#include "awe32.h"
-#include "sndscape.h"
-#include "ll_man.h"
-#include "user.h"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-void TextMode( void );
-#pragma aux TextMode =  \
-    "mov    ax, 0003h", \
-    "int    10h"        \
-    modify [ ax ];
-
-int MUSIC_SoundDevice = -1;
-int MUSIC_ErrorCode = MUSIC_Ok;
-
-static midifuncs MUSIC_MidiFunctions;
-
-static int       MUSIC_FadeLength;
-static int       MUSIC_FadeRate;
-static unsigned  MUSIC_CurrentFadeVolume;
-static unsigned  MUSIC_LastFadeVolume;
-static int       MUSIC_EndingFadeVolume;
-static task     *MUSIC_FadeTask = NULL;
-
-int MUSIC_InitAWE32( midifuncs *Funcs );
-int MUSIC_InitFM( int card, midifuncs *Funcs );
-int MUSIC_InitMidi( int card, midifuncs *Funcs, int Address );
-int MUSIC_InitGUS( midifuncs *Funcs );
-
-#define MUSIC_SetErrorCode( status ) \
-   MUSIC_ErrorCode = ( status );
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *MUSIC_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case MUSIC_Warning :
-      case MUSIC_Error :
-         ErrorString = MUSIC_ErrorString( MUSIC_ErrorCode );
-         break;
-
-      case MUSIC_Ok :
-         ErrorString = "Music ok.";
-         break;
-
-      case MUSIC_ASSVersion :
-         ErrorString = "Apogee Sound System Version " ASS_VERSION_STRING "  "
-            "Programmed by Jim Dose\n"
-            "(c) Copyright 1996 James R. Dose.  All Rights Reserved.\n";
-         break;
-
-      case MUSIC_SoundCardError :
-         switch( MUSIC_SoundDevice )
-         {
-            case SoundBlaster :
-            case WaveBlaster :
-               ErrorString = BLASTER_ErrorString( BLASTER_Error );
-               break;
-
-            case ProAudioSpectrum :
-            case SoundMan16 :
-               ErrorString = PAS_ErrorString( PAS_Error );
-               break;
-
-            case Adlib :
-               ErrorString = "Adlib error.";
-               break;
-
-            case GenMidi :
-            case SoundCanvas :
-               ErrorString = "Could not detect MPU-401.";
-               break;
-
-            case SoundScape :
-               ErrorString = SOUNDSCAPE_ErrorString( SOUNDSCAPE_Error );
-               break;
-
-            case Awe32 :
-               ErrorString = AWE32_ErrorString( AWE32_Error );
-               break;
-
-            case UltraSound :
-               ErrorString = GUS_ErrorString( GUS_Error );
-               break;
-
-            default :
-               ErrorString = MUSIC_ErrorString( MUSIC_InvalidCard );
-               break;
-            }
-         break;
-
-      case MUSIC_MPU401Error :
-         ErrorString = "Could not detect MPU-401.";
-         break;
-
-      case MUSIC_InvalidCard :
-         ErrorString = "Invalid Music device.";
-         break;
-
-      case MUSIC_MidiError :
-         ErrorString = "Error playing MIDI file.";
-         break;
-
-      case MUSIC_TaskManError :
-         ErrorString = "TaskMan error.";
-         break;
-
-      case MUSIC_FMNotDetected :
-         ErrorString = "Could not detect FM chip.";
-         break;
-
-      case MUSIC_DPMI_Error :
-         ErrorString = "DPMI Error in MUSIC.";
-         break;
-
-      default :
-         ErrorString = "Unknown Music error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_Init
-
-   Selects which sound device to use.
----------------------------------------------------------------------*/
-
-int MUSIC_Init
-   (
-   int SoundCard,
-   int Address
-   )
-
-   {
-   int i;
-   int status;
-
-   if ( USER_CheckParameter( "ASSVER" ) )
-      {
-      MUSIC_SetErrorCode( MUSIC_ASSVersion );
-      return( MUSIC_Error );
-      }
-
-   status = LL_LockMemory();
-   if ( status != LL_Ok )
-      {
-      MUSIC_SetErrorCode( MUSIC_DPMI_Error );
-      return( MUSIC_Error );
-      }
-
-   for( i = 0; i < 128; i++ )
-      {
-      MIDI_PatchMap[ i ] = i;
-      }
-
-   status = MUSIC_Ok;
-   MUSIC_SoundDevice = SoundCard;
-
-   switch( SoundCard )
-      {
-      case SoundBlaster :
-      case Adlib :
-      case ProAudioSpectrum :
-      case SoundMan16 :
-         status = MUSIC_InitFM( SoundCard, &MUSIC_MidiFunctions );
-         break;
-
-      case GenMidi :
-      case SoundCanvas :
-      case WaveBlaster :
-      case SoundScape :
-         status = MUSIC_InitMidi( SoundCard, &MUSIC_MidiFunctions, Address );
-         break;
-
-      case Awe32 :
-         status = MUSIC_InitAWE32( &MUSIC_MidiFunctions );
-         break;
-
-      case UltraSound :
-         status = MUSIC_InitGUS( &MUSIC_MidiFunctions );
-         break;
-
-      case SoundSource :
-      case PC :
-      default :
-         MUSIC_SetErrorCode( MUSIC_InvalidCard );
-         status = MUSIC_Error;
-      }
-
-   if ( status != MUSIC_Ok )
-      {
-      LL_UnlockMemory();
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_Shutdown
-
-   Terminates use of sound device.
----------------------------------------------------------------------*/
-
-int MUSIC_Shutdown
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status = MUSIC_Ok;
-
-   MIDI_StopSong();
-
-   if ( MUSIC_FadeTask != NULL )
-      {
-      MUSIC_StopFade();
-      }
-
-   switch ( MUSIC_SoundDevice )
-      {
-      case Adlib :
-         AL_Shutdown();
-         break;
-
-      case SoundBlaster :
-         AL_Shutdown();
-         BLASTER_RestoreMidiVolume();
-         break;
-
-      case GenMidi :
-      case SoundCanvas :
-      case SoundScape :
-         MPU_Reset();
-         break;
-
-      case WaveBlaster :
-         BLASTER_ShutdownWaveBlaster();
-         MPU_Reset();
-         BLASTER_RestoreMidiVolume();
-         break;
-
-      case Awe32 :
-         AWE32_Shutdown();
-         BLASTER_RestoreMidiVolume();
-         break;
-
-      case ProAudioSpectrum :
-      case SoundMan16 :
-         AL_Shutdown();
-         PAS_RestoreMusicVolume();
-         break;
-
-      case UltraSound :
-         GUSMIDI_Shutdown();
-         break;
-      }
-
-   LL_UnlockMemory();
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetMaxFMMidiChannel
-
-   Sets the maximum MIDI channel that FM cards respond to.
----------------------------------------------------------------------*/
-
-void MUSIC_SetMaxFMMidiChannel
-   (
-   int channel
-   )
-
-   {
-   AL_SetMaxMidiChannel( channel );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetVolume
-
-   Sets the volume of music playback.
----------------------------------------------------------------------*/
-
-void MUSIC_SetVolume
-   (
-   int volume
-   )
-
-   {
-   volume = max( 0, volume );
-   volume = min( volume, 255 );
-
-   if ( MUSIC_SoundDevice != -1 )
-      {
-      MIDI_SetVolume( volume );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetMidiChannelVolume
-
-   Sets the volume of music playback on the specified MIDI channel.
----------------------------------------------------------------------*/
-
-void MUSIC_SetMidiChannelVolume
-   (
-   int channel,
-   int volume
-   )
-
-   {
-   MIDI_SetUserChannelVolume( channel, volume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_ResetMidiChannelVolumes
-
-   Sets the volume of music playback on all MIDI channels to full volume.
----------------------------------------------------------------------*/
-
-void MUSIC_ResetMidiChannelVolumes
-   (
-   void
-   )
-
-   {
-   MIDI_ResetUserChannelVolume();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_GetVolume
-
-   Returns the volume of music playback.
----------------------------------------------------------------------*/
-
-int MUSIC_GetVolume
-   (
-   void
-   )
-
-   {
-   if ( MUSIC_SoundDevice == -1 )
-      {
-      return( 0 );
-      }
-   return( MIDI_GetVolume() );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetLoopFlag
-
-   Set whether the music will loop or end when it reaches the end of
-   the song.
----------------------------------------------------------------------*/
-
-void MUSIC_SetLoopFlag
-   (
-   int loopflag
-   )
-
-   {
-   MIDI_SetLoopFlag( loopflag );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SongPlaying
-
-   Returns whether there is a song playing.
----------------------------------------------------------------------*/
-
-int MUSIC_SongPlaying
-   (
-   void
-   )
-
-   {
-   return( MIDI_SongPlaying() );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_Continue
-
-   Continues playback of a paused song.
----------------------------------------------------------------------*/
-
-void MUSIC_Continue
-   (
-   void
-   )
-
-   {
-   MIDI_ContinueSong();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_Pause
-
-   Pauses playback of a song.
----------------------------------------------------------------------*/
-
-void MUSIC_Pause
-   (
-   void
-   )
-
-   {
-   MIDI_PauseSong();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_StopSong
-
-   Stops playback of current song.
----------------------------------------------------------------------*/
-
-int MUSIC_StopSong
-   (
-   void
-   )
-
-   {
-   MUSIC_StopFade();
-   MIDI_StopSong();
-   MUSIC_SetErrorCode( MUSIC_Ok );
-   return( MUSIC_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_PlaySong
-
-   Begins playback of MIDI song.
----------------------------------------------------------------------*/
-
-int MUSIC_PlaySong
-   (
-   unsigned char *song,
-   int loopflag
-   )
-
-   {
-   int status;
-
-   switch( MUSIC_SoundDevice )
-      {
-      case SoundBlaster :
-      case Adlib :
-      case ProAudioSpectrum :
-      case SoundMan16 :
-      case GenMidi :
-      case SoundCanvas :
-      case WaveBlaster :
-      case SoundScape :
-      case Awe32 :
-      case UltraSound :
-         MIDI_StopSong();
-         status = MIDI_PlaySong( song, loopflag );
-         if ( status != MIDI_Ok )
-            {
-            MUSIC_SetErrorCode( MUSIC_MidiError );
-            return( MUSIC_Warning );
-            }
-         break;
-
-      case SoundSource :
-      case PC :
-      default :
-         MUSIC_SetErrorCode( MUSIC_InvalidCard );
-         return( MUSIC_Warning );
-         break;
-      }
-
-   return( MUSIC_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetContext
-
-   Sets the song context.
----------------------------------------------------------------------*/
-
-void MUSIC_SetContext
-   (
-   int context
-   )
-
-   {
-   MIDI_SetContext( context );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_GetContext
-
-   Returns the current song context.
----------------------------------------------------------------------*/
-
-int MUSIC_GetContext
-   (
-   void
-   )
-
-   {
-   return MIDI_GetContext();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetSongTick
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MUSIC_SetSongTick
-   (
-   unsigned long PositionInTicks
-   )
-
-   {
-   MIDI_SetSongTick( PositionInTicks );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetSongTime
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MUSIC_SetSongTime
-   (
-   unsigned long milliseconds
-   )
-
-   {
-   MIDI_SetSongTime( milliseconds );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_SetSongPosition
-
-   Sets the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MUSIC_SetSongPosition
-   (
-   int measure,
-   int beat,
-   int tick
-   )
-
-   {
-   MIDI_SetSongPosition( measure, beat, tick );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_GetSongPosition
-
-   Returns the position of the song pointer.
----------------------------------------------------------------------*/
-
-void MUSIC_GetSongPosition
-   (
-   songposition *pos
-   )
-
-   {
-   MIDI_GetSongPosition( pos );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_GetSongLength
-
-   Returns the length of the song.
----------------------------------------------------------------------*/
-
-void MUSIC_GetSongLength
-   (
-   songposition *pos
-   )
-
-   {
-   MIDI_GetSongLength( pos );
-   }
-
-
-int MUSIC_InitAWE32
-   (
-   midifuncs *Funcs
-   )
-
-   {
-   int status;
-
-   status = AWE32_Init();
-   if ( status != AWE32_Ok )
-      {
-      MUSIC_SetErrorCode( MUSIC_SoundCardError );
-      return( MUSIC_Error );
-      }
-
-   Funcs->NoteOff           = AWE32_NoteOff;
-   Funcs->NoteOn            = AWE32_NoteOn;
-   Funcs->PolyAftertouch    = AWE32_PolyAftertouch;
-   Funcs->ControlChange     = AWE32_ControlChange;
-   Funcs->ProgramChange     = AWE32_ProgramChange;
-   Funcs->ChannelAftertouch = AWE32_ChannelAftertouch;
-   Funcs->PitchBend         = AWE32_PitchBend;
-   Funcs->ReleasePatches    = NULL;
-   Funcs->LoadPatch         = NULL;
-   Funcs->SetVolume         = NULL;
-   Funcs->GetVolume         = NULL;
-
-   if ( BLASTER_CardHasMixer() )
-      {
-      BLASTER_SaveMidiVolume();
-      Funcs->SetVolume = BLASTER_SetMidiVolume;
-      Funcs->GetVolume = BLASTER_GetMidiVolume;
-      }
-
-   status = MUSIC_Ok;
-   MIDI_SetMidiFuncs( Funcs );
-
-   return( status );
-   }
-
-
-int MUSIC_InitFM
-   (
-   int card,
-   midifuncs *Funcs
-   )
-
-   {
-   int status;
-   int passtatus;
-
-   status = MIDI_Ok;
-
-   if ( !AL_DetectFM() )
-      {
-      MUSIC_SetErrorCode( MUSIC_FMNotDetected );
-      return( MUSIC_Error );
-      }
-
-   // Init the fm routines
-   AL_Init( card );
-
-   Funcs->NoteOff           = AL_NoteOff;
-   Funcs->NoteOn            = AL_NoteOn;
-   Funcs->PolyAftertouch    = NULL;
-   Funcs->ControlChange     = AL_ControlChange;
-   Funcs->ProgramChange     = AL_ProgramChange;
-   Funcs->ChannelAftertouch = NULL;
-   Funcs->PitchBend         = AL_SetPitchBend;
-   Funcs->ReleasePatches    = NULL;
-   Funcs->LoadPatch         = NULL;
-   Funcs->SetVolume         = NULL;
-   Funcs->GetVolume         = NULL;
-
-   switch( card )
-      {
-      case SoundBlaster :
-         if ( BLASTER_CardHasMixer() )
-            {
-            BLASTER_SaveMidiVolume();
-            Funcs->SetVolume = BLASTER_SetMidiVolume;
-            Funcs->GetVolume = BLASTER_GetMidiVolume;
-            }
-         else
-            {
-            Funcs->SetVolume = NULL;
-            Funcs->GetVolume = NULL;
-            }
-         break;
-
-      case Adlib :
-         Funcs->SetVolume = NULL;
-         Funcs->GetVolume = NULL;
-         break;
-
-      case ProAudioSpectrum :
-      case SoundMan16 :
-         Funcs->SetVolume = NULL;
-         Funcs->GetVolume = NULL;
-
-         passtatus = PAS_SaveMusicVolume();
-         if ( passtatus == PAS_Ok )
-            {
-            Funcs->SetVolume = PAS_SetFMVolume;
-            Funcs->GetVolume = PAS_GetFMVolume;
-            }
-         break;
-      }
-
-   MIDI_SetMidiFuncs( Funcs );
-
-   return( status );
-   }
-
-int MUSIC_InitMidi
-   (
-   int        card,
-   midifuncs *Funcs,
-   int        Address
-   )
-
-   {
-   int status;
-
-   status = MUSIC_Ok;
-
-   if ( ( card == WaveBlaster ) || ( card == SoundCanvas ) ||
-      ( card == GenMidi ) )
-      {
-      // Setup WaveBlaster Daughterboard clone
-      // (ie. SoundCanvas DB, TurtleBeach Rio)
-      BLASTER_SetupWaveBlaster();
-      }
-
-   if ( card == SoundScape )
-      {
-      Address = SOUNDSCAPE_GetMIDIPort();
-      if ( Address < SOUNDSCAPE_Ok )
-         {
-         MUSIC_SetErrorCode( MUSIC_SoundCardError );
-         return( MUSIC_Error );
-         }
-      }
-
-   if ( MPU_Init( Address ) != MPU_Ok )
-      {
-      MUSIC_SetErrorCode( MUSIC_MPU401Error );
-      return( MUSIC_Error );
-      }
-
-   Funcs->NoteOff           = MPU_NoteOff;
-   Funcs->NoteOn            = MPU_NoteOn;
-   Funcs->PolyAftertouch    = MPU_PolyAftertouch;
-   Funcs->ControlChange     = MPU_ControlChange;
-   Funcs->ProgramChange     = MPU_ProgramChange;
-   Funcs->ChannelAftertouch = MPU_ChannelAftertouch;
-   Funcs->PitchBend         = MPU_PitchBend;
-   Funcs->ReleasePatches    = NULL;
-   Funcs->LoadPatch         = NULL;
-   Funcs->SetVolume         = NULL;
-   Funcs->GetVolume         = NULL;
-
-   if ( card == WaveBlaster )
-      {
-      if ( BLASTER_CardHasMixer() )
-         {
-         BLASTER_SaveMidiVolume();
-         Funcs->SetVolume = BLASTER_SetMidiVolume;
-         Funcs->GetVolume = BLASTER_GetMidiVolume;
-         }
-      }
-
-   MIDI_SetMidiFuncs( Funcs );
-
-   return( status );
-   }
-
-int MUSIC_InitGUS
-   (
-   midifuncs *Funcs
-   )
-
-   {
-   int status;
-
-   status = MUSIC_Ok;
-
-   if ( GUSMIDI_Init() != GUS_Ok )
-      {
-      MUSIC_SetErrorCode( MUSIC_SoundCardError );
-      return( MUSIC_Error );
-      }
-
-   Funcs->NoteOff           = GUSMIDI_NoteOff;
-   Funcs->NoteOn            = GUSMIDI_NoteOn;
-   Funcs->PolyAftertouch    = NULL;
-   Funcs->ControlChange     = GUSMIDI_ControlChange;
-   Funcs->ProgramChange     = GUSMIDI_ProgramChange;
-   Funcs->ChannelAftertouch = NULL;
-   Funcs->PitchBend         = GUSMIDI_PitchBend;
-   Funcs->ReleasePatches    = NULL;//GUSMIDI_ReleasePatches;
-   Funcs->LoadPatch         = NULL;//GUSMIDI_LoadPatch;
-   Funcs->SetVolume         = GUSMIDI_SetVolume;
-   Funcs->GetVolume         = GUSMIDI_GetVolume;
-
-   MIDI_SetMidiFuncs( Funcs );
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_FadeRoutine
-
-   Fades music volume from current level to another over a specified
-   period of time.
----------------------------------------------------------------------*/
-
-static void MUSIC_FadeRoutine
-   (
-   task *Task
-   )
-
-   {
-   int volume;
-
-   MUSIC_CurrentFadeVolume += MUSIC_FadeRate;
-   if ( MUSIC_FadeLength == 0 )
-      {
-      MIDI_SetVolume( MUSIC_EndingFadeVolume );
-      TS_Terminate( Task );
-      MUSIC_FadeTask = NULL;
-      }
-   else
-      {
-      MUSIC_FadeLength--;
-//      if ( ( MUSIC_SoundDevice == GenMidi ) &&
-//         ( ( MUSIC_FadeLength % 12 ) != 0 ) )
-//         {
-//         return;
-//         }
-
-      volume = MUSIC_CurrentFadeVolume >> 7;
-      if ( MUSIC_LastFadeVolume != volume )
-         {
-         MUSIC_LastFadeVolume = volume;
-         MIDI_SetVolume( volume );
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_FadeVolume
-
-   Fades music volume from current level to another over a specified
-   period of time.
----------------------------------------------------------------------*/
-
-int MUSIC_FadeVolume
-   (
-   int tovolume,
-   int milliseconds
-   )
-
-   {
-   int fromvolume;
-
-   if ( ( MUSIC_SoundDevice == ProAudioSpectrum ) ||
-      ( MUSIC_SoundDevice == SoundMan16 ) ||
-      ( MUSIC_SoundDevice == GenMidi ) ||
-      ( MUSIC_SoundDevice == SoundScape ) ||
-      ( MUSIC_SoundDevice == SoundCanvas ) )
-      {
-      MIDI_SetVolume( tovolume );
-      return( MUSIC_Ok );
-      }
-
-   if ( MUSIC_FadeTask != NULL )
-      {
-      MUSIC_StopFade();
-      }
-
-   tovolume = max( 0, tovolume );
-   tovolume = min( 255, tovolume );
-   fromvolume = MUSIC_GetVolume();
-
-   MUSIC_FadeLength = milliseconds / 25;
-   MUSIC_FadeRate   = ( ( tovolume - fromvolume ) << 7 ) / MUSIC_FadeLength;
-   MUSIC_LastFadeVolume = fromvolume;
-   MUSIC_CurrentFadeVolume = fromvolume << 7;
-   MUSIC_EndingFadeVolume = tovolume;
-
-   MUSIC_FadeTask = TS_ScheduleTask( MUSIC_FadeRoutine, 40, 1, NULL );
-   if ( MUSIC_FadeTask == NULL )
-      {
-      MUSIC_SetErrorCode( MUSIC_TaskManError );
-      return( MUSIC_Warning );
-      }
-
-   TS_Dispatch();
-   return( MUSIC_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_FadeActive
-
-   Returns whether the fade routine is active.
----------------------------------------------------------------------*/
-
-int MUSIC_FadeActive
-   (
-   void
-   )
-
-   {
-   return( MUSIC_FadeTask != NULL );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_StopFade
-
-   Stops fading the music.
----------------------------------------------------------------------*/
-
-void MUSIC_StopFade
-   (
-   void
-   )
-
-   {
-   if ( MUSIC_FadeTask != NULL )
-      {
-      TS_Terminate( MUSIC_FadeTask );
-      MUSIC_FadeTask = NULL;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_RerouteMidiChannel
-
-   Sets callback function to reroute MIDI commands from specified
-   function.
----------------------------------------------------------------------*/
-
-void MUSIC_RerouteMidiChannel
-   (
-   int channel,
-   int cdecl ( *function )( int event, int c1, int c2 )
-   )
-
-   {
-   MIDI_RerouteMidiChannel( channel, function );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: MUSIC_RegisterTimbreBank
-
-   Halts playback of all sounds.
----------------------------------------------------------------------*/
-
-void MUSIC_RegisterTimbreBank
-   (
-   unsigned char *timbres
-   )
-
-   {
-   AL_RegisterTimbreBank( timbres );
-   }
--- a/src/audiolib/music.h
+++ /dev/null
@@ -1,92 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: MUSIC.H
-
-   author: James R. Dose
-   date:   March 25, 1994
-
-   Public header for MUSIC.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __MUSIC_H
-#define __MUSIC_H
-
-#include "sndcards.h"
-
-#define cdecl
-
-extern int MUSIC_ErrorCode;
-
-enum MUSIC_ERRORS
-   {
-   MUSIC_Warning = -2,
-   MUSIC_Error   = -1,
-   MUSIC_Ok      = 0,
-   MUSIC_ASSVersion,
-   MUSIC_SoundCardError,
-   MUSIC_MPU401Error,
-   MUSIC_InvalidCard,
-   MUSIC_MidiError,
-   MUSIC_TaskManError,
-   MUSIC_FMNotDetected,
-   MUSIC_DPMI_Error
-   };
-
-typedef struct
-   {
-   unsigned long tickposition;
-   unsigned long milliseconds;
-   unsigned int  measure;
-   unsigned int  beat;
-   unsigned int  tick;
-   } songposition;
-
-#define MUSIC_LoopSong ( 1 == 1 )
-#define MUSIC_PlayOnce ( !MUSIC_LoopSong )
-
-char *MUSIC_ErrorString( int ErrorNumber );
-int   MUSIC_Init( int SoundCard, int Address );
-int   MUSIC_Shutdown( void );
-void  MUSIC_SetMaxFMMidiChannel( int channel );
-void  MUSIC_SetVolume( int volume );
-void  MUSIC_SetMidiChannelVolume( int channel, int volume );
-void  MUSIC_ResetMidiChannelVolumes( void );
-int   MUSIC_GetVolume( void );
-void  MUSIC_SetLoopFlag( int loopflag );
-int   MUSIC_SongPlaying( void );
-void  MUSIC_Continue( void );
-void  MUSIC_Pause( void );
-int   MUSIC_StopSong( void );
-int   MUSIC_PlaySong( unsigned char *song, int loopflag );
-void  MUSIC_SetContext( int context );
-int   MUSIC_GetContext( void );
-void  MUSIC_SetSongTick( unsigned long PositionInTicks );
-void  MUSIC_SetSongTime( unsigned long milliseconds );
-void  MUSIC_SetSongPosition( int measure, int beat, int tick );
-void  MUSIC_GetSongPosition( songposition *pos );
-void  MUSIC_GetSongLength( songposition *pos );
-int   MUSIC_FadeVolume( int tovolume, int milliseconds );
-int   MUSIC_FadeActive( void );
-void  MUSIC_StopFade( void );
-void  MUSIC_RerouteMidiChannel( int channel, int cdecl ( *function )( int event, int c1, int c2 ) );
-void  MUSIC_RegisterTimbreBank( unsigned char *timbres );
-
-#endif
--- a/src/audiolib/mv_mix.asm
+++ /dev/null
@@ -1,505 +1,0 @@
-        IDEAL
-
-        p386
-        MODEL  flat
-
-        dataseg
-        CODESEG
-
-        MASM
-        ALIGN 4
-
-EXTRN   _MV_HarshClipTable:DWORD
-EXTRN   _MV_MixDestination:DWORD
-EXTRN   _MV_MixPosition:DWORD
-EXTRN   _MV_LeftVolume:DWORD
-EXTRN   _MV_RightVolume:DWORD
-EXTRN   _MV_SampleSize:DWORD
-EXTRN   _MV_RightChannelOffset:DWORD
-
-;================
-;
-; MV_Mix8BitMono
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix8BitMono_
-PUBLIC  MV_Mix8BitMono_
-; Two at once
-        pushad
-
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET apatch7+2            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET apatch8+2            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET apatch9+3            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume             ; Since we're mono, use left volume
-        mov     eax,OFFSET apatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET apatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Harsh Clip table ptr
-        mov     ebx, _MV_HarshClipTable
-        add     ebx, 128
-        mov     eax,OFFSET apatch3+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET apatch4+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET apatch5+2            ; convice tasm to modify code...
-        mov     [eax],edx
-        mov     eax,OFFSET apatch6+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        shr     ecx, 1                          ; double sample count
-        cmp     ecx, 0
-        je      short exit8m
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; apatch1 - volume table
-; apatch2 - volume table
-; apatch3 - harsh clip table
-; apatch4 - harsh clip table
-; apatch5 - sample rate
-; apatch6 - sample rate
-
-        mov     eax,ebp                         ; begin calculating first sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     eax,16                          ; finish calculation for first sample
-
-        mov     ebx,ebp                         ; begin calculating second sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     ebx,16                          ; finish calculation for second sample
-
-        movzx   eax, byte ptr [esi+eax]         ; get first sample
-        movzx   ebx, byte ptr [esi+ebx]         ; get second sample
-
-        ALIGN 4
-mix8Mloop:
-        movzx   edx, byte ptr [edi]             ; get current sample from destination
-apatch1:
-        movsx   eax, byte ptr [2*eax+12345678h] ; volume translate first sample
-apatch2:
-        movsx   ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
-        add     eax, edx                        ; mix first sample
-apatch9:
-        movzx   edx, byte ptr [edi + 1]         ; get current sample from destination
-apatch3:
-        mov     eax, [eax + 12345678h]          ; harsh clip new sample
-        add     ebx, edx                        ; mix second sample
-        mov     [edi], al                       ; write new sample to destination
-        mov     edx, ebp                        ; begin calculating third sample
-apatch4:
-        mov     ebx, [ebx + 12345678h]          ; harsh clip new sample
-apatch5:
-        add     ebp,12345678h                   ; advance frac pointer
-        shr     edx, 16                         ; finish calculation for third sample
-        mov     eax, ebp                        ; begin calculating fourth sample
-apatch7:
-        add     edi, 1                          ; move destination to second sample
-        shr     eax, 16                         ; finish calculation for fourth sample
-        mov     [edi], bl                       ; write new sample to destination
-apatch6:
-        add     ebp,12345678h                   ; advance frac pointer
-        movzx   ebx, byte ptr [esi+eax]         ; get fourth sample
-        movzx   eax, byte ptr [esi+edx]         ; get third sample
-apatch8:
-        add     edi, 2                          ; move destination to third sample
-        dec     ecx                             ; decrement count
-        jnz     mix8Mloop                       ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-exit8m:
-        popad
-        ret
-ENDP    MV_Mix8BitMono_
-
-;================
-;
-; MV_Mix8BitStereo
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix8BitStereo_
-PUBLIC  MV_Mix8BitStereo_
-
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET bpatch8+2            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Right channel offset
-        mov     ebx, _MV_RightChannelOffset
-        mov     eax,OFFSET bpatch6+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET bpatch7+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET bpatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        mov     ebx, _MV_RightVolume
-        mov     eax,OFFSET bpatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET bpatch3+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        ; Harsh Clip table ptr
-        mov     ebx, _MV_HarshClipTable
-        add     ebx,128
-        mov     eax,OFFSET bpatch4+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET bpatch5+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        cmp     ecx, 0
-        je      short exit8S
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; bpatch1 - left volume table
-; bpatch2 - right volume table
-; bpatch3 - sample rate
-; bpatch4 - harsh clip table
-; bpatch5 - harsh clip table
-
-        mov     eax,ebp                         ; begin calculating first sample
-        shr     eax,16                          ; finish calculation for first sample
-
-        movzx   ebx, byte ptr [esi+eax]         ; get first sample
-
-        ALIGN 4
-mix8Sloop:
-bpatch1:
-        movsx   eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
-        movzx   edx, byte ptr [edi]             ; get current sample from destination
-bpatch2:
-        movsx   ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
-        add     eax, edx                        ; mix left sample
-bpatch3:
-        add     ebp,12345678h                   ; advance frac pointer
-bpatch6:
-        movzx   edx, byte ptr [edi+12345678h]   ; get current sample from destination
-bpatch4:
-        mov     eax, [eax + 12345678h]          ; harsh clip left sample
-        add     ebx, edx                        ; mix right sample
-        mov     [edi], al                       ; write left sample to destination
-bpatch5:
-        mov     ebx, [ebx + 12345678h]          ; harsh clip right sample
-        mov     edx, ebp                        ; begin calculating second sample
-bpatch7:
-        mov     [edi+12345678h], bl             ; write right sample to destination
-        shr     edx, 16                         ; finish calculation for second sample
-bpatch8:
-        add     edi, 2                          ; move destination to second sample
-        movzx   ebx, byte ptr [esi+edx]         ; get second sample
-        dec     ecx                             ; decrement count
-        jnz     mix8Sloop                       ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-
-EXIT8S:
-        popad
-        ret
-ENDP    MV_Mix8BitStereo_
-
-;================
-;
-; MV_Mix16BitMono
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix16BitMono_
-PUBLIC  MV_Mix16BitMono_
-; Two at once
-        pushad
-
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET cpatch5+3            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET cpatch6+3            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET cpatch7+2            ; convice tasm to modify code...
-        add     bl,bl
-        mov     [eax],bl
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET cpatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET cpatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET cpatch3+2            ; convice tasm to modify code...
-        mov     [eax],edx
-        mov     eax,OFFSET cpatch4+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        shr     ecx, 1                          ; double sample count
-        cmp     ecx, 0
-        je      exit16M
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; cpatch1 - volume table
-; cpatch2 - volume table
-; cpatch3 - sample rate
-; cpatch4 - sample rate
-
-        mov     eax,ebp                         ; begin calculating first sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     eax,16                          ; finish calculation for first sample
-
-        mov     ebx,ebp                         ; begin calculating second sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     ebx,16                          ; finish calculation for second sample
-
-        movzx   eax, byte ptr [esi+eax]         ; get first sample
-        movzx   ebx, byte ptr [esi+ebx]         ; get second sample
-
-        ALIGN 4
-mix16Mloop:
-        movsx   edx, word ptr [edi]             ; get current sample from destination
-cpatch1:
-        movsx   eax, word ptr [2*eax+12345678h] ; volume translate first sample
-cpatch2:
-        movsx   ebx, word ptr [2*ebx+12345678h] ; volume translate second sample
-        add     eax, edx                        ; mix first sample
-cpatch5:
-        movsx   edx, word ptr [edi + 2]         ; get current sample from destination
-
-        cmp     eax, -32768                     ; Harsh clip sample
-        jge     short m16skip1
-        mov     eax, -32768
-        jmp     short m16skip2
-m16skip1:
-        cmp     eax, 32767
-        jle     short m16skip2
-        mov     eax, 32767
-m16skip2:
-        add     ebx, edx                        ; mix second sample
-        mov     [edi], ax                       ; write new sample to destination
-        mov     edx, ebp                        ; begin calculating third sample
-
-        cmp     ebx, -32768                     ; Harsh clip sample
-        jge     short m16skip3
-        mov     ebx, -32768
-        jmp     short m16skip4
-m16skip3:
-        cmp     ebx, 32767
-        jle     short m16skip4
-        mov     ebx, 32767
-m16skip4:
-cpatch3:
-        add     ebp,12345678h                   ; advance frac pointer
-        shr     edx, 16                         ; finish calculation for third sample
-        mov     eax, ebp                        ; begin calculating fourth sample
-cpatch6:
-        mov     [edi + 2], bx                   ; write new sample to destination
-        shr     eax, 16                         ; finish calculation for fourth sample
-
-cpatch4:
-        add     ebp,12345678h                   ; advance frac pointer
-        movzx   ebx, byte ptr [esi+eax]         ; get fourth sample
-cpatch7:
-        add     edi, 4                          ; move destination to third sample
-        movzx   eax, byte ptr [esi+edx]         ; get third sample
-        dec     ecx                             ; decrement count
-        jnz     mix16Mloop                      ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-EXIT16M:
-        popad
-        ret
-ENDP    MV_Mix16BitMono_
-
-;================
-;
-; MV_Mix16BitStereo
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix16BitStereo_
-PUBLIC  MV_Mix16BitStereo_
-
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET dpatch6+2            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Right channel offset
-        mov     ebx, _MV_RightChannelOffset
-        mov     eax,OFFSET dpatch4+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET dpatch5+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET dpatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        mov     ebx, _MV_RightVolume
-        mov     eax,OFFSET dpatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET dpatch3+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        cmp     ecx, 0
-        je      exit16S
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; dpatch1 - left volume table
-; dpatch2 - right volume table
-; dpatch3 - sample rate
-
-        mov     eax,ebp                         ; begin calculating first sample
-        shr     eax,16                          ; finish calculation for first sample
-
-        movzx   ebx, byte ptr [esi+eax]         ; get first sample
-
-        ALIGN 4
-mix16Sloop:
-dpatch1:
-        movsx   eax, word ptr [2*ebx+12345678h] ; volume translate left sample
-        movsx   edx, word ptr [edi]             ; get current sample from destination
-dpatch2:
-        movsx   ebx, word ptr [2*ebx+12345678h] ; volume translate right sample
-        add     eax, edx                        ; mix left sample
-dpatch3:
-        add     ebp,12345678h                   ; advance frac pointer
-dpatch4:
-        movsx   edx, word ptr [edi+12345678h]   ; get current sample from destination
-
-        cmp     eax, -32768                     ; Harsh clip sample
-        jge     short s16skip1
-        mov     eax, -32768
-        jmp     short s16skip2
-s16skip1:
-        cmp     eax, 32767
-        jle     short s16skip2
-        mov     eax, 32767
-s16skip2:
-        add     ebx, edx                        ; mix right sample
-        mov     [edi], ax                       ; write left sample to destination
-
-        cmp     ebx, -32768                     ; Harsh clip sample
-        jge     short s16skip3
-        mov     ebx, -32768
-        jmp     short s16skip4
-s16skip3:
-        cmp     ebx, 32767
-        jle     short s16skip4
-        mov     ebx, 32767
-s16skip4:
-
-        mov     edx, ebp                        ; begin calculating second sample
-dpatch5:
-        mov     [edi+12345678h], bx             ; write right sample to destination
-        shr     edx, 16                         ; finish calculation for second sample
-dpatch6:
-        add     edi, 4                          ; move destination to second sample
-        movzx   ebx, byte ptr [esi+edx]         ; get second sample
-        dec     ecx                             ; decrement count
-        jnz     mix16Sloop                      ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-exit16S:
-        popad
-        ret
-ENDP    MV_Mix16BitStereo_
-
-        ENDS
-
-        END
--- a/src/audiolib/mv_mix16.asm
+++ /dev/null
@@ -1,524 +1,0 @@
-        IDEAL
-
-        p386
-        MODEL  flat
-
-        dataseg
-        CODESEG
-
-        MASM
-        ALIGN 4
-
-EXTRN   _MV_HarshClipTable:DWORD
-EXTRN   _MV_MixDestination:DWORD
-EXTRN   _MV_MixPosition:DWORD
-EXTRN   _MV_LeftVolume:DWORD
-EXTRN   _MV_RightVolume:DWORD
-EXTRN   _MV_SampleSize:DWORD
-EXTRN   _MV_RightChannelOffset:DWORD
-
-;================
-;
-; MV_Mix8BitMono16
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix8BitMono16_
-PUBLIC  MV_Mix8BitMono16_
-; Two at once
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-        inc     esi
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET apatch7+2            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET apatch8+2            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET apatch9+3            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume             ; Since we're mono, use left volume
-        mov     eax,OFFSET apatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET apatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Harsh Clip table ptr
-        mov     ebx, _MV_HarshClipTable
-        add     ebx, 128
-        mov     eax,OFFSET apatch3+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET apatch4+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET apatch5+2            ; convice tasm to modify code...
-        mov     [eax],edx
-        mov     eax,OFFSET apatch6+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        shr     ecx, 1                          ; double sample count
-        cmp     ecx, 0
-        je      exit8m
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; apatch1 - volume table
-; apatch2 - volume table
-; apatch3 - harsh clip table
-; apatch4 - harsh clip table
-; apatch5 - sample rate
-; apatch6 - sample rate
-
-        mov     eax,ebp                         ; begin calculating first sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     eax,16                          ; finish calculation for first sample
-
-        mov     ebx,ebp                         ; begin calculating second sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     ebx,16                          ; finish calculation for second sample
-
-        movsx   eax, byte ptr [esi+2*eax]       ; get first sample
-        movsx   ebx, byte ptr [esi+2*ebx]       ; get second sample
-        add     eax, 80h
-        add     ebx, 80h
-
-        ALIGN 4
-mix8Mloop:
-        movzx   edx, byte ptr [edi]             ; get current sample from destination
-apatch1:
-        movsx   eax, byte ptr [2*eax+12345678h] ; volume translate first sample
-apatch2:
-        movsx   ebx, byte ptr [2*ebx+12345678h] ; volume translate second sample
-        add     eax, edx                        ; mix first sample
-apatch9:
-        movzx   edx, byte ptr [edi + 1]         ; get current sample from destination
-apatch3:
-        mov     eax, [eax + 12345678h]          ; harsh clip new sample
-        add     ebx, edx                        ; mix second sample
-        mov     [edi], al                       ; write new sample to destination
-        mov     edx, ebp                        ; begin calculating third sample
-apatch4:
-        mov     ebx, [ebx + 12345678h]          ; harsh clip new sample
-apatch5:
-        add     ebp,12345678h                   ; advance frac pointer
-        shr     edx, 16                         ; finish calculation for third sample
-        mov     eax, ebp                        ; begin calculating fourth sample
-apatch7:
-        add     edi, 2                          ; move destination to second sample
-        shr     eax, 16                         ; finish calculation for fourth sample
-        mov     [edi], bl                       ; write new sample to destination
-apatch6:
-        add     ebp,12345678h                   ; advance frac pointer
-        movsx   ebx, byte ptr [esi+2*eax]         ; get fourth sample
-        movsx   eax, byte ptr [esi+2*edx]         ; get third sample
-        add     ebx, 80h
-        add     eax, 80h
-apatch8:
-        add     edi, 2                          ; move destination to third sample
-        dec     ecx                             ; decrement count
-        jnz     mix8Mloop                       ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-exit8m:
-        popad
-        ret
-ENDP    MV_Mix8BitMono16_
-
-;================
-;
-; MV_Mix8BitStereo16
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix8BitStereo16_
-PUBLIC  MV_Mix8BitStereo16_
-
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-        inc     esi
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET bpatch8+2            ; convice tasm to modify code...
-        mov     [eax],bl
- ;       mov     eax,OFFSET bpatch9+2            ; convice tasm to modify code...
- ;       mov     [eax],bl
-
-        ; Right channel offset
-        mov     ebx, _MV_RightChannelOffset
-        mov     eax,OFFSET bpatch6+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET bpatch7+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET bpatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        mov     ebx, _MV_RightVolume
-        mov     eax,OFFSET bpatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET bpatch3+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        ; Harsh Clip table ptr
-        mov     ebx, _MV_HarshClipTable
-        add     ebx,128
-        mov     eax,OFFSET bpatch4+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET bpatch5+2            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        cmp     ecx, 0
-        je      short exit8S
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; bpatch1 - left volume table
-; bpatch2 - right volume table
-; bpatch3 - sample rate
-; bpatch4 - harsh clip table
-; bpatch5 - harsh clip table
-
-        mov     eax,ebp                         ; begin calculating first sample
-        shr     eax,16                          ; finish calculation for first sample
-
-        movsx   ebx, byte ptr [esi+2*eax]       ; get first sample
-        add     ebx, 80h
-
-        ALIGN 4
-mix8Sloop:
-bpatch1:
-        movsx   eax, byte ptr [2*ebx+12345678h] ; volume translate left sample
-        movzx   edx, byte ptr [edi]             ; get current sample from destination
-bpatch2:
-        movsx   ebx, byte ptr [2*ebx+12345678h] ; volume translate right sample
-        add     eax, edx                        ; mix left sample
-bpatch3:
-        add     ebp,12345678h                   ; advance frac pointer
-bpatch6:
-        movzx   edx, byte ptr [edi+12345678h]   ; get current sample from destination
-bpatch4:
-        mov     eax, [eax + 12345678h]          ; harsh clip left sample
-        add     ebx, edx                        ; mix right sample
-        mov     [edi], al                       ; write left sample to destination
-bpatch5:
-        mov     ebx, [ebx + 12345678h]          ; harsh clip right sample
-        mov     edx, ebp                        ; begin calculating second sample
-bpatch7:
-        mov     [edi+12345678h], bl             ; write right sample to destination
-        shr     edx, 16                         ; finish calculation for second sample
-bpatch8:
-        add     edi, 1                          ; move destination to second sample
-        movsx   ebx, byte ptr [esi+2*edx]       ; get second sample
-        add     ebx, 80h
-        dec     ecx                             ; decrement count
-        jnz     mix8Sloop                       ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-
-EXIT8S:
-        popad
-        ret
-ENDP    MV_Mix8BitStereo16_
-
-;================
-;
-; MV_Mix16BitMono16
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix16BitMono16_
-PUBLIC  MV_Mix16BitMono16_
-
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET cpatch4+2            ; convice tasm to modify code...
-        mov     [eax],bl
-        mov     eax,OFFSET cpatch5+3            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET cpatch2+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET cpatch1+4            ; convice tasm to modify code...
-        inc     ebx
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET cpatch3+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        cmp     ecx, 0
-        je exit16M
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     ecx - count
-;     edi - destination
-;     esi - source
-;     ebp - frac pointer
-; cpatch1 - volume table
-; cpatch2 - volume table
-; cpatch3 - sample rate
-; cpatch4 - sample rate
-
-        mov     ebx,ebp                         ; begin calculating first sample
-        add     ebp,edx                         ; advance frac pointer
-        shr     ebx,16                          ; finish calculation for first sample
-        movzx   eax, word ptr [esi+2*ebx]       ; get low byte of sample
-        xor     eax, 8000h
-        movzx   ebx, ah
-        sub     ah, ah
-
-        movsx   edx, word ptr [edi]             ; get current sample from destination
-
-        ALIGN 4
-mix16Mloop:
-cpatch1:
-        movsx   eax, byte ptr [2*eax+12345678h] ; volume translate low byte of sample
-cpatch2:
-        movsx   ebx, word ptr [2*ebx+12345678h] ; volume translate high byte of sample
-        lea     eax, [ eax + ebx + 80h ]        ; mix high byte of sample
-        add     eax, edx                        ; mix low byte of sample
-cpatch5:
-        movsx   edx, word ptr [edi + 2]         ; get current sample from destination
-
-        cmp     eax, -32768                     ; Harsh clip sample
-        jge     short m16skip1
-        mov     eax, -32768
-        jmp     short m16skip2
-m16skip1:
-        cmp     eax, 32767
-        jle     short m16skip2
-        mov     eax, 32767
-m16skip2:
-        mov     ebx, ebp                        ; begin calculating second sample
-        mov     [edi], ax                       ; write new sample to destination
-
-        shr     ebx, 16                         ; finish calculation for second sample
-cpatch3:
-        add     ebp, 12345678h                  ; advance frac pointer
-
-        movzx   eax, word ptr [esi+2*ebx]       ; get second sample
-cpatch4:
-        add     edi, 2                          ; move destination to second sample
-        xor     eax, 8000h
-        movzx   ebx, ah
-        sub     ah, ah
-
-        dec     ecx                             ; decrement count
-        jnz     mix16Mloop                      ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-EXIT16M:
-        popad
-        ret
-ENDP    MV_Mix16BitMono16_
-
-;================
-;
-; MV_Mix16BitStereo16
-;
-;================
-
-; eax - position
-; edx - rate
-; ebx - start
-; ecx - number of samples to mix
-
-PROC    MV_Mix16BitStereo16_
-PUBLIC  MV_Mix16BitStereo16_
-
-        pushad
-        mov     ebp, eax
-
-        mov     esi, ebx                        ; Source pointer
-
-        ; Sample size
-        mov     ebx, _MV_SampleSize
-        mov     eax,OFFSET dpatch9+2            ; convice tasm to modify code...
-        mov     [eax],bl
-
-        ; Right channel offset
-        mov     ebx, _MV_RightChannelOffset
-        mov     eax,OFFSET dpatch7+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET dpatch8+3            ; convice tasm to modify code...
-        mov     [eax],ebx
-
-        ; Volume table ptr
-        mov     ebx, _MV_LeftVolume
-        mov     eax,OFFSET dpatch1+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET dpatch2+4            ; convice tasm to modify code...
-        inc     ebx
-        mov     [eax],ebx
-
-        mov     ebx, _MV_RightVolume
-        mov     eax,OFFSET dpatch3+4            ; convice tasm to modify code...
-        mov     [eax],ebx
-        mov     eax,OFFSET dpatch4+4            ; convice tasm to modify code...
-        inc     ebx
-        mov     [eax],ebx
-
-        ; Rate scale ptr
-        mov     eax,OFFSET dpatch5+2            ; convice tasm to modify code...
-        mov     [eax],edx
-
-        ; Source ptr
-        mov     eax,OFFSET dpatch6+4            ; convice tasm to modify code...
-        mov     [eax],esi
-
-        mov     edi, _MV_MixDestination         ; Get the position to write to
-
-        ; Number of samples to mix
-        cmp     ecx, 0
-        je      exit16S
-
-;     eax - scratch
-;     ebx - scratch
-;     edx - scratch
-;     esi - scratch
-;     ecx - count
-;     edi - destination
-;     ebp - frac pointer
-; dpatch1 - left volume table
-; dpatch2 - right volume table
-; dpatch3 - sample rate
-
-        mov     ebx,ebp                         ; begin calculating first sample
-        shr     ebx,16                          ; finish calculation for first sample
-
-        movzx   edx, word ptr [esi+2*ebx]       ; get first sample
-        xor     edx, 8000h                      ; Change from signed to unsigned
-        movzx   esi, dh                         ; put high byte in esi
-        sub     dh, dh                          ; lo byte in edx
-
-        ALIGN 4
-mix16Sloop:
-        ; Left channel
-dpatch1:
-        movsx   eax, word ptr [2*esi+12345678h] ; volume translate high byte of sample
-dpatch2:
-        movsx   ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
-        lea     eax, [ eax + ebx + 80h ]        ; mix high byte of sample
-
-        ; Right channel
-dpatch3:
-        movsx   esi, word ptr [2*esi+12345678h] ; volume translate high byte of sample
-dpatch4:
-        movsx   ebx, byte ptr [2*edx+12345678h] ; volume translate low byte of sample
-        lea     ebx, [ esi + ebx + 80h ]        ; mix high byte of sample
-
-dpatch7:
-        movsx   edx, word ptr [edi+12345678h]   ; get current sample from destination
-dpatch5:
-        add     ebp,12345678h                   ; advance frac pointer
-
-        add     eax, edx                        ; mix left sample
-
-        cmp     eax, -32768                     ; Harsh clip sample
-        jge     short s16skip1
-        mov     eax, -32768
-        jmp     short s16skip2
-s16skip1:
-        cmp     eax, 32767
-        jle     short s16skip2
-        mov     eax, 32767
-s16skip2:
-        movsx   edx, word ptr [edi+2]           ; get current sample from destination
-        mov     [edi], ax                       ; write left sample to destination
-        add     ebx, edx                        ; mix right sample
-
-        cmp     ebx, -32768                     ; Harsh clip sample
-        jge     short s16skip3
-        mov     ebx, -32768
-        jmp     short s16skip4
-s16skip3:
-        cmp     ebx, 32767
-        jle     short s16skip4
-        mov     ebx, 32767
-s16skip4:
-
-        mov     edx, ebp                        ; begin calculating second sample
-dpatch8:
-        mov     [edi+12345678h], bx             ; write right sample to destination
-        shr     edx, 16                         ; finish calculation for second sample
-dpatch9:
-        add     edi, 4                          ; move destination to second sample
-
-dpatch6:
-        movzx   edx, word ptr [2*edx+12345678h] ; get second sample
-        xor     edx, 8000h                      ; Change from signed to unsigned
-        movzx   esi, dh                         ; put high byte in esi
-        sub     dh, dh                          ; lo byte in edx
-
-        dec     ecx                             ; decrement count
-        jnz     mix16Sloop                      ; loop
-
-        mov     _MV_MixDestination, edi         ; Store the current write position
-        mov     _MV_MixPosition, ebp            ; return position
-exit16S:
-        popad
-        ret
-ENDP    MV_Mix16BitStereo16_
-
-        ENDS
-
-        END
--- a/src/audiolib/mvreverb.asm
+++ /dev/null
@@ -1,181 +1,0 @@
-        IDEAL
-
-        p386
-        MODEL  flat
-
-        dataseg
-        CODESEG
-
-        MASM
-        ALIGN 4
-
-;================
-;
-; MV_16BitReverb
-;
-;================
-
-; eax - source position
-; edx - destination position
-; ebx - Volume table
-; ecx - number of samples
-
-PROC    MV_16BitReverb_
-PUBLIC  MV_16BitReverb_
-
-        mov     esi, eax
-        lea     edi, [edx - 2]
-
-        ALIGN 4
-rev16loop:
-        movzx   eax, word ptr [esi]             ; get sample
-        add     edi, 2
-
-        movzx   edx, ah
-        sub     ah, ah
-
-        movsx   eax, byte ptr [2*eax+ebx+1]     ; volume translate low byte of sample
-        xor     edx, 80h
-
-        movsx   edx, word ptr [2*edx+ebx]       ; volume translate high byte of sample
-        add     esi, 2
-
-        lea     eax, [ eax + edx + 80h ]        ; mix high byte of sample
-        dec     ecx                             ; decrement count
-
-        mov     [edi], ax                       ; write new sample to destination
-        jnz     rev16loop                       ; loop
-
-        ret
-ENDP    MV_16BitReverb_
-
-;================
-;
-; MV_8BitReverb
-;
-;================
-
-; eax - source position
-; edx - destination position
-; ebx - Volume table
-; ecx - number of samples
-
-PROC    MV_8BitReverb_
-PUBLIC  MV_8BitReverb_
-
-        mov     esi, eax
-        lea     edi, [edx - 1]
-
-        xor     eax, eax
-
-        ALIGN 4
-rev8loop:
-;        movzx   eax, byte ptr [esi]             ; get sample
-        mov     al, byte ptr [esi]              ; get sample
-        inc     edi
-
-;        movsx   eax, byte ptr [2*eax+ebx]       ; volume translate sample
-        mov     al, byte ptr [2*eax+ebx]        ; volume translate sample
-        inc     esi
-
-;        add     eax, 80h
-        add     al, 80h
-        dec     ecx                             ; decrement count
-
-        mov     [edi], al                       ; write new sample to destination
-        jnz     rev8loop                        ; loop
-
-        ret
-ENDP    MV_8BitReverb_
-
-;================
-;
-; MV_16BitReverbFast
-;
-;================
-
-; eax - source position
-; edx - destination position
-; ebx - number of samples
-; ecx - shift
-
-PROC    MV_16BitReverbFast_
-PUBLIC  MV_16BitReverbFast_
-
-        mov     esi, eax
-        mov     eax,OFFSET rpatch16+3
-
-        mov     [eax],cl
-        lea     edi, [edx - 2]
-
-        ALIGN 4
-frev16loop:
-        mov     ax, word ptr [esi]             ; get sample
-        add     edi, 2
-
-rpatch16:
-        sar     ax, 5    ;;;;Add 1 before shift
-        add     esi, 2
-
-        mov     [edi], ax                       ; write new sample to destination
-        dec     ebx                             ; decrement count
-
-        jnz     frev16loop                      ; loop
-
-        ret
-ENDP    MV_16BITREVERBFAST_
-
-;================
-;
-; MV_8BitReverbFast
-;
-;================
-
-; eax - source position
-; edx - destination position
-; ebx - number of samples
-; ecx - shift
-
-PROC    MV_8BitReverbFast_
-PUBLIC  MV_8BitReverbFast_
-        mov     esi, eax
-        mov     eax,OFFSET rpatch8+2
-
-        mov     edi, edx
-        mov     edx, 80h
-
-        mov     [eax],cl
-        mov     eax, 80h
-
-        shr     eax, cl
-
-        dec     edi
-        sub     edx, eax
-
-        ALIGN 4
-frev8loop:
-        mov     al, byte ptr [esi]             ; get sample
-        inc     esi
-
-        mov     ecx, eax
-        inc     edi
-
-rpatch8:
-        shr     eax, 3
-        xor     ecx, 80h                        ; flip the sign bit
-
-        shr     ecx, 7                          ; shift the sign down to 1
-        add     eax, edx
-
-        add     eax, ecx                        ; add sign bit to round to 0
-        dec     ebx                             ; decrement count
-
-        mov     [edi], al                       ; write new sample to destination
-        jnz     frev8loop                       ; loop
-
-        ret
-ENDP    MV_8BITREVERBFAST_
-
-        ENDS
-
-        END
--- a/src/audiolib/myprint.c
+++ /dev/null
@@ -1,308 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include "myprint.h"
-
-static unsigned short disp_offset = 160 * 24;
-
-void DrawText
-   (
-   int x,
-   int y,
-   int ch,
-   int foreground,
-   int background
-   )
-
-   {
-   char *vid;
-
-   vid  = ( char * )( 0xb0000 );
-   vid += y * 160;
-   vid += x * 2;
-
-   if ( ch != NONE )
-      {
-      *vid = ch;
-      }
-   vid++;
-   *vid = ( ( background & 0x0f ) << 4 ) | ( foreground & 0x0f );
-   }
-
-void TextBox
-   (
-   int  x1,
-   int  y1,
-   int  x2,
-   int  y2,
-   int ch,
-   int  foreground,
-   int  background
-   )
-
-   {
-   int x;
-   int y;
-
-   for( x = x1; x <= x2; x++ )
-      {
-      for( y = y1; y <= y2; y++ )
-         {
-         DrawText( x, y, ch, foreground, background );
-         }
-      }
-   }
-
-void TextFrame
-   (
-   int x1,
-   int y1,
-   int x2,
-   int y2,
-   int type,
-   int foreground,
-   int background
-   )
-
-   {
-   int x;
-   int y;
-
-   if ( type == 0 )
-      {
-      for( x = x1 + 1; x < x2; x++ )
-         {
-         DrawText( x, y1, type, foreground, background );
-         DrawText( x, y2, type, foreground, background );
-         }
-      for( y = y1 + 1; y < y2; y++ )
-         {
-         DrawText( x1, y, type, foreground, background );
-         DrawText( x2, y, type, foreground, background );
-         }
-      }
-   if ( type == SINGLE_FRAME )
-      {
-      DrawText( x1, y1, '�', foreground, background );
-      DrawText( x2, y1, '�', foreground, background );
-      DrawText( x1, y2, '�', foreground, background );
-      DrawText( x2, y2, '�', foreground, background );
-      for( x = x1 + 1; x < x2; x++ )
-         {
-         DrawText( x, y1, '�', foreground, background );
-         DrawText( x, y2, '�', foreground, background );
-         }
-      for( y = y1 + 1; y < y2; y++ )
-         {
-         DrawText( x1, y, '�', foreground, background );
-         DrawText( x2, y, '�', foreground, background );
-         }
-      }
-   if ( type == DOUBLE_FRAME )
-      {
-      DrawText( x1, y1, '�', foreground, background );
-      DrawText( x2, y1, '�', foreground, background );
-      DrawText( x1, y2, '�', foreground, background );
-      DrawText( x2, y2, '�', foreground, background );
-      for( x = x1 + 1; x < x2; x++ )
-         {
-         DrawText( x, y1, '�', foreground, background );
-         DrawText( x, y2, '�', foreground, background );
-         }
-      for( y = y1 + 1; y < y2; y++ )
-         {
-         DrawText( x1, y, '�', foreground, background );
-         DrawText( x2, y, '�', foreground, background );
-         }
-      }
-   }
-
-void mysetxy
-   (
-   int x,
-   int y
-   )
-
-   {
-   disp_offset = ( x * 2 ) + ( y * 160 );
-   }
-
-void myputch
-   (
-   char ch
-   )
-
-   {
-   int j;
-   char *disp_start = (char *)( 0xb0000 );
-
-   if ( disp_offset >= 160 * 24 )
-      {
-      for ( j = 160; j < 160 * 24; j += 2 )
-         {
-         *( disp_start + j - 160 ) = *( disp_start + j );
-         }
-
-      disp_offset = 160 * 23;
-
-      for ( j = disp_offset; j < ( 160 * 24 ); j += 2 )
-         {
-         *( disp_start + j ) = ' ';
-         }
-      }
-
-   if ( ch >= 32 )
-      {
-      *( disp_start + disp_offset ) = ch;
-      disp_offset = disp_offset + 2;
-      }
-
-   if ( ch == '\r' )
-      {
-      disp_offset = disp_offset / 160;
-      disp_offset = disp_offset * 160;
-      }
-
-   if ( ch == '\n' )
-      {
-      disp_offset = disp_offset + 160;
-      if ( disp_offset < 160 * 24 )
-         {
-         for ( j = disp_offset; j < ( ( ( disp_offset / 160 ) + 1 ) *
-            160 ); j += 2 )
-            {
-            *( disp_start + j ) = ' ';
-            }
-         }
-      }
-   }
-
-int printstring
-   (
-   char *string
-   )
-
-   {
-   int count;
-   char *ptr;
-
-   ptr = string;
-   count = 0;
-
-   while ( *ptr )
-      {
-      myputch( *ptr );
-      count++;
-      ptr++;
-      }
-
-   return( count );
-   }
-
-
-int printnum
-   (
-   int number
-   )
-
-   {
-   char string[ 100 ];
-   int  count;
-
-   itoa( number, string, 10 );
-   count = printstring( string );
-
-   return( count );
-   }
-
-int printunsigned
-   (
-   unsigned long number,
-   int radix
-   )
-
-   {
-   char string[ 100 ];
-   int  count;
-
-   ultoa( number, string, radix );
-   count = printstring( string );
-
-   return( count );
-   }
-
-int myprintf
-   (
-   char *fmt,
-   ...
-   )
-
-   {
-   va_list argptr;
-   int     count;
-   char    *ptr;
-
-   return( 0 );
-
-   // DEBUG
-   mysetxy( 0, 0 );
-
-   va_start( argptr, fmt );
-   ptr = fmt;
-   count = 0;
-
-   while( *ptr != 0 )
-      {
-      if ( *ptr == '%' )
-         {
-         ptr++;
-         switch( *ptr )
-            {
-            case 0 :
-               return( EOF );
-               break;
-            case 'd' :
-               count += printnum( va_arg( argptr, int ) );
-               break;
-            case 's' :
-               count += printstring( va_arg( argptr, char * ) );
-               break;
-            case 'u' :
-               count += printunsigned( va_arg( argptr, int ), 10 );
-               break;
-            case 'x' :
-            case 'X' :
-               count += printunsigned( va_arg( argptr, int ), 16 );
-               break;
-            }
-         ptr++;
-         }
-      else
-         {
-         myputch( *ptr );
-         count++;
-         ptr++;
-         }
-      }
-
-   va_end( argptr );
-
-   return( count );
-   }
--- a/src/audiolib/myprint.h
+++ /dev/null
@@ -1,41 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef __MYPRINT_H
-#define __MYPRINT_H
-
-enum COLORS
-   {
-   BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY,
-   LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE
-   };
-
-#define NONE         -1
-#define SINGLE_FRAME -1
-#define DOUBLE_FRAME -2
-
-void DrawText( int x, int y, int ch, int foreground, int background );
-void TextBox( int x1, int y1, int x2, int y2, int ch, int foreground, int background );
-void TextFrame( int x1, int y1, int x2, int y2, int type, int foreground, int background );
-void mysetxy( int x, int y );
-void myputch( char ch );
-int  printstring( char *string );
-int  printnum( int number );
-int  printunsigned( unsigned long number, int radix );
-int  myprintf( char *fmt, ... );
-
-#endif
--- a/src/audiolib/newgf1.h
+++ /dev/null
@@ -1,429 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/***************************************************************************
-*	NAME:  GF1.H
-**	COPYRIGHT:
-**	"Copyright (c) 1991,1992, by FORTE
-**
-**       "This software is furnished under a license and may be used,
-**       copied, or disclosed only in accordance with the terms of such
-**       license and with the inclusion of the above copyright notice.
-**       This software or any other copies thereof may not be provided or
-**       otherwise made available to any other person. No title to and
-**       ownership of the software is hereby transfered."
-****************************************************************************
-*  CREATION DATE: 07/01/92
-*--------------------------------------------------------------------------*
-*     VERSION	DATE	   NAME		DESCRIPTION
-*>	1.0	07/01/92		Original
-***************************************************************************/
-
-#ifndef	_GF1_H		/* allow header to be processed only once */
-#define _GF1_H
-
-/* error codes */
-#define OK			0
-#define NO_MORE_VOICES		-1
-#define	BASE_NOT_FOUND		1
-#define BAD_IRQ			2
-#define BAD_DMA			3
-#define OS_LOADED		4
-#define NOT_LOADED		5
-#define NO_MEMORY		6
-#define DMA_BUSY		7
-#define NO_MORE_HANDLERS	8
-#define DMA_HUNG		9
-#define CARD_NOT_FOUND		10
-#define CARD_BEING_USED		11
-#define NO_MORE_INTERRUPTS	12
-#define BAD_TIMER		13
-#define BAD_PATCH		14
-#define OLD_PATCH		15
-#define DOS_ERROR		16
-#define FILE_NOT_FOUND		17
-
-/* bits */
-#define	BIT0	0x01
-#define	BIT1	0x02
-#define	BIT2	0x04
-#define	BIT3	0x08
-#define	BIT4	0x10
-#define	BIT5	0x20
-#define	BIT6	0x40
-#define	BIT7	0x80
-
-/* bounds for volume enveloping functions */
-#define MIN_OFFSET      5U
-#define MAX_OFFSET      251U
-
-/* bounds for voice allocation */
-#define MIN_VOICES	14
-#define MAX_VOICES	32
-
-/* DMA control bits */
-#define DMA_ENABLE		BIT0
-#define DMA_READ		BIT1
-#define DMA_WIDTH_16		BIT2 /* width of DMA channel */
-#define DMA_RATE_DIV_1		BIT3
-#define DMA_RATE_DIV_2		BIT4
-#define DMA_IRQ_ENABLE		BIT5
-#define DMA_IRQ_PRESENT		BIT6
-#define DMA_DATA_16		BIT6 /* width of data */
-#define DMA_INVERT_MSB		BIT7
-
-/* SAMPLE control bits */
-#define DMA_STEREO		2
-
-/* DMA flags */
-#define GF1_RECORD	0 /* use dma control or sample control */
-#define GF1_DMA		1
-
-/* MIDI control register */
-#define MIDI_RESET	(BIT0|BIT1)
-#define MIDI_TD_INT	BIT5
-#define MIDI_RD_INT	BIT7
-
-/* MIDI_STATUS_REGISTER */
-#define MIDI_RD		BIT0
-#define MIDI_TD		BIT1
-#define MIDI_ERR_FRAMING BIT4
-#define MIDI_ERR_OVERRUN BIT5
-
-/* digital playback flags */
-#define TYPE_8BIT	BIT0	/* 1 use 8 bit data */
-				/* 0 use 16 bit data */
-#define TYPE_PRELOAD	BIT1	/* preload data */
-#define TYPE_INVERT_MSB BIT2	/* invert most significant bit during dma */
-#define TYPE_STEREO	BIT3	/* 1 for stereo data */
-
-/* sound effects and digital music types */
-#define SND_LOOP_MASK		(BIT0|BIT1)
-#define SND_LOOP_NONE		0
-#define SND_LOOP		1
-#define SND_LOOP_BIDIR		2
-#define SND_8BIT		(BIT2)
-#define SND_BACKWARD		(BIT3)
-
-#define SOUND_PLAYING		2
-#define SOUND_ACTIVE		1
-
-/* patch macros */
-#define HEADER_SIZE	           12
-#define ID_SIZE		           10
-#define DESC_SIZE 	           60
-#define RESERVED_SIZE	           40
-#define PATCH_HEADER_RESERVED_SIZE 36
-#define LAYER_RESERVED_SIZE	   40
-#define PATCH_DATA_RESERVED_SIZE   36
-#define GF1_HEADER_TEXT            "GF1PATCH110"
-#define INST_NAME_SIZE		   16
-#define ENVELOPES		   6
-#define MAX_LAYERS		   4
-
-/* patch modes */
-#define PATCH_16		BIT0
-#define PATCH_UNSIGNED		BIT1
-#define PATCH_LOOPEN		BIT2
-#define PATCH_BIDIR		BIT3
-#define PATCH_BACKWARD  	BIT4
-#define PATCH_SUSTAIN   	BIT5
-#define PATCH_NO_SRELEASE	BIT6
-#define PATCH_FAST_REL		BIT7
-
-/* flags for patch loading */
-#define PATCH_LOAD_8_BIT BIT0
-
-/* digital playback callback reasons & return values */
-#define	DIG_DONE	   0
-#define DIG_MORE_DATA	   1
-#define DIG_BUFFER_DONE    2
-#define DIG_PAUSE          3
-
-/* log table used for vibrato and pitch bend.  log table made public for
-** developers use */
-#define LOG_TAB_SIZE 12
-extern long gf1_log_table[LOG_TAB_SIZE];
-
-#if defined(__BORLANDC__)
-#undef RFAR
-#define RFAR far
-#elif defined(_MSC_VER) && (_MSC_VER <= 600)
-#define RFAR far
-#elif defined(_MSC_VER) && (_MSC_VER > 600)
-#define RFAR __far
-#else
-#undef RFAR
-#define RFAR
-#endif
-
-/* structure definitions */
-struct	load_os	
-{
-	unsigned short 	voices;
-	unsigned short	forced_base_port;
-	unsigned char	forced_gf1_irq;
-	unsigned char	forced_midi_irq;
-	unsigned char	forced_channel_in;
-	unsigned char	forced_channel_out;
-};
-
-struct	patchheader
-{
-	char		header[ HEADER_SIZE ];	
-	char		gravis_id[ ID_SIZE ];	/* Id = "ID#000002" */
-	char		description[ DESC_SIZE ];
-	unsigned char	instruments;
-	char		voices;
-	char		channels;
-	unsigned short	wave_forms;
-	unsigned short	master_volume;
-	unsigned long	data_size;
-	char		reserved[ PATCH_HEADER_RESERVED_SIZE ];
-};
-
-struct	instrumentdata
-{
-	unsigned short	instrument;
-	char		instrument_name[ INST_NAME_SIZE ];
-	long		instrument_size;
-	char		layers;
-	char		reserved[ RESERVED_SIZE ];	
-};
-
-struct	layerdata
-{
-	char		layer_duplicate;
-	char		layer;
-	long		layer_size;
-	char		samples;
-	char		reserved[ LAYER_RESERVED_SIZE ];	
-};
-
-struct	patchdata
-{
-	char		wave_name[7];
-	unsigned char	fractions;
-	long		wave_size;
-	long		start_loop;
-	long		end_loop;
-	unsigned short	sample_rate;
-	long		low_frequency;
-	long		high_frequency;
-	long		root_frequency;
-	short		tune;
-	unsigned char	balance;
-	unsigned char	envelope_rate[ ENVELOPES ];
-	unsigned char	envelope_offset[ ENVELOPES ];	
-	unsigned char	tremolo_sweep;
-	unsigned char	tremolo_rate;
-	unsigned char	tremolo_depth;
-	unsigned char	vibrato_sweep;
-	unsigned char	vibrato_rate;
-	unsigned char	vibrato_depth;
-	char		modes;
-	short		scale_frequency;
-	unsigned short	scale_factor;		/* from 0 to 2048 or 0 to 2 */
-	char		reserved[ PATCH_DATA_RESERVED_SIZE ];
-};
-
-struct wave_struct
-{
-	unsigned long		start_loop;
-	unsigned long		end_loop;
-	long		low_frequency;
-	long		high_frequency;
-	long		root_frequency;
-	unsigned long	mem;
-	unsigned short	scale_frequency;
-	unsigned short	sample_rate;
-	unsigned short	scale_factor;
-	unsigned short	start_acc_low;
-	unsigned short	start_acc_high;
-	unsigned short	start_low;
-	unsigned short	start_high;
-	unsigned short	end_low;
-	unsigned short	end_high;
-	unsigned short	end_acc_low;
-	unsigned short	end_acc_high;
-	unsigned short	sample_ratio;
-	unsigned long	wave_size;
-	unsigned char	fractions;
-	unsigned char	balance;
-	unsigned char	envelope_rate[ ENVELOPES ];
-	unsigned char	envelope_offset[ ENVELOPES ];	
-	unsigned char	tremolo_sweep;
-	unsigned char	tremolo_rate;
-	unsigned char	tremolo_depth;
-	unsigned char	vibrato_sweep;
-	unsigned char	vibrato_rate;
-	unsigned char	vibrato_depth;
-	unsigned char	modes;
-};
-
-struct patchinfo {
-	struct patchheader header;
-	struct instrumentdata idata;
-};
-
-struct patch {
-	short nlayers;
-	struct wave_struct RFAR *layer_waves[MAX_LAYERS];
-	short layer_nwaves[MAX_LAYERS];
-	unsigned short detune;
-};
-
-struct gf1_dma_buff {
-	unsigned char RFAR *vptr;
-	unsigned long paddr;
-};
-
-struct gf1_sound {
-	unsigned long mem_pos;
-	unsigned long start_loop;
-	unsigned long end_loop;
-	unsigned char type;
-};
-
-/* GLOBAL VARIABLES (flags) */
-extern char gf1_linear_volumes;
-extern char gf1_dig_use_extra_voice;
-
-/* FUNCTION PROTOTYPES */
-/* Initializeation routines */
-int	gf1_init_ports(int);
-int	gf1_load_os(struct load_os RFAR *os);
-int	gf1_unload_os(void);
-void	gf1_set_appname(char RFAR *);
-void	reset_ultra(int);
-int	gf1_asm_init(void);
-unsigned char gf1_peek(unsigned long address);
-void gf1_poke(unsigned long address, unsigned char data);
-void gf1_poke_block(unsigned char RFAR *data, unsigned long address, unsigned long len, unsigned char dma_control);
-char gf1_good_dram(unsigned long address);
-int GetUltraCfg(struct load_os RFAR *os);
-unsigned long gf1_malloc(unsigned long);
-void gf1_free(unsigned long);
-unsigned long gf1_mem_avail(void);
-unsigned long gf1_mem_largest_avail(void);
-void gf1_delay(void);
-int gf1_allocate_voice(int priority, void (RFAR *steal_notify)(int));
-void gf1_free_voice(unsigned int i);
-void gf1_adjust_priority(int voice, int priority);
-int gf1_dram_xfer(struct gf1_dma_buff RFAR *dptr, unsigned long size, unsigned long dram_address, unsigned char dma_control, unsigned short flags);
-void gf1_stop_dma(void);
-long convert_to_16bit(long address);
-int gf1_wait_dma(void);
-int gf1_dma_ready(void);
-unsigned long gf1_amount_xferred(void);
-int gf1_detect_card(unsigned short port);
-char *gf1_error_str(int);
-int gf1_play_digital(unsigned short priority, unsigned char RFAR *buffer,
-	unsigned long size, unsigned long gf1_addr, unsigned short volume,
-	unsigned short pan, unsigned short frequency, unsigned char type,
-	struct gf1_dma_buff RFAR *dptr,
-	int (RFAR *callback)(int, int, unsigned char RFAR * RFAR *, unsigned long RFAR *));
-void gf1_restart_digital(int voice);
-void gf1_start_digital(int voice);
-void gf1_pause_digital(int voice);
-void RFAR gf1_stop_digital(int voice);
-void gf1_dig_set_dma_rate(unsigned short rate);
-unsigned long gf1_digital_position(int voice);
-int gf1_myatoi(void);
-int gf1_update_waveform(struct wave_struct RFAR *wave_info);
-int gf1_get_patch_info(char RFAR *patch_file, struct patchinfo RFAR *patch);
-int gf1_load_patch(char RFAR *patch_file, struct patchinfo RFAR *patchinfo,
-	struct patch RFAR *patch,
-	struct gf1_dma_buff RFAR *dptr, unsigned short size,
-	unsigned char RFAR *wavemem, int flags);
-void gf1_unload_patch(struct patch RFAR *patch);
-void gf1_detune_patch(struct patch RFAR *patch, unsigned short detune);
-unsigned short gf1_calc_fc(unsigned int sample_ratio,long root,long frequency);
-void gf1_midi_stop_voice(int voice);
-void gf1_midi_wait_voice(int voice);
-unsigned short gf1_midi_status_note(int voice);
-unsigned short gf1_midi_status_voice(int voice);
-void RFAR gf1_midi_stop_note(int note_voice);
-void gf1_midi_note_on(struct patch RFAR *patch, int priority, int note, int velocity, int channel);
-void gf1_midi_note_off(int note, int channel);
-void gf1_midi_silence_patch_notes(struct patch RFAR *patch);
-void gf1_midi_patch_removed(struct patch RFAR *patch);
-int gf1_enable_timer1(int (RFAR *callback)(void), int resolution);
-int gf1_enable_timer2(int (RFAR *callback)(void), int resolution);
-void gf1_disable_timer1(void);
-void gf1_disable_timer2(void);
-void gf1_channel_pitch_bend(int channel, unsigned int bend);
-void gf1_midi_synth_volume(unsigned short synth, int master_volume);
-void gf1_midi_change_program(struct patch RFAR *patch, int channel);
-void gf1_midi_set_vibrato(int channel, int value);
-void gf1_midi_change_volume(int channel, unsigned int volume);
-void gf1_midi_set_balance(int balance, int channel);
-void gf1_midi_channel_sustain(int channel, int sustain);
-void gf1_midi_all_notes_off(int channel);
-void gf1_midi_pitch_bend(int channel, int lsb, int msb);
-void gf1_midi_parameter(int channel, int control, int value);
-int gf1_midi_get_channel_notes(int channel, int notes[]);
-int gf1_midi_get_channel_volume(int channel);
-int gf1_midi_get_master_volume(void);
-int gf1_midi_get_volume(int voice);
-unsigned short gf1_read(int handle, void RFAR *io_buffer, unsigned short size);
-unsigned short gf1_close_file(int handle);
-unsigned int gf1_seek(int handle, unsigned long offset, int method);
-int gf1_open(char RFAR *name);
-#ifdef __FLAT__
-int gf1_atoi(char RFAR **str, int base);
-#else
-int gf1_atoi(void);
-#endif
-void gf1_leave(void);
-short gf1_enter(void);
-void gf1_enter1(void);
-int gf1_play_next_buffer(int voice, unsigned char RFAR *buff, unsigned long size);
-void gf1_dig_set_vol(unsigned short voice, unsigned short vol);
-void gf1_dig_set_pan(unsigned short voice, unsigned short pan);
-int gf1_set_external_semaphore(void RFAR *addr);
-int gf1_clear_external_semaphore(void RFAR *addr);
-void gf1_midi_reset(int c);
-int gf1_add_midi_recv_handler(int (RFAR *handler)());
-int gf1_add_dma_handler(int (*handler)());
-int gf1_add_voice_handler(int (*handler)(int));
-int gf1_add_volume_handler(int (*handler)(int));
-int gf1_add_timer_handler(int timer, int (RFAR *handler)(void));
-void gf1_set_record_rate(unsigned long rate);
-void gf1_create_patch(struct patch RFAR *patch);
-int gf1_add_layer(struct patch RFAR *patch, int layer, char RFAR *wavemem);
-void gf1_get_waveform_info(struct patch RFAR *patch, int layer, int waven,
-	struct wave_struct RFAR *wave);
-void gf1_set_waveform_info(struct patch RFAR *patch, int layer, int waven,
-	struct wave_struct RFAR *wave);
-void gf1_enable_line_in(void);
-void gf1_disable_line_in(void);
-void gf1_enable_mic_in(void);
-void gf1_disable_mic_in(void);
-void gf1_enable_output(void);
-void gf1_disable_output(void);
-void gf1_sound_volume(unsigned short voice, int volume,
-	unsigned long period /* us*10 */);
-void gf1_sound_pan(unsigned short voice, unsigned short pan);
-void gf1_sound_frequency(unsigned short voice, unsigned long freq);
-void RFAR gf1_sound_stop(int voice);
-void gf1_sound_mode(int voice, struct gf1_sound RFAR *sound,
-	unsigned char type);
-int gf1_sound_start(unsigned short priority, struct gf1_sound RFAR *sound,
-	short volume, unsigned long period, short pan, unsigned long freq);
-int gf1_sound_playing(int voice);
-#endif
--- a/src/audiolib/nomusic.c
+++ /dev/null
@@ -1,115 +1,0 @@
-#include "music.h"
-
-char *MUSIC_ErrorString(int ErrorNumber)
-{
-	return "";
-}
-
-int MUSIC_Init(int SoundCard, int Address)
-{
-	return 0;
-}
-
-int MUSIC_Shutdown(void)
-{
-	return 0;
-}
-
-void MUSIC_SetMaxFMMidiChannel(int channel)
-{
-}
-
-void MUSIC_SetVolume(int volume)
-{
-}
-
-void MUSIC_SetMidiChannelVolume(int channel, int volume)
-{
-}
-
-void MUSIC_ResetMidiChannelVolumes(void)
-{
-}
-
-int MUSIC_GetVolume(void)
-{
-	return 0;
-}
-
-void MUSIC_SetLoopFlag(int loopflag)
-{
-}
-
-int MUSIC_SongPlaying(void)
-{
-	return 0;
-}
-
-void MUSIC_Continue(void)
-{
-}
-
-void MUSIC_Pause(void)
-{
-}
-
-int MUSIC_StopSong(void)
-{
-	return 0;
-}
-
-int MUSIC_PlaySong(unsigned char *song, int loopflag)
-{
-	return 0;
-}
-
-void MUSIC_SetContext(int context)
-{
-}
-
-int MUSIC_GetContext(void)
-{
-	return 0;
-}
-
-void MUSIC_SetSongTick(unsigned long PositionInTicks)
-{
-}
-
-void MUSIC_SetSongTime(unsigned long milliseconds)
-{
-}
-
-void MUSIC_SetSongPosition(int measure, int beat, int tick)
-{
-}
-
-void MUSIC_GetSongPosition(songposition *pos)
-{
-}
-
-void MUSIC_GetSongLength(songposition *pos)
-{
-}
-
-int MUSIC_FadeVolume(int tovolume, int milliseconds)
-{
-	return 0;
-}
-
-int MUSIC_FadeActive(void)
-{
-	return 0;
-}
-
-void MUSIC_StopFade(void)
-{
-}
-
-void MUSIC_RerouteMidiChannel(int channel, int cdecl function( int event, int c1, int c2 ))
-{
-}
-
-void MUSIC_RegisterTimbreBank(unsigned char *timbres)
-{
-}
--- a/src/audiolib/pas16.c
+++ /dev/null
@@ -1,1922 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: PAS16.C
-
-   author: James R. Dose
-   date:   March 27, 1994
-
-   Low level routines to support Pro AudioSpectrum and compatible
-   sound cards.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <conio.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "dpmi.h"
-#include "dma.h"
-#include "interrup.h"
-#include "irq.h"
-#include "pas16.h"
-#include "_pas16.h"
-
-#define USESTACK
-
-static const int PAS_Interrupts[ PAS_MaxIrq + 1 ]  =
-   {
-   INVALID, INVALID,     0xa,     0xb,
-   INVALID,     0xd, INVALID,     0xf,
-   INVALID, INVALID,    0x72,    0x73,
-      0x74, INVALID, INVALID,    0x77
-   };
-
-static void    ( interrupt far *PAS_OldInt )( void );
-
-static int PAS_IntController1Mask;
-static int PAS_IntController2Mask;
-
-static int PAS_Installed = FALSE;
-static int PAS_TranslateCode = DEFAULT_BASE;
-
-static int PAS_OriginalPCMLeftVolume  = 75;
-static int PAS_OriginalPCMRightVolume = 75;
-
-static int PAS_OriginalFMLeftVolume  = 75;
-static int PAS_OriginalFMRightVolume = 75;
-
-unsigned int PAS_DMAChannel;
-static int PAS_Irq;
-
-static MVState *PAS_State = NULL;
-static MVFunc  *PAS_Func  = NULL;
-
-static MVState PAS_OriginalState;
-static int     PAS_SampleSizeConfig;
-
-static char   *PAS_DMABuffer;
-static char   *PAS_DMABufferEnd;
-static char   *PAS_CurrentDMABuffer;
-static int     PAS_TotalDMABufferSize;
-
-static int      PAS_TransferLength   = 0;
-static int      PAS_MixMode          = PAS_DefaultMixMode;
-static unsigned PAS_SampleRate       = PAS_DefaultSampleRate;
-static int      PAS_TimeInterval     = 0;
-
-volatile int   PAS_SoundPlaying;
-
-void ( *PAS_CallBack )( void );
-
-// adequate stack size
-#define kStackSize 2048
-
-static unsigned short StackSelector = NULL;
-static unsigned long  StackPointer;
-
-static unsigned short oldStackSelector;
-static unsigned long  oldStackPointer;
-
-// This is defined because we can't create local variables in a
-// function that switches stacks.
-static int irqstatus;
-
-// These declarations are necessary to use the inline assembly pragmas.
-
-extern void GetStack(unsigned short *selptr,unsigned long *stackptr);
-extern void SetStack(unsigned short selector,unsigned long stackptr);
-
-// This function will get the current stack selector and pointer and save
-// them off.
-#pragma aux GetStack =  \
-   "mov  [edi],esp"     \
-   "mov  ax,ss"         \
-   "mov  [esi],ax"      \
-   parm [esi] [edi]     \
-   modify [eax esi edi];
-
-// This function will set the stack selector and pointer to the specified
-// values.
-#pragma aux SetStack =  \
-   "mov  ss,ax"         \
-   "mov  esp,edx"       \
-   parm [ax] [edx]      \
-   modify [eax edx];
-
-int PAS_ErrorCode = PAS_Ok;
-
-#define PAS_SetErrorCode( status ) \
-   PAS_ErrorCode   = ( status );
-
-/*---------------------------------------------------------------------
-   Function: PAS_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *PAS_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case PAS_Warning :
-      case PAS_Error :
-         ErrorString = PAS_ErrorString( PAS_ErrorCode );
-         break;
-
-      case PAS_Ok :
-         ErrorString = "Pro AudioSpectrum ok.";
-         break;
-
-      case PAS_DriverNotFound :
-         ErrorString = "MVSOUND.SYS not loaded.";
-         break;
-
-      case PAS_DmaError :
-         ErrorString = DMA_ErrorString( DMA_Error );
-         break;
-
-      case PAS_InvalidIrq :
-         ErrorString = "Invalid Pro AudioSpectrum Irq.";
-         break;
-
-      case PAS_UnableToSetIrq :
-         ErrorString = "Unable to set Pro AudioSpectrum IRQ.  Try selecting an IRQ of 7 or below.";
-         break;
-
-      case PAS_Dos4gwIrqError :
-         ErrorString = "Unsupported Pro AudioSpectrum Irq.";
-         break;
-
-      case PAS_NoSoundPlaying :
-         ErrorString = "No sound playing on Pro AudioSpectrum.";
-         break;
-
-      case PAS_CardNotFound :
-         ErrorString = "Could not find Pro AudioSpectrum.";
-         break;
-
-      case PAS_DPMI_Error :
-         ErrorString = "DPMI Error in PAS16.";
-         break;
-
-      case PAS_OutOfMemory :
-         ErrorString = "Out of conventional memory in PAS16.";
-         break;
-
-      default :
-         ErrorString = "Unknown Pro AudioSpectrum error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define PAS_LockStart PAS_CheckForDriver
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_CheckForDriver
-
-   Checks to see if MVSOUND.SYS is installed.
----------------------------------------------------------------------*/
-
-int PAS_CheckForDriver
-   (
-   void
-   )
-
-   {
-   union REGS regs;
-   unsigned   result;
-
-   regs.w.ax = MV_CheckForDriver;
-   regs.w.bx = 0x3f3f;
-
-   #ifdef __386__
-      int386( MV_SoundInt, &regs, &regs );
-   #else
-      int86( MV_SoundInt, &regs, &regs );
-   #endif
-
-   if ( regs.w.ax != MV_CheckForDriver )
-      {
-      PAS_SetErrorCode( PAS_DriverNotFound );
-      return( PAS_Error );
-      }
-
-   result = regs.w.bx ^ regs.w.cx ^ regs.w.dx;
-   if ( result != MV_Signature )
-      {
-      PAS_SetErrorCode( PAS_DriverNotFound );
-      return( PAS_Error );
-      }
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetStateTable
-
-   Returns a pointer to the state table containing hardware state
-   information.  The state table is necessary because the Pro Audio-
-   Spectrum contains only write-only registers.
----------------------------------------------------------------------*/
-
-MVState *PAS_GetStateTable
-   (
-   void
-   )
-
-   {
-   union REGS   regs;
-   MVState *ptr;
-
-   regs.w.ax = MV_GetPointerToStateTable;
-
-   #ifdef __386__
-      int386( MV_SoundInt, &regs, &regs );
-   #else
-      int86( MV_SoundInt, &regs, &regs );
-   #endif
-
-   if ( regs.w.ax != MV_Signature )
-      {
-      PAS_SetErrorCode( PAS_DriverNotFound );
-      return( NULL );
-      }
-
-   #if defined(__WATCOMC__) && defined(__FLAT__)
-      ptr = ( MVState * )( ( ( ( unsigned )regs.w.dx ) << 4 ) +
-         ( ( unsigned )regs.w.bx ) );
-   #else
-      ptr = MK_FP( regs.w.dx, regs.w.bx );
-   #endif
-
-   return( ptr );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetFunctionTable
-
-   Returns a pointer to the function table containing addresses of
-   driver functions.
----------------------------------------------------------------------*/
-
-MVFunc *PAS_GetFunctionTable
-   (
-   void
-   )
-
-   {
-   union REGS   regs;
-   MVFunc *ptr;
-
-   regs.w.ax = MV_GetPointerToFunctionTable;
-
-   #ifdef __386__
-      int386( MV_SoundInt, &regs, &regs );
-   #else
-      int86( MV_SoundInt, &regs, &regs );
-   #endif
-
-   if ( regs.w.ax != MV_Signature )
-      {
-      PAS_SetErrorCode( PAS_DriverNotFound );
-      return( NULL );
-      }
-
-   #if defined(__WATCOMC__) && defined(__FLAT__)
-      ptr = ( MVFunc * )( ( ( ( unsigned )regs.w.dx ) << 4 ) +
-         ( ( unsigned )regs.w.bx ) );
-   #else
-      ptr = MK_FP( regs.w.dx, regs.w.bx );
-   #endif
-
-   return( ptr );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetCardSettings
-
-   Returns the DMA and the IRQ channels of the sound card.
----------------------------------------------------------------------*/
-
-int PAS_GetCardSettings
-   (
-   void
-   )
-
-   {
-   union REGS   regs;
-   int          status;
-
-   regs.w.ax = MV_GetDmaIrqInt;
-
-   #ifdef __386__
-      int386( MV_SoundInt, &regs, &regs );
-   #else
-      int86( MV_SoundInt, &regs, &regs );
-   #endif
-
-   if ( regs.w.ax != MV_Signature )
-      {
-      PAS_SetErrorCode( PAS_DriverNotFound );
-      return( PAS_Error );
-      }
-
-   PAS_DMAChannel = regs.w.bx;
-   PAS_Irq        = regs.w.cx;
-
-   if ( PAS_Irq > PAS_MaxIrq )
-      {
-      PAS_SetErrorCode( PAS_Dos4gwIrqError );
-      return( PAS_Error );
-      }
-
-   if ( !VALID_IRQ( PAS_Irq ) )
-      {
-      PAS_SetErrorCode( PAS_InvalidIrq );
-      return( PAS_Error );
-      }
-
-   if ( PAS_Interrupts[ PAS_Irq ] == INVALID )
-      {
-      PAS_SetErrorCode( PAS_InvalidIrq );
-      return( PAS_Error );
-      }
-
-   status = DMA_VerifyChannel( PAS_DMAChannel );
-   if ( status == DMA_Error )
-      {
-      PAS_SetErrorCode( PAS_DmaError );
-      return( PAS_Error );
-      }
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_EnableInterrupt
-
-   Enables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-void PAS_EnableInterrupt
-   (
-   void
-   )
-
-   {
-   int mask;
-   int data;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   if ( PAS_Irq < 8 )
-      {
-      mask = inp( 0x21 ) & ~( 1 << PAS_Irq );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask = inp( 0xA1 ) & ~( 1 << ( PAS_Irq - 8 ) );
-      outp( 0xA1, mask  );
-
-      mask = inp( 0x21 ) & ~( 1 << 2 );
-      outp( 0x21, mask  );
-      }
-
-   // Flush any pending interrupts
-   PAS_Write( InterruptStatus, PAS_Read( InterruptStatus ) & 0x40 );
-
-   // Enable the interrupt on the PAS
-   data = PAS_State->intrctlr;
-   data |= SampleBufferInterruptFlag;
-   PAS_Write( InterruptControl, data );
-   PAS_State->intrctlr = data;
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_DisableInterrupt
-
-   Disables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-void PAS_DisableInterrupt
-   (
-   void
-   )
-
-   {
-   int mask;
-   int data;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   // Disable the interrupt on the PAS
-   data = PAS_State->intrctlr;
-   data &= ~( SampleRateInterruptFlag | SampleBufferInterruptFlag );
-   PAS_Write( InterruptControl, data );
-   PAS_State->intrctlr = data;
-
-   // Restore interrupt mask
-   if ( PAS_Irq < 8 )
-      {
-      mask  = inp( 0x21 ) & ~( 1 << PAS_Irq );
-      mask |= PAS_IntController1Mask & ( 1 << PAS_Irq );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask  = inp( 0x21 ) & ~( 1 << 2 );
-      mask |= PAS_IntController1Mask & ( 1 << 2 );
-      outp( 0x21, mask  );
-
-      mask  = inp( 0xA1 ) & ~( 1 << ( PAS_Irq - 8 ) );
-      mask |= PAS_IntController2Mask & ( 1 << ( PAS_Irq - 8 ) );
-      outp( 0xA1, mask  );
-      }
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_ServiceInterrupt
-
-   Handles interrupt generated by sound card at the end of a voice
-   transfer.  Calls the user supplied callback function.
----------------------------------------------------------------------*/
-
-void interrupt far PAS_ServiceInterrupt
-   (
-   void
-   )
-
-   {
-   #ifdef USESTACK
-   // save stack
-   GetStack( &oldStackSelector, &oldStackPointer );
-
-   // set our stack
-   SetStack( StackSelector, StackPointer );
-   #endif
-
-   irqstatus = PAS_Read( InterruptStatus );
-   if ( ( irqstatus & SampleBufferInterruptFlag ) == 0 )
-      {
-      #ifdef USESTACK
-      // restore stack
-      SetStack( oldStackSelector, oldStackPointer );
-      #endif
-
-      _chain_intr( PAS_OldInt );
-      }
-
-   // Clear the interrupt
-   irqstatus &= ~SampleBufferInterruptFlag;
-   PAS_Write( InterruptStatus, irqstatus );
-
-   // send EOI to Interrupt Controller
-   if ( PAS_Irq > 7 )
-      {
-      outp( 0xA0, 0x20 );
-      }
-   outp( 0x20, 0x20 );
-
-
-   // Keep track of current buffer
-   PAS_CurrentDMABuffer += PAS_TransferLength;
-   if ( PAS_CurrentDMABuffer >= PAS_DMABufferEnd )
-      {
-      PAS_CurrentDMABuffer = PAS_DMABuffer;
-      }
-
-   // Call the caller's callback function
-   if ( PAS_CallBack != NULL )
-      {
-      PAS_CallBack();
-      }
-
-   #ifdef USESTACK
-   // restore stack
-   SetStack( oldStackSelector, oldStackPointer );
-   #endif
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_Write
-
-   Writes a byte of data to the sound card.
----------------------------------------------------------------------*/
-
-void PAS_Write
-   (
-   int Register,
-   int Data
-   )
-
-   {
-   int port;
-
-   port = Register ^ PAS_TranslateCode;
-   outp( port, Data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_Read
-
-   Reads a byte of data from the sound card.
----------------------------------------------------------------------*/
-
-int PAS_Read
-   (
-   int Register
-   )
-
-   {
-   int port;
-   int data;
-
-   port = Register ^ PAS_TranslateCode;
-   data = inp( port );
-   return( data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetSampleRateTimer
-
-   Programs the Sample Rate Timer.
----------------------------------------------------------------------*/
-
-void PAS_SetSampleRateTimer
-   (
-   void
-   )
-
-   {
-   int LoByte;
-   int HiByte;
-   int data;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   // Disable the Sample Rate Timer
-   data = PAS_State->audiofilt;
-   data &= ~SampleRateTimerGateFlag;
-   PAS_Write( AudioFilterControl, data );
-   PAS_State->audiofilt = data;
-
-   // Select the Sample Rate Timer
-   data = SelectSampleRateTimer;
-   PAS_Write( LocalTimerControl, data );
-   PAS_State->tmrctlr = data;
-
-   LoByte = lobyte( PAS_TimeInterval );
-   HiByte = hibyte( PAS_TimeInterval );
-
-   // Program the Sample Rate Timer
-   PAS_Write( SampleRateTimer, LoByte );
-   PAS_Write( SampleRateTimer, HiByte );
-   PAS_State->samplerate = PAS_TimeInterval;
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetSampleBufferCount
-
-   Programs the Sample Buffer Count.
----------------------------------------------------------------------*/
-
-void PAS_SetSampleBufferCount
-   (
-   void
-   )
-
-   {
-   int LoByte;
-   int HiByte;
-   int count;
-   int data;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   // Disable the Sample Buffer Count
-   data = PAS_State->audiofilt;
-   data &= ~SampleBufferCountGateFlag;
-   PAS_Write( AudioFilterControl, data );
-   PAS_State->audiofilt = data;
-
-   // Select the Sample Buffer Count
-   data = SelectSampleBufferCount;
-   PAS_Write( LocalTimerControl, data );
-   PAS_State->tmrctlr = data;
-
-   count = PAS_TransferLength;
-
-   // Check if we're using a 16-bit DMA channel
-   if ( PAS_DMAChannel > 3 )
-      {
-      count >>= 1;
-      }
-
-   LoByte = lobyte( count );
-   HiByte = hibyte( count );
-
-   // Program the Sample Buffer Count
-   PAS_Write( SampleBufferCount, LoByte );
-   PAS_Write( SampleBufferCount, HiByte );
-   PAS_State->samplecnt = count;
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetPlaybackRate
-
-   Sets the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-void PAS_SetPlaybackRate
-   (
-   unsigned rate
-   )
-
-   {
-   if ( rate < PAS_MinSamplingRate )
-      {
-      rate = PAS_MinSamplingRate;
-      }
-
-   if ( rate > PAS_MaxSamplingRate )
-      {
-      rate = PAS_MaxSamplingRate;
-      }
-
-   PAS_TimeInterval = ( unsigned )CalcTimeInterval( rate );
-   if ( PAS_MixMode & STEREO )
-      {
-      PAS_TimeInterval /= 2;
-      }
-
-   // Keep track of what the actual rate is
-   PAS_SampleRate = CalcSamplingRate( PAS_TimeInterval );
-   if ( PAS_MixMode & STEREO )
-      {
-      PAS_SampleRate /= 2;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetPlaybackRate
-
-   Returns the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-unsigned PAS_GetPlaybackRate
-   (
-   void
-   )
-
-   {
-   return( PAS_SampleRate );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetMixMode
-
-   Sets the sound card to play samples in mono or stereo.
----------------------------------------------------------------------*/
-
-int PAS_SetMixMode
-   (
-   int mode
-   )
-
-   {
-   mode &= PAS_MaxMixMode;
-
-   // Check board revision.  Revision # 0 can't play 16-bit data.
-   if ( ( PAS_State->intrctlr & 0xe0 ) == 0 )
-      {
-      // Force the mode to 8-bit data.
-      mode &= ~SIXTEEN_BIT;
-      }
-
-   PAS_MixMode = mode;
-
-   PAS_SetPlaybackRate( PAS_SampleRate );
-
-   return( mode );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_StopPlayback
-
-   Ends the DMA transfer of digitized sound to the sound card.
----------------------------------------------------------------------*/
-
-void PAS_StopPlayback
-   (
-   void
-   )
-
-   {
-   int data;
-
-   // Don't allow anymore interrupts
-   PAS_DisableInterrupt();
-
-   // Stop the transfer of digital data
-   data = PAS_State->crosschannel;
-   data &= PAS_PCMStopMask;
-   PAS_Write( CrossChannelControl, data );
-   PAS_State->crosschannel = data;
-
-   // Turn off 16-bit unsigned data
-   data = PAS_Read( SampleSizeConfiguration );
-   data &= PAS_SampleSizeMask;
-   PAS_Write( SampleSizeConfiguration, data );
-
-   // Disable the DMA channel
-   DMA_EndTransfer( PAS_DMAChannel );
-
-   PAS_SoundPlaying = FALSE;
-
-   PAS_DMABuffer = NULL;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetupDMABuffer
-
-   Programs the DMAC for sound transfer.
----------------------------------------------------------------------*/
-
-int PAS_SetupDMABuffer
-   (
-   char *BufferPtr,
-   int   BufferSize,
-   int   mode
-   )
-
-   {
-   int DmaStatus;
-   int data;
-
-   // Enable PAS Dma
-   data  = PAS_State->crosschannel;
-   data |= PAS_DMAEnable;
-   PAS_Write( CrossChannelControl, data );
-   PAS_State->crosschannel = data;
-
-   DmaStatus = DMA_SetupTransfer( PAS_DMAChannel, BufferPtr, BufferSize, mode );
-   if ( DmaStatus == DMA_Error )
-      {
-      PAS_SetErrorCode( PAS_DmaError );
-      return( PAS_Error );
-      }
-
-   PAS_DMABuffer          = BufferPtr;
-   PAS_CurrentDMABuffer   = BufferPtr;
-   PAS_TotalDMABufferSize = BufferSize;
-   PAS_DMABufferEnd       = BufferPtr + BufferSize;
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetCurrentPos
-
-   Returns the offset within the current sound being played.
----------------------------------------------------------------------*/
-
-int PAS_GetCurrentPos
-   (
-   void
-   )
-
-   {
-   char *CurrentAddr;
-   int   offset;
-
-   if ( !PAS_SoundPlaying )
-      {
-      PAS_SetErrorCode( PAS_NoSoundPlaying );
-      return( PAS_Error );
-      }
-
-   CurrentAddr = DMA_GetCurrentPos( PAS_DMAChannel );
-   if ( CurrentAddr == NULL )
-      {
-      PAS_SetErrorCode( PAS_DmaError );
-      return( PAS_Error );
-      }
-
-   offset = ( int )( ( ( unsigned long )CurrentAddr ) -
-      ( ( unsigned long )PAS_CurrentDMABuffer ) );
-
-   if ( PAS_MixMode & SIXTEEN_BIT )
-      {
-      offset >>= 1;
-      }
-
-   if ( PAS_MixMode & STEREO )
-      {
-      offset >>= 1;
-      }
-
-   return( offset );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetFilterSetting
-
-   Returns the bit settings for the appropriate filter level.
----------------------------------------------------------------------*/
-
-int PAS_GetFilterSetting
-   (
-   int rate
-   )
-
-   {
-   /* CD Quality 17897hz */
-   if ( ( unsigned long )rate > ( unsigned long )17897L * 2 )
-      {
-      /* 00001b 20hz to 17.8khz */
-      return( 0x01 );
-      }
-
-   /* Cassette Quality 15090hz */
-   if ( ( unsigned long )rate > ( unsigned long )15909L * 2 )
-      {
-      /* 00010b 20hz to 15.9khz */
-      return( 0x02 );
-      }
-
-   /* FM Radio Quality 11931hz */
-   if ( ( unsigned long )rate > ( unsigned long )11931L * 2 )
-      {
-      /* 01001b 20hz to 11.9khz */
-      return( 0x09 );
-      }
-
-   /* AM Radio Quality  8948hz */
-   if ( ( unsigned long )rate > ( unsigned long )8948L * 2 )
-      {
-      /* 10001b 20hz to 8.9khz */
-      return( 0x11 );
-      }
-
-   /* Telphone Quality  5965hz */
-   if ( ( unsigned long )rate > ( unsigned long )5965L * 2 )
-      {
-      /* 00100b 20hz to 5.9khz */
-      return( 0x19 );
-      }
-
-   /* Male voice quality 2982hz */
-   /* 111001b 20hz to 2.9khz */
-   return( 0x04 );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_BeginTransfer
-
-   Starts playback of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-void PAS_BeginTransfer
-   (
-   int mode
-   )
-
-   {
-   int data;
-
-   PAS_SetSampleRateTimer();
-
-   PAS_SetSampleBufferCount();
-
-   PAS_EnableInterrupt();
-
-   // Get sample size configuration
-   data = PAS_Read( SampleSizeConfiguration );
-
-   // Check board revision.  Revision # 0 can't play 16-bit data.
-   if ( PAS_State->intrctlr & 0xe0 )
-      {
-      data &= PAS_SampleSizeMask;
-
-      // set sample size bit
-      if ( PAS_MixMode & SIXTEEN_BIT )
-         {
-         data |= PAS_16BitSampleFlag;
-         }
-      }
-
-   // set oversampling rate
-   data &= PAS_OverSamplingMask;
-   data |= PAS_4xOverSampling;
-
-   // Set sample size configuration
-   PAS_Write( SampleSizeConfiguration, data );
-
-   // Get Cross channel setting
-   data  = PAS_State->crosschannel;
-   data &= PAS_ChannelConnectMask;
-   if ( mode == RECORD )
-      {
-      data |= PAS_PCMStartADC;
-      }
-   else
-      {
-      data |= PAS_PCMStartDAC;
-      }
-
-   // set stereo mode bit
-   if ( !( PAS_MixMode & STEREO ) )
-      {
-      data |= PAS_StereoFlag;
-      }
-
-   PAS_Write( CrossChannelControl, data );
-   PAS_State->crosschannel = data;
-
-   // Get the filter appropriate filter setting
-   data = PAS_GetFilterSetting( PAS_SampleRate );
-
-   // Enable the Sample Rate Timer and Sample Buffer Count
-   data |= SampleRateTimerGateFlag | SampleBufferCountGateFlag;
-
-   if ( mode != RECORD )
-      {
-      // Enable audio (not Audio Mute)
-      data |= PAS_AudioMuteFlag;
-      }
-
-   PAS_Write( AudioFilterControl, data );
-   PAS_State->audiofilt = data;
-
-   PAS_SoundPlaying = TRUE;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_BeginBufferedPlayback
-
-   Begins multibuffered playback of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-int PAS_BeginBufferedPlayback
-   (
-   char *BufferStart,
-   int   BufferSize,
-   int   NumDivisions,
-   unsigned SampleRate,
-   int   MixMode,
-   void ( *CallBackFunc )( void )
-   )
-
-   {
-   int DmaStatus;
-
-   PAS_StopPlayback();
-
-   PAS_SetMixMode( MixMode );
-   PAS_SetPlaybackRate( SampleRate );
-
-   PAS_TransferLength = BufferSize / NumDivisions;
-   PAS_SetCallBack( CallBackFunc );
-
-   DmaStatus = PAS_SetupDMABuffer( BufferStart, BufferSize, DMA_AutoInitRead );
-   if ( DmaStatus == PAS_Error )
-      {
-      return( PAS_Error );
-      }
-
-   PAS_BeginTransfer( PLAYBACK );
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_BeginBufferedRecord
-
-   Begins multibuffered recording of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-int PAS_BeginBufferedRecord
-   (
-   char *BufferStart,
-   int   BufferSize,
-   int   NumDivisions,
-   unsigned SampleRate,
-   int   MixMode,
-   void ( *CallBackFunc )( void )
-   )
-
-   {
-   int DmaStatus;
-
-   PAS_StopPlayback();
-
-   PAS_SetMixMode( MixMode );
-   PAS_SetPlaybackRate( SampleRate );
-
-   PAS_TransferLength = BufferSize / NumDivisions;
-   PAS_SetCallBack( CallBackFunc );
-
-   DmaStatus = PAS_SetupDMABuffer( BufferStart, BufferSize, DMA_AutoInitWrite );
-   if ( DmaStatus == PAS_Error )
-      {
-      return( PAS_Error );
-      }
-
-   PAS_BeginTransfer( RECORD );
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_CallInt
-
-   Calls interrupt 2fh.
----------------------------------------------------------------------*/
-
-int PAS_CallInt( int ebx, int ecx, int edx );
-#pragma aux PAS_CallInt = \
-   "int 2fh",         \
-   parm [ ebx ] [ ecx ] [ edx ] modify exact [ eax ebx ecx edx esi edi ] value [ ebx ];
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_CallMVFunction
-
-   Performs a call to a real mode function.
----------------------------------------------------------------------*/
-
-int PAS_CallMVFunction
-   (
-   unsigned long function,
-   int ebx,
-   int ecx,
-   int edx
-   )
-
-   {
-   dpmi_regs callregs;
-   int       status;
-
-   callregs.EBX = ebx;
-   callregs.ECX = ecx;
-   callregs.EDX = edx;
-
-   callregs.SS  = 0;
-   callregs.SP  = 0;
-
-   callregs.DS  = 0;
-   callregs.ES  = 0;
-   callregs.FS  = 0;
-   callregs.GS  = 0;
-
-   callregs.IP = function;
-   callregs.CS = function >> 16;
-
-   status = DPMI_CallRealModeFunction( &callregs );
-   if ( status != DPMI_Ok )
-      {
-      return( PAS_Error );
-      }
-
-   return( callregs.EBX & 0xff );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetPCMVolume
-
-   Sets the volume of digitized sound playback.
----------------------------------------------------------------------*/
-
-int PAS_SetPCMVolume
-   (
-   int volume
-   )
-
-   {
-   int status;
-
-   volume = max( 0, volume );
-   volume = min( volume, 255 );
-
-   volume *= 100;
-   volume /= 255;
-
-   status = PAS_CallMVFunction( PAS_Func->SetMixer, volume,
-      OUTPUTMIXER, L_PCM );
-   if ( status == PAS_Error )
-      {
-      return( status );
-      }
-
-   status = PAS_CallMVFunction( PAS_Func->SetMixer, volume,
-      OUTPUTMIXER, R_PCM );
-   if ( status == PAS_Error )
-      {
-      return( status );
-      }
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetPCMVolume
-
-   Returns the current volume of digitized sound playback.
----------------------------------------------------------------------*/
-
-int PAS_GetPCMVolume
-   (
-   void
-   )
-
-   {
-   int leftvolume;
-   int rightvolume;
-   int totalvolume;
-
-   if ( PAS_Func == NULL )
-      {
-      return( PAS_Error );
-      }
-
-   leftvolume = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, L_PCM );
-   rightvolume = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, R_PCM );
-
-   if ( ( leftvolume == PAS_Error ) || ( rightvolume == PAS_Error ) )
-      {
-      return( PAS_Error );
-      }
-
-   leftvolume  &= 0xff;
-   rightvolume &= 0xff;
-
-   totalvolume = ( rightvolume + leftvolume ) / 2;
-   totalvolume *= 255;
-   totalvolume /= 100;
-   return( totalvolume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetFMVolume
-
-   Sets the volume of FM sound playback.
----------------------------------------------------------------------*/
-
-void PAS_SetFMVolume
-   (
-   int volume
-   )
-
-   {
-   volume = max( 0, volume );
-   volume = min( volume, 255 );
-
-   volume *= 100;
-   volume /= 255;
-   if ( PAS_Func )
-      {
-      PAS_CallMVFunction( PAS_Func->SetMixer, volume, OUTPUTMIXER, L_FM );
-      PAS_CallMVFunction( PAS_Func->SetMixer, volume, OUTPUTMIXER, R_FM );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetFMVolume
-
-   Returns the current volume of FM sound playback.
----------------------------------------------------------------------*/
-
-int PAS_GetFMVolume
-   (
-   void
-   )
-
-   {
-   int leftvolume;
-   int rightvolume;
-   int totalvolume;
-
-   if ( PAS_Func == NULL )
-      {
-      return( 255 );
-      }
-
-   leftvolume = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, L_FM ) & 0xff;
-   rightvolume = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, R_FM ) & 0xff;
-
-   totalvolume  = ( rightvolume + leftvolume ) / 2;
-   totalvolume *= 255;
-   totalvolume /= 100;
-   totalvolume  = min( 255, totalvolume );
-
-   return( totalvolume );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_GetCardInfo
-
-   Returns the maximum number of bits that can represent a sample
-   (8 or 16) and the number of channels (1 for mono, 2 for stereo).
----------------------------------------------------------------------*/
-
-int PAS_GetCardInfo
-   (
-   int *MaxSampleBits,
-   int *MaxChannels
-   )
-
-   {
-   int status;
-
-   if ( PAS_State == NULL )
-      {
-      status = PAS_CheckForDriver();
-      if ( status != PAS_Ok )
-         {
-         return( status );
-         }
-
-      PAS_State = PAS_GetStateTable();
-      if ( PAS_State == NULL )
-         {
-         return( PAS_Error );
-         }
-      }
-
-   *MaxChannels = 2;
-
-   // Check board revision.  Revision # 0 can't play 16-bit data.
-   if ( ( PAS_State->intrctlr & 0xe0 ) == 0 )
-      {
-      *MaxSampleBits = 8;
-      }
-   else
-      {
-      *MaxSampleBits = 16;
-      }
-
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SetCallBack
-
-   Specifies the user function to call at the end of a sound transfer.
----------------------------------------------------------------------*/
-
-void PAS_SetCallBack
-   (
-   void ( *func )( void )
-   )
-
-   {
-   PAS_CallBack = func;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_FindCard
-
-   Auto-detects the port the Pro AudioSpectrum is set for.
----------------------------------------------------------------------*/
-
-int PAS_FindCard
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status = PAS_TestAddress( DEFAULT_BASE );
-   if ( status == 0 )
-      {
-      PAS_TranslateCode = DEFAULT_BASE;
-      return( PAS_Ok );
-      }
-
-   status = PAS_TestAddress( ALT_BASE_1 );
-   if ( status == 0 )
-      {
-      PAS_TranslateCode = ALT_BASE_1;
-      return( PAS_Ok );
-      }
-
-   status = PAS_TestAddress( ALT_BASE_2 );
-   if ( status == 0 )
-      {
-      PAS_TranslateCode = ALT_BASE_2;
-      return( PAS_Ok );
-      }
-
-   status = PAS_TestAddress( ALT_BASE_3 );
-   if ( status == 0 )
-      {
-      PAS_TranslateCode = ALT_BASE_3;
-      return( PAS_Ok );
-      }
-
-   PAS_SetErrorCode( PAS_CardNotFound );
-   return( PAS_Error );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SaveMusicVolume
-
-   Saves the user's FM mixer settings.
----------------------------------------------------------------------*/
-
-int PAS_SaveMusicVolume
-   (
-   void
-   )
-
-   {
-   int status;
-   int data;
-
-   if ( !PAS_Installed )
-      {
-      status = PAS_CheckForDriver();
-      if ( status != PAS_Ok )
-         {
-         return( status );
-         }
-
-      PAS_State = PAS_GetStateTable();
-      if ( PAS_State == NULL )
-         {
-         return( PAS_Error );
-         }
-
-      PAS_Func = PAS_GetFunctionTable();
-      if ( PAS_Func == NULL )
-         {
-         return( PAS_Error );
-         }
-
-      status = PAS_GetCardSettings();
-      if ( status != PAS_Ok )
-         {
-         return( status );
-         }
-
-      status = PAS_FindCard();
-      if ( status != PAS_Ok )
-         {
-         return( status );
-         }
-
-      // Enable PAS Sound
-      data  = PAS_State->audiofilt;
-      data |= PAS_AudioMuteFlag;
-
-      PAS_Write( AudioFilterControl, data );
-      PAS_State->audiofilt = data;
-      }
-
-   status = PAS_CallMVFunction( PAS_Func->GetMixer, 0, OUTPUTMIXER, L_FM );
-   if ( status != PAS_Error )
-      {
-      PAS_OriginalFMLeftVolume  = PAS_CallMVFunction( PAS_Func->GetMixer,
-         0, OUTPUTMIXER, L_FM ) & 0xff;
-
-      PAS_OriginalFMRightVolume = PAS_CallMVFunction( PAS_Func->GetMixer,
-         0, OUTPUTMIXER, R_FM ) & 0xff;
-
-      return( PAS_Ok );
-      }
-
-   return( PAS_Warning );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_RestoreMusicVolume
-
-   Restores the user's FM mixer settings.
----------------------------------------------------------------------*/
-
-void PAS_RestoreMusicVolume
-   (
-   void
-   )
-
-   {
-   if ( PAS_Func )
-      {
-      PAS_CallMVFunction( PAS_Func->SetMixer, PAS_OriginalFMLeftVolume,
-         OUTPUTMIXER, L_FM );
-      PAS_CallMVFunction( PAS_Func->SetMixer, PAS_OriginalFMRightVolume,
-         OUTPUTMIXER, R_FM );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_SaveState
-
-   Saves the original state of the PAS prior to use.
----------------------------------------------------------------------*/
-
-void PAS_SaveState
-   (
-   void
-   )
-
-   {
-   PAS_OriginalState.intrctlr     = PAS_State->intrctlr;
-   PAS_OriginalState.audiofilt    = PAS_State->audiofilt;
-   PAS_OriginalState.tmrctlr      = PAS_State->tmrctlr;
-   PAS_OriginalState.samplerate   = PAS_State->samplerate;
-   PAS_OriginalState.samplecnt    = PAS_State->samplecnt;
-   PAS_OriginalState.crosschannel = PAS_State->crosschannel;
-   PAS_SampleSizeConfig = PAS_Read( SampleSizeConfiguration );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_RestoreState
-
-   Restores the original state of the PAS after use.
----------------------------------------------------------------------*/
-
-void PAS_RestoreState
-   (
-   void
-   )
-
-   {
-   int LoByte;
-   int HiByte;
-
-   // Select the Sample Rate Timer
-   PAS_Write( LocalTimerControl, SelectSampleRateTimer );
-   PAS_State->tmrctlr = SelectSampleRateTimer;
-
-   PAS_Write( SampleRateTimer, PAS_OriginalState.samplerate );
-   PAS_State->samplerate = PAS_OriginalState.samplerate;
-
-   // Select the Sample Buffer Count
-   PAS_Write( LocalTimerControl, SelectSampleBufferCount );
-   PAS_State->tmrctlr = SelectSampleBufferCount;
-
-   LoByte = lobyte( PAS_OriginalState.samplecnt );
-   HiByte = hibyte( PAS_OriginalState.samplecnt );
-   PAS_Write( SampleRateTimer, LoByte );
-   PAS_Write( SampleRateTimer, HiByte );
-   PAS_State->samplecnt = PAS_OriginalState.samplecnt;
-
-   PAS_Write( CrossChannelControl, PAS_OriginalState.crosschannel );
-   PAS_State->crosschannel = PAS_OriginalState.crosschannel;
-
-   PAS_Write( SampleSizeConfiguration, PAS_SampleSizeConfig );
-
-   PAS_Write( InterruptControl, PAS_OriginalState.intrctlr );
-   PAS_State->intrctlr = PAS_OriginalState.intrctlr;
-
-   PAS_Write( AudioFilterControl, PAS_OriginalState.audiofilt );
-   PAS_State->audiofilt = PAS_OriginalState.audiofilt;
-
-   PAS_Write( LocalTimerControl, PAS_OriginalState.tmrctlr );
-   PAS_State->tmrctlr = PAS_OriginalState.tmrctlr;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void PAS_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: allocateTimerStack
-
-   Allocate a block of memory from conventional (low) memory and return
-   the selector (which can go directly into a segment register) of the
-   memory block or 0 if an error occured.
----------------------------------------------------------------------*/
-
-static unsigned short allocateTimerStack
-   (
-   unsigned short size
-   )
-
-   {
-   union REGS regs;
-
-   // clear all registers
-   memset( &regs, 0, sizeof( regs ) );
-
-   // DPMI allocate conventional memory
-   regs.w.ax = 0x100;
-
-   // size in paragraphs
-   regs.w.bx = ( size + 15 ) / 16;
-
-   int386( 0x31, &regs, &regs );
-   if (!regs.w.cflag)
-      {
-      // DPMI call returns selector in dx
-      // (ax contains real mode segment
-      // which is ignored here)
-
-      return( regs.w.dx );
-      }
-
-   // Couldn't allocate memory.
-   return( NULL );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: deallocateTimerStack
-
-   Deallocate a block of conventional (low) memory given a selector to
-   it.  Assumes the block was allocated with DPMI function 0x100.
----------------------------------------------------------------------*/
-
-static void deallocateTimerStack
-   (
-   unsigned short selector
-   )
-
-   {
-   union REGS regs;
-
-   if ( selector != NULL )
-      {
-      // clear all registers
-      memset( &regs, 0, sizeof( regs ) );
-
-      regs.w.ax = 0x101;
-      regs.w.dx = selector;
-      int386( 0x31, &regs, &regs );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_Init
-
-   Initializes the sound card and prepares the module to play
-   digitized sounds.
----------------------------------------------------------------------*/
-
-int PAS_Init
-   (
-   void
-   )
-
-   {
-   int Interrupt;
-   int status;
-   int data;
-
-   if ( PAS_Installed )
-      {
-      return( PAS_Ok );
-      }
-
-   PAS_IntController1Mask = inp( 0x21 );
-   PAS_IntController2Mask = inp( 0xA1 );
-
-   status = PAS_CheckForDriver();
-   if ( status != PAS_Ok )
-      {
-      return( status );
-      }
-
-   PAS_State = PAS_GetStateTable();
-   if ( PAS_State == NULL )
-      {
-      return( PAS_Error );
-      }
-
-   PAS_Func = PAS_GetFunctionTable();
-   if ( PAS_Func == NULL )
-      {
-      return( PAS_Error );
-      }
-
-   status = PAS_GetCardSettings();
-   if ( status != PAS_Ok )
-      {
-      return( status );
-      }
-
-   status = PAS_FindCard();
-   if ( status != PAS_Ok )
-      {
-      return( status );
-      }
-
-   PAS_SaveState();
-
-   PAS_OriginalPCMLeftVolume  = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, L_PCM ) & 0xff;
-   PAS_OriginalPCMRightVolume = PAS_CallMVFunction( PAS_Func->GetMixer, 0,
-      OUTPUTMIXER, R_PCM ) & 0xff;
-
-   PAS_SoundPlaying = FALSE;
-
-   PAS_SetCallBack( NULL );
-
-   PAS_DMABuffer = NULL;
-
-   status = PAS_LockMemory();
-   if ( status != PAS_Ok )
-      {
-      PAS_UnlockMemory();
-      return( status );
-      }
-
-   StackSelector = allocateTimerStack( kStackSize );
-   if ( StackSelector == NULL )
-      {
-      PAS_UnlockMemory();
-      PAS_SetErrorCode( PAS_OutOfMemory );
-      return( PAS_Error );
-      }
-
-   // Leave a little room at top of stack just for the hell of it...
-   StackPointer = kStackSize - sizeof( long );
-
-   // Install our interrupt handler
-   Interrupt = PAS_Interrupts[ PAS_Irq ];
-   PAS_OldInt = _dos_getvect( Interrupt );
-   if ( PAS_Irq < 8 )
-      {
-      _dos_setvect( Interrupt, PAS_ServiceInterrupt );
-      }
-   else
-      {
-      status = IRQ_SetVector( Interrupt, PAS_ServiceInterrupt );
-      if ( status != IRQ_Ok )
-         {
-         PAS_UnlockMemory();
-         deallocateTimerStack( StackSelector );
-         StackSelector = NULL;
-         PAS_SetErrorCode( PAS_UnableToSetIrq );
-         return( PAS_Error );
-         }
-      }
-
-   // Enable PAS Sound
-   data  = PAS_State->audiofilt;
-   data |= PAS_AudioMuteFlag;
-
-   PAS_Write( AudioFilterControl, data );
-   PAS_State->audiofilt = data;
-
-   PAS_SetPlaybackRate( PAS_DefaultSampleRate );
-   PAS_SetMixMode( PAS_DefaultMixMode );
-
-   PAS_Installed = TRUE;
-
-   PAS_SetErrorCode( PAS_Ok );
-   return( PAS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_Shutdown
-
-   Ends transfer of sound data to the sound card and restores the
-   system resources used by the card.
----------------------------------------------------------------------*/
-
-void PAS_Shutdown
-   (
-   void
-   )
-
-   {
-   int Interrupt;
-
-   if ( PAS_Installed )
-      {
-      // Halt the DMA transfer
-      PAS_StopPlayback();
-
-      // Restore the original interrupt
-      Interrupt = PAS_Interrupts[ PAS_Irq ];
-      if ( PAS_Irq >= 8 )
-         {
-         IRQ_RestoreVector( Interrupt );
-         }
-      _dos_setvect( Interrupt, PAS_OldInt );
-
-      PAS_SoundPlaying = FALSE;
-
-      PAS_DMABuffer = NULL;
-
-      PAS_SetCallBack( NULL );
-
-      PAS_CallMVFunction( PAS_Func->SetMixer, PAS_OriginalPCMLeftVolume,
-         OUTPUTMIXER, L_PCM );
-      PAS_CallMVFunction( PAS_Func->SetMixer, PAS_OriginalPCMRightVolume,
-         OUTPUTMIXER, R_PCM );
-
-// DEBUG
-//      PAS_RestoreState();
-
-      PAS_UnlockMemory();
-
-      deallocateTimerStack( StackSelector );
-      StackSelector = NULL;
-
-      PAS_Installed = FALSE;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-void PAS_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( PAS_LockStart, PAS_LockEnd );
-   DPMI_Unlock( PAS_Interrupts );
-   DPMI_Unlock( PAS_OldInt );
-   DPMI_Unlock( PAS_IntController1Mask );
-   DPMI_Unlock( PAS_IntController2Mask  );
-   DPMI_Unlock( PAS_Installed );
-   DPMI_Unlock( PAS_TranslateCode );
-   DPMI_Unlock( PAS_OriginalPCMLeftVolume );
-   DPMI_Unlock( PAS_OriginalPCMRightVolume );
-   DPMI_Unlock( PAS_OriginalFMLeftVolume );
-   DPMI_Unlock( PAS_OriginalFMRightVolume );
-   DPMI_Unlock( PAS_DMAChannel );
-   DPMI_Unlock( PAS_Irq );
-   DPMI_Unlock( PAS_State );
-   DPMI_Unlock( PAS_Func );
-   DPMI_Unlock( PAS_OriginalState );
-   DPMI_Unlock( PAS_SampleSizeConfig );
-   DPMI_Unlock( PAS_DMABuffer );
-   DPMI_Unlock( PAS_DMABufferEnd );
-   DPMI_Unlock( PAS_CurrentDMABuffer );
-   DPMI_Unlock( PAS_TotalDMABufferSize );
-   DPMI_Unlock( PAS_TransferLength );
-   DPMI_Unlock( PAS_MixMode );
-   DPMI_Unlock( PAS_SampleRate );
-   DPMI_Unlock( PAS_TimeInterval );
-   DPMI_Unlock( PAS_SoundPlaying );
-   DPMI_Unlock( PAS_CallBack );
-   DPMI_Unlock( PAS_ErrorCode );
-   DPMI_Unlock( irqstatus );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: PAS_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int PAS_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( PAS_LockStart, PAS_LockEnd );
-   status |= DPMI_Lock( PAS_Interrupts );
-   status |= DPMI_Lock( PAS_OldInt );
-   status |= DPMI_Lock( PAS_IntController1Mask );
-   status |= DPMI_Lock( PAS_IntController2Mask  );
-   status |= DPMI_Lock( PAS_Installed );
-   status |= DPMI_Lock( PAS_TranslateCode );
-   status |= DPMI_Lock( PAS_OriginalPCMLeftVolume );
-   status |= DPMI_Lock( PAS_OriginalPCMRightVolume );
-   status |= DPMI_Lock( PAS_OriginalFMLeftVolume );
-   status |= DPMI_Lock( PAS_OriginalFMRightVolume );
-   status |= DPMI_Lock( PAS_DMAChannel );
-   status |= DPMI_Lock( PAS_Irq );
-   status |= DPMI_Lock( PAS_State );
-   status |= DPMI_Lock( PAS_Func );
-   status |= DPMI_Lock( PAS_OriginalState );
-   status |= DPMI_Lock( PAS_SampleSizeConfig );
-   status |= DPMI_Lock( PAS_DMABuffer );
-   status |= DPMI_Lock( PAS_DMABufferEnd );
-   status |= DPMI_Lock( PAS_CurrentDMABuffer );
-   status |= DPMI_Lock( PAS_TotalDMABufferSize );
-   status |= DPMI_Lock( PAS_TransferLength );
-   status |= DPMI_Lock( PAS_MixMode );
-   status |= DPMI_Lock( PAS_SampleRate );
-   status |= DPMI_Lock( PAS_TimeInterval );
-   status |= DPMI_Lock( PAS_SoundPlaying );
-   status |= DPMI_Lock( PAS_CallBack );
-   status |= DPMI_Lock( PAS_ErrorCode );
-   status |= DPMI_Lock( irqstatus );
-
-   if ( status != DPMI_Ok )
-      {
-      PAS_UnlockMemory();
-      PAS_SetErrorCode( PAS_DPMI_Error );
-      return( PAS_Error );
-      }
-
-   return( PAS_Ok );
-   }
--- a/src/audiolib/pas16.h
+++ /dev/null
@@ -1,79 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: PAS16.H
-
-   author: James R. Dose
-   date:   March 27, 1994
-
-   Public header for for PAS16.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __PAS16_H
-#define __PAS16_H
-
-enum PAS_ERRORS
-   {
-   PAS_Warning = -2,
-   PAS_Error   = -1,
-   PAS_Ok      = 0,
-   PAS_DriverNotFound,
-   PAS_DmaError,
-   PAS_InvalidIrq,
-   PAS_UnableToSetIrq,
-   PAS_Dos4gwIrqError,
-   PAS_NoSoundPlaying,
-   PAS_CardNotFound,
-   PAS_DPMI_Error,
-   PAS_OutOfMemory
-   };
-
-#define PAS_MaxMixMode        STEREO_16BIT
-#define PAS_DefaultSampleRate 11000
-#define PAS_DefaultMixMode    MONO_8BIT
-#define PAS_MaxIrq            15
-
-#define PAS_MinSamplingRate   4000
-#define PAS_MaxSamplingRate   44000
-
-extern unsigned int PAS_DMAChannel;
-
-char *PAS_ErrorString( int ErrorNumber );
-void  PAS_SetPlaybackRate( unsigned rate );
-unsigned PAS_GetPlaybackRate( void );
-int   PAS_SetMixMode( int mode );
-void  PAS_StopPlayback( void );
-int   PAS_GetCurrentPos( void );
-int   PAS_BeginBufferedPlayback( char *BufferStart, int BufferSize, int NumDivisions, unsigned SampleRate, int MixMode, void ( *CallBackFunc )( void ) );
-int   PAS_BeginBufferedRecord( char *BufferStart, int BufferSize, int NumDivisions, unsigned SampleRate, int MixMode, void ( *CallBackFunc )( void ) );
-int   PAS_SetPCMVolume( int volume );
-int   PAS_GetPCMVolume( void );
-void  PAS_SetFMVolume( int volume );
-int   PAS_GetFMVolume( void );
-int   PAS_GetCardInfo( int *MaxSampleBits, int *MaxChannels );
-void  PAS_SetCallBack( void ( *func )( void ) );
-int   PAS_SaveMusicVolume( void );
-void  PAS_RestoreMusicVolume( void );
-int   PAS_Init( void );
-void  PAS_Shutdown( void );
-void  PAS_UnlockMemory( void );
-int   PAS_LockMemory( void );
-
-#endif
--- a/src/audiolib/sndscape.c
+++ /dev/null
@@ -1,1659 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: SNDSCAPE.C
-
-   author: James R. Dose
-   date:   October 25, 1994
-
-   Low level routines to support the Ensoniq Soundscape.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#include <dos.h>
-#include <conio.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <time.h>
-#include "interrup.h"
-#include "dpmi.h"
-#include "dma.h"
-#include "irq.h"
-#include "sndscape.h"
-#include "_sndscap.h"
-
-const int SOUNDSCAPE_Interrupts[ SOUNDSCAPE_MaxIrq + 1 ]  =
-   {
-   INVALID, INVALID,     0xa, INVALID,
-   INVALID,     0xd, INVALID,     0xf,
-   INVALID, INVALID,    0x72, INVALID,
-   INVALID, INVALID, INVALID, INVALID
-   };
-
-const int SOUNDSCAPE_SampleSize[ SOUNDSCAPE_MaxMixMode + 1 ] =
-   {
-   MONO_8BIT_SAMPLE_SIZE,  STEREO_8BIT_SAMPLE_SIZE,
-   MONO_16BIT_SAMPLE_SIZE, STEREO_16BIT_SAMPLE_SIZE
-   };
-
-static void ( __interrupt __far *SOUNDSCAPE_OldInt )( void );
-
-static int SOUNDSCAPE_Installed = FALSE;
-static int SOUNDSCAPE_FoundCard = FALSE;
-
-static char   *SOUNDSCAPE_DMABuffer;
-static char   *SOUNDSCAPE_DMABufferEnd;
-static char   *SOUNDSCAPE_CurrentDMABuffer;
-static int     SOUNDSCAPE_TotalDMABufferSize;
-
-static int      SOUNDSCAPE_TransferLength   = 0;
-static int      SOUNDSCAPE_MixMode          = SOUNDSCAPE_DefaultMixMode;
-static int      SOUNDSCAPE_SamplePacketSize = MONO_16BIT_SAMPLE_SIZE;
-static unsigned SOUNDSCAPE_SampleRate       = SOUNDSCAPE_DefaultSampleRate;
-
-volatile int   SOUNDSCAPE_SoundPlaying;
-
-void ( *SOUNDSCAPE_CallBack )( void );
-
-static int  SOUNDSCAPE_IntController1Mask;
-static int  SOUNDSCAPE_IntController2Mask;
-
-// some globals for chip type, ports, DMA, IRQs ... and stuff
-static struct
-   {
-   int BasePort;  // base address of the Ensoniq gate-array chip
-   int WavePort;  // the AD-1848 base address
-   int DMAChan;   // the DMA channel used for PCM
-   int WaveIRQ;   // the PCM IRQ
-   int MIDIIRQ;   // the MPU-401 IRQ
-   int ChipID;    // the Ensoniq chip type
-   int SBEmul;    // SoundBlaster emulation flag
-   int CDROM;     // CD-ROM flag
-   int IRQIndx;   // the Wave IRQ index - for hardware regs
-   int OldIRQs;   // Old IRQs flag to support older HW
-   } SOUNDSCAPE_Config;
-
-// adequate stack size
-#define kStackSize 2048
-
-static unsigned short StackSelector = NULL;
-static unsigned long  StackPointer;
-
-static unsigned short oldStackSelector;
-static unsigned long  oldStackPointer;
-
-// These declarations are necessary to use the inline assembly pragmas.
-
-extern void GetStack(unsigned short *selptr,unsigned long *stackptr);
-extern void SetStack(unsigned short selector,unsigned long stackptr);
-
-// This function will get the current stack selector and pointer and save
-// them off.
-#pragma aux GetStack =	\
-	"mov  [edi],esp"		\
-	"mov	ax,ss"	 		\
-	"mov  [esi],ax" 		\
-	parm [esi] [edi]		\
-	modify [eax esi edi];
-
-// This function will set the stack selector and pointer to the specified
-// values.
-#pragma aux SetStack =	\
-	"mov  ss,ax"			\
-	"mov  esp,edx"			\
-	parm [ax] [edx]		\
-	modify [eax edx];
-
-int SOUNDSCAPE_DMAChannel = -1;
-
-int SOUNDSCAPE_ErrorCode = SOUNDSCAPE_Ok;
-
-#define SOUNDSCAPE_SetErrorCode( status ) \
-   SOUNDSCAPE_ErrorCode   = ( status );
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *SOUNDSCAPE_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case SOUNDSCAPE_Warning :
-      case SOUNDSCAPE_Error :
-         ErrorString = SOUNDSCAPE_ErrorString( SOUNDSCAPE_ErrorCode );
-         break;
-
-      case SOUNDSCAPE_Ok :
-         ErrorString = "SoundScape ok.";
-         break;
-
-      case SOUNDSCAPE_EnvNotFound :
-         ErrorString = "SNDSCAPE environment variable not set.  This is used to locate \n"
-                       "SNDSCAPE.INI which is used to describe your sound card setup.";
-         break;
-
-      case SOUNDSCAPE_InitFileNotFound :
-         ErrorString = "Missing SNDSCAPE.INI file for SoundScape.  This file should be \n"
-                       "located in the directory indicated by the SNDSCAPE environment \n"
-                       "variable or in 'C:\SNDSCAPE' if SNDSCAPE is not set.";
-         break;
-
-      case SOUNDSCAPE_MissingProductInfo :
-         ErrorString = "Missing 'Product' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingPortInfo :
-         ErrorString = "Missing 'Port' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingDMAInfo :
-         ErrorString = "Missing 'DMA' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingIRQInfo :
-         ErrorString = "Missing 'IRQ' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingSBIRQInfo :
-         ErrorString = "Missing 'SBIRQ' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingSBENABLEInfo :
-         ErrorString = "Missing 'SBEnable' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_MissingWavePortInfo :
-         ErrorString = "Missing 'WavePort' field in SNDSCAPE.INI file for SoundScape.";
-         break;
-
-      case SOUNDSCAPE_HardwareError :
-         ErrorString = "Could not detect SoundScape.  Make sure your SNDSCAPE.INI file \n"
-                       "contains correct information about your hardware setup.";
-         break;
-
-      case SOUNDSCAPE_NoSoundPlaying :
-         ErrorString = "No sound playing on SoundScape.";
-         break;
-
-      case SOUNDSCAPE_InvalidSBIrq :
-         ErrorString = "Invalid SoundScape Irq in SBIRQ field of SNDSCAPE.INI.";
-         break;
-
-      case SOUNDSCAPE_UnableToSetIrq :
-         ErrorString = "Unable to set SoundScape IRQ.  Try selecting an IRQ of 7 or below.";
-         break;
-
-      case SOUNDSCAPE_DmaError :
-         ErrorString = DMA_ErrorString( DMA_Error );
-         break;
-
-      case SOUNDSCAPE_DPMI_Error :
-         ErrorString = "DPMI Error in SoundScape.";
-         break;
-
-      case SOUNDSCAPE_OutOfMemory :
-         ErrorString = "Out of conventional memory in SoundScape.";
-         break;
-
-      default :
-         ErrorString = "Unknown SoundScape error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define SOUNDSCAPE_LockStart SOUNDSCAPE_EnableInterrupt
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_EnableInterrupt
-
-   Enables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-static void SOUNDSCAPE_EnableInterrupt
-   (
-   void
-   )
-
-   {
-   int mask;
-
-   // Unmask system interrupt
-   if ( SOUNDSCAPE_Config.WaveIRQ < 8 )
-      {
-      mask = inp( 0x21 ) & ~( 1 << SOUNDSCAPE_Config.WaveIRQ );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask = inp( 0xA1 ) & ~( 1 << ( SOUNDSCAPE_Config.WaveIRQ - 8 ) );
-      outp( 0xA1, mask  );
-
-      mask = inp( 0x21 ) & ~( 1 << 2 );
-      outp( 0x21, mask  );
-      }
-
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_DisableInterrupt
-
-   Disables the triggering of the sound card interrupt.
----------------------------------------------------------------------*/
-
-static void SOUNDSCAPE_DisableInterrupt
-   (
-   void
-   )
-
-   {
-   int mask;
-
-   // Restore interrupt mask
-   if ( SOUNDSCAPE_Config.WaveIRQ < 8 )
-      {
-      mask  = inp( 0x21 ) & ~( 1 << SOUNDSCAPE_Config.WaveIRQ );
-      mask |= SOUNDSCAPE_IntController1Mask & ( 1 << SOUNDSCAPE_Config.WaveIRQ );
-      outp( 0x21, mask  );
-      }
-   else
-      {
-      mask  = inp( 0x21 ) & ~( 1 << 2 );
-      mask |= SOUNDSCAPE_IntController1Mask & ( 1 << 2 );
-      outp( 0x21, mask  );
-
-      mask  = inp( 0xA1 ) & ~( 1 << ( SOUNDSCAPE_Config.WaveIRQ - 8 ) );
-      mask |= SOUNDSCAPE_IntController2Mask & ( 1 << ( SOUNDSCAPE_Config.WaveIRQ - 8 ) );
-      outp( 0xA1, mask  );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_ServiceInterrupt
-
-   Handles interrupt generated by sound card at the end of a voice
-   transfer.  Calls the user supplied callback function.
----------------------------------------------------------------------*/
-
-static void __interrupt __far SOUNDSCAPE_ServiceInterrupt
-   (
-   void
-   )
-
-   {
-   // save stack
-   GetStack( &oldStackSelector, &oldStackPointer );
-
-   // set our stack
-   SetStack( StackSelector, StackPointer );
-
-	if ( !( inp( SOUNDSCAPE_Config.WavePort + AD_STATUS ) & 0x01 ) )
-      {
-      // restore stack
-      SetStack( oldStackSelector, oldStackPointer );
-
-      // Wasn't our interrupt.  Call the old one.
-      _chain_intr( SOUNDSCAPE_OldInt );
-      }
-
-   // clear the AD-1848 interrupt
-	outp( SOUNDSCAPE_Config.WavePort + AD_STATUS, 0x00 );
-
-   // Keep track of current buffer
-   SOUNDSCAPE_CurrentDMABuffer += SOUNDSCAPE_TransferLength;
-   if ( SOUNDSCAPE_CurrentDMABuffer >= SOUNDSCAPE_DMABufferEnd )
-      {
-      SOUNDSCAPE_CurrentDMABuffer = SOUNDSCAPE_DMABuffer;
-      }
-
-   // Call the caller's callback function
-   if ( SOUNDSCAPE_CallBack != NULL )
-      {
-      SOUNDSCAPE_CallBack();
-      }
-
-   // restore stack
-   SetStack( oldStackSelector, oldStackPointer );
-
-   // send EOI to Interrupt Controller
-   if ( SOUNDSCAPE_Config.WaveIRQ > 7 )
-      {
-      outp( 0xA0, 0x20 );
-      }
-   outp( 0x20, 0x20 );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ga_read
-
-   Reads Ensoniq indirect registers.
----------------------------------------------------------------------*/
-
-static int ga_read
-   (
-   int rnum
-   )
-
-   {
-   int data;
-
-   outp( SOUNDSCAPE_Config.BasePort + GA_REGADDR, rnum );
-   data = inp( SOUNDSCAPE_Config.BasePort + GA_REGDATA );
-   return( data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ga_write
-
-   Writes to Ensoniq indirect registers.
----------------------------------------------------------------------*/
-
-static void ga_write
-   (
-   int rnum,
-   int value
-   )
-
-   {
-	outp( SOUNDSCAPE_Config.BasePort + GA_REGADDR, rnum );
-	outp( SOUNDSCAPE_Config.BasePort + GA_REGDATA, value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ad_read
-
-   Reads the AD-1848 indirect registers.  This function should not be
-   used while the AD-1848 mode change is enabled
----------------------------------------------------------------------*/
-
-static int ad_read
-   (
-   int rnum
-   )
-
-   {
-   int data;
-
-	outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, rnum );
-	data = inp( SOUNDSCAPE_Config.WavePort + AD_REGDATA );
-   return( data );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: ad_write
-
-   Writes to the AD-1848 indirect registers.  This function should
-   not be used while the AD-1848 mode change is enabled.
----------------------------------------------------------------------*/
-
-static void ad_write
-   (
-   int rnum,
-   int value
-   )
-
-   {
-   outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, rnum );
-   outp( SOUNDSCAPE_Config.WavePort + AD_REGDATA, value );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: tdelay
-
-   Delay function - 250ms - for AD-1848 re-synch and autocalibration.
----------------------------------------------------------------------*/
-
-static void tdelay
-   (
-   void
-   )
-
-   {
-	long time;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-   _enable();
-	time = clock() + CLOCKS_PER_SEC/4;
-	while(clock() < time)
-		;
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: pcm_format
-
-   Sets the PCM data format.
----------------------------------------------------------------------*/
-
-static void pcm_format
-   (
-   void
-   )
-
-   {
-	int format;
-
-	// build the register value based on format
-	format = 0;
-
-   switch( SOUNDSCAPE_SampleRate )
-      {
-      case 11025:
-         format = 0x03;
-         break;
-
-      case 22050:
-         format = 0x07;
-         break;
-
-      case 44100:
-         format = 0x0b;
-         break;
-
-      default:
-         // Set it to 11025 hz
-         format = 0x03;
-         break;
-      }
-
-	// set other format bits and format globals
-   if ( SOUNDSCAPE_MixMode & SIXTEEN_BIT )
-      {
-      format |= 0x40;
-      }
-
-   if ( SOUNDSCAPE_MixMode & STEREO )
-      {
-      format |= 0x10;
-      }
-
-	// enable mode change, point to format reg
-	outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, 0x40 | AD_FORMAT );
-
-	// write the format
-	outp( SOUNDSCAPE_Config.WavePort + AD_REGDATA, format );
-
-	// delay for internal re-synch
-	tdelay();
-
-	// exit mode change state
-	outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, 0x00 );
-
-	// delay for autocalibration
-	tdelay();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_SetPlaybackRate
-
-   Sets the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-void SOUNDSCAPE_SetPlaybackRate
-   (
-   unsigned rate
-   )
-
-   {
-   if ( rate < 20000 )
-      {
-      rate = 11025;
-      }
-   else if ( rate < 30000 )
-      {
-      rate = 22050;
-      }
-   else
-      {
-      rate = 44100;
-      }
-
-   SOUNDSCAPE_SampleRate = rate;
-
-   // Set the rate
-   pcm_format();
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_GetPlaybackRate
-
-   Returns the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-unsigned SOUNDSCAPE_GetPlaybackRate
-   (
-   void
-   )
-
-   {
-   return( SOUNDSCAPE_SampleRate );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_SetMixMode
-
-   Sets the sound card to play samples in mono or stereo.
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_SetMixMode
-   (
-   int mode
-   )
-
-   {
-   SOUNDSCAPE_MixMode = mode & SOUNDSCAPE_MaxMixMode;
-   SOUNDSCAPE_SamplePacketSize = SOUNDSCAPE_SampleSize[ SOUNDSCAPE_MixMode ];
-
-   // Set the mixmode
-   pcm_format();
-
-   return( mode );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_StopPlayback
-
-   Ends the DMA transfer of digitized sound to the sound card.
----------------------------------------------------------------------*/
-
-void SOUNDSCAPE_StopPlayback
-   (
-   void
-   )
-
-   {
-   // Don't allow anymore interrupts
-   SOUNDSCAPE_DisableInterrupt();
-
-	/* stop the AD-1848 */
-	ad_write( AD_CONFIG, 0x00 );
-
-	/* let it finish it's cycles */
-	tdelay();
-
-   // Disable the DMA channel
-   DMA_EndTransfer( SOUNDSCAPE_Config.DMAChan );
-
-   SOUNDSCAPE_SoundPlaying = FALSE;
-
-   SOUNDSCAPE_DMABuffer = NULL;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_SetupDMABuffer
-
-   Programs the DMAC for sound transfer.
----------------------------------------------------------------------*/
-
-static int SOUNDSCAPE_SetupDMABuffer
-   (
-   char *BufferPtr,
-   int   BufferSize,
-   int   mode
-   )
-
-   {
-   int DmaStatus;
-
-   DmaStatus = DMA_SetupTransfer( SOUNDSCAPE_Config.DMAChan, BufferPtr, BufferSize, mode );
-   if ( DmaStatus == DMA_Error )
-      {
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_DmaError );
-      return( SOUNDSCAPE_Error );
-      }
-
-   SOUNDSCAPE_DMAChannel         = SOUNDSCAPE_Config.DMAChan;
-   SOUNDSCAPE_DMABuffer          = BufferPtr;
-   SOUNDSCAPE_CurrentDMABuffer   = BufferPtr;
-   SOUNDSCAPE_TotalDMABufferSize = BufferSize;
-   SOUNDSCAPE_DMABufferEnd       = BufferPtr + BufferSize;
-
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_GetCurrentPos
-
-   Returns the offset within the current sound being played.
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_GetCurrentPos
-   (
-   void
-   )
-
-   {
-   char *CurrentAddr;
-   int   offset;
-
-   if ( !SOUNDSCAPE_SoundPlaying )
-      {
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_NoSoundPlaying );
-      return( SOUNDSCAPE_Error );
-      }
-
-   CurrentAddr = DMA_GetCurrentPos( SOUNDSCAPE_Config.DMAChan );
-
-   offset = ( int )( ( ( unsigned long )CurrentAddr ) -
-      ( ( unsigned long )SOUNDSCAPE_CurrentDMABuffer ) );
-
-   if ( SOUNDSCAPE_MixMode & SIXTEEN_BIT )
-      {
-      offset >>= 1;
-      }
-
-   if ( SOUNDSCAPE_MixMode & STEREO )
-      {
-      offset >>= 1;
-      }
-
-   return( offset );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_BeginPlayback
-
-   Starts playback of digitized sound.
----------------------------------------------------------------------*/
-
-static int SOUNDSCAPE_BeginPlayback
-   (
-   int length
-   )
-
-   {
-   int SampleLength;
-   int LoByte;
-   int HiByte;
-
-   if ( SOUNDSCAPE_MixMode & SIXTEEN_BIT )
-      {
-      SampleLength = length / 2;
-      }
-   else
-      {
-      SampleLength = length;
-      }
-
-   if ( SOUNDSCAPE_MixMode & STEREO )
-      {
-      SampleLength >>= 1;
-      }
-
-   SampleLength--;
-
-	// setup the AD-1848 interrupt count
-	// set the interrupt count value based on the format.
-	// count will decrement every sample period and generate
-	// an interrupt when in rolls over. we want this always
-	// to be at every 1/2 buffer, regardless of the data format,
-	// so the count must be adjusted accordingly.
-   HiByte = hibyte( SampleLength );
-   LoByte = lobyte( SampleLength );
-	ad_write( AD_LCOUNT, LoByte );
-	ad_write( AD_UCOUNT, HiByte );
-
-	/* unmask the host DMA controller */
-   SOUNDSCAPE_EnableInterrupt();
-
-	/* start the AD-1848 */
-	ad_write(AD_CONFIG, 0x01);
-
-   SOUNDSCAPE_SoundPlaying = TRUE;
-
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_BeginBufferedPlayback
-
-   Begins multibuffered playback of digitized sound on the sound card.
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_BeginBufferedPlayback
-   (
-   char    *BufferStart,
-   int      BufferSize,
-   int      NumDivisions,
-   unsigned SampleRate,
-   int      MixMode,
-   void  ( *CallBackFunc )( void )
-   )
-
-   {
-   int DmaStatus;
-   int TransferLength;
-
-   if ( SOUNDSCAPE_SoundPlaying )
-      {
-      SOUNDSCAPE_StopPlayback();
-      }
-
-   SOUNDSCAPE_SetMixMode( MixMode );
-
-   DmaStatus = SOUNDSCAPE_SetupDMABuffer( BufferStart, BufferSize,
-      DMA_AutoInitRead );
-   if ( DmaStatus == SOUNDSCAPE_Error )
-      {
-      return( SOUNDSCAPE_Error );
-      }
-
-   SOUNDSCAPE_SetPlaybackRate( SampleRate );
-
-   SOUNDSCAPE_SetCallBack( CallBackFunc );
-
-   SOUNDSCAPE_EnableInterrupt();
-
-   TransferLength = BufferSize / NumDivisions;
-   SOUNDSCAPE_TransferLength = TransferLength;
-
-   SOUNDSCAPE_BeginPlayback( TransferLength );
-
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_GetCardInfo
-
-   Returns the maximum number of bits that can represent a sample
-   (8 or 16) and the number of channels (1 for mono, 2 for stereo).
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_GetCardInfo
-   (
-   int *MaxSampleBits,
-   int *MaxChannels
-   )
-
-   {
-   int status;
-
-   status = SOUNDSCAPE_FindCard();
-   if ( status == SOUNDSCAPE_Ok )
-      {
-      *MaxChannels = 2;
-      *MaxSampleBits = 16;
-      return( SOUNDSCAPE_Ok );
-      }
-
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_SetCallBack
-
-   Specifies the user function to call at the end of a sound transfer.
----------------------------------------------------------------------*/
-
-void SOUNDSCAPE_SetCallBack
-   (
-   void ( *func )( void )
-   )
-
-   {
-   SOUNDSCAPE_CallBack = func;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void SOUNDSCAPE_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-static void SOUNDSCAPE_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( SOUNDSCAPE_LockStart, SOUNDSCAPE_LockEnd );
-   DPMI_Unlock( SOUNDSCAPE_Config );
-   DPMI_Unlock( SOUNDSCAPE_OldInt );
-   DPMI_Unlock( SOUNDSCAPE_Installed );
-   DPMI_Unlock( SOUNDSCAPE_DMABuffer );
-   DPMI_Unlock( SOUNDSCAPE_DMABufferEnd );
-   DPMI_Unlock( SOUNDSCAPE_CurrentDMABuffer );
-   DPMI_Unlock( SOUNDSCAPE_TotalDMABufferSize );
-   DPMI_Unlock( SOUNDSCAPE_TransferLength );
-   DPMI_Unlock( SOUNDSCAPE_MixMode );
-   DPMI_Unlock( SOUNDSCAPE_SamplePacketSize );
-   DPMI_Unlock( SOUNDSCAPE_SampleRate );
-   DPMI_Unlock( SOUNDSCAPE_SoundPlaying );
-   DPMI_Unlock( SOUNDSCAPE_CallBack );
-   DPMI_Unlock( SOUNDSCAPE_IntController1Mask );
-   DPMI_Unlock( SOUNDSCAPE_IntController2Mask );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-static int SOUNDSCAPE_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( SOUNDSCAPE_LockStart, SOUNDSCAPE_LockEnd );
-   status |= DPMI_Lock( SOUNDSCAPE_Config );
-   status |= DPMI_Lock( SOUNDSCAPE_OldInt );
-   status |= DPMI_Lock( SOUNDSCAPE_Installed );
-   status |= DPMI_Lock( SOUNDSCAPE_DMABuffer );
-   status |= DPMI_Lock( SOUNDSCAPE_DMABufferEnd );
-   status |= DPMI_Lock( SOUNDSCAPE_CurrentDMABuffer );
-   status |= DPMI_Lock( SOUNDSCAPE_TotalDMABufferSize );
-   status |= DPMI_Lock( SOUNDSCAPE_TransferLength );
-   status |= DPMI_Lock( SOUNDSCAPE_MixMode );
-   status |= DPMI_Lock( SOUNDSCAPE_SamplePacketSize );
-   status |= DPMI_Lock( SOUNDSCAPE_SampleRate );
-   status |= DPMI_Lock( SOUNDSCAPE_SoundPlaying );
-   status |= DPMI_Lock( SOUNDSCAPE_CallBack );
-   status |= DPMI_Lock( SOUNDSCAPE_IntController1Mask );
-   status |= DPMI_Lock( SOUNDSCAPE_IntController2Mask );
-
-   if ( status != DPMI_Ok )
-      {
-      SOUNDSCAPE_UnlockMemory();
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_DPMI_Error );
-      return( SOUNDSCAPE_Error );
-      }
-
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: allocateTimerStack
-
-   Allocate a block of memory from conventional (low) memory and return
-   the selector (which can go directly into a segment register) of the
-   memory block or 0 if an error occured.
----------------------------------------------------------------------*/
-
-static unsigned short allocateTimerStack
-   (
-   unsigned short size
-   )
-
-   {
-   union REGS regs;
-
-   // clear all registers
-   memset( &regs, 0, sizeof( regs ) );
-
-   // DPMI allocate conventional memory
-   regs.w.ax = 0x100;
-
-   // size in paragraphs
-   regs.w.bx = ( size + 15 ) / 16;
-
-   int386( 0x31, &regs, &regs );
-   if (!regs.w.cflag)
-      {
-      // DPMI call returns selector in dx
-      // (ax contains real mode segment
-      // which is ignored here)
-
-      return( regs.w.dx );
-      }
-
-   // Couldn't allocate memory.
-   return( NULL );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: deallocateTimerStack
-
-   Deallocate a block of conventional (low) memory given a selector to
-   it.  Assumes the block was allocated with DPMI function 0x100.
----------------------------------------------------------------------*/
-
-static void deallocateTimerStack
-   (
-   unsigned short selector
-   )
-
-   {
-   union REGS regs;
-
-   if ( selector != NULL )
-      {
-      // clear all registers
-      memset( &regs, 0, sizeof( regs ) );
-
-      regs.w.ax = 0x101;
-      regs.w.dx = selector;
-      int386( 0x31, &regs, &regs );
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: parse
-
-   Parses for the right hand string of an .INI file equate.
----------------------------------------------------------------------*/
-
-static int parse
-   (
-   char *val,
-   char *str,
-   FILE *p1
-   )
-
-   {
-	int  i;
-	int  j;
-   char tmpstr[ 81 ];
-
-	rewind( p1 );
-
-	while( !feof( p1 ) )
-      {
-      // get a new string
-      fgets( tmpstr, 81, p1 );
-      if( ( tmpstr[ 0 ] == '[' ) || ( tmpstr[ 0 ] == ';' ) ||
-         ( tmpstr[ 0 ] == '\n' ) )
-         {
-         continue;
-         }
-
-		// parse up to the '='
-      i = 0;
-      while( ( tmpstr[ i ] != '=' ) && ( tmpstr[ i ] != '\n' ) )
-         {
-         i++;
-         }
-
-		if( tmpstr[ i ] != '=' )
-         {
-         continue;
-         }
-
-		tmpstr[ i ] = '\0';
-
-		// see if it's the one we want
-		if ( strcmp( tmpstr, str ) )
-         {
-         continue;
-         }
-
-		// copy the right hand value to the destination string
-      i++;
-		for( j = 0; j < 32; j++ )
-         {
-         if ( ( tmpstr[ i ] == ' ' ) || ( tmpstr[ i ] == '\t' ) ||
-            ( tmpstr[ i ] == ',' ) || ( tmpstr[ i ] == '\n' ) )
-            {
-            break;
-            }
-
-			val[ j ] = tmpstr[ i ];
-         i++;
-         }
-		val[j] = '\0';
-
-      return( TRUE );
-      }
-
-   return( FALSE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_FindCard
-
-   Determines if a SoundScape is present and where it is located.
----------------------------------------------------------------------*/
-
-static int SOUNDSCAPE_FindCard
-   (
-   void
-   )
-
-   {
-   int   found;
-   int   status;
-   int   tmp;
-	char *cp;
-   char  str[ 33 ];
-	FILE *fp;
-
-   if ( SOUNDSCAPE_FoundCard )
-      {
-      return( SOUNDSCAPE_Ok );
-      }
-
-	cp = getenv( "SNDSCAPE" );
-   if ( cp == NULL )
-      {
-      strcpy( str, "C:\\SNDSCAPE" );
-      }
-   else
-      {
-      strcpy( str, cp );
-      }
-
-   strcat(str, "\\SNDSCAPE.INI");
-
-	fp = fopen( str, "r" );
-   if ( fp == NULL )
-      {
-      if ( cp == NULL )
-         {
-         SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_EnvNotFound );
-         return( SOUNDSCAPE_Error );
-         }
-
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_InitFileNotFound );
-      return( SOUNDSCAPE_Error );
-      }
-
-	found = parse( str, "Product", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingProductInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	if( strstr( str, "SoundFX" ) == NULL )
-      {
-      SOUNDSCAPE_Config.OldIRQs = FALSE;
-      }
-	else
-      {
-		SOUNDSCAPE_Config.OldIRQs = TRUE;
-      }
-
-	found = parse( str, "Port", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingPortInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	SOUNDSCAPE_Config.BasePort = strtol( str, ( char ** )0, 16);
-
-	found = parse( str, "DMA", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingDMAInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	SOUNDSCAPE_Config.DMAChan = ( int )strtol( str, ( char ** )0, 10 );
-   status = DMA_VerifyChannel( SOUNDSCAPE_Config.DMAChan );
-   if ( status == DMA_Error )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_DmaError );
-      return( SOUNDSCAPE_Error );
-      }
-
-	found = parse( str, "IRQ", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingIRQInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	SOUNDSCAPE_Config.MIDIIRQ = ( int )strtol( str, ( char ** )0, 10 );
-   if ( SOUNDSCAPE_Config.MIDIIRQ == 2 )
-      {
-      SOUNDSCAPE_Config.MIDIIRQ = 9;
-      }
-
-	found = parse( str, "SBIRQ", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingSBIRQInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	SOUNDSCAPE_Config.WaveIRQ = ( int )strtol( str, ( char ** )0, 10 );
-	if ( SOUNDSCAPE_Config.WaveIRQ == 2 )
-      {
-		SOUNDSCAPE_Config.WaveIRQ = 9;
-      }
-
-   if ( !VALID_IRQ( SOUNDSCAPE_Config.WaveIRQ ) )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_InvalidSBIrq );
-      return( SOUNDSCAPE_Error );
-      }
-
-   if ( SOUNDSCAPE_Interrupts[ SOUNDSCAPE_Config.WaveIRQ ] == INVALID )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_InvalidSBIrq );
-      return( SOUNDSCAPE_Error );
-      }
-
-	found = parse( str, "SBEnable", fp );
-   if ( !found )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingSBENABLEInfo );
-      return( SOUNDSCAPE_Error );
-      }
-
-	if( !strcmp( str, "false" ) )
-      {
-      SOUNDSCAPE_Config.SBEmul = FALSE;
-      }
-	else
-      {
-      SOUNDSCAPE_Config.SBEmul = TRUE;
-      }
-
-	// do a hardware test
-	outp( SOUNDSCAPE_Config.BasePort + GA_REGADDR, 0x00f5 );
-	tmp = inp( SOUNDSCAPE_Config.BasePort + GA_REGADDR );
-	if ( ( tmp & 0x000f ) != 0x0005 )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_HardwareError );
-      return( SOUNDSCAPE_Error );
-      }
-
-	if( ( tmp & 0x00f0 ) == 0x00f0 )
-      {
-      fclose( fp );
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_HardwareError );
-      return( SOUNDSCAPE_Error );
-      }
-
-	// formulate the chip ID
-	tmp >>= 4;
-	if( tmp == 0 )
-      {
-      SOUNDSCAPE_Config.ChipID = ODIE;
-      }
-	else if ( !( tmp & 0x0008 ) )
-      {
-		SOUNDSCAPE_Config.ChipID = OPUS;
-      }
-	else
-      {
-		SOUNDSCAPE_Config.ChipID = MMIC;
-      }
-
-	// parse for the AD-1848 address if necessary
-	if( SOUNDSCAPE_Config.ChipID == ODIE )
-      {
-      found = parse( str, "WavePort", fp );
-      if ( !found )
-         {
-         fclose( fp );
-         SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_MissingWavePortInfo );
-         return( SOUNDSCAPE_Error );
-         }
-
-      SOUNDSCAPE_Config.WavePort = strtol( str, ( char ** )0, 16 );
-      }
-	else
-      {
-      // otherwise, the base address is fixed
-      SOUNDSCAPE_Config.WavePort = SOUNDSCAPE_Config.BasePort + AD_OFFSET;
-      }
-
-	// we're done with the file
-	fclose( fp );
-
-	// if it's an ODIE board, note CD-ROM decode enable
-	if ( SOUNDSCAPE_Config.ChipID == ODIE )
-      {
-		SOUNDSCAPE_Config.CDROM = ga_read( GA_CDCFG ) & 0x80;
-      }
-
-	// build the Wave IRQ index value
-	if( !SOUNDSCAPE_Config.OldIRQs )
-      {
-      switch( SOUNDSCAPE_Config.WaveIRQ )
-         {
-         case 9 :
-            SOUNDSCAPE_Config.IRQIndx = 0;
-            break;
-
-         case 5 :
-            SOUNDSCAPE_Config.IRQIndx = 1;
-            break;
-
-         case 7 :
-            SOUNDSCAPE_Config.IRQIndx = 2;
-            break;
-
-         default :
-            SOUNDSCAPE_Config.IRQIndx = 3;
-            break;
-         }
-      }
-   else
-      {
-      switch( SOUNDSCAPE_Config.WaveIRQ )
-         {
-         case 9 :
-            SOUNDSCAPE_Config.IRQIndx = 0;
-            break;
-
-         case 5 :
-            SOUNDSCAPE_Config.IRQIndx = 2;
-            break;
-
-         case 7 :
-            SOUNDSCAPE_Config.IRQIndx = 1;
-            break;
-
-         default :
-            SOUNDSCAPE_Config.IRQIndx = 3;
-            break;
-         }
-      }
-
-   SOUNDSCAPE_FoundCard = TRUE;
-   SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_Ok );
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_Setup
-
-   Setup the Soundscape card for native mode PCM.
----------------------------------------------------------------------*/
-
-static int SOUNDSCAPE_Setup
-   (
-   void
-   )
-
-   {
-   int tmp;
-   int Interrupt;
-   int status;
-
-	// if necessary, clear any pending SB ints
-	if ( SOUNDSCAPE_Config.SBEmul )
-      {
-      inp( SB_IACK );
-      }
-
-   SOUNDSCAPE_DisableInterrupt();
-
-	// make sure the AD-1848 is not running
-	if ( ad_read( AD_CONFIG ) & 0x01 )
-      {
-      SOUNDSCAPE_StopPlayback();
-      }
-
-	// if necessary, do some signal re-routing
-	if( SOUNDSCAPE_Config.ChipID != MMIC )
-      {
-      // get the gate-array off of the DMA channel
-		ga_write( GA_DMACHB, 0x20 );
-
-      if ( !SOUNDSCAPE_Config.OldIRQs )
-         {
-         switch( SOUNDSCAPE_Config.MIDIIRQ )
-            {
-            case 5 :
-               tmp = 1;
-               break;
-
-            case 7 :
-               tmp = 2;
-               break;
-
-            case 9 :
-               tmp = 0;
-               break;
-
-            default :
-               tmp = 3;
-               break;
-            }
-         }
-      else
-         {
-         switch( SOUNDSCAPE_Config.MIDIIRQ )
-            {
-            case 5 :
-               tmp = 2;
-               break;
-
-            case 7 :
-               tmp = 1;
-               break;
-
-            case 9 :
-               tmp = 0;
-               break;
-
-            default :
-               tmp = 3;
-               break;
-            }
-         }
-
-      // set HostIRQ to MIDIIRQ for now
-      ga_write( GA_INTCFG, 0xf0 | ( tmp << 2 ) | tmp );
-
-      // now, route the AD-1848 stuff ...
-		if ( SOUNDSCAPE_Config.ChipID == OPUS )
-         {
-         // set the AD-1848 chip decode
-         ga_write( GA_HMCTL, ( ga_read( GA_HMCTL ) & 0xcf ) | 0x10 );
-         }
-      // setup the DMA polarity
-		ga_write( GA_DMACFG, 0x50 );
-
-		// init the CD-ROM (AD-1848) config register
-		ga_write( GA_CDCFG, 0x89 | ( SOUNDSCAPE_Config.DMAChan << 4 ) | ( SOUNDSCAPE_Config.IRQIndx << 1 ) );
-
-      // enable mode change, point to config reg
-		outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, 0x40 | AD_CONFIG );
-
-      // set interf cnfg reg for DMA mode, single chan, autocal on
-		outp( SOUNDSCAPE_Config.WavePort + AD_REGDATA, 0x0c );
-
-      // exit mode change state
-		outp( SOUNDSCAPE_Config.WavePort + AD_REGADDR, 0x00 );
-
-      // delay for autocalibration
-      tdelay();
-      }
-
-   // Install our interrupt handler
-   Interrupt = SOUNDSCAPE_Interrupts[ SOUNDSCAPE_Config.WaveIRQ ];
-   SOUNDSCAPE_OldInt = _dos_getvect( Interrupt );
-   if ( SOUNDSCAPE_Config.WaveIRQ < 8 )
-      {
-      _dos_setvect( Interrupt, SOUNDSCAPE_ServiceInterrupt );
-      }
-   else
-      {
-      status = IRQ_SetVector( Interrupt, SOUNDSCAPE_ServiceInterrupt );
-      if ( status != IRQ_Ok )
-         {
-         SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_UnableToSetIrq );
-         return( SOUNDSCAPE_Error );
-         }
-      }
-
-	// max left and right volumes
-	ad_write( AD_LEFTOUT, 0 );
-	ad_write( AD_RIGHTOUT, 0 );
-
-	// clear any pending interrupt condition
-	outp( SOUNDSCAPE_Config.WavePort + AD_STATUS, 0x00 );
-
-	// enable the interrupt pin
-	ad_write( AD_PINCTRL, ad_read( AD_PINCTRL ) | 0x02 );
-
-   SOUNDSCAPE_EnableInterrupt();
-
-   SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_Ok );
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_GetMIDIPort
-
-   Gets the address of the SoundScape MIDI port.
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_GetMIDIPort
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status = SOUNDSCAPE_FindCard();
-   if ( status != SOUNDSCAPE_Ok )
-      {
-      return( status );
-      }
-
-   return( SOUNDSCAPE_Config.BasePort );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_Init
-
-   Initializes the sound card and prepares the module to play
-   digitized sounds.
----------------------------------------------------------------------*/
-
-int SOUNDSCAPE_Init
-   (
-   void
-   )
-
-   {
-   int status;
-
-   if ( SOUNDSCAPE_Installed )
-      {
-      SOUNDSCAPE_Shutdown();
-      }
-
-   // Save the interrupt masks
-   SOUNDSCAPE_IntController1Mask = inp( 0x21 );
-   SOUNDSCAPE_IntController2Mask = inp( 0xA1 );
-
-   SOUNDSCAPE_SoundPlaying = FALSE;
-   SOUNDSCAPE_SetCallBack( NULL );
-   SOUNDSCAPE_DMABuffer = NULL;
-
-   status = SOUNDSCAPE_FindCard();
-   if ( status != SOUNDSCAPE_Ok )
-      {
-      return( status );
-      }
-
-   status = SOUNDSCAPE_LockMemory();
-   if ( status != SOUNDSCAPE_Ok )
-      {
-      SOUNDSCAPE_UnlockMemory();
-      return( status );
-      }
-
-   StackSelector = allocateTimerStack( kStackSize );
-   if ( StackSelector == NULL )
-      {
-      SOUNDSCAPE_UnlockMemory();
-      SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_OutOfMemory );
-      return( SOUNDSCAPE_Error );
-      }
-
-   // Leave a little room at top of stack just for the hell of it...
-   StackPointer = kStackSize - sizeof( long );
-
-   SOUNDSCAPE_Installed = TRUE;
-
-   status = SOUNDSCAPE_Setup();
-   if ( status != SOUNDSCAPE_Ok )
-      {
-      SOUNDSCAPE_Shutdown();
-      return( status );
-      }
-
-//	printf("Testing DMA and IRQ ...\n");
-//	if( test_dma_irq() )
-//      {
-//      printf("\t\007Hardware Not Responding\n\n");
-//      close_soundscape();
-//      return( SOUNDSCAPE_Error );
-//      }
-
-   SOUNDSCAPE_SetPlaybackRate( SOUNDSCAPE_DefaultSampleRate );
-   SOUNDSCAPE_SetMixMode( SOUNDSCAPE_DefaultMixMode );
-
-   SOUNDSCAPE_SetErrorCode( SOUNDSCAPE_Ok );
-   return( SOUNDSCAPE_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SOUNDSCAPE_Shutdown
-
-   Ends transfer of sound data to the sound card and restores the
-   system resources used by the card.
----------------------------------------------------------------------*/
-
-void SOUNDSCAPE_Shutdown
-   (
-   void
-   )
-
-   {
-   int Interrupt;
-
-   // Halt the DMA transfer
-   SOUNDSCAPE_StopPlayback();
-
-	// disable the AD-1848 interrupt pin
-	ad_write( AD_PINCTRL, ad_read( AD_PINCTRL ) & 0xfd );
-
-	// if necessary, do some signal re-routing
-	if ( SOUNDSCAPE_Config.ChipID != MMIC )
-      {
-		// re-init the CD-ROM (AD-1848) config register as needed.
-		// this will disable the AD-1848 interface.
-		if ( SOUNDSCAPE_Config.ChipID == ODIE )
-         {
-         ga_write( GA_CDCFG, SOUNDSCAPE_Config.CDROM );
-         }
-		else
-         {
-         ga_write( GA_CDCFG, ga_read( GA_CDCFG ) & 0x7f);
-         }
-
-		// if necessary, reset the SoundBlaster IRQ
-		if ( SOUNDSCAPE_Config.SBEmul )
-         {
-         ga_write( GA_INTCFG, ( ga_read( GA_INTCFG ) & 0xf3 ) |
-            ( SOUNDSCAPE_Config.IRQIndx << 2 ) );
-         }
-
-      // re-assign the gate-array DMA channel
-		ga_write( GA_DMACHB, 0x80 | ( SOUNDSCAPE_Config.DMAChan << 4 ) );
-      }
-
-   // Restore the original interrupt
-   Interrupt = SOUNDSCAPE_Interrupts[ SOUNDSCAPE_Config.WaveIRQ ];
-   if ( SOUNDSCAPE_Config.WaveIRQ >= 8 )
-      {
-      IRQ_RestoreVector( Interrupt );
-      }
-   _dos_setvect( Interrupt, SOUNDSCAPE_OldInt );
-
-   SOUNDSCAPE_SoundPlaying = FALSE;
-
-   SOUNDSCAPE_DMABuffer = NULL;
-
-   SOUNDSCAPE_SetCallBack( NULL );
-
-   SOUNDSCAPE_UnlockMemory();
-
-   if ( StackSelector != NULL )
-      {
-      deallocateTimerStack( StackSelector );
-      StackSelector = NULL;
-      }
-
-   SOUNDSCAPE_Installed = FALSE;
-   }
--- a/src/audiolib/sndscape.h
+++ /dev/null
@@ -1,71 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: SNDSCAPE.H
-
-   author: James R. Dose
-   date:   October 26, 1994
-
-   Public header for SNDSCAPE.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __SNDSCAPE_H
-#define __SNDSCAPE_H
-
-extern int SOUNDSCAPE_DMAChannel;
-extern int SOUNDSCAPE_ErrorCode;
-
-enum SOUNDSCAPE_ERRORS
-   {
-   SOUNDSCAPE_Warning = -2,
-   SOUNDSCAPE_Error = -1,
-   SOUNDSCAPE_Ok = 0,
-   SOUNDSCAPE_EnvNotFound,
-   SOUNDSCAPE_InitFileNotFound,
-   SOUNDSCAPE_MissingProductInfo,
-   SOUNDSCAPE_MissingPortInfo,
-   SOUNDSCAPE_MissingDMAInfo,
-   SOUNDSCAPE_MissingIRQInfo,
-   SOUNDSCAPE_MissingSBIRQInfo,
-   SOUNDSCAPE_MissingSBENABLEInfo,
-   SOUNDSCAPE_MissingWavePortInfo,
-   SOUNDSCAPE_HardwareError,
-   SOUNDSCAPE_NoSoundPlaying,
-   SOUNDSCAPE_InvalidSBIrq,
-   SOUNDSCAPE_UnableToSetIrq,
-   SOUNDSCAPE_DmaError,
-   SOUNDSCAPE_DPMI_Error,
-   SOUNDSCAPE_OutOfMemory
-   };
-
-char    *SOUNDSCAPE_ErrorString( int ErrorNumber );
-void     SOUNDSCAPE_SetPlaybackRate( unsigned rate );
-unsigned SOUNDSCAPE_GetPlaybackRate( void );
-int      SOUNDSCAPE_SetMixMode( int mode );
-void     SOUNDSCAPE_StopPlayback( void );
-int      SOUNDSCAPE_GetCurrentPos( void );
-int      SOUNDSCAPE_BeginBufferedPlayback( char *BufferStart, int BufferSize, int NumDivisions, unsigned SampleRate, int MixMode, void ( *CallBackFunc )( void ) );
-int      SOUNDSCAPE_GetCardInfo( int *MaxSampleBits, int *MaxChannels );
-void     SOUNDSCAPE_SetCallBack( void ( *func )( void ) );
-int      SOUNDSCAPE_GetMIDIPort( void );
-int      SOUNDSCAPE_Init( void );
-void     SOUNDSCAPE_Shutdown( void );
-
-#endif
--- a/src/audiolib/sndsrc.c
+++ /dev/null
@@ -1,656 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: SNDSRC.C
-
-   author: James R. Dose
-   date:   March 26, 1994
-
-   Low level routines to support the Disney Sound Source.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#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 )
-
-#include <stdlib.h>
-#include <dos.h>
-#include <conio.h>
-#include "dpmi.h"
-#include "task_man.h"
-#include "sndcards.h"
-#include "user.h"
-#include "sndsrc.h"
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-static int SS_Installed = FALSE;
-
-static int SS_Port = SS_DefaultPort;
-static int SS_OffCommand = 0xc;
-
-static char   *SS_BufferStart;
-static char   *SS_BufferEnd;
-static char   *SS_CurrentBuffer;
-static int     SS_BufferNum = 0;
-static int     SS_NumBuffers = 0;
-static int     SS_TotalBufferSize = 0;
-static int     SS_TransferLength  = 0;
-static int     SS_CurrentLength   = 0;
-
-static char   *SS_SoundPtr;
-volatile int   SS_SoundPlaying;
-
-static task   *SS_Timer;
-
-void ( *SS_CallBack )( void );
-
-int SS_ErrorCode = SS_Ok;
-
-#define SS_SetErrorCode( status ) \
-   SS_ErrorCode   = ( status );
-
-/*---------------------------------------------------------------------
-   Function: SS_ErrorString
-
-   Returns a pointer to the error message associated with an error
-   number.  A -1 returns a pointer the current error.
----------------------------------------------------------------------*/
-
-char *SS_ErrorString
-   (
-   int ErrorNumber
-   )
-
-   {
-   char *ErrorString;
-
-   switch( ErrorNumber )
-      {
-      case SS_Error :
-         ErrorString = SS_ErrorString( SS_ErrorCode );
-         break;
-
-      case SS_Ok :
-         ErrorString = "Sound Source ok.";
-         break;
-
-      case SS_NotFound :
-         ErrorString = "Could not detect Sound Source.";
-         break;
-
-      case SS_NoSoundPlaying :
-         ErrorString = "No sound playing in SndSrc.";
-         break;
-
-      case SS_DPMI_Error :
-         ErrorString = "DPMI Error in SndSrc.";
-         break;
-
-      default :
-         ErrorString = "Unknown Sound Source error code.";
-         break;
-      }
-
-   return( ErrorString );
-   }
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define SS_LockStart SS_ServiceInterrupt
-
-
-/*---------------------------------------------------------------------
-   Function: SS_ServiceInterrupt
-
-   Handles interrupt generated by sound card at the end of a voice
-   transfer.  Calls the user supplied callback function.
----------------------------------------------------------------------*/
-
-static void SS_ServiceInterrupt
-   (
-   task *Task
-   )
-
-   {
-   int port = SS_Port;
-   int count;
-
-   count = 0;
-   while( ( inp( port + 1 ) & 0x40 ) == 0 )
-      {
-      outp( port, *SS_SoundPtr++ );
-      outp( port + 2, SS_OffCommand );
-      outp( port + 2, 4 );
-
-      SS_CurrentLength--;
-      if ( SS_CurrentLength == 0 )
-         {
-         // Keep track of current buffer
-         SS_CurrentBuffer += SS_TransferLength;
-         SS_BufferNum++;
-         if ( SS_BufferNum >= SS_NumBuffers )
-            {
-            SS_BufferNum = 0;
-            SS_CurrentBuffer = SS_BufferStart;
-            }
-
-         SS_CurrentLength = SS_TransferLength;
-         SS_SoundPtr = SS_CurrentBuffer;
-
-         // Call the caller's callback function
-         if ( SS_CallBack != NULL )
-            {
-            SS_CallBack();
-            }
-         }
-
-      count++;
-      // Only do at most 14 samples per tick
-      if ( count > 13 )
-         {
-         break;
-         }
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_StopPlayback
-
-   Ends the transfer of digitized sound to the Sound Source.
----------------------------------------------------------------------*/
-
-void SS_StopPlayback
-   (
-   void
-   )
-
-   {
-   if ( SS_SoundPlaying )
-      {
-      TS_Terminate( SS_Timer );
-
-      outp( SS_Port, 0x80 );
-      outp( SS_Port + 2, SS_OffCommand );
-      outp( SS_Port + 2, 4 );
-
-      SS_SoundPlaying = FALSE;
-
-      SS_BufferStart = NULL;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_GetCurrentPos
-
-   Returns the offset within the current sound being played.
----------------------------------------------------------------------*/
-
-int SS_GetCurrentPos
-   (
-   void
-   )
-
-   {
-   int offset;
-
-   if ( !SS_SoundPlaying )
-      {
-      SS_SetErrorCode( SS_NoSoundPlaying );
-      return( SS_Warning );
-      }
-
-   offset = ( int )( ( ( unsigned long )SS_SoundPtr ) -
-      ( ( unsigned long )SS_CurrentBuffer ) );
-
-   return( offset );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void SS_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_BeginBufferedPlayback
-
-   Begins multibuffered playback of digitized sound on the Sound Source.
----------------------------------------------------------------------*/
-
-int SS_BeginBufferedPlayback
-   (
-   char *BufferStart,
-   int   BufferSize,
-   int   NumDivisions,
-   void ( *CallBackFunc )( void )
-   )
-
-   {
-   if ( SS_SoundPlaying )
-      {
-      SS_StopPlayback();
-      }
-
-   SS_SetCallBack( CallBackFunc );
-
-   SS_BufferStart     = BufferStart;
-   SS_CurrentBuffer   = BufferStart;
-   SS_SoundPtr        = BufferStart;
-   SS_TotalBufferSize = BufferSize;
-   SS_BufferEnd       = BufferStart + BufferSize;
-   SS_TransferLength  = BufferSize / NumDivisions;
-   SS_CurrentLength   = SS_TransferLength;
-   SS_BufferNum       = 0;
-   SS_NumBuffers      = NumDivisions;
-
-   SS_SoundPlaying = TRUE;
-
-//   SS_Timer = TS_ScheduleTask( SS_ServiceInterrupt, 438, 1, NULL );
-   SS_Timer = TS_ScheduleTask( SS_ServiceInterrupt, 510, 1, NULL );
-   TS_Dispatch();
-
-   return( SS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_GetPlaybackRate
-
-   Returns the rate at which the digitized sound will be played in
-   hertz.
----------------------------------------------------------------------*/
-
-int SS_GetPlaybackRate
-   (
-   void
-   )
-
-   {
-   return( SS_SampleRate );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_SetMixMode
-
-   Sets the sound card to play samples in mono or stereo.
----------------------------------------------------------------------*/
-
-int SS_SetMixMode
-   (
-   int mode
-   )
-
-   {
-   mode = MONO_8BIT;
-   return( mode );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_SetPort
-
-   Selects which port to use to write to the Sound Source.
----------------------------------------------------------------------*/
-
-int SS_SetPort
-   (
-   int port
-   )
-
-   {
-   if ( SS_Installed )
-      {
-      SS_Shutdown();
-      }
-
-   SS_Port = port;
-
-   return( SS_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_SetCallBack
-
-   Specifies the user function to call at the end of a sound transfer.
----------------------------------------------------------------------*/
-
-void SS_SetCallBack
-   (
-   void ( *func )( void )
-   )
-
-   {
-   SS_CallBack = func;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_TestTimer
-
-   Used as a delay in SS_TestSoundSource.
----------------------------------------------------------------------*/
-
-void SS_TestTimer
-   (
-   task *Task
-   )
-
-   {
-   ( *( int * )( Task->data ) )++;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_TestSoundSource
-
-   Detect if the Sound Source is located at the specified port.
----------------------------------------------------------------------*/
-
-int SS_TestSoundSource
-   (
-   int port
-   )
-
-   {
-   int   present;
-   task *timer;
-   volatile int ticks;
-   int   i;
-
-   present = FALSE;
-
-   timer = TS_ScheduleTask( SS_TestTimer, 140, 1, &ticks );
-   TS_Dispatch();
-
-   outp( port + 2, 4 );
-
-   ticks = 0;
-
-   while( ticks < 4 )
-      {
-      // Do nothing for a while
-      }
-
-   TS_Terminate( timer );
-
-   if ( ( inp( port + 1 ) & 0x40 ) == 0 )
-      {
-      for( i = 32; i > 0; i-- )
-         {
-         outp( port, 0x80 );
-         outp( port + 2, SS_OffCommand );
-         outp( port + 2, 4 );
-         }
-
-      if ( inp( port + 1 ) & 0x40 )
-         {
-         present = TRUE;
-         }
-      }
-
-   outp( port + 2, SS_OffCommand );
-
-   return( present );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_DetectSoundSource
-
-   Detects which port the Sound Source is located.
----------------------------------------------------------------------*/
-
-int SS_DetectSoundSource
-   (
-   void
-   )
-
-   {
-   if ( USER_CheckParameter( SELECT_SOUNDSOURCE_PORT1 ) )
-      {
-      SS_Port = SS_Port1;
-      return( TRUE );
-      }
-
-   if ( USER_CheckParameter( SELECT_SOUNDSOURCE_PORT2 ) )
-      {
-      SS_Port = SS_Port2;
-      return( TRUE );
-      }
-
-   if ( USER_CheckParameter( SELECT_SOUNDSOURCE_PORT3 ) )
-      {
-      SS_Port = SS_Port3;
-      return( TRUE );
-      }
-
-   if ( SS_TestSoundSource( SS_Port1 ) )
-      {
-      SS_Port = SS_Port1;
-      return( TRUE );
-      }
-
-   if ( SS_TestSoundSource( SS_Port2 ) )
-      {
-      SS_Port = SS_Port2;
-      return( TRUE );
-      }
-
-   if ( SS_TestSoundSource( SS_Port3 ) )
-      {
-      SS_Port = SS_Port3;
-      return( TRUE );
-      }
-
-   return( FALSE );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_Init
-
-   Initializes the Sound Source prepares the module to play digitized
-   sounds.
----------------------------------------------------------------------*/
-
-int SS_Init
-   (
-   int soundcard
-   )
-
-   {
-   int status;
-
-   if ( SS_Installed )
-      {
-      SS_Shutdown();
-      }
-
-   if ( ( soundcard == TandySoundSource ) ||
-      ( USER_CheckParameter( SELECT_TANDY_SOUNDSOURCE ) ) )
-      {
-      // Tandy
-      SS_OffCommand = 0x0e;
-      }
-   else
-      {
-      // Disney
-      SS_OffCommand = 0x0c;
-      }
-
-   status = SS_DetectSoundSource();
-   if ( !status )
-      {
-      SS_SetErrorCode( SS_NotFound );
-      return( SS_Warning );
-      }
-
-   status = SS_LockMemory();
-   if ( status != SS_Ok )
-      {
-      SS_UnlockMemory();
-      return( status );
-      }
-
-   status = SS_Ok;
-
-   outp( SS_Port + 2, 4 );
-
-   SS_SoundPlaying = FALSE;
-
-   SS_SetCallBack( NULL );
-
-   SS_BufferStart = NULL;
-
-   SS_Installed = TRUE;
-
-   SS_SetErrorCode( status );
-   return( status );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_Shutdown
-
-   Ends transfer of sound data to the Sound Source.
----------------------------------------------------------------------*/
-
-void SS_Shutdown
-   (
-   void
-   )
-
-   {
-   // Halt the transfer
-   SS_StopPlayback();
-
-   outp( SS_Port + 2, SS_OffCommand );
-
-   SS_SoundPlaying = FALSE;
-
-   SS_BufferStart = NULL;
-
-   SS_SetCallBack( NULL );
-
-   SS_UnlockMemory();
-
-   SS_Installed = FALSE;
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-void SS_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( SS_LockStart, SS_LockEnd );
-   DPMI_Unlock( SS_Installed );
-   DPMI_Unlock( SS_Port );
-   DPMI_Unlock( SS_OffCommand );
-   DPMI_Unlock( SS_BufferStart );
-   DPMI_Unlock( SS_BufferEnd );
-   DPMI_Unlock( SS_CurrentBuffer );
-   DPMI_Unlock( SS_BufferNum );
-   DPMI_Unlock( SS_NumBuffers );
-   DPMI_Unlock( SS_TotalBufferSize );
-   DPMI_Unlock( SS_TransferLength );
-   DPMI_Unlock( SS_CurrentLength );
-   DPMI_Unlock( SS_SoundPtr );
-   DPMI_Unlock( SS_SoundPlaying );
-   DPMI_Unlock( SS_Timer );
-   DPMI_Unlock( SS_CallBack );
-   DPMI_Unlock( SS_ErrorCode );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: SS_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int SS_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( SS_LockStart, SS_LockEnd );
-   status |= DPMI_Lock( SS_Installed );
-   status |= DPMI_Lock( SS_Port );
-   status |= DPMI_Lock( SS_OffCommand );
-   status |= DPMI_Lock( SS_BufferStart );
-   status |= DPMI_Lock( SS_BufferEnd );
-   status |= DPMI_Lock( SS_CurrentBuffer );
-   status |= DPMI_Lock( SS_BufferNum );
-   status |= DPMI_Lock( SS_NumBuffers );
-   status |= DPMI_Lock( SS_TotalBufferSize );
-   status |= DPMI_Lock( SS_TransferLength );
-   status |= DPMI_Lock( SS_CurrentLength );
-   status |= DPMI_Lock( SS_SoundPtr );
-   status |= DPMI_Lock( SS_SoundPlaying );
-   status |= DPMI_Lock( SS_Timer );
-   status |= DPMI_Lock( SS_CallBack );
-   status |= DPMI_Lock( SS_ErrorCode );
-
-   if ( status != DPMI_Ok )
-      {
-      SS_UnlockMemory();
-      SS_SetErrorCode( SS_DPMI_Error );
-      return( SS_Error );
-      }
-
-   return( SS_Ok );
-   }
--- a/src/audiolib/sndsrc.h
+++ /dev/null
@@ -1,68 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: SNDSRC.H
-
-   author: James R. Dose
-   date:   March 26, 1994
-
-   Public header for for SNDSRC.C
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __SNDSRC_H
-#define __SNDSRC_H
-
-enum SS_ERRORS
-   {
-   SS_Warning = -2,
-   SS_Error   = -1,
-   SS_Ok      = 0,
-   SS_NotFound,
-   SS_NoSoundPlaying,
-   SS_DPMI_Error
-   };
-
-#define SELECT_SOUNDSOURCE_PORT1 "ss1"
-#define SELECT_SOUNDSOURCE_PORT2 "ss2"
-#define SELECT_SOUNDSOURCE_PORT3 "ss3"
-#define SELECT_TANDY_SOUNDSOURCE "sst"
-
-#define SS_Port1 0x3bc
-#define SS_Port2 0x378
-#define SS_Port3 0x278
-
-#define SS_DefaultPort 0x378
-#define SS_SampleRate  7000
-#define SS_DMAChannel  -1
-
-char *SS_ErrorString( int ErrorNumber );
-void  SS_StopPlayback( void );
-int   SS_GetCurrentPos( void );
-int   SS_BeginBufferedPlayback( char *BufferStart, int BufferSize, int NumDivisions, void ( *CallBackFunc )( void ) );
-int   SS_GetPlaybackRate( void );
-int   SS_SetMixMode( int mode );
-int   SS_SetPort( int port );
-void  SS_SetCallBack( void ( *func )( void ) );
-int   SS_Init( int soundcard );
-void  SS_Shutdown( void );
-void  SS_UnlockMemory( void );
-int   SS_LockMemory( void );
-
-#endif
--- a/src/audiolib/task_man.c
+++ /dev/null
@@ -1,974 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: TASK_MAN.C
-
-   author: James R. Dose
-   date:   July 25, 1994
-
-   Low level timer task scheduler.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#define TRUE  ( 1 == 1 )
-#define FALSE ( !TRUE )
-
-//#define USESTACK
-#define LOCKMEMORY
-#define NOINTS
-#define USE_USRHOOKS
-
-#include <stdlib.h>
-#include <dos.h>
-#include <conio.h>
-#include <string.h>
-#include "interrup.h"
-#include "linklist.h"
-#include "task_man.h"
-
-#ifdef USESTACK
-#include "dpmi.h"
-#endif
-#ifdef LOCKMEMORY
-#include "dpmi.h"
-#endif
-
-#ifdef USE_USRHOOKS
-#include "usrhooks.h"
-#define FreeMem( ptr )   USRHOOKS_FreeMem( ( ptr ) )
-#else
-#define FreeMem( ptr )   free( ( ptr ) )
-#endif
-
-typedef struct
-   {
-   task *start;
-   task *end;
-   } tasklist;
-
-
-/*---------------------------------------------------------------------
-   Global variables
----------------------------------------------------------------------*/
-
-#ifdef USESTACK
-
-// adequate stack size
-#define kStackSize 2048
-
-static unsigned short StackSelector = NULL;
-static unsigned long  StackPointer;
-
-static unsigned short oldStackSelector;
-static unsigned long  oldStackPointer;
-
-#endif
-
-static task HeadTask;
-static task *TaskList = &HeadTask;
-
-static void ( __interrupt __far *OldInt8 )( void );
-
-static volatile long TaskServiceRate  = 0x10000L;
-static volatile long TaskServiceCount = 0;
-
-#ifndef NOINTS
-static volatile int  TS_TimesInInterrupt;
-#endif
-
-static char TS_Installed = FALSE;
-
-volatile int TS_InInterrupt = FALSE;
-
-/*---------------------------------------------------------------------
-   Function prototypes
----------------------------------------------------------------------*/
-
-static void TS_FreeTaskList( void );
-static void TS_SetClockSpeed( long speed );
-static long TS_SetTimer( long TickBase );
-static void TS_SetTimerToMaxTaskRate( void );
-static void __interrupt __far TS_ServiceSchedule( void );
-static void __interrupt __far TS_ServiceScheduleIntEnabled( void );
-static void TS_AddTask( task *ptr );
-static int  TS_Startup( void );
-static void RestoreRealTimeClock( void );
-
-// These declarations are necessary to use the inline assembly pragmas.
-
-extern void GetStack(unsigned short *selptr,unsigned long *stackptr);
-extern void SetStack(unsigned short selector,unsigned long stackptr);
-
-// This function will get the current stack selector and pointer and save
-// them off.
-#pragma aux GetStack =	\
-	"mov  [edi],esp"		\
-	"mov	ax,ss"	 		\
-	"mov  [esi],ax" 		\
-	parm [esi] [edi]		\
-	modify [eax esi edi];
-
-// This function will set the stack selector and pointer to the specified
-// values.
-#pragma aux SetStack =	\
-	"mov  ss,ax"			\
-	"mov  esp,edx"			\
-	parm [ax] [edx]		\
-	modify [eax edx];
-
-
-/**********************************************************************
-
-   Memory locked functions:
-
-**********************************************************************/
-
-
-#define TS_LockStart TS_FreeTaskList
-
-
-/*---------------------------------------------------------------------
-   Function: TS_FreeTaskList
-
-   Terminates all tasks and releases any memory used for control
-   structures.
----------------------------------------------------------------------*/
-
-static void TS_FreeTaskList
-   (
-   void
-   )
-
-   {
-   task *node;
-   task *next;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   node = TaskList->next;
-   while( node != TaskList )
-      {
-      next = node->next;
-      FreeMem( node );
-      node = next;
-      }
-
-   TaskList->next = TaskList;
-   TaskList->prev = TaskList;
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_SetClockSpeed
-
-   Sets the rate of the 8253 timer.
----------------------------------------------------------------------*/
-
-static void TS_SetClockSpeed
-   (
-   long speed
-   )
-
-   {
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   if ( ( speed > 0 ) && ( speed < 0x10000L ) )
-      {
-      TaskServiceRate = speed;
-      }
-   else
-      {
-      TaskServiceRate = 0x10000L;
-      }
-
-   outp( 0x43, 0x36 );
-   outp( 0x40, TaskServiceRate );
-   outp( 0x40, TaskServiceRate >> 8 );
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_SetTimer
-
-   Calculates the rate at which a task will occur and sets the clock
-   speed if necessary.
----------------------------------------------------------------------*/
-
-static long TS_SetTimer
-   (
-   long TickBase
-   )
-
-   {
-   long speed;
-
-   speed = 1192030L / TickBase;
-   if ( speed < TaskServiceRate )
-      {
-      TS_SetClockSpeed( speed );
-      }
-
-   return( speed );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_SetTimerToMaxTaskRate
-
-   Finds the fastest running task and sets the clock to operate at
-   that speed.
----------------------------------------------------------------------*/
-
-static void TS_SetTimerToMaxTaskRate
-   (
-   void
-   )
-
-   {
-   task     *ptr;
-   long      MaxServiceRate;
-   unsigned  flags;
-
-   flags = DisableInterrupts();
-
-   MaxServiceRate = 0x10000L;
-
-   ptr = TaskList->next;
-   while( ptr != TaskList )
-      {
-      if ( ptr->rate < MaxServiceRate )
-         {
-         MaxServiceRate = ptr->rate;
-         }
-
-      ptr = ptr->next;
-      }
-
-   if ( TaskServiceRate != MaxServiceRate )
-      {
-      TS_SetClockSpeed( MaxServiceRate );
-      }
-
-   RestoreInterrupts( flags );
-   }
-
-
-#ifdef NOINTS
-/*---------------------------------------------------------------------
-   Function: TS_ServiceSchedule
-
-   Interrupt service routine
----------------------------------------------------------------------*/
-
-static void __interrupt __far TS_ServiceSchedule
-   (
-   void
-   )
-
-   {
-   task *ptr;
-   task *next;
-
-
-   TS_InInterrupt = TRUE;
-
-   #ifdef USESTACK
-   // save stack
-   GetStack( &oldStackSelector, &oldStackPointer );
-
-   // set our stack
-   SetStack( StackSelector, StackPointer );
-   #endif
-
-   ptr = TaskList->next;
-   while( ptr != TaskList )
-      {
-      next = ptr->next;
-
-      if ( ptr->active )
-         {
-         ptr->count += TaskServiceRate;
-//JIM
-//         if ( ptr->count >= ptr->rate )
-         while( ptr->count >= ptr->rate )
-            {
-            ptr->count -= ptr->rate;
-            ptr->TaskService( ptr );
-            }
-         }
-      ptr = next;
-      }
-
-   #ifdef USESTACK
-   // restore stack
-   SetStack( oldStackSelector, oldStackPointer );
-   #endif
-
-   TaskServiceCount += TaskServiceRate;
-   if ( TaskServiceCount > 0xffffL )
-      {
-      TaskServiceCount &= 0xffff;
-      _chain_intr( OldInt8 );
-      }
-
-   outp( 0x20,0x20 );
-
-   TS_InInterrupt = FALSE;
-   }
-
-#else
-
-/*---------------------------------------------------------------------
-   Function: TS_ServiceScheduleIntEnabled
-
-   Interrupt service routine with interrupts enabled.
----------------------------------------------------------------------*/
-
-static void __interrupt __far TS_ServiceScheduleIntEnabled
-   (
-   void
-   )
-
-   {
-   task *ptr;
-   task *next;
-
-   TS_TimesInInterrupt++;
-   TaskServiceCount += TaskServiceRate;
-   if ( TaskServiceCount > 0xffffL )
-      {
-      TaskServiceCount &= 0xffff;
-      _chain_intr( OldInt8 );
-      }
-
-   outp( 0x20,0x20 );
-
-   if ( TS_InInterrupt )
-      {
-      return;
-      }
-
-   TS_InInterrupt = TRUE;
-   _enable();
-
-   #ifdef USESTACK
-   // save stack
-   GetStack( &oldStackSelector, &oldStackPointer );
-
-   // set our stack
-   SetStack( StackSelector, StackPointer );
-   #endif
-
-   while( TS_TimesInInterrupt )
-      {
-      ptr = TaskList->next ;
-      while( ptr != TaskList )
-         {
-         next = ptr->next;
-
-         if ( ptr->active )
-            {
-            ptr->count += TaskServiceRate;
-            if ( ptr->count >= ptr->rate )
-               {
-               ptr->count -= ptr->rate;
-               ptr->TaskService( ptr );
-               }
-            }
-         ptr = next;
-         }
-      TS_TimesInInterrupt--;
-      }
-
-   _disable();
-
-   #ifdef USESTACK
-   // restore stack
-   SetStack( oldStackSelector, oldStackPointer );
-   #endif
-
-   TS_InInterrupt = FALSE;
-   }
-#endif
-
-
-#ifdef USESTACK
-
-/*---------------------------------------------------------------------
-   Function: allocateTimerStack
-
-   Allocate a block of memory from conventional (low) memory and return
-   the selector (which can go directly into a segment register) of the
-   memory block or 0 if an error occured.
----------------------------------------------------------------------*/
-
-static unsigned short allocateTimerStack
-   (
-   unsigned short size
-   )
-
-   {
-   union REGS regs;
-
-   // clear all registers
-   memset( &regs, 0, sizeof( regs ) );
-
-   // DPMI allocate conventional memory
-   regs.w.ax = 0x100;
-
-   // size in paragraphs
-   regs.w.bx = ( size + 15 ) / 16;
-
-   int386( 0x31, &regs, &regs );
-   if (!regs.w.cflag)
-      {
-      // DPMI call returns selector in dx
-      // (ax contains real mode segment
-      // which is ignored here)
-
-      return( regs.w.dx );
-      }
-
-   // Couldn't allocate memory.
-   return( NULL );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: deallocateTimerStack
-
-   Deallocate a block of conventional (low) memory given a selector to
-   it.  Assumes the block was allocated with DPMI function 0x100.
----------------------------------------------------------------------*/
-
-static void deallocateTimerStack
-   (
-   unsigned short selector
-   )
-
-   {
-	union REGS regs;
-
-	if ( selector != NULL )
-      {
-      // clear all registers
-      memset( &regs, 0, sizeof( regs ) );
-
-      regs.w.ax = 0x101;
-      regs.w.dx = selector;
-      int386( 0x31, &regs, &regs );
-      }
-   }
-
-#endif
-
-/*---------------------------------------------------------------------
-   Function: TS_Startup
-
-   Sets up the task service routine.
----------------------------------------------------------------------*/
-
-static int TS_Startup
-   (
-   void
-   )
-
-   {
-   if ( !TS_Installed )
-      {
-#ifdef LOCKMEMORY
-
-      int status;
-
-      status = TS_LockMemory();
-      if ( status != TASK_Ok )
-         {
-         TS_UnlockMemory();
-         return( status );
-         }
-
-#endif
-
-#ifdef USESTACK
-
-	   StackSelector = allocateTimerStack( kStackSize );
-      if ( StackSelector == NULL )
-         {
-
-#ifdef LOCKMEMORY
-
-         TS_UnlockMemory();
-
-#endif
-         return( TASK_Error );
-         }
-
-      // Leave a little room at top of stack just for the hell of it...
-      StackPointer = kStackSize - sizeof( long );
-
-#endif
-
-//static const task *TaskList = &HeadTask;
-      TaskList->next = TaskList;
-      TaskList->prev = TaskList;
-
-      TaskServiceRate  = 0x10000L;
-      TaskServiceCount = 0;
-
-#ifndef NOINTS
-      TS_TimesInInterrupt = 0;
-#endif
-
-      OldInt8 = _dos_getvect( 0x08 );
-      #ifdef NOINTS
-         _dos_setvect( 0x08, TS_ServiceSchedule );
-      #else
-         _dos_setvect( 0x08, TS_ServiceScheduleIntEnabled );
-      #endif
-
-      TS_Installed = TRUE;
-      }
-
-   return( TASK_Ok );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_Shutdown
-
-   Ends processing of all tasks.
----------------------------------------------------------------------*/
-
-void TS_Shutdown
-   (
-   void
-   )
-
-   {
-   if ( TS_Installed )
-      {
-      TS_FreeTaskList();
-
-      TS_SetClockSpeed( 0 );
-
-      _dos_setvect( 0x08, OldInt8 );
-
-#ifdef USESTACK
-
-      deallocateTimerStack( StackSelector );
-      StackSelector = NULL;
-
-#endif
-
-      // Set Date and Time from CMOS
-//      RestoreRealTimeClock();
-
-#ifdef LOCKMEMORY
-
-      TS_UnlockMemory();
-
-#endif
-      TS_Installed = FALSE;
-      }
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_ScheduleTask
-
-   Schedules a new task for processing.
----------------------------------------------------------------------*/
-
-task *TS_ScheduleTask
-   (
-   void  ( *Function )( task * ),
-   int   rate,
-   int   priority,
-   void *data
-   )
-
-   {
-   task *ptr;
-
-#ifdef USE_USRHOOKS
-   int   status;
-
-   ptr = NULL;
-
-   status = USRHOOKS_GetMem( &ptr, sizeof( task ) );
-   if ( status == USRHOOKS_Ok )
-#else
-   ptr = malloc( sizeof( task ) );
-   if ( ptr != NULL )
-#endif
-      {
-      if ( !TS_Installed )
-         {
-         status = TS_Startup();
-         if ( status != TASK_Ok )
-            {
-            FreeMem( ptr );
-            return( NULL );
-            }
-         }
-
-      ptr->TaskService = Function;
-      ptr->data = data;
-      ptr->rate = TS_SetTimer( rate );
-      ptr->count = 0;
-      ptr->priority = priority;
-      ptr->active = FALSE;
-
-      TS_AddTask( ptr );
-      }
-
-   return( ptr );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_AddTask
-
-   Adds a new task to our list of tasks.
----------------------------------------------------------------------*/
-
-static void TS_AddTask
-   (
-   task *node
-   )
-
-   {
-   LL_SortedInsertion( TaskList, node, next, prev, task, priority );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_Terminate
-
-   Ends processing of a specific task.
----------------------------------------------------------------------*/
-
-int TS_Terminate
-   (
-   task *NodeToRemove
-   )
-
-   {
-   task *ptr;
-   task *next;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   ptr = TaskList->next;
-   while( ptr != TaskList )
-      {
-      next = ptr->next;
-
-      if ( ptr == NodeToRemove )
-         {
-         LL_RemoveNode( NodeToRemove, next, prev );
-         NodeToRemove->next = NULL;
-         NodeToRemove->prev = NULL;
-         FreeMem( NodeToRemove );
-
-         TS_SetTimerToMaxTaskRate();
-
-         RestoreInterrupts( flags );
-
-         return( TASK_Ok );
-         }
-
-      ptr = next;
-      }
-
-   RestoreInterrupts( flags );
-
-   return( TASK_Warning );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_Dispatch
-
-   Begins processing of all inactive tasks.
----------------------------------------------------------------------*/
-
-void TS_Dispatch
-   (
-   void
-   )
-
-   {
-   task *ptr;
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   ptr = TaskList->next;
-   while( ptr != TaskList )
-      {
-      ptr->active = TRUE;
-      ptr = ptr->next;
-      }
-
-   RestoreInterrupts( flags );
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_SetTaskRate
-
-   Sets the rate at which the specified task is serviced.
----------------------------------------------------------------------*/
-
-void TS_SetTaskRate
-   (
-   task *Task,
-   int rate
-   )
-
-   {
-   unsigned flags;
-
-   flags = DisableInterrupts();
-
-   Task->rate = TS_SetTimer( rate );
-   TS_SetTimerToMaxTaskRate();
-
-   RestoreInterrupts( flags );
-   }
-
-
-#ifdef LOCKMEMORY
-
-/*---------------------------------------------------------------------
-   Function: TS_LockEnd
-
-   Used for determining the length of the functions to lock in memory.
----------------------------------------------------------------------*/
-
-static void TS_LockEnd
-   (
-   void
-   )
-
-   {
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_UnlockMemory
-
-   Unlocks all neccessary data.
----------------------------------------------------------------------*/
-
-void TS_UnlockMemory
-   (
-   void
-   )
-
-   {
-   DPMI_UnlockMemoryRegion( TS_LockStart, TS_LockEnd );
-   DPMI_Unlock( TaskList );
-   DPMI_Unlock( OldInt8 );
-   DPMI_Unlock( TaskServiceRate );
-   DPMI_Unlock( TaskServiceCount );
-   DPMI_Unlock( TS_Installed );
-
-#ifndef NOINTS
-   DPMI_Unlock( TS_TimesInInterrupt );
-#endif
-
-#ifdef USESTACK
-   DPMI_Unlock( StackSelector );
-   DPMI_Unlock( StackPointer );
-   DPMI_Unlock( oldStackSelector );
-   DPMI_Unlock( oldStackPointer );
-#endif
-   }
-
-
-/*---------------------------------------------------------------------
-   Function: TS_LockMemory
-
-   Locks all neccessary data.
----------------------------------------------------------------------*/
-
-int TS_LockMemory
-   (
-   void
-   )
-
-   {
-   int status;
-
-   status  = DPMI_LockMemoryRegion( TS_LockStart, TS_LockEnd );
-   status |= DPMI_Lock( TaskList );
-   status |= DPMI_Lock( OldInt8 );
-   status |= DPMI_Lock( TaskServiceRate );
-   status |= DPMI_Lock( TaskServiceCount );
-   status |= DPMI_Lock( TS_Installed );
-
-#ifndef NOINTS
-   status |= DPMI_Lock( TS_TimesInInterrupt );
-#endif
-
-#ifdef USESTACK
-   status |= DPMI_Lock( StackSelector );
-   status |= DPMI_Lock( StackPointer );
-   status |= DPMI_Lock( oldStackSelector );
-   status |= DPMI_Lock( oldStackPointer );
-#endif
-
-   if ( status != DPMI_Ok )
-      {
-      TS_UnlockMemory();
-      return( TASK_Error );
-      }
-
-   return( TASK_Ok );
-   }
-
-#endif
-
-/*
-// Converts a hex byte to an integer
-
-static int btoi
-   (
-   unsigned char bcd
-   )
-
-   {
-   unsigned b;
-   unsigned c;
-   unsigned d;
-
-   b = bcd / 16;
-   c = bcd - b * 16;
-   d = b * 10 + c;
-   return( d );
-   }
-
-
-static void RestoreRealTimeClock
-   (
-   void
-   )
-
-   {
-   int read;
-   int i;
-   int hr;
-   int min;
-   int sec;
-   int cent;
-   int yr;
-   int mo;
-   int day;
-   int year;
-   union REGS inregs;
-
-   // Read Real Time Clock Time.
-   read = FALSE;
-	inregs.h.ah = 0x02;
-   for( i = 1; i <= 3; i++ )
-      {
-      int386( 0x1A, &inregs, &inregs );
-      if ( inregs.x.cflag == 0 )
-         {
-         read = TRUE;
-         }
-      }
-
-   if ( read )
-      {
-      //and convert BCD to integer format
-      hr  = btoi( inregs.h.ch );
-      min = btoi( inregs.h.cl );
-      sec = btoi( inregs.h.dh );
-
-      // Read Real Time Clock Date.
-      inregs.h.ah = 0x04;
-      int386( 0x1A, &inregs, &inregs );
-      if ( inregs.x.cflag == 0 )
-         {
-         //and convert BCD to integer format
-         cent = btoi( inregs.h.ch );
-         yr   = btoi( inregs.h.cl );
-         mo   = btoi( inregs.h.dh );
-         day  = btoi( inregs.h.dl );
-         year = cent * 100 + yr;
-
-         // Set System Time.
-         inregs.h.ch = hr;
-         inregs.h.cl = min;
-         inregs.h.dh = sec;
-         inregs.h.dl = 0;
-         inregs.h.ah = 0x2D;
-         int386( 0x21, &inregs, &inregs );
-
-         // Set System Date.
-         inregs.w.cx = year;
-         inregs.h.dh = mo;
-         inregs.h.dl = day;
-         inregs.h.ah = 0x2B;
-         int386( 0x21, &inregs, &inregs );
-         }
-      }
-   }
-*/
-/*
-   struct dostime_t time;
-   struct dosdate_t date;
-
-   outp(0x70,0);
-   time.second=inp(0x71);
-   outp(0x70,2);
-   time.minute=inp(0x71);
-   outp(0x70,4);
-   time.hour=inp(0x71);
-
-   outp(0x70,7);
-   date.day=inp(0x71);
-   outp(0x70,8);
-   date.month=inp(0x71);
-   outp(0x70,9);
-   date.year=inp(0x71);
-
-   time.second=(time.second&0x0f)+((time.second>>4)*10);
-   time.minute=(time.minute&0x0f)+((time.minute>>4)*10);
-   time.hour=(time.hour&0x0f)+((time.hour>>4)*10);
-
-   date.day=(date.day&0x0f)+((date.day>>4)*10);
-   date.month=(date.month&0x0f)+((date.month>>4)*10);
-   date.year=(date.year&0x0f)+((date.year>>4)*10);
-
-   _dos_settime(&time);
-   _dos_setdate(&date);
-
-*/
--- a/src/audiolib/task_man.h
+++ /dev/null
@@ -1,66 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/**********************************************************************
-   module: TASK_MAN.C
-
-   author: James R. Dose
-   date:   July 25, 1994
-
-   Public header for TASK_MAN.C, a low level timer task scheduler.
-
-   (c) Copyright 1994 James R. Dose.  All Rights Reserved.
-**********************************************************************/
-
-#ifndef __TASK_MAN_H
-#define __TASK_MAN_H
-
-enum TASK_ERRORS
-   {
-   TASK_Warning = -2,
-   TASK_Error = -1,
-   TASK_Ok = 0
-   };
-
-typedef struct task
-{
-    struct   task *next;
-    struct   task *prev;
-    void          ( *TaskService )( struct task * );
-    void          *data;
-    long          rate;
-    volatile long count;
-    int           priority;
-    int           active;
-} task;
-
-// TS_InInterrupt is TRUE during a taskman interrupt.
-// Use this if you have code that may be used both outside
-// and within interrupts.
-
-extern volatile int TS_InInterrupt;
-
-void    TS_Shutdown( void );
-task    *TS_ScheduleTask( void ( *Function )( task * ), int rate,
-                          int priority, void *data );
-int     TS_Terminate( task *ptr );
-void    TS_Dispatch( void );
-void    TS_SetTaskRate( task *Task, int rate );
-void    TS_UnlockMemory( void );
-int     TS_LockMemory( void );
-
-#endif
--- a/src/cin_efct.c
+++ b/src/cin_efct.c
@@ -28,7 +28,6 @@
 #include <string.h>
 
 #include "modexlib.h"
-#include "fli_glob.h"
 
 static int cin_sprtopoffset;
 static int cin_invscale;
--- a/src/fli_def.h
+++ /dev/null
@@ -1,102 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* Flic.h - header file containing structure of a flic file.
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-#ifndef FLIC_H		/* Keep this from being included twice */
-#define FLIC_H
-
-#pragma pack (1)
-/* Flic Header */
-
-#warning fli_def structures need to be packed
-
-typedef struct
-{
-    Long	size;		/* Size of flic including this header. */
-    Ushort 	type;		/* Either FLI_TYPE or FLC_TYPE below. */
-    Ushort	frames;		/* Number of frames in flic. */
-    Ushort	width;		/* Flic width in pixels. */
-    Ushort	height;		/* Flic height in pixels. */
-    Ushort	depth;		/* Bits per pixel.  (Always 8 now.) */
-    Ushort	flags;		/* FLI_FINISHED | FLI_LOOPED ideally. */
-    Long 	speed;		/* Delay between frames. */
-    Short	reserved1;	/* Set to zero. */
-    Ulong	created;	/* Date of flic creation. (FLC only.) */
-    Ulong	creator;	/* Serial # of flic creator. (FLC only.) */
-    Ulong	updated;	/* Date of flic update. (FLC only.) */
-    Ulong	updater;	/* Serial # of flic updater. (FLC only.) */
-    Ushort	aspect_dx;	/* Width of square rectangle. (FLC only.) */
-    Ushort	aspect_dy;	/* Height of square rectangle. (FLC only.) */
-    Char 	reserved2[38];/* Set to zero. */
-    Long 	oframe1;	/* Offset to frame 1. (FLC only.) */
-    Long 	oframe2;	/* Offset to frame 2. (FLC only.) */
-    Char 	reserved3[40];/* Set to zero. */
-} FlicHead;
-/* Values for FlicHead.type */
-#define FLI_TYPE 0xAF11u	/* 320x200 .FLI type ID */
-#define FLC_TYPE 0xAF12u	/* Variable rez .FLC type ID */
-/* Values for FlicHead.flags */
-#define FLI_FINISHED 0x0001
-#define FLI_LOOPED	 0x0002
-
-/* Optional Prefix Header */
-typedef struct
-{
-    Long size;		/* Size of prefix including header. */
-    Ushort type;	/* Always PREFIX_TYPE. */
-    Short chunks;	/* Number of subchunks in prefix. */
-    Char reserved[8];/* Always 0. */
-} PrefixHead;
-/* Value for PrefixHead.type */
-#define PREFIX_TYPE  0xF100u
-
-/* Frame Header */
-typedef struct
-{
-    Long size;		/* Size of frame including header. */
-    Ushort type;	/* Always FRAME_TYPE */
-    Short chunks;	/* Number of chunks in frame. */
-    Char reserved[8];/* Always 0. */
-} FrameHead;
-/* Value for FrameHead.type */
-#define FRAME_TYPE 0xF1FAu
-
-/* Chunk Header */
-typedef struct
-{
-    Long size;		/* Size of chunk including header. */
-    Ushort type;	/* Value from ChunkTypes below. */
-} ChunkHead;
-enum ChunkTypes
-{
-    COLOR_256 = 4,	/* 256 level color pallette info. (FLC only.) */
-    DELTA_FLC = 7,	/* Word-oriented delta compression. (FLC only.) */
-    COLOR_64 = 11,	/* 64 level color pallette info. */
-    DELTA_FLI = 12,	/* Byte-oriented delta compression. */
-    BLACK = 13,		/* whole frame is color 0 */
-    BYTE_RUN = 15,	/* Byte run-length compression. */
-    LITERAL = 16,	/* Uncompressed pixels. */
-    PSTAMP = 18,	/* "Postage stamp" chunk. (FLC only.) */
-};
-
-#endif /* FLIC_H */
--- a/src/fli_glob.h
+++ /dev/null
@@ -1,20 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-void PlayFlic ( char * name, unsigned char * buffer, int usefile, int loop);
-
-
--- a/src/fli_main.c
+++ /dev/null
@@ -1,599 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* readflic.c - This module contains the routines to read and decompress
- * a flic.  They assume Intel byte ordering,  but otherwise should be
- * fairly portable.  They call machine specific stuff in pcclone.c.
- * This file starts with the low level decompression routines - first
- * for colors and then for pixels.  Then it goes to the higher level
- * exported flic_xxxx routines as prototyped in readflic.h.
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-#include "cin_glob.h"
-#include <errno.h>
-#include <string.h>
-#include <io.h>
-#include "fli_type.h"
-#include "fli_util.h"
-#include "fli_def.h"
-#include "fli_main.h"
-
-
-
-typedef void ColorOut(Screen *s, int start, Color  *colors, int count);
-/* This is the type of output parameter to our decode_color below.
- * Not coincedently screen_put_color is of this type. */
-
-static void decode_color(Uchar  *data
-                         , Flic *flic, Screen *s, ColorOut *output)
-/* Decode color map.  Put results into output.  The two color
- * compressions are identical except for whether the RGB values
- * are 0-63 or 0-255.  Passing in an output that does the appropriate
- * shifting on the way to the real pallete lets us use the same
- * code for both COLOR_64 and COLOR_256 compression.
- */
-{
-    int start = 0;
-    Uchar  *cbuf = (Uchar  *)data;
-    Short  *wp = (Short  *)cbuf;
-    Short ops;
-    int count;
-
-    ops = *wp;
-    cbuf += sizeof(*wp);
-    while (--ops >= 0)
-    {
-        start += *cbuf++;
-        if ((count = *cbuf++) == 0)
-            count = 256;
-        (*output)(s, start, (Color  *)cbuf, count);
-        cbuf += 3*count;
-        start += count;
-    }
-}
-
-static void decode_color_256(Uchar  *data, Flic *flic, Screen *s)
-/* Decode COLOR_256 chunk. */
-{
-    decode_color(data, flic, s, screen_put_colors);
-}
-
-static void decode_color_64(Uchar  *data, Flic *flic, Screen *s)
-/* Decode COLOR_64 chunk. */
-{
-    decode_color(data, flic, s, screen_put_colors_64);
-}
-
-
-static void decode_byte_run(Uchar  *data, Flic *flic, Screen *s)
-/* Byte-run-length decompression. */
-{
-    int x,y;
-    int width = flic->head.width;
-    int height = flic->head.height;
-    Char psize;
-    Char  *cpt = data;
-    int end;
-
-    y = flic->yoff;
-    end = flic->xoff + width;
-    while (--height >= 0)
-    {
-        x = flic->xoff;
-        cpt += 1;	/* skip over obsolete opcount byte */
-        psize = 0;
-        while ((x+=psize) < end)
-        {
-            psize = *cpt++;
-            if (psize >= 0)
-            {
-                screen_repeat_one(s, x, y, *cpt++, psize);
-            }
-            else
-            {
-                psize = -psize;
-                screen_copy_seg(s, x, y, (Pixel  *)cpt, psize);
-                cpt += psize;
-            }
-        }
-        y++;
-    }
-}
-
-static void decode_delta_fli(Uchar  *data, Flic *flic, Screen *s)
-/* Fli style delta decompression. */
-{
-    int xorg = flic->xoff;
-    int yorg = flic->yoff;
-    Short  *wpt = (Short  *)data;
-    Uchar  *cpt = (Uchar  *)(wpt + 2);
-    int x,y;
-    Short lines;
-    Uchar opcount;
-    Char psize;
-
-    y = yorg + *wpt++;
-    lines = *wpt;
-    while (--lines >= 0)
-    {
-        x = xorg;
-        opcount = *cpt++;
-        while (opcount > 0)
-        {
-            x += *cpt++;
-            psize = *cpt++;
-            if (psize < 0)
-            {
-                psize = -psize;
-                screen_repeat_one(s, x, y, *cpt++, psize);
-                x += psize;
-                opcount-=1;
-            }
-            else
-            {
-                screen_copy_seg(s, x, y, (Pixel  *)cpt, psize);
-                cpt += psize;
-                x += psize;
-                opcount -= 1;
-            }
-        }
-        y++;
-    }
-}
-
-
-static void decode_delta_flc(Uchar  *data, Flic *flic, Screen *s)
-/* Flc-style delta decompression.  The data is word oriented though
-* a lot of the control info (how  to skip, how many words to
- * copy) are byte oriented still to save space. */
-{
-    int xorg = flic->xoff;
-    int yorg = flic->yoff;
-    int width = flic->head.width;
-    int x,y;
-    Short lp_count;
-    Short opcount;
-    int psize;
-    union {
-        Short  *w;
-        Uchar  *ub;
-        Char  *b;
-        Pixels2  *p2;
-    } wpt;
-    int lastx;
-
-
-    lastx = xorg + width - 1;
-    wpt.ub = data;
-    lp_count = *wpt.w++;
-    y = yorg;
-    goto LPACK;
-
-SKIPLINES:	/* Advance over some lines. */
-    y -= opcount;
-
-LPACK:		/* do next line */
-    if ((opcount = *wpt.w++) >= 0)
-        goto DO_SS2OPS;
-    if( ((Ushort)opcount) & 0x4000) /* skip lines */
-        goto SKIPLINES;
-    screen_put_dot(s,(Uchar)opcount,lastx,y); /* put dot at eol with low byte */
-    if((opcount = *wpt.w++) == 0)
-    {
-        ++y;
-        if (--lp_count > 0)
-            goto LPACK;
-        goto OUT;
-    }
-DO_SS2OPS:
-    x = xorg;
-
-PPACK:				/* do next packet */
-    x += *wpt.ub++;
-    psize = *wpt.b++;
-    if ((psize += psize) >= 0)
-    {
-        screen_copy_seg(s, x, y, (Pixel  *)wpt.ub, psize);
-        x += psize;
-        wpt.ub += psize;
-        if (--opcount != 0)
-            goto PPACK;
-        ++y;
-        if (--lp_count > 0)
-            goto LPACK;
-    }
-    else
-    {
-        psize = -psize;
-        screen_repeat_two(s, x, y, *wpt.p2++, psize>>1);
-        x += psize;
-        if (--opcount != 0)
-            goto PPACK;
-        ++y;
-        if (--lp_count > 0)
-            goto LPACK;
-    }
-OUT:
-    return;
-}
-
-static void decode_black(Uchar  *data, Flic *flic, Screen *s)
-/* Decode a BLACK chunk.  Set frame to solid color 0 one
- * line at a time. */
-{
-    Pixels2 black;
-    int i;
-    int height = flic->head.height;
-    int width = flic->head.width;
-    int x = flic->xoff;
-    int y = flic->yoff;
-
-    black.pixels[0] = black.pixels[1] = 0;
-    for (i=0; i<height; ++i)
-    {
-        screen_repeat_two(s, x, y+i, black, width/2);
-        if (width & 1)	/* if odd set last pixel */
-            screen_put_dot(s, x+width-1, y+i, 0);
-    }
-}
-
-static void decode_literal(Uchar  *data, Flic *flic, Screen *s)
-/* Decode a LITERAL chunk.  Just copy data to screen one line at
- * a time. */
-{
-    int i;
-    int height = flic->head.height;
-    int width = flic->head.width;
-    int x = flic->xoff;
-    int y = flic->yoff;
-
-    for (i=0; i<height; ++i)
-    {
-        screen_copy_seg(s, x, y+i, (Pixel  *)data, width);
-        data += width;
-    }
-}
-
-ErrCode SetupFlicAccess (Flic * flic)
-{
-    if (flic->usefile==TRUE)
-    {
-        return file_open_to_read(&flic->handle, flic->name);
-    }
-    else
-    {
-        flic->flicoffset=0;
-        return Success;
-    }
-}
-
-ErrCode CopyNextFlicBlock (Flic * flic, MemPtr buf, Ulong size)
-{
-    ErrCode err;
-
-    if (flic->usefile==TRUE)
-    {
-        err = file_read_big_block(flic->handle, buf, size);
-        return err;
-    }
-    else
-    {
-        memcpy(buf, flic->flicbuffer+flic->flicoffset, size);
-        flic->flicoffset+=size;
-        return Success;
-    }
-}
-
-void    SetFlicOffset (Flic * flic, Ulong offset )
-{
-    if (flic->usefile==TRUE)
-    {
-        lseek(flic->handle,offset,SEEK_SET);
-    }
-    else
-    {
-        flic->flicoffset = offset;
-    }
-}
-
-
-ErrCode flic_open(Flic *flic, char *name, MemPtr buf, Boolean usefile)
-/* Open flic file.  Read header and verify it's a flic.
- * Seek to first frame. */
-{
-    ErrCode err;
-
-    ClearStruct(flic);		/* Start at a known state. */
-    flic->usefile=usefile;  /* use file or buffer */
-    flic->name = name;      /* Save name for future use. */
-    flic->flicbuffer=buf;   /* save address of flicbuffer */
-
-    if ((err = SetupFlicAccess (flic)) >= Success)
-    {
-        if ((err = CopyNextFlicBlock (flic, (Uchar *)&flic->head, sizeof(flic->head)))
-                >= Success)
-        {
-            if (flic->head.type == FLC_TYPE)
-            {
-                /* Seek frame 1. */
-                SetFlicOffset (flic, flic->head.oframe1 );
-                return Success;
-            }
-            if (flic->head.type == FLI_TYPE)
-            {
-                /* Do some conversion work here. */
-                flic->head.oframe1 = sizeof(flic->head);
-                flic->head.speed = flic->head.speed * 1000L / 70L;
-                return Success;
-            }
-            else
-            {
-                err = ErrBadFlic;
-            }
-        }
-    }
-    flic_close(flic);    /* Close down and scrub partially opened flic. */
-    return err;
-}
-
-
-void flic_close(Flic *flic)
-/* Close flic file and scrub flic. */
-{
-    if (flic->usefile==TRUE)
-    {
-        close(flic->handle);
-    }
-    ClearStruct(flic);		/* Discourage use after close. */
-}
-
-static ErrCode decode_frame(Flic *flic
-                            , FrameHead *frame, Uchar  *data, Screen *s)
-/* Decode a frame that is in memory already into screen.
- * Here we just loop through each chunk calling appropriate
- * chunk decoder.
- */
-{
-    int i;
-    ChunkHead  *chunk;
-
-    for (i=0; i<frame->chunks; ++i)
-    {
-        chunk = (ChunkHead  *)data;
-        data += chunk->size;
-        switch (chunk->type)
-        {
-        case COLOR_256:
-            decode_color_256((Uchar  *)(chunk+1), flic, s);
-            break;
-        case DELTA_FLC:
-            decode_delta_flc((Uchar  *)(chunk+1), flic, s);
-            break;
-        case COLOR_64:
-            decode_color_64((Uchar  *)(chunk+1), flic, s);
-            break;
-        case DELTA_FLI:
-            decode_delta_fli((Uchar  *)(chunk+1), flic, s);
-            break;
-        case BLACK:
-            decode_black((Uchar  *)(chunk+1), flic, s);
-            break;
-        case BYTE_RUN:
-            decode_byte_run((Uchar  *)(chunk+1), flic, s);
-            break;
-        case LITERAL:
-            decode_literal((Uchar  *)(chunk+1), flic, s);
-            break;
-        default:
-            break;
-        }
-    }
-    return Success;
-}
-
-ErrCode flic_next_frame(Flic *flic, Screen *screen)
-/* Advance to next frame of flic. */
-{
-    FrameHead head;
-    ErrCode err;
-    MemPtr bb;
-    long size;
-
-    if ((err = CopyNextFlicBlock (flic, (Uchar *)&head, sizeof(head))) >= Success)
-    {
-        if (head.type == FRAME_TYPE)
-        {
-            size = head.size - sizeof(head);	/* Don't include head. */
-            if (size > 0)
-            {
-                if ((err = big_alloc(&bb, size)) >= Success)
-                {
-                    if ((err = CopyNextFlicBlock (flic, bb, size)) >= Success)
-                    {
-                        err = decode_frame(flic, &head, bb, screen);
-                    }
-                    big_free(&bb);
-                }
-            }
-        }
-        else
-        {
-            err = ErrBadFrame;
-        }
-    }
-    return err;
-}
-
-
-static Ulong calc_end_time(Ulong millis)
-/* Little helper subroutine to find out when to start on next
- * frame. */
-{
-    return (GetCinematicTime() + ( (millis * CLOCKSPEED) / 4000l) );
-}
-
-static ErrCode wait_til(Ulong end_time, Machine *machine)
-/* This waits until key is hit or end_time arrives.
- * Return Success if timed out,  ErrCancel if key hit.
- * Insures keyboard will be polled at least once.
- */
-{
-    do
-    {
-        if (CinematicAbort()!=0)
-            return ErrCancel;
-    }
-    while (GetCinematicTime() < end_time);
-    return Success;
-}
-
-ErrCode flic_play_once(Flic *flic, Machine *machine)
-/* Play a flic through once. */
-{
-    ErrCode err;
-    int i;
-    Ulong end_time;
-
-    for (i=0; i<flic->head.frames; ++i)
-    {
-        end_time = calc_end_time(flic->head.speed);
-        if ((err = flic_next_frame(flic, &machine->screen)) < Success)
-            break;
-        if ((err = wait_til(end_time, machine)) < Success)
-            break;
-    }
-    return err;
-}
-
-static ErrCode fill_in_frame2(Flic *flic)
-/* This figures out where the second frame of the flic is
- * (useful for playing in a loop).  */
-{
-    FrameHead head;
-    ErrCode err;
-
-    SetFlicOffset (flic, flic->head.oframe1 );
-    if ((err = CopyNextFlicBlock (flic, (MemPtr)&head, sizeof(head))) < Success)
-        return err;
-    flic->head.oframe2 = flic->head.oframe1 + head.size;
-    return Success;
-}
-
-ErrCode flic_play_loop(Flic *flic, Machine *machine)
-/* Play a flic until key is pressed. */
-{
-    int i;
-    Ulong end_time;
-    ErrCode err;
-
-    if (flic->head.oframe2 == 0)
-    {
-        fill_in_frame2(flic);
-    }
-    /* Seek to first frame. */
-    SetFlicOffset (flic, flic->head.oframe1 );
-    /* Save time to move on. */
-    end_time = calc_end_time(flic->head.speed);
-    /* Display first frame. */
-    if ((err = flic_next_frame(flic, &machine->screen)) < Success)
-        return err;
-    for (;;)
-    {
-        /* Seek to second frame */
-        SetFlicOffset (flic, flic->head.oframe2 );
-        /* Loop from 2nd frame thru ring frame*/
-        for (i=0; i<flic->head.frames; ++i)
-        {
-            if (wait_til(end_time, machine) < Success)
-                return Success;		/* Time out is a success here. */
-            if ((err = flic_next_frame(flic, &machine->screen)) < Success)
-                return err;
-            end_time = calc_end_time(flic->head.speed);
-        }
-    }
-}
-
-
-static char *err_strings[] =
-{
-    "Unspecified error",
-    "Not enough memory",
-    "Not a flic file",
-    "Bad frame in flic",
-    NULL,
-    NULL,
-    "Couldn't open display",
-    "Couldn't open keyboard",
-    "User canceled action",
-};
-
-char *flic_err_string(ErrCode err)
-/* Return a string that describes an error. */
-{
-    if (err >= Success)
-        return "Success";		/* Shouldn't happen really... */
-    if (err == ErrOpen || err == ErrRead)
-        return strerror(errno);	/* Get Disk IO error from DOS. */
-    err = -err;
-    err -= 1;
-    if (err > ArrayEls(err_strings))
-        return "Unknown error";
-    return err_strings[err];
-}
-
-
-static void center_flic(Flic *flic, Screen *s)
-/* Set flic.xoff and flic.yoff so flic plays centered rather
- * than in upper left corner of display. */
-{
-    flic->xoff = (screen_width(s) - (signed)flic->head.width)/2;
-    flic->yoff = (screen_height(s) - (signed)flic->head.height)/2;
-}
-
-void PlayFlic ( char * name, unsigned char * buffer, int usefile, int loop)
-{
-    ErrCode err;
-    Flic flic;
-    Machine machine;
-
-    if ((err = machine_open(&machine)) >= Success)
-    {
-        if ((err = flic_open(&flic, name, buffer, usefile)) >= Success)
-        {
-            center_flic(&flic, &machine.screen);
-            if (loop==0)
-            {
-                err = flic_play_once(&flic, &machine);
-            }
-            else
-            {
-                err = flic_play_loop(&flic, &machine);
-            }
-            flic_close(&flic);
-        }
-        machine_close(&machine);
-    }
-    if (err < Success && err != ErrCancel)
-    {
-        Error("Play Flic had troubles with %s.\n%s.\n",name, flic_err_string(err));
-    }
-}
-
--- a/src/fli_main.h
+++ /dev/null
@@ -1,90 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* Readflic.h - file containing prototypes and other
- * structural info for readflic program.
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-/* Some handy macros I use in lots of programs: */
-
-#define ArrayEls(a) (sizeof(a)/sizeof((a)[0]))
-/* Count up number of elements in an array */
-
-#define ClearMem(buf,size)	memset(buf, 0, size)
-/* Clear a block of memory. */
-
-#define ClearStruct(pt)	ClearMem(pt, sizeof(*(pt)))
-/* Clear a structure (pass in pointer) */
-
-
-/* Data structures peculiar to readflic program: */
-
-typedef struct
-{
-    FlicHead head;	/* Flic file header. */
-    int handle;		/* File handle. */
-    int frame;		/* Current frame in flic. */
-    char *name;		/* Name from flic_open.  Helps error reporting. */
-    int xoff,yoff;	/* Offset to display flic at. */
-    MemPtr flicbuffer; // address of flicbuffer in memory
-    int flicoffset;
-    Boolean usefile;
-} Flic;
-
-
-/* Prototypes peculiar to readflic program: */
-
-ErrCode flic_open(Flic *flic, char *name, MemPtr buf, Boolean usefile);
-/* Open flic file.  Read header and verify it's a flic. */
-
-void flic_close(Flic *flic);
-/* Close flic file and scrub flic. */
-
-ErrCode flic_play_once(Flic *flic, Machine *machine);
-/* Play a flic through once. */
-
-ErrCode flic_play_loop(Flic *flic, Machine *machine);
-/* Play a flic until key is pressed. */
-
-ErrCode flic_next_frame(Flic *flic, Screen *screen);
-/* Advance to next frame of flic. */
-
-ErrCode SetupFlicAccess (Flic * flic);
-
-ErrCode CopyNextFlicBlock (Flic * flic, MemPtr buf, Ulong size);
-
-void    SetFlicOffset (Flic * flic, Ulong offset );
-
-
-char *flic_err_string(ErrCode err);
-
-/* Various error codes flic reader can get. */
-#define ErrNoMemory	-2		/* Not enough memory. */
-#define ErrBadFlic	-3		/* File isn't a flic. */
-#define ErrBadFrame	-4		/* Bad frame in flic. */
-#define ErrOpen		-5		/* Couldn't open file.  Check errno. */
-#define ErrRead		-6		/* Couldn't read file.  Check errno. */
-#define ErrDisplay	-7		/* Couldn't open display. */
-#define ErrClock	-8		/* Couldn't open clock. */
-#define ErrKey		-9		/* Couldn't open keyboard. */
-#define ErrCancel	-10		/* User cancelled. */
-
-
--- a/src/fli_type.h
+++ /dev/null
@@ -1,51 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* Types.h - integer types defined for portability between compilers and
- * notational convenience.
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-#ifndef TYPES_H		/* Prevent file from being included twice. */
-#define TYPES_H
-
-typedef signed char Char;		/* Signed 8 bits. */
-typedef unsigned char Uchar;	/* Unsigned 8 bits. */
-typedef short Short;			/* Signed 16 bits please. */
-typedef unsigned short Ushort;	/* Unsigned 16 bits please. */
-typedef int Long;				/* Signed 32 bits. */
-typedef unsigned int Ulong;	/* Unsigned 32 bits. */
-
-typedef int Boolean;			/* TRUE or FALSE value. */
-typedef int ErrCode;			/* ErrXXX or Success. */
-typedef int FileHandle;			/* OS file handle. */
-
-/* Values for Boolean types */
-#define FALSE 0
-#define TRUE (!FALSE)
-
-/* Values for ErrCodes */
-#define Success		0		/* Things are fine. */
-#define AError     -1    /* Unclassified error. */
-
-#define int86 int386
-#define inportb inp
-#define outportb outp
-#endif /* TYPES_H */
--- a/src/fli_util.c
+++ /dev/null
@@ -1,313 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* pcclone.c - This file contains all the machine specific bits of the
- * flic reader.  It's job is to set up data structures and routines for
- * the Screen, Clock, and Key structures,  and the Machine structure
- * that contains them all.
- *
- * For optimum performance a flic-reader should be coded in assembler.
- * However you can get significantly greater performance merely by
- * recoding in assembler the three routines: screen_copy_seg(),
- * screen_repeat_one() and screen_repeat_two().
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-#include "cin_glob.h"
-#include <bios.h>
-#include <dos.h>
-#include <time.h>
-#include <stdlib.h>
-#include <mem.h>
-#include <limits.h>
-#include <fcntl.h>
-#include <io.h>
-#include <conio.h>
-#include "fli_type.h"
-#include "fli_util.h"
-#include "fli_def.h"
-#include "fli_main.h"
-
-static Ushort screenlookup[200];
-
-/** Screen oriented stuff. **/
-
-static Boolean set_vmode(Uchar mode)
-/* Ask bios to set video mode. */
-{
-    union REGS regs;
-
-    regs.h.ah = 0;		/* Set Video Mode request. */
-    regs.h.al = mode;	/* For our specific mode. */
-    int86(0x10, &regs, &regs);
-    return TRUE;
-// return (regs.x.cflag == 0);	/* Carry flag clear? */
-}
-
-static Uchar get_vmode()
-/* Ask bios for current video mode. */
-{
-    union REGS regs;
-
-    regs.h.ah = 0xF;			/* Get Video Mode request. */
-    int86(0x10, &regs, &regs);
-    return regs.h.al;
-}
-
-ErrCode screen_open(Screen *s)
-/* Put machine into graphics mode and fill out screen structure. */
-{
-    ClearStruct(s);			/* Start in a known state... */
-    s->old_mode = get_vmode();
-    if (set_vmode(0x13))
-    {
-        if (get_vmode() == 0x13)
-        {
-            int i;
-
-            s->is_open = TRUE;	/* Now it's open. */
-            s->width = 320;
-            s->height = 200;
-            for (i=0; i<200; i++)
-                screenlookup[i]=320*i;
-            s->pixels = (unsigned char *)0xA0000;  /* Base video screen address. */
-            return Success;
-        }
-    }
-    /* If got to here have failed.  Restore old video mode and return
-     * failure code. */
-    set_vmode(s->old_mode);
-    return ErrDisplay;
-}
-
-void screen_close(Screen *s)
-/* Close screen.  Restore original display mode. */
-{
-    if (s->is_open)		/* Don't do this twice... */
-    {
-//   set_vmode(s->old_mode);
-        ClearStruct(s);		/* Discourage use after it's closed... */
-    }
-}
-
-int screen_width(Screen *s)
-/* Return width of screen. */
-{
-    return s->width;
-}
-
-int screen_height(Screen *s)
-/* Return height of screen. */
-{
-    return s->height;
-}
-
-void screen_put_dot(Screen *s, int x, int y, Pixel color)
-/* Set one dot. */
-{
-    /* First clip it. */
-    if (x < 0 || y < 0 || x >= s->width || y >= s->height)
-        return;
-
-    /* Then set it. */
-    s->pixels[screenlookup[y] + x] = color;
-}
-
-static Boolean line_clip(Screen *s, int *px, int *py, int *pwidth)
-/* Clip a horizontal line segment so that it fits on the screen.
- * Return FALSE if clipped out entirely. */
-{
-    int x = *px;
-    int y = *py;
-    int width = *pwidth;
-    int xend = x + width;
-
-    if (y < 0 || y >= s->height || xend < 0 || x >= s->width)
-        return FALSE;	/* Clipped off screen. */
-    if (x < 0)
-    {
-        *pwidth = width = width + x;		/* and shortens width. */
-        *px = 0;
-    }
-    if (xend > s->width)
-    {
-        *pwidth = width = width - (xend - s->width);
-    }
-    if (width < 0)
-        return FALSE;
-    return TRUE;
-}
-
-void screen_copy_seg(Screen *s, int x, int y, Pixel  *pixels, int count)
-/* Copy pixels from memory into screen. */
-{
-    Pixel  *pt;
-    int unclipped_x = x;
-
-    /* First let's do some clipping. */
-    if (!line_clip(s, &x, &y, &count))
-        return;
-
-    pixels += (x - unclipped_x);   /* Clipping change in start position. */
-
-    /* Calculate start screen address. */
-    pt = s->pixels + (unsigned)screenlookup[y] + (unsigned)x;
-
-    /* Copy pixels to display. */
-    memcpy (pt,pixels,count);
-}
-
-void screen_repeat_one(Screen *s, int x, int y, Pixel color, int count)
-/* Draw a horizontal line of a solid color */
-{
-    Pixel  *pt;
-
-    /* First let's do some clipping. */
-    if (!line_clip(s, &x, &y, &count))
-        return;
-
-    /* Calculate start screen address. */
-    pt = s->pixels + (unsigned)screenlookup[y] + (unsigned)x;
-
-    /* Repeat pixel on display. */
-    memset (pt,color,count);
-}
-
-void screen_repeat_two(Screen *s, int x, int y, Pixels2 pixels2, int count)
-/* Repeat 2 pixels count times on screen. */
-{
-    Pixels2  *pt;
-    int is_odd;
-
-    /* First let's do some clipping. */
-    count <<= 1;		/* Convert from word to pixel count. */
-    if (!line_clip(s, &x, &y, &count))
-        return;
-    is_odd = (count&1);		/* Did it turn odd after clipping?  Ack! */
-    count >>= 1;			/* Convert back to word count. */
-
-    /* Calculate start screen address. */
-    pt = (Pixels2  *)(s->pixels + (unsigned)screenlookup[y] + (unsigned)x);
-
-    while (--count >= 0)	/* Go set screen 2 pixels at a time. */
-        *pt++ = pixels2;
-
-    if (is_odd)				/* Deal with pixel at end of screen if needed. */
-    {
-        Pixel  *end = (Pixel  *)pt;
-        *end = pixels2.pixels[0];
-    }
-}
-
-
-void screen_put_colors(Screen *s, int start, Color  *colors, int count)
-/* Set count colors in color map starting at start.  RGB values
- * go from 0 to 255. */
-{
-    int end = start + count;
-    int ix;
-
-    for (ix = start; ix < end; ++ix)
-    {
-        outportb(0x3C8, ix);
-        outportb(0x3C9, colors->r>>2);
-        outportb(0x3C9, colors->g>>2);
-        outportb(0x3C9, colors->b>>2);
-        ++colors;
-    }
-}
-
-void screen_put_colors_64(Screen *s, int start, Color  *colors, int count)
-/* Set count colors in color map starting at start.  RGB values
- * go from 0 to 64. */
-{
-    int end = start + count;
-    int ix;
-
-    for (ix = start; ix < end; ++ix)
-    {
-        outportb(0x3C8, ix);
-        outportb(0x3C9, colors->r);
-        outportb(0x3C9, colors->g);
-        outportb(0x3C9, colors->b);
-        ++colors;
-    }
-}
-
-/** MemPtr stuff - to allocate and free blocks of memory > 64K. */
-
-ErrCode big_alloc(MemPtr *bb, Ulong size)
-/* Allocate a big block. */
-{
-    (*bb) = SafeMalloc (size);
-    return Success;
-}
-
-void big_free(MemPtr *bb)
-/* Free up a big block. */
-{
-    SafeFree(*bb);
-}
-
-/** Stuff for reading files - regular and over 64k blocks at a time. **/
-
-ErrCode file_open_to_read(FileHandle *phandle, char *name)
-/* Open a binary file to read. */
-{
-    *phandle = SafeOpenRead(name);
-    return Success;
-}
-
-ErrCode file_read_big_block(FileHandle handle, MemPtr bb, Ulong size)
-/* Read in a big block.  Could be bigger than 64K. */
-{
-    SafeRead (handle,bb,size);
-    return Success;
-}
-
-
-/** Machine oriented stuff - open and close the whole banana. **/
-
-ErrCode machine_open(Machine *machine)
-/* Open up machine: keyboard, clock, and screen. */
-{
-    ErrCode err;
-
-    ClearStruct(machine);	/* Start it in a known state. */
-//if ((err = key_open(&machine->key)) >= Success)
-    {
-//   if ((err = clock_open(&machine->clock)) >= Success)
-        {
-            if ((err = screen_open(&machine->screen)) >= Success)
-                return Success;
-//      clock_close(&machine->clock);
-        }
-//   key_close(&machine->key);
-    }
-    return err;
-}
-
-void machine_close(Machine *machine)
-/* Close down machine. */
-{
-    screen_close(&machine->screen);
-//clock_close(&machine->clock);
-//key_close(&machine->key);
-}
--- a/src/fli_util.h
+++ /dev/null
@@ -1,162 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* pcclone.h - machine specific parts of readflic.  Structures and
- * prototypes for polling the keyboard,  checking the time,
- * writing to the video screen, allocating large blocks of memory
- * and reading files.
- *
- * Copyright (c) 1992 Jim Kent.  This file may be freely used, modified,
- * copied and distributed.  This file was first published as part of
- * an article for Dr. Dobb's Journal March 1993 issue.
- */
-
-#ifndef PCCLONE_H	/* Prevent file from being included twice. */
-#define PCCLONE_H
-
-typedef Uchar Pixel;			/* Pixel type. */
-
-typedef struct
-{
-    Uchar r,g,b;
-} Color;					/* One color map entry r,g,b 0-255. */
-
-typedef struct
-{
-    Pixel pixels[2];
-} Pixels2;					/* For word-oriented run length encoding */
-
-typedef struct
-{
-    Pixel  *pixels;   /* Set to AOOO:0000 for hardware. */
-    int width, height;	/* Dimensions of screen. (320x200) */
-    int old_mode;		/* Mode screen was in originally. */
-    Boolean is_open;	/* Is screen open? */
-} Screen;					/* Device specific screen type. */
-
-
-/* Prototypes for routines that work on display screen. */
-
-ErrCode screen_open(Screen *s);
-/* Put machine into graphics mode and fill out screen structure. */
-
-void screen_close(Screen *s);
-/* Close screen.  Restore original display mode. */
-
-int screen_width(Screen *s);
-/* Return width of screen. */
-
-int screen_height(Screen *s);
-/* Return height of screen. */
-
-void screen_put_dot(Screen *s, int x, int y, Pixel color);
-/* Set one dot. */
-
-void screen_copy_seg(Screen *s, int x, int y, Pixel  *pixels, int count);
-/* Copy pixels from memory into screen. */
-
-void screen_repeat_one(Screen *s, int x, int y, Pixel color, int count);
-/* Draw a horizontal line of a solid color */
-
-void screen_repeat_two(Screen *s, int x,int y, Pixels2 pixels2, int count);
-/* Repeat 2 pixels count times on screen. */
-
-void screen_put_colors(Screen *s, int start, Color  *colors, int count);
-/* Set count colors in color map starting at start.  RGB values
- * go from 0 to 255. */
-
-void screen_put_colors_64(Screen *s, int start, Color  *colors, int count);
-/* Set count colors in color map starting at start.  RGB values
- * go from 0 to 64. */
-
-
-/* Clock structure and routines. */
-
-typedef struct
-{
-    Ulong speed;	/* Number of clock ticks per second. */
-} Clock;
-
-ErrCode clock_open(Clock *clock);
-/* Set up millisecond clock. */
-
-void clock_close(Clock *clock);
-/* Return clock to normal. */
-
-Ulong clock_ticks(Clock *clock);
-/* Get time in terms of clock->speed. */
-
-/* Keyboard structure and routines. */
-
-typedef struct
-{
-    Uchar ascii;
-    Ushort scancode;
-} Key;
-
-ErrCode key_open(Key *key);
-/* Set up keyboard. */
-
-void key_close(Key *key);
-/* Close keyboard. */
-
-Boolean key_ready(Key *key);
-/* See if a key is ready. */
-
-Uchar key_read(Key *key);
-/* Get next key. */
-
-
-/** MemPtr - handles allocating big blocks of memory (>64K) on the
- ** PC.  On other machines may be much simpler. */
-
-typedef Uchar * MemPtr;
-
-ErrCode big_alloc(MemPtr *bb, Ulong size);
-/* Allocate a big block. */
-
-void big_free(MemPtr *bb);
-/* Free up a big block. */
-
-/** Stuff for reading files - regular and over 64k blocks at a time. **/
-
-ErrCode file_open_to_read(FileHandle *phandle, char *name);
-/* Open a binary file to read. */
-
-ErrCode file_read_block(FileHandle handle, void  *block, unsigned size);
-/* Read in a block.  If read less than size return error code. */
-
-ErrCode file_read_big_block(FileHandle handle, MemPtr bb, Ulong size);
-/* Read in a big block.  Could be bigger than 64K. */
-
-
-
-/** Machine structure - contains all the machine dependent stuff. **/
-
-typedef struct
-{
-    Screen screen;
-    Clock clock;
-    Key key;
-} Machine;
-
-ErrCode machine_open(Machine *machine);
-/* Open up machine: keyboard, clock, screen. */
-
-void machine_close(Machine *machine);
-/* Close down machine. */
-#endif /* PCCLONE_H */
--- a/src/lookups.c
+++ /dev/null
@@ -1,219 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#include "rt_def.h"
-#include "rt_util.h"
-#include "rt_view.h"
-#include <math.h>
-#include <dos.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <conio.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <io.h>
-#include <stdlib.h>
-#include <sys\stat.h>
-
-
-#define PANGLES 512
-#define NUMSINANGLES FINEANGLES+FINEANGLEQUAD+1
-
-fixed  pangle[PANGLES];
-long   sintable[NUMSINANGLES];
-short  tantable[FINEANGLES];
-byte   gammatable[GAMMAENTRIES];
-
-extern  int      _argc;
-extern  char **  _argv;
-
-/*
-=================
-=
-= Error
-=
-= For abnormal program terminations
-=
-=================
-*/
-
-void Error (char *error, ...)
-{
-    va_list	argptr;
-
-    va_start (argptr,error);
-    vprintf (error,argptr);
-    va_end (argptr);
-    printf ("\n");
-    exit (1);
-}
-
-
-int SafeOpenWrite (char *_filename)
-{
-    int	handle;
-    char filename[MAX_PATH];
-    strncpy(filename, _filename, sizeof (filename));
-    filename[sizeof (filename) - 1] = '\0';
-    FixFilePath(filename);
-
-    handle = open(filename,O_RDWR | O_BINARY | O_CREAT | O_TRUNC
-                  , S_IREAD | S_IWRITE);
-
-    if (handle == -1)
-        Error ("Error opening %s: %s",filename,strerror(errno));
-
-    return handle;
-}
-
-
-void SafeWrite (int handle, void *buffer, long count)
-{
-    unsigned	iocount;
-
-    while (count)
-    {
-        iocount = count > 0x8000 ? 0x8000 : count;
-        if (write (handle,buffer,iocount) != iocount)
-            Error ("File write failure");
-        buffer = (void *)( (byte *)buffer + iocount );
-        count -= iocount;
-    }
-}
-
-
-
-
-void CalcPixelAngles ( void )
-{
-    int   i;
-    long  intang;
-    double  angle;
-    double  tang;
-
-    const   double radtoint = (double)FINEANGLES/2/PI;
-
-
-    for (i=0; i<PANGLES; i++)
-    {
-        // start 1/2 pixel over, so viewangle bisects two middle pixels
-        //tang = ((((double)i*160.0)+80.0)/(FPFOCALWIDTH*(double)PANGLES));
-        tang = ((((double)i*160.0)+80.0)/(dGLOBAL_FPFOCALWIDTH*(double)PANGLES));
-        angle = atan(tang);
-        intang = ((long)(angle*radtoint));
-        pangle[i] = intang;
-    }
-}
-
-
-
-void BuildSinTable (void)
-{
-    int   i;
-    double  angle,anglestep;
-    double  sinangle;
-    fixed  value;
-
-    angle = 0;
-    anglestep = (double)(PI/2/FINEANGLEQUAD);
-    for (i=0; i<=FINEANGLEQUAD; i++)
-    {
-        sinangle=sin(angle);
-        value=(fixed)((double)GLOBAL1*sinangle);
-        sintable[i]     =
-            sintable[i+FINEANGLES]  =
-                sintable[FINEANGLES/2-i] = value;
-        sintable[FINEANGLES-i] = -value;
-        sintable[FINEANGLES/2+i] = -value;
-        angle += anglestep;
-    }
-}
-
-void BuildTanTable (void)
-{
-    int   i;
-    double  angle,anglestep;
-    double  tanangle;
-    fixed  value;
-
-    angle = 0;
-    anglestep = (double)(PI*2/FINEANGLES);
-    for (i=0; i<FINEANGLES; i++)
-    {
-        tanangle=tan(angle);
-        value=(fixed)((double)GLOBAL1*tanangle);
-        tantable[i] =(short) (value>>1);
-        angle += anglestep;
-    }
-}
-
-void BuildGammaTable (void)
-{
-    int     l, i, inf;
-    int     j;
-    int     gGamma=0x100;
-    j=0;
-    for (l=0 ; l<NUMGAMMALEVELS ; l++,gGamma+=32)
-    {
-        double nGamma = (double)256 / gGamma;
-        double nScale = (double)63  / pow(63, nGamma);
-
-        for ( i = 0; i < 64; i++ )
-        {
-            inf = pow(i, nGamma) * nScale;
-            if (inf < 0)
-                inf = 0;
-            if (inf > 63)
-                inf = 63;
-            gammatable[j++]=inf;
-        }
-    }
-}
-
-void main ()
-{
-    int handle;
-    int size;
-
-    if (_argc!=2)
-    {
-        printf("LOOKUPS -- Apogee Software (c) 1994\n");
-        printf("\n USAGE:    lookups <name.dat>\n");
-        exit(0);
-    }
-    handle=SafeOpenWrite (_argv[1]);
-    CalcPixelAngles();
-    BuildSinTable();
-    BuildTanTable();
-    BuildGammaTable();
-    size=PANGLES;
-    SafeWrite(handle,&size,sizeof(int));
-    SafeWrite(handle,&pangle[0],sizeof(fixed)*size);
-    size=NUMSINANGLES;
-    SafeWrite(handle,&size,sizeof(int));
-    SafeWrite(handle,&sintable[0],sizeof(fixed)*size);
-    size=FINEANGLES;
-    SafeWrite(handle,&size,sizeof(int));
-    SafeWrite(handle,&tantable[0],sizeof(short)*size);
-    size=GAMMAENTRIES;
-    SafeWrite(handle,&size,sizeof(int));
-    SafeWrite(handle,&gammatable[0],sizeof(byte)*size);
-    close (handle);
-}
--- a/src/rt_error.c
+++ /dev/null
@@ -1,408 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#include <dos.h>
-#include <errno.h>
-#include <io.h>
-#include <stdio.h>
-#include <conio.h>
-#include <stdarg.h>
-#include <mem.h>
-#include <ctype.h>
-#include "rt_def.h"
-#include "rt_str.h"
-#include "rt_error.h"
-#include "rt_menu.h"
-#include "isr.h"
-#include "w_wad.h"
-#include "z_zone.h"
-#include "rt_vid.h"
-#include "rt_util.h"
-#include "modexlib.h"
-
-
-//*****************************************************************************
-//
-//                          HARD ERROR ROUTINES
-//
-//****************************************************************************
-
-#define WINDOWUX           7
-#define WINDOWUY           76
-#define WINDOWLX           138
-#define WINDOWLY           158
-
-#define MESSAGEBOXCOLOR    166
-
-
-#define DISKERROR          0x4000         // bit 15 (of deverr)
-#define IGNOREAVAILABLE    0x1000         // bit 13   (bit 14 isn't used)
-#define RETRYAVAILABLE     0x800          // bit 12
-#define FAILAVAILABLE      0x400          // bit 11
-#define LOCATION           0x300          // bit 10 and 9
-#define READWRITEERROR     0x80           // bit 8
-#define DRIVEOFERROR       0x0F           // low-order byte
-
-#define DIVISIONINT                0x00
-
-// Globals
-
-boolean DivisionError = false;
-
-// Statics
-
-
-static char ErrorCodes[13][25] =
-{
-    "Write-protected disk\0",
-    "Unknown unit\0",
-    "Drive not ready\0",
-    "Unknown command\0",
-    "CRC error in data\0",
-    "Bad drive struct length\0",
-    "Seek error\0",
-    "Unknown media type\0",
-    "Sector not found\0",
-    "Printer out of paper\0",
-    "Write fault\0",
-    "Read fault\0",
-    "General failure\0"
-};
-
-static char Drives[7][3] =
-{
-    "A\0",
-    "B\0",
-    "C\0",
-    "D\0",
-    "E\0",
-    "F\0",
-    "G\0"
-};
-
-static char Locations[4][11] =
-{
-    "MS-DOS\0",
-    "FAT\0",
-    "Directory\0",
-    "Data area\0"
-};
-
-static char ReadWrite[2][6] =
-{
-    "Read\0",
-    "Write\0"
-};
-
-static boolean ErrorHandlerStarted=false;
-void (__interrupt __far *olddivisr) () = NULL;
-
-//******************************************************************************
-//
-// UL_UserMessage ()
-//
-//******************************************************************************
-
-void UL_UserMessage (int x, int y, char *str, ...) __attribute__((format(printf,3,4)))
-{
-    va_list strptr;
-    char buf[128];
-    int width, height;
-
-    memset (&buf[0], 0, sizeof (buf));
-    va_start (strptr, str);
-    vsprintf (&buf[0], str, strptr);
-    va_end (strptr);
-
-    if ( *(byte *)0x449 == 0x13)
-    {
-        CurrentFont = tinyfont;
-
-        WindowW=160;
-        WindowH=100;
-        WindowX=80;
-        WindowY=50;
-
-        US_MeasureStr (&width, &height, &buf[0]);
-
-        width  += (CurrentFont->width[1] << 1);
-        height += (CurrentFont->height << 1);
-
-        VL_Bar (x, y, WindowW-2, WindowH, MESSAGEBOXCOLOR);
-
-        PrintX = x+CurrentFont->width[1];
-        PrintY = y+CurrentFont->height;
-
-        US_CPrint (&buf[0]);
-
-        displayofs=bufferofs;
-
-        OUTP(CRTC_INDEX, CRTC_STARTHIGH);
-        OUTP(CRTC_DATA,((displayofs&0x0000ffff)>>8));
-
-
-        bufferofs += screensize;
-        if (bufferofs > page3start)
-            bufferofs = page1start;
-    }
-    else
-        printf("%s\n",&buf[0]);
-}
-
-//****************************************************************************
-//
-// UL_GeneralError ()
-//
-//****************************************************************************
-
-int UL_GeneralError (int code)
-{
-    boolean done = false;
-    int retval = 0;
-
-    UL_UserMessage (80, 50, "Device Error!\n%s.\n \n(A)bort  (R)etry\n",
-                    ErrorCodes[code]);
-
-    if (KeyboardStarted==true)
-    {
-        while (!done)
-        {
-            if (Keyboard[sc_A])
-            {
-                retval = 1;
-                done = true;
-
-                while (Keyboard[sc_A])
-                    ;
-            }
-            else if (Keyboard[sc_R])
-            {
-                retval = 0;
-                done = true;
-
-                while (Keyboard[sc_R])
-                    ;
-            }
-        }
-    }
-    else
-    {
-        while (!done)
-        {
-            if (kbhit())
-            {
-                char ch;
-
-                ch=toupper(getch());
-                if (ch=='A')
-                {
-                    retval = 1;
-                    done = true;
-                }
-                else if (ch=='R')
-                {
-                    retval = 0;
-                    done = true;
-                }
-            }
-        }
-    }
-
-
-    return (retval);
-}
-
-
-//****************************************************************************
-//
-// UL_DriveError ()
-//
-//****************************************************************************
-
-int UL_DriveError (int code, int location, int rwerror, int whichdrive)
-{
-    boolean done = false;
-    int retval   = 0;
-
-    UL_UserMessage (80, 50,
-                    "Drive Error!\n%s.\nOn drive %s.\nLocation: %s.\n%s error.\n(A)bort  (R)etry\n",
-                    ErrorCodes[code], Drives[whichdrive],
-                    Locations[location], ReadWrite[rwerror]);
-
-    if (KeyboardStarted==true)
-    {
-        while (!done)
-        {
-            if (Keyboard[sc_A])
-            {
-                retval = 1;
-                done = true;
-
-                while (Keyboard[sc_A])
-                    ;
-            }
-            else if (Keyboard[sc_R])
-            {
-                retval = 0;
-                done = true;
-
-                while (Keyboard[sc_R])
-                    ;
-            }
-        }
-    }
-    else
-    {
-        while (!done)
-        {
-            if (kbhit())
-            {
-                char ch;
-
-                ch=toupper(getch());
-                if (ch=='A')
-                {
-                    retval = 1;
-                    done = true;
-                }
-                else if (ch=='R')
-                {
-                    retval = 0;
-                    done = true;
-                }
-            }
-        }
-    }
-
-    return (retval);
-}
-
-
-//****************************************************************************
-//
-//	UL_harderr ()
-//
-//****************************************************************************
-
-int __far UL_harderr (unsigned deverr, unsigned errcode, unsigned far *devhdr)
-{
-    int DiskError      = 0;    // Indicates if it was a disk error
-    int IgnoreAvail    = 0;    // if "ignore" response is available
-    int RetryAvail     = 0;    // if "retry" response is available
-    int FailAvail      = 0;    // if "fail" response is available
-    byte ErrorLocation = 0;    // Location of error
-    byte RWerror       = 0;    // Read/Write error (0 == read, 1 == write)
-    byte whichDrive    = 0;    // Drive the error is on (0 == A, 1 == B, ...)
-    int action;
-
-    unsigned temp;
-    temp = *devhdr;
-
-    // Check errors
-    DiskError     = (deverr & DISKERROR);
-    IgnoreAvail   = (deverr & IGNOREAVAILABLE);
-    RetryAvail    = (deverr & RETRYAVAILABLE);
-    FailAvail     = (deverr & FAILAVAILABLE);
-    ErrorLocation = ((deverr & LOCATION) >> 8);
-    RWerror       = (deverr & READWRITEERROR);
-
-    if (DiskError == 0)
-        action = UL_GeneralError (errcode);
-    else
-        action = UL_DriveError (errcode, ErrorLocation, RWerror, whichDrive);
-
-    if (action)
-        Error ("USER BREAK : ROTT aborted.\n");
-    return (_HARDERR_RETRY);
-}
-
-
-//****************************************************************************
-//
-//	UL_DivisionISR ()
-//
-//****************************************************************************
-
-extern byte * colormap;
-
-void __interrupt __far UL_DivisionISR ( void )
-{
-// acknowledge the interrupt
-
-    SetBorderColor (*(colormap+(((100-10)>>2)<<8)+160));
-    DivisionError = true;
-    OUTP (0x20, 0x20);
-}
-
-
-//****************************************************************************
-//
-//	UL_ErrorStartup ()
-//
-//****************************************************************************
-
-void UL_ErrorStartup ( void )
-{
-    if (ErrorHandlerStarted==true)
-        return;
-    ErrorHandlerStarted=true;
-    _harderr (UL_harderr);     // Install hard error handler
-    UL_StartupDivisionByZero();
-}
-
-//****************************************************************************
-//
-//	UL_ErrorShutdown ()
-//
-//****************************************************************************
-
-void UL_ErrorShutdown ( void )
-{
-    if (ErrorHandlerStarted==false)
-        return;
-    ErrorHandlerStarted=false;
-    UL_ShutdownDivisionByZero();
-}
-
-
-/*
-===============
-=
-= UL_StartupDivisionByZero
-=
-===============
-*/
-
-void UL_StartupDivisionByZero ( void )
-{
-    olddivisr = _dos_getvect(DIVISIONINT);
-    _dos_setvect (DIVISIONINT, UL_DivisionISR);
-}
-
-/*
-===============
-=
-= UL_ShutdownDivisionByZero
-=
-===============
-*/
-
-void UL_ShutdownDivisionByZero ( void )
-{
-    _dos_setvect (DIVISIONINT, olddivisr);
-}
-
--- a/src/sbconfig.c
+++ /dev/null
@@ -1,467 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-/* Copyright 1995 Spacetec IMC Corporation */
-
-#if defined(__BORLANDC__)
-#  pragma inline
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <dos.h>
-
-typedef long fixed;
-
-#include "rt_def.h"
-
-#include "develop.h"
-#include "sbconfig.h"
-
-/* ----------------------------------------------------------------------- */
-
-#define DEFAULT_CONFIG_FILENAME  "sbconfig.dat"
-
-#define NUM_ELEMENTS(x) (sizeof(x)/sizeof(x[0]))
-#define SIGN(x) ((x<0)?-1:1)
-
-/* ----------------------------------------------------------------------- */
-
-#if defined(__BORLANDC__)
-
-fixed FIXED_MUL(fixed a, fixed b)
-{
-
-    fixed ret_code;
-
-    asm {
-
-        mov  eax,a
-        mov  edx,b
-        imul edx
-        shrd eax,edx,16
-        mov  ret_code,eax
-    }
-
-    return ret_code;
-}
-
-#elif defined(_MSC_VER)
-
-/* Microsoft C7.0 can not be done with inline assembler because it
-   can not handle 32-bit instructions
-*/
-fixed FIXED_MUL(fixed a,fixed b)
-{
-    fixed sgn,ah,al,bh,bl;
-
-    sgn = (SIGN(a) ^ SIGN(b)) ? -1 : 1 ;
-    ah = (a >> 16) & 0xffff ;
-    al = (a        & 0xffff);
-    bh = (b >> 16) & 0xffff ;
-    bl = (b        & 0xffff);
-
-    return sgn * ( ((al*bl)>>16) + (ah*bl) + (al*bh) + ((ah*bh)<<16) );
-}
-
-#endif /* definition of inline FIXED_MUL */
-
-
-static
-fixed StrToFx1616(char *string, char **ret_string)
-{
-    long  whole;
-    long  fract;
-    fixed result;
-    int   sign;
-
-    /* Skip whitespace */
-    while((*string==' ')||(*string=='\t')||(*string=='\n')) string++;
-
-    /* Accept numbers in the form: [+-]?[0-9]+(.[0-9]*)
-    */
-
-    sign=1;
-    if(*string=='-')
-    {
-        string++;
-        sign=-1;
-    }
-    else if(*string=='+')
-    {
-        string++;
-        sign=1;
-    }
-
-    /* Read in the whole part */
-    whole=0;
-    while((*string>='0')&&(*string<='9'))
-        whole=whole*10+(*string++)-'0';
-
-    /* Read the optional fraction part */
-    fract=0;
-    if(*string=='.')
-    {
-        long place=1;
-        string++;
-        while((*string>='0')&&(*string<='9'))
-        {
-            fract=fract*10+(*string++)-'0';
-            place*=10;
-        }
-        /* Convert to fixed point */
-        fract=(fract<<16)/place;
-    }
-
-    if(ret_string) *ret_string=string;
-
-    if(sign==1)
-        result= (whole<<16) + fract;
-    else
-        result=-(whole<<16) + fract;
-
-    return result;
-}
-
-/* ----------------------------------------------------------------------- */
-
-static char *SbButtonNames[]= {
-    "BUTTON_A",
-    "BUTTON_B",
-    "BUTTON_C",
-    "BUTTON_D",
-    "BUTTON_E",
-    "BUTTON_F"
-};
-
-static int         cfgFileVersion=0;
-static char        cfgButtons[NUM_ELEMENTS(SbButtonNames)][MAX_STRING_LENGTH];
-static WarpRecord *pCfgWarps;
-static int         nCfgWarps=0;
-
-/*-------------------------------------------------------------------------*/
-
-/* Read a string in the form: "{#, #, #}"
- * and return a pointer to the character AFTER the '}'
- * or NULL if error
- */
-static char *GetWarpLevels(char *string, WarpRange *pw)
-{
-    short value;
-    fixed fxvalue;
-
-    if((*string++)!='{')
-        return NULL;
-
-    if(!*string)
-        return NULL;
-
-    /* Expecting the first number - low */
-    value=(short)strtol(string, &string, 0);
-    if(pw) pw->low=value;
-
-    /* Skip any whitespace */
-    while(isspace(*string)) string++;
-
-    if(*string++!=',')
-        return NULL;
-
-    /* Expecting the second number - high */
-    value=(short)strtol(string, &string, 0);
-    if(pw) pw->high=value;
-
-    /* Skip any whitespace */
-    while(isspace(*string)) string++;
-
-    if(*string++!=',')
-        return NULL;
-
-    /* Expecting the third number - multiplier */
-    fxvalue=StrToFx1616(string, &string);
-    if(pw) pw->mult=fxvalue;
-
-    /* Skip any whitespace */
-    while(isspace(*string)) string++;
-
-    if(*string!='}')
-        return NULL;
-
-    return string+1;
-}
-
-
-
-static int GetWarp(char *string, WarpRecord *pRecord)
-{
-    int        nWarp;
-    WarpRange *pWarp;
-
-    /* Only update the field if we successfully read the entire line */
-    nWarp=0;
-    pWarp=NULL;
-
-    /* Skip whitespace */
-    while(isspace(*string)) string++;
-
-    if(*string++!='{') return 0;
-
-    while(string && *string)
-    {
-        switch(*string)
-        {
-        case ' ':
-        case '\t':
-        case '\n':
-            string++;
-            break;
-
-        case ',':
-            string++;
-            break;
-
-        case '{':
-            if(nWarp++==0)
-                pWarp=malloc(sizeof(WarpRange));
-            else
-                pWarp=realloc(pWarp, nWarp*sizeof(WarpRange));
-
-            string=GetWarpLevels(string, pWarp+nWarp-1);
-            break;
-
-        case '}':
-            pRecord->nWarp=nWarp;
-            pRecord->pWarp=pWarp;
-            return 1;
-        }
-    }
-
-    /* Early EOL (didn't get closing '}') */
-    if(nWarp) free(pWarp);
-    return 0;
-}
-
-
-/*-------------------------------------------------------------------------*/
-
-int SbConfigParse(char *_filename)
-{
-    int             i;
-    FILE           *file;
-    char           *pc;
-    char            buffer[128];
-    char filename[MAX_PATH];
-
-    if(!_filename) _filename=DEFAULT_CONFIG_FILENAME;
-
-    strncpy(filename, _filename, sizeof (filename));
-    filename[sizeof (filename) - 1] = '\0';
-    FixFilePath(filename);
-
-    if(!(file=fopen(filename, "r")))
-    {
-        printf("Config file: %s, not found\n", filename);
-        return 0;
-    }
-
-    while(fgets(buffer, sizeof(buffer), file))
-    {
-        int lineParsed=0;
-
-        /* each line in config file starts with either a ;, VERSION or an
-        ** element of GameButtonNames or WarpNames
-        */
-        pc=strtok(buffer, " \t\n,");
-
-        if(*pc==';')									/* commented out line? */
-            continue;
-
-        /* VERSION?  The version will be used in the future to allow fx1616
-        **           values in the config file
-        */
-        if(!stricmp(pc,"VERSION"))
-        {
-            pc=strtok(NULL, " \t\n,");
-            cfgFileVersion=atoi(pc);
-        }
-
-        /* Check if first token is an element of SbButtonNames */
-        for(i=0; i<NUM_ELEMENTS(SbButtonNames); i++)
-            if(!stricmp(pc, SbButtonNames[i]))
-            {
-                lineParsed=1;
-
-                /* Save the next token in the appropriate slot */
-                pc=strtok(NULL," \t\n,");
-
-                strncpy(cfgButtons[i], pc, MAX_STRING_LENGTH-1);
-                cfgButtons[i][MAX_STRING_LENGTH-1]=0;
-            }
-
-        /* If the first token is not from GameButtonNames,
-        ** it must be a WarpName
-        */
-        if(!lineParsed)
-        {
-            char *name;
-
-            name=pc;
-            pc=pc+strlen(pc)+1;			/* Skip this token */
-            while(isspace(*pc)) pc++;	/* Skip any whitespace */
-
-            if(*pc=='{')
-            {
-                WarpRecord warpRec;
-
-                strcpy(warpRec.name, name);
-                warpRec.pWarp=NULL;
-                warpRec.nWarp=0;
-
-                if(GetWarp(pc, &warpRec))
-                {
-                    if(nCfgWarps++==0)
-                        pCfgWarps=(WarpRecord *)malloc(sizeof(WarpRecord));
-                    else
-                        pCfgWarps=(WarpRecord *)realloc(pCfgWarps, nCfgWarps*sizeof(WarpRecord));
-                    pCfgWarps[nCfgWarps-1]=warpRec;
-                }
-            }
-        }
-    } /* end of while getting lines from config file */
-
-    fclose(file);
-    return 1;
-}
-
-/*-------------------------------------------------------------------------*/
-
-char *SbConfigGetButton(char *btnName)
-{
-    int i;
-    for(i=0; i<NUM_ELEMENTS(SbButtonNames); i++)
-    {
-        if(!stricmp(btnName, SbButtonNames[i]))
-            if(cfgButtons[i][0])
-                return cfgButtons[i];
-            else
-                return NULL;	/* Empty slot */
-
-        if(!stricmp(btnName, cfgButtons[i]))
-            return SbButtonNames[i];
-    }
-
-    /* Unknown button name */
-    return NULL;
-}
-
-
-
-int SbConfigGetButtonNumber(char *btnName)
-{
-    int i;
-    for(i=0; i<NUM_ELEMENTS(SbButtonNames); i++)
-    {
-        if(!stricmp(btnName, cfgButtons[i]))
-            return i;
-    }
-
-    /* Unknown button name */
-    return -1;
-}
-
-/*-------------------------------------------------------------------------*/
-
-WarpRecord *SbConfigGetWarpRange(char *rngName)
-{
-    int i;
-    for(i=0; i<nCfgWarps; i++)
-        if(!stricmp(rngName, pCfgWarps[i].name))
-            return &pCfgWarps[i];
-
-    return NULL;
-}
-
-/*-------------------------------------------------------------------------*/
-
-fixed SbFxConfigWarp(WarpRecord *warp, short value)
-{
-    int  i;
-    short absValue;
-    fixed accum;
-    int   sign;
-
-    if(!warp) return INT_TO_FIXED(value);
-
-    absValue=value;
-    sign=1;
-    if(absValue<0)
-    {
-        absValue= (short)-absValue;
-        sign=-1;
-    }
-
-    accum=INT_TO_FIXED(0);
-
-    for(i=0; i<warp->nWarp; i++)
-    {
-        if(absValue<=warp->pWarp[i].low)
-            ;	/* Ignore it if below this range (if required, will have
-					**	been caught by the previous warp)
-					*/
-        else if((absValue>warp->pWarp[i].low) && (absValue<=warp->pWarp[i].high))
-        {
-            fixed diff;
-            fixed partial;
-            diff=INT_TO_FIXED((long)absValue-(long)warp->pWarp[i].low);
-            partial=FIXED_MUL(diff, warp->pWarp[i].mult);
-            accum=FIXED_ADD(accum, partial);
-            break;	/* Exit the for loop */
-        }
-        else	/* Accumulate if greater than this range */
-        {
-            fixed partial;
-            partial=FIXED_MUL(INT_TO_FIXED((long)warp->pWarp[i].high-(long)warp->pWarp[i].low),
-                              warp->pWarp[i].mult);
-            accum=FIXED_ADD(accum, partial);
-        }
-    }
-
-    if(sign==1)
-        return  accum;
-    else
-        return -accum;
-}
-
-
-/*-------------------------------------------------------------------------*/
-
-long SbConfigWarp(WarpRecord *warp, short value)
-{
-    /* An apparent bug in the msc70 compiler, trashes r
-       if it is on the stack.  Leave in unitialized global segment.
-    */
-    static fixed r;
-
-    r = SbFxConfigWarp(warp,value);
-
-    return r >> 16 ;
-}
-
-
-/*-------------------------------------------------------------------------*/
-
--- a/src/sbconfig.h
+++ /dev/null
@@ -1,130 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef SBCONFIG_H
-#define SBCONFIG_H
-/* ----------------------------------------------------------------------- */
-/* See the bottom of this file for a syntax diagram for the config file */
-
-#define MAX_STRING_LENGTH 40
-
-/* ----------------------------------------------------------------------- */
-
-//typedef long fixed;	/* 16.16 fixed pt number */
-
-#define INT_TO_FIXED(n)   ((fixed)((long)(n)<<16))
-#define FIXED_TO_INT(n)   ((long)((n)>>16))
-#define FLOAT_TO_FIXED(n) ((fixed)((n)*65536.0))
-
-#define FIXED_ADD(a, b)		((a)+(b))
-#define FIXED_SUB(a, b)		((a)-(b))
-
-/* ----------------------------------------------------------------------- */
-
-typedef struct {
-    short low; 			/* range of input values this warp covers */
-    short high;
-    fixed mult;		/* multiplier to be applied to this range */
-} WarpRange;
-
-
-
-typedef struct {
-    char       name[MAX_STRING_LENGTH];
-    WarpRange *pWarp;
-    int        nWarp;
-} WarpRecord;
-
-/* ----------------------------------------------------------------------- */
-
-/* Parse the config file */
-int   SbConfigParse(char *filename);
-
-/* Get the button config name for the button named <btnName> or return NULL
- * if none exists.  <btnName> can be either the left or the right side name.
- * So, for the config line:
- *
- * BUTTON_A MY_BUTTON
- *
- * ConfigGetButton("BUTTON_A") will return "MY_BUTTON"
- * ConfigGetButton("MY_BUTTON") will return "BUTTON_A"
- *
- * Note that this makes it illegal to have game button names have the names
- * "BUTTON_A", "BUTTON_B", "BUTTON_C", etc...
- *
- * Also, the comparison is CASE INSENSITIVE.
- */
-char *SbConfigGetButton(char *btnName);
-int   SbConfigGetButtonNumber(char *btnName);
-
-/*
- * Get the warp ranges for the config range named <rngName> or return NULL
- * if none exists.
- */
-WarpRecord *SbConfigGetWarpRange(char *rngName);
-
-/*
- * Warp a value based on the given warp range
- */
-fixed SbFxConfigWarp(WarpRecord *warp, short value);  /* returns fixed pt */
-long    SbConfigWarp(WarpRecord *warp, short value);  /* returns integer */
-
-/* ----------------------------------------------------------------------- */
-/* Lexical Definitions:
-**
-** comment:	;[^\n]*\n
-** integer: [0-9]+
-** identifier: [A-Za-z_][A-Za-z_0-9]*
-**
-*/
-/* Syntax Diagram:	(Line by Line parsing)
-**
-**
-** ConfigFile:
-**           |	ConfigLine ConfigFile
-**	          ;
-**
-** ConfigLine:
-**           | comment
-**           | VersionLine comment
-**           | ButtonLine comment
-**           | RangeLine comment
-**           ;
-**
-** VersionLine:	'VERSION' integer
-**            ;
-**
-** ButtonLine:	'BUTTON_A' identifier
-**           |	'BUTTON_B' identifier
-**           |	'BUTTON_C' identifier
-**           |	'BUTTON_D' identifier
-**           |	'BUTTON_E' identifier
-**           |	'BUTTON_F' identifier
-**           ;
-**
-** RangeLine: identifier '{' RangeList '}'
-**          ;
-**
-** RangeList:
-**          | '{' integer ',' integer ',' integer '}'
-**          | '{' integer ',' integer ',' integer '}' ',' RangeList
-**          ;
-**
-*/
-/* ----------------------------------------------------------------------- */
-#endif
-
--- a/src/splib.h
+++ /dev/null
@@ -1,205 +1,0 @@
-/*
-Copyright (C) 1994-1995  Apogee Software, Ltd.
-Copyright (C) 2002-2015  icculus.org, GNU/Linux port
-Copyright (C) 2017-2018  Steven LeVesque
-
-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.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-#ifndef SPLIB_H
-#define SPLIB_H
-
-/* ======================================================================= *
- * Please Read "SpReadme.doc" for usage                                    *
- * ======================================================================= */
-
-/* ======================================================================= *
- * Compiler & Memory Mode Wrappers.                                        *
- * ----------------------------------------------------------------------- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(REALMODE)
-#define FAR __far
-#else
-#define FAR
-#endif
-
-//---------------------------------------------------------------------------
-// Constants
-
-#define TSR_SERIAL_LENGTH		14
-#define TSR_MAX_LENGTH			80
-
-//---------------------------------------------------------------------------
-
-typedef struct {
-    char           copyright[TSR_MAX_LENGTH];	// driver copyright
-    short          major;							// driver version number
-    short				minor;
-    short				count;							// # of available devices
-} SpwDrvOpenPacket;
-
-
-
-typedef struct {
-    char           copyright[TSR_MAX_LENGTH];	// device copyright
-    char           serial[TSR_SERIAL_LENGTH];	// device serial number
-} SpwDevOpenPacket;
-
-
-
-typedef struct {
-    long				timestamp;						// time of event
-    unsigned short	period;							// period since last MOVEMENT
-    unsigned short button;							// button pressed mask
-    short          tx;								// Translation X
-    short          ty;								//					Y
-    short          tz;								//					Z
-    short          rx;								// Rotation X
-    short          ry;								//				Y
-    short          rz;								//				Z
-} SpwForcePacket;
-
-
-
-typedef struct {
-    long           timestamp;						// time of event
-    unsigned short period;							// period since last BUTTON
-    unsigned short button;							// button pressed mask
-} SpwButtonPacket;
-
-
-
-typedef struct {
-    unsigned long data;								// MUST be TSRCMD_DATA
-} SpwCommandPacket;
-
-#define TSRCMD_DATA	0xFF0000FF
-
-//---------------------------------------------------------------------------
-
-typedef union {
-    char              padding[128];		/* Extra room for future expansion */
-
-    SpwCommandPacket	command;
-
-    SpwDrvOpenPacket	drvOpen;
-    SpwDevOpenPacket	devOpen;
-
-    SpwForcePacket		force;
-    SpwButtonPacket	button;
-} SpwPacket;
-
-
-
-// TSR Interrupt Functions
-#define TSR_DRIVER_CLOSE		 		0x0000
-#define TSR_DRIVER_OPEN					0x8001
-#define TSR_DEVICE_CLOSE				0x0002
-#define TSR_DEVICE_OPEN					0x8003
-
-#define TSR_DEVICE_DISABLE				0x0010
-#define TSR_DEVICE_ENABLE				0x0011
-
-#define TSR_DEVICE_GETFORCE			0x8020
-#define TSR_DEVICE_GETBUTTONS			0x8021
-
-/* ======================================================================= *
- * Function Prototypes                                                     *
- * ======================================================================= */
-
-short SpwOpenDriver(SpwPacket FAR *packet);
-short SpwCloseDriver(void);
-
-short SpwOpenDevice(short device, SpwPacket FAR *packet);
-short SpwCloseDevice(short device);
-
-short SpwEnableDevice(short device);
-short SpwDisableDevice(short device);
-
-short SpwGetForce(short device, SpwPacket FAR *packet);
-short SpwGetButton(short device, SpwPacket FAR *packet);
-
-/* ======================================================================= *
- * Convience functions                                                     *
- * ======================================================================= */
-
-/* ----------------------------------------------------------------------- *
- * The SpwSimple... functions are just convienence wrappers for the above  *
- * functions.                                                              *
- * ----------------------------------------------------------------------- */
-
-#ifndef SPWSTRUCTS
-#define SPWSTRUCTS
-
-enum SpwDeviceType {
-    SPW_AVENGER=1,
-};
-
-
-
-enum SpwEventType {
-    SPW_NO_EVENT=0,
-    SPW_BUTTON_HELD=1,
-    SPW_BUTTON_DOWN=2,
-    SPW_BUTTON_UP=4,
-    SPW_MOTION=8
-};
-
-
-
-/* ----------------------------------------------------------------------- *
- * Data struct for handling library calls                                  *
- * ----------------------------------------------------------------------- */
-
-typedef struct {
-    short new;
-    short cur;
-    short old;
-} SpwButtonRec;
-
-
-
-typedef struct {
-    short 		 tx;			/* Current Translation vector */
-    short 		 ty;
-    short 		 tz;
-    short 		 rx;			/* Current Rotation vector    */
-    short 		 ry;
-    short        rz;
-    SpwButtonRec buttons;   /* Current Button Record      */
-    short			 newData;   /* An SpEventType mask of newData, 0 if none */
-} SpwRawData;
-
-#endif
-
-
-
-short SpwSimpleGet(short devNum, SpwRawData FAR *splayer);
-short SpwSimpleOpen(short devNum);
-short SpwSimpleClose(short devNum);
-
-/* ======================================================================= *
- * Compiler & Memory Mode Wrappers.                                        *
- * ======================================================================= *
- */
-
-#ifdef __cplusplus
-};
-#endif
-
-/* ======================================================================= */
-#endif
-