★ CODING ★ De port en port - Programmation directe du clavier|Micro-Mag) ★ |
De port en port : Programmation directe du clavier (Micro-Mag) | Cours et Initiation MICROMAG |
Ou comment gérer un périphérique tel que le clavier, en programmant directement les circuits intégrés du CPC via les ports entrées/sorties. Un article de Claude Le Moullec (initiation Basic du professeur Ali Gator ; Am-Mag n°42) vous a jadis instruit de la gestion Basic du clavier et des joysticks. Nous allons, non pas apprendre par analogie la même chose en Assembleur (par les vecteurs du genre &BB06), mais découvrir les joies d une programmation directe de ces périphériques. N'ayez crainte, les routines, comme par exemple celle décrite plus bas, ne peuvent en aucun cas détruire un des composants de la carte mère Signalons qu'une base en Assembleur est nécessaire à la bonne compréhension de ce qui suit. I - Comment ça marche ? Le clavier est en fait divisé en dix lignes qui n ont rien à voir avec les étages réels de touches Chacune de ces lignes est reliée au processeur s'occupant de la gestion des entrées/sorties par l'intermédiaire d un port 8 bits. C'est pourquoi 80 touches (8 x 10) peuvent être connectées et détectées par le système. Cette fameuse puce qui répond au doux nom de PPI 8255 A gère le balayage vertical du moniteur, les signaux cassette et imprimante, le clavier et enfin le mode de transmission des données. II - Le PPI 8255 A Le PPI est divisé en trois canaux que nous appellerons par convention A , B et C. Ils sont tous trois connectés à des adresses différentes qui sont respectivement &F400 , &F500 et &F600. De plus, le port d'adresse initiale &F700 contrôle le mode de transmission, c'est-à-dire qu'il indique à chacun des trois ports A , B et C (ports 8 bits), s'ils doivent être utilisés en sortie ou en entrée a) Le port A C'est tout simplement le port de données. Les lignes clavier arrivent au système par ce biais lorsque A est utilisé en entrée. Si A est programmé en sortie, il sert alors à envoyer au processeur sonore (PSG AY3-8912), les données nécessaires à rémission de sons. b) Le port B Ce port qui ne peut être utilisé qu'en entrée (on ne peut que le lire), est connecté à plusieurs organes vitaux pour les trans missions Voici la description de ses bits :
c) Le port C Il ne peut être utilisé qu'en sortie et contient les bits de commandes :
Il faut savoir que le PSG comporte quatorze registres (en fait, il en existe d'autres mais qui sont vraiment particuliers et n'entrent donc pas dans le cadre de cet article). Les treize premiers sont des registres sonores qui contiennent les fréquences des signaux, les amplitudes et les périodes Mais seul le registre 14 nous concerne, car il s'occupe justement de la lecture des lignes clavier Chaque registre contient une valeur allant de 0 à 255. Prenons un exemple : soit la valeur &16 (22 en décimal) à placer dans le registre 5. (list. 1) d) Le port de contrôle Connecté au cerveau du PPI il permet de choisir le sens dans lequel les ports A, B et C doivent fonctionner (en entrée ou en sortie). On peut également choisir le mode de transmission des ports (aucun intérêt sur CPC) et enfin, chose originale, changer la valeur des bits du port C (&F600) La sélection d'une de ces possibilités s'effectue en fonction de la valeur donnée au bit 7. Bit 7=1- Sens et modes de transmission.
Application Ports A et B en entrée et C en sortie : LD BC,&F792 |
Correspondance clavier azerty/qwerty | |
Azerty | Qwerty |
ù | | |
List. 1
A000 DI ' On vire les interruptions, obligatoire!
A001 LD BC,F405 ' B=F4 (port A) C=5 (registre 5)
A004 OUT (C),C ' On envoie au PPI.
A006 LD BC,F6C0 ' B=F6 (port C) C=C0 (bit 7 & 6 à 1 : changement de registre.
A009 OUT (C),C ' On envoie ceci au PPI.
A00B LD BC,F600 ' B=F6, C=0 on tait attendre le PSG car on lui
A00E OUT (C),C ' envoie une autre donnée.
A010 LD B,F4 ' B=F4 (port A)
A012 LD C,16 'C=16 (valeur à mettre dans le registre 5).
A014 OUT (C),C ' On envoie le tout dans le port A.
A016 LD BC,F680 ' On indique au PPI que la valeur dans le port A
A019 OUT (C),C ' est à mettre dans le registre sélectionné.
A01B LD BC,F600 ' Une fois la tâche effectuée, on "déconnecte” le PSG.
A01E OUT (C),C
A021 EI ' On remet les interruptions (facultatif).
A022 RET ' Retour à l'assembleur ou au basic.
List. 2
A000 DI ' Interruptions OUT.
A001 LD DE,A100 ' Adresse de départ du butter de rangement des lignes.
A004 LD BC,F40E ' Registre 14 sur le port A.
A007 OUT (C),C
A009 LD BC,F6C0 ' On indique au PSG le changement de registre.
A00C OUT (C),C
A00E LD C,00 ' On laisse le PSG se reposer un peu!
A010 OUT (C),C
A012 INC B ' B=F7 A=92
A013 LD A.92 ' A=IN, B=IN, C=OUT
A015 OUT (C),A
A017 PUSH BC
A018 SET 6,C ' Bit 6 du port C à 1 (on prépare la lecture du registre
A01A LD B,F6 ' 14, car les lignes sont lues par ce registre).
A01C OUT (C),C ' On envoie au PSG
A01E LD B,F4 ' On lit la ligne que le registre C adresse (&40 à &49)
A020 IN A,(C) ' ceci par l'intermédiaire du port A.
A022 LD (DE),A ' On sauvegarde les résultats dans DE.
A023 INC C ' On augmente le numéro de ligne à scruter.
A024 INC DE ' On incrémente le pointeur du butter.
A025 LD A,C ' On vérifie si la ligne en cours est la 10ème.
A026 CP 4A
A028 JR NZ,A01A ' Non, alors on recommence avec la ligne suivante.
A02A POP BC
A02B LD A,82 ' On met A=OUT, B=IN, C=OUT (B=F7).
A02D OUT (C),A
A02F DEC B ' On dit au PSG de se reposer un peu (B=F6).
A030 OUT (C),C
A032 EI ' On rétablit les interruptions.
A033 RET
III - La routine
(list. 2)
Au fait de toutes les possibilités de programmation du PPI, réalisons une routine relogeable. capable de faire son propre test clavier.
N.B Cette routine mise sous interruptions et libérée de l'interruption clavier produite par le système lui même, provoque quelque chose d'assez intéressant comme le contrôle du clavier à tout moment Lors du retour, la zone &A100 - &A109 contient les valeurs des dix lignes, soit toutes les tou ches disponibles sur le clavier (également les joysticks). Si une touche est pressée, le bit de la ligne concernée est à 0. sinon, il est à 1 (le tableau suivant donne les positions des touches par rapport aux lignes). Cette routine ne doit être utilisée que sous interruptions ou bien dans un programme en Assembleur fermé (sans retour Basic). Le Basic gène en effet cette scrutation du fait que d autres interruptions sont déjà prévues.
Pour finir, un petit programme d'exemple pour tester si la touche ESPACE est pressée ou non Si oui, il y a retour au Basic, dans le cas contraire, on boucle, (list. 3)
List. 3
A200 CALL &A000 ; Test des 10 lignes et sauvegarde à partir de &A100.
A203 LD A,(A105) ; L'accu. va contenir la valeur de la 6ème ligne.
A206 AND 80 ; On teste le bit réservé à la touche ESPACE.
A208 JR NZ,A200 ; Il est à 1, donc on boucle.
A20A RET ; Il est à 0, retour.
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Ligne 1 | . (point) | ENTER (small) | 3 | 6 | 9 | ↓ | → | ↑ |
Ligne 2 | 0 | 2 | 1 | 5 | 8 | 7 | COPY | ← |
Ligne 3 | CTRL | $ | SHIFT | 4 | # | ENTER (big) | * | CLR |
Ligne 4 | : | = | M | ù | P | ^ | ) | - |
Ligne 5 | ; | , (virgule) | K | L | I | O | ç | à |
Ligne 6 | ESPACE | N | J | H | Y | U | è | ! |
Ligne 7 | V | B | F | G | T | R | ( | ] |
Ligne 8 | X | C | D | S | Z | E | " | ' |
Ligne 9 | W | CAPS | Q | TAB | A | ESC | é | & |
Ligne 10 | DEL | JOY#1 FIRE | JOY#1 → | JOY#1 ← | JOY#1 ↓ | JOY#1 ↑ |
Tableau de correspondance lignes/touches (fig. 2)
Exemple : la ligne 1. dans la routine proposée, correspond à radresse &A100. A utiliser seulement après un CALL &A000. (Ce programme réalisé sur un clavier azerty nécessite peut-être d'autres correspondances). Reste un problème. Comment prévoir si l'utilisateur appuie sur la touche « ? » (point d interrogation), sachant qu'il faut « shifter » la touche « , » (virgule), pour obtenir « ? ». C'est à vous de prévoir cette éventualité ; à savoir la réalisation du test simultané des touches « , » et SHIFT. En fonction du résultat, il faudra établir ce que l'on appelle une table de codes, qui seront justement les nouveaux codes des touches shiftées. Le système travaillant de cette manière, on ne peut espérer mieux au niveau programmation
Stéphane Rodriguez, MicroMag n°5
|
|