Atari

Un accessoire en GFA

Jean-Luc Antoine - 25/07/2002

Accessoirement vôtre...

Voici un grand saut en arrière, d'il y a plus de 10 ans. Un langage de programmation reignait sur le monde Atari, le GFA. Pour les nostalgiques, voici comment créer un accessoire GEM pour y implanter n'importe quel utilitaire...

Vous venez d'écrire l'utilitaire du siècle en GFA, mais hélas c'est un programme à part entière ? Qu'importe, vous pourrez bientôt le transformer pour qu'il devienne utilisable depuis n'importe quelle application depuis la barre de menu. Le principe est assez complexe, mais le GFA permet d'y remédier en très peu de lignes. Par commodité, votre programme devra figurer dans une procédure qui sera exécutée dès que l'accessoire sera appelé. Il vous faut commencer par réserver suffisamment de place mémoire (par défaut, le GFA réserve toute la mémoire disponible) pour la bonne exécution de votre programme, grâce à la commande de compilation $m. Nous allons réserver dans notre cas 35 Ko de mémoire, ce qui est bien plus qu'il n'en faut. Notre accessoire sera un player de musique soundship, qui permettra de rejouer en interruption sous le bureau des musiques crées avec Megatizer, le super éditeur soundchip qui était fourni sur une des disquettes de STMag. Il sera donc possible de programmer en GFA tout en continuant d'entendre une splendide musique de Mad Max... Mais revenons à nos moutons...

Les bibliothèques AES disposent de la fonction APPL_INIT() (dans la bibliothèque d'application) qui fournit le handle (numéro d'identification) du programme en GFA. Si une erreur se produit, l'appel de cette fonction renvoie -1. Une fois l'identification de notre application effectuée, une fonction de la bibliothèque des menus permet d'installer notre application dans la barre de menus, et de lui assigner un nom qui y apparaîtra. De même, cette fonction nous renvoie la valeur -1 si une erreur s'est produite, comme par exemple lorsque toutes les entrées prévues pour les accessoires sont déjà remplies. Si ces préliminaires se sont bien déroulés, il nous suffit d'attendre en scruttant indéfiniment les évènements qui se produisent, grâce à la bibliothèque d'évènements qui dispose de la fonction EVNT_MESAG(0). Le résultat de l'évènement est stocké dans le buffer du GFA de menu(1) à menu(8). Si l'on peut détecter que menu(1)=40, alors c'est que notre accessoire vient d'être sélectionné dans la barre du menu. Nous pouvons alors passer la main à notre programme.

Je vous présente donc une petite adaptation des routines de Megatizer. Le Inline fait office de buffer, mais il aurait très bien pu être remplacé par un Malloc pour alouer de la place mémoire pour charger la musique. Nous n'avons besoin que de peu de fonctions pour notre accessoire: charger et jouer une musique, ainsi que de la stopper. Je vous laisse étudier par vous-même la suite du programme qui ne présente aucune difficulté.
En résumé, voici la marche à suivre pour se créer son accessoire:
-Réserver de la place mémoire,
-Enregistrer l'identifiant de l'application,
-Installer l'accessoire dans la barre de menu
-Tester sans arrêt s'il est appelé.
J'espère avoir été assez clair, donc pour vous récompenser, voici le listing du player de musique en GFA. Bon amusement!

$ m35000        !On réserve suffisamment de mémoire: 35 Ko
playing!=FALSE
identifiant&=APPL_INIT()
IF identifiant&<>-1     !Erreur avec APPL_INIT
  registre&=MENU_REGISTER(identifiant&,"  ST Magazine nø67")
  IF registre&<>-1      !Tout s'est bien passé
    DO                  !Boucle sans fin
      ~EVNT_MESAG(0)    !Attend un évènement
      IF MENU(1)=40     !Accessoire sélectionné
        GOSUB mon_programme
      ENDIF
    LOOP
  ELSE                  !Pas assez de place dans le menu
    ALERT 4,"Faites-moi |de la place ! ",1,"OK",tmp
  ENDIF
ENDIF
PROCEDURE mon_programme
  ' Ici se loge le programme proprement dit que l'accessoire va exécuter
  ALERT 4,"Exemple d'accessoire |   en GFA !!!",1,"Super!",tmp
  ALERT 4,"  Zike Soundship en |interruption sous GEM ",1-(playing!=TRUE),"Load|STOP|Exit",tmp
  ' on réserve de la place pour la zike
  INLINE buffer%,30000
  IF (tmp=1) AND (playing!=FALSE)
    ' On charge et on joue une zike de Megatizer
    FILESELECT CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\*.THK","",nomfichier$
    OPEN "i",#1,nomfichier$       ! Charge un fichier au format
    BGET #1,buffer%,LOF(#1)       ! du génialissime Megatizer
    CLOSE #1
    ~XBIOS(&H26,L:buffer%)         ! Initialise la musique
    SLPOKE &H4D2,buffer%+8         ! la rejoue à chaque VBL
    playing!=TRUE
  ELSE IF (tmp=2) AND (playing!=TRUE)
    SLPOKE &H4D2,0                !Stop la zike
    ~XBIOS(&H26,L:buffer%+4)      !Eteind toutes les voix et remet en place le interruptions
    SPOKE &H484,15                !Réactive le stupide "Biiip" du clavier
    playing!=FALSE
  ENDIF
RETURN
Server Info
Remote Info
Compress

Batchs
BootSector
Droit
Accessoire GFA
On Now
Ecran plasma
Système d'exploitation
Son
Unités
Scripting
Multilingue
Site Web
Bruit et son
Architecture Google


4K
Color picker
TaskList
Backup files
Mini Port Scanner
Website To CHM
PixyDemo
Web password recovery
4KWebServer
Kill Popup
VBE decoder
Script Optimizer
Database Password Recovery
Class
Ini
EMail validator
Graphical Class
MP3 Info
Pinger Class
IP ranger class
SoftwareMetering
Path Validator
Time Stamper Class
LoggerCLS
HTA
Keyword Ranking
DOM Explorer
HTA-Notepad
PixyPortManager
Other
flashMessage
Kill Popup
VBE decoder (fixed)
Error Codes
Maze generator
Char counter
HTML To Word
ICQ Choose User
ScreenSaver Password decoder
Mp3Playlister - singleList
Long Filename To Short
Trace Math
Dump Hexa File
Self modifying script
Mp3Playlister - multiList
HTANoid
PixyWebServer
Python
Progress indication

©2002 Jean-Luc Antoine. All Rights Reserved. Scripts or any other material on this website may not be redistributed or put as part of ANY collection (script archives, CDs etc) without prior written permission. Permission granted to use and modify any of the scripts found on InterClasse.com