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