1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
program test_cartesoundblast;
uses newdelay,crt;
const
dsp_adr : WORD = $220;
Startport : WORD = $200;
Endport : WORD = $280;
dsp_irq : BYTE = $5;
var
S,VerStr : String;
VerMaj,VerMin : Byte;
intback : pointer;
port21 : byte;
blk : pointer;
{Petite description des adresses dveloppes par les fonctions suivantes:
- $6 , fonction de Reset du Digital Signal Processor.
- $E puis $A, fonctions de lecture de l'tat du DSP en tps rel.
Note: $AA est une valeur arbitraire, envoye par le DSP pour dclarer
l'initialisation russie.
* Les fonctions sont les suivantes : Reset sert
enclencher un test direct
sur le DSP, avec l'adresse de base Dsp_Adr. Detect effectue une boucle
pendant laquelle elle adresse Reset avec la valeur Dsp_Adr de $210
$280. Si Reset retourne TRUE, l'adresse envoye par Detect est valide et
la carte SOUND BLASTER est dtecte.
Enfin, WriteDSP et ReadDSP permettent d'crire dans les registres
du DSP et de lire des octets en provenance du DSP.}
Function Reset : Boolean;
Const ready = $AA;
Var ct,stat : byte;
begin
reset:=false;
Port[dsp_adr+$6]:=1;
For ct:=1 to 100 do;
Port[dsp_adr+$6]:=0;
stat:=0;
While(stat <> ready) and (ct < 101) do
begin
stat:= Port[dsp_adr+$E];
stat:= Port[dsp_adr+$A];
inc(ct);
end;
Reset:=(stat=ready);
end;
Function Detect_PORT : Boolean;
var Port, Lst : Word;
Begin
Detect_PORT:=False;
If Reset = TRUE then
begin
Detect_PORT:=Reset;
Exit;
end;
Port := StartPort;
Lst := Endport;
While (not Reset) and (Port<= Lst) do
begin
dsp_adr:=Port;
Reset;
If Not Reset then Inc(Port, $10);
end;
Detect_PORT:=Reset;
end;
Procedure WriteDSP(v : Byte);
begin
While Port[dsp_adr+$C] >= 128 do;
Port[dsp_adr+$C] :=V;
end;
Function ReadDSP : Byte;
begin
While Port[dsp_adr+$A] = $AA do;
ReadDSP := Port[dsp_adr+$A];
end;
procedure Get_DSP_Version;
Var i : WORD;
t : WORD;
s : String[2];
Begin
WriteDSP($E1);
Vermaj:=ReadDSP;
Vermin:=ReadDSP;
str(Vermaj,VerStr);
Verstr:= Verstr + '.';
str(Vermin,s);
If Vermin>9 then
Verstr:= Verstr + s
else
Verstr:= Verstr + '0' +S;
end;
begin
clrscr;
Reset;
Detect_PORT;
Get_DSP_Version;
Case DSP_ADR of
$200 : s:='200';
$210 : s:='210';
$220 : s:='220';
$230 : s:='230';
$240 : s:='240';
$250 : s:='250';
$260 : s:='260';
$270 : s:='270';
$280 : s:='280';
end;
If Detect_PORT then begin
Writeln('Vous possdez une carte SOUND BLASTER ou compatible sur le port ',S,'h');
Writeln('Version de la carte : ',Verstr,'')
end
Else Writeln('Vous n''avez pas de carte SOUND BLASTER ou compatible.');
repeat until keypressed;
end. |
Partager