[an error occurred while processing this directive]
Listing DSP.PAS
Unit DSP;
Interface
{ ResetDSP returneaza True daca resetarea a }
{ avut loc cu succes base trebuie sa fie 1 }
{ pentru adresa de baza $210,2 pentru $220? }
function ResetDSP(base:Word):Boolean;
{ WriteDAC setează nivelul de iesire al }
{ difuzoarelor }
procedure WriteDAC(level:Byte);
{ ReadDAC citeste nivelul de intrare al }
{ microfonului }
function ReadDAC:Byte;
{ SpeakerOn conecteaza DAC-ul la difuzoare }
function SpeakerOn:Byte;
{ SpeakerOff deconecteaza DAC-ul de la }
{ difuzoare; nu afecteaza restul }
{ operatiilor DAC-ului }
function SpeakerOff: byte;
{ Functii pentru controlul redarii DMA }
procedure DMAStop;procedure DMAContinue;
{ Playback reda un esantion de o marime data }
{ la o frecventa data folosind canalul 1 DMA }
{ Esantionul nu trebuie sa treaca de o pagina }
procedure Playback(sound:Pointer; size:Word;
frequency:Word);
Implementation
Uses Crt;
var DSP_RESET:Word;
DSP_READ_DATA:Word;
DSP_WRITE_DATA:Word;
DSP_WRITE_STATUS:Word;
DSP_DATA_AVAIL:Word;
function ResetDSP(base:Word):Boolean;
begin
base:=base*$10;
{ Calculeaza adresele porturilor }
DSP_RESET:=base+$206;
DSP_READ_DATA:=base+$20A;
DSP_WRITE_DATA:=base+$20C;
DSP_WRITE_STATUS:=base+$20C;
DSP_DATA_AVAIL:=base+$20E;
{ Reseteaza DSP-ul si produce niste pauze }
{ lungi pentru siguranta }
Port[DSP_RESET]:=1; Delay(10);
Port[DSP_RESET]:=0; Delay(10);
ResetDSP:=(Port[DSP_DATA_AVAIL] and
$80=$80) and (Port[DSP_READ_DATA]=$AA)
end;
procedure WriteDSP(value:Byte);
begin
while Port[DSP_WRITE_STATUS] and $80<>0 do;
Port[DSP_WRITE_DATA]:=value
end;
function ReadDSP:Byte;
begin
while Port[DSP_DATA_AVAIL] and $80=0 do;
ReadDSP:=Port[DSP_READ_DATA]
end;
procedure WriteDAC(level:Byte);
begin WriteDSP($10); WriteDSP(level) end;
function ReadDAC:Byte;
begin WriteDSP($20); ReadDAC:=ReadDSP end;
function SpeakerOn:Byte;
begin WriteDSP($D1) end;
function SpeakerOff:Byte;
begin WriteDSP($D3) end;
procedure DMAContinue;
begin WriteDSP($D4) end;
procedure DMAStop;
begin WriteDSP($D0) end;
procedure Playback(sound:Pointer;size:Word;
frequency:Word);
var time_constant:Word;
page,offset:Word;
begin
SpeakerOn;
size:=size-1;{ Pregateste controlerul DMA }
offset:=Seg(sound^) shl 4+Ofs(sound^);
page:=(Seg(sound^)+Ofs(sound^) shr 4)shr 12;
Port[$0A]:=5; Port[$0C]:=0; Port[$0B]:=$49;
Port[$02]:=Lo(offset);
Port[$02]:=Hi(offset); Port[$83]:=page;
Port[$03]:=Lo(size); Port[$03]:=Hi(size);
Port[$0A]:=1;
{ Seteaza frecventa de redare }
time_constant:=256-1000000 div frequency;
WriteDSP($40);
WriteDSP(time_constant);
{ Seteaza tipul redarii (8-biti) }
WriteDSP($14);
WriteDSP(Lo(size)); WriteDSP(Hi(size))
end
End.