Programmation Système

    Les ports "Joysticks" étendus du STE et Falcon
 

Auteur: Laurent FAVARD

 

INTRODUCTION
 

 Le Falcon est equipé en standard de deux prises manettes dites étendues, tout droit héritées du STE. Elles ne furent pourtant jamais utilisées, ou bien alors très peu. Ces deux prises offrent pourtant bien des avantages car elles sont chacune equipées de deux entrées analogiques X et Y et permettent de plus de connecter des joysticks de type Jaguar.
 

 Dans cet article, nous allons voir ensemble comment utiliser d'une manière simple, ces prises joystick étendues, avec des exemples en C à l'appui.  Certains de nos lecteurs pourront peut-etre découvrir des possibilités d'utilisation, voyant la un moyen simple d'utiliser une manette Jaguar, ou bien d'utiliser les entrées analogiques.
 

LES ENTREES ANALOGIQUES
 

 Chaque prise étendue comporte deux entrées X et Y analogiques, qui sans entrer dans des détails d'électronique, acceptent en entrée non pas des valeurs "binaires", telle la présence ou non d'une tension, mais acceptent une grandeur électrique continue.
 

 L'électronique du STE et du Falcon mesure cette grandeur et nous en retourne directement un multiple, à la différence d'un bit à 0 ou 1, comme pour les entrées d'un Joystick classique. Il ne reste alors plus qu'à lire les valeurs qui nous  interressent directement dans des registres. Ce principe de gestion de Joysticks et le meme que nous retrouvons, par exemple, dans le monde PC. Il ne présente 
pourtant pas que des avantages, car à cause meme de la technique utilisée dans les Falcon et les PC, on remarquera que les valeurs échantillonées ne sont pas très précises. A moins de faire quelque-chose au niveau électronique, on notera que les valeurs ont tendance à osciller, bien qu'aucune action externes ne soient efectuée. Phénomène, que l'on ne retrouve pas, par exemple, sur les prises classiques "Joysticks" standards du Falcon.

 Pour autant, cela ne présente pas une grande gene, si on s'attache à filter ces oscillations soit de manière logicielle soit de manières cablée.
 

Le montage de test analogique
 

 Afin d'illustrer notre expérimentation, nous allons réaliser un montage  pour que chacun puisse se rendre compte par lui meme du fonctionnement.
 

 La figure 1, montre un schéma de branchement de deux potentiomètres sur les entrées X et Y, ainsi que du matériel nécessaire à la réalisation. Peut on faire plus simple ?
 
 

figure 1:


 


 Le principe du montage est de permettre ensuite, vous l'aurez deviné, de faire varier les valeurs X et Y, en faisant tourner les deux potentiomètres.
 
 

La programmation des entrées analogiques

 La programmation des entrées analogiques est ce qu'il y a de plus simple. Pour connaitre à tout moment l'état des potentiomètres, quatre adresses systèmes, présentées en figure 2, sont à disposition. Pour pouvoir y accéder, vous devrer en revanche faire un appel système afin de passer en mode superviseur, sinon 
vous vous retrouverez en présence d'une exception 680x0. Une fois votre lecture  terminée, ou votre programme achevé, n'oubliez pas non plus de repasser en mode  utilisateur.
 


figure 2:


 


Avec la déclaration suivante en langage C, nous disposons directement de variables contenant les valeurs qui nous interressent:
 

#define  XDIR0  *((unsigned char *)0x00FF9211L) 
#define  YDIR0  *((unsigned char *)0x00FF9213L) 
#define  XDIR1  *((unsigned char *)0x00FF9215L) 
#define  YDIR1  *((unsigned char *)0x00FF9217L) 
 

 Ansi, pour connaitre l'état de la valeur 'Paddle X0', on écrira en C ou en assembleur les lignes suivantes:

"C":  ValueX0 = XDIR0;  /* Lecture de l'état de l'entrée X0 */ 
"680x0": move.b  XDIR0,d0

Programme d'exemple analogique

 Le programme ci-dessous montre maintenant en langage C comment réaliser  l'accès aux registres des entrées analogiques, mais reste transposable en assembleur. D'abord nous mettons le 680x0 en mode Superviseur, puis nous effectuons les lectures des quatre adresses, enfin nous replacons le 680x0 en mode utilisateur.

