// Проигрыватель MOD файлов в PMode
#pragma option d32
#pragma option argc



// Кое-какие дополнительные коды клавиш
#define k_minus               0C2Dh
#define k_plus                0D3Dh
// Базовый селектор (для соунд системы)
:dword BaseSel;



// Инклуды
#include "keycodes.h--"    // Библа с #define-ами кодов клавиш
#include "write.h--"       // Библа для вывода данных на экран
#define __MODPLAYER__ TRUE // Грузить мод-плеер
#include "sb.h--"          // Библа для работы с Sound Blaster-ом



// В пояснениях не нуждается ;)
main()
{
 // Если параметров нет, то входим
 IF (PARAMCOUNT()<=1) return;

 // Очищаем экран, если в видеорежиме 3h
 AX=3; $int 10h

 // Инициализация всего
 InitAll();

  ModModule.LoadModule(PARAMSTR(1));

  // Начинаем воспроизводить композицию
  ModModule.Play=TRUE;

  loop(){
    IF (@BIOSEKEYCHECK()){
       SWITCH(BIOSEREADKEY()){
        CASE k_esc:
         BREAK 1;
        CASE k_space:
         // Останавливаем/возобновляем воспроизведение
         ModModule.Play^=1;
         BREAK;
        CASE k_plus:
         // Переходим на следующий паттерн
         ModModule.NextPattern();
         // Устанавливаем нулевую строку
         ModModule.PatternLine=0;
         BREAK;
        CASE k_minus:
         // Переходим на предыдущий паттерн
         ModModule.PreviousPattern();
         // Устанавливаем нулевую строку
         ModModule.PatternLine=0;
         BREAK;
       }
    }
  }

 // Деинициализация всего
 DeInitAll();
}



// Инициализация всего
InitAll()
{
 // Сохраняем базовый селектор
 BaseSel=DS;

 // Тушим курсор
 AH=1; CH=20h; $int 10h

 WriteStr("\nАвтоопределение конфигурации звуковой карты...");
 IF (!SbAutoDetect()){
// IF (!SbGetEnvirenmentConfig()){
    WriteStr("\nSound Blaster не найден или занят другим приложением");
    // Вывести все, что удалось определить
    WriteStr("\nBase Address : "); WriteWordHex(SbIoAddr); Write('h');
    WriteStr("\nIRQ          : "); WriteByte(SbIrq);
    WriteStr("\nDMA          : "); WriteByte(SbDma);
    // Обратно в DOS
    EXIT();
 }ELSE WriteStr("\nSound Blaster найден");

 WriteStr("\nBase Address : "); WriteWordHex(SbIoAddr); Write('h');
 WriteStr("\nIRQ          : "); WriteByte(SbIrq);
 WriteStr("\nDMA          : "); WriteByte(SbDma);

 WriteStr("\n\nИнициализация SB...");
 InitSb();

 WriteStr("\nТип         : Sound Blaster ");
 AL=SbType;
 IF (AL==SoundBlaster10) WriteStr("1.0");
 ELSE IF (AL==SoundBlaster20) WriteStr("2.0");
 ELSE IF (AL==SoundBlasterPro) WriteStr("Pro");
 ELSE IF (AL==SoundBlaster16) WriteStr("16");
 ELSE IF (AL==SoundBlasterAwe32) WriteStr("Awe 32");
 ELSE IF (AL==SoundBlasterEss) WriteStr("ESS");
 WriteStr("\nSbRate      : "); WriteDWord(SbRate);
 WriteStr("\nSbStereo    : "); WriteByte(SbStereo);
 WriteStr("\nSbAutoInit  : "); WriteByte(SbAutoInit);

 WriteStr("\n\nDSP Version : "); WriteByte(byte DspVersion[1]); Write('.'); WriteByte(byte DspVersion);

 // Инициализируем мод-систему
 ModModule.Init();
}



// Деинициализация всего
DeInitAll()
{
 // Деинициализируем мод-систему
 ModModule.DeInit();

 WriteStr("\n\nДеинициализация SB... ");
  DeInitSb();
 WriteStr("OK");
}