|
|||||||||||||||||||||||||||||||||||||||||||
|
Nous entamons ce mois-ci une nouvelle série sur le matériel de l'Amiga. Depuis le Copper jusqu'au Blitter, en passant par les sprites et le DMA disque et audio, nous verrons ensemble ces merveilleux composants électroniques qui font de l'Amiga le meilleur ordinateur du moment. Vous avez déjà sans doute pu voir à droite et à gauche - surtout à gauche - des articles sur ce sujet, et vous êtes gavés des barres de Copper, des BOB et autres tracés de droites... Bien sûr, nous n'y échapperons pas, mais l'approche sera différente. Plutôt que de nous contenter d'une description bête et méchante des puces, telle que l'on peut en trouver dans le RKM Hardware ou la Bible de l'Amiga, nous nous attacherons à mettre en oeuvre certaines particularités dudit matériel. ![]() CIA 8520A-1 présent dans les A1000, A2000 et A500 Généralites Il en faut tout de même... Le CIA est un Complex Interface Adaptor. En d'autres termes et plus simplement, c'est un circuit capable de gérer plusieurs choses en même temps. Ainsi, il est équipé de deux ports parallèles 8 bits, d'un port série bidirectionnel, de trois minuteries dont deux 16 bits et une 24 bits et d'une fonction d'alarme. Il est capable de libérer des interruptions processeur lorsqu'un évènement particulier intervient (port série plein ou vide, minuterie à 0). L'Amiga est équipé de deux CIA, communément appelés CIA A pour le premier, et CIA B pour le second. Le CIA est équipé de 16 registres 8 bits programmables, accessibles par le processeur par une simple instruction MOVE. Ces 16 registres contrôlent évidemment les fonctions du 8520. Nous verrons chacun de ces registres le moment venu, mais vous devez d'ores et déjà savoir qu'ils sont accessibles depuis les adresses $BFE001 (CIA A) et $BFD000 (CIA B), avec un espace de 256 octets entre chaque registre (par exemple, le registre 10 du CIA A est à l'adresse $BFE001+(256*10)=$BFEA001 : le registre 15 du CIA B est à l'adresse $BFD000+(256*15)=$BFDF00). Les ports parallèles Comme mentionné plus haut, le CIA dispose de deux ports parallèles 8 bits programmables, accessibles par les registres 0 et 1. respectivement, et baptisés PRA et PRB. Les registres 2 et 3, appelés DDRA et DDRB, contrôlent la direction des données pour chacun des bits du registre PR correspondant. Si un bit de DDR est mis à 1, le bit correspondant de PR est une sortie, sinon, c'est une entrée (pour le CIA A, évidemment, et non pour le processeur). Ces quatre ports parallèles sont évidemment utilisés par l'Amiga, comme le montrent les tableaux suivants : CIA A PRA ($BFE001) (Bit - Nom - Fonction)
CIA A PRB ($BFE101) Les huit bits sont utilisés pour les données de l'interface parallèle. DDRB peut être initialisé à 0 ou à 0xFF suivant le sens de la tranmission. CIA B PRA ($BFE101) (Bit - Nom - Fonction)
CIA B PRB ($BFD100) (Bit - Nom - Fonction)
Le port A du CIA A est multifonctionnel (bouton feu de la manette, bouton gauche de la souris, contrôle disquette, diode de mise sous tension et recouvrement disquette) tandis que son port B est entièrement dédié aux données de l'interface parallèle. Le port A du CIA B contrôle les interfaces série (contenue dans Paula) et parallèle, tandis que son port B est entièrement dédié au contrôle des lecteurs de disquette (en supplément au port A du CIA A). Le port série Attention, ne confondez pas : le port série du CIA n'est pas celui de la RS232, qui est émulée par Paula. Le port série du CIA est accessible par son registre numéro 12. Celui du CIA A est connecté au processeur clavier pour la transmission des touches, tandis que celui du CIA B est inutilisé. Nous reparlerons plus en détails du clavier plus tard. Les minuteries C'est là le plus gros morceau du 8520. Il comporte deux minuteries 16 bits appelées TA et TB (Timer A et Timer B). Chacune se voit attribuer un registre de contrôle, baptisé CRA pour TA et CRB pour TB. Le rôle des minuteries est de décompter à partir d'une valeur fixée à l'avance par le processeur jusqu'à 0. Dès que la minuterie dépasse le 0 (en d'autres termes, dès qu'elle arrive à -1), elle peut déclencher ou non une interruption processeur et, suivant le mode choisi, recommencer ou non le décompte. Le décompte commence dès que la valeur de départ a été inscrite dans le registre adéquat. Chaque minuterie dispose en fait de deux registres 16 bits, l'un pour la lecture, l'autre pour l'écriture. Ces deux registres étant logés à la même adresse, il est impossible de savoir par lecture à quelle valeur la minuterie à été initialisée, puisqu'elle est décrémentée dès l'écriture (le CIA, lui, s'y retrouve en recopiant juste avant le démarrage de la minuterie, la valeur de début dans une mémoire interne). On peut par contre lire à tout moment la valeur en cours du compteur, en l'arrêtant provisoirement. Le registre de contrôle de la minuterie détermine son mode de fonctionnement. Chacune des deux minuteries dispose de son propre registre de contrôle, car la minuterie B peut éventuellement fonctionner de manière légèrement différente de la minuterie A. Les registres CRA et CRB sont les registres numéros 14 et 15 (respectivement) du CIA. Registre CRA (Control Register A) (Bit - Nom - Fonction)
(Bit - Nom - Fonction)
Pour programmer un délai de manière précise en mode horloge (INMODE 0), il faut d'abord savoir sur quel système, NSTC ou PAL, l'on se trouve. Sur un Amiga NTSC, la fréquence d'horloge du 68000 est de 7,15909 MHz. Celle des CIA est donc de 0,715909 MHz. Une décrémentation du compteur survient donc toutes les 1/0,715909=1,3968255 microsecondes. Sur un Amiga PAL, l'horloge du 68000 est de 7,09379 MHz, celle des CIA à 0,709379. La décrémentation intervient donc toutes les 1/0,709379=1,4096836 microsecondes. Lorsque l'on sait qu'une seconde contient un million de microsecondes, on calcule qu'attendre 1/100e de seconde équivaut à attendre 10 000 microsecondes. Il faut donc initialiser le compteur avec la valeur 10 000/1,3968255=7159 en NTSC ou 10 000/1,4096839=7093 en PAL (on ne prend bien sûr que la partie entière du quotient). De même, attendre 3 millisecondes (1 milliseconde égale 1000 microsecondes) requiert d'initialiser le compteur à la valeur de 2148 en NTSC, ou 2128 en PAL. Reste maintenant à savoir dans quel mode l'on se trouve, du NTSC ou du PAL... Le moyen le plus simple de le savoir est d'inspecter le champ DisplayFlags de la structure GfxBase. Ce mot contient la valeur 1 sur un système NTSC et la valeur 4 sur un système PAL. Les différentes valeurs possibles du compteur seront avantageusement calculées par avance et sauvegardées dans une table, parce que bon, ce n'est pas pour dire, mais les calculs en virgule flottante avec le 68000, hein... Dernier point important : rappelez-vous que les minuteries sont 16 bits. Autrement dit, le délai maximum que l'on puisse programmer est de 65 534 (65 535 arrêtant la minuterie), soit environ 9/100e de seconde. Pour des délais plus longs, il faudra utiliser la minuterie 24 bits, comme nous le verrons le mois prochain. Récréation Vous avez bien gagné le droit de respirer un peu... Le petit programme que je vous propose maintenant est totalement inutile, si l'on fait abstraction de ses qualités didactiques. Il fait clignoter la diode de mise sous tension à intervalles réguliers de 1/100e de seconde (10 000 microsecondes). Il teste le système pour savoir si l'on se trouve en PAL ou en NTSC et s'adapte en conséquence. Le reste est suffisamment commenté. ![]() ![]()
|