Pour effectuer un essai, brancher votre montage sur la prise étendue 0 ou 1.

/* 
 programme simple de test de lecture analogique. 
 FAVARD laurent 1998, Pour ST-Mag. 
 
*/ 

#include <stdio.h> 
#include <tos.h> 

#define  XDIR0  *((unsigned char *)0x00FF9211L) 
#define  YDIR0  *((unsigned char *)0x00FF9213L) 
#define  XDIR1  *((unsigned char *)0x00FF9215L) 
#define  YDIR1  *((unsigned char *)0x00FF9217L) 

int main(void) 

 int     Key = 'Z'; 
 void    *Usp; 
 
 printf("\033E\033pLecture des entrées analogiques\033q\n"); 
 printf(     "\033p  FAVARD laurent, ST-Mag 1998  \033q\n"); 
 printf("Appuyer sur ESC pour quitter\n"); 
 
 Usp = (void *)Super(0L); 
 
 /* Affiche jusqu'à ESC apputé */ 
 while(Key != 0x1B) 
 { 
  /* Analog values */ 
  printf("Joy 0: X=$%X Y=$%X  Joy 1: X=$%X Y=$%X\r", XDIR0, YDIR0, XDIR1, YDIR1 ); 
 
  Key = (int)Crawio(0xFF); 
 } 
 
 Super( Usp ); 
 return(0); 

 Il ne vous reste plus qu'à réaliser un programme plus complet afin d'utiliser au mieux cet exemple. 
 
 

 

 LES ENTREES NUMERIQUES

 Les entrées numériques ont un fonctionnement relativement différent. En effet,
peu de connections sont disponibles sur les prises par rapport aux nombres de boutons 
sur la manette Jaguar. Atari à utilisé une technique qui consiste à interroger une 
manette pour connaitre l'état d'un sous-ensemble de boutons et non pas de tous à 
la fois. Pour connaitre l'état de tous les boutons, plusieurs accès sont nécessaires, afin d'interroger la manette tout entière. Mais avec Atari, c'est finalement très  simple (Comme d'habitude ?), car l'interrogation se résume à une écriture puis une lecture.
 

La programmation des entrées Numériques

 Ici aucun montage de test, il suffit de brancher une manette Jaguar sur une des prises étendues de votre Falcon ou STE. La programmation de ces manettes va etre un peu plus compliquée que la méthode précédente, mais comme vous le verrez, cela reste raisonnable. En effet, pour lire des valeurs quelconques il faut procéder comme suit:

 Tout d'abord, effectuez une écriture à l'adresse 0x00FF9202, o- l'on va y 
inscrire un masque pour indiquer quel ensemble de boutons nous voulons lire et pour
quelle prise étendue. Ensuite il ne reste plus qu'à faire une lecture pour obtenir
le résultat recherché. 

Les figures 3 et 4, présente quatre tableaux qui décrivent l'ensemble des masques
nécessaires à écrire, pour effectuer une lecture sur une manette. Un bouton appuyé,
c'est à dire actif, est lu à l'état BAS (0), alors qu'au repos nous le lirons à 
l'état HAUT (1).
 


figure 3: 

 


figure 4:

Exemple:

 Pour lire l'état des boutons UP/DOWN/LEFT/RIGHT de la manette 0, il faut tout d'abord écrire en 0x00FF9202 la valeur de masque 0xFFFE, puis lire à l'adresse 0x00FF9202 un mot de 16 bits. Ce mot contiendra alors dans les bits 8 à 11 l'état des boutons de direction du Joypad.

Autre exemple: 

 Pour lire l'état du bouton FIRE-0 et PAUSE de la manette 1, nous devons tout d'abord écrire en 0x00FF9202 la valeur de masque 0xFFEF, puis lire en  0x00FF9200 le mot qui contiendra l'état de nos deux boutons sur les bits 2 et 3.

 Comme pour les entrées analogiques, il faudra veiller à effectuer ces accès en mode Superviseur. 
 

Programme d'exemple numériques

 Le programme suivant montre à son tour comment utiliser une manette Jaguar.
