Les sprites
Le circuit VIC II
Ce circuit va nous permettre de gérer des sprites (numérotés de 0 à 7).
Les registres:
Le principe est le suivant, il y a tout une série de registres qui vont permettre d'activer, de positionner les sprites.
Les registres sont les suivants:
REGISTRE |
DESCRIPTION |
0-15 |
SPRITE POSITIONING |
16 |
EXTRA MOVEMENT |
21 |
ENABLE (ON/OFF) |
23 |
EXPAND (VERTICAL) |
27 |
PRIORITIES |
28 |
MULTI-COLOR SELECT |
29 |
EXPAND (HORIZONTAL) |
37-38 |
MULTI-COLORS |
39-46 |
COLOR |
L'adresse de départ de ces registres est la suivante : 53248
Si vous voulez affecter un registre particulier, il suffit donc de faire: POKE 53248 + numéro de registre, valeur.
Le dessin du sprite:
Le dessin fait 24X21 pixels.
24 = 3X8 bits, l'image va donc occuper 3 octets en horizontale.
Comme il y a 21 lignes, cela nous donne 3*21 = 63 octets
Maintenant, il faut indiquer au circuit où se trouve l'image de ce sprite.
Pour cela, vous utiliserez les adresses allant de 2040 à 2047.
Chacune de ces adresses (sur 8 bits) appartient à 1 sprite, donc:
2040 pour le sprite 0
2041 pour le sprite 1
…
2047 pour le sprite 7
Pour indiquer au circuit où trouver l'image du sprite, on indiquera dans cette adresse l'emplacement du dessin qui doit pointer à une adresse multiple de 64.
Par exemple, si l'adresse est 1024, valeur intéressante car multiple de 64, il faudrait alors indiquer la valeur 16 à l'adresse 2040+numero du sprite.
La couleur du sprite:
Ce sont les registres 39 à 46 qui vont indiquer l'une des 16 couleurs (valeur de 0 à 15).
Le registre 39 pour le sprite 0, 40 pour le sprite 1, ...
Positionner les sprites à l'écran:
Les registres 0 à 15 gère la position des sprites:
0 pour les abscisses du sprite 0
1 pour les ordonnées du sprite 0
2 pour les abscisses du sprite 1
3 pour les ordonnées du sprite 1
...
14 pour les abscisses du sprite 7
15 pour les ordonnées du sprite 7
Problème: pour les abscisses, on ne pourrait gérer que des positions allant de 0 à 255 pour tous les sprites ! Or l'affichage peut aller jusqu'à 320 !!!
Il nous manque donc 1 bit pour pouvoir gérer ces déplacements au délà de 255. C'est justement le rôle du registre 16.
Chacun des bits sont les "extras bits" des sprites permettant d'afficher le sprite au-delà de 255.
Le bit 0 pour le sprite 0
Le bit 1 pour le sprite 1
...
Le bit 7 pour le sprite 7
Afficher le sprite:
C'est le registre 21 qui gère l'affichage des 8 sprites. Le bit 0 pour le sprite 0, le bit 1 pour le sprite 1, le bit 7 pour le sprite 7.
Changer la taille d'affichage:
On peut doubler la taille en X grâce au registre 23 et en Y grâce au registre 29.
Là aussi, chaque bit correspondant à un sprite (1 pour ON, 0 pour OFF).
Priorité d'affichage:
Les sprites ont des priorités d'affichage.
En fait, le sprite 0 apparaîtra au dessus de sprite 1 qui lui même apparaîtra au dessus du sprite 2, ... jusqu'au 7.
De la même manière, vous pouver indiquer grâce au registre 27 si un sprite apparaît au dessus ou en dessous des caractères (ON sur le bit dont la position correspond au sprite souhaité (0 pour sprite 0, 1 pour sprite 1, ...).
Exemple:
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
|
|
X |
|
|
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
X |
X |
X |
|
|
|
X |
|
X |
|
X |
|
|
|
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
X |
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
X |
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
X |
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
X |
|
|
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
X |
X |
X |
|
|
X |
X |
X |
|
|
X |
X |
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
L'exemple est utilisable sous l'émulateur Vice. Il suffit d'attacher l'image de la cassette (Menu file). Puis de taper sous BASIC: LOAD "SPRITE"