CODINGApprendre pas à pas la programmation en assembleur Z80 ★ Premiers programmes (briques indispensables) ★

Afficher un sprite soft

Afficher un sprite soft


Le CPC ne sait pas afficher de sprite hard comme le plus, donc nous allons déjà voir UNE technique parmi des tonnes d'autres pour afficher un sprite à l'écran. Grâce à notre routine de point, nous avons déjà le morceau de code qui calcule l'adresse destination. Reste à piocher dans les données d'un sprite et l'afficher à l'écran.
Le sprite sera affiché à l'octet près (il existe différentes techniques pour afficher un sprite au pixel près mais la plus performante consiste à stocker autant de sprites que de décalages nécessaires, c'est un peu trop verbeux pour être mis en avant dans ce cours débutant.

Commencez par télécharger [ce sprite] puis assemblez ce code source (vous avez le droit de le lire, il est commenté de partout).

BUILDSNA : BANKSET 0
ORG #100
RUN #100

ld bc,#7F00+%10001100+%00 : out (c),c ; MODE 0
; on règle quelques couleurs pour notre sprite
ld bc,#7F00 : out (c),c : ld a,#54 : out (c),a
ld bc,#7F01 : out (c),c : ld a,#44 : out (c),a
ld bc,#7F02 : out (c),c : ld a,#5C : out (c),a
ld bc,#7F03 : out (c),c : ld a,#5E : out (c),a
ld bc,#7F04 : out (c),c : ld a,#4E : out (c),a
ld bc,#7F05 : out (c),c : ld a,#43 : out (c),a
ld bc,#7F06 : out (c),c : ld a,#4B : out (c),a

ld bc,60 ; X=60
ld hl,80 ; Y=80
ld xl,21
ld xh,72
ld de,donnees_sprite
call AfficheSprite
jr $ ; terminé, on boucle à l'infini

AfficheSprite
; BC=coordonnée X (0-319)
; HL=coordonnée Y (0-199)
; DE=adresse des données du sprite
; XL=largeur du sprite en octets
; XH=hauteur du sprite en nombre de lignes
push de ; on met DE dans la pile car le calcul d'adresse s'en sert
call CalculeAdressePixel
pop de ; et on récupère DE
; HL=destination écran
; DE=toujours l'adresse source des données
ex hl,de ; on permute source et destination pour être utilisées
; avec l'instruction LDIR

.afficheLignes
ld b,0
ld c,xl ; chargeur la largeur d'une ligne
push de ; on met l'adresse de début de la ligne de côté
ldir ; copier la ligne de HL vers DE sur BC octets
pop de ; on récupère l'adresse du début de ligne
; et on calcule le passage à la ligne suivante
ex hl,de ; on permute HL et DE pour pouvoir faire des additions
ld bc,#800 : add hl,bc : jr nc,.dansLeBloc
ld bc,80-#4000 : add hl,bc ; changement de bloc!
.dansLeBloc
ex hl,de ; on permute à nouveau pour retrouver notre DE une ligne plus bas
dec xh ; notre compteur de lignes
jr nz,.afficheLignes
ret
;-------------------
CalculeAdressePixel
; BC=coordonnée X (0-159)
; HL=coordonnée Y (0-199)
; adresse de la ligne dans HL en résultat
ld de,tableau
add hl,hl ; adresses 16 bits, il faut indexer de 2 en 2
add hl,de
ld a,(hl) : inc hl
ld h,(hl) : ld l,a
srl bc : add hl,bc
ret
;-------------------
adresse_ecran=#C000
largeur_ecran=80
tableau
repeat 25
repeat 8
defw adresse_ecran
adresse_ecran+=#800
rend
adresse_ecran+=largeur_ecran
adresse_ecran-=#4000
rend

donnees_sprite incbin 'quiPique.bin'


Voilà, notre sprite est affiché à l'endroit voulu. Comme nous ne gérons aucune transparence et que la couleur du fond du sprite n'est pas celle de l'écran, cela montre le cadre correspondant aux données du sprite et la zone que nous avons recouvert à l'écran.

Pour bien comprendre pourquoi notre routine s'occupe du passage à la ligne écran mais d'aucun passage de ligne concernant les données sources. Cela tient à l'organisation des données en mémoire du CPC. Le sprite est stocké en mémoire, comme si il ne faisait qu'une seule longue ligne de longueur largeur x hauteur de notre sprite, ici 1512 octets.

En changeant le mode de visualisation d'ACE, on peut retrouver notre sprite en forme, si on indique à l'exploreur graphique un encodage CPC en mode 0, ainsi que la bonne largeur et hauteur.
Vous noterez comment retrouver facilement l'adresse du sprite depuis la trace (F7), vous appuyez sur (L) pour afficher la liste des labels de votre code source. L'adresse est affichée, vous pouvez cliquer dessus pour y sauter.

★ ANNÉE: 2025
★ AUTEUR: Roudoudou

Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 288 millisecondes et consultée 16 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.