CODING ★ INITIATION A L'ASSEMBLEUR, affichage de sprites ★

Initiation à l'assembleur, Affichage de SpritesCours et initiation du Fanzine Ghouls Fanz

Aujourd'hui, on va parler sprite. En effet, afficher un sprite est très important car on en a toujours besoin. Pour  une démo,  un  jeu, un  fanzine...  et  même parfois pour un utilitaire !

Un sprite est une suite d'octets logés en  mémoire  quireprésente un dessin  quand  il  est  correctement  affiché.  Onutilise un logiciel de dessin pour creer des  sprites:  OCP  Art Studio se revele etre l'utilitaire de reve.  Vous faites votre petit dessin, vous cliquez sur Windows, puis sur Define  Window,ensuite vous entourez votre sprite en utilisant les  lignes  quis'affichent à l'écran. Une fois sprite defini,  vous  recliquez sur Windows, puis sur File, puis enfin  sur  Save.  Faites  bien attention à ne pas sauvegarder votre sprite en mode compacté.

Un fichier à été créé sur votre disc. Il faut connaitre le nombre d'octets que prend  votre  sprite en largeur et en hauteur. Pour cela, utilisez le Super Monitor d'Antoine. Chargez votre sprite grace à la directive L, visualisez votre sprite par l'intermediaire de la  directive  V  (appuyez  sur  les  touches flechées et Shift pour visualiser votre sprite sous sa forme  d'origine, puis appuyez alors  sur  la  touche   ESC  quand  votresprite est correctement affiché). 3 informations vous sont alors données: la largeur (X) de votre sprite, sa  hauteur  (Y)  ainsi que la longueur que prend votre  sprite  en  mémoire.  Attention cependant, ces 3 nombres sont exprimés en hexadécimal !

Ensuite, prenez  votre  assembleur  favori  et  chargez votre sprite à l'adresse où vous le voulez (mais  pas  dans  deszones déjà occupées !). Il nous faut créer une routine qui  nouspermette d'afficher notre sprite correctement. Pour cela,  jetez un coup d'œil sur cette routine:

    ORG #9000
   ENT $      ;
SPRITE LD HL,#A000   ; Source
   LD DE,#C000   ; Destination
   LD B,#0A      ; Hauteur du sprite (Y)
SPRITE1   PUSH BC
   PUSH DE
   LD B,#0C      ; Largeur du sprite (X)
SPRITE2   PUSH BC
   LD A,(HL)
   LD (DE),A
   INC HL
   INC DE
   POP BC
   DJNZ SPRITE2
   POP DE
   LD A,D
   ADD A,8
   LD D,A
   JR NC,SPRITE3
   LD BC,#C050
   EX DE,HL
   ADD HL,BC
   EX DE,HL
SPRITE3   POP BC
   DJNZ SPRITE1
   RET

J'explique. Vous mettez  dans  HL  l'adresse  de  votre sprite logé en mémoire, vous mettez dans  DE  l'adresse-écran  de destination (pour cette routine, n'utilisez que  la  mémoire  de#C000 à #FFFF). Vous mettez aussi dans la routine la hauteur  et la largeur du sprite (là où c'est indiqué dans le source).

Coté programmation, rien de très dur à comprendre, sauf peut-être ces suites d'instructions:

     LD A,D
    ADD A,8
    LD D,A
    JR NC,SPRITE3
    LD BC,#C050
    EX DE,HL
    ADD HL,BC
    EX DE,HL
SPRITE3

Cette  routine  assez   spéciale   permet   de   donner l'adresse-écran située juste au-dessous de celle donnée dans DE. Notons que si  votre  sprite  fait  seulement  1  caractère   dehauteur, vous n'aurez besoin que de ces suites d'instructions:

     LD A,D
    ADD A,8
    LD D,A

Ce truc ne peut s'utiliser que lorsque DE  pointait  au debut de la routine sur une adresse-écran qui commencait sur  lapremière ligne d'un caractère. Si tel n'est  pas  le  cas,  vous devrez faire un petit calcul du style  8  (=1  caractère)  -  nbligne de caractère de debut, le nombre obtenu étant  la  hauteur maximale de votre sprite... De meme, si vous  utilisez  en  même temps la pile pour afficher votre sprite, vous aurez une routine vraiment rapide. Tout ceci pour gagner  quelques  micro-secondes lors de l'affichage... Il est évidemment possible d'avoir une routine qui soitbien plus rapide que celle décrite précedemment, mais  elle  estdéjà un peu plus complexe (et cela depasse  le  cadre  de  cetterubrique). Cependant, selon votre courrier, il est possible  que j'en parle dans Ghoul's Fanz 5...

