Les players (2)

Pour cet exercice, nous allons afficher un score à l’aide des players. Comme nous l’avons vu précédemment, un player peut être dupliqué jusqu’à 3 fois horizontalement, mais laisse un trou de 8 pixels (soit la largeur d’un player) entre chaque exemplaire. Nous allons donc imbriquer les 2 players sur la même bande horizontale, le deuxième positionné 8 pixels à droite du premier, afin d’afficher le score composé de 6 chiffres.

Bon… quand faut y aller… plongeons dans le cambouis !
Quelques explications tout d’abord…
Nous avons vu précédemment que pour placer un player horizontalement, il faut affecter le registre RESP0 ou RESP1, lorsque l’endroit désiré est balayé par le canon à électrons de votre télé.
Grâce à une affectation à WSYNC, nous savons synchroniser notre code avec le début du balayage d’une ligne. Il faut donc attendre le temps nécessaire au balayage pour atteindre la position souhaitée.
Simple ? Non ! Car le processeur qui s’occupe notamment du balayage tourne grosso-modo 3 fois plus rapidement que notre processeur 6507 : pour le TIA, une ligne ntsc est composée de 68 cycles d’horizontal blank + 160 cycles visibles ( = pixels) = 228 cycles. Alors que sur cette même ligne, le 6507 consomme 22 cycles pendant l’horizontal blank + 53 cycles pendant la partie visible = 76 cycles au total. Sachant que la moindre instruction exécutée par le 6507 consomme au minimum 2 cycles, nous voila déjà 6 pixels plus loin… bonjour la précision ! Mais de précision nous n’en avons point besoin pour le moment, centrer approximativement le score suffira à notre bonheur (nous verrons plus tard comment positionner précisément, ce sera l’objet d’un prochain exercice).

Notre score fait 6 * 8 = 48 pixels. Pour le centrer, il doit être à (160 – 48) / 2 = 56 pixels.
Pour parcourir 56 pixels, le processeur doit consommer 56 / 3 = 19 cycles, auxquel il faut ajouter l’horizontal blank qui dure 22 cycles, soit au total 41 cycles.

C’est ici que le comptage précis des cycles consommés devient important.
Pour connaitre la durée de chaque instruction, vous pouvez utilement consulter ce site :

http://www.6502.org/tutorials/6502opcodes.html

Considérons ce bout de code :

   ; Positionnement horizontal du score
   sta WSYNC ; 3 = nombre de cycles
   dey       ; 2  
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
             ; total 41
             ; 22 de HBLANK + 19, soit 57 pixels
   sta RESP0 ; 3   
   sta RESP1 ; 3 cycles plus loin, nous sommes 9 pixels plus loin !

   dey
   sta WSYNC
   
   ; Affichage du player
   jsr DrawP0Pos1 ; 8 lignes 

A l’exécution de ce code test, que constatons-nous ?

Imbrication des players - test 1

Oui, comme on s’y attendait, le 2e player s’affiche 9 pixels après le premier, soit 1 pixel trop à droite.
Heureusement, dans sa conception le TIA a été prévu pour pallier à ce problème. Le 6507 ne pouvant « adresser » précisément un pixel du fait de sa relative lenteur par rapport au TIA, les concepteurs ont prévu un registre de contrôle fin, géré par le TIA : HMP0 (horizontal move player 0) et HMP1.
Lors de chaque affectation du registre HMOVE, la valeur de HMP0 est retranchée ou ajoutée à la position courante du player. Notez cependant que le HMOVE doit immédiatement suivre le WSYNC.
Le registre HMPx utilise les bit 7 à 4, permettant donc 16 valeurs « signées », de -7 à +7. $10 signifie donc +1, et $F0 -1. Attention, les valeurs positives déplacent vers la gauche !
Pour notre souci, il convient donc d’affecter $10 à HMP1 pour le décaler d’un pixel vers la gauche :

   ; Positionnement horizontal
   sta WSYNC ; 3
   dey       ; 2  
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   nop       ; 2
   lda #$00  ; 2 
   sta HMP0  ; 3 
   lda #$10  ; 2 pour compenser ces 10 cycles,
   sta HMP1  ; 3 nous avons retiré 5 nop
             ; total 41
             ; 22 de HBLANK + 19, soit 57 pixels
   sta RESP0   
   sta RESP1

   dey
   sta WSYNC
   sta HMOVE ; c'est ici que le -1 s'opère
   
   ; Affichage du player
   jsr DrawP0Pos1 ; 8 lignes 

Nos deux players sont maintenant correctement imbriqués :

Vous remarquerez à gauche l’artefact caractéristique du HMOVE.

Nous avons bien progressé (mais si 🙂 ).
Il nous reste 2 problématiques à régler pour afficher notre score :

  • modifier le player à la volée afin d’afficher chaque chiffre
  • stocker un score et le convertir en « caractères »

Ce sera l’objet d’un prochain exercice.

Cet exercice nous a fait mettre en pratique

  • HMP0 et HMP1 : déplacement horizontal des players
  • HMOVE : déplacement effectif des players (et des missiles et balle)

Vous pouvez télécharger ce fichier source prêt à compiler ici : https://dl.dropbox.com/u/56947388/Cambouis/score1.asm
(click-droit/enregistrer la cible sous)

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :