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