Normalement cet article devrait se terminer  ici   maisj'ai envie de vous parler du Flipping qui servira également à la rubrique "perfectionnement à l'assembleur"...

Le flipping c'est quoi ? Cette technique repose sur  la permutation de 2 écrans. En effet,  avec  la  technique  décrite plus haut, si vous affichez un sprite qui possede une hauteur de 40 lignes par exemple, et bien vous aurez de fortes chances pourque  votre  sprite  apparaisse  de  manière  saccadée, "coupée". Pourquoi ? Parce que tout simplement le canon à électron "passe" sur votre animation ! Cela provoque  un  décalage  de  temps  de l'ordre de 1/50eme de seconde, mais cela suffit à ce que  l'œil humain puisse voir le bug...

Donc le principe: on s'occupe de  remplir  un  écran  à notre volonté tandis que l'on affiche un autre écran. Quand on afait toutes les modifications que l'on voulait faire  sur  notre premier écran, on l'affiche, et on bosse alors sur  le  deuxième écran (qui n'est pas affiché), on affiche notre second écran, et ainsi de suite...

L'avantage de cette routine est que  l'on  peut  mettre beaucoup de temps à construire notre écran. Ce qui veut dire quenous ne sommes pas limités à 1/50 de seconde pour remplir  notreécran ! On peut encore avoir une  animation  fluide  à  2/50  de seconde. Quand aux jeux, ils tournent à environ 5/50 de  seconde(cela dépend tout de même du type de jeu).

L'inconvénient de  cette  routine  -  car  il  y  a  uninconvénient - est de devoir utiliser  2  écrans  au  lieu  d'un seul. Cette technique n'est pas utilisable si l'on veut utiliserde l'overscan total (plein écran) (enfin si c'est possible  mais il faudrait alors utiliser de la rupture,  et  la  zone  de  jeu serait  assez  petite  en  hauteur  (la  moitié  de  l'écran  au maximum)). Sur des écrans deformés, la  technique  peut  devenir interessante ! En effet, imaginez un écran en overscan  verticalcoupé de moitié en hauteur, on pourrait utiliser un  seul  écran(par exemple en #C000 pour avoir une routine BC26 qui fonce  !). C'est d'ailleurs une des  principales  raisons  du  pourquoi  du comment que pas mal de jeux possedent des  écrans  reconfigurés.En attendant, il est tout à fait possible de faire  du  Flipping sur des écrans normaux (pas d'overscan), il suffit  de  permuter entre l'écran en #C000 et celui en #4000  (pour  simplifier  les choses)...

Voici un exemple de  ce  à  quoi  la  routine  pourrait ressembler:

    ORG #9000
   ENT $
BOUCLE CALL #BD19
TYPE   LD A,0     ; Ne pas mettre de XOR A
   OR A
   JR Z,TYPE1
   XOR A
   LD (TYPE+1),A
   LD BC,#BC00+12
   OUT (C),C
   LD BC,#BD00+%00110000   ; #C000
   OUT (C),C
   JR TYPE2
TYPE1  INC A
   LD (TYPE+1),A
   LD BC,#BC00+12
   OUT (C),C
   LD BC,#BD00+%00010000   ; #4000
   OUT (C),C
TYPE2
   CALL #BB09
   CP 32
   JP NZ,BOUCLE
   LD A,2          ; A=2
   CALL #BC0E        ; MODE A
RET

A la fin du programme, on met le MODE 2 (mode graphique evidemment) pour remettre l'offset à sa valeur initiale.

Voila. Ca a l'air plutot simple, non ?  A  chaque  fois que vous modifiez l'offset de votre écran,  c'est  là  que  vous devrez aussi changer les adresse-écrans où afficher vos sprites.

Avec tout ca, vous pouvez  déjà  vous  lancer  dans  la programmation d'un petit jeu fluide ! (Enfin bon, les bases sont posées, c'est à vous de faire le reste, non mais !).

Bah voila. On en arrive donc à la fin de  cet  article. J'espère qu'il vous a plu ! Si vous voulez voir à quoi peut vousservir le Flipping dans les démos, je vous conseille de faire un petit  tour du coté de la rubrique "perfectionnement à l'assembleur !".

Ghoul's Fanz

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Perfectionnement à L'assembleur : Le Flipping
» Coding » Le Design
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 054 millisecondes et consultée 5033 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.