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 :

  • bit 0 : est à la position high (à 1) lorsque le contrôleur vidéo génère une interruption pour indiquer le début du balayage vertical en haut de l'écran
  • bits 1 à 5 : non connectés, donc inutilisables bit 6 : est à 1 lorsque l'imprimante est connectée (ON LINE) et à 0 lorsque l'imprimante n'est pas branchée ou détériorée ou OFF LINE
  • bit 7 : c'est à travers lui que le CPC lit les données en provenance du lecteur de cassettes.

c) Le port C

Il ne peut être utilisé qu'en sortie et contient les bits de commandes :

  • bits 0 à 3 : sélectionnent une ligne du clavier particulière. 4 bits donnent seize possibilités, mais nous n'avons que dix lignes. Les six autres possibilités sont donc inopérantes jusqu'à preuve du contraire.
  • bit 4 : on peut agir directement sur ce bit ; à 1, le moteur du lecteur de cassette tourne et vice-versa.
    bit 5 : utilisé lors de la sauvegarde de données sur cassette. Attention, on ne peut sauvegarder aussi simplement, il faut préalablement agir sur le port de contrôle (&F700).
  • bits 6 et 7 : ces deux bits nous intéressent au plus haut point, car ils vont nous permettre justement de programmer le processeur sonore pour le mettre OUT (seulement les registres sonores) un instant. Ceci en vue de lire la ou les ligne(s) du clavier par le port A. Voici leur description détaillée (fig. 1)

Bit 7Bit 6
00Fin d'une opération avec le PSG.
01Lecture du registre courant (préalablement sélectionné).
10Valeur à mettre dans le registre sélectionné.
11Changement de registre.

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.

  • bit 6 : mode (0 ou 2) de transmission du port A (à 0 : mode 0, à 1 : mode 2).
  • bit 5 : mode (0 ou 1 ) de transmission du port A (à 0 mode 0, à 1 : mode 1 ).
  • bit 4 : sens de transmission à travers le port A (à 0 : en sortie. à 1 : en entrée)
  • bit 3 : sens de transmission des bits 0 à 3 du port ( (à 0 : en sortie, à 1 : en entrée) Tou jours à 0 (sur CP( ).
  • bit 2 : mode (0 ou 1 ) de transmission du port B (à 0 mode 0. à 1 mode 1 ). Toujours à 0
  • bit 1 : sens de transmission à travers le port B (à 0 : en sortie. à I en entrée), l'on jours à 1
  • bit 0 : sens de transmission des bits 4 à 7 du port (, (à 0 . en sortie, à 1 en entrée) Toujours à 0
  • bit 7 = 0. Positionnement d un bit du port ( à 0 ou à 1
  • bits 6, 5, 4 : non connectés.
  • bits 3, 2, 1 : combinaisons donnant le numéro du bit à positionner
  • bit 0 : indique si le bit de C. sélectionné par les bits 1.2,5, doit être mis à 0 ou à 1 (bit 0 = 0 donc bit de C = 0).
    N.B. N'utilisez rien d'autre que le mode 0, sous peine d 'essuyer un magnifique plantage !

Application

Ports A et B en entrée et C en sortie :

LD BC,&F792
OUT (C),C

  • Bit 4 de C à 1 (mise en marche du moteur du lecteur de cassette) en utilisant le port de contrôle

LD BC,&F709
OUT (C),C

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 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
Ligne 1. (point)ENTER
(small)
369
Ligne 2021587COPY
Ligne 3CTRL$SHIFT4#ENTER
(big)
*CLR
Ligne 4:=MùP^)-
Ligne 5;, (virgule)KLIOçà
Ligne 6ESPACENJHYUè!
Ligne 7VBFGTR(]
Ligne 8XCDSZE"'
Ligne 9WCAPSQTABAESCé&
Ligne 10DELJOY#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

★ EDITEUR: MICROMAG
★ ANNÉE: 1989
★ AUTEUR: Stéphane Rodriguez
 

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Clefs2 10 - Cpm22 Format Secteur
» Coding Src's » Amazing Demo Copier including Formatter (Longshot)
» Coding » Formatage spécial en Lecteur A ou B
» Coding Src's » Formas multicolores (Amstrad Personal)
» Coding » Clefs1 08 Format de Stockage Ligne Basic
» Coding » Directory, Checksum und das Vortex-Format (Computer Technik)
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 340 millisecondes et consultée 884 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.