home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
speaker
/
play_frq.asm
next >
Wrap
Assembly Source File
|
1994-10-31
|
4KB
|
127 lines
data segment
c equ 523 ;fréquences sonores
d equ 587
e equ 659
f equ 698
g equ 784
a equ 880
h equ 988
Song: dw c,250, d,250, e,250, f,250, g,500, g,500
dw a,250, a,250, a,250, a,250, g,500
dw a,250, a,250, a,250, a,250, g,500
dw f,250, f,250, f,250, f,250, e,500, e,500
dw d,250, d,250, d,250, d,250, c,500
dw 0 ;Se termine tjs avec 0
oldInt dd 0 ;Pointe sur l'ancien Handler
compteur dw 0 ;Décrementation du compteur, 1/ms
data ends
code segment
assume cs:code,ds:data
handler proc far ;nnouveau IRQ 0 - Handler
pushf
call dword ptr oldint ;appel de l'ancien Handler
mov ax,data ;permet l'accès au segment de données
mov ds,ax
dec word ptr compteur ;décremente compteur
iret
handler endp
prepare proc near ;prépare Timer et Speaker
mov dx,61h ;charger Controll-Port
in al,dx
or al,3 ;positionner bits inférieurs (enable Speaker)
out dx,al
mov al,36h ;accès en écriture Timer 0
mov cx,04a9h ;distance interruptions 1 ms
out 43h,al ;envoyer commande
mov al,cl
out 40h,al ;envoyer valeur du timer
mov al,ch
out 40h,al
mov ax,3508h ;lire ancien vecteur d'interruption
int 21h
mov word ptr oldint,bx ;sauver vecteur
mov word ptr oldint+2,es
push ds
mov ax,cs ;Vecteur sur Handler dans ds:dx
mov ds,ax
lea dx,handler
mov ax,2508h ;positionner nouveau vecteur
int 21h
pop ds
ret
prepare endp
close proc near ;positionne timer et speaker vers l'arrière
push ds
lds dx,oldint ;retablir ancien vecteur
mov ax,2508h
int 21h
mov al,36h ;positionne timer vers l'arrière
out 43h,al
xor al,al
out 40h,al ;sur 18,2 interruptions/seconde
out 40h,al
mov dx,61h ;éteint Speaker
in al,dx
and al,not 3 ;efface Speaker enable
out dx,al
pop ds
ret
close endp
delay proc near ;attente (temps en ax en ms)
mov compteur,ax ;charger compteur
Loop1:
cmp compteur,0 ;attendre l'interruption
jne Loop1 ;jusqu'au moment le compteur est à 0
ret
delay endp
sound proc near
mov bx,ax ;Frequenz vers bx
mov al,0b6h ;programmer Timer 2 sur rectangle
out 43h,al
mov dx,0012h ;1.193 MHz fréquence d'entrée
mov ax,34ddh
div bx ;calculer valeur timer
out 42h,al ;Low-Byte à Timer 2
mov al,ah
out 42h,al ;High-Byte à Timer 2
ret
sound endp
start proc
mov ax,data ;permet l'accès au segment de données
mov ds,ax
call prepare ;initialise Timer et Speaker
lea si,song ;pointe sur fréquences
Suivant:
lodsw ;chercher fréquence
or ax,ax
je Fini ;byte final trouvé ?
call sound ;émettre son
lodsw ;charger durée
call delay ;et attendre
jmp Suivant
Fini:
call close ;mettre timer et interruptions en arrière
mov ah,4ch ;terminer programme
int 21h
start endp
code ends
end start