ASMtrad CPC

Apprenez l'assembleur Z80

Test du clavier.

Parmis les choses les moins agréables à faire sur cpc, on trouve le test du clavier.
Pourtant c'est un passage obligatoire dès qu'on veut donner une intéraction avec l'utilisateur.

Les choses auraient put être simple. Le clavier aurait put être lisible directement et en deux ou trois instructions une touche serait testée.
Mais ce n'est pas le cas. Chez Amstrad on en a décidé autrement et le clavier n'est non seulement pas accéssible directement, mais il faudra se coltiner un certain nombre d'instructions pour savoir si une touche est préssée ou non.

Cauchemard du débutant; le test du clavier est non seulement relativement complexe, mais il est surtout facile d'y faire n'importe quoi.

théorie

Tester le clavier c'est quoi ?

C'est aller lire dans le PSG un registre.
"Le PSG ?" me direz-vous... Oui le PSG, Programmable Sound Generator... Oui Monsieur. Ce même composant qui vous permet de faire de la musique.

En effet, celui-ci possède 14 registres dont justement le dernier (le 14 donc) correspond au clavier.

Pour lire une ligne du clavier il suffit donc d'accéder à ce registre et de le lire me direz-vous ? NON... Trop simple !!!

Vous l'aurez compris sur cpc, tester le clavier c'est compliqué.

Alors plutôt que de vous faire un long discours ici, je vais faire un racourcis.
Chose inadmissible mais qui pourtant vous rendra service: je vais vous donner une routine toute faite...

Oui j'ai honte (bon en fait non mais on va faire comme si...), c'est insupportable, mais honnetement, vous expliquer ici, maintenant comment tester le clavier alors que vous débutez, c'est juste vous achever avant même que vous ne commenciez à courir.

Voici donc une routine que je vais vous expliquer brièvement ensuite:

                ; Test clavier de la ligne
                ; dont le numéro est dans D
                ; D doit contenir une valeur de 0 à 9
                                LD          BC,&F40E        ; Valeur 14 sur le port A         
                                OUT         (C),C         
                                LD          BC,&F6C0        ; C'est un registre         
                                OUT         (C),C         
                                LD          BC,&F600        ; Validation         
                                OUT         (C),C         
                                LD          BC,&F792        ; Port A en entrée         
                                OUT         (C),C         
                                LD          A,D             ; A=ligne clavier         
                                OR          %01000000        
                                LD          B,&F6         
                                OUT         (C),A         
                                LD          B,&F4           ; Lecture du port A         
                                IN          A,(C)           ; A=Reg 14 du PSG         
                                LD          BC,&F782        ; Port A en sortie         
                                OUT         (C),C         
                                LD          BC,&F600        ; Validation         
                                OUT         (C),C           ; Et A contient la ligne

Le premier OUT permet de selectionner le registre 14 du PSG.

On ne l'a pas vu pour le moment mais un OUT permet en fait de selectionner un port d'un péripherique du cpc.
Entendez par prériphérique, toute chose (composants comme extension) étant autour du Z80.
Le PPI est donc un périphérique, comme le sont le PSG, le CRTC ou le Gate Array.

Chacun de ces périphériques possède donc des ports, qui sont comme des portes d'accès numérotées vers une section de celui-ci.

L'adressage classique consiste sur CPC (attention pour ceux qui codent sur spectrum, c'est légèrement différent) à placer dans le registre B le numéro du port et à envoyer via un OUT la valeur voulue vers celui-ci.

Un OUT (C),A enverra donc le registre A vers le port contenu dans B. Un OUT (C),D enverra le registre D vers le port B.

Vous voyer donc que sur CPC ce qui est entre parenthèse: le C ne correspond pas au registre de sélection qui est le registre B.
L'instruction sera donc toujours: OUT (C),r8, où r8 est un registre 8bits.

Revenons donc à notre registre 14 du PSG. Pourquoi #F40E correspond à cela ?

Pour ce qui est du #F4 contenu dans B, je vous invite à aller faire un tour dans la section documentation du site ou un tableau détail cela bits par bits.
Sachez simplement que #F4 correspond simplement au PSG (mais aussi au lecteur K7) et que l'on appelle aussi celui-ci: PPI port A.

Le registre C contient lui en revanche #0E qui comme vous le savez correspond à la valeur 14.

Mais pourquoi envoyer ensuite un #C0 sur le port #F6 ?

Voici un schéma:

ppi port c

Je n'ai représenté ici que les bits utiles. Ne vous occupez donc pas des autres (5 à 0) qui n'ont pas d'interet pour le moment.

Comme vous pouvez le voir, le fait d'envoyer #C0 correspond en fait à sélectionner un registre. #C0 en binaire correspond bien à %11000000.
Car oui, pour le ppi, vous serez obligé de le préciser. Si vous ne lui dites pas qu'il s'agit d'un registre il ne prendra simplement pas en compte votre premier OUT.
Non content de devoir préciser qu'il s'agit d'un registre vous devrez ensuite valider cette précision via %00 sur ces deux mêmes bits. Décidement que de répétitions.

Nous arrivons au #F792.

Voici donc à nouveau un schéma sur le registre de controle du PPI qui sera plus facile à comprendre qu'un long discours (encore que...):

ppi controle

Pour ce qui est des modes de travail, ne vous en occupez pas. Ce qui compte ici, c'est de remarquer que le Port A (donc le PSG) est mis en entrée.

Être en entrée signifie que les données entrent. Vous n'envoyez donc pas, vous recevez.
Il est donc logique pour tester le clavier de le mettre en entrée vous y conviendrez.

On en arrive au moment ou on récupère le numéro de ligne clavier (ne vous inquiétez pas vous allez comprendre juste après).

On utilise l'instruction OR val pour forcer le bit 6 à 1. Nous verrons l'instruction OR plus loin dans les cours.

Mais à quoi correspond donc le numéro de ligne du clavier ? Doit-on regarder sur le clavier ? Non ! Et voici la réponse:

clavier

Comme vous pouvez le voir, les touches sont triées dans un ordre précis. Celles-ci sont donc regroupées par ligne.

Chaque ligne possède donc un numéro de 0 à 9 qui est donc codé sur 4bits: les bits de poids faibles du port C du PPI.

Le schéma plus complet du port C serait donc:

ppi port c 2

Mais à quoi servent les bits restants ? Les 5 et 4 ? Ceux-ci correspondent au lecteur K7... Donc ici sans interet et à 0.

Le reste de la routine est compréhensible et nous avons déjà vu chacun des registres utiles.

Comme vous le voyez donc, un test de touche sur cpc est bien compliqué.

La dernière précision: lorque vous lisez une ligne clavier, le bit correspondant à la touche est mis à 0 si celle-ci est enfoncée.
Tous les bits sont donc à 1 si aucune touche n'est enfoncée.