10-5 Initialisation de jeu

10-5-1 Les constantes

 

Le programme assembleur commence par la déclaration des constantes du jeu :

 

; Définition des constantes

 

KBDEL    EQU 10                 ; Délai avant la répétition de touche (en 50èmes de secondes)

KBREP    EQU 10                 ; vitesse de répétition du clavier (en 50èmes de secondes)

 

HSPRITE  EQU 10                 ; Hauteur du sprite de la voiture

LOSPRITE EQU 4                  ; Largeur du sprite en octets (uniformisé par rapport aux offsets segments)

TSPRITE  EQU HSPRITE * LOSPRITE ; Taille du sprite en octets

 

VITESMAX EQU 5                  ; Vitesse maximum de la voiture (vitesse min = 0)

VITEDEL1 EQU 4                  ; Délai pour la vitesse 1

VITEDEL2 EQU 2                  ; Délai pour la vitesse 2

 

XDEP1    EQU 178                ; Coordonnée X de départ de la course 1

YDEP1    EQU 43                 ; Coordonnée Y de départ de la course 1

XGR1     EQU 176                ; X de la grille de départ de la course 1

YGRMIN1  EQU 31                 ; Ymin de la grille de départ de la course 1

YGRMAX1  EQU 64                 ; Ymax de la grille de départ de la course 1

 

XDEP2    EQU 198                ; Coordonnée X de départ de la course 2

YDEP2    EQU 45                 ; Coordonnée Y de départ de la course 2

XGR2     EQU 196                ; X de la grille de départ de la course 2

YGRMIN2  EQU 32                 ; Ymin de la grille de départ de la course 2

YGRMAX2  EQU 65                 ; Ymax de la grille de départ de la course 2

 

XDEP3    EQU 183                ; Coordonnée X de départ de la course 3

YDEP3    EQU 173                ; Coordonnée Y de départ de la course 3

XGR3     EQU 185                ; X de la grille de départ de la course 3

YGRMIN3  EQU 160                ; Ymin de la grille de départ de la course 3

YGRMAX3  EQU 193                ; Ymax de la grille de départ de la course 3

 

 

Les constantes sont déclarées avec la directive EQU qui permet de donner un nom à leur valeur. Contrairement aux variables définies comme une étiquette pointant une case mémoire, il n’est pas possible d’en modifier la valeur. Ces constantes sont donc des valeurs immédiates utilisées comme des nombres, mais avec en plus les avantages suivants :

 

 

Paramétrage de fonctions

 

Plutôt que d’aller chercher au fin fond du programme l’endroit où se trouve certains paramètres, on utilise des constantes facilement modifiables en début de fichier. C’est le cas notamment avec la définition de la répétition des touches du clavier. C’est le genre de choses que l’on modifie plusieurs fois dans un programme avant de tomber sur les bonnes valeurs. C’est donc pour cela que KBDEL et KBREP ont été déclarées. Elles seront ensuite utilisées de la manière suivante :

 

; Initialisation du clavier

 

         CALL &BB00             ; Initialisation du clavier

         LD H,KBDEL

         LD L,KBREP

         CALL &BB3F             ; Définition des répétitions du clavier

 

 

Réutilisation simple de morceaux de code

 

Le programme possède des morceaux de codes tels que la gestion des sprites, entièrement paramétrés avec des constantes. Ainsi, il est possible de les réutiliser facilement dans un autre programme, à condition de penser à redéfinir les constantes.

 

 

Lisibilité du programme

 

Les constantes peuvent par exemple servir pour des comparaisons, c’est le cas de VITESMAX qui est la vitesse maximum de la voiture. Bien entendu elle sert avant tout de paramètre du programme, facilement modifiable donc, mais la comparaison suivante permet aussi d’y voir plus clair :

 

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

 

 

En plus, il est possible de créer des constantes par calcul sur d’autres constantes :

 

HSPRITE  EQU 10                 ; Hauteur du sprite de la voiture

LOSPRITE EQU 4                  ; Largeur du sprite en octets (uniformisé par rapport aux offsets segments)

