// Типы Sound Blaster-ов ////////////////////////////////////////////////////
enum{SoundBlaster10=1,
//     SoundBlaster15,
     SoundBlaster20,
     SoundBlasterPro,
     SoundBlaster16,
     SoundBlasterAwe32,
     SoundBlasterEss};



// Лимитные константы ///////////////////////////////////////////////////////
// Максимальное количество каналов
#define MaxVoices 32

// Максимальное количество семплов
#ifdef __DOS32__
 #define MaxSamples 64
#endif
#ifdef __MSDOS__
 #define MaxSamples 32
#endif



// Переменные настройки Sound Blaster-а /////////////////////////////////////
// Базовый адрес соунд бластера
:word SbIoAddr = 000h;
// IRQ соунд бластера
:word SbIrq    = 000h;
// 8-битный DMA канал соунд бластера
:word SbDma    = 001h;
// Rate соунд бластера
:dword SbRate  = 000h;
// Rate вызова IRQ (50 Hz)
:word IrqRate  = 50;
// Тип звуковой карты
:byte SbType   = 0;
// Количество каналов
:word SbNumVoices=23;
// Громкость (старшие 4 бита - левый канал, младшие 4 бита - правый)
:byte SbVol=0FFh;
// Master Volume
:byte SbMasterVol=0FFh;
// Стерео или моно вывод (0 - mono, 1 - stereo)
:byte SbStereo;
// С автоинициализацией или без
:byte SbAutoInit;
// Sb16BitQuality
:byte Sb16BitOutput=FALSE;



// Переменные буферов для Sound Blaster-а ///////////////////////////////////
// Размер рабочего буфера
:word SbWorkBufSize;
// Номер рабочего канала (FirstBuf at start)
:byte SbWorkBufNum=0;

#ifdef __MSDOS__
 // Первый рабочий буфер
 :word SbWorkBufSeg;
 :word SbWorkBufOffs;
 // Буфер перевода
 :word SbClipTableBufSeg;
 :word SbClipTableBufOffs;  // = 0
 // 16-битный буфер микширования
 :word SbMixBufSeg;
 :word SbMixBufOffs;   // = 0
#endif

#ifdef __DOS32__
 // Первый рабочий буфер
 :word SbWorkBufSeg;
 :word SbWorkBufSel;
 :dword SbWorkBufOffs;
 // Буфер перевода
 :word SbClipTableBufSeg;
 :word SbClipTableBufSel;
 :dword SbClipTableBufOffs;  // = 0
 // 16-битный буфер микширования
 :word SbMixBufSeg;
 :word SbMixBufSel;
 :dword SbMixBufOffs;   // = 0
#endif



// Структура семпла
:struct SAMPLE
{
  word Seg;                // Сегмент семпла
 #ifdef __DOS32__
  word Sel;                // Селектор семпла
 #endif
 #ifdef __MSDOS__
  word Offs;               // Смещение семпла
 #endif
 #ifdef __DOS32__
  dword Offs;              // Смещение семпла
 #endif
 dword Length;             // Размер семпла
 fixed Pos;                // Позиция в семпле (fixed 16:16)
 dword Rate;               // Частота воспроизведения семпла
 byte Volume;              // Громкость семпла
 byte Balance;             // Баланс (0...255)
 word RepeatOffs;          // Смещение начала зацикливания  (Not Supported)
 word RepeatLength;        // Длина зацикливания            (Not Supported)
}Sample[MaxSamples];



// Структура канала
:struct VOICE
{
 SAMPLE Sample; // Семпл
 byte Active;   // Флаг активности канала
 byte Flags;    // Флаги работы канала
}Voice[MaxVoices];



// Адрес старого обработчика прерывания
#ifdef __MSDOS__
:word OldSbIrqHandler[2];
#endif
#ifdef __DOS32__
:dword OldSbIrqHandler[2];
#endif



