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

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  meme 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'oeil 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-etre 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  meme 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'oeil 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 meme 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

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 046 millisecondes et consultée 1538 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.