TSPRITE  EQU HSPRITE * LOSPRITE ; Taille du sprite en octets

 

TSPRITE = 40, mais on ne se soucis même pas de sa valeur en fait. Elle est par exemple utilisée pour réserver un espace mémoire de la taille d’un sprite :

 

FOND     DS TSPRITE           ; Zone de mémo du fond d'écran (TSPRITE octets)

 

 

Il y a 3 groupes de constantes permettant de paramétrer une course en fonction du n° de circuit. Elles définissent les coordonnées X et Y de départ de la voiture, ainsi que les coordonnées de la grille de départ pour repérer si un tour est finit. On aurait pu se baser sur les coordonnées de départ pour repérer les fins de tour, mais il aurait été compliqué de désactiver le repérage quand la voiture se trouve sur la grille de départ. C’est pour cela que la voiture démarre légèrement décalé par rapport à la ligne.

 

 

10-5-2 Initialisation du clavier

 

Cette fonction a été entrevue ci-dessus.

 

; Initialisation du clavier

 

         CALL &BB00             ; Initialisation du clavier

         LD H,KBDEL

         LD L,KBREP

         CALL &BB3F             ; Définition des répétitions du clavier

 

Elle fait appel aux vecteur &BB00 et &BB3F. Le premier qui réinitialise le clavier, désactive les actions comme le CAPS LOCK et vide le buffer des touches. Le deuxième définit les répétitions du clavier. La valeur contenue dans H définit le délai (en 50èmes de secondes) avant répétition des touches. La valeur contenue dans L définit le temps entre chaque répétition (en 50èmes de secondes toujours).

 

 

10-5-3 Chargement des images en mémoire supérieure

 

Il y a 4 écrans, et ça tombe bien puisque la mémoire supérieure contient 4 blocs de la taille d’un écran. C’est donc tout naturellement qu’on va les charger dedans à l’initialisation, afin d’y avoir rapidement accès pendant le jeu. Les images seront ensuite lues avec la fonction AFSUPIMG. 

 

; Chargement des images en mémoire supérieure. Banc 0 = intro et

; bancs 1 à 3 = courses 1 à 3.

 

         LD BC,&0433            ; B = nombre de fichiers

                                ; C = n° de fichier en ascii.

CHARGIMG PUSH BC                ; mémo de BC

         LD HL,FICHIERS         ; HL pointe le nom des fichiers

         LD (HL),C              ; nom de fichier = (C).bin

 

         LD A,B                

         DEC A                  ; A = n° de banc

         OR %11000100           ; + combinaison d'accès à la mémoire supérieure

         LD BC,&7F00            ; Demande d'accès au GATE-ARRAY

         OUT (C), A             ; Accès à la requète

 

         LD B,5                 ; B = longueur des noms de fichiers

         LD DE,&8000            ; DE = Buffer pour l'en-tête de fichier

         CALL &BC77             ; Ouvre le fichier dont le nom est en HL

         LD HL,&4000            ; HL pointe l'écran intermédiare

         CALL &BC83             ; Lecture de l'image dans cet écran

         CALL &BC7A             ; Fermeture du fichier

 

         POP BC

         DEC C

         DJNZ CHARGIMG          ; fichier et banc suivants

 

Les images sont nommées 0.BIN, 1.BIN, 2.BIN et 3.BIN, on va donc recréer le nom du fichier courant avec le compteur de boucle.

 

FICHIERS DB "?.bin"             ; Chaine pour les noms des fichiers images

 

Au début, B = le nombre de fichiers. Il va donc servir au rebouclage DJNZ pour lire tous les fichiers. C est chargé avec le code ascii 33, c’est à dire ‘3’. Ensuite HL pointe le nom commun aux fichiers et le ? est remplacé par le code ascii dans C. C est ensuite décrémenté, on charge donc les images dans l’ordre inverse, soit 3.BIN, 2.BIN ,1.BIN puis 0.BIN.

 