// Флаги канала (еще не поддерживаются)
#define VoicePausedFlag    00000001b // Приостановка воспроизведения канала
#define VoiceDisabledFlag  00000010b // Выключение звука канала
#define VoiceNoMixFlag     00000100b // Не микшируемый канал (микшируется
                                     // отдельными средствами)


// Разные дефайны ///////////////////////////////////////////////////////////
#define LeftFmStatus             000h    // Только Sound Blaster Pro
#define LeftFmAddress            000h    // Только Sound Blaster Pro
#define LeftFmData               001h    // Только Sound Blaster Pro
#define RightFmStatus            002h    // Только Sound Blaster Pro
#define RightFmAddress           002h    // Только Sound Blaster Pro
#define RightFmData              003h    // Только Sound Blaster Pro
#define MixerAddress             004h    // Только Sound Blaster Pro
#define MixerData                005h    // Только Sound Blaster Pro
#define DspReset                 006h    // Порт сброса DSP
#define FmStatus                 008h
#define FmAddress                008h
#define FmData                   009h
#define DspReadData              00Ah
#define DspWriteData             00Ch
#define DspWriteStatus           00Ch
#define DspDataAvail             00Eh
#define CdRomData                010h    // Только Sound Blaster Pro
#define CdRomStatus              011h    // Только Sound Blaster Pro
#define CdRomReset               012h    // Только Sound Blaster Pro
#define CdRomEnable              013h    // Только Sound Blaster Pro
#define DisableStereoInputMode   0A0h    // SBPro Only
#define EnableStereoInputMode    0A8h    // SBPro Only

#define AdlibFmStatus      0388h
#define AdlibFmAddress     0388h
#define AdlibFmData        0389h

// Комманды DSP
#define Direct8BitDac                010h
#define Dma8BitDac                   014h
#define Dma2BitDac                   016h
#define Dma2BitRefDac                017h
#define Dma8BitDacAutoInit           01Ch
#define DirectAdc                    020h
#define DmaAdc                       024h
#define MidiReadPoll                 030h
#define MidiReadIrq                  031h
#define MidiWritePoll                038h
#define TimeConstant                 040h
//#define Dma8BitDacHiInit             048h   // Для high-speed SB Pro transfers
#define SetDmaBlockSize              048h   // Для high-speed SB Pro transfers
#define Dma4BitDac                   074h
#define Dma4BitRefDac                075h
#define Dma26BitDac                  076h
#define Dma26BitRefDac               077h
#define Dma8BitDacHiStart            091h   // Для high-speed SB Pro transferss
#define Dma8BitAdcHiStart            099h   // Для high-speed SB Pro transferss
#define HaltDma                      0D0h
#define ContinueDma                  0D4h
#define SpeakerOn                    0D1h
#define SpeakerOff                   0D3h
#define DspId                        0E0h
#define DspVer                       0E1h
#define DspCopyright                 0E3h
#define IntRequest                   0F2h
#define Mdac1                        061h
#define Mdac2                        062h
#define Mdac3                        063h
#define Mdac4                        064h
#define Mdac5                        065h
#define Mdac6                        066h
#define Mdac7                        067h
#define HiSpeedDma8BitAutoInitDac    090h   // Auto-Initialize DMA DAC, 8-bit (High Speed)         SB2.0-Pro2
#define HiSpeedDma8BitAutoinitAdc    098h   // Auto-Initialize DMA ADC, 8-bit (High Speed)         SB2.0-Pro2
#define ExitDma16BitAutoInitDac      0D9h   // Exit Auto-Initialize DMA Operation, 16-bit          SB16
#define ExitDma8BitAutoInitDac       0DAh   // Exit Auto-Initialize DMA Operation, 8-bit           SB2.0

// Дефайны для миксера
#define MasterVol                    022h
#define VocVol                       004h
#define LineVol                      02eh
#define FmVol                        026h
#define CdVol                        028h
#define RecordSrc                    00Ch
#define Mic                          011h
#define LineIn                       017h
#define Cd                           013h

