Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - AGA 3D rasters
(Article écrit par Lionel Guillang et extrait d'Amiga News - octobre 1993)
|
|
Après de longs mois d'absence, revoici de quoi nourrir votre insatiable appétit d'assembleur (quoi, j'exagère ?).
Et pas n'importe quoi, s'il vous plaît, puisqu'il s'agit d'aller titiller les puces AGA de votre Amiga tout
neuf (ou presque !). C'est Monsieur Commodore qui va pas être content, mais tant pis, c'est trop bon !
Le plat du jour
Le petit programme que je vous propose aujourd'hui met en évidence un des aspects des nouvelles
puces AGA : la fluidité des dégradés, grâce à la nouvelle palette 24 bits. Pour ce faire, nous allons
mettre en scène des rasters qui évolueront en 3D. J'aurais pu simplement faire un défilement
vertical des quelque 16 millions de couleurs, mais c'eût été, vous en conviendrez, nettement moins amusant !
Palette 24 bits
Les registres matériels étant toujours, pour des raisons de compatibilité, des registres 16 bits, l'accès
aux registres couleurs se fait désormais en deux fois 12 bits, mais sur le même registre, avec un drapeau
fixé ou non (bit 9 du registre $0106) qui indique si l'accès porte sur les quartets de poids fort ou de
poids faible des composantes RGB. Un petit exemple : on veut mettre la couleur $FDA8C6 (R=$FD, G=$A8, B=$C6)
dans le registre 0, voici comment écrire la liste Copper :
dc.w $0106,$0000 ; accès aux bits de poids fort
dc.w $0180,$0FAC ; bits de poids fort
dc.w $0106,$0200 ; accès aux bits de poids faible
dc.w $0180,$0D86 ; bits de poids faible
|
Il est absolument indispensable que le registre de poids fort soit adressé le premier. Par défaut, le registre $0106 est à
0 sur les Amiga ECS et que ce sont exclusivement les bits de poids fort qui sont utilisés dans ce cas (palette 12 bits),
et non ceux de poids faible. Naturellement, si le registre $0106 doit être utilisé simultanément pour d'autres choses,
il faudra faire un OR avec les valeurs données ci-dessus.
L'accès aux 256 couleurs se fait sur 8 fois 32 registres (les mêmes que sous ECS) et les bits du registre $0106 (encore lui !)
servant à coder le numéro de la tranche (0 à 7) à laquelle on veut accéder sont les bits 13 à 15.
Le programme
En dehors du fait que l'on accède à une palette 24 bits, rien de bien compliqué ni de très nouveau.
Après avoir désactivé le multitâche, on construit les deux listes Copper nécessaires au double tampon
mémoire (un CWAIT à chaque ligne suivi d'un CMOVE (plusieurs en réalité puisqu'on accède sur 24 bits)
sur le registre couleur 0), puis deux rasters de 128 lignes chacun ; la séparation bits de poids fort bits
de poids faible est calculée à l'avance (chaque couleur est stockée dans deux mots) pour accélérer le
rafraîchissement de la liste Copper pendant l'animation.
L'animation qui se fait sous interruption
raster (VBL), consiste à faire avancer vers soi ou reculer deux rangées de rasters selon que la souris
est déplacée vers le bas ou le haut. Pour que le mouvement soit plus convaincant, on alterne la couleur
des rasters. Concrètement, on commence par commuter les listes Copper, pendant le retour vertical.
On lit ensuite la souris et on rafraichit la liste Copper. La partie 3D est on ne peut plus simple puisque
les rasters n'ont pas d'abscisses, et que les ordonnées sont constantes ; seules les coordonnées Z évoluent.
Toujours pour simplifier, chacun des huit rasters de chaque rangée voit sa position en Z cycler dans
un intervalle de [0,127], à laquelle est ajoutée un décalage croissant au fur et à mesure que l'on se rapproche
de l'observateur, ce qui donne un intervalle de [0,1023] pour toute la rangée.
La taille du raster à dessiner est obtenue en ramenant la position Z de l'intervalle [0,1023] à [0,63] ;
la compression de la hauteur du raster se fait par le centre : on dessine d'abord h/2 lignes en partant
du début de la table, puis les h/2 lignes suivantes sont obtenues par symétrie. On clippe chaque raster
dans la liste Copper avant de le dessiner, histoire de ne pas écrire n'importe où dans la mémoire.
C'est tout.
Tous les accès à la liste Copper se font avec le Blitter, en mode burst (mode "rafale", actif par
défaut). Vous pouvez modifier les constantes YSTART et HEIGHT qui correspondent respectivement à la
première ligne raster de la zone de dessin et à sa hauteur ; les valeurs données en exemple ont été
choisies pour obtenir le suraffichage maximal sur mon moniteur 1942. Inutile de dépasser un total
YSTART+HEIGHT de 314, le Copper ne pouvant adresser plus.
Le programme est prévu pour tourner à une fréquence verticale de 50 Hz ; ceux d'entre vous qui possèdent
un moniteur multisynchro devront veiller à ce que l'écran actif au moment de l'exécuter soit un écran PAL,
aucune commutation de fréquence n'étant prévue dans les initialisations, faute de place. Mais rien ne vous
empêche de faire des essais en mode Double PAL par exemple, qui permet, comme son nom l'indique, de doubler
le nombre de lignes adressables par le Copper, soit 564 au lieu de 282 dans notre exemple (vous devrez
alors modifier la constante HEIGHT en conséquence).
Voilà, si tout va bien nous verrons par la suite comment utiliser le mode 256 couleurs, le mode HAM8
(262 144 couleurs), les sprites, les différents modes Blitter, etc.
Alors ne manquez pas les prochains Amiga News !
Listing
|