10-13 Gestion du clavier et
du joystick
C’est seulement maintenant que l’on analyse si une touche a été appuyée ou si le joystick a été activé. L’ordre de priorité est le suivant :
Pour le clavier, on analyse les touches k,l, d et c + majuscules. Pour les joysticks, on analyse les directions gauche, droite, haut et bas. Mais au final, le programme fera appel au même code de gestion des déplacements. L’analyse des touches se fait par le vecteur &BB1B qui ne fait que récupérer les valeurs sans attendre, car si aucune touche n’est appuyée, il faut quand même que la voiture continue de se déplacer.
TOUCHES CALL &BB1B
; Regarde si une touche est appuyée
JR
NC,JOYSTICK ; Si pas de touches => JOYSTICK
CP
'd' ; d = D = Plus vite
JR
Z,TOUCHEP ; dans ce cas => TOUCHEP
CP
'D'
JR
Z,TOUCHEP
CP
'c' ; c = C = Moins vite
JR
Z,TOUCHEM ; dans ce cas => TOUCHEM
CP
'C'
JR
Z,TOUCHEM
CP
'k' ; k = K = Gauche
JR Z,TOUCHEG ; dans ce
cas => TOUCHEG
CP
'K'
JR
Z,TOUCHEG
CP
'l' ; l = L = Droite
JR
Z,TOUCHED ; dans ce cas => TOUCHED
CP
'L'
JR
Z,TOUCHED
CP
'q'
; q = Q = termine la course
JP
Z,INITVAR ; dans ce cas => INITVAR
CP 'Q'
JP Z,INITVAR
JP DEPL
; Sinon touche ignorée => DEPL
L’analyse
du joystick se fait par le vecteur &BB24 qui là aussi se contente de
récupérer les valeurs des 2 joysticks. Le premier est placé dans les registres
A et H, et le deuxième dans L. On se contente ici de récupérer les valeurs de
directions contenues dans les bits 0 à 3 :
JOYSTICK
CALL &BB24 ;
Lecture de l'état du joystick
OR A ;
A = H = état du joystick 1
JR NZ,JOYSTIC2 ; joystick actif => JOYSTIC2
LD A,L
; A <= L = état du joystick 2
OR A ;
joystick 2 actif?
JR Z,DEPL
; non => joystick ignoré => DEPL
JOYSTIC2 RRA ;
Bit 0 = HAUT
JR C,TOUCHEP ; dans ce
cas => TOUCHEP
RRA ; Bit 1 = BAS
JR
C,TOUCHEM ; dans ce cas => TOUCHEM
RRA ;
Bit 2 = GAUCHE
JR
C,TOUCHEG ; dans ce cas => TOUCHEG
RRA ;
Bit 3 = DROITE
JR
C,TOUCHED ; dans ce cas => TOUCHED
JP
DEPL ; autres = ignorés => DEPL
TOUCHEP augmente
la vitesse de la voiture, dont la variable est VITESSE. Toutefois celle-ci ne
peut dépasser la vitesse maximum paramétrée dans les constantes :
VITESMAX. On voit ici l’intérêt des constantes, car on n’a pas à se soucier de
leur valeur.
TOUCHEP LD HL,VITESSE
; HL pointe la vitesse de la voiture
LD
A,(HL) ; A =
vitesse
CP
VITESMAX ; Vitesse maximum atteinte?
JR
Z,TOUCHFIN ; oui => TOUCHFIN
INC
A ; non => vitesse + 1
LD
(HL),A ;
vitesse mémorisée
JP
TOUCHFIN ; => TOUCHFIN
A
contrario, TOUCHEM diminue la vitesse de la voiture. Et là, la limite basse est
0.
TOUCHEM LD HL,VITESSE
; HL pointe la vitesse de la voiture
LD
A,(HL) ; A =
vitesse
OR
A ; vitesse minimum 0
atteinte?
JR
Z,TOUCHFIN ; oui => TOUCHFIN
DEC
A ; non => vitesse - 1
LD
(HL),A ;
vitesse mémorisée
JP
TOUCHFIN ; => TOUCHFIN
TOUCHEG fait tourner la voiture à gauche, ce qui revient à diminuer l’angle de 1. Toutefois, si l’angle est de –1, on le remet à 7 (%0000 0111).
TOUCHEG LD HL,ANGLE
; HL pointe l'angle de la voiture
LD A,(HL)
; A = angle
DEC A ;
Angle - 1 = tourne à gauche
AND
%00000111 ; 8 angles => 0 - 1 = 7
LD
(HL),A ; Nouvel angle mémorisé
JP
TOUCHFIN ; => TOUCHFIN
Et TOUCHED
tourne à droite (ANGLE + 1). Si l’angle dépasse 7 il est remis à 0 par le AND (
8 = %0000 1000 AND %0000 0111 = 0).
TOUCHED LD HL,ANGLE
; HL pointe l'angle de la voiture
LD A,(HL)
; A = angle
INC A ;
Angle + 1 = tourne à droite
AND
%00000111 ; 8 angles => 7 + 1 = 0
LD
(HL),A ; Nouvel angle mémorisé
Si une de
ces touches a été reconnue, la variable CHRONO est mise à 1 pour indiquer que
le chronomètre est actif. Si cette variable était déjà à 1, cela ne change
rien.
TOUCHFIN
LD A,1
LD
(CHRONO),A ; Chronomètre actif
<< RETOUR --- SUITE : Gestion des déplacements de la voiture
>>