|
AtariUn accessoire en GFAJean-Luc Antoine - 25/07/2002Accessoirement 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é. $ 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
|
|||||
|
|