La programmation du Copper sur Amiga est très particulière. Tout d'abord, ce coprocesseur graphique ne comprend que trois instructions, MOVE, WAIT et SKIP, auxquelles il est toutefois possible de rajouter JUMP, quoiqu'elle ne se code pas comme les autres. Ensuite, on n'écrit pas du code pour le Copper comme on écrit du code pour le 68000 : point de mnémoniques, il faut écrire directement en opcodes. Enfin, WAIT et SKIP présentent certaines limitations dont la prise en compte conduit à complexifier le code dès que ce dernier doit pouvoir fonctionner quelle que soit la ligne que le faisceau d'électrons - le raster - est en train de balayer à l'écran.
Paradoxalement, ces limitations n'entravent généralement pas la programmation d'effets visuels complexes comme le plasma ou l'affichage d'une image true color en plein écran - oui, l'Amiga 500 peut afficher en true color, et sans utiliser aucun bitplane par ailleurs -, c'est-à-dire sur toute la largeur des 320 pixels et toute la hauteur des 256 lignes de pixels d'une surface classiquement utilisée dans une démo en PAL. La surprise du codeur n'en est que plus grande quand il s'y heurte. Pour les dépasser, il faut exploiter l'information qui réside dans une section assez cryptique de l'Amiga Hardware Reference Manual. Explications.
Mise à jour du 14/01/2019 : J'ai oublié de mentionner qu'ayant la flegme de terminer la rédaction de la seconde partie, j'en ai inclu l'essentiel dans ici. En effet, le rotozoom s'appuie sur une solution au problème évoqué à la fin du présent article.
NB : Cet article se lit mieux en écoutant l'excellent module Skidtro composé par Sun / Dreamdealers pour la cracktro de Road Rash, mais c'est affaire de goût personnel...
Un bref rappel des bases du Copper
Avec le Copper, il est possible de modifier la valeur de certains registres à l'aide d'une instruction MOVE. Comme toute instruction du Copper, MOVE se code en composant son opcode sous la forme de deux mots successifs dans la liste des instructions qui constitue le programme que le Copper exécute à chaque trame, la Copper list.
Le premier mot d'un MOVE fournit l'offset du registre hardware dans lequel le Copper doit écrire une valeur - cet offset est donné à partir de l'adresse $DFF000, soit par exemple $0180 pour le registre COLOR00 qui de spécifier les valeurs des composantes rouge, vert et bleu de la couleur 0, dit couleur de fond. Le second mot fournit la valeur à écrire dans ce registre. Ce qui donne :
Ainsi le MOVE suivant passe COLOR00 à $0F00 (rouge) :