; programme de generation de musique : chicken.s
:debut
lda adnot ; recupere adresse de la premiere note
sta tmpadnot ; sauvegarde temporaire
; lecture des parametres cnote et duree
:oksuivante
lda tmpadnot ; recuperation du pointeur note
sta dyn0 + 1 ;
:dyn0
lda zero ;
sta dyn1 + 1 ; modifie l'instruction suivante pour faire un chargement indirect
:dyn1
lda zero ; en fait recupere le compteur de periode
sta cnote ; et sauvegarde dans cnote
lda tmpadnot ;
adc un ;
sta dyn2 + 1 ;
:dyn2
lda zero ; recupere adresse la duree de la note
sta dyn3 + 1 ; modifie l'instruction suivante pour faire un chargement indirect
:dyn3
lda zero ; on fait on recupere la duree de la note
sta duree
lda tmpadnot ;
adc deux ;
sta tmpadnot ;
; jeu de la note
lda zero ; mise a 0 de duree_l
sta duree_l
lda cnote ; si cnote=0 : silence=> transit est a 0
jnz jeu_note ; et le buzzer ne change pas d'etat
lda zero
sta transit
jmp loop2
:jeu_note
lda un ; si cnote !=0 : son =>transit est a 1
sta transit
:loop2 ; boucle de periode
lda cnote
sta note
:loop3 ; boucle de periode cnote
lda duree_l
sub un ; decrementation de duree
sta duree_l
jnz cont1
lda duree
sub un
sta duree
jnz cont2
jmp fin_note ; la note est jouee quand duree=0
:cont1
nop zero ; les 4 NOP sont la pour avoir une duree constante quand duree_l
nop zero ; passe de 255 a 0 (ou duree est decremente)
nop zero
nop zero
:cont2
lda note
sub un ; decrementation de note
sta note
jnz loop3
lda bz
xor transit ; inversion de bz si transit=1 (il y a du son dans ce cas)
out bz ; et sortie de bz sur le haut parleur
sta bz
jmp loop2
:fin_note
lda tmpadnot ; a t on fini la musique ?
adc adfin ;
jnc oksuivante ;
jmp debut ; c'est reparti
; constantes
:zero .db 0
:un .db 1
:deux .db 2
:adnot .db music
:adfin .db 255-finmusic
; variables temporaires
:tmpadnot .db 0
:cnote .db 0
:duree .db 0
:duree_l .db 0
:bz .db 0
:note .db 0
:transit .db 0
; la gamme
:mi0 .db 202
:fa0 .db 191
:sol0 .db 170
:la0 .db 151
:si0 .db 135
:do1 .db 127
:re1 .db 113
:mi1 .db 100
:fa1 .db 95
:sol1 .db 85
:la1 .db 75
:si1 .db 67
:do2 .db 63
:re2 .db 56
:mi2 .db 50
:fa2 .db 47
:sol2 .db 42
:silence .db 0
; duree
:d_croche .db 20
:croche .db 40
:noire .db 80
:blanche .db 160
; la musique (note , duree)
:music .db mi2
.db croche
.db do2
.db croche
.db sol1
.db croche
.db mi1
.db croche
.db do1
.db croche
.db mi1
.db croche
.db la1
.db croche
.db mi1
.db croche
.db sol1
.db croche
.db la1
.db croche
.db la0
.db croche
.db mi1
.db croche
.db sol1
.db noire
.db sol0
.db noire
.db mi2
.db croche
.db do2
.db croche
.db sol1
.db croche
.db mi1
.db croche
.db do1
.db croche
.db mi1
.db croche
.db la1
.db croche
.db mi1
.db croche
.db sol1
.db croche
.db la1
.db croche
.db sol0
.db croche
.db si1
.db croche
.db do2
.db noire
.db sol0
.db noire
.db mi2
.db croche
.db sol2
.db croche
.db mi1
.db croche
.db mi2
.db croche
.db do2
.db croche
.db mi2
.db croche
.db mi1
.db croche
.db do2
.db croche
.db sol1
.db noire
.db mi1
.db noire
.db la1
.db noire
.db mi1
.db noire
.db mi2
.db croche
.db sol2
.db croche
.db mi1
.db croche
.db mi2
.db croche
.db do2
.db croche
.db mi2
.db croche
.db mi1
.db croche
.db do2
.db croche
.db sol1
.db noire
.db do2
.db croche
.db si1
.db croche
.db do2
.db noire
.db sol0
.db noire
:finmusic
.db silence
.db blanche
:debut
lda adnot ; recupere adresse de la premiere note
sta tmpadnot ; sauvegarde temporaire
; lecture des parametres cnote et duree
:oksuivante
lda tmpadnot ; recuperation du pointeur note
sta dyn0 + 1 ;
:dyn0
lda zero ;
sta dyn1 + 1 ; modifie l'instruction suivante pour faire un chargement indirect
:dyn1
lda zero ; en fait recupere le compteur de periode
sta cnote ; et sauvegarde dans cnote
lda tmpadnot ;
adc un ;
sta dyn2 + 1 ;
:dyn2
lda zero ; recupere adresse la duree de la note
sta dyn3 + 1 ; modifie l'instruction suivante pour faire un chargement indirect
:dyn3
lda zero ; on fait on recupere la duree de la note
sta duree
lda tmpadnot ;
adc deux ;
sta tmpadnot ;
; jeu de la note
lda zero ; mise a 0 de duree_l
sta duree_l
lda cnote ; si cnote=0 : silence=> transit est a 0
jnz jeu_note ; et le buzzer ne change pas d'etat
lda zero
sta transit
jmp loop2
:jeu_note
lda un ; si cnote !=0 : son =>transit est a 1
sta transit
:loop2 ; boucle de periode
lda cnote
sta note
:loop3 ; boucle de periode cnote
lda duree_l
sub un ; decrementation de duree
sta duree_l
jnz cont1
lda duree
sub un
sta duree
jnz cont2
jmp fin_note ; la note est jouee quand duree=0
:cont1
nop zero ; les 4 NOP sont la pour avoir une duree constante quand duree_l
nop zero ; passe de 255 a 0 (ou duree est decremente)
nop zero
nop zero
:cont2
lda note
sub un ; decrementation de note
sta note
jnz loop3
lda bz
xor transit ; inversion de bz si transit=1 (il y a du son dans ce cas)
out bz ; et sortie de bz sur le haut parleur
sta bz
jmp loop2
:fin_note
lda tmpadnot ; a t on fini la musique ?
adc adfin ;
jnc oksuivante ;
jmp debut ; c'est reparti
; constantes
:zero .db 0
:un .db 1
:deux .db 2
:adnot .db music
:adfin .db 255-finmusic
; variables temporaires
:tmpadnot .db 0
:cnote .db 0
:duree .db 0
:duree_l .db 0
:bz .db 0
:note .db 0
:transit .db 0
; la gamme
:mi0 .db 202
:fa0 .db 191
:sol0 .db 170
:la0 .db 151
:si0 .db 135
:do1 .db 127
:re1 .db 113
:mi1 .db 100
:fa1 .db 95
:sol1 .db 85
:la1 .db 75
:si1 .db 67
:do2 .db 63
:re2 .db 56
:mi2 .db 50
:fa2 .db 47
:sol2 .db 42
:silence .db 0
; duree
:d_croche .db 20
:croche .db 40
:noire .db 80
:blanche .db 160
; la musique (note , duree)
:music .db mi2
.db croche
.db do2
.db croche
.db sol1
.db croche
.db mi1
.db croche
.db do1
.db croche
.db mi1
.db croche
.db la1
.db croche
.db mi1
.db croche
.db sol1
.db croche
.db la1
.db croche
.db la0
.db croche
.db mi1
.db croche
.db sol1
.db noire
.db sol0
.db noire
.db mi2
.db croche
.db do2
.db croche
.db sol1
.db croche
.db mi1
.db croche
.db do1
.db croche
.db mi1
.db croche
.db la1
.db croche
.db mi1
.db croche
.db sol1
.db croche
.db la1
.db croche
.db sol0
.db croche
.db si1
.db croche
.db do2
.db noire
.db sol0
.db noire
.db mi2
.db croche
.db sol2
.db croche
.db mi1
.db croche
.db mi2
.db croche
.db do2
.db croche
.db mi2
.db croche
.db mi1
.db croche
.db do2
.db croche
.db sol1
.db noire
.db mi1
.db noire
.db la1
.db noire
.db mi1
.db noire
.db mi2
.db croche
.db sol2
.db croche
.db mi1
.db croche
.db mi2
.db croche
.db do2
.db croche
.db mi2
.db croche
.db mi1
.db croche
.db do2
.db croche
.db sol1
.db noire
.db do2
.db croche
.db si1
.db croche
.db do2
.db noire
.db sol0
.db noire
:finmusic
.db silence
.db blanche