home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / speaker / speaker.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-31  |  3KB  |  74 lines

  1. uses crt,dos;
  2. const voclast:Byte=0;           {dernière valeur}
  3.       trigger=5;                {sensibilité}
  4.       Fini:Boolean=false;     {prêt ?}
  5. var   oldint8:Pointer;          {ancien Handler IRQ 0}
  6.       Voc:Pointer;              {pointe sur données Sample dans la mémoire}
  7.       VocFile:File;             {fichier Voc}
  8.       timwert,                  {valeur pour chim timer}
  9.       vocpos,                   {Offset en cours dans fichier Voc}
  10.       voclen,                   {longueur du fichier VOC}
  11.       Hz:Word;                  {fréquence Sample}
  12.  
  13. Procedure Play;interrupt;assembler;
  14. {joue Voc dans l'interruption}
  15. asm
  16.   mov dx,61h                    {lire contenu du port de contrôle}
  17.   in al,dx
  18.   mov cl,al                     {sauver dans cl}
  19.   les di,voc                    {es:di charger avec pointeur sur les données Sample}
  20.   inc vocpos                    {avancer position d'un point}
  21.   mov ax,vocpos                 {charger dans ax}
  22.   add di,ax                     {ajouter à la mémoire offset}
  23.   cmp ax,voclen                 {déjà arrivé à la fin de Sample ?}
  24.   jne @ok                       {oui,}
  25.   mov Fini,1                  {alors positionner flag}
  26. @ok:
  27.   mov al,es:[di]                {chercher valeur}
  28.   mov bl,al                     {sauver dans bl}
  29.   sub al,voclast                {calculer différence par rapport à la dernière valeur}
  30.   mov voclast,bl                {et répertorier valeur comme dernière valeur}
  31.   cmp al,trigger                {distance plus grande que seuil de tolérance ?}
  32.   jg @set                       {alors règler speaker sur high}
  33.   cmp al,-trigger               {distance plus pétite que seuil de tolérance négatif ?}
  34.   jg @Fin                      {non, alors prêt}
  35.   mov al,cl
  36.   and al,not 2                  {effacer Bit 1}
  37.   out dx,al                     {et écrire}
  38.   jmp @Fin                     {prêt}
  39. @set:
  40.   mov al,cl                     {ancien contenu du port de contrôle}
  41.   or al,2                       {positionner bit 1}
  42.   out dx,al                     {et écrire}
  43. @Fin:
  44.   pushf                         {appel de l'ancien Handler}
  45.   call [oldint8]
  46. End;
  47.  
  48. begin
  49.   Assign(VocFile,'thirty.voc');  {Ouvrir fichier}
  50.   Reset(VocFile,1);             {Faire marche en arrière}
  51.   Voclen:=FileSize(VocFile);    {Détermine la taille du fichier}
  52.   GetMem(Voc,Voclen);           {allocation de mémoire correspondante}
  53.   BlockRead(VocFile,Voc^,FileSize(VocFile));
  54.                                 {lecture du fichier Voc (max. 64kB)}
  55.   Close(VocFile);               {et fermer}
  56.   Hz:=1000000 div               {détermine la fréquence sample du fichier}
  57.     (256-Byte(Ptr(Seg(Voc^),Ofs(Voc^)+$1f)^));
  58.  
  59.   GetIntVec($8,OldInt8);        {sauver vecteur IRQ 0}
  60.   SetIntVec($8,@Play);          {rédiriger IRQ 0 sur Handler}
  61.  
  62.    timwert := 1193180 DIV Hz;   {calculer timer-start à partir de la fréquence sampling}
  63.    Port[$43]:=$36;               {le programmer sur le compteur 0}
  64.    Port[$40]:=Lo(timwert);
  65.    Port[$40]:=Hi(timwert);
  66.  
  67.   Repeat Until KeyPressed or Fini;  {attendre, jusqu'à la fin de la touche}
  68.  
  69.   SetIntVec($8,OldInt8);        {rétablir vecteur}
  70.   Port[$43]:=$36;               {marche arrièrre du Timer}
  71.    Port[$40]:=0;                {(18,2 Hz)}
  72.    Port[$40]:=0;
  73. End.
  74.