Allons nous amuser à la plaine de jeux

Je parle bien sûr du playfield : il s’agit du « terrain de jeu », élément basse résolution pouvant interagir avec les 2 players, missiles et balle.
Le playfield (PF) couvre la moitié horizontale d’un écran, et est composé de 20 « pixels ». La deuxième moitié de l’écran peut être au choix une copie ou un miroir de la première moitié. On peut aussi avoir une deuxième moitié totalement différente de la première, mais il faut pour cela modifier le contenu à la volée pendant le balayage de la ligne.

Les 20 pixels du PF sont définis par les 3 bytes PF0 (bit 4 à 7), PF1 (bits 7 à 0) et PF2 (bits 0 à 7).
Sa couleur est définie par le byte COLUPF.
Le byte CTRLPF permet diverses choses :

  • le bit 0 détermine le mode de reproduction du playfield sur la deuxième moitié de l’écran, soit une copie (0), soit un miroir (1)
  • le bit 1, appelé « score », une fois activé, utilisera la couleur du player 0 pour la première moitié, et du player 1 pour la seconde.
  • le bit 2 détermine la priorité du PF par rapport aux autres éléments graphiques.
  • les bits 4 et 5 concernent l’objet « ball », nous verrons cela un autre jour.

Pour cet exercice, nous allons partir du canevas précédent, et ajouter des montagnes à l’horizon (le PF). Pour faire plus joli, nous allons également colorier le ciel à l’horizon.

Il est amusant de constater à quel point j’ai d’abord galéré pour réaliser cet exercice. En bon programmeur moderne, j’ai décliné cet exercice sous la forme d’une boucle principale, laquelle se chargerait de chaque scanline de façon identique :

Loop1
    STA WSYNC   
    DEY          ;2
    CPY #100+5   ;2
    BPL Ciel     ;2 (3 si branch)
    CPY #100     ;2
    BMI Prairie  ;2 (3)

;Montagne    
    lda ColHoriz-100,y ;4
    sta COLUBK
    LDA Horiz0-100,Y
    sta PF0
    LDA Horiz1-100,Y
    sta PF1
    LDA Horiz2-100,Y   ;4
    sta PF2 
    JMP Suite
     
Prairie     
    lda #$c0
    sta COLUBK
    lda #0
    sta PF0
    sta PF1
    sta PF2
    jmp Suite
    
Ciel
    lda #$82
    sta COLUBK
    lda #0
    sta PF0
    sta PF1
    sta PF2
    ;jmp Suite
    
Suite        
    CPY #0
    BNE Loop1

Et bien, voici le résultat :

Les « montagnes » sont ici des formes creuses de façon à pouvoir contrôler les alignements. Quel est le problème ? Les tests pour savoir si on est dans la zone montagne, ainsi que les premières assignations font que nous dépassons les 22 cycles de l’horizontal blank. Du coup, le PF0 est assigné en plein milieu de son affichage, d’où ce décalage vers le bas. Mon obsession fut alors de tomber sous les 22 cycles, allant même jusqu’à mettre les PF0, PF1, PF2 et COLUBK en pile, pour les dépiler en début de scanline, et piler la ligne suivante durant le reste de la scanline. Alors que la solution était stupidement simple, simplement évidente : construire l’image via 3 boucles successives :

Wait_VBLANK_End
   LDA INTIM            
   BPL Wait_VBLANK_End    
   STA WSYNC         ; 1e ligne
   LDA #0 
   STA VBLANK            
   lda #$82
   sta COLUBK
   ; -------------- fin du vblank -------------    
    
    
    
    ; --------- Kernel = logique d'affichage -------------------
   ;LDY #192     ; 192 lignes
   LDY #91-5
   
Ciel              ; 86 lignes de ciel
   STA WSYNC   
   lda #$82
   sta COLUBK
   lda #0
   sta PF0
   sta PF1
   sta PF2
   dey
   bne Ciel

   ldy #0
Montagne             ; 5 lignes de montagne
   sta WSYNC
   lda ColHoriz,y 
   sta COLUBK
   LDA Horiz0,Y
   sta PF0
   LDA Horiz1,Y
   sta PF1
   LDA Horiz2,Y   
   sta PF2 
   iny
   cpy #5
   BNE Montagne
    
   ldy #100       ; 100 lignes de prairie        
Prairie     
   sta WSYNC
   lda #$c0
   sta COLUBK
   lda #0
   sta PF0
   sta PF1
   sta PF2
   dey
   BNE Prairie
   ; ---------- Kernel terminé --------------------------------

Voici enfin le résultat, tel qu’attendu :

Cet exercice nous a fait mettre en pratique

  • PF0, PF1, PF2 : les 3 bytes composant le playfield
  • COLUPF : couleur du playfield
  • CTRLPF : contrôles du playfield (comportement, priorité, couleur)

Vous pouvez télécharger ce fichier source prêt à compiler ici : http://dl.dropbox.com/u/56947388/Cambouis/test_pf.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 :