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 0Afficher 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'écranLireLeClavier 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 clavierLà, 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 pointComme 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 AfficherPointVoilà, tout est posé, je vous insite à la partie deux pour le source complet et assemblable.Roudoudou CPCrulez[Content Management System] v8.732-desktop Page créée en 236 millisecondes et consultée 26 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|