On fait ensuite appel au Vidéo Gate Array pour placer un bloc de mémoire supérieure en &4000. Et évidemment, on fait appel au n° de bloc correspondant au n° de fichier. Ainsi on aura l’image 0.BIN dans le bloc 0, 1.BIN dans le bloc 1,…

 

On ouvre alors le fichier courant grâce aux 3 vecteurs suivant :

 

  1. &BC77 : ouvre un fichier en lecture dont le nom est pointé par HL, de longueur de chaine B. l’en-tête de fichier de 2ko, contenant les informations sur le fichier, est lu à l’adresse pointée par DE (ici &8000).
  2. &BC83 : copie le contenu du fichier à l’adresse pointée par HL (ici &4000). Comme la mémoire supérieure est activée, c’est donc bien dans le bloc supérieur courant qu’est recopié le fichier.
  3. &BC7A : referme le fichier lu.

 

 

10-5-4 Chargement des fichiers de scores

 

Les scores, c’est à dire les meilleurs temps de chaque course, sont chargés au départ du jeu, puis sauvegardés à la fin. Ceci permet de conserver les meilleurs temps. Le fichier de sauvegarde est « scores.bin » et pendant le développement, il a été créé de la manière suivante :

 

         ORG &4000

 

         DB &59,&59,&99

         DB &59,&59,&99

         DB &59,&59,&99

 

Les 3 lignes correspondent aux temps maximum des 3 courses en BCD au format 59min59sec99cent. Ils ont ensuite été compilés et sauvegardés avec la commande BASIC suivante :

 

Save « scores.bin »,b,&4000,9

 

Le fichier est lu de la même manière que les images, sauf que la destination est le bloc de données des scores (TEMPS1, TEMPS2, TEMPS3)

 

; Chargement du ficher des scores = meilleurs temps de chaque course.

 

         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 &BC77             ; Ouvre le fichier dont le nom est en HL

         LD HL,TEMPS1           ; HL pointe les scores

         CALL &BC83             ; Lecture des scores

         CALL &BC7A             ; Fermeture du fichier

 

 

10-5-5 Définition de la palette

 

La palette est la même pour tout le jeu, on la définit donc une bonne fois pour toute en tout début. Pour cela on utilise le vecteur &BC32 (set ink). A contient le n° de couleur à définir, B contient la première couleur et C la deuxième. Quand B et C sont différentes, cela permet d’avoir des couleurs clignotantes. Sinon on place la même valeur dans les 2 registres 8 bits. Pour le codage des couleurs, reportez-vous à la partie 9.

 

; Définition de la palette du jeu qui est la même pour toutes les images.

; INK 0 = orange = transparent, INK 1 = vert, INK 2 = blanc et INK 3 = rouge

 

         XOR A                  ; A = 0

         LD BC,&0F0F            ; Couleur 0 = Orange

         CALL &BC32             ; Définition encre 0

         LD A,1                 ; A = encre 1

         LD BC,&0909            ; Couleur 1 = Vert

         CALL &BC32             ; Définition encre 1

         LD A,2                 ; A = encre 2

         LD BC,&1A1A            ; Couleur 2 = Blanc

         CALL &BC32             ; Définition encre 2

         LD A,3                 ; A = encre 3

         LD BC,&0606            ; Couleur 3 = Rouge

         CALL &BC32             ; Définition encre 3

 

 

10-5-6 Initialisation des variables communes aux courses

 

Certaines variables sont communes à toutes les courses, on peut donc les initialiser en dehors de la boucle principale. De plus, comme elles réinitialisent les scores, on ne peut pas les mettre dans l’initialisation de la course courante. Ces variables sont le temps et les nombre de tours et de vies.

 

; Initialisation des variables communes aux courses

 

INITVAR  XOR A                  ; A = 0

         LD (TEMPS),A           ; Temps = 00 m 00 s 00

         LD (TEMPS+1),A

         LD (TEMPS+2),A

         LD A,3

         LD (VIES),A            ; Nombre de vies = 3

         LD (TOURS),A           ; Nombre de tours de pistes à faire

 

 

<< RETOUR  ---  SUITE : Ecran d’introduction >>