Un premier programme  
Un premier programme

  -- Le site --
· News
· Moi
· Liens
·
 Forum
· Me Contacter

  -- Mes projets sur TI --
· Blib
· Librairie PolySnd
· PolySnd Player
· PolySnd MIDI Converter
· PolySnd Converti
· Arkanoid
· Nebulus

 

  -- Rubriques --
· PolySnd v1.0
· PolySnd v1.2
· PolySnd v1.3
· PolySnd v2.0
· Guide de programmation

 

   

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.