home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
PINBSRC.ZIP
/
SOUNDKIT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-02-02
|
2KB
|
120 lines
{SOUNDKIT Ver. 1.0 (c) Ansgar Scherp, Joachim Gelhaus / vt '95 }
Unit SOUNDKIT;
Interface
function ResetDSP(base : word) : boolean;
procedure WriteDAC(level : byte);
function ReadDAC : byte;
function SpeakerOn: byte;
function SpeakerOff: byte;
procedure DMAStop;
procedure DMAContinue;
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;
DSP_RESET := base + $206;
DSP_READ_DATA := base + $20A;
DSP_WRITE_DATA := base + $20C;
DSP_WRITE_STATUS := base + $20C;
DSP_DATA_AVAIL := base + $20E;
Port[DSP_RESET] := 1;
Delay(10);
Port[DSP_RESET] := 0;
Delay(10);
if (Port[DSP_DATA_AVAIL] And $80 = $80) And
(Port[DSP_READ_DATA] = $AA) then
ResetDSP := true
else
ResetDSP := false;
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
size := size - 1;
offset := Seg(sound^) Shl 4 + Ofs(sound^);
page := (Seg(sound^) + Ofs(sound^) shr 4) shr 12;
if size>65536-offset then size:=65536-offset;
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;
time_constant := 256 - 1000000 div frequency;
WriteDSP($40);
WriteDSP(time_constant);
WriteDSP($14);
WriteDSP(Lo(size));
WriteDSP(Hi(size));
end;
end.