Occupons-nous de nos boutons

Dans cet exercice, nous allons utiliser le bouton du joystick pour simuler un tir. Ce « tir » sera représenté par un éclair dans le ciel.

Le test du bouton en soi n’est pas bien compliqué :

   lda INPT4
   BMI TestHaut  ; Si pas appuyé, test suivant 
 ; choses à faire si bouton pressé 

Le bit 7 de INPT4 (joystick 1) ou de INPT5 (joystick 2) est à 1 au repos. L’appui sur le bouton le fait passer à 0. Le bit 7 positionnant le flag N (négatif), un test BMI (branch on minus) peut être utilisé pour sauter l’ensemble d’instructions à exécuter lors de l’appui du bouton.

Vu que l’affichage nous montre 50 ou 60 images par seconde, l’éclair dans le ciel ne peut se faire sur une seule image, ce serait trop bref. Nous allons donc, par l’appui du bouton, démarrer une séquence d’images qui va modifier la couleur du ciel, du blanc, vers un dégradé de bleu, jusqu’à la couleur habituelle du ciel. Durant cette séquence, un nouvel appui sur le bouton n’aura aucun effet.

Deux nouvelles cases mémoire, la première contiendra la couleur du ciel, la 2e la position dans la séquence « éclair » :

Color_Ciel = $90
Color_Ciel_Seq = $91

Nous les initialisons au démarrage du programme :

   lda #$82
   sta Color_Ciel
   lda #$00
   sta Color_Ciel_Seq

La séquence de couleur est définie en fin de programme avec les diverses données :

ColorCielData 
   .byte #$82
   .byte #$84
   .byte #$84
   .byte #$86
   .byte #$88
   .byte #$8A
   .byte #$8C
   .byte #$8E
   .byte #$0E

Dans la logique du programme, nous pouvons maintenant tester l’appui du bouton, cet appui initialisant la séquence en position 9 :

   ; test du joystick 1
;Button1Pressed   
   lda Color_Ciel_Seq ; si séquence "tir" en cours
   bne TestHaut       ; on ne reteste pas l'appui

   lda INPT4
   BMI TestHaut  ; Si pas appuyé, test suivant
   lda #9
   sta Color_Ciel_Seq

Après les tests joystick, nous pouvons, si nécessaire, enregistrer la couleur du ciel dans sa case mémoire, et décrémenter la position dans la séquence :

; couleur du ciel
   ldx Color_Ciel_Seq
   beq Wait_VBLANK_End
   lda ColorCielData-1,x
   sta Color_Ciel
   dex   
   stx Color_Ciel_Seq

Enfin, l’affichage du ciel n’a plus qu’à utiliser la case mémoire au lieu d’une valeur fixe :

   lda Color_Ciel ; #$82
   sta COLUBK

Et voila !
Vous noterez que la séquence s’affichera au rythme du balayage, et sera donc plus rapide sur un système ntsc (60 fps) que sur un système pal (50 fps). Ce n’est pas bien important ici, mais pourrait être un souci si cette technique est appliquée à une animation d’un ennemi par exemple. D’autres techniques seront nécessaires dans ce cas afin de « timer » comme il faut.

Profitons de l’occasion pour optimiser notre source en utilisant certaines directives de notre macro-assembleur.
Nous utilisons des constantes pour adresser la ram :

YPosition  = $80
PF0_Data   = $81  ; et $82 $83 $84 $85
PF1_Data   = $86  ; et $87 $88 $89 $8A
PF2_Data   = $8B  ; et $8C $8D $8E $8F
Color_Ciel = $90
Color_Ciel_Seq = $91

Imaginons que nous souhaitions augmenter la taille des montagnes de 5 à 10 lignes. Il faudrait alors modifier l’adresse de toutes les cases mémoire suivantes manuellement, avec le risque d’en oublier ou de se tromper :

YPosition  = $80
PF0_Data   = $81  ; et $82 $83 $84 $85 $86 $87 $88 $89 $8A
PF1_Data   = $8B  ; et $8C $8D $8E $8F $90 $91 $92 $93 $94
PF2_Data   = $95  ; et $96 $97 $98 $99 $9A $9B $9C $9D $9E
Color_Ciel = $9F
Color_Ciel_Seq = $A0

Voici la solution : notre macro-assembleur prévoit dans sa syntaxe de réserver des espaces mémoire par la directive ds (define space). Cet espace se situant bien avant le code ($80 vs $F000), nous déclarons 2 segments distincts, nommés RAM et PRG. Enfin, la directive echo nous informera lors de la compilation de la RAM disponible.

   SEG.U RAM ; = uninitialized segment
   ORG $80
YPosition       ds 1
PF0_Data        ds 5
PF1_Data        ds 5
PF2_Data        ds 5
Color_Ciel      ds 1
Color_Ciel_Seq  ds 1

   echo "Il reste",($100-*),"octets de RAM libre"

   SEG PRG
   ORG $F000  
   
Start        

Cet exercice nous a fait mettre en pratique

  • INPT4 et INPT5 : bouton joystick 1 et 2.

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