Jouer du piano[tasm, port 388h, 389h, cf:code du hp]

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 / 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

Codes Sources

A voir également

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.