J'ai donc réécrit ma routine de gestion clavier dans cette optique:
- Code: Select all
GETKEY: push {r0-r4,lr} @ EN SORTIE: R12=une touche entre 1 et 88 (=0 si rien)
mov r3,#77 @ au départ , val de rang = 77
mov r12,#0 @ r12=0 (et le restera si aucune touche pressée)
adr r0,x900e001e
ldr r0,[r0] @ r0=#0x900e001e
ldr r2,[r0,#-2] @ Testons le bit10 en #0x900e001c ...(dédié à aucune touche)
tst r2,#0b10000000000 @ On n'est pas sur modèle clickpad?
beq touchp @ alors passons à la gestion touchpad!
clickp: ldr r4,[r0,#-0x1e] @ Comme les modèles clickpad sont
orr r1,r4,#1 @ par défaut en mode "single scan",
str r1,[r0,#-0x1e] @ on mets le bit0 à 1 pour passer en mode "continuous scan".
adr r1,b11111111111
ldr r1,[r1] @ masque pour ne conserver que les bits 0 à 10
whichk: ldrh r2,[r0],#-2 @ dans r2 l'état d'une rangée de touches
mvn r2,r2 @ inverse r2 (car sur clickpad, bit à 0 = touche pressée)
and r2,r2,r1 @ Seuls les 11 premiers bits nous intéressent
clz r2,r2 @ En partant du bit 31, combien de bits nuls avant un bit à 1 ?..
rsbs r2,r2,#32 @ 32-résultat =valeur entre 1 et 11 si l'une des touches est pressée.
addne r12,r2,r3 @ non nul?..Alors r12=valeur + rang
subs r3,r3,#11 @ avant d'analyser le paquet de 11bits précédant, rang=rang-11
bhs whichk @ Continue tant que r3 sup ou =0
str r4,[r0,#-0x0e] @ Remets le clavier en mode "single scan"
pop {r0-r4,pc} @ restaure r0-r4 & pc=lr pour quitter la routine
touchp: ldrh r2,[r0],#-2 @ on démarre en offset $1e
clz r2,r2 @En partant du bit 31, combien de bits nuls avant un bit à 1 ?..
rsbs r2,r2,#32 @ 32-résultat =valeur entre 1 et 11 si l'une des touches est pressée
addne r12,r2,r3 @ non nul?..Alors r12=valeur + rang
subs r3,r3,#11 @ avant d'analyser le paquet de 11bits précédant, rang=rang-11
bhs touchp @ Continue tant que r3 sup ou =0
pop {r0-r4,pc}
x900e001e: .long 0x900e001e
b11111111111: .long 0b11111111111
J'ai remarqué que certaines touches sont codées exactement de la même manière (même emplacement dans le tableau)
![Image](https://i.imgur.com/rQq20po.jpg)
(tableau du clavier TouchPad)
ça permet d'éviter de devoir utiliser d'autres touches qu'initialement prévu selon qu'un modèle ou l'autre est utilisé
![;) ;)](./images/smilies/wink.png)
En ce qui concerne la détection du type d'écran, j'ai dû ruser un peu...
![;) ;)](./images/smilies/wink.png)
Les modèles monochromes ayant un contrôleur LCD "PL110" , et "PL111" pour les modèles couleurs, Il en résulte des différences d'adressage.
En effet le registre de contrôle LCD et le registre de "masquage d'interruption" sont inversement placés
![:p :p](./images/smilies/razz.png)
Voici comment , en tout début de programme, j'ai procédé:
- Code: Select all
mov r0,#0xc000001c @ =registre de contrôle LCD sur monochrome
ldr r1,[r0]
tst r1,#4 @ bit2 de r0 à 1 ? (ç-à-d en mode 4bpp?)
subeq r0,r0,#4 @ sinon on est sur couleur , alors AdrLcdCtrl=#0xc0000018