|
 |
-- Le
site -- |
 |
|
 |
-- Mes
projets sur TI -- |
 |
|
 |
--
Rubriques -- |
 |
|
|
|
|
Guide
de programmation pour PolySnd 2.0 en ASM et en C.
Un
premier programme:
Nous
allons réaliser notre premier programme audio,
le but de ce programme et de jouer une fréquence
précise pendant une certaine durée, nous
allons donc aborder les bases pour programmer correctement
avec PolySnd v2.0. Au départ nous devons choisir
le langage dans le quel nous voulons créer notre
programme sous TIGCC, pour cela si vous coder en Assembleur
il vous suffit de cliquer sur 'File/New/Project'
Vous
devez donc obtenir un projet vierge sans fichier ni code.

Si
vous désirer apprendre à utiliser PolySnd
v2.0 en programmant en C, vous devez créer une
nouvelle feuille de code en cliquant sur le menu 'File/New/C
Source File'
Si
vous désirer apprendre à utiliser PolySnd
v2.0 en programmant en ASM, vous devez créer une
nouvelle feuille de code en cliquant sur le menu 'File/New/A68K
Assembly Source File'
Maintenant
nous devons inclure au projet la librairie PolySnd v2.0,
dans le cas de l'ASM nous nous contenterons d'inclure
seulement le header (bibliothèque de fonctions)
qui ce trouve dans le répertoire 'header/Dynamique/ASM/polysnd2.h'
de PolySnd, quand au projet en C nous devons inclure le
bon header et la librairie (portant
l'extension a), pour cela vous devez inclure l'header
ce trouvant dans le répertoire 'header/Statique/C/polysnd2.h'
et la librairie qui ce trouve dans le dossier 'bin/polysnd2.a'.
Pour
ajouter un fichier à votre projet vous devez cliquer
sur le menu 'Project/Add
Files...' dans l'environnement de TIGCC.

Une
fois cette étape réalisé vous devez
posséder une liste de 2 fichier pour le projet
en ASM et 3 fichiers pour le projet en C.
Nouveau
projet utilisant PolySnd v2.0 en Assembleur:

Nouveau
projet utilisant PolySnd v2.0 en C:

Il
vous reste à enregistrer le projet et à
renommer le fichier principal (New File). Ceci est la
base de tout programme en C ou en ASM sur TIGCC, de plus
nous avons inclut la librairie audio PolySnd v2.0, beaucoup
d'autres librairies procéde de cette façon
comme ExtGraph, GraphX ou encore XLib mais fonctionnant
qu'avec un certain type de formats et de programmation
qui sont expliquer dans la documentation, sachez que pour
PolySnd v2.0 il est possible de programmer en Nostub et
en Kernel, de plus dans le langage de programmation de
son choix (en ASM ou en C).
Dans
la convention de ce guide nous utiliserons le format Kernel
pour la programmation en ASM qui nécessitera sur
votre calculatrice une version de Preos
(0.67 ou supérieur) et polysnd2.**z
(suivant votre modèle de TI). Quand à la
programmation en C nous utiliserons le format Nostub et
donc la possibilité d'avoir directement la librairie
dans son programme, par conséquent votre programme
fonctionnera sans Preos et sans la librairie polysnd2.**z
sur votre calculatrice.
Réalisation
du programme:
Attaquons-nous maintenant à la réalisation
de notre programme qui aura pour but de jouer un LA à
une fréquence de 440 Hz de durée 3 secondes
avec un tempo de 120 bpm.
Comment
allons nous faire? C'est simple, il suffira tout d'abord
d'appliquer par défaut un code nécessaire
pour le bon fonctionnement de PolySnd v2.0 (ce code n'est
pas obligatoire, il s'occupe de désactiver les
auto int n°1 et n°2, voir
la documentation de PolySnd pour plus d'informations sur
ce sujet). Ensuite nous allons initialiser la librairie
PolySnd avec les fonctions EnableSound et
InstallSound et nous allons ensuite réaliser
le code permettant de créer une fréquence
de 440 Hz.
Code
en ASM:
; Assembly Source File
; Created 09/10/2003, 22:16:51
include "doorsos.h" ;Bibliothèque Kernel avec ROM_CALLS
include "polysnd2.h" ;Librairie PolySnd v2.0
xdef _ti89 ;Compile pour TI89
xdef _ti92plus ;Compile pour TI92+
xdef _main ;Entrée du programme
xdef _comment ;Commentaire du programme
_main:
move.w #$0700,d0 ;Désactive toutes les interruptions
trap #1
move.l $64,int1 ;Sauvegarde l'adresse de l'auto-int n°1
move.l $68,int2 ;Sauvegarde l'adresse de l'auto-int n°2
move.l #empty_handler,$40064 ;Inhibe auto int n°1
move.l #empty_handler2,$40068 ;Inhibe auto int n°2
moveq.w #0,d0
trap #1 ;Active toutes les interruptions
bsr GetCalculator ;Renvoie le model de TI dans calc
jsr polysnd2::EnableSound ;Active le port I/O en mode son
jsr polysnd2::InstallSound ;Installe PolySnd
;Votre code
;-----------------------------------------------------
;Fonction qui attend l'appuye d'une touche
;-----------------------------------------------------
loop_key: ;Boucle clavier
cmp.b #0,calc ;Si TI89
beq key_89 ;key_89
bne key_92 ;key_92 focntionne aussi sur V200
key_89:
move.w #6,d0 ;Repére ESC
bsr masque
btst.b #0,d0
beq fin ;Si pressé fin
bne loop_key ;Sinon loop
key_92:
move.w #8,d0 ;Repéré ESC
bsr masque
btst.b #6,d0
beq fin ;Si pressé fin
bra loop_key ;sinon loop
fin:
jsr polysnd2::UninstallSound ;Désinstalle PolySnd
jsr polysnd2::DisableSound ;Remet le port I/O à son état par défaut.
move.w #$0700,d0 ;Désactive interruptions
trap #1
move.l int1(PC),$40064 ;Remet à son état courant l'auto int 1
move.l int2(PC),$40068 ;Remet à son état courant l'auto int 2
moveq #0,d0
trap #1 ;Active interruptions
rts
;Interruption vide, l'auto int n°1 ne sera pas executé
empty_handler:
rte
;Désactive l'auto int n°2
empty_handler2:
sf.b $60001b ;Permet d'inhiber l'interruption clavier du TIOS
rte
;----------------------------------
;Detection de la calculatrice
;----------------------------------
GetCalculator:
move.l a1,-(a7) ;Sauvegarde a1
move.l $C8,a0 ;Addresse pour vérifier si TI-89 ou TI-92 Plus
move.b #1,calc ;Prédéfinis comme TI-92 Plus
move.l a0,d1 ;Prépare d1
and.l #$400000,d1 ;Si ~0 alors TI-92 Plus sinon TI-89 ou V200
bne __calculator ;Dans cas TI-92 Plus alors Fin
move.b #0,calc ;Prédéfinis comme TI-89
move.l $2F*4(a0),a1 ;Prépare condition
cmp.b #200,2(a1) ;Si 200 alors TI-89
bcs __calculator ;Donc Fin
move.b #2,calc ;Donc V200
__calculator:
move.l (a7)+,a1 ;Restaure a1
rts
;----------------------------------------------------------------------
;Masque pour la lecture du clavier
;********************************************
;********************************************
;masque une ligne du clavier
;----------------------------------------------------------------------
;d0=ligne -> d0=réponse
;;********************************************
masque:
move.l d1,-(a7)
move.w #$FFFE,d1
rol.w d0,d1
clr.w d0
move.w d1,($600018)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
move.b ($60001B),d0
move.l (a7)+,d1
rts
;------------
;Variables
;------------
int1 dc.l 0 ;Ancienne auto int n°1
int2 dc.l 0 ;Ancienne auto int n°2
calc dc.b 0 ;Modèle de la calculatrice
;Commentaire du programme
_comment dc.b "Example 1",0
end
|
Voici
le code de base d'un programme en ASM utilisant PolySnd,
avant de d'installer PolySnd nous désactivons les
interruptions inutile pour permettre d'utiliser au maximum
les ressources du processeur, nous récupérons
le modèle de la calculatrice dans la variable calc,
ensuite nous appelons PolySnd qui s'occupe d'installer
l'interruption audio. La fonction suivante s'occupe seulement
de faire une boucle jusqu'à ce que la touche ESC
soit pressé et ce sur n'importe quel modèle
de calculatrice.
Nous
allons donc ajouter le code nécessaire pour créer
du son et donc jouer notre fréquence de 440 Hz,
si vous essayez tel quel ce programme vous n'obtiendrez
pas grand chose, pour l'instant nous attendons l'appui
sur la touche ESC pour quitter.
Voici le programme
final avec le code ajouté:
; Assembly Source File
; Created 09/10/2003, 22:16:51
include "doorsos.h" ;Bibliothèque Kernel avec ROM_CALLS
include "polysnd2.h" ;Librairie PolySnd v2.0
xdef _ti89 ;Compile pour TI89
xdef _ti92plus ;Compile pour TI92+
xdef _main ;Entrée du programme
xdef _comment ;Commentaire du programme
_main:
move.w #$0700,d0 ;Désactive toutes les interruptions
trap #1
move.l $64,int1 ;Sauvegarde l'adresse de l'auto-int n°1
move.l $68,int2 ;Sauvegarde l'adresse de l'auto-int n°2
move.l #empty_handler,$40064 ;Inhibe auto int n°1
move.l #empty_handler2,$40068 ;inhibe auto int n°2
moveq.w #0,d0
trap #1 ;Active toutes les interruptions
bsr GetCalculator ;Renvoie le modèle de TI dans calc
jsr polysnd2::EnableSound ;Active le port I/O en mode son
jsr polysnd2::InstallSound ;Installe PolySnd
;Nouveau code
;-----------------------------------------------------
move.w #120,d0 ;Prépare le tempo à 120 bpm sur le canal 1
jsr polysnd2::SetTempo_voice1
move.b #_MONO,d0 ;Régle PolySnd en mode MONO, seul le canal 1 sera utilisé
jsr polysnd2::PlayMode
move.w #440,d0 ;Régle la fréquence à 440 Hz
move.b #192,d0 ;De durée 3*(32*2) cycles (1 temp = 32cycles) donc 3s
jsr polysnd2::SetBeep_voice1 ;Paramètres pour SetBeep_voice1
move.b #_VOICE1,d0 ;Active que le canal 1 (le son est en mono)
jsr polysnd2::SetState
;-----------------------------------------------------
;Fonction qui attend l'appuye d'une touche
;-----------------------------------------------------
loop_key: ;Boucle clavier
jsr polysnd2::GetState ;Récupére l'état des canals
cmp.b #_VOICE1,d0 ;Compare VOICE1 avec d0
bne fin ;VOICE1 terminée alors fin
;-----------------------------------------------------
cmp.b #0,calc ;Si TI89
beq key_89 ;key_89
bne key_92 ;key_92 focntionne aussi sur V200
key_89:
move.w #6,d0 ;Repére ESC
bsr masque
btst.b #0,d0
beq fin ;Si pressé fin
bne loop_key ;Sinon loop
key_92:
move.w #8,d0 ;Repéré ESC
bsr masque
btst.b #6,d0
beq fin ;Si pressé fin
bra loop_key ;sinon loop
fin:
jsr polysnd2::UninstallSound ;Désinstalle PolySnd
jsr polysnd2::DisableSound ;Remet le port I/O à son état par défaut.
move.w #$0700,d0 ;Désactive interruptions
trap #1
move.l int1(PC),$40064 ;Remet à son état courant l'auto int 1
move.l int2(PC),$40068 ;Remet à son état courant l'auto int 2
moveq #0,d0
trap #1 ;Active interruptions
rts
;Interruption vide, l'auto int n°1 ne sera pas executé
empty_handler:
rte
;Désactive l'auto int n°2
empty_handler2:
sf.b $60001b ;Permet d'inhiber l'interruption clavier du TIOS
rte
;----------------------------------
;Detection de la calculatrice
;----------------------------------
GetCalculator:
move.l a1,-(a7) ;Sauvegarde a1
move.l $C8,a0 ;Addresse pour vérifier si TI-89 ou TI-92 Plus
move.b #1,calc ;Prédéfinis comme TI-92 Plus
move.l a0,d1 ;Prépare d1
and.l #$400000,d1 ;Si ~0 alors TI-92 Plus sinon TI-89 ou V200
bne __calculator ;Dans cas TI-92 Plus alors Fin
move.b #0,calc ;Prédéfinis comme TI-89
move.l $2F*4(a0),a1 ;Prépare condition
cmp.b #200,2(a1) ;Si 200 alors TI-89
bcs __calculator ;Donc Fin
move.b #2,calc ;Donc V200
__calculator:
move.l (a7)+,a1 ;Restaure a1
rts
;----------------------------------------------------------------------
;Masque pour la lecture du clavier
;********************************************
;********************************************
;masque une ligne du clavier
;----------------------------------------------------------------------
;d0=ligne -> d0=réponse
;;********************************************
masque:
move.l d1,-(a7)
move.w #$FFFE,d1
rol.w d0,d1
clr.w d0
move.w d1,($600018)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
move.b ($60001B),d0
move.l (a7)+,d1
rts
;------------
;Variables
;------------
int1 dc.l 0 ;Ancienne auto int n°1
int2 dc.l 0 ;Ancienne auto int n°2
calc dc.b 0 ;Modèle de la calculatrice
;Commentaire du programme
_comment dc.b "Example 1",0
end
|
Ce
guide ne comportera que cette exemple de programme
utilisant PolySnd v2.0 en ASM.
Il
ne vous reste plus qu'à essayer ce programme
sur votre calculatrice, si celui-ci ne ce compile
pas ou ne s'exécute pas correctement, veuillez
vérifier que vous avez tout tapé correctement.
Télécharger
example1.zip en ASM
Code
en C:
Nous
allons maintenant écrire le même programme
mais en C. Voyons voir à quoi ressemble le
code de base.
//
C Source File
// Created 11/10/2003; 17:13:50
#include
<tigcclib.h>
#include "polysnd2.h"
INT_HANDLER OldInt1
=
NULL;
INT_HANDLER OldInt2 =
NULL;
DEFINE_INT_HANDLER
(myint2)
{
pokeIO (0x60001B,0);
}
//Programme
principal
void
_main(void)
{
OldInt1 = GetIntVec (AUTO_INT_1);
OldInt2 = GetIntVec (AUTO_INT_2);
SetIntVec (AUTO_INT_1,
DUMMY_HANDLER);
SetIntVec (AUTO_INT_2,
myint2);
pSnd_EnableSound ();
pSnd_InstallSound ();
while(_keytest
(RR_ESC)==FALSE);
pSnd_UninstallSound ();
pSnd_DisableSound ();
SetIntVec (AUTO_INT_1,
OldInt1);
SetIntVec (AUTO_INT_2,
OldInt2);
}
|
Ceci
est la base d'un programme en C utilisant PolySnd
v2.0, ce programme ne fait pas grand chose, il attend
juste l'appui de la touche ESC. Voyons voir ce que
donne le code en C pour jouer une fréquence
de 440 Hz pendant 3 secondes, qui peut être
à tout moment interrompus.
Voici
le programme final avec le code ajouté:
//
C Source File
// Created 11/10/2003; 17:13:50
#include
<tigcclib.h>
#include "polysnd2.h"
INT_HANDLER OldInt1
=
NULL;
INT_HANDLER OldInt2 =
NULL;
DEFINE_INT_HANDLER
(myint2)
{
pokeIO (0x60001B,0);
}
//Programme
principal
void
_main(void)
{
OldInt1 = GetIntVec (AUTO_INT_1);
OldInt2 = GetIntVec (AUTO_INT_2);
SetIntVec (AUTO_INT_1,
DUMMY_HANDLER);
SetIntVec (AUTO_INT_2,
myint2);
pSnd_EnableSound ();
pSnd_InstallSound ();
pSnd_SetTempo_voice1
(120);
pSnd_PlayMode (MONO);
pSnd_SetBeep_voice1 (440,192);
pSnd_SetState (VOICE1);
while
((_keytest
(RR_ESC)==FALSE)
&& (pSnd_GetState()==VOICE1));
pSnd_UninstallSound ();
pSnd_DisableSound ();
SetIntVec (AUTO_INT_1,
OldInt1);
SetIntVec (AUTO_INT_2,
OldInt2);
}
|
Voilà
donc le programme finit, comme vous le remarquez
nous avons tout d'abord réglé le tempo
à 120 bpm sur le canal n°1, puis ensuite
nous avons configuré la librairie en mono.
Nous avons réglé la fonction SetBeep
sur le canal n°1 et ensuite avec SetState
nous permettons de jouer ce mode. Reste à
dire au programme d'attendre la pression de la touche
ESC ou la fin du mode SetBeep pour
quitter le programme.
Si
vous voulez plus d'explications sur les fonctions
de PolySnd v2.0, veuillez lire la documentation
fournis dans le pack.
Télécharger
example1.zip en C
Rubrique
suivante.
|
|
|