Lecture du contrôleur NES (Dendy) dans l'assembleur

Dans l'article précédent, je vous ai parlé des bases de l'assembleur 6502 sur certaines zones de mémoire et comment travailler avec elles, jusqu'à aujourd'hui, j'avais la série de tâches suivante: lecture du contrôleur, animation, minuterie. Ci-dessous, sous la coupe, je vais vous dire comment j'ai appris à lire le contrôleur.






Tout, comme avant, a commencé avec un objectif, je suis allé sur le wiki nesdev (le lien sera à la fin de l'article) afin de savoir comment travailler avec le contrôleur. Après tout, si vous le regardez, il n'y a que quelques déclencheurs externes pour le jeu, après quoi le jeu effectue des actions spécifiques. Premièrement, il s'agit d'une minuterie interne, les actions des personnages sont effectuées au début d'un certain temps, un exemple frappant de cela peut être de simples boss dans les jeux, leur comportement est décrit par un modèle lié à n'importe quelle période. Deuxièmement, un déclencheur important pour le jeu est d'appuyer sur les boutons du contrôleur, auxquels le personnage principal du jeu répond principalement, en appuyant sur haut, bas, gauche et droite, démarrer et sélectionner. Le héros peut se déplacer, sauter, ramper et ainsi de suite. Autrement dit, appuyer directement sur le bouton indique au jeu de le faire.En cours de programmation pour la NES, j'essaye de ne pas me concentrer sur l'objet qui sera à l'écran, car de nombreux programmeurs modernes sont possibles, mais sur ce qui sera dessiné dans tel ou tel cadre.





Mais plus près du sujet, il y a beaucoup de contrôleurs sur la NES, allant des motos classiques aux motos gonflables en passant par les microphones, mais le dandy n'avait que deux manettes de jeu classiques (joystick) et un pistolet léger. Nous parlerons probablement de ce dernier plus tard. Et donc le dandy a deux ports de processeur pour lire les contrôleurs 4016 $ pour la première manette de jeu, 4017 $ pour la deuxième manette de jeu.





La première étape consiste à "redémarrer le contrôleur" ou à "l'initialiser" en écrivant simplement les valeurs $ 01 et $ 00 sur le port séquentiellement





deadyJoy:
 lda #$01
 sta $4016
 lda #$00
 sta $4016
      
      



Ensuite, le dandy lit la presse dans la séquence suivante A, B, Select, Start, Up, Down, Left, Right et écrit sur le port 4016 $, donc pour recevoir une pression sur un bouton, nous devons seulement lire à partir de ce port , la valeur séquentiellement 8 fois





lda #4016 ; A
lda #4016 ; B
lda #4016 ; Select
lda #4016 ; Start
lda #4016 ; Up
lda #4016 ; Down
lda #4016 ; Left
lda #4016 ; Right
      
      



A . , . . X Y . zeropage ( ) $00 - $FF , , , .





ReadA:
  LDA $4016       ;  A
  AND #%00000001 ;    N  Z
  bne walkHeroRight ;    A
  beq ReadB ;       B

ReadB:
  LDA $4016       ;  B
  AND #%00000001 
  bne walkHeroLeft ;   B walkHeroLeft     
  beq ReadSelect ;    Select 
  
;  5       

ReadRight:
  LDA $4016       ;  
  AND #%00000001
  bne walkHeroRight ;     
  beq heroStay ;         
      
      



assembler , , . , . . X Y





walkHeroRight:
  inc herroXCoordinate
  jmp drawHero

walkHeroLeft:
  dec herroXCoordinate
  jmp drawHero
      
      








drawHero:
  lda herroYCoordinate
  sta $2004
  lda $00
  sta $2004
  lda #%00010111
  sta $2004
  lda herroXCoordinate
  sta $2004

  lda herroYCoordinate
  sta $2004
  lda #01
  sta $2004
  lda #%00010111
  sta $2004
  lda herroXCoordinate
  adc #$07
  sta $2004

  lda herroYCoordinate
  adc #$07
  sta $2004
  lda $02
  sta $2004
  lda #%00010111
  sta $2004
  lda herroXCoordinate
  sta $2004

  lda herroYCoordinate
  adc #$07
  sta $2004
  lda #03
  sta $2004
  lda #%00010111
  sta $2004
  lda herroXCoordinate
  adc #$07
  sta $2004

  nmi_delay 4
  jmp mainLoop
      
      



Et le cycle se répète: lire, déterminer, dessiner l'état du héros.

C'est ainsi que cela s'est avéré, tout n'est pas aussi compliqué qu'il y paraissait à première vue. L'assembleur lui-même cause plus de difficultés, parfois certains points ne sont pas aussi transparents, mais je voudrais dire une chose simple, s'il y a un rêve, cela vaut la peine d'y aller, et en aucun cas vous ne devez renoncer à de telles entreprises. Dans les prochains articles, je voudrais parler d'animation et de création graphique.





Article précédent

Littérature : http://wiki.nesdev.com/

Exemple entièrement sur github








All Articles