[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.