Pour compiler:
TASM nomdufichier
TLINK nomdufichier
On pourrait dire que c'est la version amélioré de ma source sur le haut-parleur de la carte mère!
Les touches sont azertyui et ESC pour quitter
Source / Exemple :
.386
code segment use16
;octaves
octave0 equ 0000h
octave1 equ 0400h
octave2 equ 0800h
octave3 equ 0C00h
octave4 equ 1000h
octave5 equ 1400h
octave6 equ 1800h
octave7 equ 1C00h
;les notes
_DO equ 2AEh
_RE equ 181h
_MI equ 1B0h
_FA equ 1CAh
_SOL equ 202h
_LA equ 241h
_SI equ 287h
;dièse
DOD equ 16Bh
RED equ 198h
FAD equ 1E5h
SOLD equ 220h
LAD equ 263h
;makecodes
A equ 16
Z equ 17
E equ 18
R equ 19
T equ 20
Y equ 21
U equ 22
I equ 23
O equ 24
P equ 25
;breakcodes
_ESC equ 81h
assume cs:code,ds:code
prog:
push cs
pop ds
xor ax,ax
mov es,ax
mov eax, es:[09h*4]
mov oldirq1, eax ;sauvegarde de l'IRQ1 lié à l'INT 09h (sinon PANIC)
mov ax, cs
shl eax, 16
mov ax, offset irq1
mov es:[09h*4], eax ;place celle du code présent
;reset de tout les registres FM
xor al,al
xor bl,bl
reset:
call ad_port
inc al
cmp al,0F6h
jnz reset
;Canal 1 OP1
mov al,20h ;AM=0 vibrato=0 EG=0 KSR=0 Multi=1
mov bl,1
call ad_port
mov al,40h ;40 dB
mov bl,10h
call ad_port
mov al,60h ;attack=très rapide Decay=le plus long
mov bl,0F0h
call ad_port
mov al,80h ;sustain=moyen release=moyen
mov bl,77h
call ad_port
;canal 1 OP2
mov al,23h ;Même paramètre
mov bl,1
call ad_port
mov al,43h ;40 dB
mov bl,10h
call ad_port
mov al,63h ;Même paramètre
mov bl,0F0h
call ad_port
mov al,83h ;Même paramètre
mov bl,77h
call ad_port
boucle:
mov bx,_DO+octave3
cmp scode,A ;touche a DO3
jz chgnote
mov bx,_RE+octave4
cmp scode,Z ;touche z RE4
jz chgnote
mov bx,_MI+octave4
cmp scode,E ;touche e MI4
jz chgnote
mov bx,_FA+octave4
cmp scode,R ;touche r FA4
jz chgnote
mov bx,_SOL+octave4
cmp scode,T ;touche t SOL4
jz chgnote
mov bx,_LA+octave4
cmp scode,Y ;touche y LA4
jz chgnote
mov bx,_SI+octave4
cmp scode,U ;touche u SI4
jz chgnote
mov bx,_DO+octave4
cmp scode,I ;touche i DO4
jz chgnote
cmp scode,_ESC ;test si la touche ESC est relâché
jnz boucle
fin:
mov eax, oldirq1 ;restauration de l'Int 09h
mov es:[09h*4], eax
mov al,0B0h ;on éteint
mov bl,11h
call ad_port
mov ah,4Ch
int 21h ;on quitte
chgnote:
mov al,0A0h
call ad_port
mov al,0B0h
mov bl,bh
or bl,20h
call ad_port
jmp boucle
;Routine d'envoi de commandes
;al=registre
;bl=données
ad_port:
pushad
mov dx,388h
out dx,al
mov ecx,6
wait6:
in al,dx
loop wait6
inc dx
mov al,bl
out dx,al
dec dx
mov ecx,35
wait35:
in al,dx
loop wait35
popad
ret
irq1:
push ax
in al,60h ;Lecture du Scancode
mov scode,al
cmp al,81h ;Test de la touche Esc relÔchÚe
jz irqfin
jge break
jmp irqfin
break:
cmp al,0E0h ;Teste si le code E0h est prÚsent pour les touches Útendues
jz .e0
cmp al,0E1h ;Teste si le code E1h est prÚsent (seul la touche Pause l'utilise)
jz .e0
jmp irqfin
.e0:
irqfin:
mov al,20h
out 20h,al ;End Of Interrupt
pop ax
iret ;Comme ret sauf pour interruption
oldirq1 dd ? ;sauvegarde de l'ancienne adresse de l'IRQ1 (irq du clavier)
scode db 0 ;test du code 81h c'est le BreakCode de la touche Echap qui permettra de quitter le programme
code ends
end prog
Conclusion :
Ce code doit marcher sur la plupart des cartes sons puisque c'est de la programmation des cartes Adlib. Mais ne marche pas sur certains OS comme windows 2000
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.