|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
JOUER DU PIANO[TASM, PORT 388H, 389H, CF:CODE DU HP]
Information sur la source
Description
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
- .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
.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
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
|