// Для 8-битных DMA
#define DmaMask8Bit                  00Ah     // DMAC mask (write-only)
#define Mode8Bit                     00Bh     // DMAC mode (read/write)
#define BytePtr8Bit                  00Ch     // DMAC mode (read/write)
// Для 16-битных DMA
#define DmaMask16Bit                 0D4h     // DMAC mask (write-only)
#define Mode16Bit                    0D6h     // DMAC mode (read/write)
#define BytePtr16Bit                 0D8h     // DMAC mode (read/write)

#define ReadCmd  048h    // read (from memory) mode  [out to bus]
#define WriteCmd 044h    // write (to memory) mode   [in from bus]
#define ResetCmd 004h    // DMA_MASK reset

// Mixer
#define MixerReset                   000h     // Write       SBPro
#define MixerStatus                  001h     // Read        SBPro
#define MixerMasterVol               002h     // Read/Write  SBPro Only
#define MixerDACLevel                004h     // Read/Write  SBPro
#define MixerFMOutputControl         006h     // Read/Write  SBPro Only
#define MixerMicLevel                00Ah     // Read/Write  SBPro
#define MixerInputFilterSelect       00Ch     // Read/Write  SBPro Only
#define MixerOutputStereoSelect      00Eh     // Read/Write  SBPro Only
// #define MixerMasterVol               022h     // Read/Write  SBPro
#define MixerFMLevel                 026h     // Read/Write  SBPro
#define MixerCDAudioLevel            028h     // Read/Write  SBPro
#define MixerLineInLevel             02Eh     // Read/Write  SBPro
#define MixerMasterVolLeft           030h     // Read/Write  SB16
#define MixerMasterVolRight          031h     // Read/Write  SB16
#define MixerDACLevelLeft            032h     // Read/Write  SB16
#define MixerDACLevelRight           033h     // Read/Write  SB16
#define MixerFMLevelLeft             034h     // Read/Write  SB16
#define MixerFMLevelRight            035h     // Read/Write  SB16
#define MixerCDAudioLevelLeft        036h     // Read/Write  SB16
#define MixerCDAudioLevelRight       037h     // Read/Write  SB16
#define MixerLineInLevelLeft         038h     // Read/Write  SB16
#define MixerLineInLevelRight        039h     // Read/Write  SB16
// #define MixerMicLevel                03Ah     // Read/Write  SB16
#define MixerPCSpeakerLevel          03Bh     // Read/Write  SB16
#define MixerOutputControl           03Ch     // Read/Write  SB16
#define MixerInputControlLeft        03Dh     // Read/Write  SB16
#define MixerInputControlRight       03Eh     // Read/Write  SB16
#define MixerInputGainControlLeft    03Fh     // Read/Write  SB16
#define MixerInputGainControlRight   040h     // Read/Write  SB16
#define MixerOutputGainControlLeft   041h     // Read/Write  SB16
#define MixerOutputGainControlRight  042h     // Read/Write  SB16
#define MixerTrebleLeft              044h     // Read/Write  SB16
#define MixerTrebleRight             045h     // Read/Write  SB16
#define MixerBassLeft                046h     // Read/Write  SB16
#define MixerBassRight               047h     // Read/Write  SB16
#define MixerIRQSelect               080h     // Read/Write  SB16
#define MixerDMASelect               081h     // Read/Write  SB16
#define MixerIRQStatus               082h     // Read        SB16

:byte PagePort[4]={ 087h,083h,081h,082h, 08Fh,08Bh,089h,08Ah };
:byte AddressPort[4]={ 000h,002h,004h,006h, 0C0h,0C4h,0C8h,0CCh };

// Дефайны для ESS-ки
#define EssWriteCommand              0C0h
#define EssEnterExtendedMode         0C6h
#define EssExitExtendedMode          0C7h

