home *** CD-ROM | disk | FTP | other *** search
- ;Routine de restitution 8 bits pour STE.
- ;(C)oderight NulloS//DNT 1992
- ;
- ;
- ; Pour restituer le son, il faut utiliser la même fréquence que
- ;celle d'échantillonnage, sinon le son va être déformé.
- ; Par exemple,si vous utilisez un son digitalisé a 12,5Khz, il faut
- ;le restituer à une fréquence de 12,5Khz.
- ; Le problème sur STE, c'est que le choix des fréquences est restreint,
- ;ce qui oblige à :
- ; o Digitaliser pile à la bonne fréquence le sample.
- ; o Re-échantilloner par calcul le sample vers une fréquence
- ; compatible avec le STE.
- ; Le deuxième cas est à proscrire, car il baisse sensiblement la qualité
- ;de l'échantillon. C'est pourtant ce qui est fait dans un soundtracker,
- ;mais c'est dans ce cas particulier la seule solution.
- ; Les fréquences disponibles sur STE sont 6258Hz,12517Hz,25033Hz et 50066Hz
- ;Le tout en mono ou en stéréo. Je n'ai pas de sample stéréo à vous offrir,
- ;donc on s'en passera (de toute facon, digitaliser en stéréo a très peu
- ;d'intérêt, ca double la taille du sample et ca n'apporte rien de bien
- ;extraordinaire).La stéréo n'est utile que pour les musiques de type
- ;soundtracker (ce qui n'est pas notre propos).
- ; Et il y a la programmation du LMC, mais pour lui, reportez vous à l'article
- ;du mag'...
- ;
- ;
-
- include a:\hard_sys.s
-
- Start move.l 4(sp),a6 ;récupère page de base
- move.l $c(a6),a0 ;Taille programme
- adda.l $14(a6),a0 ; + données
- adda.l $1c(a6),a0 ; + variables
- lea 256+2048(a0),a0 ; + page de base+pile
- move.l a0,d0 ;
- andi.w #-2,d0 ;arondir à un nombre pair
- move.l d0,sp ;nouvelle pile
- adda.l a6,sp ;
- move.l d0,-(sp) ;taille à conserver
- move.l a6,-(sp) ;à partir de la page de base
- move.l #$004a0000,-(sp) ;Mshrink. Rend le reste au
- trap #1 ;Gemdos.
- lea 12(sp),sp ;rétablit la pile
-
- clr.l -(sp) ;passage en superviseur
- move.w #$20,-(sp) ;
- trap #1 ;
- addq.l #6,sp ;
- move.l d0,save_SSP ;sauve la pile système
- move.b conterm.w,save_conterm;et les paramètres clavier
- clr.b conterm.w ;coupe le bip clavier
- bsr Wait_Kbd ;
- move.b #$12,KBD_data.w ;
-
- bsr InitLMC ;met le LMC comme il faut
- lea sample,a0
- lea endsample,a1
- lea bclsample,a2
- bsr InitDMA ;lance la digit
- presskey move.l #$000bffff,-(sp) ;demander l'état shift,control
- trap #13 ;et altenrate
- addq.l #4,sp ;
- and.w #$f,d0 ;Pressée(s) ?
- beq.s presskey ;non, attendre encore
-
- exit bsr KillDMA ;couper la digit
- bsr ExitLMC ;mettre le LMC aux valeur de défaut
- bsr Wait_Kbd ;attendre clavier
- move.b #$8,KBD_data.w ;reprendre les transferts
- ;souris
- move.b save_conterm,conterm.w;et remettre bip clavier
- move.l save_SSP,-(sp) ;repasse en utilisateur
- move.w #$20,-(sp) ;
- trap #1 ;
- clr.w (sp) ;et cassos
- trap #1 ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- InitLMC movem.l d0-d1/a0-a1,-(sp) ;
- lea PCM_base.w,a0 ;adresse registres du PCM
- move.w #_mcw_pmask,mcw_mask(a0);installe mask LMC
- lea IL_data(pc),a1 ;valeur de début
- moveq #5,d1 ;5 réglages à faire
- IL_bcl move.w (a1)+,d0 ;un de plus
- bsr SendLMC ;on l'envoie
- dbf d1,IL_bcl ;
- movem.l (sp)+,d0-d1/a0-a1 ;
- rts ;
- IL_data dc.w _master_vol+40,_left_vol+20,_right_vol+20
- dc.w _treble+6,_bass+6,_pcm_mix+2
- ;Volume à 40 (maximum), voix gauches et droite à 20 (maximum de ces
- ;"sous-volumes",aigus et graves à 6 (normal),sample seul.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;Passe D0 au LMC. Le masque du LMC doit avoir été mis auparavant
- ;à $7FF une fois au moins. Et A0 doit être égal à PCM_base
- ;On débute par une attente avec dbf, car sinon le LMC n'a pas le temps
- ;de commencer à envoyer la donnée précédente, et on se mélange les
- ;pinceaux !!.
- SendLMC move.w d0,-(sp) ;sauve D0 en attendant
- move.w #99,d0 ;petite boucle pour laisser
- dbf d0,* ;le temps au LMC de commencer
- move.w (sp)+,d0 ;le transfert précédent..
- cmpi.w #_mcw_pmask,mcw_mask(a0);transfert achevé ?
- bne.s *-6 ;non, attendre
- move.w d0,mcw_data(a0) ;demande le transfert de D0
- rts ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ExitLMC movem.l d0-d1/a0-a1,-(sp) ;même chose, mais valeurs
- lea PCM_base.w,a0 ;un peu différentes.
- lea EL_data(pc),a1 ;pas besoin du mask, déjà mis
- moveq #5,d1
- EL_bcl move.w (a1)+,d0
- bsr SendLMC
- dbf d1,EL_bcl
- movem.l (sp)+,d0-d1/a0-a1
- rts
-
- EL_data dc.w _master_vol+40,_left_vol+20,_right_vol+20
- dc.w _treble+6,_bass+6,_pcm_mix+1
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- InitDMA movem.l d0/a3,-(sp) ;sauve les registres
- lea PCM_base.w,a3 ;adresse DMA
- move.b #_spl_off,pcm_mode(a3);coupe un éventuel DMA
- move.b #_mono+_Khz12,pcm_ctrl(a3);monophonie à 12Khz
- move.l a0,d0 ;début de sample
- move.b d0,spl_startl(a3) ;fixe l'octet faible
- lsr.w #8,d0 ;
- move.b d0,spl_startm(a3) ;octet moyen
- swap d0 ;
- move.b d0,spl_starth(a3) ;et octet fort
- move.l a1,d0 ;fin du sample, idem
- move.b d0,spl_endl(a3) ;fixe l'octet faible
- lsr.w #8,d0 ;
- move.b d0,spl_endm(a3) ;octet moyen
- swap d0 ;
- move.b d0,spl_endh(a3) ;et octet fort
- move.b #_spl_many,pcm_mode(a3) ;joue en boucle
- ;maintenant le DMA est lancé et va boucler. On va charger par avance l'adresse
- ;de la boucle. Quand le DMA va arriver en fin de sample, il va alors reprendre
- ;depuis la dernière adresse de début qu'on lui a indiqué.Ici, ce sera A2
- ;Puis lorsqu'il bouclera les fois suivantes, il reprendra cette valeur pour
- ;boucler, car on ne l'aura pas modifié...
- move.l a2,d0 ;boucle du sample
- move.b d0,spl_startl(a3) ;fixe l'octet faible
- lsr.w #8,d0 ;
- move.b d0,spl_startm(a3) ;octet moyen
- swap d0 ;
- move.b d0,spl_starth(a3) ;et octet fort
- movem.l (sp)+,d0/a3
- rts
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- KillDMA move.l a0,-(sp)
- lea PCM_base.w,a0
- move.b #_spl_off,pcm_mode(a0)
- move.l (sp)+,a0
- rts
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- Wait_Kbd btst #1,KBD_stat.w ;clavier près à recevoir ?
- beq.s Wait_Kbd ;non, attendre
- rts ;c'est bon !
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- SECTION DATA
-
- sample incbin flut_pan.spl ;sample à restituer
- endsample equ * ;son adresse fin
- bclsample equ sample+40962 ;bouclage
-
- SECTION BSS
- save_SSP ds.l 1
- save_conterm
- ds.w 1
-