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

 

 

<< RETOUR  ---  SUITE : Initialisation de la course >>