INCLUDE EQMON Appel des equates. TTL MONITEUR MO5: MUSIQUE ELECTRONIQUE * ***** VERSION HARD MO5 * SECT MUSIK ******************************************************************************* * Programme de generation de musique : la note a jouer est passee par * * l'accumulateur B. Elle est executee en fonction des parametres : * * OCTAVE : nombre de fois qu'il faut repeter la 1/2 periode fonda- * * mentale donnee par B * * DUREE : nombre de fois que l'on repete le diviseur de temps (255) * * avant de modifier le rapport cyclique (attaque) * * TEMPO : multiplicateur de duree - la duree relle est egale a * * TEMPO * DUREE * * TIMBRE : nombre indiquant la deviation (en + et en - sur les deux * * 1/2 periodes) du rapport cyclique, chaque fois que duree * * est ecoulee. * * Les registres utilises sont : * * TEMPO, DUREE, MUSFLG (indique que le diviseur est passe par 0), * * TIMBRE, OCTAVE * * * ******************************************************************************* PULSEC EQU SAVEST DIVISR EQU SAVEST+1 PULSE0 EQU TEMP PULSE1 EQU TEMP+1 INTERN NOTE NOTE EQU * ORCC #%11010000 Protection contre les interruptions LDA DUREE+1 Duree et Tempo: seuls les 8 LSB de ces LDB TEMPO+1 Registres sur 16 bits sont significatifs. PSHS A Pour ralentir la musique qui va plus vite LSRA sur MO5 que sur TO7, et qui doit fonctionner LSRA avec les memes parametres, on ajoute a la duree ADDA ,S+ une valeur proportionnelle (DUREE/4). MUL Duree totale = tempo * duree * 5/4 --> TFR D,Y Y servira de compteur de la duree totale. LDB 4,S Recuperation de B detruit par le "MUL". ANDB #$0F On ne conserve que les 4 LSB qui servent BEQ OCTBAS Cas du silence. LDX #TABNOT-1 Table des frequences. B qui est non nul sert LDB B,X d'offset dans la table des frequences. * * Correction pour l'octave superieure * LDA OCTAVE+1 Octave vaut 1 pour la derniere fois DECA BNE OCTBAS Ce n'est pas le cas SUBB #2 Retire 2 pour la derniere octave * OCTBAS EQU * TFR B,A B sert au 1/2 PULSE "1" et A au 1/2 PULSE "0" * NOTE1 EQU * STD PULSE0 BEQ NOTE0 Silence. LDX OCTAVE On repositionne la valeur de l'octave. AGAIN1 EQU * LDB PRB-PRA,U U pointe sur PRA ORB #$01 Bit0 de PRB = son force a 1. STB PRB-PRA,U LDB PULSE1 On passe la duree du 1 a PLAY. BSR PLAY Jouer le 1 ( lere partie du pulse ) LEAX -1,X Decrement de l'octave qui a ete chargee dans X. BNE AGAIN1 Tant que octave non finie, on rejoue le 1. * NOTE0 EQU * LDX OCTAVE On repositionne la valeur de l'octave. AGAIN0 EQU * LDB PRB-PRA,U U pointe sur PRA ANDB #$FE Bit0 de PRB : son force a 1. STB PRB-PRA,U LDB PULSE0 BSR PLAY Jouer le 0 ( 2eme partie du pulse ) LEAX -1,X Decrement de l'octave qui a ete chargee dans X. BNE AGAIN0 Tant que octave non finie, on rejoue le 0. * LDD PULSE0 Fin de pulse, changement d'attaque ? ADDA TIMBRE La valeur du 0 augmente de timbre, BCS NOTE0 SUBB TIMBRE et celle du 1 diminue d'autant. BHI NOTE1 Continue tant que la duree n'est pas nulle BRA NOTE0 Pulse 1 negatif, on reste a zero. PLAY EQU * STB PULSEC 1/2 PULSE a jouer LOOP01 EQU * DECB Decrement de la note. BNE LOOP01 Boucle la plus interne LDB PULSEC Diviseur de temps (init. arbitraire). BEQ SILENT ADDB DIVISR Ce diviseur est incremente par pas de "B" CMPB DIVISR Le diviseur a-t-il fait un tour? (passe $FF). STB DIVISR Sauvegarde du diviseur. BHS EXPLAY Non ==> on ne touche ni a duree, ni a tempo. SILENT EQU * LEAY -1,Y Decrement du compteur de duree totale, qui BEQ EXNOTE est independant de la note et de 1'octave. EXPLAY EQU * RTS Retour de PLAY: revient dans NOTE0 ou NOTE1 EXNOTE EQU * PULS D,PC Pour depiler l'adresse de retour de PLAY et RTS * **** TABLE DES FREQUENCES DE L'OCTAVE SUPERIEURE (4) * TABNOT EQU * FCB $B0 FCB $A5 FCB $9C FCB $92 FCB $89 FCB $81 FCB $78 FCB $71 FCB $6A FCB $63 FCB $5D FCB $57 FCB $51 END