Accueil > > > JOUER DU PIANO[TASM, PORT 388H, 389H, CF:CODE DU HP]
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
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
SQL SERVER : QUERY NOTIFICATION OU COMMENT êTRE NOTIFIé DE MODIFICATIONS DE DONNéES CôTé APPLICATIONSQL SERVER : QUERY NOTIFICATION OU COMMENT êTRE NOTIFIé DE MODIFICATIONS DE DONNéES CôTé APPLICATION par christian
Cette fonctionnalité à vue le jour dans Ado.Net 2.0 et s'appuie sur SQL Server 2005 (et plus) même si elle fonctionne avec SQL Server 2000. Le principe de fonctionnement côté applicatif est assez simple, on fournit une requête et lorsque le résultat d...
Cliquez pour lire la suite de l'article par christian [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg [MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA[MIX10] KEYNOTE DEUXIèME JOURNéE - INTERNET EXPLORER 9, HTML5, VISUAL STUDIO 2010, ODATA par cyril
Le deuxième keynote du mix fut très riche en contenu. Internet Explorer 9 Juste un après le lancement de Internet Explorer 8, Microsoft a dévoilé les nouveautés de Internet Explorer 9. Désormais, IE supportera HTML5, SVG et CSS3. L'élément ...
Cliquez pour lire la suite de l'article par cyril
Forum
RE : ASSEMBLEURRE : ASSEMBLEUR par ghuysmans99
Cliquez pour lire la suite par ghuysmans99 RE : ASSEMBLEURRE : ASSEMBLEUR par ghuysmans99
Cliquez pour lire la suite par ghuysmans99 ASSEMBLEURASSEMBLEUR par solleil
Cliquez pour lire la suite par solleil
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|