home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 26 / CD_ASCQ_26_1295.iso / voxrom / textes / repwin08 / annexes / triax / sb.pas < prev    next >
Pascal/Delphi Source File  |  1995-10-01  |  8KB  |  290 lines

  1. {▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  2. { SB - Unité gestion SB }
  3. {▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  4. Unit SB;
  5.  
  6. INTERFACE {--Globals--------------------------------------------------------}
  7.  
  8. Var
  9.   SBPort      : word;      {Port de base SB}
  10.   SBIrq       : byte;      {Numéro d'irq SB}
  11.   SBDma       : byte;      {Canal dma SB}
  12.   SBDmaDone   : boolean;   {Transfert dma terminé oui/non}
  13.  
  14. Procedure SBInit;                     {Installe handler d'irq}
  15. Procedure SBDone;                     {UnInstalle handler}
  16. Function  SBReset:BOOLEAN;            {Reset SB}
  17. Function  SBDetect:BOOLEAN;           {Detect SB}
  18. Function  SBVersion:WORD;             {Lit version DSP}
  19. Procedure SBHpOn;                     {Allume HP}
  20. Procedure SBHpOff;                    {Eteint HP}
  21. Function  SBDirectIn:BYTE;            {Direct sample input}
  22. Procedure SBDirectOut(Sample:BYTE);   {Direct sample output}
  23. Procedure SBSetFreq(Freq:WORD);       {Règle fréquence sampling}
  24. Procedure SBDmaIn(Count:WORD;Address:POINTER);  {Lit sample via DMA}
  25. Procedure SBDmaOut(Count:WORD;Address:POINTER); {Sort sample via DMA}
  26. Procedure SBStopDma;                  {Stop transfert DMA}
  27. Procedure SBContinueDma;              {Continue transfert DMA}
  28.  
  29. IMPLEMENTATION {--Locals----------------------------------------------------}
  30.  
  31. Uses DOS,DMA;
  32.  
  33. Const
  34.    DSPReset      = $06;  {Port de reset}
  35.    DSPRead       = $0a;  {Port de lecture}
  36.    DSPWrite      = $0c;  {Port d'écriture}
  37.    DSPDataState  = $0e;  {Port d'état des données}
  38.  
  39. Var
  40.   OldHandlerAddr  : pointer; {Ancien handler d'irq}
  41.  
  42. {▓▓▓▓▓ Low level routines - Lecture/Ecriture/Reset SB ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  43.  
  44. {░░░ SBREAD: Lit un octet sur la SB ░░░}
  45. Function SBRead:BYTE; assembler;
  46. Asm
  47.         mov     dx,[SBPort]
  48.         or      dl,DSPDataState
  49.   @SBRead_Wait:
  50.           in      al,dx
  51.           or      al,al
  52.           jns     @SBRead_Wait
  53.         and     dl,0f0h
  54.         or      dl,DSPRead
  55.         in      al,dx
  56. End;
  57.  
  58. {░░░ SBWRITE: Ecrit un octet sur la SB ░░░}
  59. Procedure SBWrite(Data:BYTE); assembler;
  60. Asm
  61.         mov     dx,[SBPort]
  62.         or      dl,DSPWrite
  63.   @SBWrite_Wait:
  64.           in      al,dx
  65.           or      al,al
  66.           js      @SBWrite_Wait
  67.         mov     al,[Data]
  68.         out     dx,al
  69. End;
  70.  
  71. {▒▒▒ SBRESET: Balance un reset au DSP ▒▒▒}
  72. Function SBReset:BOOLEAN; assembler;
  73. Asm
  74.       {░░ Envoie le reset ░░}
  75.         mov     dx,[SBPort]
  76.         or      dl,DSPReset
  77.         mov     al,1
  78.         out     dx,al
  79.           in      al,dx
  80.           in      al,dx
  81.           in      al,dx
  82.           in      al,dx
  83.         xor     al,al
  84.         out     dx,al
  85.  
  86.       {░░ Attend une réponse de la SB ░░}
  87.         and     dl,0f0h
  88.         or      dl,DSPDataState
  89.         mov     cx,256
  90.   @SBReset_Wait:
  91.           in      al,dx
  92.           or      al,al
  93.           js      @SBReset_Test
  94.           loop    @SBReset_Wait
  95.     @SBReset_Failed:
  96.           mov     al,FALSE
  97.           ret
  98.  
  99.       {░░ Teste si on a bien affaire à un DSP ░░}
  100.   @SBReset_Test:
  101.         and     dl,0f0h
  102.         or      dl,DSPRead
  103.         in      al,dx
  104.         cmp     al,0aah
  105.         jne     @SBReset_Failed
  106.         mov     al,TRUE
  107. End;
  108.  
  109. {▓▓▓▓▓ Autodétection de la SB ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  110.  
  111. {░░░ SBDetectPORT: Détecte le port de base SB ░░░}
  112. Function SBDetectPort:BOOLEAN;
  113. Begin
  114.    SBDetectPort:=FALSE;
  115.    SBPort:=$210;
  116.    Repeat
  117.       If SBReset then
  118.         Begin
  119.            SBDetectPort:=TRUE;
  120.            Exit;
  121.         End;
  122.       Inc(SBPort,$10);
  123.    Until SBPort>$280;
  124. End;
  125.  
  126. {░░░ SBDetectIRQ: Détecte l'irq SB ░░░}
  127. Function SBDetectIrq:BOOLEAN;
  128. Const Irqs : array[0..4] of byte = (2,3,5,7,10);
  129. Var
  130.   IrqIndex : byte;
  131.   IrqDelay : word;
  132. Begin
  133.    SBDetectIrq:=FALSE;
  134.    SBHpOff;
  135.  
  136.    {░░ Parcourt toutes les irqs possibles à travers IrqIndex ░░}
  137.    IrqIndex:=0;
  138.    Repeat
  139.       SBIrq:=Irqs[IrqIndex];
  140.       SBInit;  {Installe handler}
  141.       SBDmaOut($0002,NIL);  {Envoie un chti bloc}
  142.  
  143.       {░░ Attend pour voir si la SB répond ░░}
  144.       For IrqDelay:=0 to $ffff do
  145.         If SBDmaDone then
  146.           Begin
  147.              SBDetectIrq:=TRUE;  {░ Oui-> cool on a trouvé! ░}
  148.              Exit;
  149.           End;
  150.  
  151.       {░ Non-> alors irq suivante ░}
  152.       SBDone; {Uninstall handler}
  153.       Inc(IrqIndex);
  154.    Until IrqIndex > 4;
  155. End;
  156.  
  157. {▒▒▒ SBDetect: Auto-détecte les port,irq,dma SB ▒▒▒}
  158. Function SBDetect:BOOLEAN;
  159. Begin
  160.    SBDetect:=FALSE;
  161.    SBDma:=1;        {Disons que ouais... (en général c'est ça..)}
  162.    If not SBDetectPort then exit;
  163.    If not SBDetectIrq then exit;
  164.    SBDetect:=TRUE;
  165. End;
  166.  
  167. {▒▒▒ SBVersion: Lit le numéro de version du DSP ▒▒▒}
  168. Function SBVersion:WORD;
  169. Begin
  170.    SBWrite($E1);
  171.    SBVersion:=SBRead+SBRead shl 8;
  172. End;
  173.  
  174. {▓▓▓▓▓ Gestion du Haut-Parleur ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  175.  
  176. {▒▒▒ SBHpON: Allume le Haut-Parleur ▒▒▒}
  177. Procedure SBHpOn;
  178. Begin
  179.    SBWrite($D1);
  180. End;
  181.  
  182. {▒▒▒ SBHpOFF: Eteint le Haut-Parleur ▒▒▒}
  183. Procedure SBHpOff;
  184. Begin
  185.    SBWrite($D3);
  186. End;
  187.  
  188. {▓▓▓▓▓ Entrée/Sortie directe de samples ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  189.  
  190. {▒▒▒ SBDirectIN: Lit un sample direct from SB ▒▒▒}
  191. Function SBDirectIn:BYTE;
  192. Begin
  193.    SBWrite($20);
  194.    SBDirectIn:=SBRead;
  195. End;
  196.  
  197. {▒▒▒ SBDirectOut: Sort un sample direct to SB ▒▒▒}
  198. Procedure SBDirectOut(Sample:BYTE);
  199. Begin
  200.    SBWrite($10);
  201.    SBWrite(Sample);
  202. End;
  203.  
  204. {▓▓▓▓▓ Entrée/Sortie de samples via DMA ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  205.  
  206. {▒▒▒ SBSetFreq: Règle la fréquence de sampling ▒▒▒}
  207. Procedure SBSetFreq(Freq:WORD);
  208. Begin
  209.    SBWrite($40);
  210.    SBWrite(256-1000000 div Freq);
  211. End;
  212.  
  213. {▒▒▒ SBDmaIn: Enregistre un sample via DMA ▒▒▒}
  214. Procedure SBDmaIn(Count:WORD;Address:POINTER);
  215. Begin
  216.    DMAInit(SBDma,DMARead,Count,Address);
  217.    Dec(Count);
  218.    SBDmaDone:=FALSE;
  219.    SBWrite($24);
  220.    SBWrite(Lo(Count));
  221.    SBWrite(Hi(Count));
  222. End;
  223.  
  224. {▒▒▒ SBDmaOut: Sort un sample via DMA ▒▒▒}
  225. Procedure SBDmaOut(Count:WORD;Address:POINTER);
  226. Begin
  227.    DMAInit(SBDma,DMAWrite,Count,Address);
  228.    Dec(Count);
  229.    SBDmaDone:=FALSE;
  230.    SBWrite($14);
  231.    SBWrite(Lo(Count));
  232.    SBWrite(Hi(Count));
  233. End;
  234.  
  235. {▒▒▒ SBStopDma: Stoppe le transfert DMA ▒▒▒}
  236. Procedure SBStopDma;
  237. Begin
  238.    SBWrite($D0);
  239. End;
  240.  
  241. {▒▒▒ SBContinueDma: Continue un transfert DMA interrompu ▒▒▒}
  242. Procedure SBContinueDma;
  243. Begin
  244.    SBWrite($D4);
  245. End;
  246.  
  247. {▓▓▓▓▓ Install/Uninstall handler d'irq ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓}
  248.  
  249. {░░░ SBIrqHandler: Handler d'irq ░░░}
  250. Procedure SBIrqHandler; interrupt; assembler;
  251. Asm
  252.         mov     [SBDmaDone],TRUE
  253.  
  254.         mov     dx,[SBPort]     {Sert à que dalle mais c'est dans la doc...}
  255.         or      dl,DSPDataState
  256.         in      al,dx
  257.  
  258.         mov     al,20h
  259.         cmp     [SBIrq],8
  260.         jb      @SBLowIrq
  261.         out     0a0h,al
  262.   @SBLowIrq:
  263.         out     020h,al
  264. End;
  265.  
  266. {▒▒▒ SBInit: Installe le handler d'irq ▒▒▒}
  267. Procedure SBInit;
  268. Begin
  269.    If SBIrq<8 then
  270.      Begin
  271.         GetIntVec(SBIrq+$8,OldHandlerAddr);
  272.         SetIntVec(SBIrq+$8,@SBIrqHandler);
  273.         Port[$21]:=Port[$21] and (not (1 shl SBIrq));
  274.      End
  275.    Else
  276.      Begin
  277.         GetIntVec(SBIrq+$70,OldHandlerAddr);
  278.         SetIntVec(SBIrq+$70,@SBIrqHandler);
  279.         Port[$A1]:=Port[$A1] and (not (1 shl (SBIrq and 7)));
  280.      End;
  281. End;
  282.  
  283. {▒▒▒ SBDone: UnInstalle le handler d'irq ▒▒▒}
  284. Procedure SBDone;
  285. Begin
  286.    If SBIrq<8 then SetIntVec(SBIrq+$8,OldHandlerAddr)
  287.               else SetIntVec(SBIrq+$70,OldHandlerAddr);
  288. End;
  289.  
  290. End.