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)

(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é

En ce qui concerne la détection du type d'écran, j'ai dû ruser un peu...

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

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