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 :
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.
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 :
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