Unit SBPMixer;
InterFace
Procedure MixerReset;
Function MixerStatus : Byte;
Procedure MixerSetDACLevel(Left,Right : Byte);
Function MixerGetDACLevel : Byte;
Procedure MixerSetMicrophoneLevel(Level : Byte);
Function MixerGetMicrophoneLevel : Byte;
Procedure MixerSetMasterLevel(Left,Right : Byte);
Function MixerGetMasterLevel : Byte;
Procedure MixerSetFMLevel(Left,Right : Byte);
Function MixerGetFMLevel : Byte;
Procedure MixerSetCDAudioLevel(Left,Right : Byte);
Function MixerGetCDAudioLevel : Byte;
Procedure MixerSetLineInLevel(Left,Right : Byte);
Function MixerGetLineInLevel : Byte;
Implementation
Uses Crt;
Const
 BaseAddress : Word = $220; { У моего бластера 220h - Base и 330h - Midi }
 MixerPort : Word = $224; { BaseAddress + 04h }
{ Две базовые функции для работы с чипами бластера }
Procedure SetIndexDataPort(PortN : Word; Index,Data : Byte);
Begin
 Port[PortN]:=Index;
 Port[PortN+1]:=Data;
End;
Function GetIndexDataPort(PortN : Word; Index : Byte): Byte;
Begin
 Port[PortN]:=Index;
 GetIndexDataPort:=Port[PortN+1];
End;
{ Набор функций по управлению миксером }
{ порт миксера 000h - Reset : Сбрасывает миксер в начальное положение }
{ только запись, значение 0000000x  }
{ зарезервировано ────────┴┴┴┴┴┴┘└─ Reset Status (0 - Stop reset) }
Procedure MixerReset;
Begin
 SetIndexDataPort(MixerPort,$00,$01);
 Delay(100);
 SetIndexDataPort(MixerPort,$00,$00);
End;
{ порт миксера 001h - Status : только чтение. Возвращает байт статуса SB }
Function MixerStatus : Byte;
Begin
 MixerStatus:=GetIndexDataPort(MixerPort,$01);
End;
{ порт миксера 004h - DACLevel : чтение/запись. Регулирует DAC (ЦАП) SB }
{		 значение 00010001  }
{ левый канал ЦАП ────────┴┴┘│└┴┤└─ 1 - SBPro, 0 - SB16 }
{			     │	└── правый канал ЦАП }
{			     └───── 1 - SBPro, 0 - SB16 }
Procedure MixerSetDACLevel(Left,Right : Byte);
Begin
 SetIndexDataPort(MixerPort,$04,((((Left SHL 4) OR Right) SHL 1) OR $11));
End;
Function MixerGetDACLevel : Byte;
Begin
 MixerGetDACLevel:=GetIndexDataPort(MixerPort,$04);
End;
{ порт миксера 00Ah - MicrophoneLevel : чтение/запись. Регулирует DAC (ЦАП) SB }
{		 значение 00000000  }
{ зарезервировано ────────┴┴┴┴┘││└─ 0 - SBPro, 1 - SB16 }
{			       └┴── Microphone Level (SBPro) }
Procedure MixerSetMicrophoneLevel(Level : Byte);
Begin
 SetIndexDataPort(MixerPort,$0A,Level SHL 1);
End;
Function MixerGetMicrophoneLevel : Byte;
Begin
 MixerGetMicrophoneLevel:=GetIndexDataPort(MixerPort,$0A);
End;
{ порт миксера 022h - Master volume : чтение/запись. }
{		 значение 00010001  }
{ левый канал Master ─────┴┴┘│└┴┤└─ 1 - SBPro, 0 - SB16 }
{			     │	└── правый канал Master }
{			     └───── 1 - SBPro, 0 - SB16 }
Procedure MixerSetMasterLevel(Left,Right : Byte);
Begin
 SetIndexDataPort(MixerPort,$22,((((Left SHL 4) OR Right) SHL 1) OR $11));
End;
Function MixerGetMasterLevel : Byte;
Begin
 MixerGetMasterLevel:=GetIndexDataPort(MixerPort,$22);
End;
{ порт миксера 026h - FM volume : чтение/запись. }
{		 значение 00010001  }
{ левый канал FM ─────────┴┴┘│└┴┤└─ 1 - SBPro, 0 - SB16 }
{			     │	└── правый канал FM }
{			     └───── 1 - SBPro, 0 - SB16 }
Procedure MixerSetFMLevel(Left,Right : Byte);
Begin
 SetIndexDataPort(MixerPort,$26,((((Left SHL 4) OR Right) SHL 1) OR $11));
End;
Function MixerGetFMLevel : Byte;
Begin
 MixerGetFMLevel:=GetIndexDataPort(MixerPort,$26);
End;
{ порт миксера 028h - CD Audio Level : чтение/запись. }
{		 значение 00010001  }
{ левый канал CD Audio ───┴┴┘│└┴┤└─ 1 - SBPro, 0 - SB16 }
{			     │	└── правый канал CD Audio }
{			     └───── 1 - SBPro, 0 - SB16 }
Procedure MixerSetCDAudioLevel(Left,Right : Byte);
Begin
 SetIndexDataPort(MixerPort,$28,((((Left SHL 4) OR Right) SHL 1) OR $11));
End;
Function MixerGetCDAudioLevel : Byte;
Begin
 MixerGetCDAudioLevel:=GetIndexDataPort(MixerPort,$28);
End;
{ порт миксера 02Eh - Line In Level : чтение/запись. }
{		 значение 00010001  }
{ левый канал Line In ────┴┴┘│└┴┤└─ 1 - SBPro, 0 - SB16 }
{			     │	└── правый канал Line In }
{			     └───── 1 - SBPro, 0 - SB16 }
Procedure MixerSetLineInLevel(Left,Right : Byte);
Begin
 SetIndexDataPort(MixerPort,$2E,((((Left SHL 4) OR Right) SHL 1) OR $11));
End;
Function MixerGetLineInLevel : Byte;
Begin
 MixerGetLineInLevel:=GetIndexDataPort(MixerPort,$2E);
End;
End.