Leyendo el controlador nes (dendy) en ensamblador

En el artículo anterior os hablé de los fundamentos del ensamblador 6502 sobre algunas áreas de memoria y cómo trabajar con ellas, hasta el día de hoy tenía la siguiente serie de tareas: lectura del controlador, animación, temporizador. A continuación, debajo del corte, les contaré cómo aprendí a leer el controlador.






Todo, como antes, comenzó con un objetivo, fui a la wiki de nesdev (el enlace estará al final del artículo) para leer sobre cómo trabajar con el controlador. Después de todo, si lo miras, solo hay unos pocos disparadores externos para el juego, sobre los cuales el juego realiza ciertas acciones. En primer lugar, este es un temporizador interno, las acciones de los personajes se realizan al inicio de un cierto tiempo, un ejemplo llamativo de esto pueden ser los simples jefes en los juegos, su comportamiento se describe mediante una plantilla que está ligada a cualquier período de tiempo. En segundo lugar, un disparador importante para el juego es presionar los botones del controlador, a los que el personaje principal del juego responde principalmente, presionando arriba, abajo, izquierda y derecha, iniciar y seleccionar. El héroe puede moverse, saltar, gatear, etc. Es decir, presionar el botón directamente le dice al juego que haga esto.Avanzando en la programación de la NES, trato de concentrarme no en el objeto que estará en la pantalla, ya que muchos programadores modernos son posibles, sino en lo que se dibujará en este o aquel marco.





Pero más cerca del tema, hay muchos controladores en la NES, que van desde los clásicos hasta motocicletas inflables y micrófonos, pero el dandy solo tenía dos gamepads clásicos (joystick) y una pistola ligera. Probablemente hablaremos de esto último más adelante. Y entonces el dandy tiene dos puertos de procesador para leer controladores $ 4016 para el primer gamepad, $ 4017 para el segundo gamepad.





El primer paso es "reiniciar el controlador" o "inicializarlo" simplemente escribiendo los valores $ 01 y $ 00 en el puerto secuencialmente





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



A continuación, el dandy lee la prensa en la siguiente secuencia A, B, Seleccionar, Inicio, Arriba, Abajo, Izquierda, Derecha y escribe en el puerto $ 4016, por lo que para recibir una pulsación de botón, solo necesitamos leer desde este puerto. , el valor secuencialmente 8 veces





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
      
      



Y el ciclo se repite: leer, determinar, dibujar el estado del héroe.

Así resultó, no todo es tan complicado como parecía a primera vista. El ensamblador en sí causa más dificultades, a veces algunos puntos no son tan transparentes, pero me gustaría decir una cosa simple, si hay un sueño vale la pena ir a él, y en ningún caso debes renunciar a tales compromisos. En los próximos artículos me gustaría hablar sobre la animación y la creación de gráficos.







Literatura de artículos anteriores : http://wiki.nesdev.com/

Ejemplo completamente en github








All Articles