Revenir au plan du site

Un programme "Télécran"

On a une routine qui affiche un point, une routine qui peut détecter des touches du clavier, on sait aussi comment attendre la VBL et même ralentir un programme trop rapide.

La conception d'un télécran n'est pas bien compliquée, nous avons une logique assez simple. Voici le diagramme logique à peine simplifié.


On est partis? Effacer l'écran, initialiser les coordonnées de notre point.
EffaceEcran
ld hl,#C000
xor a ; A=0
.loop
ld (hl),a ; écrire #00 à l'adresse pointée par HL
inc l ; incrémenter seulement L positionne le flag Z une fois revenu à zéro
jr nz,.loop ; on boucle donc tant que L est différent de zéro
inc h ; même chose pour H, sauf que nous savons ici que L vaut zéro
jr nz,.loop ; tant que H ne vaut pas zéro on reboucle
; ici nous avons HL=#0000 nous sommes revenus au début de la mémoire, l'écran est effacer, on s'arrête

; initialiser les coordonnées de notre point
ld hl,160 : ld (positionx),hl
ld hl,100 : ld (positiony),hl

; ... reste du programme ...

; en fin du programme, nos coordonnées sur 16 bits
positionx defw 0
positiony defw 0

Afficher un point, on a déjà la routine, lire le clavier aussi, il faut traiter les touches!
AfficherPoint
ld bc,(positionx)
ld hl,(positiony)
call CalculeAdressePixel
ld (hl),c ; écrire le pixel à l'écran

LireLeClavier
call lectureMatriceClavier

OCTET_CURSEUR_HAUT equ matriceClavier : BIT_CURSEUR_HAUT equ 1
OCTET_CURSEUR_DROITE equ matriceClavier : BIT_CURSEUR_DROITE equ 2
OCTET_CURSEUR_BAS equ matriceClavier : BIT_CURSEUR_BAS equ 4
OCTET_CURSEUR_GAUCHE equ matriceClavier+1 : BIT_CURSEUR_GAUCHE equ 1
OCTET_TOUCHE_ESPACE equ matriceClavier+5 : BIT_TOUCHE_ESPACE equ 128

; si on appuie sur Espace, on revient à l'effacement de l'écran
ld a,(OCTET_TOUCHE_ESPACE) : and BIT_TOUCHE_ESPACE : jp z,EffaceEcran

; touches du curseur
ld a,(OCTET_CURSEUR_HAUT) : and BIT_CURSEUR_HAUT : jp z,gererHaut
ld a,(OCTET_CURSEUR_BAS) : and BIT_CURSEUR_BAS : jp z,gererBas
ld a,(OCTET_CURSEUR_DROITE) : and BIT_CURSEUR_DROITE : jp z,gererDroite
ld a,(OCTET_CURSEUR_GAUCHE) : and BIT_CURSEUR_GAUCHE : jp z,gererGauche
;
jp LireLeClavier ; ni espace, ni curseur, on continue de lire le clavier

Là, on a déjà fait le squelette, il manque les fonctions de gestion des touches. Bêtement, à droite on va incrémenter le X, à gauche le décrémenter et de façon analogue, changer le Y quand on appuie sur haut ou bas.
Petite subtilité non présente dans le diagramme, il est important de gérer le minimum et le maximum de nos coordonnées. Si on est déjà à zéro, on ne décrémente pas et on maximise Y à 199, ainsi que le X à 319.
gererHaut
ld hl,(positiony)
ld a,h : or l : jp z,LireLeClavier ; si le Y vaut zéro on est déjà en haut de l'écran
dec hl ; on n'est pas en haut alors on décrémente
ld (positiony),hl ; et on valide la nouvelle coordonnée
jp AfficherPoint ; on remonte afficher le point
;
gererGauche
ld hl,(positionx)
ld a,h : or l : jp z,LireLeClavier
dec hl
ld (positionx),hl
jp AfficherPoint
;

Ne rien faire quand on est à zéro, c'est facile mais pour ce 199 et ce 319, on fait comment?
gererBas
ld hl,(positiony)
ld a,l : cp 199 : jp z,LireLeClavier ; si le Y vaut 199 on est déjà en bas de l'écran
inc hl ; on peut incrémenter
ld (positiony),hl ; et on valide la nouvelle coordonnée
jp AfficherPoint ; on remonte afficher le point

Comme notre coordonnée Y est initialisée à une valeur inférieure à 199, on sait qu'on n'aura jamais à traiter le poids fort, notre valeur 16 bits pourrait même se stocker sur 8 bits si on voulait. On ne compare donc que le poids faible à 199 pour annuler l'incrémentation.

La comparaison 16 bits se fait en deux temps (on pourrait faire une soustraction 16 bits remarquez). D'abord on compare le poids faible, si ce n'est pas le poids faible de la valeur 319 (fonction LO) alors on sait qu'on peut valider la position. Si le poids faible correspond à celui de la valeur 319, alors il faut comparer le poids fort de 319 et celui de notre coordonnée. Si ça correspond (flag Z) on retourne à la lecture clavier, sinon c'est OK.
gererDroite
ld hl,(positionx)
ld a,l : cp lo(319) : jr nz,.okDroite
ld a,h : cp hi(319) : jp z,LireLeClavier
.okDroite
inc hl
ld (positionx),hl
jp AfficherPoint

Voilà, tout est posé, je vous insite à la partie deux pour le source complet et assemblable.