ASMtrad CPC

Apprenez l'assembleur Z80

Masquage au XOR.

Dans la série masquage avec contrainte, j'invoque le masquage au XOR !!!

Utilisée essentiellement dans les premiers jeux du cpc ou dans d'autres plus récents mais en manque de cpu, la technique de masquage au XOR est une technique rapide mais à contrainte.
En effet, contrairement à la technique précédente de masquage avec un masque, ici, non seulement pas besoinde masque, et en plus le tout sera plus rapide
Le seul soucis c'est que la superposition d'éléments graphiques modifiera le contenu

Nous pourrons citer utilisants cette technique des jeux comme Sorcery; les deux premiers Cauldron ou encore Commando.

Voyons le XOR:

xor

Comme on peut le voir, le XOR garde un bit à 1 tant que le bit XORé avec lui est un 0.

Si notre fond est noir, cela permet par exemple d'afficher tranquillement dessus n'importe quoi, puisque le sprite contenant des 1 et des 0 sera toujours XORé avec un 0.

Les bits à 1 seront donc préservés et ceux à 0 aussi.

C'est donc notre première contrainte, car dans le cas d'un fond qui serait dans une autre encre (et aurait donc des bits à 1), le sprite affiché avec un XOR par dessus serait altéré dès qu'un bit de celui-ci serait à 1 (puisque 1 et 1 donne 0).
Nous sommes donc bien obligé d'avoir un fond en encre 0 afin que tous les bits de celui-ci soient à 0.

Forcément, vous-vous demandez ou est l’intérêt de ce genre de technique...
L'interet c'est dans l'effaçage !!!

Imaginons Qu'un bit de notre sprite soit à 1...

Vous affichez avec un XOR sur le fond.
1 XORé avec le fond à 0 donnera bien 1. Notre bit sera bien à 1 et notre pixel affiché.

Maintenant, réaffichons notre sprite exactement au même endroit à nouveau avec un XOR...

Notre bit est à 1... Nous faisons à nouveau un XOR avec notre sprite donc le bit du pixel est à 1...
1 XOR 1=... 0 !!! Notre sprite est donc automatiquement effacé !!!

En effet, XORer deux fois la même donnée revient à tout mettre à 0.
Nous retrouvons donc notre fond en encre 0.

Attention cependant à cette technique.
Elle interdit les chevauchements sous peine de changement de couleurs !!!

Imaginons qu'à l'endroit ou nous affichons, un ennemis est venu se mettre.

Prenons l'encre du premier octet de celui-ci qui serait par exemple binairement (woai ca se dit chez moi ça...) %01.

Si notre sprite lui, a par exemple son premier pixel en encre 15, les bits de ce pixel sont donc %11.
%01 XOR %11 donnera: %10.
Ainsi, au lieu d'avoir l'encre 15, nous aurons une autre encre (comme je n'ai pas donné les 4 bitplans de l'encre, je ne peux pas vous dire laquelle...).

Voila pour cette technique rapide qui aura quand même dépanné dans pas mal de jeux de la belle époque.

Pour finir une petite routine vite fait afin de tester chez vous.

Affichez une fois un sprite en appelant cette routine.
Effacez-le en rappelant la même routine.

Vous pourrez ensuite réessayer en écrivant quelque chose à l'emplacement du sprite, avant de relancer la routine une fois de plus...

Le sprite sera en ram en #4000.

                                ORG     #8000
                                NOLIST              ;instruction MAXAM pour éviter le listing à l'assemblage
                                LD      DE,#4000    ;adresse du sprite
                                LD      HL,#c000    ;destination
                                LD      B,24        ;hauteur

                SPRITE          PUSH    BC
                                PUSH    HL
                                LD      B,6         ;largeur
                LARGE           LD      A,(DE)
                                XOR     (HL)        ;notre fameux XOR entre le fond et le sprite
                                LD      (HL),A      ;on envois l'octet XORé
                                INC     HL
                                INC     DE
                                DJNZ    LARGE

                                POP     HL
                                CALL    #BC26       ;Vecteur System de calcul de la ligne inférieur
                                POP     BC
                                DJNZ    SPRITE
                                RET