Programme musical

; 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