10-6 Ecran
d’introduction
10-6-1
Affichage des scores
L’écran d’intro se trouve dans le banc 0 de la mémoire supérieure. On commence donc par l’appeler (en &4000 inférieurs donc), puis on la modifie avec les scores avant de l’afficher à l’écran. L’appel à la mémoire supérieure se fait bien entendu par le Video Gate Array :
LD
BC,&7F00 ;
Demande d'accès au GATE-ARRAY
LD
A,%11000100 ; A = accès
au banc supérieur 0 = écran d'intro
OUT
(C), A ; Accès
à la requète
Pour
afficher les scores, on profite de la fonction d’affichage rapide des chiffres AFFICHE. Comme il y a 3 scores à afficher, on a
créé un sous-programme SCORES que l’on appelle à chaque fois. DE pointe les
centièmes de chaque meilleur temps des courses et HL pointe l’endroit où
afficher les scores dans l’écran intermédiaire en &4000 :
LD
DE,TEMPS1+2 ; DE pointe
le meilleur score de la course 1
LD
HL,&42E8 ; HL
pointe les centièmes de temps1 dans l'écran intermédiaire
CALL
SCORES
LD
DE,TEMPS2+2 ; DE pointe
le meilleur score de la course 2
LD
HL,&4338 ; HL pointe
les centièmes de temps2 dans l'écran intermédiaire
CALL
SCORES
LD
DE,TEMPS3+2 ; DE pointe
le meilleur score de la course 3
LD
HL,&4388 ; HL
pointe les centièmes de temps3 dans l'écran intermédiaire
CALL SCORES
JP
INTRO ; Affichage terminé => INTRO
Le sous-programme SCORES se compose de 3 boucles, une pour la lecture des centièmes, une pour les secondes et une pour les minutes. Tous les chiffres sont lus et affichés. On se rappelle que les temps sont en BCD et initialisés avec les valeurs suivantes :
TEMPS1
= &59,&59,&99
TEMPS2
= &59,&59,&99
TEMPS3
= &59,&59,&99
Isoler les
chiffres dans chaque boucle consiste à isoler les poids faibles (pour les
minutes : 9) puis les poids forts (pour les minutes : 5). Evidemment
ces temps sont amenés à évoluer, on ne sait donc jamais ce qu’on a. Isoler les
poids faibles consiste à placer le nombre dans A et à faire un masque ET
&0F (%00001111). Pour isoler les poids forts, il faut les décaler 4x à
droite avec un SRL pour qu’ils se retrouvent en poids faible. Le pointage écran
est assuré par HL. Pour passer au chiffre des dizaines, il faut décrémenter HL
de 2 octets car les chiffres font 8 pixels de larges donc 2 octets. Pour passer
aux chiffres suivants, il faut en plus sauter une case, donc HL est décrémenté
de 4 octets. Enfin, le sous-programme AFFICHE se charge de l’affichage du
chiffre dans A à l’adresse mémoire HL.
SCORES LD B,3 ; Pour
la gestion des centièmes, secondes puis des minutes
SCORES2 LD A,(DE) ;
Lecture des unités
LD
C,A
AND
&0F ; Isole les unités
PUSH
HL
CALL
AFFICHE ; Affiche le chiffre A à l'écran pointé par HL
POP HL
LD A,C
SRL A
SRL A
SRL A
SRL
A ; A = dizaines
DEC
HL
DEC
HL ; HL pointe le chiffre
écran des unités
PUSH
HL
CALL
AFFICHE ; Affiche le chiffre A à l'écran pointé par HL
POP
HL
DEC
DE ; DE pointe les unités
suivantes
DEC HL
DEC HL
DEC HL
DEC HL ;
HL pointe les unités suivantes à l'écran
DJNZ
SCORES2
RET
Enfin,
l’écran d’intro est affiché grâce au sous-programme AFSUPIMG.
INTRO XOR A
; Sélection banc 0 de la mémoire supérieure
CALL
AFSUPIMG ; Affichage de l'image d'intro
10-6-2
Gestion des touches et initialisation des coordonnées
Une fois
l’écran affiché, on attend une touche, grâce au vecteur &BB06. Une fois
qu’une touches est appuyée, on la compare aux 4 possibilités suivantes :
Si aucune touche n’est reconnue, on recommence à en attendre une.
INTRO2 CALL &BB06
; Attente d'une touche
CP
'q' ; touche q?
JP
Z,QUIT ; oui => QUIT
CP
'Q' ; Touche
Q?
JP
Z,QUIT ; oui => QUIT
INTRO3 CP '1' ;
Touche 1?
JR NZ,INTRO4 ; non => INTRO4
LD A,1
LD (NCOURSE),A ; course
courante = n°1
CALL
AFSUPIMG ; Affiche le circuit courant
LD
HL,XDEP1 ; Récupération des
coordonnées de départ
LD (XDEP),HL
LD A,YDEP1
LD (YDEP),A
LD
HL,XGR1 ; Récupération des
coordonnées X, Ymin et Ymax
LD (XGR),HL ; de la
grille de départ pour repérage des tours.
LD A,YGRMIN1
LD (YGRMIN),A
LD A,YGRMAX1
LD (YGRMAX),A
XOR A
LD
(ANGLEDEP),A ; Angle 0 = à droite
JP
COURSE ; => Course
INTRO4 CP '2'
; Touche 2?
JR
NZ,INTRO5 ; non => INTRO5
LD
A,2
LD
(NCOURSE),A ; course courante = n°2
CALL
AFSUPIMG ; Affiche le circuit courant
LD
HL,XDEP2 ; Récupération des
coordonnées de départ
LD (XDEP),HL
LD A,YDEP2
LD (YDEP),A
LD
HL,XGR2 ; Récupération des
coordonnées X, Ymin et Ymax
LD
(XGR),HL ; de la grille de départ pour
repérage des tours.
LD A,YGRMIN2
LD (YGRMIN),A
LD A,YGRMAX2
LD (YGRMAX),A
XOR A
LD
(ANGLEDEP),A ; Angle 0 = à droite
JP
COURSE ; => Course
INTRO5 CP '3'
; Touche 3?
JR NZ,INTRO2 ; non => INTRO2
LD A,3
LD
(NCOURSE),A ; course courante = n°3
CALL
AFSUPIMG ; Affiche le circuit courant
LD
HL,XDEP3 ; Récupération des coordonnées de départ
LD (XDEP),HL
LD A,YDEP3
LD (YDEP),A
LD
HL,XGR3 ; Récupération des
coordonnées X, Ymin et Ymax
LD
(XGR),HL ; de la grille de départ pour
repérage des tours.
LD A,YGRMIN3
LD (YGRMIN),A
LD A,YGRMAX3
LD (YGRMAX),A
LD A,4
LD
(ANGLEDEP),A ; Angle 4 = à gauche
JP
COURSE ; => Course
Arrêtons-nous
un instant sur les coordonnées :
Remarque :
pour simplifier les calculs de coordonnées, les Y suivent les n° de lignes et
non pas les Y CPC. Ainsi Y = 0 se trouve en haut de l’écran et non en bas. Donc
Ymin est la coordonnée la plus haute à l’écran et Ymax la coordonnée la plus
basse.
Il y a 8
angles de voitures :
10-6-2
Fonction quitter
Quand on appuie sur la touche ‘q’ ou ‘Q’, le programme arrive ici. On affiche alors « A Bientôt ! », on sauvegarde les scores et on fait un reset total. L’affichage commence par l’appel du sous-programme BOITE qui dessine une rectangle vert entouré de blanc. Puis on fait appel aux vecteurs &BB6F de positionnement X du curseur texte, et &BB72 de positionnement Y du curseur texte. Enfin, on utilise la routine PRINTF étudiée dans les parties précédentes.
QUIT CALL
BOITE ; Dessin de la boite de dialogue
LD
A,15 ; LOCATE 15,12 pour affichage
CALL
&BB6F ; du texte
LD A,12
CALL &BB72
LD HL,TEXTE4 ;
Affichage de "A BIENTOT !"
CALL
PRINTF
Ensuite, les scores (meilleurs temps) sont sauvegardés dans le fichier « scores.bin ». Pour cela, on fait appel aux vecteurs pour les fichiers de sortie, qui ne sont bien sure pas les mêmes qu’en lecture. &BC8C ouvre un fichier en éciture, dont le nom de longueur B est pointé par HL. Comme pour la lecture des fichiers, DE pointe la zone de 2ko pour la lecture de l’en-tête de fichier. Ensuite on appelle le vecteur &BC98 d’écriture dans un fichier. A définit le type de données (0 = basic, 1 = basic protégé, 2 = binaire et &16 = ascii). BC pointe le début du fichier, DE la taille des données et HL l’emplacement mémoire des données. Enfin on referme le fichier de sortie avec le vecteur &BC8F.
LD
HL,FSCORES ; HL pointe le nom de fichier
des scores
LD
B,10 ; B =
longueur du nom de fichier
LD
DE,&8000 ; DE =
Buffer pour l'en-tête de fichier
CALL
&BC8C ; Ouverture du fichier en
sortie
LD
A,2 ;
Type de donnée = binaire
LD
BC,0 ; Pointage au début du fichier
LD
DE,9 ;
Nombre d'octets = 3 scores de 3 octets
LD
HL,TEMPS1 ; HL pointe les scores
CALL
&BC98 ; Ecriture des scores dans
le fichier
CALL
&BC8F
;
Fermeture du fichier de sortie
Pour
sortir, on rétablit les interruptions et on fait un reset soft complet.
EI ;
Réautorise les interruptions
CALL
0 ; Reset total