Hello,
Je me replonge dans le développement sur Amstrad CPC, en assembleur Z80.
Pour un projet, je suis en train de refaire les routines système de
gestion du clavier, et j'aurais besoin de vos lumières. Pas pour la
programmation en elle-même, mais plutôt pour l'algo.
La gestion hardware du clavier du CPC est décrite ici :
http://quasar.cpcscene.net/doku.php?id=assem:ppi#l_interfacage
Pour lire une touche, on commence par positionner les bits 0-3 du port C du
PPI 8255, ce qui a pour but de sélectionner la ligne du clavier, puis on
relis les bits via le port A¹.
Ma routine de scan fonctionne bien : à chaque frame écran (tous les 1/50s)
je lis et stocke les 10 lignes brutes dans un buffer, et j'en profite pour
stocker aussi, dans un second buffer, les changements depuis la dernière
scrutation (un simple XOR avec la valeur précédente).
Ensuite, je traite ces données brutes pour retrouver la touche appuyée, et
gérer la répétition. Et c'est là où ma routine fonctionne mal. En fait,
elle fonctionne bien tant que je n'appuie pas sur plusieurs touches !
L'appui simultané sur plusieurs touches est de 2 types :
- les touches sont sur des lignes différentes ;
- les touches sont sur les mêmes lignes.
Dans le premier cas, ma routine s'en sort un peu (quoique la gestion de la
répétition peut foirer), mais dans le second cas, ma routine ne marche pas
du tout, car je compare la donnée brute pour retrouver la touche, mais
s'il y a 2 bits modifiés, ça ne matche aucune touche.
La solution qui me vient à l'esprit c'est de tester, pour chaque ligne,
tous les bits qui ont changés, et de construire un buffer. Je pense voir
comment faire dans le cas simple, mais je sèche pour la gestion de la
répétition (délai et période). Car il faut aussi gérer l'arrêt de la
répétition, qui intervient soit quand on presse une nouvelle touche, soit
quand on relâche celle qui a déclenché la répétition :o/
Si vous avez des suggestions d'algo pour faire ça, je suis preneur !
Merci d'avance.
¹ en fait, les bits clavier sont reliés au port I/O du chip son, lequel
est relu via le port A du PIO 8255 :
https://raw.githubusercontent.com/floooh/emu-info/master/cpc/cpc6128_schematics.png
--
Frédéric