home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / speaker / play_frq.asm next >
Assembly Source File  |  1994-10-31  |  4KB  |  127 lines

  1. data segment
  2. c equ 523                       ;fréquences sonores
  3. d equ 587
  4. e equ 659
  5. f equ 698
  6. g equ 784
  7. a equ 880
  8. h equ 988
  9.  
  10. Song:     dw c,250, d,250, e,250, f,250, g,500, g,500
  11.           dw a,250, a,250, a,250, a,250, g,500
  12.           dw a,250, a,250, a,250, a,250, g,500
  13.           dw f,250, f,250, f,250, f,250, e,500, e,500
  14.           dw d,250, d,250, d,250, d,250, c,500
  15.           dw 0                  ;Se termine tjs avec 0
  16.  
  17. oldInt     dd 0                 ;Pointe sur l'ancien Handler
  18. compteur   dw 0                  ;Décrementation du compteur, 1/ms
  19. data ends
  20.  
  21. code segment
  22. assume cs:code,ds:data
  23.  
  24. handler proc far                ;nnouveau IRQ 0 - Handler
  25.   pushf
  26.   call dword ptr oldint         ;appel de l'ancien Handler
  27.   mov ax,data                   ;permet l'accès au segment de données
  28.   mov ds,ax
  29.   dec word ptr compteur          ;décremente compteur
  30.   iret
  31. handler endp
  32.  
  33. prepare proc near               ;prépare Timer et Speaker
  34.   mov dx,61h                    ;charger Controll-Port
  35.   in al,dx
  36.   or al,3                       ;positionner bits inférieurs (enable Speaker)
  37.   out dx,al
  38.  
  39.   mov al,36h                    ;accès en écriture Timer 0
  40.   mov cx,04a9h                  ;distance interruptions 1 ms
  41.   out 43h,al                    ;envoyer commande
  42.   mov al,cl
  43.   out 40h,al                    ;envoyer valeur du timer
  44.   mov al,ch
  45.   out 40h,al
  46.  
  47.   mov ax,3508h                  ;lire ancien vecteur d'interruption
  48.   int 21h
  49.   mov word ptr oldint,bx        ;sauver vecteur
  50.   mov word ptr oldint+2,es
  51.   push ds
  52.   mov ax,cs                     ;Vecteur sur Handler dans ds:dx
  53.   mov ds,ax
  54.   lea dx,handler
  55.   mov ax,2508h                  ;positionner nouveau vecteur
  56.   int 21h
  57.   pop ds
  58.   ret
  59. prepare endp
  60.  
  61. close proc near                 ;positionne timer et speaker vers l'arrière
  62.   push ds
  63.   lds dx,oldint                 ;retablir ancien vecteur
  64.   mov ax,2508h
  65.   int 21h
  66.  
  67.   mov al,36h                    ;positionne timer vers l'arrière
  68.   out 43h,al
  69.   xor al,al
  70.   out 40h,al                    ;sur 18,2 interruptions/seconde
  71.   out 40h,al
  72.  
  73.   mov dx,61h                    ;éteint Speaker
  74.   in al,dx
  75.   and al,not 3                  ;efface Speaker enable
  76.   out dx,al
  77.   pop ds
  78.   ret
  79. close endp
  80.  
  81. delay proc near                 ;attente (temps en ax en ms)
  82.   mov compteur,ax                ;charger compteur
  83. Loop1:
  84.   cmp compteur,0                 ;attendre l'interruption
  85.   jne Loop1                      ;jusqu'au moment le compteur est à 0
  86.   ret
  87. delay endp
  88.  
  89. sound proc near
  90.   mov bx,ax                     ;Frequenz vers bx
  91.   mov al,0b6h                   ;programmer Timer 2 sur rectangle
  92.   out 43h,al
  93.   mov dx,0012h                  ;1.193 MHz fréquence d'entrée
  94.   mov ax,34ddh
  95.   div bx                        ;calculer valeur timer
  96.   out 42h,al                    ;Low-Byte à  Timer 2
  97.   mov al,ah
  98.   out 42h,al                    ;High-Byte à Timer 2
  99.   ret
  100. sound endp
  101.  
  102. start proc
  103.   mov ax,data                   ;permet l'accès au segment de données
  104.   mov ds,ax
  105.  
  106.   call prepare                  ;initialise Timer et Speaker 
  107.  
  108.   lea si,song                   ;pointe sur fréquences
  109.  
  110. Suivant:
  111.   lodsw                         ;chercher fréquence
  112.   or ax,ax
  113.   je Fini                     ;byte final trouvé ?
  114.   call sound                    ;émettre son
  115.   lodsw                         ;charger durée
  116.   call delay                    ;et attendre
  117.   jmp Suivant
  118.  
  119. Fini:
  120.   call close                    ;mettre timer et interruptions en arrière
  121.   mov ah,4ch                    ;terminer programme
  122.   int 21h
  123. start  endp
  124.  
  125. code ends
  126. end start
  127.