home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / demosrce / megscrol / sb_dma2.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-07-27  |  6.6 KB  |  254 lines

  1. {///////////////////////////////////////////////////////////////////////////}
  2. { Ca y est...  je  me suis  décidé  à mettre  le source  de MEGSCROL dans le
  3.   domaine public!  A mon point  de vue,  c'est  un petit programme assez peu
  4.   important,  mais c'est a priori  susceptible  d' intéresser  quelques  uns
  5.   d'entre vous.  Ceux-ci  sont  évidemment  curieux  de savoir  comment "ça"
  6.   marche! En fait, c'est relativement simple (une fois  que l'on a visualisé
  7.   le fichier PCX), sauf peut-être en ce qui concerne  la partie graphique en
  8.   BASM.  J'ai fait un effort violent  en réécrivant  les routines SB pour le
  9.   DMA  entièrement  en TP (à l'origine c'est en BASM et pour toute ligne IRQ
  10.   et canal DMA,  et avec  une réelle détection automatique du port). Voilà!,
  11.   sachez donc tirer profit  de ce petit cadeau  et évitez de faire partie du
  12.   club  très large  des  LAMERS  en "pompant"  bêtement  et en changeant les
  13.   textes des messages...
  14.  
  15.   Pour  de  plus  amples  informations,  d'éventuelles suggestions,  ou tout
  16.   simplement pour le fun, vous pouvez m'écrire à l'adresse suivante:
  17.  
  18.                                Patrick Ruelle
  19.                          43, av. de Grande Bretagne
  20.                                 98000 Monaco
  21.                             Principauté de Monaco
  22.  
  23.   Evidemment  je n'ai pas pris  la décision  de diffuser  ce source  dans le
  24.   but de demander de l'argent,  mais il va de soit que toutes sortes de dons
  25.   sont acceptés (carte  postale,  matos,  argent, spécialités locales, docs,
  26.   etc...).  N'oubliez pas non plus que cette diffusion ne m'enlève nullement
  27.   mes  droits d'auteur  de cette mmm... de démo;  ce petit package peut être
  28.   diffusé librement à condition de rester sous sa forme initiale:
  29.  
  30.  MEGSCROL.EXE  27/07/94  12208 L'exécutable utilisant MEGIMG et MEGSCROL.DGT
  31.  MEGSCROL.PAS  27/07/94  20923 Le source principal de la démo
  32.  SB_DMA2 .PAS  27/07/94   6805 Le source des routines DMA pour la SB
  33.  MEGSCROL.PCX  03/06/93  31894 L'image des polices au format PCX
  34.  MEGSCROL.RAW  27/07/94  64768    "     "     "    en format brut (img+pal)
  35.  MEGSCROL.DGT  03/06/94  41736 Le pattern sonore répétitif
  36.                         ------
  37.                TOTAL    178334
  38.  
  39.   La version  actuelle  est remaniée exprès pour la diffusion de ce package,
  40.   mais en fait ce programme date de début 1993...
  41.  
  42.                                           Patrick Ruelle (Monac) / GRYPHAEA }
  43. {///////////////////////////////////////////////////////////////////////////}
  44. UNIT SB_DMA2;{Uniquement pour IRQ=7 et DMA=1,  mais facilement adaptable}
  45.              {pour un autre IRQ et DMA. La détection automatique du port}
  46.              {de base se fait en testant les Dizaines avec InitDSP.     }
  47. INTERFACE
  48.  
  49.  
  50. VAR
  51.  s  :Pointer;
  52.  sze:WORD;
  53.  
  54.  
  55. FUNCTION  InitDSP(base:WORD):BOOLEAN;
  56. PROCEDURE SpeakerON;
  57. PROCEDURE SpeakerOFF;
  58. PROCEDURE ArreteDMA;
  59. PROCEDURE InitPlayback;
  60. PROCEDURE FinPlayBack;
  61.  
  62.  
  63. IMPLEMENTATION
  64.  
  65.  
  66. USES Crt,Dos;
  67.  
  68.  
  69. VAR
  70.  DSP_RESET,DSP_READ_DATA,
  71.  DSP_WRITE_DATA,
  72.  DSP_WRITE_STATUS,
  73.  DSP_DATA_AVAIL          :WORD;
  74.  OldIRQ                  :Pointer;
  75.  
  76.  
  77. FUNCTION InitDSP(base:WORD):BOOLEAN; {1<=base<=6 correspond à 210h à 260h}
  78. BEGIN
  79.   base:=base*$10;
  80.   {Calculs des adresses utiles}
  81.   DSP_RESET       :=base+$206;
  82.   DSP_READ_DATA   :=base+$20A;
  83.   DSP_WRITE_DATA  :=base+$20C;
  84.   DSP_WRITE_STATUS:=base+$20C;
  85.   DSP_DATA_AVAIL  :=base+$20E;
  86.   {Reinitialise le DSP}
  87.   Port[DSP_RESET]:=1;
  88.   Delay(30);
  89.   Port[DSP_RESET]:=0;
  90.   Delay(30);
  91.   IF (Port[DSP_DATA_AVAIL] AND $80=$80) AND (Port[DSP_READ_DATA]=$AA) THEN
  92.     InitDSP:=True
  93.   ELSE
  94.     InitDSP:=False;
  95. END;
  96.  
  97.  
  98. PROCEDURE EcritDSP(valeur:BYTE);
  99. BEGIN
  100.   WHILE Port[DSP_WRITE_STATUS] AND $80<>0 DO;
  101.   Port[DSP_WRITE_DATA]:=valeur;
  102. END;
  103.  
  104.  
  105. FUNCTION LitDSP:BYTE;
  106. BEGIN
  107.   WHILE Port[DSP_DATA_AVAIL] AND $80=0 DO;
  108.   LitDSP:=Port[DSP_READ_DATA];
  109. END;
  110.  
  111.  
  112. PROCEDURE EcritDAC(Commande:BYTE);
  113. BEGIN
  114.   EcritDSP($10);
  115.   EcritDSP(Commande);
  116. END;
  117.  
  118.  
  119. FUNCTION LitDAC:BYTE;
  120. BEGIN
  121.   EcritDSP($20);
  122.   LitDAC:=LitDSP;
  123. END;
  124.  
  125.  
  126. PROCEDURE SpeakerON;
  127. BEGIN
  128.   EcritDSP($D1);
  129. END;
  130.  
  131.  
  132. PROCEDURE SpeakerOFF;
  133. BEGIN
  134.   EcritDSP($D3);
  135. END;
  136.  
  137.  
  138. PROCEDURE ArreteDMA;
  139. BEGIN
  140.   EcritDSP($D0);
  141. END;
  142.  
  143.  
  144. PROCEDURE Playback;INTERRUPT; {Routine greffée sur l'IRQ déclenchée par le}
  145. VAR page,offset:WORD;         {DSP de la carte SoundBlaster en fin de DMA }
  146.     recu       :BYTE;
  147. BEGIN
  148.   {Accusé de réception}
  149.   recu:=Port[DSP_DATA_AVAIL];
  150.   {Calcul de l'adresse Physique et Page de la sequence}
  151.   sze:=41735;          {à ce niveau la taille est déja ajustée à -1}
  152.   offset:=Seg(s^) SHL 4+Ofs(s^);
  153.   page  :=(Seg(s^)+Ofs(s^) SHR 4) SHR 12;
  154.   {Préparation du DMAC pour le transfert}
  155.   Port[$0A]:=5;         {5=4+CanalDMA; donc 7=DMA3}
  156.   Port[$0C]:=0;
  157.   Port[$0B]:=$49;       {Via DAC}
  158.   Port[$02]:=Lo(offset);{06 pour DMA3}
  159.   Port[$02]:=Hi(offset);{06 pour DMA3}
  160.   Port[$83]:=page;
  161.   Port[$03]:=Lo(sze); {07 pour DMA3}
  162.   Port[$03]:=Hi(sze); {07 pour DMA3}
  163.   Port[$0A]:=1;         {Canal DMA}
  164.   {Activation du transfert par le DAC}
  165.   EcritDSP($14);
  166.   EcritDSP(Lo(sze));
  167.   EcritDSP(Hi(sze));
  168.   {Actualisation de la séquence à jouer; ici on est en tâche de fond}
  169.   {Avis de fin d'interruption au contrôleur d'INT}
  170.   Port[$20]:=$20;
  171. END;
  172.  
  173.  
  174. PROCEDURE ActiveIRQ(i:WORD);
  175. BEGIN
  176.   IF i<8 THEN
  177.     PORT[$21]:=PORT[$21] AND (NOT (1 SHL i))
  178.   ELSE
  179.   BEGIN
  180.     PORT[$A1]:=PORT[$A1] AND (NOT (1 SHL (i-8)));
  181.     PORT[$21]:=PORT[$21] AND (NOT (1 SHL 2));
  182.   END;
  183. END;
  184.  
  185.  
  186. PROCEDURE DesactiveIRQ(i:WORD);
  187. BEGIN
  188.   IF i<8 THEN
  189.     PORT[$21]:=PORT[$21] OR (1 SHL i)
  190.   ELSE
  191.   BEGIN
  192.     PORT[$A1]:=PORT[$A1] OR (1 SHL (i-8))
  193.   END;
  194. END;
  195.  
  196.  
  197. FUNCTION ChangeVecteurIRQ(i:WORD; Vec:POINTER):POINTER;
  198. VAR
  199.  p:POINTER;
  200.  j:WORD;
  201. BEGIN
  202.   IF i<8 THEN
  203.     j:=i+$08
  204.   ELSE
  205.     j:=i+$68;
  206.   GetIntVec(j,p);
  207.   SetIntVec(j,Vec);
  208.   ChangeVecteurIRQ:=p;
  209. END;
  210.  
  211.  
  212. PROCEDURE InitPlayback;
  213. VAR time_constant:WORD;
  214.     page,offset,
  215.     taille       :WORD;
  216. BEGIN
  217.   {Définit la fréquence}
  218.   time_constant:=256-1000000 DIV 11000; {11Khz}
  219.   EcritDSP($40);
  220.   EcritDSP(time_constant);
  221.   SpeakerON;
  222.   taille:=41735;
  223.   offset:=Seg(s^) SHL 4+Ofs(s^);
  224.   page  :=(Seg(s^)+Ofs(s^) SHR 4) SHR 12;
  225.   Port[$0A]:=5;
  226.   Port[$0C]:=0;
  227.   Port[$0B]:=$49;
  228.   Port[$02]:=Lo(offset);
  229.   Port[$02]:=Hi(offset);
  230.   Port[$83]:=page;
  231.   Port[$03]:=Lo(taille);
  232.   Port[$03]:=Hi(taille);
  233.   Port[$0A]:=1;
  234.   {La routine PlayBack est sur l'IRQ 7}
  235.   OldIRQ:=ChangeVecteurIRQ(7,@PlayBack);
  236.   ActiveIRQ(7);
  237.   EcritDSP($14);
  238.   EcritDSP(Lo(taille));
  239.   EcritDSP(Hi(taille));
  240. END;
  241.  
  242.  
  243. PROCEDURE FinPlayBack;
  244. VAR p:Pointer;
  245. BEGIN
  246.   ArreteDMA;
  247.   DesactiveIRQ(7);
  248.   p:=ChangeVecteurIRQ(7,OldIRQ);
  249.   SpeakerOFF;
  250. END;
  251.  
  252.  
  253. END.
  254.