home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Action 1998 January
/
PCA0198.ISO
/
MENUE
/
POSTFACH
/
98012063.TXT
< prev
next >
Wrap
Text File
|
1997-11-25
|
3KB
|
162 lines
0
Stereo-FM-SB-Unit.
Der Zauberleerling
Listings
Unit SBlast;
interface
uses crt;
var Blasterfound : Boolean;
Procedure SwapChannels;
Procedure SetChannel(Channel : Byte);
Procedure SetAttack(Attack:Byte);
Procedure SetRelease(Release:Byte);
Procedure SetClearness(Clearness : Byte);
Procedure PlayTone(Frequence : integer);
Procedure StopTone;
Procedure RestoreOldMode;
implementation
const KEYON = $20;
FMP = 8;
var IOport : integer;
LEFT : byte;
RIGHT : byte;
function sbfind:integer;
var Basis, MaxPort, n,n2 : word;
const TestCount=15; TestCount2=40;
begin
Basis:=$210; MaxPort:=$260; n:=TestCount;
while n<=MaxPort do
begin
port[Basis+$6]:=1; port[Basis+$6]:=0;
n2:=TestCount2;
while (n2>0) and (port[Basis+$e] and 128=0) do
dec(n2);
while (n2>0) and (port[Basis+$e] and 128=0) do
dec(n2);
if (n2=0) or (port[Basis+$a]<>$aa) then dec(n)
else
begin
sbfind:=Basis;
exit;
end;
Basis:=Basis+$10;
end;
sbfind:=-1;
end;
Procedure FMoutput(ioport, reg, val : integer);
begin
port[ioport]:= reg;
delay(1);
port[ioport+1]:= val;
end;
Procedure fm(reg, val : integer);
begin
FMoutput(IOport+FMP, reg, val);
end;
Procedure Profm(reg, val : integer);
begin
FMoutput(IOport+2, reg, val);
end;
{Befehle----------------------------------------
-----------------------------}
Procedure SwapChannels;
var temp : byte;
begin
if blasterfound then
begin
temp:=left;
if temp = $20 then
begin
Right:=$20;
Left:=$10;
end
else
begin
Right:=$10;
Left:=$20;
end;
end;
end;
Procedure SetChannel(Channel : Byte);
begin
if blasterfound then
begin
If Channel = 1 then fm($C0,LEFT+1);
If Channel = 2 then fm($C0,LEFT+RIGHT+1);
If Channel = 3 then fm($C0,RIGHT+1);
end;
end;
Procedure SetAttack(Attack:Byte); {Ton-Fadein}
begin
if blasterfound then if attack > 15 then
fm($63,Attack);
end;
Procedure SetRelease(Release:Byte);
{Ton-Fadeout}
begin
if blasterfound then if Release < 16 then
fm($83,Release);
end;
Procedure SetClearness(Clearness : Byte);
begin
if blasterfound then if clearness < 64 then
fm($40,Clearness);
end;
Procedure PlayTone(Frequence : integer);
begin
if blasterfound then begin fm($A0,(Frequence and
$FF)); fm($b0,$32); end;
end;
Procedure StopTone;
begin
If Blasterfound then fm($b0,$12);
end;
Procedure RestoreOldMode;
begin
if blasterfound then Profm(5, 0);
end;
{Init-------------------------------------------
-----------------------------}
Begin
left:=$20;
right:=$10;
Blasterfound:=false;
ioport:=sbfind;
if ioport<> -1 then
begin
Blasterfound:=true;
fm(1,0);
Profm(5, 1);
fm($C0,LEFT+RIGHT+1);
fm($23,$21);
fm($43, $0);
fm($63,255);
fm($83,15);
fm($20,$20);
fm($40,$3f);
fm($60,$44);
fm($80,$05);
end;
end.