Comme pour le précédent, nous mettons le 680x0 en mode Superviseur, nous effectuons les lectures puis nous retournons en mode utilisateur. Le programme ne traite uniquement que les directions des deux manettes, et ne les affiche que sous forme héxadécimal. En revanche on affiche plutot un UN pour indiquer qu'un bouton est appuyé. Comme exercice, vous pouvez le modifier afin de traiter l'ensemble des boutons.
 

/* 
 programme simple de test de lecture de manettes Jaguar sur Falcon et STE. 
 FAVARD laurent 1998, Pour ST-Mag. 
 
*/ 

#include <stdio.h> 
#include <tos.h> 

#define  JOYLOW  *((unsigned int *)0x00FF9200L) 
#define  JOYHIGH  *((unsigned int *)0x00FF9202L) 

int main(void) 

 int     Key = 'Z'; 
 void    *Usp; 
 int     Direction0, Direction1; 
 
 printf("\033E\033pLecture des entrées numériques\033q\n"); 
 printf(     "\033p  FAVARD laurent, ST-Mag 1998  \033q\n"); 
 printf("Brancher une manette Jaguar\n"); 
 printf("Appuyer sur ESC pour quitter\n"); 

 /* Avant d'effectuer des lectures, passer en Superviseur */ 
 Usp = (void *)Super(0L); 
 
 /* Maintenant on affiche sans cesse la direction du joypad 0 et 1*/ 
 while(Key != 0x1B) 
 { 
  /* Direction Joypad 0 */ 
  JOYHIGH  = 0xFFFE; 
  Direction0 = JOYHIGH; 

  /* Direction Joypad 1 */ 
  JOYHIGH  = 0xFFEF; 
  Direction1 = JOYHIGH; 

  Direction0 = ~Direction0 & 0x0F00; 
  Direction1 = ~Direction1 & 0xF000; 
 
  /* Affichage */ 
  printf("Direction0 = 0x%X  Direction1=0x%X\r", Direction0, Direction1); 
 
  Key = (int)Crawio(0xFF); 
 } 
 
 /* retourner en mode Utilisateur */ 
 Super( Usp ); 
 return(0); 

 

LE PROGRAMME JOYSTICK
 

Vous retrouverez les listings des programmes pécédents prets à l'emploi avec en plus, un exemple supplémentaire dénomé JOYSTICK, spécialement écrit pour vous, avec son code source. Celui-ci est bien plus complet, puisqu'il gère, totalement cette fois, les manettes Jaguar. Il fonctionne sous GEM, de préférence sur un écran couleur RVB ou VGA, ainsi que sous Magic5.13 ou TOS. Il n'acceptera de s'exécuter que sur Falcon et STE, puisque seul ces machines supportent les prises étendues (Sinon, c'est des bombes assurées !).
 

 Pour la partie Analogique, ce programme effectuera un test des deux prises, en dépla?ant un point central vert, ainsi que deux repères en axes x et y, sur un cadran dédié à chaque prise. Les valeur lues sont directement affichées dans des champs textes en héxadécimal. Vous pouvez ainsi brancher, par exemple, deux  exemplaires de ce montage simultanément.
 

 Pour la partie numérique, le programme reproduit deux manettes Jaguar, qui  reflète chacune l'état des boutons de chaque Joypad. Vous pouvez donc également connecter deux manettes simultanément sur vos deux prises étendues.

Conclusion

 Maintenant que nous avons vu l'utilisation des entrées analogiques et des manettes Jaguar, nous pouvons envisager bon nombre d'applications comme, par exemple, brancher un capteur de température pour effectuer des mesures, utiliser une manette Jaguar comme choix supplémentaire dans les jeux Falcon et STE... Mais c'est à vous de voir !

 Je tiens pourtant à vous faire remarquer, qu'après avoir parcouru l'ensemble de ma documentation système, je suis étonné qu'il n'existe pas d'appel système propres pour gérer ces fonctionnalités...C'est pourquoi, nous avons été obligés d'adresser directement les registres de la machine, ce qui est à proscrire a tout prix, si on souhaite etre compatible (Nous vivons à l'heure de l'Hadès et Milan...). Mais dans notre cas, c'est différent, étant donnée l'abscence d'appels officiels Atari.
 

Pour toutes questions d'ordre logiciel, vous pouvez me contacter à mon  adresse e-mail,
 l.favard@france2.fr